import-in-the-middle 1.2.3 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/hook.mjs +9 -3
- package/index.js +5 -1
- package/package.json +8 -2
- package/test/fixtures/say-hi.mts +3 -0
- package/test/hook/static-import-package-internals-enabled.mjs +1 -1
- package/test/runtest +7 -1
- package/test/runtest.bat +1 -0
- package/test/typescript/iitm-ts-node-loader.mjs +18 -0
- package/test/typescript/ts-node.test.mts +11 -0
- package/tsconfig.json +14 -0
package/hook.mjs
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
const specifiers = new Map()
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
// FIXME: Typescript extensions are added temporarily until we find a better
|
|
8
|
+
// way of supporting arbitrary extensions
|
|
9
|
+
const EXTENSION_RE = /\.(js|mjs|cjs|ts|mts|cts)$/
|
|
8
10
|
|
|
9
11
|
const NODE_MAJOR = Number(process.versions.node.split('.')[0])
|
|
10
12
|
|
|
@@ -43,12 +45,16 @@ function deleteIitm (url) {
|
|
|
43
45
|
function addIitm (url) {
|
|
44
46
|
const urlObj = new URL(url)
|
|
45
47
|
urlObj.searchParams.set('iitm', 'true')
|
|
46
|
-
|
|
48
|
+
if (NODE_MAJOR === 17) {
|
|
49
|
+
return urlObj.protocol !== 'file:' ? 'file:' + urlObj.href : urlObj.href
|
|
50
|
+
}
|
|
51
|
+
return urlObj.protocol !== 'file:' && urlObj.protocol !== 'node:' && NODE_MAJOR < 18
|
|
52
|
+
? 'file:' + urlObj.href
|
|
53
|
+
: urlObj.href
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
export async function resolve (specifier, context, parentResolve) {
|
|
50
57
|
const { parentURL = '' } = context
|
|
51
|
-
|
|
52
58
|
const url = await parentResolve(deleteIitm(specifier), context, parentResolve)
|
|
53
59
|
|
|
54
60
|
if (parentURL === '' && !EXTENSION_RE.test(url.url)) {
|
package/index.js
CHANGED
|
@@ -51,7 +51,11 @@ function Hook(modules, options, hookFn) {
|
|
|
51
51
|
if (isBuiltin) {
|
|
52
52
|
name = name.replace(/^node:/, '')
|
|
53
53
|
} else {
|
|
54
|
-
|
|
54
|
+
if (name.startsWith('file://')) {
|
|
55
|
+
try {
|
|
56
|
+
name = fileURLToPath(name)
|
|
57
|
+
} catch (e) {}
|
|
58
|
+
}
|
|
55
59
|
const details = parse(name)
|
|
56
60
|
if (details) {
|
|
57
61
|
name = details.name
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "import-in-the-middle",
|
|
3
|
-
"version": "1.2
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Intercept imports in Node.js",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "c8 --check-coverage --lines 90 imhotap --runner test/runtest --files test/{hook,low-level,other}/*",
|
|
8
|
+
"test-win": "c8 --check-coverage --lines 90 imhotap --runner test\\runtest.bat --files test/{hook,low-level,other}/*",
|
|
9
|
+
"test:ts": "c8 imhotap --runner test/runtest --files test/typescript/*.test.mts",
|
|
10
|
+
"test-win:ts": "c8 imhotap --runner test\\runtest.bat --files test/typescript/*.test.mts",
|
|
8
11
|
"coverage": "c8 --reporter html imhotap --runner test/runtest --files test/{hook,low-level,other}/* && echo '\nNow open coverage/index.html\n'"
|
|
9
12
|
},
|
|
10
13
|
"repository": {
|
|
@@ -26,8 +29,11 @@
|
|
|
26
29
|
},
|
|
27
30
|
"homepage": "https://github.com/DataDog/import-in-the-middle#readme",
|
|
28
31
|
"devDependencies": {
|
|
32
|
+
"@types/node": "^18.0.6",
|
|
29
33
|
"c8": "^7.8.0",
|
|
30
|
-
"imhotap": "^2.0.0"
|
|
34
|
+
"imhotap": "^2.0.0",
|
|
35
|
+
"ts-node": "^10.9.1",
|
|
36
|
+
"typescript": "^4.7.4"
|
|
31
37
|
},
|
|
32
38
|
"dependencies": {
|
|
33
39
|
"module-details-from-path": "^1.0.3"
|
|
@@ -7,7 +7,7 @@ import { strictEqual } from 'assert'
|
|
|
7
7
|
const c8Dir = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'node_modules', 'c8')
|
|
8
8
|
|
|
9
9
|
Hook(['c8'], { internals: true }, (exports, name, baseDir) => {
|
|
10
|
-
strictEqual(name, 'c8
|
|
10
|
+
strictEqual(name, path.join('c8','index.js'))
|
|
11
11
|
strictEqual(baseDir, c8Dir)
|
|
12
12
|
exports.Report = () => 42
|
|
13
13
|
})
|
package/test/runtest
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
const { spawn } = require('child_process')
|
|
8
8
|
const path = require('path')
|
|
9
|
+
const url = require('url')
|
|
9
10
|
|
|
10
11
|
process.env.NODE_NO_WARNINGS = 1
|
|
11
12
|
|
|
@@ -15,7 +16,12 @@ const args = [
|
|
|
15
16
|
...process.argv.slice(2)
|
|
16
17
|
]
|
|
17
18
|
if (!filename.includes('disabled')) {
|
|
18
|
-
|
|
19
|
+
const isTypescript = path.extname(filename).slice(-2) === 'ts'
|
|
20
|
+
const loaderPath = isTypescript
|
|
21
|
+
? path.join(__dirname, 'typescript', 'iitm-ts-node-loader.mjs')
|
|
22
|
+
: path.join(__dirname, '..', 'hook.mjs')
|
|
23
|
+
|
|
24
|
+
args.unshift(`--experimental-loader=${url.pathToFileURL(loaderPath)}`)
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
spawn('node', args, { stdio: 'inherit' }).on('close', code => {
|
package/test/runtest.bat
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node test/runtest %*
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as iitm from '../../hook.mjs'
|
|
2
|
+
import * as tsNode from 'ts-node/esm.mjs'
|
|
3
|
+
|
|
4
|
+
const makeNext = (loader, fnName, parentResolveOrLoad) => {
|
|
5
|
+
return (specifierOrUrl, context) => {
|
|
6
|
+
return loader[fnName](specifierOrUrl, context, parentResolveOrLoad)
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function resolve(specifier, context, defaultResolve) {
|
|
11
|
+
const next = makeNext(tsNode, 'resolve', defaultResolve)
|
|
12
|
+
return iitm.resolve(specifier, context, next)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function load(url, context, defaultLoad) {
|
|
16
|
+
let next = makeNext(tsNode, 'load', defaultLoad)
|
|
17
|
+
return iitm.load(url, context, next)
|
|
18
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import { addHook } from '../../index.js'
|
|
3
|
+
import { sayHi } from '../fixtures/say-hi.mjs'
|
|
4
|
+
|
|
5
|
+
addHook((url, exported) => {
|
|
6
|
+
if (url.toLowerCase().endsWith('say-hi.mts')) {
|
|
7
|
+
exported.sayHi = () => 'Hooked'
|
|
8
|
+
}
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
assert.equal(sayHi('test'), 'Hooked')
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "esnext",
|
|
4
|
+
"module": "esnext",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"experimentalDecorators": true,
|
|
7
|
+
"emitDecoratorMetadata": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"noEmit": true
|
|
10
|
+
},
|
|
11
|
+
"ts-node": {
|
|
12
|
+
"esm": true
|
|
13
|
+
}
|
|
14
|
+
}
|