nhx 0.0.0-alpha.0 → 0.0.1
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/README.md +53 -156
- package/dist/cli.js +88 -101
- package/dist/cli.js.map +1 -1
- package/dist/executor.d.ts +1 -0
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +50 -46
- package/dist/executor.js.map +1 -1
- package/dist/inline-deps.d.ts +1 -1
- package/dist/inline-deps.d.ts.map +1 -1
- package/dist/inline-deps.js +5 -1
- package/dist/inline-deps.js.map +1 -1
- package/dist/script-runner.d.ts +1 -1
- package/dist/script-runner.d.ts.map +1 -1
- package/dist/script-runner.js +127 -178
- package/dist/script-runner.js.map +1 -1
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -1,210 +1,107 @@
|
|
|
1
|
-
# nhx - Node.js Hybrid eXecutor
|
|
1
|
+
# `nhx` - Node.js Hybrid eXecutor (a `uvx` inspired tool)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/nhx)
|
|
4
|
+
[](https://www.npmjs.com/package/nhx)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
npm install -g nhx
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
10
|
-
|
|
11
|
-
### 1. Run Local Scripts
|
|
6
|
+
A hybrid of `node ./script.js` and `npx package` - run scripts or packages with automatic dependency handling.
|
|
12
7
|
|
|
13
8
|
```bash
|
|
14
|
-
nhx
|
|
15
|
-
nhx ./script.ts
|
|
16
|
-
nhx -e 'console.log("hello")'
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Scripts can declare inline dependencies:
|
|
20
|
-
|
|
21
|
-
```javascript
|
|
22
|
-
/*/ // <package>
|
|
23
|
-
{
|
|
24
|
-
dependencies: {
|
|
25
|
-
chalk: "^5.3.0",
|
|
26
|
-
lodash: "^4.17.21"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/*/ // </package>
|
|
30
|
-
|
|
31
|
-
import chalk from 'chalk';
|
|
32
|
-
import _ from 'lodash';
|
|
33
|
-
|
|
34
|
-
console.log(chalk.green(_.capitalize('hello world')));
|
|
9
|
+
npm install -g nhx
|
|
35
10
|
```
|
|
36
11
|
|
|
37
|
-
|
|
12
|
+
## Why nhx?
|
|
38
13
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# From git
|
|
45
|
-
nhx --with=github:user/repo command
|
|
46
|
-
nhx --with=git+https://github.com/user/repo.git command
|
|
47
|
-
```
|
|
14
|
+
- **Self-contained scripts** - Scripts declare their own dependencies and just work
|
|
15
|
+
- **No project setup** - No `package.json`, no `npm install`, no `node_modules`
|
|
16
|
+
- **Share scripts easily** - Send a single file that anyone can run
|
|
17
|
+
- **Fast** - Dependencies are cached globally, subsequent runs are instant
|
|
18
|
+
- **Works offline** - Once cached, no network needed
|
|
48
19
|
|
|
49
20
|
## Options
|
|
50
21
|
|
|
51
22
|
```
|
|
52
|
-
--with <dep> Add dependency (
|
|
53
|
-
--engine <spec>
|
|
23
|
+
--with <dep> Add a dependency (repeatable, supports @version)
|
|
24
|
+
--engine <spec> Node version (e.g. node:18, node:>=16)
|
|
54
25
|
--run-postinstall Allow postinstall scripts (disabled by default)
|
|
55
26
|
-h, --help Show help
|
|
56
27
|
```
|
|
57
28
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
## TypeScript Support
|
|
29
|
+
All other flags pass through to node.
|
|
61
30
|
|
|
62
|
-
|
|
31
|
+
## Examples
|
|
63
32
|
|
|
64
33
|
```bash
|
|
65
|
-
#
|
|
66
|
-
nhx
|
|
67
|
-
|
|
68
|
-
# Or as a shebang
|
|
69
|
-
#!/usr/bin/env -S npx nhx --with=tsx --import tsx
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
You can also declare tsx as an inline dependency:
|
|
34
|
+
# Run an npm package
|
|
35
|
+
nhx cowsay hello
|
|
73
36
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
/*/ // <package>
|
|
77
|
-
{
|
|
78
|
-
dependencies: {
|
|
79
|
-
tsx: "^4.7.0"
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/*/ // </package>
|
|
37
|
+
# Run a local script (dependencies installed automatically)
|
|
38
|
+
nhx ./script.js
|
|
83
39
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
Green,
|
|
87
|
-
Blue,
|
|
88
|
-
}
|
|
89
|
-
console.log(Color.Green);
|
|
90
|
-
```
|
|
40
|
+
# Add a dependency for a script
|
|
41
|
+
nhx --with=lodash ./script.js
|
|
91
42
|
|
|
92
|
-
|
|
43
|
+
# Pin a specific version
|
|
44
|
+
nhx --with=chalk@4.1.2 ./script.js
|
|
93
45
|
|
|
94
|
-
|
|
46
|
+
# Use a specific node version
|
|
47
|
+
nhx --engine=node:18 ./script.js
|
|
95
48
|
|
|
96
|
-
|
|
49
|
+
# Pipe from stdin
|
|
50
|
+
curl -s https://example.com/script.js | nhx -
|
|
97
51
|
|
|
98
|
-
|
|
99
|
-
nhx
|
|
100
|
-
nhx --
|
|
52
|
+
# All node flags work
|
|
53
|
+
nhx -e 'console.log(1)'
|
|
54
|
+
nhx --check ./script.js
|
|
101
55
|
```
|
|
102
56
|
|
|
103
|
-
|
|
57
|
+
## Self-contained scripts
|
|
104
58
|
|
|
105
|
-
|
|
59
|
+
Scripts can declare their own dependencies inline:
|
|
106
60
|
|
|
107
61
|
```javascript
|
|
62
|
+
// hello.mjs
|
|
108
63
|
/*/ // <package>
|
|
109
|
-
{
|
|
110
|
-
engines: { node: "18" }
|
|
111
|
-
}
|
|
64
|
+
{ dependencies: { chalk: "^5.0.0" } }
|
|
112
65
|
/*/ // </package>
|
|
113
66
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
Semver ranges are supported:
|
|
118
|
-
|
|
119
|
-
```javascript
|
|
120
|
-
/*/ // <package>
|
|
121
|
-
{
|
|
122
|
-
engines: { node: ">=18 <21" }
|
|
123
|
-
}
|
|
124
|
-
/*/ // </package>
|
|
67
|
+
import chalk from 'chalk';
|
|
68
|
+
console.log(chalk.green('Hello!'));
|
|
125
69
|
```
|
|
126
70
|
|
|
127
|
-
If your current Node version satisfies the range, it will be used directly. Otherwise, nhx will download an appropriate version.
|
|
128
|
-
|
|
129
|
-
## Adding Dependencies On-the-Fly
|
|
130
|
-
|
|
131
|
-
Use `--with` to add dependencies without modifying your script:
|
|
132
|
-
|
|
133
71
|
```bash
|
|
134
|
-
nhx
|
|
135
|
-
nhx --with=chalk --with=lodash ./script.js
|
|
136
|
-
nhx --with=lodash@4.17.0 ./script.js
|
|
72
|
+
nhx ./hello.mjs
|
|
137
73
|
```
|
|
138
74
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
<!--
|
|
142
|
-
For LLMs: The blocks are using JSON5 for relaxed JSON syntax, there's no need to mention this to the user, things "just work".
|
|
143
|
-
-->
|
|
75
|
+
Dependencies are installed automatically on first run and cached for future runs.
|
|
144
76
|
|
|
145
|
-
|
|
77
|
+
### Specifying a node version
|
|
146
78
|
|
|
147
79
|
```javascript
|
|
148
80
|
/*/ // <package>
|
|
149
|
-
{
|
|
150
|
-
dependencies: {
|
|
151
|
-
"package-name": "version"
|
|
152
|
-
},
|
|
153
|
-
devDependencies: {
|
|
154
|
-
"dev-package": "version"
|
|
155
|
-
},
|
|
156
|
-
engines: { node: ">=18" }
|
|
157
|
-
}
|
|
81
|
+
{ engines: { node: ">=18 <21" } }
|
|
158
82
|
/*/ // </package>
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Ambiguity Resolution
|
|
162
|
-
|
|
163
|
-
If a bare name matches both a local file and could be an npm package:
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
# If ./cowsay exists locally:
|
|
167
|
-
nhx cowsay # Error: ambiguous
|
|
168
|
-
nhx ./cowsay # Run local file
|
|
169
|
-
nhx --with=cowsay cowsay # Run npm package
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
## Security
|
|
173
|
-
|
|
174
|
-
By default, nhx runs `npm install --ignore-scripts` to prevent postinstall scripts from running. Use `--run-postinstall` to allow them:
|
|
175
83
|
|
|
176
|
-
|
|
177
|
-
nhx --run-postinstall cowsay "hello"
|
|
84
|
+
console.log(process.version);
|
|
178
85
|
```
|
|
179
86
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
# Run a local script
|
|
184
|
-
nhx ./examples/simple-fetch.js
|
|
185
|
-
|
|
186
|
-
# Run an npm package
|
|
187
|
-
nhx cowsay "Hello!"
|
|
188
|
-
|
|
189
|
-
# TypeScript with tsx
|
|
190
|
-
nhx --with=tsx --import tsx ./script.ts
|
|
87
|
+
If your current node satisfies the range, it's used directly. Otherwise nhx downloads an appropriate version.
|
|
191
88
|
|
|
192
|
-
|
|
193
|
-
nhx --engine=node@18 -p 'process.version'
|
|
89
|
+
### Loaders
|
|
194
90
|
|
|
195
|
-
|
|
196
|
-
nhx --with=chalk --with=lodash ./script.js
|
|
91
|
+
Use tsx as a declared dependency **and** as a loader:
|
|
197
92
|
|
|
198
|
-
|
|
199
|
-
|
|
93
|
+
```typescript
|
|
94
|
+
#!/usr/bin/env -S nhx --with=tsx --import tsx
|
|
95
|
+
import { something } from './other.ts';
|
|
200
96
|
```
|
|
201
97
|
|
|
202
|
-
|
|
98
|
+
You can also do that with inline dependencies:
|
|
203
99
|
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
#!/usr/bin/env -S nhx --import tsx
|
|
102
|
+
/*/ // <package>
|
|
103
|
+
{ devDependencies: { tsx: "^4" } }
|
|
104
|
+
/*/ // </package>
|
|
208
105
|
```
|
|
209
106
|
|
|
210
107
|
## License
|
package/dist/cli.js
CHANGED
|
@@ -4,22 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const child_process_1 = require("child_process");
|
|
8
7
|
const path_1 = require("path");
|
|
9
8
|
const fs_1 = require("fs");
|
|
9
|
+
const os_1 = require("os");
|
|
10
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
-
const minimist_1 = __importDefault(require("minimist"));
|
|
12
11
|
const script_runner_js_1 = require("./script-runner.js");
|
|
13
12
|
const executor_js_1 = require("./executor.js");
|
|
14
|
-
const
|
|
15
|
-
const OUR_FLAGS = ['--help', '-h', '--run-postinstall', '--with', '--engine'];
|
|
16
|
-
const OUR_KEYS = ['_', 'help', 'h', 'run-postinstall', 'with', 'engine'];
|
|
13
|
+
const EXT = ['.js', '.cjs', '.ts', '.mjs', '.mts'];
|
|
17
14
|
const HELP = `
|
|
18
15
|
Usage: nhx [options] [target] [args...]
|
|
19
16
|
|
|
20
17
|
Options:
|
|
21
18
|
--with <dep> Add dependency (repeatable)
|
|
22
|
-
--engine <spec> Node version (e.g. "node
|
|
19
|
+
--engine <spec> Node version (e.g. "node:18", "node:>=18 <20")
|
|
23
20
|
--run-postinstall Allow postinstall scripts
|
|
24
21
|
-h, --help Show help
|
|
25
22
|
|
|
@@ -29,122 +26,112 @@ Examples:
|
|
|
29
26
|
nhx cowsay hi # run npm package
|
|
30
27
|
nhx --with=typescript tsc # run tsc from typescript
|
|
31
28
|
nhx --with=tsx --import tsx a.ts # typescript
|
|
29
|
+
curl ... | nhx - # run from stdin
|
|
32
30
|
`;
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
function
|
|
49
|
-
const
|
|
31
|
+
const isLocal = (t) => /^\.{0,2}\//.test(t);
|
|
32
|
+
async function readStdin() {
|
|
33
|
+
const chunks = [];
|
|
34
|
+
for await (const chunk of process.stdin)
|
|
35
|
+
chunks.push(chunk);
|
|
36
|
+
const content = Buffer.concat(chunks).toString('utf8');
|
|
37
|
+
const dir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'nhx-'));
|
|
38
|
+
const file = (0, path_1.join)(dir, 'script.mts');
|
|
39
|
+
(0, fs_1.writeFileSync)(file, content);
|
|
40
|
+
return file;
|
|
41
|
+
}
|
|
42
|
+
const findFile = (t) => [t, ...EXT.map((e) => t + e)].find(fs_1.existsSync);
|
|
43
|
+
const matches = (t) => [t, ...EXT.map((e) => t + e)].filter(fs_1.existsSync);
|
|
44
|
+
// Parse nhx-specific flags from argv (can be interleaved with node flags)
|
|
45
|
+
// All nhx flags must appear before the target - after target, everything is passed through
|
|
46
|
+
function parseNhxArgs(argv) {
|
|
47
|
+
const withDeps = [];
|
|
48
|
+
const engines = [];
|
|
49
|
+
let help = false;
|
|
50
|
+
let runPostinstall = false;
|
|
51
|
+
const rest = [];
|
|
52
|
+
let foundTarget = false;
|
|
50
53
|
for (let i = 0; i < argv.length; i++) {
|
|
51
54
|
const arg = argv[i];
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
// Check if this looks like a target (not a flag)
|
|
56
|
+
if (!arg.startsWith('-'))
|
|
57
|
+
foundTarget = true;
|
|
58
|
+
if (foundTarget)
|
|
59
|
+
rest.push(arg);
|
|
60
|
+
else if (arg === '-h' || arg === '--help')
|
|
61
|
+
help = true;
|
|
62
|
+
else if (arg === '--run-postinstall')
|
|
63
|
+
runPostinstall = true;
|
|
64
|
+
else if (arg === '--with' && i + 1 < argv.length)
|
|
65
|
+
withDeps.push(argv[++i]);
|
|
66
|
+
else if (arg.startsWith('--with='))
|
|
67
|
+
withDeps.push(arg.slice(7));
|
|
68
|
+
else if (arg === '--engine' && i + 1 < argv.length)
|
|
69
|
+
engines.push(argv[++i]);
|
|
70
|
+
else if (arg.startsWith('--engine='))
|
|
71
|
+
engines.push(arg.slice(9));
|
|
72
|
+
else
|
|
73
|
+
rest.push(arg);
|
|
61
74
|
}
|
|
62
|
-
return
|
|
75
|
+
return { withDeps, engines, help, runPostinstall, rest };
|
|
63
76
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
// Split rest into nodeArgs, target, and scriptArgs
|
|
78
|
+
function splitArgs(rest) {
|
|
79
|
+
const nodeArgs = [];
|
|
80
|
+
let i = 0;
|
|
81
|
+
// Collect node flags until we hit something that looks like a target
|
|
82
|
+
while (i < rest.length) {
|
|
83
|
+
const arg = rest[i];
|
|
84
|
+
if (!arg.startsWith('-'))
|
|
85
|
+
break; // found target
|
|
86
|
+
nodeArgs.push(arg);
|
|
87
|
+
i++;
|
|
88
|
+
// If this flag takes a value, include it
|
|
89
|
+
if (i < rest.length && !rest[i].startsWith('-')) {
|
|
90
|
+
nodeArgs.push(rest[i]);
|
|
91
|
+
i++;
|
|
92
|
+
}
|
|
74
93
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const hasOpts = opts.with.length || opts.engine.length;
|
|
79
|
-
if (hasOpts)
|
|
80
|
-
return (0, script_runner_js_1.runScript)('__eval__', [], {
|
|
81
|
-
withDeps: opts.with,
|
|
82
|
-
nodeArgs: args,
|
|
83
|
-
engines: opts.engine,
|
|
84
|
-
});
|
|
85
|
-
return new Promise((res, rej) => {
|
|
86
|
-
const child = (0, child_process_1.spawn)(process.execPath, args, { stdio: 'inherit' });
|
|
87
|
-
child.on('exit', (c) => res(c || 0));
|
|
88
|
-
child.on('error', rej);
|
|
89
|
-
});
|
|
94
|
+
const target = rest[i];
|
|
95
|
+
const args = rest.slice(i + 1);
|
|
96
|
+
return { nodeArgs, target, args };
|
|
90
97
|
}
|
|
91
98
|
async function main() {
|
|
92
99
|
const argv = process.argv.slice(2);
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const startsWithFlag = argv.length === 0 || argv[0].startsWith('-');
|
|
99
|
-
if (startsWithFlag) {
|
|
100
|
-
const parsed = (0, minimist_1.default)(argv, parseOpts);
|
|
101
|
-
if (parsed.help)
|
|
100
|
+
const { withDeps, engines, help, runPostinstall, rest } = parseNhxArgs(argv);
|
|
101
|
+
const { nodeArgs, target, args } = splitArgs(rest);
|
|
102
|
+
// No target = forward to node (handles -e, -p, --version, etc.)
|
|
103
|
+
if (!target) {
|
|
104
|
+
if (help)
|
|
102
105
|
return console.log(HELP);
|
|
103
|
-
|
|
104
|
-
if (noTarget)
|
|
105
|
-
process.exit(await runNode(stripOurFlags(argv), {
|
|
106
|
-
with: toArray(parsed.with),
|
|
107
|
-
engine: toArray(parsed.engine),
|
|
108
|
-
}));
|
|
106
|
+
process.exit(await (0, script_runner_js_1.runScript)(null, args, { withDeps, nodeArgs, engines }));
|
|
109
107
|
}
|
|
110
|
-
const parsed = (0, minimist_1.default)(argv, { ...parseOpts, stopEarly: true });
|
|
111
|
-
if (parsed.help)
|
|
112
|
-
return console.log(HELP);
|
|
113
|
-
const [target, ...args] = parsed._;
|
|
114
|
-
const withDeps = toArray(parsed.with);
|
|
115
|
-
const engines = toArray(parsed.engine);
|
|
116
|
-
const opts = {
|
|
117
|
-
with: withDeps,
|
|
118
|
-
engines: engines,
|
|
119
|
-
runPostinstall: parsed['run-postinstall'],
|
|
120
|
-
};
|
|
121
108
|
try {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
console.error(chalk_1.default.red(`Ambiguous: "${target}" matches: ${matches.join(', ')}`));
|
|
109
|
+
// Check for ambiguity (bare name that matches local file)
|
|
110
|
+
if (!isLocal(target) && !withDeps.length) {
|
|
111
|
+
const matched = matches(target);
|
|
112
|
+
if (matched.length) {
|
|
113
|
+
console.error(chalk_1.default.red(`Ambiguous: "${target}" matches: ${matched.join(', ')}`));
|
|
128
114
|
console.error(chalk_1.default.yellow('Use ./ for local, --with= for npm'));
|
|
129
115
|
process.exit(1);
|
|
130
116
|
}
|
|
131
117
|
}
|
|
118
|
+
const opts = { withDeps, nodeArgs, engines };
|
|
119
|
+
// Stdin
|
|
120
|
+
if (target === '-') {
|
|
121
|
+
const file = await readStdin();
|
|
122
|
+
process.exit(await (0, script_runner_js_1.runScript)(file, args, opts));
|
|
123
|
+
}
|
|
124
|
+
// Local file
|
|
132
125
|
if (isLocal(target)) {
|
|
133
126
|
const file = findFile(target);
|
|
134
127
|
if (!file)
|
|
135
128
|
throw new Error(`File not found: ${target}`);
|
|
136
|
-
|
|
137
|
-
withDeps: opts.with,
|
|
138
|
-
nodeArgs: extractFlags(parsed),
|
|
139
|
-
engines: opts.engines,
|
|
140
|
-
});
|
|
141
|
-
process.exit(code);
|
|
129
|
+
process.exit(await (0, script_runner_js_1.runScript)((0, path_1.resolve)(file), args, opts));
|
|
142
130
|
}
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
await (0, executor_js_1.executePackage)(pkg, cmdArgs, { runPostinstall: opts.runPostinstall });
|
|
131
|
+
// NPM package
|
|
132
|
+
const pkg = withDeps.length ? withDeps[0] : target;
|
|
133
|
+
const binName = withDeps.length ? target : undefined;
|
|
134
|
+
await (0, executor_js_1.executePackage)(pkg, args, { runPostinstall, binName });
|
|
148
135
|
}
|
|
149
136
|
catch (e) {
|
|
150
137
|
console.error(chalk_1.default.red(`Failed: ${e.message}`));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,+BAAqC;AACrC,2BAA4D;AAC5D,2BAA4B;AAC5B,kDAA0B;AAC1B,yDAA+C;AAC/C,+CAA+C;AAE/C,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;CAgBZ,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpD,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAA,gBAAW,EAAC,IAAA,WAAI,EAAC,IAAA,WAAM,GAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,IAAA,kBAAa,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAU,CAAC,CAAC;AAC/E,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAU,CAAC,CAAC;AAEhF,0EAA0E;AAC1E,2FAA2F;AAC3F,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,iDAAiD;QACjD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,WAAW,GAAG,IAAI,CAAC;QAE7C,IAAI,WAAW;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,GAAG,KAAK,mBAAmB;YAAE,cAAc,GAAG,IAAI,CAAC;aACvD,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACtE,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3D,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACvE,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;;YAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,mDAAmD;AACnD,SAAS,SAAS,CAAC,IAAc;IAK/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,qEAAqE;IACrE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,eAAe;QAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,EAAE,CAAC;QACJ,yCAAyC;QACzC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEnD,gEAAgE;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAA,4BAAS,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC;QACH,0DAA0D;QAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,eAAe,MAAM,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACnE,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC7C,QAAQ;QACR,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,IAAA,4BAAS,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,aAAa;QACb,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,MAAM,IAAA,4BAAS,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,cAAc;QACd,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,MAAM,IAAA,4BAAc,EAAC,GAAG,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/executor.d.ts
CHANGED
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|
package/dist/executor.js
CHANGED
|
@@ -5,77 +5,81 @@ const fs_1 = require("fs");
|
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const os_1 = require("os");
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
8
9
|
const inline_deps_js_1 = require("./inline-deps.js");
|
|
9
|
-
const CACHE = (0, path_1.join)((0, os_1.homedir)(), '.nhx'
|
|
10
|
+
const CACHE = (0, path_1.join)((0, os_1.homedir)(), '.nhx');
|
|
10
11
|
async function executePackage(pkgSpec, args = [], opts = {}) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
await fs_1.promises.writeFile((0, path_1.join)(dir, 'package.json'),
|
|
21
|
-
await
|
|
22
|
-
|
|
23
|
-
if (!bin)
|
|
24
|
-
throw new Error(`No executable found for ${pkgSpec}`);
|
|
25
|
-
const code = await run(bin, args);
|
|
26
|
-
await fs_1.promises.rm(dir, { recursive: true, force: true }).catch(() => { });
|
|
27
|
-
return code;
|
|
28
|
-
}
|
|
29
|
-
catch (e) {
|
|
30
|
-
await fs_1.promises.rm(dir, { recursive: true, force: true }).catch(() => { });
|
|
31
|
-
throw e;
|
|
12
|
+
// Normalize bare package names: "cowsay" -> "cowsay@*"
|
|
13
|
+
// Leave alone: versioned ("pkg@1.0"), scoped ("@scope/pkg"), URLs, git specs, file paths
|
|
14
|
+
const isBare = /^[a-z][\w.-]*$/i.test(pkgSpec);
|
|
15
|
+
const normalized = isBare ? `${pkgSpec}@*` : pkgSpec;
|
|
16
|
+
const hash = (0, crypto_1.createHash)('sha256').update(normalized).digest('hex').slice(0, 12);
|
|
17
|
+
const dir = (0, path_1.join)(CACHE, (0, inline_deps_js_1.getNodeVersionKey)(), hash);
|
|
18
|
+
const modules = (0, path_1.join)(dir, 'node_modules');
|
|
19
|
+
if (!(0, fs_1.existsSync)(modules)) {
|
|
20
|
+
await fs_1.promises.mkdir(dir, { recursive: true });
|
|
21
|
+
await fs_1.promises.writeFile((0, path_1.join)(dir, 'package.json'), '{"name":"x","private":true}');
|
|
22
|
+
await fs_1.promises.writeFile((0, path_1.join)(dir, '_meta.json'), JSON.stringify({ pkg: normalized }, null, 2));
|
|
23
|
+
await install(dir, normalized, opts.runPostinstall || false);
|
|
32
24
|
}
|
|
25
|
+
const bin = await findBin(dir, pkgSpec, opts.binName);
|
|
26
|
+
if (!bin)
|
|
27
|
+
throw new Error(`No executable found for ${pkgSpec}`);
|
|
28
|
+
return run(bin, args);
|
|
33
29
|
}
|
|
34
|
-
function install(cwd, pkg, postinstall) {
|
|
35
|
-
const
|
|
30
|
+
async function install(cwd, pkg, postinstall) {
|
|
31
|
+
const base = ['install', pkg, '--no-save'];
|
|
36
32
|
if (!postinstall)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const child = (0, child_process_1.spawn)('npm', args, {
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
base.push('--ignore-scripts');
|
|
34
|
+
const run = (args, silent = false) => new Promise((res) => {
|
|
35
|
+
const child = (0, child_process_1.spawn)('npm', [...base, ...args], {
|
|
36
|
+
cwd,
|
|
37
|
+
stdio: silent ? 'ignore' : ['inherit', 2, 2],
|
|
38
|
+
});
|
|
39
|
+
child.on('close', (c) => res(c === 0));
|
|
40
|
+
child.on('error', () => res(false));
|
|
42
41
|
});
|
|
42
|
+
// Try offline first (silent), fall back to network
|
|
43
|
+
if (await run(['--offline'], true))
|
|
44
|
+
return;
|
|
45
|
+
if (await run(['--prefer-offline']))
|
|
46
|
+
return;
|
|
47
|
+
throw new Error(`npm install failed for ${pkg}`);
|
|
43
48
|
}
|
|
44
|
-
async function findBin(dir, spec) {
|
|
49
|
+
async function findBin(dir, spec, binName) {
|
|
45
50
|
const nm = (0, path_1.join)(dir, 'node_modules');
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
// Extract package name from spec (handles @scope/pkg@version)
|
|
52
|
+
const match = spec.match(/^(@?[^@]+)/);
|
|
53
|
+
const pkgName = match?.[1] || spec;
|
|
54
|
+
let pkgDir = (0, path_1.join)(nm, pkgName);
|
|
55
|
+
// If not found, scan node_modules for a package with a bin (handles git/URL specs)
|
|
56
|
+
if (!(0, fs_1.existsSync)(pkgDir)) {
|
|
50
57
|
const entries = await fs_1.promises.readdir(nm).catch(() => []);
|
|
51
58
|
for (const e of entries) {
|
|
52
|
-
|
|
53
|
-
if (skip)
|
|
59
|
+
if (e.startsWith('.') || e === '.bin')
|
|
54
60
|
continue;
|
|
55
61
|
const d = (0, path_1.join)(nm, e);
|
|
56
|
-
|
|
57
|
-
if (!isDir)
|
|
62
|
+
if (!(await fs_1.promises.stat(d)).isDirectory())
|
|
58
63
|
continue;
|
|
59
64
|
const p = JSON.parse(await fs_1.promises.readFile((0, path_1.join)(d, 'package.json'), 'utf-8').catch(() => '{}'));
|
|
60
65
|
if (p.bin) {
|
|
61
66
|
pkgDir = d;
|
|
62
|
-
pkgName = e;
|
|
63
67
|
break;
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
|
-
if (!pkgDir)
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
pkgName = spec.split('@').find((p) => p && !/^\d/.test(p)) || spec;
|
|
71
|
-
pkgDir = (0, path_1.join)(nm, pkgName);
|
|
72
70
|
}
|
|
71
|
+
if (!(0, fs_1.existsSync)(pkgDir))
|
|
72
|
+
return null;
|
|
73
73
|
const p = JSON.parse(await fs_1.promises.readFile((0, path_1.join)(pkgDir, 'package.json'), 'utf-8').catch(() => '{}'));
|
|
74
74
|
if (!p.bin)
|
|
75
75
|
return null;
|
|
76
76
|
if (typeof p.bin === 'string')
|
|
77
77
|
return (0, path_1.join)(pkgDir, p.bin);
|
|
78
|
-
|
|
78
|
+
// If a specific bin name was requested, use it
|
|
79
|
+
if (binName && p.bin[binName])
|
|
80
|
+
return (0, path_1.join)(pkgDir, p.bin[binName]);
|
|
81
|
+
// Try matching bin name to package name (handles @scope/pkg -> pkg)
|
|
82
|
+
const name = (p.name || pkgName).split('/').pop();
|
|
79
83
|
if (name && p.bin[name])
|
|
80
84
|
return (0, path_1.join)(pkgDir, p.bin[name]);
|
|
81
85
|
const first = Object.values(p.bin)[0];
|
package/dist/executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/inline-deps.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export interface ParsedDeps {
|
|
|
5
5
|
hasInlineDeps: boolean;
|
|
6
6
|
}
|
|
7
7
|
export declare const parseInlineDependencies: (path: string) => Promise<ParsedDeps>;
|
|
8
|
-
export declare const getNodeVersionKey: () => string;
|
|
8
|
+
export declare const getNodeVersionKey: (targetVersion?: string) => string;
|
|
9
9
|
export declare const createPackageJson: (d: ParsedDeps, name?: string) => {
|
|
10
10
|
name: string;
|
|
11
11
|
version: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-deps.d.ts","sourceRoot":"","sources":["../src/inline-deps.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;CACxB;AAqBD,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,wBACV,CAAC;AACjD,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"inline-deps.d.ts","sourceRoot":"","sources":["../src/inline-deps.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;CACxB;AAqBD,eAAO,MAAM,uBAAuB,GAAU,MAAM,MAAM,wBACV,CAAC;AACjD,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM,WAIvD,CAAC;AACF,eAAO,MAAM,iBAAiB,GAAI,GAAG,UAAU,EAAE,aAAe;;;;;;CAM9D,CAAC"}
|
package/dist/inline-deps.js
CHANGED
|
@@ -27,7 +27,11 @@ function parseContent(content) {
|
|
|
27
27
|
}
|
|
28
28
|
const parseInlineDependencies = async (path) => parseContent(await fs_1.promises.readFile(path, 'utf-8'));
|
|
29
29
|
exports.parseInlineDependencies = parseInlineDependencies;
|
|
30
|
-
const getNodeVersionKey = () =>
|
|
30
|
+
const getNodeVersionKey = (targetVersion) => {
|
|
31
|
+
const ver = targetVersion || process.versions.node;
|
|
32
|
+
const parts = ver.replace(/^v?/, '').split('.');
|
|
33
|
+
return `node-${parts.slice(0, 2).join('.')}`;
|
|
34
|
+
};
|
|
31
35
|
exports.getNodeVersionKey = getNodeVersionKey;
|
|
32
36
|
const createPackageJson = (d, name = 'script') => ({
|
|
33
37
|
name,
|
package/dist/inline-deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-deps.js","sourceRoot":"","sources":["../src/inline-deps.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,kDAA0B;AAS1B,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;AACvD,MAAM,KAAK,GAAe,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAE5D,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAEM,MAAM,uBAAuB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CAC5D,YAAY,CAAC,MAAM,aAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AADpC,QAAA,uBAAuB,2BACa;AAC1C,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"inline-deps.js","sourceRoot":"","sources":["../src/inline-deps.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,kDAA0B;AAS1B,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;AACvD,MAAM,KAAK,GAAe,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAE5D,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAEM,MAAM,uBAAuB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CAC5D,YAAY,CAAC,MAAM,aAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AADpC,QAAA,uBAAuB,2BACa;AAC1C,MAAM,iBAAiB,GAAG,CAAC,aAAsB,EAAE,EAAE;IAC1D,MAAM,GAAG,GAAG,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B;AACK,MAAM,iBAAiB,GAAG,CAAC,CAAa,EAAE,IAAI,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI;IACJ,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,CAAC,CAAC,YAAY;IAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;CACnC,CAAC,CAAC;AANU,QAAA,iBAAiB,qBAM3B"}
|
package/dist/script-runner.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export interface RunScriptOptions {
|
|
|
3
3
|
nodeArgs?: string[];
|
|
4
4
|
engines?: string[];
|
|
5
5
|
}
|
|
6
|
-
export declare function runScript(
|
|
6
|
+
export declare function runScript(script: string | null, args?: string[], opts?: RunScriptOptions): Promise<number>;
|
|
7
7
|
//# sourceMappingURL=script-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-runner.d.ts","sourceRoot":"","sources":["../src/script-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"script-runner.d.ts","sourceRoot":"","sources":["../src/script-runner.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,GAAE,MAAM,EAAO,EACnB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA2DjB"}
|
package/dist/script-runner.js
CHANGED
|
@@ -8,221 +8,170 @@ const fs_1 = require("fs");
|
|
|
8
8
|
const path_1 = require("path");
|
|
9
9
|
const os_1 = require("os");
|
|
10
10
|
const child_process_1 = require("child_process");
|
|
11
|
-
const fs_2 = require("fs");
|
|
12
|
-
const inline_deps_js_1 = require("./inline-deps.js");
|
|
13
11
|
const crypto_1 = require("crypto");
|
|
14
12
|
const semver_1 = __importDefault(require("semver"));
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
while (true) {
|
|
20
|
-
const pkgPath = (0, path_1.join)(dir, 'node_modules', name);
|
|
21
|
-
if ((0, fs_2.existsSync)(pkgPath))
|
|
22
|
-
return pkgPath;
|
|
23
|
-
const parent = (0, path_1.join)(dir, '..');
|
|
24
|
-
if (parent === dir)
|
|
25
|
-
break;
|
|
26
|
-
dir = parent;
|
|
27
|
-
}
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
const LOADER_FALLBACK = `
|
|
31
|
-
import { join } from 'node:path';
|
|
32
|
-
import { pathToFileURL } from 'node:url';
|
|
33
|
-
const modules = __MODULES__;
|
|
34
|
-
export async function resolve(spec, ctx, next) {
|
|
35
|
-
try { return await next(spec, ctx); } catch (e) {
|
|
36
|
-
const isModule = e.code === 'ERR_MODULE_NOT_FOUND' && !/^[./]|^node:/.test(spec);
|
|
37
|
-
if (isModule) try { return await next(spec, { ...ctx, parentURL: pathToFileURL(join(modules, '_')).href }); } catch {}
|
|
38
|
-
throw e;
|
|
39
|
-
}
|
|
40
|
-
}`;
|
|
41
|
-
// Loader that forces resolution from our installed modules first (for hard deps)
|
|
42
|
-
const LOADER_PRIORITY = `
|
|
13
|
+
const inline_deps_js_1 = require("./inline-deps.js");
|
|
14
|
+
const CACHE = (0, path_1.join)((0, os_1.homedir)(), '.nhx');
|
|
15
|
+
// ESM loader - resolves from cache before local node_modules
|
|
16
|
+
const ESM_LOADER = (modules) => `
|
|
43
17
|
import { join } from 'node:path';
|
|
44
18
|
import { pathToFileURL } from 'node:url';
|
|
45
|
-
const modules =
|
|
46
|
-
const hardDeps = __HARD_DEPS__;
|
|
19
|
+
const modules = ${JSON.stringify(modules)};
|
|
47
20
|
export async function resolve(spec, ctx, next) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
try { return await next(spec, { ...ctx, parentURL: pathToFileURL(join(modules, '_')).href }); } catch {}
|
|
52
|
-
}
|
|
53
|
-
// Otherwise, try normal resolution, then fall back to our modules
|
|
54
|
-
try { return await next(spec, ctx); } catch (e) {
|
|
55
|
-
const isModule = e.code === 'ERR_MODULE_NOT_FOUND' && !/^[./]|^node:/.test(spec);
|
|
56
|
-
if (isModule) try { return await next(spec, { ...ctx, parentURL: pathToFileURL(join(modules, '_')).href }); } catch {}
|
|
57
|
-
throw e;
|
|
58
|
-
}
|
|
21
|
+
if (/^[./#]|^node:/.test(spec)) return next(spec, ctx);
|
|
22
|
+
try { return await next(spec, { ...ctx, parentURL: pathToFileURL(join(modules, '_')).href }); }
|
|
23
|
+
catch { return next(spec, ctx); }
|
|
59
24
|
}`;
|
|
60
|
-
// CJS
|
|
61
|
-
const
|
|
25
|
+
// CJS loader - patches require to check cache first
|
|
26
|
+
const CJS_LOADER = (modules) => `
|
|
62
27
|
const Module = require('module');
|
|
28
|
+
const path = require('path');
|
|
29
|
+
const fs = require('fs');
|
|
30
|
+
const modules = ${JSON.stringify(modules)};
|
|
63
31
|
const orig = Module._resolveFilename;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
try { return orig.call(this, req, parent, isMain, { ...opts, paths: [modules, ...(opts?.paths || [])] }); } catch {}
|
|
32
|
+
Module._resolveFilename = function(request, parent, isMain, options) {
|
|
33
|
+
if (!/^[./#]/.test(request) && !request.startsWith('node:')) {
|
|
34
|
+
const cached = path.join(modules, request);
|
|
35
|
+
try {
|
|
36
|
+
if (fs.existsSync(cached)) return orig.call(this, request, { ...parent, paths: [modules] }, isMain, options);
|
|
37
|
+
} catch {}
|
|
71
38
|
}
|
|
72
|
-
return orig.call(this,
|
|
39
|
+
return orig.call(this, request, parent, isMain, options);
|
|
73
40
|
};`;
|
|
74
|
-
async function runScript(
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
: await (0, inline_deps_js_1.parseInlineDependencies)(scriptPath);
|
|
79
|
-
// Track which deps are "soft" (no version, prefer local) vs "hard" (explicit version)
|
|
80
|
-
const softDeps = [];
|
|
81
|
-
const hardDeps = [];
|
|
41
|
+
async function runScript(script, args = [], opts = {}) {
|
|
42
|
+
const deps = script
|
|
43
|
+
? await (0, inline_deps_js_1.parseInlineDependencies)(script)
|
|
44
|
+
: { dependencies: {}, devDependencies: {}, hasInlineDeps: false };
|
|
82
45
|
for (const dep of opts.withDeps || []) {
|
|
83
46
|
const at = dep.lastIndexOf('@');
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
else {
|
|
93
|
-
softDeps.push(pkgName);
|
|
47
|
+
const hasVer = at > 0;
|
|
48
|
+
const name = hasVer ? dep.slice(0, at) : dep;
|
|
49
|
+
let ver = hasVer ? dep.slice(at + 1) : '*';
|
|
50
|
+
// Resolve @latest to actual version for deterministic cache key
|
|
51
|
+
if (ver === 'latest') {
|
|
52
|
+
const resolved = await getLatestVersion(name);
|
|
53
|
+
if (resolved)
|
|
54
|
+
ver = resolved;
|
|
94
55
|
}
|
|
56
|
+
deps.dependencies[name] = ver;
|
|
57
|
+
deps.hasInlineDeps = true;
|
|
95
58
|
}
|
|
96
|
-
// convert --engines="node@18,other@1" to { node: "18", other: "1" }
|
|
97
59
|
const engines = deps.engines ?? {};
|
|
98
|
-
opts.engines?.
|
|
99
|
-
const [name, ver] = e.split('
|
|
100
|
-
|
|
60
|
+
opts.engines?.forEach((e) => {
|
|
61
|
+
const [name, ver] = e.split(':');
|
|
62
|
+
if (name && ver)
|
|
63
|
+
engines[name] = ver;
|
|
101
64
|
});
|
|
65
|
+
const nodeArgs = opts.nodeArgs || [];
|
|
102
66
|
if (!deps.hasInlineDeps)
|
|
103
|
-
return exec(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
67
|
+
return exec(script, args, null, nodeArgs, engines);
|
|
68
|
+
const targetNode = getTargetNodeMajor(engines?.node);
|
|
69
|
+
// Install deps to cache
|
|
70
|
+
const hashInput = { d: deps.dependencies, v: deps.devDependencies };
|
|
71
|
+
const json = JSON.stringify(hashInput);
|
|
72
|
+
const hash = (0, crypto_1.createHash)('sha256').update(json).digest('hex').slice(0, 12);
|
|
73
|
+
const dir = (0, path_1.join)(CACHE, (0, inline_deps_js_1.getNodeVersionKey)(targetNode), hash);
|
|
74
|
+
const modules = (0, path_1.join)(dir, 'node_modules');
|
|
75
|
+
if (!(0, fs_1.existsSync)(modules)) {
|
|
76
|
+
await fs_1.promises.mkdir(dir, { recursive: true });
|
|
77
|
+
const pkg = (0, inline_deps_js_1.createPackageJson)(deps, script ? (0, path_1.basename)(script) : 'eval');
|
|
78
|
+
await fs_1.promises.writeFile((0, path_1.join)(dir, 'package.json'), JSON.stringify(pkg, null, 2));
|
|
79
|
+
const meta = JSON.stringify(hashInput, null, 2);
|
|
80
|
+
await fs_1.promises.writeFile((0, path_1.join)(dir, '_meta.json'), meta);
|
|
81
|
+
await install(dir);
|
|
119
82
|
}
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const dir = (0, path_1.join)(CACHE, (0, inline_deps_js_1.getNodeVersionKey)(), hash);
|
|
133
|
-
const cached = await fs_1.promises.access((0, path_1.join)(dir, 'node_modules')).then(() => true, () => false);
|
|
134
|
-
if (!cached) {
|
|
135
|
-
await fs_1.promises.mkdir(dir, { recursive: true });
|
|
136
|
-
const installDeps = { ...deps, dependencies: depsToInstall };
|
|
137
|
-
const pkg = (0, inline_deps_js_1.createPackageJson)(installDeps, (0, path_1.basename)(scriptPath));
|
|
138
|
-
await fs_1.promises.writeFile((0, path_1.join)(dir, 'package.json'), JSON.stringify(pkg, null, 2));
|
|
139
|
-
await install(dir);
|
|
140
|
-
}
|
|
141
|
-
installedModules = (0, path_1.join)(dir, 'node_modules');
|
|
142
|
-
}
|
|
143
|
-
// Build NODE_PATH: installed modules first, then local modules
|
|
144
|
-
const modulePaths = [installedModules, ...localModules].filter(Boolean);
|
|
145
|
-
// If we have installed modules, use the loader
|
|
146
|
-
if (installedModules) {
|
|
147
|
-
const cacheDir = (0, path_1.join)(installedModules, '..');
|
|
148
|
-
const hasHardDeps = hardDeps.length > 0;
|
|
149
|
-
// ESM loader for import() resolution
|
|
150
|
-
const loader = (0, path_1.join)(cacheDir, '_loader.mjs');
|
|
151
|
-
const loaderCode = hasHardDeps
|
|
152
|
-
? LOADER_PRIORITY.replace('__MODULES__', JSON.stringify(installedModules)).replace('__HARD_DEPS__', JSON.stringify(hardDeps))
|
|
153
|
-
: LOADER_FALLBACK.replace('__MODULES__', JSON.stringify(installedModules));
|
|
154
|
-
await fs_1.promises.writeFile(loader, loaderCode);
|
|
155
|
-
const loaderArgs = ['--experimental-loader', loader];
|
|
156
|
-
const constArgs = ['--no-warnings'];
|
|
157
|
-
let allArgs = [...loaderArgs, ...constArgs];
|
|
158
|
-
// For eval mode with hard deps, also use CJS preload to patch require()
|
|
159
|
-
if (isEval && hasHardDeps) {
|
|
160
|
-
const preload = (0, path_1.join)(cacheDir, '_preload.cjs');
|
|
161
|
-
const preloadCode = CJS_PRELOAD.replace('__MODULES__', JSON.stringify(installedModules)).replace('__HARD_DEPS__', JSON.stringify(hardDeps));
|
|
162
|
-
await fs_1.promises.writeFile(preload, preloadCode);
|
|
163
|
-
allArgs = ['-r', preload, ...allArgs];
|
|
164
|
-
}
|
|
165
|
-
allArgs = [...allArgs, ...(opts.nodeArgs || [])];
|
|
166
|
-
const script = isEval ? '' : scriptPath;
|
|
167
|
-
return exec(script, args, modulePaths.join(':'), allArgs, engines);
|
|
168
|
-
}
|
|
169
|
-
// Only local modules, no loader needed
|
|
170
|
-
const script = isEval ? '' : scriptPath;
|
|
171
|
-
return exec(script, args, modulePaths.join(':'), opts.nodeArgs || [], engines);
|
|
83
|
+
const esmLoader = (0, path_1.join)(dir, '_loader.mjs');
|
|
84
|
+
const cjsLoader = (0, path_1.join)(dir, '_loader.cjs');
|
|
85
|
+
await fs_1.promises.writeFile(esmLoader, ESM_LOADER(modules));
|
|
86
|
+
await fs_1.promises.writeFile(cjsLoader, CJS_LOADER(modules));
|
|
87
|
+
const loaderArgs = [
|
|
88
|
+
'--experimental-loader',
|
|
89
|
+
esmLoader,
|
|
90
|
+
'--require',
|
|
91
|
+
cjsLoader,
|
|
92
|
+
'--no-warnings',
|
|
93
|
+
];
|
|
94
|
+
return exec(script, args, modules, [...loaderArgs, ...nodeArgs], engines);
|
|
172
95
|
}
|
|
173
96
|
async function install(cwd) {
|
|
174
97
|
const pkg = JSON.parse(await fs_1.promises.readFile((0, path_1.join)(cwd, 'package.json'), 'utf-8'));
|
|
175
|
-
const
|
|
176
|
-
|
|
98
|
+
const hasKeys = (obj) => Object.keys(obj || {}).length > 0;
|
|
99
|
+
const hasDeps = hasKeys(pkg.dependencies) || hasKeys(pkg.devDependencies);
|
|
100
|
+
if (!hasDeps)
|
|
177
101
|
return;
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
child.on('
|
|
102
|
+
const run = (args, silent = false) => new Promise((res) => {
|
|
103
|
+
const child = (0, child_process_1.spawn)('npm', ['install', ...args, '--ignore-scripts'], {
|
|
104
|
+
cwd,
|
|
105
|
+
stdio: silent ? ['inherit', 'ignore', 'ignore'] : ['inherit', 2, 2],
|
|
106
|
+
});
|
|
107
|
+
child.on('close', (c) => res(c === 0));
|
|
108
|
+
child.on('error', () => res(false));
|
|
109
|
+
});
|
|
110
|
+
// Try offline first (silent - instant if cached), fall back to network
|
|
111
|
+
if (await run(['--offline'], true))
|
|
112
|
+
return;
|
|
113
|
+
if (await run(['--prefer-offline']))
|
|
114
|
+
return;
|
|
115
|
+
throw new Error('npm install failed');
|
|
116
|
+
}
|
|
117
|
+
// Get latest version of a package from npm registry
|
|
118
|
+
async function getLatestVersion(pkg) {
|
|
119
|
+
return new Promise((res) => {
|
|
120
|
+
const child = (0, child_process_1.spawn)('npm', ['view', pkg, 'version'], {
|
|
121
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
122
|
+
});
|
|
123
|
+
let out = '';
|
|
124
|
+
child.stdout.on('data', (d) => (out += d));
|
|
125
|
+
child.on('close', (c) => res(c === 0 ? out.trim() : null));
|
|
126
|
+
child.on('error', () => res(null));
|
|
184
127
|
});
|
|
185
128
|
}
|
|
186
|
-
// Resolve engine spec to a version to use, or null to use current Node
|
|
187
129
|
function resolveNodeVersion(spec) {
|
|
188
130
|
if (!spec)
|
|
189
131
|
return null;
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// If current node matches this major version, use current
|
|
194
|
-
if (semver_1.default.satisfies(currentVersion, `^${spec}`))
|
|
195
|
-
return null;
|
|
196
|
-
return spec;
|
|
197
|
-
}
|
|
198
|
-
// It's a semver range like ">=12 <15" or "^18.0.0"
|
|
132
|
+
const cur = process.version;
|
|
133
|
+
if (/^\d+$/.test(spec))
|
|
134
|
+
return semver_1.default.satisfies(cur, `^${spec}`) ? null : spec;
|
|
199
135
|
const range = semver_1.default.validRange(spec);
|
|
200
|
-
if (!range)
|
|
201
|
-
// Not a valid range, treat as literal version
|
|
136
|
+
if (!range)
|
|
202
137
|
return spec;
|
|
203
|
-
|
|
204
|
-
// If current Node satisfies the range, use it
|
|
205
|
-
if (semver_1.default.satisfies(currentVersion, range))
|
|
138
|
+
if (semver_1.default.satisfies(cur, range))
|
|
206
139
|
return null;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
140
|
+
const min = semver_1.default.minVersion(range);
|
|
141
|
+
return min ? semver_1.default.major(min).toString() : spec;
|
|
142
|
+
}
|
|
143
|
+
// Get target node major version for cache key
|
|
144
|
+
// Returns the major version string (e.g., "18") or undefined to use current
|
|
145
|
+
function getTargetNodeMajor(spec) {
|
|
146
|
+
if (!spec)
|
|
147
|
+
return undefined;
|
|
148
|
+
// Simple major version: "18" -> "18"
|
|
149
|
+
if (/^\d+$/.test(spec))
|
|
150
|
+
return spec;
|
|
151
|
+
// Semver range: ">=18" -> extract min version's major
|
|
152
|
+
const range = semver_1.default.validRange(spec);
|
|
153
|
+
if (range) {
|
|
154
|
+
const min = semver_1.default.minVersion(range);
|
|
155
|
+
if (min)
|
|
156
|
+
return semver_1.default.major(min).toString();
|
|
157
|
+
}
|
|
158
|
+
// Fallback: try to extract leading digits
|
|
159
|
+
const match = spec.match(/^(\d+)/);
|
|
160
|
+
return match ? match[1] : undefined;
|
|
213
161
|
}
|
|
214
162
|
async function exec(script, args, modules, nodeArgs, engines) {
|
|
215
|
-
const
|
|
216
|
-
const finalArgs = [...nodeArgs, ...scriptArgs];
|
|
163
|
+
const finalArgs = [...nodeArgs, ...(script ? [script, ...args] : args)];
|
|
217
164
|
const env = { ...process.env };
|
|
218
165
|
if (modules) {
|
|
219
|
-
env.NODE_PATH = env.NODE_PATH ?
|
|
166
|
+
env.NODE_PATH = modules + (env.NODE_PATH ? `:${env.NODE_PATH}` : '');
|
|
220
167
|
}
|
|
221
168
|
const ver = resolveNodeVersion(engines?.node);
|
|
169
|
+
const cmd = ver
|
|
170
|
+
? ['npx', ['-y', `node@${ver}`, ...finalArgs]]
|
|
171
|
+
: [process.execPath, finalArgs];
|
|
222
172
|
return new Promise((res, rej) => {
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
: (0, child_process_1.spawn)(process.execPath, finalArgs, { stdio: 'inherit', env });
|
|
173
|
+
const opts = { stdio: 'inherit', env };
|
|
174
|
+
const child = (0, child_process_1.spawn)(cmd[0], cmd[1], opts);
|
|
226
175
|
child.on('exit', (c) => res(c || 0));
|
|
227
176
|
child.on('error', rej);
|
|
228
177
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-runner.js","sourceRoot":"","sources":["../src/script-runner.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"script-runner.js","sourceRoot":"","sources":["../src/script-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nhx",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Node.js Hybrid eXecutor (a `uvx` inspired tool)",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"bin": "dist/cli.js",
|
|
7
7
|
"files": [
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"prepublishOnly": "npm run build && npm test",
|
|
12
12
|
"build": "rm -rf dist && tsc -b",
|
|
13
13
|
"postbuild": "chmod +x dist/cli.js",
|
|
14
|
+
"pretest": "npm run build",
|
|
14
15
|
"test": "node --import tsx --test",
|
|
15
16
|
"test:watch": "npm test -- --watch"
|
|
16
17
|
},
|
|
@@ -28,11 +29,9 @@
|
|
|
28
29
|
"dependencies": {
|
|
29
30
|
"chalk": "^5.3.0",
|
|
30
31
|
"json5": "^2.2.3",
|
|
31
|
-
"minimist": "^1.2.8",
|
|
32
32
|
"semver": "^7.7.3"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@types/minimist": "^1.2.5",
|
|
36
35
|
"@types/node": "^20.11.0",
|
|
37
36
|
"@types/semver": "^7.7.1",
|
|
38
37
|
"tsx": "^4.21.0",
|