Skip to content

Commit 2334267

Browse files
authored
Merge pull request #270 from microsoft/rewriteRelativeImportExtension
Add rewriteRelativeImportExtension helper
2 parents 497872a + c4cde74 commit 2334267

File tree

7 files changed

+99
-0
lines changed

7 files changed

+99
-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,57 @@
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+
assert.equal(__rewriteRelativeImportExtension("./foo.TS"), "./foo.js");
11+
assert.equal(__rewriteRelativeImportExtension("./foo.Ts"), "./foo.js");
12+
assert.equal(__rewriteRelativeImportExtension("./foo/.hidden/foo.ts"), "./foo/.hidden/foo.js");
13+
});
14+
15+
test("rewrites other TypeScript extensions", () => {
16+
assert.equal(__rewriteRelativeImportExtension("./foo.mts"), "./foo.mjs");
17+
assert.equal(__rewriteRelativeImportExtension("./foo.cts"), "./foo.cjs");
18+
assert.equal(__rewriteRelativeImportExtension("./foo.tsx"), "./foo.js");
19+
assert.equal(__rewriteRelativeImportExtension("./foo.tsx", true), "./foo.jsx");
20+
assert.equal(__rewriteRelativeImportExtension("./foo.Tsx", true), "./foo.jsx");
21+
assert.equal(__rewriteRelativeImportExtension("./foo.d.css.mts"), "./foo.d.css.mjs");
22+
assert.equal(__rewriteRelativeImportExtension("./foo.d.tsx"), "./foo.d.js");
23+
});
24+
25+
test("does not rewrite other extensions", () => {
26+
assert.equal(__rewriteRelativeImportExtension("./foo.js"), "./foo.js");
27+
assert.equal(__rewriteRelativeImportExtension("./foo.mjs"), "./foo.mjs");
28+
assert.equal(__rewriteRelativeImportExtension("./foo.cjs"), "./foo.cjs");
29+
assert.equal(__rewriteRelativeImportExtension("./foo.jsx"), "./foo.jsx");
30+
assert.equal(__rewriteRelativeImportExtension("./foo.json"), "./foo.json");
31+
assert.equal(__rewriteRelativeImportExtension("./foo.css"), "./foo.css");
32+
assert.equal(__rewriteRelativeImportExtension("./foo"), "./foo");
33+
assert.equal(__rewriteRelativeImportExtension("./foo.d.php?q=1.ts"), "./foo.d.php?q=1.ts");
34+
});
35+
36+
test("does not rewrite non-relative imports", () => {
37+
assert.equal(__rewriteRelativeImportExtension("foo.ts"), "foo.ts");
38+
assert.equal(__rewriteRelativeImportExtension("foo.mts"), "foo.mts");
39+
assert.equal(__rewriteRelativeImportExtension("foo.cts"), "foo.cts");
40+
assert.equal(__rewriteRelativeImportExtension("foo.tsx"), "foo.tsx");
41+
assert.equal(__rewriteRelativeImportExtension("foo.js"), "foo.js");
42+
assert.equal(__rewriteRelativeImportExtension("foo.mjs"), "foo.mjs");
43+
assert.equal(__rewriteRelativeImportExtension("foo.cjs"), "foo.cjs");
44+
assert.equal(__rewriteRelativeImportExtension("foo.jsx"), "foo.jsx");
45+
assert.equal(__rewriteRelativeImportExtension("foo.json"), "foo.json");
46+
assert.equal(__rewriteRelativeImportExtension("foo.css"), "foo.css");
47+
assert.equal(__rewriteRelativeImportExtension("foo"), "foo");
48+
});
49+
50+
test("does not rewrite declaration file extensions", () => {
51+
assert.equal(__rewriteRelativeImportExtension("./foo.d.ts"), "./foo.d.ts");
52+
assert.equal(__rewriteRelativeImportExtension("./foo.d.mts"), "./foo.d.mts");
53+
assert.equal(__rewriteRelativeImportExtension("./foo.d.cts"), "./foo.d.cts");
54+
assert.equal(__rewriteRelativeImportExtension("./foo.d.css.ts"), "./foo.d.css.ts");
55+
assert.equal(__rewriteRelativeImportExtension("./foo.D.ts"), "./foo.D.ts");
56+
});
57+
});

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

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

351+
export function __rewriteRelativeImportExtension(path, preserveJsx) {
352+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
353+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
354+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
355+
});
356+
}
357+
return path;
358+
}
359+
351360
export default {
352361
__extends: __extends,
353362
__assign: __assign,
@@ -380,4 +389,5 @@ export default {
380389
__classPrivateFieldIn: __classPrivateFieldIn,
381390
__addDisposableResource: __addDisposableResource,
382391
__disposeResources: __disposeResources,
392+
__rewriteRelativeImportExtension: __rewriteRelativeImportExtension,
383393
};

tslib.es6.mjs

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

350+
export function __rewriteRelativeImportExtension(path, preserveJsx) {
351+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
352+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
353+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
354+
});
355+
}
356+
return path;
357+
}
358+
350359
export default {
351360
__extends,
352361
__assign,
@@ -379,4 +388,5 @@ export default {
379388
__classPrivateFieldIn,
380389
__addDisposableResource,
381390
__disposeResources,
391+
__rewriteRelativeImportExtension,
382392
};

tslib.js

+12
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,15 @@ var __disposeResources;
395396
return next();
396397
};
397398

399+
__rewriteRelativeImportExtension = function (path, preserveJsx) {
400+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
401+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
402+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
403+
});
404+
}
405+
return path;
406+
};
407+
398408
exporter("__extends", __extends);
399409
exporter("__assign", __assign);
400410
exporter("__rest", __rest);
@@ -426,6 +436,7 @@ var __disposeResources;
426436
exporter("__classPrivateFieldIn", __classPrivateFieldIn);
427437
exporter("__addDisposableResource", __addDisposableResource);
428438
exporter("__disposeResources", __disposeResources);
439+
exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension);
429440
});
430441

431442
0 && (module.exports = {
@@ -460,4 +471,5 @@ var __disposeResources;
460471
__classPrivateFieldIn,
461472
__addDisposableResource,
462473
__disposeResources,
474+
__rewriteRelativeImportExtension,
463475
});

0 commit comments

Comments
 (0)