UNPKG

restrict-imports-loader

Version:

A Webpack loader to restrict imports in ES and TypeScript

47 lines 1.73 kB
import ts from "typescript"; export async function checkAsync(x) { const sourceFile = ts.createSourceFile(x.fileName, x.source, ts.ScriptTarget.Latest, x.setParentNodes); const imports = importsIn(sourceFile); return Promise.all(x.deciders.map(decider => onlyRestricted(decider, imports))); } async function onlyRestricted(decider, is) { const isAndDecisions = await Promise.all(is.map(i => decider(i.path).then(decision => ({ i, decision })))); const results = []; for (const iAndD of isAndDecisions) { if (iAndD.decision.restricted) { results.push({ ...iAndD.i, info: iAndD.decision.info }); } } return results; } function importsIn(rootNode) { const accumulator = []; const getLineNumber = ((node) => 1 + rootNode.getLineAndCharacterOfPosition(node.pos).line); ts.forEachChild(rootNode, node => { if (isInteresting(node)) lookForImportsIn(node, accumulator, getLineNumber); }); return accumulator; } function lookForImportsIn(interestingNode, accumulator, getLineNumber) { interestingNode.forEachChild(node => { if (ts.isStringLiteral(node) || ts.isExternalModuleReference(node)) { const stringLiteral = (ts.isExternalModuleReference(node) ? node.expression : node); accumulator.push({ path: stringLiteral.text, node: interestingNode, line: getLineNumber(stringLiteral), }); } }); } function isInteresting(node) { return [ ts.isImportDeclaration, ts.isExportDeclaration, ts.isImportEqualsDeclaration, ].some(f => f(node)); } //# sourceMappingURL=core.js.map