npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@metalsmith/metadata

v0.3.0

Published

A metalsmith plugin to load global metadata from files and directories

Downloads

197

Readme

@metalsmith/metadata

A metalsmith plugin to load global metadata from files and directories.

metalsmith: plugin npm: version travis: build code coverage license: MIT

  • Reads, parses and merges data files into global metadata and removes them from the build (when applicable).
  • Supports JSON, YAML and TOML files. TOML parser needs to be installed separately.
  • Supports dot-notated metadata keypath targets as option keys, eg {'config.nav': 'src/config/nav.yml'}

Installation

NPM:

npm install @metalsmith/metadata

Yarn:

yarn add @metalsmith/metadata

Usage

Pass the options to Metalsmith#use. The options object is in the format { 'metadata.key': 'path/to/(file.ext|dir)' }. Relative file/directory paths are resolved to metalsmith.directory(). Directory option keys will include direct children of the directory, see Mapping nested metadata directories for creating nested directory structures.

import Metalsmith from 'metalsmith'
import metadata from '@metalsmith/metadata'

const __dirname = dirname(new URL(import.meta.url).pathname)

Metalsmith(__dirname)
  .use(
    metadata({
      // in-source JSON file
      jsonFile: 'src/data/a-json-file.json',
      // out-of-source YAML file at nested keypath
      'nested.yamlFile': 'some-directory/a-yaml-file.yaml',
      // out-of-source directory
      aDirectory: 'some-directory/a-directory'
    })
  )
  .build((err) => {
    console.log(metalsmith.metadata())
    // logs { jsonFile: {...}, nested: { yamlFile: {...}}, aDirectory: {...} }
  })

Files inside metalsmith.source() will be considered metadata and thus removed from the build output.

Plugin order

Typically, you want to use this plugin somewhere at the start of the chain, before any rendering plugins run, like @metalsmith/layouts or @metalsmith/in-place.

Merging metadata files into objects

You can merge metadata files into objects by making the root of the data file an object. For example, given the following 2 files:

with a usage like metalsmith.use(metadata({ themes: 'src/themes' })), metalsmith.metadata().themes will be { red: {"primary-color": #00FF00"}, blue: {"primary-color": "#00FF00"}}.

Merging metadata files into arrays

You can merge metadata files into an array by making the root of the data file an array. For example, given the following 2 files:

with a usage like metalsmith.use(metadata({ themes: 'src/themes' })), metalsmith.metadata().themes will be [{"primary-color": #00FF00"}, {"primary-color": "#00FF00"}].

Mapping nested metadata directories

You can map nested metadata directories by specifying multiple options:

metalsmith.use(
  metadata({
    config: 'src/config',
    'config.theme': 'src/config/theme',
    'config.theme.summer': 'src/config/theme/summer',
    'config.constants': 'src/config/constants.yaml'
  })
)

The resulting metadata will have a structure like:

{
  ...otherMetadata,
  config: {
    ...metadata_from_config_dir
    theme: {
      ...metadata_from_config_theme_dir
      summer: { ...metadata_from_config_theme_summer_dir }
    }
  },
  constants: {
    ...metadata_from_config_constants_file
  }
}

Debug

To enable debug logs, set the DEBUG environment variable to @metalsmith/metadata:

Linux/Mac:

DEBUG=@metalsmith/metadata

Windows:

set "DEBUG=@metalsmith/metadata"

CLI Usage

To use this plugin with the Metalsmith CLI,add the @metalsmith/metadata key to your metalsmith.json plugins. Each key in the dictionary of options will be the key for the global metadata object, like so:

{
  "plugins": {
    "@metalsmith/metadata": {
      "authors": "src/authors.json",
      "categories": "src/categories.yaml",
      "customers": "external_data/customers"
    }
  }
}

License

MIT