npm package: @gasket/plugin-metadata
Description: Adds metadata to gasket lifecycles
Author: GoDaddy Operating Company, LLC
Latest version: 7.5.10

# @gasket/plugin-metadata

Metadata is the information about the registered plugins and presets, available to
plugin lifecycle hooks. This data can be used in various ways for plugins, most
notably the [@gasket/plugin-docs] which uses it to collate docs for an app.

## Installation

This is a default plugin in newly create Gasket apps.

## Actions

### getMetadata

Get all the metadata for the configured plugins and modules.

```js
const metadata = await gasket.actions.getMetadata();
```

## Lifecycles

### metadata

Describe metadata for a plugin and optionally its supporting modules.

#### Example

This plugin implements the `metadata` lifecycle, which plugins can use to modify
its own metadata at runtime. Whatever is returned will replace the existing
metadata.

```js
// gasket-plugin-example.js
export default {
  name: 'example',
  hooks: {
    /**
     * @param {Gasket} gasket - The Gasket API
     * @param {PluginData} data - This plugin's initial metadata
     * @returns {Object}
     */
    async metadata(gasket, data) {
      return {
        ...data,
        // adding extra data to this plugin's metadata
        extra: 'information',
        // add metadata for details of this plugin
        lifecycles: [{
          name: 'some-data',
          description: 'Allows plugins to do something with data',
          method: 'exec',
          parent: 'start'
        }],
        // Metadata for these modules will be loaded
        // Declare as strings or objects with additional data
        modules: [
          {
            name: 'module-name',
            version: '7.0.0',
            description: 'module-name description',
            link: 'README.md'
          }
        ]
      }
    },
    /**
     * An example lifecycle hook which utilizes metadata
     *
     * @param {Gasket} gasket - The Gasket API
     */
    async example(gasket) {
      const { metadata } = gasket;

      if (metadata.plugins.find(pluginData => pluginData.name === 'gasket-plugin-something')) {
        // only perform some action if a certain plugin is also registered
      }
    }
  }
}
```

## Usage

Beside the lifecycles available to plugins, metadata can also be described for
modules.

### Modules

Lastly, modules can describe metadata by defining a `gasket.metadata` property
in the package.json which will get expanded to the [ModuleData]:

```json
{
  "name": "example",
  "version": "1.2.3",
  "gasket": {
    "metadata": {
      "guides": [
        {
          "name": "Example Guide",
          "description": "How to do something",
          "link": "docs/example.md"
        }
      ]
    }
  }
}
```

This is especially useful to surface guides with
[Gasket docs][@gasket/plugin-docs] for supporting packages that are intended to
be used with Gasket, but are not plugins.

## Access

Plugins and apps can read from the [metadata object] by using
the `getMetadata` Gasket action.

#### Access example

Back to our example plugin, let's see how we can access details about an
installed module, and put in some conditional logic.

```js
// gasket-plugin-example.js
import semver from 'semver';

export default {
  name: 'example',
  hooks: {
    // We need access to metadata during build
    async build(gasket) {
      const metadata = await gasket.actions.getMetadata()
      // ... use metadata
    }
  }
};
```

## License

[MIT](./LICENSE.md)

<!-- LINKS -->

[ModuleData]: docs/api.md#moduledata

[metadata object]: docs/api.md#detaildata

[@gasket/plugin-docs]: /packages/gasket-plugin-docs/README.md