@seanhogg/builderforce-webcontainers-core 2026.10.2 → 2026.10.3
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/dist/build.d.ts +42 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +65 -0
- package/dist/build.js.map +1 -0
- package/dist/buildHost.d.ts +31 -0
- package/dist/buildHost.d.ts.map +1 -0
- package/dist/buildHost.js +125 -0
- package/dist/buildHost.js.map +1 -0
- package/dist/buildHtml.d.ts +28 -0
- package/dist/buildHtml.d.ts.map +1 -0
- package/dist/buildHtml.js +74 -0
- package/dist/buildHtml.js.map +1 -0
- package/dist/bundler.d.ts +129 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +79 -0
- package/dist/bundler.js.map +1 -0
- package/dist/check/acquire.d.ts +46 -0
- package/dist/check/acquire.d.ts.map +1 -0
- package/dist/check/acquire.js +179 -0
- package/dist/check/acquire.js.map +1 -0
- package/dist/check/compilerHost.d.ts +22 -0
- package/dist/check/compilerHost.d.ts.map +1 -0
- package/dist/check/compilerHost.js +128 -0
- package/dist/check/compilerHost.js.map +1 -0
- package/dist/check/diagnostics.d.ts +23 -0
- package/dist/check/diagnostics.d.ts.map +1 -0
- package/dist/check/diagnostics.js +28 -0
- package/dist/check/diagnostics.js.map +1 -0
- package/dist/check/index.d.ts +19 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +13 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/projects.d.ts +26 -0
- package/dist/check/projects.d.ts.map +1 -0
- package/dist/check/projects.js +124 -0
- package/dist/check/projects.js.map +1 -0
- package/dist/check/shims.d.ts +29 -0
- package/dist/check/shims.d.ts.map +1 -0
- package/dist/check/shims.js +76 -0
- package/dist/check/shims.js.map +1 -0
- package/dist/check/typeStore.d.ts +57 -0
- package/dist/check/typeStore.d.ts.map +1 -0
- package/dist/check/typeStore.js +89 -0
- package/dist/check/typeStore.js.map +1 -0
- package/dist/check/typecheck.d.ts +29 -0
- package/dist/check/typecheck.d.ts.map +1 -0
- package/dist/check/typecheck.js +91 -0
- package/dist/check/typecheck.js.map +1 -0
- package/dist/compileComponent.d.ts +8 -0
- package/dist/compileComponent.d.ts.map +1 -0
- package/dist/compileComponent.js +22 -0
- package/dist/compileComponent.js.map +1 -0
- package/dist/compileScript.d.ts +19 -4
- package/dist/compileScript.d.ts.map +1 -1
- package/dist/compileScript.js +37 -12
- package/dist/compileScript.js.map +1 -1
- package/dist/components.d.ts +41 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +14 -0
- package/dist/components.js.map +1 -0
- package/dist/detectProject.d.ts +3 -0
- package/dist/detectProject.d.ts.map +1 -1
- package/dist/detectProject.js +16 -6
- package/dist/detectProject.js.map +1 -1
- package/dist/devServer.d.ts +5 -2
- package/dist/devServer.d.ts.map +1 -1
- package/dist/devServer.js +10 -6
- package/dist/devServer.js.map +1 -1
- package/dist/hash.d.ts +2 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +22 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +24 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/installer/bins.d.ts +24 -0
- package/dist/installer/bins.d.ts.map +1 -0
- package/dist/installer/bins.js +56 -0
- package/dist/installer/bins.js.map +1 -0
- package/dist/installer/index.d.ts +14 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +9 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/install.d.ts +46 -0
- package/dist/installer/install.d.ts.map +1 -0
- package/dist/installer/install.js +245 -0
- package/dist/installer/install.js.map +1 -0
- package/dist/installer/lockfile.d.ts +49 -0
- package/dist/installer/lockfile.d.ts.map +1 -0
- package/dist/installer/lockfile.js +110 -0
- package/dist/installer/lockfile.js.map +1 -0
- package/dist/installer/registry.d.ts +84 -0
- package/dist/installer/registry.d.ts.map +1 -0
- package/dist/installer/registry.js +130 -0
- package/dist/installer/registry.js.map +1 -0
- package/dist/installer/semver.d.ts +38 -0
- package/dist/installer/semver.d.ts.map +1 -0
- package/dist/installer/semver.js +187 -0
- package/dist/installer/semver.js.map +1 -0
- package/dist/installer/spec.d.ts +30 -0
- package/dist/installer/spec.d.ts.map +1 -0
- package/dist/installer/spec.js +30 -0
- package/dist/installer/spec.js.map +1 -0
- package/dist/installer/tar.d.ts +17 -0
- package/dist/installer/tar.d.ts.map +1 -0
- package/dist/installer/tar.js +150 -0
- package/dist/installer/tar.js.map +1 -0
- package/dist/installer/tree.d.ts +48 -0
- package/dist/installer/tree.d.ts.map +1 -0
- package/dist/installer/tree.js +179 -0
- package/dist/installer/tree.js.map +1 -0
- package/dist/node/assert.d.ts +15 -0
- package/dist/node/assert.d.ts.map +1 -0
- package/dist/node/assert.js +137 -0
- package/dist/node/assert.js.map +1 -0
- package/dist/node/buffer.d.ts +84 -0
- package/dist/node/buffer.d.ts.map +1 -0
- package/dist/node/buffer.js +304 -0
- package/dist/node/buffer.js.map +1 -0
- package/dist/node/builtins.d.ts +25 -0
- package/dist/node/builtins.d.ts.map +1 -0
- package/dist/node/builtins.js +101 -0
- package/dist/node/builtins.js.map +1 -0
- package/dist/node/callable.d.ts +13 -0
- package/dist/node/callable.d.ts.map +1 -0
- package/dist/node/callable.js +26 -0
- package/dist/node/callable.js.map +1 -0
- package/dist/node/childProcess.d.ts +13 -0
- package/dist/node/childProcess.d.ts.map +1 -0
- package/dist/node/childProcess.js +143 -0
- package/dist/node/childProcess.js.map +1 -0
- package/dist/node/crypto.d.ts +3 -0
- package/dist/node/crypto.d.ts.map +1 -0
- package/dist/node/crypto.js +180 -0
- package/dist/node/crypto.js.map +1 -0
- package/dist/node/esm.d.ts +9 -0
- package/dist/node/esm.d.ts.map +1 -0
- package/dist/node/esm.js +202 -0
- package/dist/node/esm.js.map +1 -0
- package/dist/node/events.d.ts +40 -0
- package/dist/node/events.d.ts.map +1 -0
- package/dist/node/events.js +160 -0
- package/dist/node/events.js.map +1 -0
- package/dist/node/fs/index.d.ts +7 -0
- package/dist/node/fs/index.d.ts.map +1 -0
- package/dist/node/fs/index.js +270 -0
- package/dist/node/fs/index.js.map +1 -0
- package/dist/node/fs/stats.d.ts +93 -0
- package/dist/node/fs/stats.d.ts.map +1 -0
- package/dist/node/fs/stats.js +104 -0
- package/dist/node/fs/stats.js.map +1 -0
- package/dist/node/fs/sync.d.ts +98 -0
- package/dist/node/fs/sync.d.ts.map +1 -0
- package/dist/node/fs/sync.js +348 -0
- package/dist/node/fs/sync.js.map +1 -0
- package/dist/node/hashes.d.ts +15 -0
- package/dist/node/hashes.d.ts.map +1 -0
- package/dist/node/hashes.js +195 -0
- package/dist/node/hashes.js.map +1 -0
- package/dist/node/http/client.d.ts +35 -0
- package/dist/node/http/client.d.ts.map +1 -0
- package/dist/node/http/client.js +161 -0
- package/dist/node/http/client.js.map +1 -0
- package/dist/node/http/index.d.ts +5 -0
- package/dist/node/http/index.d.ts.map +1 -0
- package/dist/node/http/index.js +125 -0
- package/dist/node/http/index.js.map +1 -0
- package/dist/node/http/server.d.ts +135 -0
- package/dist/node/http/server.d.ts.map +1 -0
- package/dist/node/http/server.js +308 -0
- package/dist/node/http/server.js.map +1 -0
- package/dist/node/http/status.d.ts +3 -0
- package/dist/node/http/status.d.ts.map +1 -0
- package/dist/node/http/status.js +13 -0
- package/dist/node/http/status.js.map +1 -0
- package/dist/node/inspect.d.ts +22 -0
- package/dist/node/inspect.d.ts.map +1 -0
- package/dist/node/inspect.js +172 -0
- package/dist/node/inspect.js.map +1 -0
- package/dist/node/loader.d.ts +91 -0
- package/dist/node/loader.d.ts.map +1 -0
- package/dist/node/loader.js +265 -0
- package/dist/node/loader.js.map +1 -0
- package/dist/node/loop.d.ts +71 -0
- package/dist/node/loop.d.ts.map +1 -0
- package/dist/node/loop.js +189 -0
- package/dist/node/loop.js.map +1 -0
- package/dist/node/misc.d.ts +10 -0
- package/dist/node/misc.d.ts.map +1 -0
- package/dist/node/misc.js +256 -0
- package/dist/node/misc.js.map +1 -0
- package/dist/node/path.d.ts +14 -0
- package/dist/node/path.d.ts.map +1 -0
- package/dist/node/path.js +128 -0
- package/dist/node/path.js.map +1 -0
- package/dist/node/process.d.ts +31 -0
- package/dist/node/process.d.ts.map +1 -0
- package/dist/node/process.js +309 -0
- package/dist/node/process.js.map +1 -0
- package/dist/node/program.d.ts +19 -0
- package/dist/node/program.d.ts.map +1 -0
- package/dist/node/program.js +165 -0
- package/dist/node/program.js.map +1 -0
- package/dist/node/readline.d.ts +2 -0
- package/dist/node/readline.d.ts.map +1 -0
- package/dist/node/readline.js +155 -0
- package/dist/node/readline.js.map +1 -0
- package/dist/node/resolve.d.ts +45 -0
- package/dist/node/resolve.d.ts.map +1 -0
- package/dist/node/resolve.js +206 -0
- package/dist/node/resolve.js.map +1 -0
- package/dist/node/runtime.d.ts +40 -0
- package/dist/node/runtime.d.ts.map +1 -0
- package/dist/node/runtime.js +149 -0
- package/dist/node/runtime.js.map +1 -0
- package/dist/node/stream/index.d.ts +52 -0
- package/dist/node/stream/index.d.ts.map +1 -0
- package/dist/node/stream/index.js +184 -0
- package/dist/node/stream/index.js.map +1 -0
- package/dist/node/stream/readable.d.ts +83 -0
- package/dist/node/stream/readable.d.ts.map +1 -0
- package/dist/node/stream/readable.js +325 -0
- package/dist/node/stream/readable.js.map +1 -0
- package/dist/node/stream/writable.d.ts +80 -0
- package/dist/node/stream/writable.d.ts.map +1 -0
- package/dist/node/stream/writable.js +224 -0
- package/dist/node/stream/writable.js.map +1 -0
- package/dist/node/urlqs.d.ts +22 -0
- package/dist/node/urlqs.d.ts.map +1 -0
- package/dist/node/urlqs.js +165 -0
- package/dist/node/urlqs.js.map +1 -0
- package/dist/node/util.d.ts +37 -0
- package/dist/node/util.d.ts.map +1 -0
- package/dist/node/util.js +160 -0
- package/dist/node/util.js.map +1 -0
- package/dist/node/zlib.d.ts +2 -0
- package/dist/node/zlib.d.ts.map +1 -0
- package/dist/node/zlib.js +133 -0
- package/dist/node/zlib.js.map +1 -0
- package/dist/packageCdn.d.ts +12 -0
- package/dist/packageCdn.d.ts.map +1 -1
- package/dist/packageCdn.js +3 -1
- package/dist/packageCdn.js.map +1 -1
- package/dist/projectConfig.d.ts +6 -2
- package/dist/projectConfig.d.ts.map +1 -1
- package/dist/projectConfig.js +32 -8
- package/dist/projectConfig.js.map +1 -1
- package/dist/shell/builtins.d.ts +23 -0
- package/dist/shell/builtins.d.ts.map +1 -0
- package/dist/shell/builtins.js +131 -0
- package/dist/shell/builtins.js.map +1 -0
- package/dist/shell/context.d.ts +41 -0
- package/dist/shell/context.d.ts.map +1 -0
- package/dist/shell/context.js +65 -0
- package/dist/shell/context.js.map +1 -0
- package/dist/shell/devHandoff.d.ts +18 -0
- package/dist/shell/devHandoff.d.ts.map +1 -0
- package/dist/shell/devHandoff.js +36 -0
- package/dist/shell/devHandoff.js.map +1 -0
- package/dist/shell/exec.d.ts +67 -0
- package/dist/shell/exec.d.ts.map +1 -0
- package/dist/shell/exec.js +247 -0
- package/dist/shell/exec.js.map +1 -0
- package/dist/shell/expand.d.ts +28 -0
- package/dist/shell/expand.d.ts.map +1 -0
- package/dist/shell/expand.js +149 -0
- package/dist/shell/expand.js.map +1 -0
- package/dist/shell/fileCommands.d.ts +10 -0
- package/dist/shell/fileCommands.d.ts.map +1 -0
- package/dist/shell/fileCommands.js +208 -0
- package/dist/shell/fileCommands.js.map +1 -0
- package/dist/shell/lineEditor.d.ts +43 -0
- package/dist/shell/lineEditor.d.ts.map +1 -0
- package/dist/shell/lineEditor.js +234 -0
- package/dist/shell/lineEditor.js.map +1 -0
- package/dist/shell/npm.d.ts +6 -0
- package/dist/shell/npm.d.ts.map +1 -0
- package/dist/shell/npm.js +234 -0
- package/dist/shell/npm.js.map +1 -0
- package/dist/shell/parse.d.ts +73 -0
- package/dist/shell/parse.d.ts.map +1 -0
- package/dist/shell/parse.js +300 -0
- package/dist/shell/parse.js.map +1 -0
- package/dist/shell/program.d.ts +12 -0
- package/dist/shell/program.d.ts.map +1 -0
- package/dist/shell/program.js +219 -0
- package/dist/shell/program.js.map +1 -0
- package/dist/shell/textCommands.d.ts +15 -0
- package/dist/shell/textCommands.d.ts.map +1 -0
- package/dist/shell/textCommands.js +185 -0
- package/dist/shell/textCommands.js.map +1 -0
- package/dist/styleModules.d.ts +6 -0
- package/dist/styleModules.d.ts.map +1 -1
- package/dist/styleModules.js +14 -4
- package/dist/styleModules.js.map +1 -1
- package/dist/svelteCompiler.d.ts +28 -0
- package/dist/svelteCompiler.d.ts.map +1 -0
- package/dist/svelteCompiler.js +13 -0
- package/dist/svelteCompiler.js.map +1 -0
- package/dist/system/commands.d.ts +26 -0
- package/dist/system/commands.d.ts.map +1 -0
- package/dist/system/commands.js +53 -0
- package/dist/system/commands.js.map +1 -0
- package/dist/system/index.d.ts +23 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/system/index.js +16 -0
- package/dist/system/index.js.map +1 -0
- package/dist/system/kernel.d.ts +54 -0
- package/dist/system/kernel.d.ts.map +1 -0
- package/dist/system/kernel.js +81 -0
- package/dist/system/kernel.js.map +1 -0
- package/dist/system/ports.d.ts +32 -0
- package/dist/system/ports.d.ts.map +1 -0
- package/dist/system/ports.js +57 -0
- package/dist/system/ports.js.map +1 -0
- package/dist/system/process.d.ts +32 -0
- package/dist/system/process.d.ts.map +1 -0
- package/dist/system/process.js +130 -0
- package/dist/system/process.js.map +1 -0
- package/dist/system/programs.d.ts +10 -0
- package/dist/system/programs.d.ts.map +1 -0
- package/dist/system/programs.js +22 -0
- package/dist/system/programs.js.map +1 -0
- package/dist/system/terminal.d.ts +45 -0
- package/dist/system/terminal.d.ts.map +1 -0
- package/dist/system/terminal.js +127 -0
- package/dist/system/terminal.js.map +1 -0
- package/dist/system/types.d.ts +100 -0
- package/dist/system/types.d.ts.map +1 -0
- package/dist/system/types.js +2 -0
- package/dist/system/types.js.map +1 -0
- package/dist/vfs.d.ts +28 -4
- package/dist/vfs.d.ts.map +1 -1
- package/dist/vfs.js +95 -32
- package/dist/vfs.js.map +1 -1
- package/dist/vueCompiler.d.ts +75 -0
- package/dist/vueCompiler.d.ts.map +1 -0
- package/dist/vueCompiler.js +67 -0
- package/dist/vueCompiler.js.map +1 -0
- package/package.json +18 -2
- package/src/build.ts +105 -0
- package/src/buildHost.ts +154 -0
- package/src/buildHtml.ts +101 -0
- package/src/bundler.ts +190 -0
- package/src/check/acquire.ts +212 -0
- package/src/check/compilerHost.ts +138 -0
- package/src/check/diagnostics.ts +48 -0
- package/src/check/index.ts +28 -0
- package/src/check/projects.ts +149 -0
- package/src/check/shims.ts +88 -0
- package/src/check/typeStore.ts +103 -0
- package/src/check/typecheck.ts +134 -0
- package/src/compileComponent.ts +21 -0
- package/src/compileScript.ts +42 -13
- package/src/components.ts +59 -0
- package/src/detectProject.ts +18 -6
- package/src/devServer.ts +13 -8
- package/src/hash.ts +22 -0
- package/src/index.ts +35 -6
- package/src/installer/bins.ts +64 -0
- package/src/installer/index.ts +13 -0
- package/src/installer/install.ts +275 -0
- package/src/installer/lockfile.ts +146 -0
- package/src/installer/registry.ts +175 -0
- package/src/installer/semver.ts +190 -0
- package/src/installer/spec.ts +53 -0
- package/src/installer/tar.ts +155 -0
- package/src/installer/tree.ts +236 -0
- package/src/node/assert.ts +127 -0
- package/src/node/buffer.ts +304 -0
- package/src/node/builtins.ts +123 -0
- package/src/node/callable.ts +25 -0
- package/src/node/childProcess.ts +164 -0
- package/src/node/crypto.ts +187 -0
- package/src/node/esm.ts +196 -0
- package/src/node/events.ts +176 -0
- package/src/node/fs/index.ts +277 -0
- package/src/node/fs/stats.ts +110 -0
- package/src/node/fs/sync.ts +335 -0
- package/src/node/hashes.ts +171 -0
- package/src/node/http/client.ts +173 -0
- package/src/node/http/index.ts +122 -0
- package/src/node/http/server.ts +308 -0
- package/src/node/http/status.ts +13 -0
- package/src/node/inspect.ts +166 -0
- package/src/node/loader.ts +293 -0
- package/src/node/loop.ts +193 -0
- package/src/node/misc.ts +250 -0
- package/src/node/path.ts +135 -0
- package/src/node/process.ts +324 -0
- package/src/node/program.ts +170 -0
- package/src/node/readline.ts +157 -0
- package/src/node/resolve.ts +216 -0
- package/src/node/runtime.ts +184 -0
- package/src/node/stream/index.ts +196 -0
- package/src/node/stream/readable.ts +345 -0
- package/src/node/stream/writable.ts +244 -0
- package/src/node/urlqs.ts +162 -0
- package/src/node/util.ts +145 -0
- package/src/node/zlib.ts +145 -0
- package/src/packageCdn.ts +11 -1
- package/src/projectConfig.ts +34 -7
- package/src/shell/builtins.ts +141 -0
- package/src/shell/context.ts +89 -0
- package/src/shell/devHandoff.ts +49 -0
- package/src/shell/exec.ts +268 -0
- package/src/shell/expand.ts +145 -0
- package/src/shell/fileCommands.ts +206 -0
- package/src/shell/lineEditor.ts +233 -0
- package/src/shell/npm.ts +229 -0
- package/src/shell/parse.ts +295 -0
- package/src/shell/program.ts +223 -0
- package/src/shell/textCommands.ts +177 -0
- package/src/styleModules.ts +15 -4
- package/src/svelteCompiler.ts +31 -0
- package/src/system/commands.ts +72 -0
- package/src/system/index.ts +22 -0
- package/src/system/kernel.ts +106 -0
- package/src/system/ports.ts +73 -0
- package/src/system/process.ts +158 -0
- package/src/system/programs.ts +31 -0
- package/src/system/terminal.ts +135 -0
- package/src/system/types.ts +103 -0
- package/src/vfs.ts +92 -28
- package/src/vueCompiler.ts +121 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { dirname, join, normalizePath } from '../paths.js';
|
|
2
|
+
const MARKER = '// @bfwc-bin ';
|
|
3
|
+
/** `bin` as a name → relative-path map (a string `bin` is named after the package). */
|
|
4
|
+
export function normalizeBin(packageName, bin) {
|
|
5
|
+
if (!bin)
|
|
6
|
+
return {};
|
|
7
|
+
const entries = typeof bin === 'string' ? [[packageName.replace(/^@[^/]+\//, ''), bin]] : Object.entries(bin);
|
|
8
|
+
const out = {};
|
|
9
|
+
for (const [name, target] of entries) {
|
|
10
|
+
const clean = name.replace(/^@[^/]+\//, '');
|
|
11
|
+
if (!clean || /[/\\]/.test(clean) || clean === '.' || clean === '..' || typeof target !== 'string')
|
|
12
|
+
continue;
|
|
13
|
+
out[clean] = target.replace(/^\.\//, '');
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
export function binShim(relativeTarget) {
|
|
18
|
+
return `#!/usr/bin/env node\n${MARKER}${relativeTarget}\nrequire(${JSON.stringify(relativeTarget)});\n`;
|
|
19
|
+
}
|
|
20
|
+
/** The absolute target of a `.bin` shim, or undefined when `path` is not one. */
|
|
21
|
+
export function readBinLink(fs, path) {
|
|
22
|
+
const text = fs.readText(path);
|
|
23
|
+
if (!text)
|
|
24
|
+
return undefined;
|
|
25
|
+
const line = text.split('\n').find((l) => l.startsWith(MARKER));
|
|
26
|
+
return line ? join(dirname(normalizePath(path)), line.slice(MARKER.length).trim()) : undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Write `<dir>/node_modules/.bin/<name>` shims for the packages in `packageDirs`
|
|
30
|
+
* (absolute package directories that share that node_modules).
|
|
31
|
+
*/
|
|
32
|
+
export function linkBins(fs, binDir, packages) {
|
|
33
|
+
const linked = {};
|
|
34
|
+
for (const pkg of packages) {
|
|
35
|
+
for (const [name, target] of Object.entries(normalizeBin(pkg.name, pkg.bin))) {
|
|
36
|
+
const absolute = join(pkg.dir, target);
|
|
37
|
+
if (!fs.isFile(absolute))
|
|
38
|
+
continue;
|
|
39
|
+
const relative = relativePath(binDir, absolute);
|
|
40
|
+
fs.writeFile(join(binDir, name), binShim(relative));
|
|
41
|
+
linked[name] = absolute;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return linked;
|
|
45
|
+
}
|
|
46
|
+
export function relativePath(fromDir, to) {
|
|
47
|
+
const a = normalizePath(fromDir).split('/').filter(Boolean);
|
|
48
|
+
const b = normalizePath(to).split('/').filter(Boolean);
|
|
49
|
+
let i = 0;
|
|
50
|
+
while (i < a.length && i < b.length && a[i] === b[i])
|
|
51
|
+
i++;
|
|
52
|
+
const up = a.slice(i).map(() => '..');
|
|
53
|
+
const rel = [...up, ...b.slice(i)].join('/');
|
|
54
|
+
return rel.startsWith('..') ? rel : `./${rel}`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=bins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bins.js","sourceRoot":"","sources":["../../src/installer/bins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { installPackages, chooseVersion } from './install.js';
|
|
2
|
+
export type { InstallOptions, InstallResult, InstallProgress } from './install.js';
|
|
3
|
+
export { RegistryClient, createMemoryCache, verifyIntegrity, DEFAULT_REGISTRY } from './registry.js';
|
|
4
|
+
export type { FetchLike, PackageCache, PackageManifest, Packument, RegistryOptions, BinField } from './registry.js';
|
|
5
|
+
export { resolveTree, childLocation, parentLocation, PLATFORM } from './tree.js';
|
|
6
|
+
export type { ResolvedPackage, ResolveTreeOptions } from './tree.js';
|
|
7
|
+
export { parseLockfile, buildLockfile, lockMatchesPackage } from './lockfile.js';
|
|
8
|
+
export type { Lockfile, LockEntry } from './lockfile.js';
|
|
9
|
+
export { parseInstallSpec, parseDependency } from './spec.js';
|
|
10
|
+
export type { ParsedSpec, PackageJson } from './spec.js';
|
|
11
|
+
export { normalizeBin, readBinLink, binShim, linkBins } from './bins.js';
|
|
12
|
+
export { untar, tar } from './tar.js';
|
|
13
|
+
export * as semver from './semver.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrG,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACjF,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { installPackages, chooseVersion } from './install.js';
|
|
2
|
+
export { RegistryClient, createMemoryCache, verifyIntegrity, DEFAULT_REGISTRY } from './registry.js';
|
|
3
|
+
export { resolveTree, childLocation, parentLocation, PLATFORM } from './tree.js';
|
|
4
|
+
export { parseLockfile, buildLockfile, lockMatchesPackage } from './lockfile.js';
|
|
5
|
+
export { parseInstallSpec, parseDependency } from './spec.js';
|
|
6
|
+
export { normalizeBin, readBinLink, binShim, linkBins } from './bins.js';
|
|
7
|
+
export { untar, tar } from './tar.js';
|
|
8
|
+
export * as semver from './semver.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { VirtualFileSystem } from '../vfs.js';
|
|
2
|
+
import { type FetchLike, type PackageCache, type Packument } from './registry.js';
|
|
3
|
+
import { type Lockfile } from './lockfile.js';
|
|
4
|
+
export interface InstallProgress {
|
|
5
|
+
phase: 'resolve' | 'fetch' | 'done';
|
|
6
|
+
/** `name@version` being worked on. */
|
|
7
|
+
package?: string;
|
|
8
|
+
done: number;
|
|
9
|
+
total: number;
|
|
10
|
+
}
|
|
11
|
+
export interface InstallOptions {
|
|
12
|
+
fs: VirtualFileSystem;
|
|
13
|
+
fetch: FetchLike;
|
|
14
|
+
registry?: string;
|
|
15
|
+
cache?: PackageCache;
|
|
16
|
+
/** The project directory holding package.json. Default `/`. */
|
|
17
|
+
cwd?: string;
|
|
18
|
+
/** Specs to add first, as `npm install <spec…>` does (`react`, `zod@^3`, `@scope/x@next`). */
|
|
19
|
+
add?: string[];
|
|
20
|
+
/** Save added specs to devDependencies. */
|
|
21
|
+
saveDev?: boolean;
|
|
22
|
+
/** `npm ci`: install exactly what the lockfile says; fail when it is missing or stale. */
|
|
23
|
+
ci?: boolean;
|
|
24
|
+
/** Leave devDependencies out. */
|
|
25
|
+
production?: boolean;
|
|
26
|
+
/** Parallel downloads. Default 8. */
|
|
27
|
+
concurrency?: number;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
onProgress?(progress: InstallProgress): void;
|
|
30
|
+
}
|
|
31
|
+
export interface InstallResult {
|
|
32
|
+
/** Packages unpacked this run. */
|
|
33
|
+
added: number;
|
|
34
|
+
/** Packages removed (no longer in the tree, or replaced by another version). */
|
|
35
|
+
removed: number;
|
|
36
|
+
/** Packages in the tree. */
|
|
37
|
+
total: number;
|
|
38
|
+
/** Top-level bins: name → absolute path of the script. */
|
|
39
|
+
bins: Record<string, string>;
|
|
40
|
+
lockfile: Lockfile;
|
|
41
|
+
warnings: string[];
|
|
42
|
+
}
|
|
43
|
+
/** Highest version allowed by `range` (or a dist-tag), preferring `latest` as npm does. */
|
|
44
|
+
export declare function chooseVersion(packument: Packument, range: string): string;
|
|
45
|
+
export declare function installPackages(options: InstallOptions): Promise<InstallResult>;
|
|
46
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAwB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAGxH,OAAO,EAAiF,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK7H,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,iBAAiB,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAiBD,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAazE;AA6DD,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuFrF"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `npm install` into the virtual file system: read package.json, resolve the
|
|
3
|
+
* tree (lockfile first, registry second), prune what is no longer wanted, unpack
|
|
4
|
+
* what is missing, link `.bin`, write package-lock.json.
|
|
5
|
+
*
|
|
6
|
+
* Install scripts (`preinstall`/`install`/`postinstall`) are NOT run. Nearly all
|
|
7
|
+
* of them compile native addons (node-gyp) or download platform binaries, neither
|
|
8
|
+
* of which can work in a browser; running the rest would mean executing arbitrary
|
|
9
|
+
* package code at install time for little gain. Packages that declare them are
|
|
10
|
+
* reported in `warnings`.
|
|
11
|
+
*/
|
|
12
|
+
import { gunzipSync } from 'fflate';
|
|
13
|
+
import { join } from '../paths.js';
|
|
14
|
+
import { RegistryClient } from './registry.js';
|
|
15
|
+
import { parseInstallSpec, sortObject } from './spec.js';
|
|
16
|
+
import { childLocation, parentLocation, resolveTree } from './tree.js';
|
|
17
|
+
import { buildLockfile, lockMatchesPackage, lockedManifests, parseLockfile, pickLocked } from './lockfile.js';
|
|
18
|
+
import { maxSatisfying, satisfies, validRange, valid } from './semver.js';
|
|
19
|
+
import { untar } from './tar.js';
|
|
20
|
+
import { linkBins } from './bins.js';
|
|
21
|
+
const fatalDecoder = new TextDecoder('utf-8', { fatal: true });
|
|
22
|
+
const BINARY_EXT = /\.(?:png|jpe?g|gif|webp|ico|bmp|wasm|node|gz|tgz|zip|br|woff2?|ttf|otf|eot|pdf|mp[34]|webm|ogg|wav|bin|dat)$/i;
|
|
23
|
+
/** Store text as strings (what the module loader reads), binaries as bytes. */
|
|
24
|
+
function decodeIfText(path, data) {
|
|
25
|
+
if (BINARY_EXT.test(path))
|
|
26
|
+
return data.slice();
|
|
27
|
+
const head = data.subarray(0, 8000);
|
|
28
|
+
if (head.includes(0))
|
|
29
|
+
return data.slice();
|
|
30
|
+
try {
|
|
31
|
+
return fatalDecoder.decode(data);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return data.slice();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Highest version allowed by `range` (or a dist-tag), preferring `latest` as npm does. */
|
|
38
|
+
export function chooseVersion(packument, range) {
|
|
39
|
+
const tags = packument['dist-tags'] ?? {};
|
|
40
|
+
const r = range || '*';
|
|
41
|
+
if (!validRange(r)) {
|
|
42
|
+
const tagged = tags[r];
|
|
43
|
+
if (tagged && packument.versions[tagged])
|
|
44
|
+
return tagged;
|
|
45
|
+
throw new Error(`No version of ${packument.name} is tagged "${range}".`);
|
|
46
|
+
}
|
|
47
|
+
const latest = tags.latest;
|
|
48
|
+
if (latest && packument.versions[latest] && satisfies(latest, r))
|
|
49
|
+
return latest;
|
|
50
|
+
const best = maxSatisfying(Object.keys(packument.versions), r);
|
|
51
|
+
if (!best)
|
|
52
|
+
throw new Error(`No matching version found for ${packument.name}@${range}.`);
|
|
53
|
+
return best;
|
|
54
|
+
}
|
|
55
|
+
async function pool(items, size, run) {
|
|
56
|
+
let next = 0;
|
|
57
|
+
const workers = Array.from({ length: Math.min(size, items.length) }, async () => {
|
|
58
|
+
while (next < items.length)
|
|
59
|
+
await run(items[next++]);
|
|
60
|
+
});
|
|
61
|
+
await Promise.all(workers);
|
|
62
|
+
}
|
|
63
|
+
function readJson(fs, path) {
|
|
64
|
+
try {
|
|
65
|
+
const text = fs.readText(path);
|
|
66
|
+
return text === undefined ? undefined : JSON.parse(text);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const writeJson = (fs, path, value) => fs.writeFile(path, JSON.stringify(value, null, 2) + '\n');
|
|
73
|
+
/** What is on disk now: location → `name@version`. */
|
|
74
|
+
function installedPackages(fs, base) {
|
|
75
|
+
const out = new Map();
|
|
76
|
+
const walk = (loc) => {
|
|
77
|
+
const nm = join(base, loc, 'node_modules');
|
|
78
|
+
const names = [];
|
|
79
|
+
for (const entry of fs.readdir(nm)) {
|
|
80
|
+
if (entry.startsWith('.'))
|
|
81
|
+
continue;
|
|
82
|
+
if (entry.startsWith('@'))
|
|
83
|
+
for (const sub of fs.readdir(join(nm, entry)))
|
|
84
|
+
names.push(`${entry}/${sub}`);
|
|
85
|
+
else
|
|
86
|
+
names.push(entry);
|
|
87
|
+
}
|
|
88
|
+
for (const name of names) {
|
|
89
|
+
const at = childLocation(loc, name);
|
|
90
|
+
const pkg = readJson(fs, join(base, at, 'package.json'));
|
|
91
|
+
out.set(at, `${pkg?.name ?? ''}@${pkg?.version ?? ''}`);
|
|
92
|
+
walk(at);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
walk('');
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
async function addSpecs(client, pkg, specs, dev) {
|
|
99
|
+
const save = dev ? 'devDependencies' : 'dependencies';
|
|
100
|
+
const other = dev ? 'dependencies' : 'devDependencies';
|
|
101
|
+
for (const raw of specs) {
|
|
102
|
+
const spec = parseInstallSpec(raw);
|
|
103
|
+
let saved = spec.range;
|
|
104
|
+
if (!saved || !validRange(saved))
|
|
105
|
+
saved = `^${chooseVersion(await client.packument(spec.registryName), saved || 'latest')}`;
|
|
106
|
+
else if (valid(saved))
|
|
107
|
+
saved = `^${valid(saved)}`;
|
|
108
|
+
if (spec.registryName !== spec.name)
|
|
109
|
+
saved = `npm:${spec.registryName}@${saved}`;
|
|
110
|
+
pkg[save] = sortObject({ ...(pkg[save] ?? {}), [spec.name]: saved });
|
|
111
|
+
if (pkg[other]?.[spec.name]) {
|
|
112
|
+
const rest = { ...pkg[other] };
|
|
113
|
+
delete rest[spec.name];
|
|
114
|
+
pkg[other] = rest;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export async function installPackages(options) {
|
|
119
|
+
const { fs, signal } = options;
|
|
120
|
+
const base = join('/', options.cwd ?? '/');
|
|
121
|
+
const pkgPath = join(base, 'package.json');
|
|
122
|
+
const lockPath = join(base, 'package-lock.json');
|
|
123
|
+
const warnings = [];
|
|
124
|
+
const client = new RegistryClient({ fetch: options.fetch, registry: options.registry, cache: options.cache, signal });
|
|
125
|
+
const progress = (p) => options.onProgress?.(p);
|
|
126
|
+
let pkg = readJson(fs, pkgPath);
|
|
127
|
+
if (!pkg) {
|
|
128
|
+
if (fs.isFile(pkgPath))
|
|
129
|
+
throw new Error(`${pkgPath} is not valid JSON.`);
|
|
130
|
+
if (!options.add?.length)
|
|
131
|
+
throw new Error(`No package.json in ${base}.`);
|
|
132
|
+
pkg = {};
|
|
133
|
+
}
|
|
134
|
+
if (options.add?.length) {
|
|
135
|
+
await addSpecs(client, pkg, options.add, options.saveDev ?? false);
|
|
136
|
+
writeJson(fs, pkgPath, pkg);
|
|
137
|
+
}
|
|
138
|
+
const lock = parseLockfile(fs.readText(lockPath));
|
|
139
|
+
if (options.ci) {
|
|
140
|
+
if (!lock)
|
|
141
|
+
throw new Error('npm ci needs a package-lock.json (lockfileVersion 2 or 3).');
|
|
142
|
+
if (!lockMatchesPackage(lock, pkg))
|
|
143
|
+
throw new Error('package.json and package-lock.json are out of sync. Run npm install to update the lockfile.');
|
|
144
|
+
fs.rm(join(base, 'node_modules'));
|
|
145
|
+
}
|
|
146
|
+
const locked = lockedManifests(lock);
|
|
147
|
+
const picks = new Map();
|
|
148
|
+
const pick = (spec) => {
|
|
149
|
+
const key = `${spec.registryName}@${spec.range}`;
|
|
150
|
+
let pending = picks.get(key);
|
|
151
|
+
if (!pending) {
|
|
152
|
+
const hit = pickLocked(locked, spec.registryName, spec.range);
|
|
153
|
+
if (hit)
|
|
154
|
+
pending = Promise.resolve(hit);
|
|
155
|
+
else if (options.ci)
|
|
156
|
+
pending = Promise.reject(new Error(`${key} is missing from package-lock.json. Run npm install to update it.`));
|
|
157
|
+
else
|
|
158
|
+
pending = client.packument(spec.registryName).then((p) => {
|
|
159
|
+
const manifest = p.versions[chooseVersion(p, spec.range)];
|
|
160
|
+
return { ...manifest, name: manifest.name ?? spec.registryName };
|
|
161
|
+
});
|
|
162
|
+
pending.catch(() => undefined); // observed by whoever awaits it
|
|
163
|
+
picks.set(key, pending);
|
|
164
|
+
}
|
|
165
|
+
return pending;
|
|
166
|
+
};
|
|
167
|
+
let resolved = 0;
|
|
168
|
+
const tree = await resolveTree({
|
|
169
|
+
root: pkg,
|
|
170
|
+
pick,
|
|
171
|
+
prefetch: (spec) => void (pickLocked(locked, spec.registryName, spec.range) || options.ci || client.packument(spec.registryName).catch(() => undefined)),
|
|
172
|
+
production: options.production,
|
|
173
|
+
warn: (message) => warnings.push(message),
|
|
174
|
+
onResolved: ({ name, version }) => progress({ phase: 'resolve', package: `${name}@${version}`, done: ++resolved, total: resolved }),
|
|
175
|
+
});
|
|
176
|
+
signal?.throwIfAborted();
|
|
177
|
+
// Prune: anything not in the tree, or there at another version, goes (shallow first).
|
|
178
|
+
let removed = 0;
|
|
179
|
+
for (const [location, id] of [...installedPackages(fs, base)].sort(([a], [b]) => a.length - b.length)) {
|
|
180
|
+
const dir = join(base, location);
|
|
181
|
+
if (!fs.exists(dir))
|
|
182
|
+
continue; // went with an enclosing package
|
|
183
|
+
const want = tree.get(location);
|
|
184
|
+
if (!want || id !== `${want.manifest.name}@${want.manifest.version}`) {
|
|
185
|
+
fs.rm(dir);
|
|
186
|
+
removed++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const missing = [...tree.values()].filter((node) => !fs.isFile(join(base, node.location, 'package.json')));
|
|
190
|
+
let fetched = 0;
|
|
191
|
+
await pool(missing, options.concurrency ?? 8, async (node) => {
|
|
192
|
+
signal?.throwIfAborted();
|
|
193
|
+
await unpack(fs, join(base, node.location), await client.tarball(node.manifest));
|
|
194
|
+
progress({ phase: 'fetch', package: `${node.name}@${node.manifest.version}`, done: ++fetched, total: missing.length });
|
|
195
|
+
});
|
|
196
|
+
for (const node of tree.values()) {
|
|
197
|
+
if (node.manifest.hasInstallScript)
|
|
198
|
+
warnings.push(`skipped install scripts of ${node.name}@${node.manifest.version} (they cannot run in the browser)`);
|
|
199
|
+
if (node.manifest.deprecated)
|
|
200
|
+
warnings.push(`deprecated ${node.name}@${node.manifest.version}: ${node.manifest.deprecated}`);
|
|
201
|
+
}
|
|
202
|
+
const bins = relinkBins(fs, base, tree);
|
|
203
|
+
const lockfile = buildLockfile(pkg, tree);
|
|
204
|
+
writeJson(fs, lockPath, lockfile);
|
|
205
|
+
progress({ phase: 'done', done: tree.size, total: tree.size });
|
|
206
|
+
return { added: missing.length, removed, total: tree.size, bins, lockfile, warnings };
|
|
207
|
+
}
|
|
208
|
+
/** gunzip + untar into `dir`, stripping the archive's top folder (`package/`). */
|
|
209
|
+
async function unpack(fs, dir, tgz) {
|
|
210
|
+
const entries = untar(gunzipSync(tgz));
|
|
211
|
+
let manifest;
|
|
212
|
+
for (const entry of entries) {
|
|
213
|
+
if (entry.type !== 'file')
|
|
214
|
+
continue;
|
|
215
|
+
const relative = entry.path.split('/').slice(1).join('/');
|
|
216
|
+
if (!relative || relative.split('/').includes('..'))
|
|
217
|
+
continue;
|
|
218
|
+
// package.json goes last: its presence is what marks the package as installed.
|
|
219
|
+
if (relative === 'package.json')
|
|
220
|
+
manifest = entry.data;
|
|
221
|
+
else
|
|
222
|
+
fs.writeFile(join(dir, relative), decodeIfText(relative, entry.data));
|
|
223
|
+
}
|
|
224
|
+
if (!manifest)
|
|
225
|
+
throw new Error(`The tarball for ${dir} has no package.json.`);
|
|
226
|
+
fs.writeFile(join(dir, 'package.json'), decodeIfText('package.json', manifest));
|
|
227
|
+
}
|
|
228
|
+
/** Rebuild every `.bin` directory from the tree; returns the top-level bins. */
|
|
229
|
+
function relinkBins(fs, base, tree) {
|
|
230
|
+
const groups = new Map();
|
|
231
|
+
for (const node of tree.values()) {
|
|
232
|
+
const parent = parentLocation(node.location);
|
|
233
|
+
groups.set(parent, [...(groups.get(parent) ?? []), node]);
|
|
234
|
+
}
|
|
235
|
+
fs.rm(join(base, 'node_modules/.bin'));
|
|
236
|
+
let top = {};
|
|
237
|
+
for (const [parent, nodes] of groups) {
|
|
238
|
+
const binDir = join(base, parent, 'node_modules/.bin');
|
|
239
|
+
const linked = linkBins(fs, binDir, nodes.map((n) => ({ dir: join(base, n.location), name: n.name, bin: readJson(fs, join(base, n.location, 'package.json'))?.bin ?? n.manifest.bin })));
|
|
240
|
+
if (parent === '')
|
|
241
|
+
top = linked;
|
|
242
|
+
}
|
|
243
|
+
return top;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/installer/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* package-lock.json, lockfileVersion 3 (npm 7+): a flat `packages` map keyed by
|
|
3
|
+
* install location. Reading it lets an install skip the registry's metadata
|
|
4
|
+
* entirely when nothing changed — every locked entry carries its version,
|
|
5
|
+
* tarball, integrity and dependency ranges.
|
|
6
|
+
*/
|
|
7
|
+
import type { BinField, PackageManifest } from './registry.js';
|
|
8
|
+
import type { ResolvedPackage } from './tree.js';
|
|
9
|
+
import { type PackageJson } from './spec.js';
|
|
10
|
+
export interface LockEntry {
|
|
11
|
+
name?: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
resolved?: string;
|
|
14
|
+
integrity?: string;
|
|
15
|
+
dev?: boolean;
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
license?: string;
|
|
18
|
+
dependencies?: Record<string, string>;
|
|
19
|
+
devDependencies?: Record<string, string>;
|
|
20
|
+
optionalDependencies?: Record<string, string>;
|
|
21
|
+
peerDependencies?: Record<string, string>;
|
|
22
|
+
peerDependenciesMeta?: Record<string, {
|
|
23
|
+
optional?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
bin?: BinField;
|
|
26
|
+
engines?: Record<string, string>;
|
|
27
|
+
os?: string[];
|
|
28
|
+
cpu?: string[];
|
|
29
|
+
hasInstallScript?: boolean;
|
|
30
|
+
deprecated?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface Lockfile {
|
|
33
|
+
name?: string;
|
|
34
|
+
version?: string;
|
|
35
|
+
lockfileVersion: number;
|
|
36
|
+
requires?: boolean;
|
|
37
|
+
packages: Record<string, LockEntry>;
|
|
38
|
+
}
|
|
39
|
+
export declare function parseLockfile(text: string | undefined): Lockfile | undefined;
|
|
40
|
+
/** A locked entry as the manifest the resolver works with. */
|
|
41
|
+
export declare function lockEntryManifest(location: string, entry: LockEntry): PackageManifest | undefined;
|
|
42
|
+
/** Locked manifests by registry package name, for "prefer what is locked". */
|
|
43
|
+
export declare function lockedManifests(lock: Lockfile | undefined): Map<string, PackageManifest[]>;
|
|
44
|
+
/** The highest locked version of `name` satisfying `range`, if any. */
|
|
45
|
+
export declare function pickLocked(locked: Map<string, PackageManifest[]>, name: string, range: string): PackageManifest | undefined;
|
|
46
|
+
/** Do the lockfile's root ranges match package.json exactly? (`npm ci`'s precondition.) */
|
|
47
|
+
export declare function lockMatchesPackage(lock: Lockfile, pkg: PackageJson): boolean;
|
|
48
|
+
export declare function buildLockfile(pkg: PackageJson, tree: Map<string, ResolvedPackage>): Lockfile;
|
|
49
|
+
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/installer/lockfile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAGzD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAS5E;AAID,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,CAkBjG;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAW1F;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAQ3H;AAID,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAQ5E;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,QAAQ,CA+B5F"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { sortObject } from './spec.js';
|
|
2
|
+
import { satisfies, validRange } from './semver.js';
|
|
3
|
+
export function parseLockfile(text) {
|
|
4
|
+
if (!text)
|
|
5
|
+
return undefined;
|
|
6
|
+
try {
|
|
7
|
+
const lock = JSON.parse(text);
|
|
8
|
+
// v1 lockfiles only have the nested `dependencies` tree; re-resolving is simpler than translating.
|
|
9
|
+
return lock.lockfileVersion >= 2 && lock.packages ? lock : undefined;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const nameFromLocation = (location) => location.slice(location.lastIndexOf('node_modules/') + 'node_modules/'.length);
|
|
16
|
+
/** A locked entry as the manifest the resolver works with. */
|
|
17
|
+
export function lockEntryManifest(location, entry) {
|
|
18
|
+
if (!entry.version || !entry.resolved)
|
|
19
|
+
return undefined;
|
|
20
|
+
return {
|
|
21
|
+
name: entry.name ?? nameFromLocation(location),
|
|
22
|
+
version: entry.version,
|
|
23
|
+
dependencies: entry.dependencies,
|
|
24
|
+
optionalDependencies: entry.optionalDependencies,
|
|
25
|
+
peerDependencies: entry.peerDependencies,
|
|
26
|
+
peerDependenciesMeta: entry.peerDependenciesMeta,
|
|
27
|
+
bin: entry.bin,
|
|
28
|
+
engines: entry.engines,
|
|
29
|
+
os: entry.os,
|
|
30
|
+
cpu: entry.cpu,
|
|
31
|
+
hasInstallScript: entry.hasInstallScript,
|
|
32
|
+
deprecated: entry.deprecated,
|
|
33
|
+
license: entry.license,
|
|
34
|
+
dist: { tarball: entry.resolved, integrity: entry.integrity },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Locked manifests by registry package name, for "prefer what is locked". */
|
|
38
|
+
export function lockedManifests(lock) {
|
|
39
|
+
const out = new Map();
|
|
40
|
+
for (const [location, entry] of Object.entries(lock?.packages ?? {})) {
|
|
41
|
+
if (!location.includes('node_modules/'))
|
|
42
|
+
continue;
|
|
43
|
+
const manifest = lockEntryManifest(location, entry);
|
|
44
|
+
if (!manifest)
|
|
45
|
+
continue;
|
|
46
|
+
const list = out.get(manifest.name) ?? [];
|
|
47
|
+
list.push(manifest);
|
|
48
|
+
out.set(manifest.name, list);
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
/** The highest locked version of `name` satisfying `range`, if any. */
|
|
53
|
+
export function pickLocked(locked, name, range) {
|
|
54
|
+
const r = range || '*';
|
|
55
|
+
if (!validRange(r))
|
|
56
|
+
return undefined;
|
|
57
|
+
let best;
|
|
58
|
+
for (const m of locked.get(name) ?? []) {
|
|
59
|
+
if (satisfies(m.version, r) && (!best || satisfies(m.version, `>${best.version}`)))
|
|
60
|
+
best = m;
|
|
61
|
+
}
|
|
62
|
+
return best;
|
|
63
|
+
}
|
|
64
|
+
const ROOT_FIELDS = ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'];
|
|
65
|
+
/** Do the lockfile's root ranges match package.json exactly? (`npm ci`'s precondition.) */
|
|
66
|
+
export function lockMatchesPackage(lock, pkg) {
|
|
67
|
+
const root = lock.packages[''] ?? {};
|
|
68
|
+
return ROOT_FIELDS.every((field) => {
|
|
69
|
+
const a = pkg[field] ?? {};
|
|
70
|
+
const b = root[field] ?? {};
|
|
71
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
72
|
+
return [...keys].every((k) => a[k] === b[k]);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const nonEmpty = (record) => (record && Object.keys(record).length ? record : undefined);
|
|
76
|
+
export function buildLockfile(pkg, tree) {
|
|
77
|
+
const root = { name: pkg.name, version: pkg.version };
|
|
78
|
+
for (const field of ROOT_FIELDS)
|
|
79
|
+
if (nonEmpty(pkg[field]))
|
|
80
|
+
root[field] = pkg[field];
|
|
81
|
+
if (pkg.bin)
|
|
82
|
+
root.bin = pkg.bin;
|
|
83
|
+
const packages = { '': JSON.parse(JSON.stringify(root)) };
|
|
84
|
+
for (const location of [...tree.keys()].sort()) {
|
|
85
|
+
const node = tree.get(location);
|
|
86
|
+
const m = node.manifest;
|
|
87
|
+
const entry = {
|
|
88
|
+
name: m.name !== node.name ? m.name : undefined,
|
|
89
|
+
version: m.version,
|
|
90
|
+
resolved: m.dist.tarball,
|
|
91
|
+
integrity: m.dist.integrity,
|
|
92
|
+
dev: node.dev || undefined,
|
|
93
|
+
optional: node.optional || undefined,
|
|
94
|
+
license: m.license,
|
|
95
|
+
dependencies: nonEmpty(m.dependencies && sortObject(m.dependencies)),
|
|
96
|
+
optionalDependencies: nonEmpty(m.optionalDependencies),
|
|
97
|
+
peerDependencies: nonEmpty(m.peerDependencies),
|
|
98
|
+
peerDependenciesMeta: nonEmpty(m.peerDependenciesMeta),
|
|
99
|
+
bin: m.bin,
|
|
100
|
+
engines: nonEmpty(m.engines),
|
|
101
|
+
os: m.os,
|
|
102
|
+
cpu: m.cpu,
|
|
103
|
+
hasInstallScript: m.hasInstallScript || undefined,
|
|
104
|
+
deprecated: m.deprecated,
|
|
105
|
+
};
|
|
106
|
+
packages[location] = JSON.parse(JSON.stringify(entry)); // drops the undefineds
|
|
107
|
+
}
|
|
108
|
+
return { name: pkg.name, version: pkg.version, lockfileVersion: 3, requires: true, packages };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/installer/lockfile.ts"],"names":[],"mappings":"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"}
|