fix(extensions): handle TypeScript import-equals require specifiers

Collect TSImportEqualsDeclaration/TSExternalModuleReference targets so
legacy .ts/.cts extensions using `import x = require("pkg")` get their
bare dependencies pinned like plain require() calls. Fold of the #6256
follow-up (comicchang/oh-my-pi@1e54b68) requested on #6324.
This commit is contained in:
can1357
2026-07-23 11:12:06 +02:00
parent 27fc2d60d1
commit be94acbf71
2 changed files with 8 additions and 1 deletions
@@ -130,6 +130,11 @@ function collectExtensionSpecifierReferences(
record("import", node.source);
} else if (node.type === "ImportExpression") {
record("import", node.source);
} else if (
node.type === "TSImportEqualsDeclaration" &&
node.moduleReference.type === "TSExternalModuleReference"
) {
record("require", node.moduleReference.expression);
} else if (node.type === "CallExpression") {
if (node.callee.type === "Import") {
record("import", node.arguments[0]);
@@ -1094,12 +1094,13 @@ describe("legacy-pi in-place module loading (issue #1674)", () => {
'const binding = require("@fixture/native-platform");',
'const plain = require("plain-dep");',
'const conditional = require("condition-dep");',
'import conditionalEquals = require("condition-dep");',
'const local = require("./local.node");',
'const member = loader.require("plain-dep");',
'const importText = `from"plain-dep"`;',
'const importPattern = /from"typebox"/;',
'function shadowed(require) { return require("plain-dep"); }',
"export { binding, conditional, importPattern, importText, local, member, plain, shadowed };",
"export { binding, conditional, conditionalEquals, importPattern, importText, local, member, plain, shadowed };",
].join("\n"),
importer,
);
@@ -1110,6 +1111,7 @@ describe("legacy-pi in-place module loading (issue #1674)", () => {
expect(rewritten).toContain(`require("${addon.replaceAll("\\", "/")}")`);
expect(rewritten).toContain(`require("${plainDep.replaceAll("\\", "/")}")`);
expect(rewritten).toContain(`require("${conditionalDep.replaceAll("\\", "/")}")`);
expect(rewritten).toContain(`import conditionalEquals = require("${conditionalDep.replaceAll("\\", "/")}")`);
expect(rewritten).toContain('require("./local.node")');
expect(rewritten).toContain('loader.require("plain-dep")');
expect(rewritten).toContain('`from"plain-dep"`');