fix(sdk): scan CommonJS imports

This commit is contained in:
2026-09-05 08:38:04 +08:00
parent 2570dd7b97
commit 4cc83ea713
2 changed files with 154 additions and 13 deletions
@@ -140,15 +140,17 @@ function extractDependencyEdges(source, file) {
&& node.moduleSpecifier
&& ts.isStringLiteralLike(node.moduleSpecifier)) {
edges.push({ kind: 'static', specifier: node.moduleSpecifier.text });
} else if (ts.isImportEqualsDeclaration(node)) {
const specifier = externalImportEqualsSpecifier(node);
if (specifier !== null) edges.push({ kind: 'static', specifier });
} else if (ts.isImportTypeNode(node)
&& ts.isLiteralTypeNode(node.argument)
&& ts.isStringLiteralLike(node.argument.literal)) {
edges.push({ kind: 'static', specifier: node.argument.literal.text });
} else if (ts.isCallExpression(node)
&& node.expression.kind === ts.SyntaxKind.ImportKeyword) {
const argument = node.arguments[0];
if (node.arguments.length === 1 && argument && ts.isStringLiteralLike(argument)) {
edges.push({ kind: 'static', specifier: argument.text });
} else if (isModuleLoaderCall(node)) {
const specifier = literalCallSpecifier(node);
if (specifier !== null) {
edges.push({ kind: 'static', specifier });
} else {
edges.push({ kind: 'dynamic' });
}
@@ -218,17 +220,18 @@ function extractImports(source, file) {
? node.importClause.getText(sourceFile)
: '',
});
}
if (ts.isImportTypeNode(node)
} else if (ts.isImportEqualsDeclaration(node)) {
const specifier = externalImportEqualsSpecifier(node);
if (specifier !== null) {
imports.push({ specifier, bindings: node.name.getText(sourceFile) });
}
} else if (ts.isImportTypeNode(node)
&& ts.isLiteralTypeNode(node.argument)
&& ts.isStringLiteralLike(node.argument.literal)) {
imports.push({ specifier: node.argument.literal.text, bindings: '' });
}
if (ts.isCallExpression(node)
&& node.expression.kind === ts.SyntaxKind.ImportKeyword
&& node.arguments.length === 1
&& ts.isStringLiteralLike(node.arguments[0])) {
imports.push({ specifier: node.arguments[0].text, bindings: '' });
} else if (isModuleLoaderCall(node)) {
const specifier = literalCallSpecifier(node);
if (specifier !== null) imports.push({ specifier, bindings: '' });
}
ts.forEachChild(node, visit);
};
@@ -236,6 +239,29 @@ function extractImports(source, file) {
return imports;
}
function externalImportEqualsSpecifier(node) {
if (!ts.isImportEqualsDeclaration(node)
|| !ts.isExternalModuleReference(node.moduleReference)
|| !node.moduleReference.expression
|| !ts.isStringLiteralLike(node.moduleReference.expression)) {
return null;
}
return node.moduleReference.expression.text;
}
function isModuleLoaderCall(node) {
return ts.isCallExpression(node)
&& (node.expression.kind === ts.SyntaxKind.ImportKeyword
|| (ts.isIdentifier(node.expression) && node.expression.text === 'require'));
}
function literalCallSpecifier(node) {
const argument = node.arguments[0];
return node.arguments.length === 1 && argument && ts.isStringLiteralLike(argument)
? argument.text
: null;
}
function findViolation(context) {
const { file, specifier, bindings, resolved, frameworkDir, gamesDir } = context;
const filePath = displayPath(file);