Functionality commonly needed by Rollup plugins
npm install rollup-pluginutilsA set of functions commonly used by Rollup plugins.
``bash`
npm install --save rollup-pluginutils
`js
import { addExtension } from 'rollup-pluginutils';
export default function myPlugin ( options = {} ) {
return {
resolveId ( code, id ) {
// only adds an extension if there isn't one already
id = addExtension( id ); // foo -> foo.js, foo.js -> foo.jsfoo
id = addExtension( id, '.myext' ); // -> foo.myext, foo.js -> foo.js
}
};
}
``
This function attaches Scope objects to the relevant nodes of an AST. Each Scope object has a scope.contains(name) method that returns true if a given name is defined in the current scope or a parent scope.
See rollup-plugin-inject or rollup-plugin-commonjs for an example of usage.
`js
import { attachScopes } from 'rollup-pluginutils';
import { walk } from 'estree-walker';
export default function myPlugin ( options = {} ) {
return {
transform ( code ) {
const ast = this.parse( code );
let scope = attachScopes( ast, 'scope' );
walk( ast, {
enter ( node ) {
if ( node.scope ) scope = node.scope;
if ( !scope.contains( 'foo' ) ) {
// foo is not defined, so if we encounter it,`
// we assume it's a global
}
},
leave ( node ) {
if ( node.scope ) scope = scope.parent;
}
});
}
};
}
`js
import { createFilter } from 'rollup-pluginutils';
export default function myPlugin ( options = {} ) {
// options.include and options.exclude can each be a minimatch
// pattern, or an array of minimatch patterns, relative to process.cwd()
var filter = createFilter( options.include, options.exclude );
return {
transform ( code, id ) {
// if options.include is omitted or has zero length, filtertrue
// will return by default. Otherwise, an ID must matchoptions.exclude
// one or more of the minimatch patterns, and must not match
// any of the patterns.
if ( !filter( id ) ) return;
// proceed with the transformation...
}
};
}
`
If you want to resolve the patterns against a directory other than
process.cwd(), you can additionally pass a resolve option:
`js`
var filter = createFilter( options.include, options.exclude, {resolve: '/my/base/dir'} )
If resolve is a string, then this value will be used as the base directory.process.cwd()
Relative paths will be resolved against first. If resolve isfalse, then the patterns will not be resolved against any directory. This can
be useful if you want to create a filter for virtual module names.
`js
import { makeLegalIdentifier } from 'rollup-pluginutils';
makeLegalIdentifier( 'foo-bar' ); // 'foo_bar'
makeLegalIdentifier( 'typeof' ); // '_typeof'
`
Helper for treeshakable data imports
`js
import { dataToEsm } from 'rollup-pluginutils';
const esModuleSource = dataToEsm({
custom: 'data',
to: ['treeshake']
}, {
compact: false,
indent: '\t',
preferConst: false,
objectShorthand: false,
namedExports: true
});
/*
Outputs the string ES module source:
export const custom = 'data';
export const to = ['treeshake'];
export default { custom, to };
*/
`
Extract the names of all assignment targets from patterns.
`js
import { extractAssignedNames } from 'rollup-pluginutils';
import { walk } from 'estree-walker';
export default function myPlugin ( options = {} ) {
return {
transform ( code ) {
const ast = this.parse( code );
walk( ast, {
enter ( node ) {
if ( node.type === 'VariableDeclarator' ) {
const declaredNames = extractAssignedNames(node.id);
// do something with the declared names
// e.g. for const {x, y: z} = ... => declaredNames = ['x', 'z']
}
}
});
}
};
}
```
MIT