mirror of
https://github.com/vale981/metalsmith-collections
synced 2025-03-05 17:31:38 -05:00

Adjust the matching code to allow collections to be defined in the front matter and by pattern. Currently if you define collection in the front matter no patterns will match that file. This aides in building something like a tagging system on a blog. All posts can be matched with something like `'*.md'` or `'blog/**/*'` and then tags can be added in the individual posts `collection` front matter.
264 lines
8 KiB
JavaScript
264 lines
8 KiB
JavaScript
|
|
var assert = require('assert');
|
|
var Metalsmith = require('metalsmith');
|
|
var collections = require('..');
|
|
|
|
describe('metalsmith-collections', function(){
|
|
it('should add collections to metadata', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/basic');
|
|
metalsmith
|
|
.use(collections({ articles: {}}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal(2, m.articles.length);
|
|
assert.equal(m.collections.articles, m.articles);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should match collections by pattern', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/pattern');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
pattern: '*.md'
|
|
}
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
assert.equal(3, metalsmith.metadata().articles.length);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should take a pattern shorthand string', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/pattern');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: '*.md'
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
assert.equal(3, metalsmith.metadata().articles.length);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should add the collection property to a file', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/pattern');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: '*.md'
|
|
}))
|
|
.build(function(err, files){
|
|
if (err) return done(err);
|
|
assert.equal(files['three.md'].collection, 'articles');
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should accept a "sortBy" option', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/sort');
|
|
metalsmith
|
|
.use(collections({ articles: { sortBy: 'title' }}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert.equal('Alpha', articles[0].title);
|
|
assert.equal('Beta', articles[1].title);
|
|
assert.equal('Gamma', articles[2].title);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should accept a "sortBy" function', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/sort');
|
|
metalsmith
|
|
.use(collections({ articles: { sortBy: sort }}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert.equal('Gamma', articles[0].title);
|
|
assert.equal('Beta', articles[1].title);
|
|
assert.equal('Alpha', articles[2].title);
|
|
done();
|
|
});
|
|
|
|
function sort(a, b){
|
|
a = a.title.slice(1);
|
|
b = b.title.slice(1);
|
|
return a > b ? 1 : -1;
|
|
}
|
|
});
|
|
|
|
it('should accept a "reverse" option', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/sort');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
sortBy: 'title',
|
|
reverse: true
|
|
}
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert.equal('Alpha', articles[2].title);
|
|
assert.equal('Beta', articles[1].title);
|
|
assert.equal('Gamma', articles[0].title);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should add next and previous references', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/references');
|
|
metalsmith
|
|
.use(collections({ articles: {}}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert(!articles[0].previous);
|
|
assert.equal(articles[0].next, articles[1]);
|
|
assert.equal(articles[1].previous, articles[0]);
|
|
assert.equal(articles[1].next, articles[2]);
|
|
debugger;
|
|
assert.equal(articles[2].previous, articles[1]);
|
|
assert(!articles[2].next);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should not add references if opts[key].refer === false', function(done){
|
|
var metalsmith = Metalsmith('test/fixtures/references-off');
|
|
metalsmith
|
|
.use(collections({ articles: { refer: false }}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert(!articles[0].previous);
|
|
assert(!articles[0].next);
|
|
assert(!articles[1].previous);
|
|
assert(!articles[1].next);
|
|
assert(!articles[2].previous);
|
|
assert(!articles[2].next);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should not fail with empty collections', function(done) {
|
|
var metalsmith = Metalsmith('test/fixtures/empty');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
sortBy: 'date',
|
|
reverse: true
|
|
}
|
|
}))
|
|
.build(function(err) {
|
|
if (err) return done(err);
|
|
var articles = metalsmith.metadata().articles;
|
|
assert.equal(articles.length, 0);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should add metadata objects to collections', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/basic');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
metadata: { name: 'Batman' }
|
|
}
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal('Batman', m.articles.metadata.name);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should load collection metadata from a JSON file', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/basic');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
metadata: 'test/fixtures/metadata/metadata.json'
|
|
}
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal('Batman', m.articles.metadata.name);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should load collection metadata from a YAML file', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/basic');
|
|
metalsmith
|
|
.use(collections({
|
|
articles: {
|
|
metadata: 'test/fixtures/metadata/metadata.yaml'
|
|
}
|
|
}))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal('Batman', m.articles.metadata.name);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should allow multiple collections', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/multi');
|
|
metalsmith
|
|
.use(collections({ articles: {}, posts: {}, drafts: {} }))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal(2, m.articles.length);
|
|
assert.equal(1, m.drafts.length);
|
|
assert.equal(1, m.posts.length);
|
|
assert.equal(m.collections.articles, m.articles);
|
|
assert.equal(m.collections.drafts, m.drafts);
|
|
assert.equal(m.collections.posts, m.posts);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should allow collections through metadata alone', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/noconfig');
|
|
metalsmith
|
|
.use(collections({ movies: {} }))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal(2, m.books.length);
|
|
assert.equal(1, m.movies.length);
|
|
assert.equal(m.collections.books, m.books);
|
|
assert.equal(m.collections.movies, m.movies);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should allow collections by pattern and front matter', function (done) {
|
|
var metalsmith = Metalsmith('test/fixtures/multi');
|
|
metalsmith
|
|
.use(collections({ articles: {}, posts: {}, drafts: {}, blog: '*.md' }))
|
|
.build(function(err){
|
|
if (err) return done(err);
|
|
var m = metalsmith.metadata();
|
|
assert.equal(3, m.blog.length);
|
|
assert.equal(2, m.articles.length);
|
|
assert.equal(1, m.drafts.length);
|
|
assert.equal(1, m.posts.length);
|
|
assert.equal(m.collections.blog, m.blog);
|
|
assert.equal(m.collections.articles, m.articles);
|
|
assert.equal(m.collections.drafts, m.drafts);
|
|
assert.equal(m.collections.posts, m.posts);
|
|
done();
|
|
});
|
|
});
|
|
});
|