Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Why is the property added collection and not collections? #79

Open
benpolinsky opened this issue Oct 13, 2017 · 3 comments
Open

Why is the property added collection and not collections? #79

benpolinsky opened this issue Oct 13, 2017 · 3 comments

Comments

@benpolinsky
Copy link

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
Copy link
Author

benpolinsky commented Oct 13, 2017

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...

@woodyrew
Copy link
Member

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.

@webketje
Copy link
Member

webketje commented Feb 2, 2022

@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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants