Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit 3709227

Browse files
fix: support node:test in node 18 (#15)
1 parent afcb1df commit 3709227

File tree

22 files changed

+805
-312
lines changed

22 files changed

+805
-312
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"test": "node --require ./dist/index.js tests/index.ts"
3333
},
3434
"dependencies": {
35-
"@esbuild-kit/core-utils": "^2.0.2",
35+
"@esbuild-kit/core-utils": "^2.1.0",
3636
"get-tsconfig": "^4.1.0"
3737
},
3838
"devDependencies": {

pnpm-lock.yaml

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
resolveTsPath,
88
transformDynamicImport,
99
applySourceMap,
10+
compareNodeVersion,
1011
} from '@esbuild-kit/core-utils';
1112
import {
1213
getTsconfig,
@@ -32,15 +33,14 @@ const tsconfigPathsMatcher = tsconfig && createPathsMatcher(tsconfig);
3233

3334
const sourcemaps = installSourceMapSupport();
3435

35-
const nodeVersion = process.versions.node.split('.').map(Number);
3636
const nodeSupportsImport = (
3737
// v13.2.0 and higher
38-
(nodeVersion[0] >= 13 && nodeVersion[1] >= 2)
38+
compareNodeVersion([13, 2, 0]) >= 0
3939

4040
// 12.20.0 ~ 13.0.0
4141
|| (
42-
(nodeVersion[0] >= 12 && nodeVersion[1] >= 20)
43-
&& (nodeVersion[0] < 13 && nodeVersion[1] < 0)
42+
compareNodeVersion([12, 20, 0]) >= 0
43+
&& compareNodeVersion([13, 0, 0]) < 0
4444
)
4545
);
4646

@@ -115,12 +115,17 @@ Object.defineProperty(extensions, '.mjs', {
115115
enumerable: false,
116116
});
117117

118+
const supportsNodePrefix = (
119+
compareNodeVersion([16, 0, 0]) >= 0
120+
|| compareNodeVersion([14, 18, 0]) >= 0
121+
);
122+
118123
// Add support for "node:" protocol
119124
const resolveFilename = Module._resolveFilename;
120125
Module._resolveFilename = function (request, parent, isMain, options) {
121126
// Added in v12.20.0
122127
// https://nodejs.org/api/esm.html#esm_node_imports
123-
if (request.startsWith('node:')) {
128+
if (!supportsNodePrefix && request.startsWith('node:')) {
124129
request = request.slice(5);
125130
}
126131

+53-19
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,56 @@
1-
const fs = require('node:fs');
2-
3-
console.log(
4-
'loaded cjs-ext-cjs/index.cjs',
5-
JSON.stringify({
6-
nodePrefix: Boolean(fs),
7-
hasDynamicImport: Boolean(import('fs')),
8-
...(() => {
9-
let nameInError;
10-
try {
11-
nameInError();
12-
} catch (error) {
13-
return {
14-
nameInError: error.message.includes('nameInError'),
15-
sourceMap: error.stack.includes(':11:5'),
16-
};
17-
}
18-
})(),
19-
}),
1+
async function test(description, testFunction) {
2+
try {
3+
const result = await testFunction();
4+
if (!result) { throw result; }
5+
console.log(`✔ ${description}`);
6+
} catch (error) {
7+
console.log(`✖ ${description}: ${error.toString().split('\n').shift()}`);
8+
}
9+
}
10+
11+
console.log('loaded cjs-ext-cjs/index.cjs');
12+
13+
test(
14+
'has CJS context',
15+
() => typeof require !== 'undefined' || typeof module !== 'undefined',
16+
);
17+
18+
// esbuild uses import.meta as a signal for ESM
19+
// test(
20+
// 'import.meta.url',
21+
// () => Boolean(import.meta.url),
22+
// );
23+
24+
test(
25+
'name in error',
26+
() => {
27+
let nameInError;
28+
try {
29+
nameInError();
30+
} catch (error) {
31+
return error.message.includes('nameInError');
32+
}
33+
},
34+
);
35+
36+
test(
37+
'sourcemaps',
38+
() => new Error().stack.includes(':38:'),
39+
);
40+
41+
test(
42+
'resolves optional node prefix',
43+
() => Boolean(require('node:fs')),
44+
);
45+
46+
test(
47+
'resolves required node prefix',
48+
() => Boolean(require('node:test')),
49+
);
50+
51+
test(
52+
'has dynamic import',
53+
() => import('fs').then(Boolean),
2054
);
2155

2256
module.exports = 1234;
+53-19
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,56 @@
1-
const fs = require('node:fs');
2-
3-
console.log(
4-
'loaded cjs-ext-js/index.js',
5-
JSON.stringify({
6-
nodePrefix: Boolean(fs),
7-
hasDynamicImport: Boolean(import('fs')),
8-
...(() => {
9-
let nameInError;
10-
try {
11-
nameInError();
12-
} catch (error) {
13-
return {
14-
nameInError: error.message.includes('nameInError'),
15-
sourceMap: error.stack.includes(':11:5'),
16-
};
17-
}
18-
})(),
19-
}),
1+
async function test(description, testFunction) {
2+
try {
3+
const result = await testFunction();
4+
if (!result) { throw result; }
5+
console.log(`✔ ${description}`);
6+
} catch (error) {
7+
console.log(`✖ ${description}: ${error.toString().split('\n').shift()}`);
8+
}
9+
}
10+
11+
console.log('loaded cjs-ext-js/index.js');
12+
13+
test(
14+
'has CJS context',
15+
() => typeof require !== 'undefined' || typeof module !== 'undefined',
16+
);
17+
18+
// esbuild uses import.meta as a signal for ESM
19+
// test(
20+
// 'import.meta.url',
21+
// () => Boolean(import.meta.url),
22+
// );
23+
24+
test(
25+
'name in error',
26+
() => {
27+
let nameInError;
28+
try {
29+
nameInError();
30+
} catch (error) {
31+
return error.message.includes('nameInError');
32+
}
33+
},
34+
);
35+
36+
test(
37+
'sourcemaps',
38+
() => new Error().stack.includes(':38:'),
39+
);
40+
41+
test(
42+
'resolves optional node prefix',
43+
() => Boolean(require('node:fs')),
44+
);
45+
46+
test(
47+
'resolves required node prefix',
48+
() => Boolean(require('node:test')),
49+
);
50+
51+
test(
52+
'has dynamic import',
53+
() => import('fs').then(Boolean),
2054
);
2155

2256
module.exports = 1234;
+52-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,55 @@
1-
import fs from 'node:fs';
2-
3-
console.log(
4-
'loaded esm-ext-js/index.js',
5-
JSON.stringify({
6-
nodePrefix: Boolean(fs),
7-
hasDynamicImport: Boolean(import('fs')),
8-
...(() => {
9-
let nameInError;
10-
try {
11-
nameInError();
12-
} catch (error) {
13-
return {
14-
nameInError: error.message.includes('nameInError'),
15-
sourceMap: error.stack.includes(':11:5'),
16-
};
17-
}
18-
})(),
19-
'import.meta.url': Boolean(import.meta.url),
20-
}),
1+
async function test(description, testFunction) {
2+
try {
3+
const result = await testFunction();
4+
if (!result) { throw result; }
5+
console.log(`✔ ${description}`);
6+
} catch (error) {
7+
console.log(`✖ ${description}: ${error.toString().split('\n').shift()}`);
8+
}
9+
}
10+
11+
console.log('loaded esm-ext-js/index.js');
12+
13+
test(
14+
'has CJS context',
15+
() => typeof require !== 'undefined' || typeof module !== 'undefined',
16+
);
17+
18+
test(
19+
'import.meta.url',
20+
() => Boolean(import.meta.url),
21+
);
22+
23+
test(
24+
'name in error',
25+
() => {
26+
let nameInError;
27+
try {
28+
nameInError();
29+
} catch (error) {
30+
return error.message.includes('nameInError');
31+
}
32+
},
33+
);
34+
35+
test(
36+
'sourcemaps',
37+
() => new Error().stack.includes(':37:'),
38+
);
39+
40+
test(
41+
'has dynamic import',
42+
() => import('fs').then(Boolean),
43+
);
44+
45+
test(
46+
'resolves optional node prefix',
47+
() => import('node:fs').then(Boolean),
48+
);
49+
50+
test(
51+
'resolves required node prefix',
52+
() => import('node:test').then(Boolean),
2153
);
2254

2355
export default 1234;
+52-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,55 @@
1-
import fs from 'node:fs';
2-
3-
console.log(
4-
'loaded esm-ext-mjs/index.mjs',
5-
JSON.stringify({
6-
nodePrefix: Boolean(fs),
7-
hasDynamicImport: Boolean(import('fs')),
8-
...(() => {
9-
let nameInError;
10-
try {
11-
nameInError();
12-
} catch (error) {
13-
return {
14-
nameInError: error.message.includes('nameInError'),
15-
sourceMap: error.stack.includes(':11:5'),
16-
};
17-
}
18-
})(),
19-
'import.meta.url': Boolean(import.meta.url),
20-
}),
1+
async function test(description, testFunction) {
2+
try {
3+
const result = await testFunction();
4+
if (!result) { throw result; }
5+
console.log(`✔ ${description}`);
6+
} catch (error) {
7+
console.log(`✖ ${description}: ${error.toString().split('\n').shift()}`);
8+
}
9+
}
10+
11+
console.log('loaded esm-ext-mjs/index.mjs');
12+
13+
test(
14+
'has CJS context',
15+
() => typeof require !== 'undefined' || typeof module !== 'undefined',
16+
);
17+
18+
test(
19+
'import.meta.url',
20+
() => Boolean(import.meta.url),
21+
);
22+
23+
test(
24+
'name in error',
25+
() => {
26+
let nameInError;
27+
try {
28+
nameInError();
29+
} catch (error) {
30+
return error.message.includes('nameInError');
31+
}
32+
},
33+
);
34+
35+
test(
36+
'sourcemaps',
37+
() => new Error().stack.includes(':37:'),
38+
);
39+
40+
test(
41+
'has dynamic import',
42+
() => import('fs').then(Boolean),
43+
);
44+
45+
test(
46+
'resolves optional node prefix',
47+
() => import('node:fs').then(Boolean),
48+
);
49+
50+
test(
51+
'resolves required node prefix',
52+
() => import('node:test').then(Boolean),
2153
);
2254

2355
export default 1234;

0 commit comments

Comments
 (0)