collections icon indicating copy to clipboard operation
collections copied to clipboard

Why is the property added collection and not collections?

Open benpolinsky opened this issue 6 years ago • 3 comments

This gets me every time I have to grab a collection from a file. The property that is added to the file is: collection, yet its value is an array of collections

I get this would break everyone's code (unless we add both keys while people migrate), but it really makes zero sense.

Unless I am missing something :)

benpolinsky avatar Oct 13 '17 17:10 benpolinsky

I'll be honest, I'm pretty stumped on this one. Fiddling with the tests:

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);
        console.log(typeof files['three.md']['collection'])
        assert.equal(files['three.md'].collection, ['articles']);
        done();
      });
  });

typeof files['three.md']['collection'] === object

So it is definitely an array.

However the test only passes when asserting that collection is a string...

EDIT:

The tests are passing because assert.equal, which tests "shallow, coercive equality", is being used. It would be very nice to have some clarity here: if the authors of the plugin intended for the collection property on each file to be an array of collection names, an array of collections with files, one string collection name, or, an array of one element - a string containing the collection name...

benpolinsky avatar Oct 13 '17 18:10 benpolinsky

It's from when it was originally written. I think the thought process was that the plugin handles collections and each one is a collection.

woodyrew avatar Oct 17 '18 22:10 woodyrew

@benpolinsky @woodyrew There is actually a very, very compelling reason to do this that I accidentally stumbled upon. When using only a plugin like layouts, the global metadata keys are overwritten by the file-specific metadata keys. To allow access to both (one being all the collections, and the other a string or an array of strings) the local "collection" key cannot match the global metadata "collections" key.

Furthermore looking into this made me realize collection is not guaranteed to be an array, in fact if a single collection is added, it will be a string

webketje avatar Feb 02 '22 01:02 webketje