rollup-plugin-strip-final-exports
Version:
Rollup plugin to strip the exports left in the output files
70 lines (65 loc) • 3.12 kB
JavaScript
import { walk } from 'estree-walker';
import MagicString from 'magic-string';
const isExpressionStatement = (node) => node.type === 'ExpressionStatement';
const isIdentifier = (node) => node.type === 'Identifier';
const isLiteral = (node) => node.type === 'Literal';
const isMemberExpression = (node) => node.type === 'MemberExpression';
const isAssignmentStatement = (node) => (isExpressionStatement(node)
&& node.expression.type === 'AssignmentExpression');
const isModuleIdentifier = (node) => (isIdentifier(node)
&& node.name === 'module');
const isExportsIdentifier = (node) => (isIdentifier(node)
&& node.name === 'exports');
const isExportsLiteral = (node) => (isLiteral(node)
&& node.value === 'exports');
const isModuleExportsWithIdentifier = (memberExpression) => (isModuleIdentifier(memberExpression.object)
&& isExportsIdentifier(memberExpression.property));
const isModuleExportsWithLiteral = (memberExpression) => (isModuleIdentifier(memberExpression.object)
&& isExportsLiteral(memberExpression.property));
const isModuleExportsExpression = (memberExpression) => (isModuleExportsWithIdentifier(memberExpression)
|| isModuleExportsWithLiteral(memberExpression));
const utils = {
isAssignmentStatement,
isExportsIdentifier,
isMemberExpression,
isModuleExportsExpression,
isModuleIdentifier,
};
const isModuleExportsMemberExpression = (expression) => (utils.isMemberExpression(expression)
&& utils.isModuleExportsExpression(expression));
const isCJSExportsAssignment = (memberExpression) => (utils.isExportsIdentifier(memberExpression.object)
|| utils.isModuleExportsExpression(memberExpression)
|| isModuleExportsMemberExpression(memberExpression.object));
const isCJSModuleExportStatement = (node) => (utils.isAssignmentStatement(node)
&& utils.isMemberExpression(node.expression.left)
&& isCJSExportsAssignment(node.expression.left));
const isESModuleExportStatement = (node) => [
'ExportAllDeclaration',
'ExportDefaultDeclaration',
'ExportNamedDeclaration',
].includes(node.type);
const isCJSExport = (node, rollupOptions) => (rollupOptions.format === 'cjs'
&& isCJSModuleExportStatement(node));
const isESModuleExport = (node, rollupOptions) => (rollupOptions.format === 'es'
&& isESModuleExportStatement(node));
const isExport = (node, rollupOptions) => (isCJSExport(node, rollupOptions)
|| isESModuleExport(node, rollupOptions));
const index = (stripExportsOptions = {}) => ({
name: 'Strip final exports',
renderChunk(sourceCode, chunk, rollupOptions) {
const ast = this.parse(sourceCode);
const magicString = new MagicString(sourceCode);
walk(ast, {
enter(node) {
if (isExport(node, rollupOptions)) {
const { start, end } = node;
magicString.remove(start, end);
}
},
});
const code = magicString.toString();
const map = stripExportsOptions.sourceMap ? magicString.generateMap() : null;
return { code, map };
},
});
export { index as default };