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:
@@ -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"`');
|
||||
|
||||
Reference in New Issue
Block a user