Essential module resolution & configuration management for gasket plugins & presets.

Usage no npm install needed!

<script type="module">
  import gasketResolve from 'https://cdn.skypack.dev/@gasket/resolve';



Essential module resolution and configuration management for Gasket plugins and presets.



npm i @gasket/resolve

Naming convention

Plugins and presets should adhere to the project-type prefixed naming convention. This formatting allows user plugins to be referenced with short names and will help avoid collisions. This convention also mimics those by other projects such a @babel and @oclif.


scope format short description
project @gasket/plugin-<name> @gasket/<name> Official Gasket project plugin
user @<scope>/gasket-plugin-<name> @<scope>/<name> Any user plugins with a scope
user @<scope>/gasket-plugin @<scope> Scope-only user plugins
none gasket-plugin-<name> <name> Any user plugins with no scope


scope format short description
project @gasket/preset-<name> @gasket/<name> Official Gasket project preset
user @<scope>/gasket-preset-<name> @<scope>/<name> Any user presets with a scope
user @<scope>/gasket-preset @<scope> Scope-only user presets
none gasket-preset-<name> <name> Any user presets with no scope


There are util functions for creating objects for working with different parts of package identifiers for plugins and presets.

const { pluginIdentifier } = require('@gasket/resolve');

// if given a raw name as full package name with version...
let identifier = pluginIdentifier('@gasket/plugin-example@^1.2.0');

console.log(identifier.longName);   // @gasket/plugin-example
console.log(identifier.shortName);  // @gasket/example
console.log(identifier.version);    // ^1.2.0

// if given a raw name as short name...
identifier = pluginIdentifier('@gasket/example');
console.log(identifier.longName);   // @gasket/plugin-example
console.log(identifier.shortName);  // @gasket/example
console.log(identifier.version);    // null

See the API docs for more details on the pluginIdentifier and presetIdentifier util functions.


While this package is mostly intended for gasket project internals, if a plugin does need to load or resolve modules, a configured Loader instance is available as gasket.loader from the engine instance passed as the first argument to all lifecycle hooks.

// @my/gasket-plugin-example.js

 module.exports = {
  hooks: {
    someLifecycleHook: async function (gasket) {
      const moduleInfo = await gasket.loader.loadModule('@some/package');
      const module = gasket.loader.tryRequire('some-other-package');