@nestia/sdk
Version:
Nestia SDK and Swagger generator
104 lines • 3.97 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportAnalyzer = void 0;
const path_1 = __importDefault(require("path"));
const typescript_1 = __importDefault(require("typescript"));
const MapUtil_1 = require("../utils/MapUtil");
var ImportAnalyzer;
(function (ImportAnalyzer) {
ImportAnalyzer.analyze = (file) => file.statements
.filter(typescript_1.default.isImportDeclaration)
.map((imp) => {
const clause = imp.importClause;
if (clause === undefined)
return null;
try {
// no real position
// import statement generated by transformer like typia
imp.moduleSpecifier.getText();
}
catch (_a) {
return null;
}
const reflect = {
file: normalizePath(path_1.default.dirname(file.fileName), typescript_1.default.isStringLiteral(imp.moduleSpecifier)
? imp.moduleSpecifier.text
: escapeQuotes(imp.moduleSpecifier.getText())),
elements: [],
default: null,
asterisk: null,
};
if (clause.name)
reflect.default = clause.name.getText();
if (clause.namedBindings === undefined)
return reflect;
else if (typescript_1.default.isNamedImports(clause.namedBindings))
reflect.elements = clause.namedBindings.elements.map((e) => e.name.getText());
else if (typescript_1.default.isNamespaceImport(clause.namedBindings))
reflect.asterisk = clause.namedBindings.name.getText();
return reflect;
})
.filter((r) => r !== null);
ImportAnalyzer.merge = (imports) => {
// group by files
const fileGroups = new Map();
for (const imp of imports) {
const array = MapUtil_1.MapUtil.take(fileGroups, imp.file, () => []);
array.push(imp);
}
return Array.from(fileGroups.entries())
.map(([key, value]) => mergeGroup(key, value))
.flat();
};
function mergeGroup(file, imports) {
const allStarImports = Array.from(new Set(imports
.filter((imp) => imp.asterisk !== null)
.map((imp) => imp.asterisk)))
.sort()
.map((allStarImport) => ({
file,
elements: [],
default: null,
asterisk: allStarImport,
}));
const defaultImports = Array.from(new Set(imports
.filter((imp) => imp.default !== null)
.map((imp) => imp.default)))
.sort()
.map((defaultImport) => ({
file,
elements: [],
default: defaultImport,
asterisk: null,
}));
const instances = new Set(imports.map((imp) => imp.elements).flat());
if (instances.size !== 0) {
if (defaultImports.length !== 0)
defaultImports[0].elements = Array.from(instances).sort();
else
defaultImports.push({
file,
elements: Array.from(instances).sort(),
default: null,
asterisk: null,
});
}
return [...allStarImports, ...defaultImports];
}
function escapeQuotes(str) {
if (str.startsWith("'") && str.endsWith("'"))
return str.slice(1, -1);
else if (str.startsWith('"') && str.endsWith('"'))
return str.slice(1, -1);
return str;
}
function normalizePath(root, str) {
if (str.startsWith("."))
return path_1.default.resolve(root, str);
return `node_modules/${str}`;
}
})(ImportAnalyzer || (exports.ImportAnalyzer = ImportAnalyzer = {}));
//# sourceMappingURL=ImportAnalyzer.js.map