Skip to content

Commit 689efe3

Browse files
committed
Add rewriteRelativeImportExtension helper
1 parent 497872a commit 689efe3

File tree

7 files changed

+115
-0
lines changed

7 files changed

+115
-0
lines changed

modules/index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ export {
3333
__createBinding,
3434
__addDisposableResource,
3535
__disposeResources,
36+
__rewriteRelativeImportExtension,
3637
} from '../tslib.js';
3738
export * as default from '../tslib.js';

modules/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const {
3131
__classPrivateFieldIn,
3232
__addDisposableResource,
3333
__disposeResources,
34+
__rewriteRelativeImportExtension,
3435
} = tslib;
3536
export {
3637
__extends,
@@ -64,5 +65,6 @@ export {
6465
__classPrivateFieldIn,
6566
__addDisposableResource,
6667
__disposeResources,
68+
__rewriteRelativeImportExtension,
6769
};
6870
export default tslib;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import assert from "node:assert";
2+
import { test } from "node:test";
3+
import { testHelper } from "./testHelper.js";
4+
5+
testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension => {
6+
test("rewrites relative .ts to .js", () => {
7+
assert.equal(__rewriteRelativeImportExtension("./foo.ts"), "./foo.js");
8+
assert.equal(__rewriteRelativeImportExtension("../foo.ts"), "../foo.js");
9+
assert.equal(__rewriteRelativeImportExtension("../../foo.ts"), "../../foo.js");
10+
});
11+
12+
test("rewrites other TypeScript extensions", () => {
13+
assert.equal(__rewriteRelativeImportExtension("./foo.mts"), "./foo.mjs");
14+
assert.equal(__rewriteRelativeImportExtension("./foo.cts"), "./foo.cjs");
15+
assert.equal(__rewriteRelativeImportExtension("./foo.tsx"), "./foo.js");
16+
assert.equal(__rewriteRelativeImportExtension("./foo.tsx", true), "./foo.jsx");
17+
});
18+
19+
test("does not rewrite other extensions", () => {
20+
assert.equal(__rewriteRelativeImportExtension("./foo.js"), "./foo.js");
21+
assert.equal(__rewriteRelativeImportExtension("./foo.mjs"), "./foo.mjs");
22+
assert.equal(__rewriteRelativeImportExtension("./foo.cjs"), "./foo.cjs");
23+
assert.equal(__rewriteRelativeImportExtension("./foo.jsx"), "./foo.jsx");
24+
assert.equal(__rewriteRelativeImportExtension("./foo.json"), "./foo.json");
25+
assert.equal(__rewriteRelativeImportExtension("./foo.css"), "./foo.css");
26+
assert.equal(__rewriteRelativeImportExtension("./foo"), "./foo");
27+
});
28+
29+
test("does not rewrite non-relative imports", () => {
30+
assert.equal(__rewriteRelativeImportExtension("foo.ts"), "foo.ts");
31+
assert.equal(__rewriteRelativeImportExtension("foo.mts"), "foo.mts");
32+
assert.equal(__rewriteRelativeImportExtension("foo.cts"), "foo.cts");
33+
assert.equal(__rewriteRelativeImportExtension("foo.tsx"), "foo.tsx");
34+
assert.equal(__rewriteRelativeImportExtension("foo.js"), "foo.js");
35+
assert.equal(__rewriteRelativeImportExtension("foo.mjs"), "foo.mjs");
36+
assert.equal(__rewriteRelativeImportExtension("foo.cjs"), "foo.cjs");
37+
assert.equal(__rewriteRelativeImportExtension("foo.jsx"), "foo.jsx");
38+
assert.equal(__rewriteRelativeImportExtension("foo.json"), "foo.json");
39+
assert.equal(__rewriteRelativeImportExtension("foo.css"), "foo.css");
40+
assert.equal(__rewriteRelativeImportExtension("foo"), "foo");
41+
});
42+
43+
test("does not rewrite declaration file extensions", () => {
44+
assert.equal(__rewriteRelativeImportExtension("./foo.d.ts"), "./foo.d.ts");
45+
assert.equal(__rewriteRelativeImportExtension("./foo.d.mts"), "./foo.d.mts");
46+
assert.equal(__rewriteRelativeImportExtension("./foo.d.cts"), "./foo.d.cts");
47+
assert.equal(__rewriteRelativeImportExtension("./foo.d.css.ts"), "./foo.d.css.ts");
48+
});
49+
});

tslib.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -451,3 +451,10 @@ export declare function __addDisposableResource<T>(env: { stack: { value?: unkno
451451
* @seealso {@link __addDisposableResource}
452452
*/
453453
export declare function __disposeResources(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }): any;
454+
455+
/**
456+
* Transforms a relative import specifier ending in a non-declaration TypeScript file extension to its JavaScript file extension counterpart.
457+
* @param path The import specifier.
458+
* @param preserveJsx Causes '*.tsx' to transform to '*.jsx' instead of '*.js'. Should be true when `--jsx` is set to `preserve`.
459+
*/
460+
export declare function __rewriteRelativeImportExtension(path: string, preserveJsx?: boolean): string;

tslib.es6.js

+18
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,23 @@ export function __disposeResources(env) {
348348
return next();
349349
}
350350

351+
export function __rewriteRelativeImportExtension(path, preserveJsx) {
352+
if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) {
353+
if (path.substring(path.length - 4) === ".tsx") {
354+
return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js");
355+
}
356+
if (path.substring(path.length - 3) === ".ts") {
357+
var dot = path.lastIndexOf(".", path.length - 4);
358+
if (dot >= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) {
359+
return path;
360+
}
361+
return path.substring(0, path.length - 3) + ".js";
362+
}
363+
return path.replace(/(?<!\.d)\.[cm]ts$/, function (ext) { return ext === ".mts" ? ".mjs" : ".cjs"; });
364+
}
365+
return path;
366+
}
367+
351368
export default {
352369
__extends: __extends,
353370
__assign: __assign,
@@ -380,4 +397,5 @@ export default {
380397
__classPrivateFieldIn: __classPrivateFieldIn,
381398
__addDisposableResource: __addDisposableResource,
382399
__disposeResources: __disposeResources,
400+
__rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
383401
};

tslib.es6.mjs

+18
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,23 @@ export function __disposeResources(env) {
347347
return next();
348348
}
349349

350+
export function __rewriteRelativeImportExtension(path, preserveJsx) {
351+
if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) {
352+
if (path.substring(path.length - 4) === ".tsx") {
353+
return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js");
354+
}
355+
if (path.substring(path.length - 3) === ".ts") {
356+
var dot = path.lastIndexOf(".", path.length - 4);
357+
if (dot >= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) {
358+
return path;
359+
}
360+
return path.substring(0, path.length - 3) + ".js";
361+
}
362+
return path.replace(/(?<!\.d)\.[cm]ts$/, function (ext) { return ext === ".mts" ? ".mjs" : ".cjs"; });
363+
}
364+
return path;
365+
}
366+
350367
export default {
351368
__extends,
352369
__assign,
@@ -379,4 +396,5 @@ export default {
379396
__classPrivateFieldIn,
380397
__addDisposableResource,
381398
__disposeResources,
399+
__rewriteRelativeImportExtension,
382400
};

tslib.js

+20
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var __classPrivateFieldIn;
4444
var __createBinding;
4545
var __addDisposableResource;
4646
var __disposeResources;
47+
var __rewriteRelativeImportExtension;
4748
(function (factory) {
4849
var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
4950
if (typeof define === "function" && define.amd) {
@@ -395,6 +396,23 @@ var __disposeResources;
395396
return next();
396397
};
397398

399+
__rewriteRelativeImportExtension = function (path, preserveJsx) {
400+
if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) {
401+
if (path.substring(path.length - 4) === ".tsx") {
402+
return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js");
403+
}
404+
if (path.substring(path.length - 3) === ".ts") {
405+
var dot = path.lastIndexOf(".", path.length - 4);
406+
if (dot >= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) {
407+
return path;
408+
}
409+
return path.substring(0, path.length - 3) + ".js";
410+
}
411+
return path.replace(/(?<!\.d)\.[cm]ts$/, function (ext) { return ext === ".mts" ? ".mjs" : ".cjs"; });
412+
}
413+
return path;
414+
};
415+
398416
exporter("__extends", __extends);
399417
exporter("__assign", __assign);
400418
exporter("__rest", __rest);
@@ -426,6 +444,7 @@ var __disposeResources;
426444
exporter("__classPrivateFieldIn", __classPrivateFieldIn);
427445
exporter("__addDisposableResource", __addDisposableResource);
428446
exporter("__disposeResources", __disposeResources);
447+
exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension);
429448
});
430449

431450
0 && (module.exports = {
@@ -460,4 +479,5 @@ var __disposeResources;
460479
__classPrivateFieldIn,
461480
__addDisposableResource,
462481
__disposeResources,
482+
__rewriteRelativeImportExtension,
463483
});

0 commit comments

Comments
 (0)