restrict-imports-loader
Version:
A Webpack loader to restrict imports in ES and TypeScript
47 lines • 1.73 kB
JavaScript
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