Skip to content

Commit 502858f

Browse files
committed
feat: Added esm loader
1 parent beee776 commit 502858f

File tree

12 files changed

+117
-16
lines changed

12 files changed

+117
-16
lines changed

esm.mjs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { fileURLToPath } from 'url';
2+
import { createRequire } from 'module';
3+
const require = createRequire(fileURLToPath(import.meta.url));
4+
5+
/** @type {import('./src/compatibility/node-register')} */
6+
const { nodeRegister } = require('./dist/compatibility/node-register');
7+
8+
/** @type {import('ts-node')} */
9+
import tsNode from 'ts-node';
10+
11+
const tsNodeInstance = nodeRegister();
12+
13+
export const { resolve, getFormat, transformSource } = tsNode.createEsmHooks(tsNodeInstance);

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"rimraf": "^3.0.2",
6565
"standard-version": "^9.3.1",
6666
"ts-jest": "^27.0.4",
67-
"ts-node": "^10.1.0",
67+
"ts-node": "^10.4.0",
6868
"ts-patch": "^1.4.4",
6969
"ts3": "npm:[email protected]",
7070
"ts45": "npm:[email protected]",

register.js

-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ try {
77
);
88
}
99

10-
tsNode.register();
1110
require('./').nodeRegister();

src/compatibility/node-register.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export function mergeTransformers(
6868
// region: TsNode Registration Utility
6969
/* ****************************************************************************************************************** */
7070

71-
export function nodeRegister(): TSNode.RegisterOptions | undefined {
71+
export function nodeRegister(): TSNode.Service | undefined {
7272
const { tsNodeInstance, tsNode } = nodeRegister.initialize();
7373

7474
const transformerConfig = getProjectTransformerConfig(tsNodeInstance.config);
@@ -96,8 +96,7 @@ export function nodeRegister(): TSNode.RegisterOptions | undefined {
9696
}
9797

9898
// Re-register with new transformers
99-
tsNode.register(registerOptions);
100-
return registerOptions;
99+
return tsNode.register(registerOptions);
101100
}
102101

103102
export namespace nodeRegister {

test/projects/esm-loader/package.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"private": true,
3+
"name": "@tests/esm-loader",
4+
"version": "0.0.0",
5+
"type": "module"
6+
}

test/projects/esm-loader/src/id.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const b = null;

test/projects/esm-loader/src/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from "#identifier";
2+
import { b } from "#identifier";
3+
4+
console.log(b);
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"include": [ "src" ],
3+
4+
"compilerOptions": {
5+
"noEmit": true,
6+
7+
"rootDir": ".",
8+
"module": "ESNext",
9+
"target": "ESNext",
10+
"esModuleInterop": true,
11+
"moduleResolution": "node",
12+
"declaration": true,
13+
14+
"baseUrl": "./src",
15+
"paths": {
16+
"#identifier": [ "./id.ts" ]
17+
},
18+
19+
"plugins": [
20+
{
21+
"transform": "typescript-transform-paths"
22+
},
23+
{
24+
"transform": "typescript-transform-paths",
25+
"afterDeclarations": true
26+
}
27+
]
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { execSync } from "child_process";
2+
import path from "path";
3+
import ts from 'typescript'
4+
import { projectsPath } from "../../src/config";
5+
6+
/* ****************************************************************************************************************** *
7+
* Tests
8+
* ****************************************************************************************************************** */
9+
10+
describe(`ESM Loader`, () => {
11+
const esmProjectRoot = ts.normalizePath(path.join(projectsPath, "esm-loader"));
12+
13+
// See: https://github.com/LeDDGroup/typescript-transform-paths/issues/134
14+
test(`Transforms ESM project`, () => {
15+
const res = execSync(
16+
`node --no-warnings --loader tstp/esm --es-module-specifier-resolution=node src/index.ts`,
17+
{ cwd: esmProjectRoot }
18+
).toString();
19+
20+
expect(res).toMatch(/^null($|\r?\n)/);
21+
});
22+
});

test/tests/compatibility/node-register.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ describe(`[Compatibility: ts-node] Register script`, () => {
6060
registerSpy?.mockRestore();
6161
}
6262
});
63+
6364
test(`Uses existing ts-node if found`, () => {
6465
const fakeInstance: any = {};
6566

@@ -172,7 +173,7 @@ describe(`[Compatibility: ts-node] Register script`, () => {
172173
});
173174

174175
const originalTsNodeInstance = global.process[instanceSymbol];
175-
registerResult = nodeRegister()!;
176+
registerResult = nodeRegister()!.options;
176177
instanceRegistrationResult = global.process[instanceSymbol]!;
177178
global.process[instanceSymbol] = originalTsNodeInstance;
178179

test/tests/projects/general.test.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ const makeRelative = (tsInstance: typeof TS, fileName: string, p: string, rootDi
2626

2727
const getExpected = (tsInstance: typeof TS, fileName: string, original: string, rootDir: string): string =>
2828
original
29+
.replaceAll(`'`, '"')
2930
.replace(/"@(.*)"/g, (_, p) => makeRelative(tsInstance, fileName, p, rootDir))
3031
.replace(/"#utils\/(.*)"/g, (_, p) =>
3132
makeRelative(tsInstance, fileName, path.join(p === 'hello' ? 'secondary' : 'utils', p), rootDir)
3233
)
3334
.replace('"path"', '"https://external.url/path.js"')
34-
.replace(`'circular/a'', '"../circular/a"');
35+
.replace('"circular/a"', '"../circular/a"');
3536

3637
/* ****************************************************************************************************************** *
3738
* Tests
@@ -77,7 +78,9 @@ describe(`[Project: 'general'] - General Tests`, () => {
7778
let transformed: EmittedFiles[string];
7879

7980
beforeAll(() => {
80-
transformed = transformedFiles[file];
81+
transformed = transformedFiles[file]
82+
transformed.js = transformed.js.replaceAll(`'`, '"');
83+
transformed.dts = transformed.dts?.replaceAll(`'`, '"');
8184
expected = {
8285
js: getExpected(ts, file, originalFiles[file].js, projectRoot),
8386
...(!skipDts && { dts: getExpected(ts, file, originalFiles[file].dts!, projectRoot) }),

yarn.lock

+32-8
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,18 @@
482482
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
483483
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
484484

485+
"@cspotcode/[email protected]":
486+
version "0.8.0"
487+
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
488+
integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
489+
490+
"@cspotcode/[email protected]":
491+
version "0.7.0"
492+
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
493+
integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
494+
dependencies:
495+
"@cspotcode/source-map-consumer" "0.8.0"
496+
485497
"@hutson/parse-repository-url@^3.0.0":
486498
version "3.0.2"
487499
resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340"
@@ -717,7 +729,7 @@
717729
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
718730
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
719731

720-
"@tsconfig/node16@^1.0.1":
732+
"@tsconfig/node16@^1.0.2":
721733
version "1.0.2"
722734
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
723735
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
@@ -876,6 +888,11 @@ acorn-walk@^7.1.1:
876888
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
877889
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
878890

891+
acorn-walk@^8.1.1:
892+
version "8.2.0"
893+
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
894+
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
895+
879896
acorn@^7.1.1:
880897
version "7.4.1"
881898
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
@@ -886,6 +903,11 @@ acorn@^8.2.4:
886903
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
887904
integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
888905

906+
acorn@^8.4.1:
907+
version "8.5.0"
908+
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
909+
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
910+
889911
add-stream@^1.0.0:
890912
version "1.0.0"
891913
resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
@@ -3357,7 +3379,7 @@ slash@^3.0.0:
33573379
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
33583380
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
33593381

3360-
source-map-support@^0.5.17, source-map-support@^0.5.6:
3382+
source-map-support@^0.5.6:
33613383
version "0.5.19"
33623384
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
33633385
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -3665,20 +3687,22 @@ ts-jest@^27.0.4:
36653687
semver "7.x"
36663688
yargs-parser "20.x"
36673689

3668-
ts-node@^10.1.0:
3669-
version "10.1.0"
3670-
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.1.0.tgz#e656d8ad3b61106938a867f69c39a8ba6efc966e"
3671-
integrity sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==
3690+
ts-node@^10.4.0:
3691+
version "10.4.0"
3692+
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
3693+
integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==
36723694
dependencies:
3695+
"@cspotcode/source-map-support" "0.7.0"
36733696
"@tsconfig/node10" "^1.0.7"
36743697
"@tsconfig/node12" "^1.0.7"
36753698
"@tsconfig/node14" "^1.0.0"
3676-
"@tsconfig/node16" "^1.0.1"
3699+
"@tsconfig/node16" "^1.0.2"
3700+
acorn "^8.4.1"
3701+
acorn-walk "^8.1.1"
36773702
arg "^4.1.0"
36783703
create-require "^1.1.0"
36793704
diff "^4.0.1"
36803705
make-error "^1.1.1"
3681-
source-map-support "^0.5.17"
36823706
yn "3.1.1"
36833707

36843708
ts-patch@^1.4.4:

0 commit comments

Comments
 (0)