UNPKG

parse-imports-exports

Version:

Fast and easy parser for declarations of import and export in ECMAScript/TypeScript

135 lines (134 loc) 4.48 kB
import { onBacktickError, onBacktickParse } from './backtickString.js'; import { onCommonJsExportError, onCommonJsExportParse } from './commonJsExport.js'; import { onDeclarationExportError, onDeclarationExportParse } from './declarationExport.js'; import { onDynamicImportError, onDynamicImportParse } from './dynamicImport.js'; import { onImportError, onImportParse } from './import.js'; import { onNamedExportError, onNamedExportParse } from './namedExport.js'; import { onDoubleQuoteError, onMultilineCommentError, onSinglelineCommentError, onSingleQuoteError, } from './onErrors.js'; import { onRegexpError, onRegexpParse } from './regexp.js'; import { onRequireError, onRequireParse } from './require.js'; /** * Statements of ECMAScript comments. */ export const comments = [ { onError: onSinglelineCommentError, tokens: ['\\/\\/', '$'], }, { onError: onMultilineCommentError, tokens: ['\\/\\*', '\\*\\/'], }, ]; /** * Get statements for parsing by options. */ export const getStatements = (options) => { const statements = [...baseStatements]; if (!(options === null || options === void 0 ? void 0 : options.ignoreDynamicImports)) { statements.push(dynamicImportStatement); } if (!(options === null || options === void 0 ? void 0 : options.ignoreRequires)) { statements.push(requireStatement); } if (!(options === null || options === void 0 ? void 0 : options.ignoreCommonJsExports)) { statements.push(commonJsExportStatement); } if (!(options === null || options === void 0 ? void 0 : options.ignoreRegexpLiterals)) { statements.push(regexpLiteralStatement); } if (!(options === null || options === void 0 ? void 0 : options.ignoreStringLiterals)) { statements.unshift(...stringLiteralStatements); } return statements; }; /** * Base statements for parsing `import`/`export` declarations. */ const baseStatements = [ { canIncludeComments: true, onError: onImportError, onParse: onImportParse, tokens: ['^import ', '([\'"];?$)|(?<with>[\'"] with \\{)'], shouldSearchBeforeComments: true, }, { canIncludeComments: true, onError: onNamedExportError, onParse: onNamedExportParse, tokens: ['^export (?<type>type )?\\{', '(\\};?$)|(?<quote>[\'"];?$)|(?<with>[\'"] with \\{)'], shouldSearchBeforeComments: true, }, { canIncludeComments: true, onError: onDeclarationExportError, onParse: onDeclarationExportParse, tokens: ['^export ', '($)|(?<with>[\'"] with \\{)'], shouldSearchBeforeComments: true, }, ]; /** * Statement for parsing CommonJS exports (`module.exports = ...`/`(module.)exports.foo = ...`). */ const commonJsExportStatement = { canIncludeComments: true, onError: onCommonJsExportError, onParse: onCommonJsExportParse, tokens: ['^(module\\.)?exports\\b', '='], shouldSearchBeforeComments: true, }; /** * Statement for parsing dynamic import call (`import(...)`). */ const dynamicImportStatement = { canIncludeComments: true, onError: onDynamicImportError, onParse: onDynamicImportParse, tokens: ['\\bimport\\(', '[\'"]', '([\'"])|($)'], shouldSearchBeforeComments: true, }; /** * Statement for parsing regexp literal (`/.../`). */ const regexpLiteralStatement = { canIncludeComments: false, onError: onRegexpError, onParse: onRegexpParse, tokens: ['/', '((?<!\\\\)/)|($)'], shouldSearchBeforeComments: false, }; /** * Statement for parsing require call (`require(...)`). */ const requireStatement = { canIncludeComments: true, onError: onRequireError, onParse: onRequireParse, tokens: ['\\brequire\\(', '[\'"]', '([\'"])|($)'], shouldSearchBeforeComments: true, }; /** * Statements for parsing string literals. */ const stringLiteralStatements = [ { canIncludeComments: false, onError: onSingleQuoteError, tokens: ["'", "((?<!\\\\)')|($)"], shouldSearchBeforeComments: true, }, { canIncludeComments: false, onError: onDoubleQuoteError, tokens: ['"', '((?<!\\\\)")|($)'], shouldSearchBeforeComments: true, }, { canIncludeComments: false, onError: onBacktickError, onParse: onBacktickParse, tokens: ['`', '(?<!\\\\)`'], shouldSearchBeforeComments: true, }, ];