restrict-imports-loader
Version:
A Webpack loader to restrict imports in ES and TypeScript
53 lines • 2.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const typescript_1 = __importDefault(require("typescript"));
async function checkAsync(x) {
const sourceFile = typescript_1.default.createSourceFile(x.fileName, x.source, typescript_1.default.ScriptTarget.Latest, x.setParentNodes);
const imports = importsIn(sourceFile);
return Promise.all(x.deciders.map(decider => onlyRestricted(decider, imports)));
}
exports.checkAsync = checkAsync;
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);
typescript_1.default.forEachChild(rootNode, node => {
if (isInteresting(node))
lookForImportsIn(node, accumulator, getLineNumber);
});
return accumulator;
}
function lookForImportsIn(interestingNode, accumulator, getLineNumber) {
interestingNode.forEachChild(node => {
if (typescript_1.default.isStringLiteral(node) || typescript_1.default.isExternalModuleReference(node)) {
const stringLiteral = (typescript_1.default.isExternalModuleReference(node)
? node.expression
: node);
accumulator.push({
path: stringLiteral.text,
node: interestingNode,
line: getLineNumber(stringLiteral),
});
}
});
}
function isInteresting(node) {
return [
typescript_1.default.isImportDeclaration,
typescript_1.default.isExportDeclaration,
typescript_1.default.isImportEqualsDeclaration,
].some(f => f(node));
}
//# sourceMappingURL=core.js.map