@routineless/nx-aws-cdk
Version:
Nx plugin for AWS CDK
115 lines • 5.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.collectAllImports = exports.applyModifications = void 0;
const tslib_1 = require("tslib");
const ast_types_1 = require("ast-types");
const fs_extra_1 = require("fs-extra");
const glob_1 = require("glob");
const path_1 = tslib_1.__importDefault(require("path"));
const recast_1 = require("recast");
const trie_1 = require("../../../../utils/trie");
const modifications_1 = require("./modifications");
const reduceModifications = (file, path, modifications) => {
return modifications.reduce((acc, modification) => {
const result = modification(file, path);
return {
modified: acc.modified || result.modified,
traverseChildren: acc.traverseChildren || result.traverseChildren,
};
}, {
modified: false,
traverseChildren: false,
});
};
const applyModifications = async (distDir, modifications, ignore = '**/node_modules/**') => {
const globPattern = path_1.default.join(distDir, '**/*.{js,mjs,cjs}');
const writePromises = [];
for await (const file of (0, glob_1.iterate)(globPattern, { ignore })) {
const fileContent = await (0, fs_extra_1.readFile)(file, 'utf8');
const code = (0, recast_1.parse)(fileContent, { parser: require('recast/parsers/typescript') });
let modificationsHaveBeenMade = false;
if ((0, modifications_1.isEsmModifications)(modifications)) {
(0, recast_1.visit)(code, {
visitImportDeclaration(path) {
const modificationsResult = reduceModifications(file, path, modifications.importDeclaration);
modificationsHaveBeenMade = modificationsHaveBeenMade || modificationsResult.modified;
return modificationsResult.traverseChildren;
},
visitExportAllDeclaration(path) {
const modificationsResult = reduceModifications(file, path, modifications.exportAllDeclaration);
modificationsHaveBeenMade = modificationsHaveBeenMade || modificationsResult.modified;
return modificationsResult.traverseChildren;
},
visitExportNamedDeclaration(path) {
const modificationsResult = reduceModifications(file, path, modifications.exportNamedDeclaration);
modificationsHaveBeenMade = modificationsHaveBeenMade || modificationsResult.modified;
return modificationsResult.traverseChildren;
},
});
}
else {
(0, recast_1.visit)(code, {
visitCallExpression(path) {
const modificationsResult = reduceModifications(file, path, modifications.callExpression);
modificationsHaveBeenMade = modificationsHaveBeenMade || modificationsResult.modified;
return modificationsResult.traverseChildren;
},
});
}
if (modificationsHaveBeenMade) {
writePromises.push((0, fs_extra_1.writeFile)(file, (0, recast_1.print)(code).code));
}
}
return Promise.all(writePromises);
};
exports.applyModifications = applyModifications;
const collectAllImports = async (files, excluded = []) => {
const allImports = new Map();
const excludedPatternTrie = new trie_1.PatternTrie(excluded);
const addImport = (path) => {
if (path.node.importKind === 'value' && path.node.source) {
const importModule = path.node.source.value;
if (excludedPatternTrie.has(importModule)) {
return false;
}
let importsAggregate = allImports.get(importModule);
if (!importsAggregate) {
importsAggregate = {
namespaceImport: false,
defaultImport: false,
sideEffectImport: false,
namedImports: new Set(),
};
allImports.set(importModule, importsAggregate);
}
const specifiers = path.node.specifiers || [];
for (const specifier of specifiers) {
if (ast_types_1.namedTypes.ImportSpecifier.check(specifier)) {
const importedName = specifier.imported.name;
importsAggregate.namedImports.add(importedName);
}
else if (ast_types_1.namedTypes.ImportDefaultSpecifier.check(specifier)) {
importsAggregate.defaultImport = true;
}
else if (ast_types_1.namedTypes.ImportNamespaceSpecifier.check(specifier)) {
importsAggregate.namespaceImport = true;
}
}
if (specifiers.length === 0) {
importsAggregate.sideEffectImport = true;
}
}
return false;
};
await Promise.all(files.map((file) => (0, fs_extra_1.readFile)(file, 'utf8').then((fileContent) => {
const code = (0, recast_1.parse)(fileContent, { parser: require('recast/parsers/typescript') });
(0, recast_1.visit)(code, {
visitImportDeclaration(path) {
return addImport(path);
},
});
})));
return allImports;
};
exports.collectAllImports = collectAllImports;
//# sourceMappingURL=util.js.map