@0xrama/bnpm 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 +83 -0
- package/dist/package.json +45 -0
- package/dist/src/cache/archive.d.ts +15 -0
- package/dist/src/cache/archive.js +163 -0
- package/dist/src/cache/archive.js.map +1 -0
- package/dist/src/cache/commands.d.ts +15 -0
- package/dist/src/cache/commands.js +168 -0
- package/dist/src/cache/commands.js.map +1 -0
- package/dist/src/cache/quarantine.d.ts +18 -0
- package/dist/src/cache/quarantine.js +104 -0
- package/dist/src/cache/quarantine.js.map +1 -0
- package/dist/src/cache/store.d.ts +10 -0
- package/dist/src/cache/store.js +155 -0
- package/dist/src/cache/store.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +4 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/diff.d.ts +34 -0
- package/dist/src/commands/diff.js +223 -0
- package/dist/src/commands/diff.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +14 -0
- package/dist/src/commands/doctor.js +42 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/edit.d.ts +12 -0
- package/dist/src/commands/edit.js +100 -0
- package/dist/src/commands/edit.js.map +1 -0
- package/dist/src/commands/fund.d.ts +10 -0
- package/dist/src/commands/fund.js +32 -0
- package/dist/src/commands/fund.js.map +1 -0
- package/dist/src/commands/graph.d.ts +29 -0
- package/dist/src/commands/graph.js +90 -0
- package/dist/src/commands/graph.js.map +1 -0
- package/dist/src/commands/index.d.ts +20 -0
- package/dist/src/commands/index.js +1753 -0
- package/dist/src/commands/index.js.map +1 -0
- package/dist/src/commands/navigation.d.ts +2 -0
- package/dist/src/commands/navigation.js +47 -0
- package/dist/src/commands/navigation.js.map +1 -0
- package/dist/src/commands/outdated.d.ts +17 -0
- package/dist/src/commands/outdated.js +69 -0
- package/dist/src/commands/outdated.js.map +1 -0
- package/dist/src/commands/process.d.ts +11 -0
- package/dist/src/commands/process.js +189 -0
- package/dist/src/commands/process.js.map +1 -0
- package/dist/src/commands/prompts.d.ts +6 -0
- package/dist/src/commands/prompts.js +86 -0
- package/dist/src/commands/prompts.js.map +1 -0
- package/dist/src/commands/query.d.ts +48 -0
- package/dist/src/commands/query.js +639 -0
- package/dist/src/commands/query.js.map +1 -0
- package/dist/src/commands/rebuild.d.ts +16 -0
- package/dist/src/commands/rebuild.js +44 -0
- package/dist/src/commands/rebuild.js.map +1 -0
- package/dist/src/commands/sbom.d.ts +6 -0
- package/dist/src/commands/sbom.js +31 -0
- package/dist/src/commands/sbom.js.map +1 -0
- package/dist/src/commands/script-approvals.d.ts +22 -0
- package/dist/src/commands/script-approvals.js +128 -0
- package/dist/src/commands/script-approvals.js.map +1 -0
- package/dist/src/commands/shrinkwrap.d.ts +6 -0
- package/dist/src/commands/shrinkwrap.js +97 -0
- package/dist/src/commands/shrinkwrap.js.map +1 -0
- package/dist/src/commands/stage.d.ts +20 -0
- package/dist/src/commands/stage.js +40 -0
- package/dist/src/commands/stage.js.map +1 -0
- package/dist/src/commands/token.d.ts +2 -0
- package/dist/src/commands/token.js +47 -0
- package/dist/src/commands/token.js.map +1 -0
- package/dist/src/commands/trust.d.ts +5 -0
- package/dist/src/commands/trust.js +41 -0
- package/dist/src/commands/trust.js.map +1 -0
- package/dist/src/config/commands.d.ts +5 -0
- package/dist/src/config/commands.js +91 -0
- package/dist/src/config/commands.js.map +1 -0
- package/dist/src/config/configuration.d.ts +40 -0
- package/dist/src/config/configuration.js +157 -0
- package/dist/src/config/configuration.js.map +1 -0
- package/dist/src/config/interactive.d.ts +16 -0
- package/dist/src/config/interactive.js +19 -0
- package/dist/src/config/interactive.js.map +1 -0
- package/dist/src/config/paths.d.ts +22 -0
- package/dist/src/config/paths.js +46 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/config/types.d.ts +15 -0
- package/dist/src/config/types.js +6 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/core/cli-parser.d.ts +102 -0
- package/dist/src/core/cli-parser.js +1148 -0
- package/dist/src/core/cli-parser.js.map +1 -0
- package/dist/src/core/cli-runner.d.ts +15 -0
- package/dist/src/core/cli-runner.js +261 -0
- package/dist/src/core/cli-runner.js.map +1 -0
- package/dist/src/core/exit-codes.d.ts +13 -0
- package/dist/src/core/exit-codes.js +13 -0
- package/dist/src/core/exit-codes.js.map +1 -0
- package/dist/src/core/output.d.ts +23 -0
- package/dist/src/core/output.js +123 -0
- package/dist/src/core/output.js.map +1 -0
- package/dist/src/installer/install.d.ts +73 -0
- package/dist/src/installer/install.js +596 -0
- package/dist/src/installer/install.js.map +1 -0
- package/dist/src/installer/mutations.d.ts +5 -0
- package/dist/src/installer/mutations.js +160 -0
- package/dist/src/installer/mutations.js.map +1 -0
- package/dist/src/linker/project-linker.d.ts +9 -0
- package/dist/src/linker/project-linker.js +223 -0
- package/dist/src/linker/project-linker.js.map +1 -0
- package/dist/src/lockfile/index.d.ts +27 -0
- package/dist/src/lockfile/index.js +221 -0
- package/dist/src/lockfile/index.js.map +1 -0
- package/dist/src/package/authoring.d.ts +31 -0
- package/dist/src/package/authoring.js +125 -0
- package/dist/src/package/authoring.js.map +1 -0
- package/dist/src/package/pack.d.ts +22 -0
- package/dist/src/package/pack.js +238 -0
- package/dist/src/package/pack.js.map +1 -0
- package/dist/src/package/provenance.d.ts +28 -0
- package/dist/src/package/provenance.js +162 -0
- package/dist/src/package/provenance.js.map +1 -0
- package/dist/src/package/publish.d.ts +28 -0
- package/dist/src/package/publish.js +189 -0
- package/dist/src/package/publish.js.map +1 -0
- package/dist/src/package/trusted-publishing.d.ts +7 -0
- package/dist/src/package/trusted-publishing.js +84 -0
- package/dist/src/package/trusted-publishing.js.map +1 -0
- package/dist/src/project/dependency-error.d.ts +3 -0
- package/dist/src/project/dependency-error.js +7 -0
- package/dist/src/project/dependency-error.js.map +1 -0
- package/dist/src/project/dev-engines.d.ts +10 -0
- package/dist/src/project/dev-engines.js +70 -0
- package/dist/src/project/dev-engines.js.map +1 -0
- package/dist/src/project/discovery.d.ts +6 -0
- package/dist/src/project/discovery.js +51 -0
- package/dist/src/project/discovery.js.map +1 -0
- package/dist/src/project/global.d.ts +3 -0
- package/dist/src/project/global.js +43 -0
- package/dist/src/project/global.js.map +1 -0
- package/dist/src/project/invalidation.d.ts +3 -0
- package/dist/src/project/invalidation.js +21 -0
- package/dist/src/project/invalidation.js.map +1 -0
- package/dist/src/project/link.d.ts +21 -0
- package/dist/src/project/link.js +152 -0
- package/dist/src/project/link.js.map +1 -0
- package/dist/src/project/manifest.d.ts +27 -0
- package/dist/src/project/manifest.js +378 -0
- package/dist/src/project/manifest.js.map +1 -0
- package/dist/src/project/pkg.d.ts +5 -0
- package/dist/src/project/pkg.js +94 -0
- package/dist/src/project/pkg.js.map +1 -0
- package/dist/src/project/recovery.d.ts +2 -0
- package/dist/src/project/recovery.js +82 -0
- package/dist/src/project/recovery.js.map +1 -0
- package/dist/src/project/workspaces.d.ts +4 -0
- package/dist/src/project/workspaces.js +59 -0
- package/dist/src/project/workspaces.js.map +1 -0
- package/dist/src/registry/account.d.ts +79 -0
- package/dist/src/registry/account.js +305 -0
- package/dist/src/registry/account.js.map +1 -0
- package/dist/src/registry/audit.d.ts +18 -0
- package/dist/src/registry/audit.js +74 -0
- package/dist/src/registry/audit.js.map +1 -0
- package/dist/src/registry/client.d.ts +19 -0
- package/dist/src/registry/client.js +102 -0
- package/dist/src/registry/client.js.map +1 -0
- package/dist/src/registry/configuration.d.ts +36 -0
- package/dist/src/registry/configuration.js +133 -0
- package/dist/src/registry/configuration.js.map +1 -0
- package/dist/src/registry/operations.d.ts +163 -0
- package/dist/src/registry/operations.js +502 -0
- package/dist/src/registry/operations.js.map +1 -0
- package/dist/src/registry/types.d.ts +30 -0
- package/dist/src/registry/types.js +2 -0
- package/dist/src/registry/types.js.map +1 -0
- package/dist/src/resolver/registry-resolver.d.ts +40 -0
- package/dist/src/resolver/registry-resolver.js +354 -0
- package/dist/src/resolver/registry-resolver.js.map +1 -0
- package/dist/src/resolver/source-provider.d.ts +17 -0
- package/dist/src/resolver/source-provider.js +336 -0
- package/dist/src/resolver/source-provider.js.map +1 -0
- package/dist/src/resolver/types.d.ts +28 -0
- package/dist/src/resolver/types.js +2 -0
- package/dist/src/resolver/types.js.map +1 -0
- package/dist/src/security/analyzer.d.ts +38 -0
- package/dist/src/security/analyzer.js +241 -0
- package/dist/src/security/analyzer.js.map +1 -0
- package/dist/src/security/audit.d.ts +19 -0
- package/dist/src/security/audit.js +61 -0
- package/dist/src/security/audit.js.map +1 -0
- package/dist/src/security/findings.d.ts +23 -0
- package/dist/src/security/findings.js +2 -0
- package/dist/src/security/findings.js.map +1 -0
- package/dist/src/security/integrity.d.ts +14 -0
- package/dist/src/security/integrity.js +40 -0
- package/dist/src/security/integrity.js.map +1 -0
- package/dist/src/security/policy.d.ts +16 -0
- package/dist/src/security/policy.js +24 -0
- package/dist/src/security/policy.js.map +1 -0
- package/dist/src/security/recent-release.d.ts +19 -0
- package/dist/src/security/recent-release.js +27 -0
- package/dist/src/security/recent-release.js.map +1 -0
- package/dist/src/security/script-runner.d.ts +13 -0
- package/dist/src/security/script-runner.js +73 -0
- package/dist/src/security/script-runner.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import { delimiter, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { realpath } from "node:fs/promises";
|
|
5
|
+
import { parseManifest } from "../project/manifest.js";
|
|
6
|
+
import { analyzePackage } from "../security/analyzer.js";
|
|
7
|
+
import packageMetadata from "../../package.json" with { type: "json" };
|
|
8
|
+
export class ProcessCommandError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "ProcessCommandError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function shellQuote(value) {
|
|
15
|
+
if (process.platform === "win32")
|
|
16
|
+
return `"${value.replaceAll('"', '\\"')}"`;
|
|
17
|
+
return `'${value.replaceAll("'", `'\\''`)}'`;
|
|
18
|
+
}
|
|
19
|
+
async function execute(options) {
|
|
20
|
+
const child = spawn(options.command, options.args ?? [], {
|
|
21
|
+
cwd: options.cwd,
|
|
22
|
+
shell: options.shell,
|
|
23
|
+
stdio: options.passthrough ? "inherit" : ["inherit", "pipe", "pipe"],
|
|
24
|
+
env: { ...process.env, ...options.environment, PATH: [join(options.cwd, "node_modules", ".bin"), process.env.PATH].filter((value) => Boolean(value)).join(delimiter) },
|
|
25
|
+
windowsHide: true,
|
|
26
|
+
});
|
|
27
|
+
let bytes = 0;
|
|
28
|
+
const limit = 8 * 1024 * 1024;
|
|
29
|
+
const consume = (stream, chunk) => {
|
|
30
|
+
bytes += chunk.length;
|
|
31
|
+
if (bytes <= limit)
|
|
32
|
+
options.output.childOutput(stream, chunk.toString("utf8"), options.attribution);
|
|
33
|
+
else if (bytes - chunk.length <= limit)
|
|
34
|
+
options.output.childOutput("stderr", `[output truncated after ${limit} bytes]`, { ...options.attribution, truncated: true });
|
|
35
|
+
};
|
|
36
|
+
if (!options.passthrough) {
|
|
37
|
+
child.stdout.on("data", (chunk) => consume("stdout", chunk));
|
|
38
|
+
child.stderr.on("data", (chunk) => consume("stderr", chunk));
|
|
39
|
+
}
|
|
40
|
+
const abort = () => { child.kill("SIGTERM"); };
|
|
41
|
+
options.signal.addEventListener("abort", abort, { once: true });
|
|
42
|
+
try {
|
|
43
|
+
const code = await new Promise((resolve, reject) => {
|
|
44
|
+
child.once("error", reject);
|
|
45
|
+
child.once("close", (exitCode, exitSignal) => resolve(exitCode ?? (exitSignal === "SIGINT" ? 130 : 1)));
|
|
46
|
+
});
|
|
47
|
+
if (options.signal.aborted)
|
|
48
|
+
throw options.signal.reason;
|
|
49
|
+
return code;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
options.signal.removeEventListener("abort", abort);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function runProjectScript(cwd, name, args, signal, output, allowedDangerous, lifecycleEnvironment = {}) {
|
|
56
|
+
const path = join(cwd, "package.json");
|
|
57
|
+
const bytes = await readFile(path, "utf8");
|
|
58
|
+
const strict = parseManifest(bytes, path);
|
|
59
|
+
const raw = JSON.parse(bytes);
|
|
60
|
+
if (raw.scripts === null || typeof raw.scripts !== "object" || Array.isArray(raw.scripts))
|
|
61
|
+
throw new ProcessCommandError("package.json does not define scripts");
|
|
62
|
+
const command = raw.scripts[name];
|
|
63
|
+
if (typeof command !== "string" || command.length === 0)
|
|
64
|
+
throw new ProcessCommandError(`Unknown project script: ${name}`);
|
|
65
|
+
const version = typeof raw.version === "string" ? raw.version : "0.0.0";
|
|
66
|
+
const packageName = strict.name ?? "project";
|
|
67
|
+
const analyzed = await analyzePackage({ root: cwd, packageName, packageVersion: version, integrity: "local-project" });
|
|
68
|
+
const dangerous = analyzed.analysis.findings.filter((finding) => finding.severity === "dangerous");
|
|
69
|
+
if (dangerous.length > 0 && !allowedDangerous.has(`${packageName}@${version}`)) {
|
|
70
|
+
output.info(`Project script analysis found ${dangerous.length} dangerous behavior${dangerous.length === 1 ? "" : "s"}`, dangerous);
|
|
71
|
+
throw new ProcessCommandError(`Project script blocked by security policy: ${name}`);
|
|
72
|
+
}
|
|
73
|
+
const fullCommand = args.length === 0 ? command : `${command} ${args.map(shellQuote).join(" ")}`;
|
|
74
|
+
return execute({ command: fullCommand, shell: true, cwd, signal, output, attribution: { package: `${packageName}@${version}`, stage: `run:${name}` }, environment: { INIT_CWD: cwd, npm_command: "run-script", npm_lifecycle_event: name, npm_package_json: path, npm_package_name: packageName, npm_package_version: version, npm_node_execpath: process.execPath, npm_execpath: process.argv[1] ?? "bnpm", npm_config_user_agent: `bnpm/${packageMetadata.version} node/${process.versions.node} ${process.platform} ${process.arch}`, ...lifecycleEnvironment } });
|
|
75
|
+
}
|
|
76
|
+
export async function runProjectScriptIfPresent(cwd, name, signal, output, allowedDangerous, lifecycleEnvironment = {}) {
|
|
77
|
+
const path = join(cwd, "package.json");
|
|
78
|
+
const raw = JSON.parse(await readFile(path, "utf8"));
|
|
79
|
+
if (raw.scripts === undefined)
|
|
80
|
+
return;
|
|
81
|
+
if (raw.scripts === null || typeof raw.scripts !== "object" || Array.isArray(raw.scripts))
|
|
82
|
+
throw new ProcessCommandError("package.json scripts must be an object");
|
|
83
|
+
if (!Object.prototype.hasOwnProperty.call(raw.scripts, name))
|
|
84
|
+
return;
|
|
85
|
+
const code = await runProjectScript(cwd, name, [], signal, output, allowedDangerous, lifecycleEnvironment);
|
|
86
|
+
if (code !== 0)
|
|
87
|
+
throw new ProcessCommandError(`Project script ${name} exited with ${code}`);
|
|
88
|
+
}
|
|
89
|
+
export async function projectScriptNames(cwd) {
|
|
90
|
+
const path = join(cwd, "package.json");
|
|
91
|
+
const bytes = await readFile(path, "utf8");
|
|
92
|
+
parseManifest(bytes, path);
|
|
93
|
+
const raw = JSON.parse(bytes);
|
|
94
|
+
if (raw.scripts === undefined)
|
|
95
|
+
return new Set();
|
|
96
|
+
if (raw.scripts === null || typeof raw.scripts !== "object" || Array.isArray(raw.scripts))
|
|
97
|
+
throw new ProcessCommandError("package.json scripts must be an object");
|
|
98
|
+
const names = new Set();
|
|
99
|
+
for (const [name, command] of Object.entries(raw.scripts)) {
|
|
100
|
+
if (typeof command !== "string")
|
|
101
|
+
throw new ProcessCommandError(`package.json script ${name} must be a string`);
|
|
102
|
+
names.add(name);
|
|
103
|
+
}
|
|
104
|
+
return names;
|
|
105
|
+
}
|
|
106
|
+
export async function runProjectScriptLifecycle(cwd, name, args, signal, output, allowedDangerous, includeHooks = true) {
|
|
107
|
+
const scripts = await projectScriptNames(cwd);
|
|
108
|
+
if (!scripts.has(name)) {
|
|
109
|
+
if (name !== "start")
|
|
110
|
+
throw new ProcessCommandError(`Unknown project script: ${name}`);
|
|
111
|
+
try {
|
|
112
|
+
await access(join(cwd, "server.js"));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new ProcessCommandError(`Unknown project script: ${name}`);
|
|
116
|
+
}
|
|
117
|
+
const manifestPath = join(cwd, "package.json");
|
|
118
|
+
const bytes = await readFile(manifestPath, "utf8");
|
|
119
|
+
const strict = parseManifest(bytes, manifestPath);
|
|
120
|
+
const raw = JSON.parse(bytes);
|
|
121
|
+
const version = typeof raw.version === "string" ? raw.version : "0.0.0";
|
|
122
|
+
const packageName = strict.name ?? "project";
|
|
123
|
+
const analyzed = await analyzePackage({ root: cwd, packageName, packageVersion: version, integrity: "local-project" });
|
|
124
|
+
const dangerous = analyzed.analysis.findings.filter((finding) => finding.severity === "dangerous");
|
|
125
|
+
if (dangerous.length > 0 && !allowedDangerous.has(`${packageName}@${version}`)) {
|
|
126
|
+
output.info(`Project script analysis found ${dangerous.length} dangerous behavior${dangerous.length === 1 ? "" : "s"}`, dangerous);
|
|
127
|
+
throw new ProcessCommandError("Project start fallback blocked by security policy");
|
|
128
|
+
}
|
|
129
|
+
return execute({ command: process.execPath, args: ["server.js", ...args], shell: false, cwd, signal, output, attribution: { package: `${packageName}@${version}`, stage: "run:start" }, environment: { INIT_CWD: cwd, npm_command: "start", npm_lifecycle_event: "start", npm_package_json: manifestPath, npm_package_name: packageName, npm_package_version: version, npm_node_execpath: process.execPath, npm_execpath: process.argv[1] ?? "bnpm", npm_config_user_agent: `bnpm/${packageMetadata.version} node/${process.versions.node} ${process.platform} ${process.arch}` } });
|
|
130
|
+
}
|
|
131
|
+
for (const stage of includeHooks ? [`pre${name}`, name, `post${name}`] : [name]) {
|
|
132
|
+
if (!scripts.has(stage))
|
|
133
|
+
continue;
|
|
134
|
+
const code = await runProjectScript(cwd, stage, stage === name ? args : [], signal, output, allowedDangerous);
|
|
135
|
+
if (code !== 0)
|
|
136
|
+
return code;
|
|
137
|
+
}
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
export async function runProjectInstallLifecycle(cwd, signal, output, allowedDangerous) {
|
|
141
|
+
const scripts = await projectScriptNames(cwd);
|
|
142
|
+
for (const stage of ["preinstall", "install", "postinstall", "prepublish", "preprepare", "prepare", "postprepare"]) {
|
|
143
|
+
if (!scripts.has(stage))
|
|
144
|
+
continue;
|
|
145
|
+
const code = await runProjectScript(cwd, stage, [], signal, output, allowedDangerous);
|
|
146
|
+
if (code !== 0)
|
|
147
|
+
return code;
|
|
148
|
+
}
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
export async function execInstalled(cwd, binary, args, signal, output, passthrough = false) {
|
|
152
|
+
if (!/^[A-Za-z0-9._-]+$/.test(binary))
|
|
153
|
+
throw new ProcessCommandError(`Invalid executable name: ${binary}`);
|
|
154
|
+
const path = join(cwd, "node_modules", ".bin", process.platform === "win32" ? `${binary}.cmd` : binary);
|
|
155
|
+
try {
|
|
156
|
+
await access(path);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
throw new ProcessCommandError(`Installed executable not found: ${binary}`);
|
|
160
|
+
}
|
|
161
|
+
if (process.platform === "win32") {
|
|
162
|
+
const shim = await readFile(path, "utf8");
|
|
163
|
+
const match = /(?:^|\r?\n)@?node\s+"([^"]+)"\s+%\*\s*(?:\r?\n|$)/i.exec(shim);
|
|
164
|
+
if (!match?.[1])
|
|
165
|
+
throw new ProcessCommandError(`Installed executable has an unsupported Windows shim: ${binary}`);
|
|
166
|
+
const expanded = match[1].replace(/^%~dp0[\\/]/i, "");
|
|
167
|
+
const target = resolve(dirname(path), expanded);
|
|
168
|
+
return execute({ command: process.execPath, args: [target, ...args], shell: false, cwd, signal, output, attribution: { package: binary, stage: "exec" }, passthrough });
|
|
169
|
+
}
|
|
170
|
+
return execute({ command: path, args, shell: false, cwd, signal, output, attribution: { package: binary, stage: "exec" }, passthrough });
|
|
171
|
+
}
|
|
172
|
+
export async function exploreInstalled(cwd, packageName, command, signal, output) {
|
|
173
|
+
if (!/^(?:@[^/@\s]+\/)?[A-Za-z0-9][A-Za-z0-9._-]*$/.test(packageName))
|
|
174
|
+
throw new ProcessCommandError(`Invalid package name: ${packageName}`);
|
|
175
|
+
let packageRoot;
|
|
176
|
+
try {
|
|
177
|
+
packageRoot = await realpath(join(cwd, "node_modules", ...packageName.split("/")));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
throw new ProcessCommandError(`Installed package not found: ${packageName}`);
|
|
181
|
+
}
|
|
182
|
+
const manifestPath = join(packageRoot, "package.json");
|
|
183
|
+
parseManifest(await readFile(manifestPath, "utf8"), manifestPath);
|
|
184
|
+
const executable = command[0] ?? (process.platform === "win32" ? process.env.ComSpec ?? "cmd.exe" : "/bin/sh");
|
|
185
|
+
if (command.length > 0 && (!/^[A-Za-z0-9._+-]+$/.test(executable) || executable.includes("..")))
|
|
186
|
+
throw new ProcessCommandError(`Invalid explore executable: ${executable}`);
|
|
187
|
+
return execute({ command: executable, args: command.slice(1), shell: false, cwd: packageRoot, signal, output, attribution: { package: packageName, stage: "explore" } });
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { InstallPrompts } from "../installer/install.js";
|
|
2
|
+
import type { CommandOptions } from "../core/cli-parser.js";
|
|
3
|
+
export declare function commandInstallPrompts(options: CommandOptions): InstallPrompts;
|
|
4
|
+
export declare function confirmCommand(question: string, options: Pick<CommandOptions, "json" | "yes">): Promise<boolean>;
|
|
5
|
+
export declare function readSecret(question: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
6
|
+
export declare function readInput(question: string, json: boolean): Promise<string | undefined>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { detectInteractiveMode } from "../config/interactive.js";
|
|
3
|
+
async function ask(question) {
|
|
4
|
+
const readline = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
|
|
5
|
+
try {
|
|
6
|
+
return (await readline.question(question)).trim();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
readline.close();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const yes = (value) => value?.toLowerCase() === "y" || value?.toLowerCase() === "yes";
|
|
16
|
+
export function commandInstallPrompts(options) {
|
|
17
|
+
const mode = detectInteractiveMode({ json: options.json, environment: process.env, stdinIsTTY: process.stdin.isTTY, stderrIsTTY: process.stderr.isTTY, promptAvailable: true });
|
|
18
|
+
return {
|
|
19
|
+
mode,
|
|
20
|
+
...(mode.interactive ? {
|
|
21
|
+
selectRecencyHours: () => ask("Choose recent-release warning window in hours [1/6/24] (default 1): "),
|
|
22
|
+
allowRecent: (decision) => ask(`${decision.identity}: ${decision.reason}. Install this recently published package? [y/N] `).then(yes),
|
|
23
|
+
allowDangerous: (analyzed) => {
|
|
24
|
+
const identity = `${analyzed.analysis.packageName}@${analyzed.analysis.packageVersion}`;
|
|
25
|
+
const rules = analyzed.analysis.findings.filter((finding) => finding.severity === "dangerous").map((finding) => finding.ruleId).join(", ");
|
|
26
|
+
return ask(`${identity} has dangerous findings (${rules}). Override and continue? [y/N] `).then(yes);
|
|
27
|
+
},
|
|
28
|
+
approveLifecycle: (fact) => ask(`${fact.packageName}@${fact.packageVersion} wants to run ${fact.stage}: ${fact.command}\n` +
|
|
29
|
+
"This command is NOT sandboxed and will run with your normal operating-system permissions. Approve once? [y/N] ").then(yes),
|
|
30
|
+
} : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export async function confirmCommand(question, options) {
|
|
34
|
+
if (options.yes === true)
|
|
35
|
+
return true;
|
|
36
|
+
const mode = detectInteractiveMode({ json: options.json, environment: process.env, stdinIsTTY: process.stdin.isTTY, stderrIsTTY: process.stderr.isTTY, promptAvailable: true });
|
|
37
|
+
if (!mode.interactive)
|
|
38
|
+
return false;
|
|
39
|
+
return yes(await ask(`${question} [y/N] `));
|
|
40
|
+
}
|
|
41
|
+
export async function readSecret(question, signal) {
|
|
42
|
+
if (!process.stdin.isTTY || !process.stderr.isTTY || typeof process.stdin.setRawMode !== "function")
|
|
43
|
+
return undefined;
|
|
44
|
+
process.stderr.write(question);
|
|
45
|
+
const wasRaw = process.stdin.isRaw;
|
|
46
|
+
process.stdin.setRawMode(true);
|
|
47
|
+
process.stdin.resume();
|
|
48
|
+
process.stdin.setEncoding("utf8");
|
|
49
|
+
let value = "";
|
|
50
|
+
return new Promise((resolvePromise) => {
|
|
51
|
+
const finish = (result) => {
|
|
52
|
+
process.stdin.off("data", data);
|
|
53
|
+
signal?.removeEventListener("abort", aborted);
|
|
54
|
+
process.stdin.setRawMode(wasRaw);
|
|
55
|
+
process.stdin.pause();
|
|
56
|
+
process.stderr.write("\n");
|
|
57
|
+
resolvePromise(result);
|
|
58
|
+
};
|
|
59
|
+
const aborted = () => { finish(undefined); };
|
|
60
|
+
const data = (chunk) => {
|
|
61
|
+
for (const character of chunk) {
|
|
62
|
+
if (character === "\r" || character === "\n") {
|
|
63
|
+
finish(value);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (character === "\u0003") {
|
|
67
|
+
finish(undefined);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (character === "\u007f" || character === "\b")
|
|
71
|
+
value = value.slice(0, -1);
|
|
72
|
+
else if (character >= " " && value.length < 1024)
|
|
73
|
+
value += character;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
process.stdin.on("data", data);
|
|
77
|
+
signal?.addEventListener("abort", aborted, { once: true });
|
|
78
|
+
if (signal?.aborted)
|
|
79
|
+
finish(undefined);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export async function readInput(question, json) {
|
|
83
|
+
const mode = detectInteractiveMode({ json, environment: process.env, stdinIsTTY: process.stdin.isTTY, stderrIsTTY: process.stderr.isTTY, promptAvailable: true });
|
|
84
|
+
return mode.interactive ? ask(question) : undefined;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type BnpmPaths } from "../config/paths.js";
|
|
2
|
+
import { type RegistryAdvisory } from "../registry/audit.js";
|
|
3
|
+
import type { Requirement, ResolutionGraph } from "../resolver/types.js";
|
|
4
|
+
export declare class QueryError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
type QueryKind = Requirement["kind"] | "bundled";
|
|
8
|
+
export interface QueryResult {
|
|
9
|
+
readonly [key: string]: unknown;
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly version: string;
|
|
13
|
+
readonly source: string;
|
|
14
|
+
readonly direct: boolean;
|
|
15
|
+
readonly aliases: readonly string[];
|
|
16
|
+
readonly types: readonly QueryKind[];
|
|
17
|
+
readonly dangerous: boolean;
|
|
18
|
+
readonly dependencies: readonly string[];
|
|
19
|
+
readonly dependents: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
interface QueryEnrichment {
|
|
22
|
+
readonly outdated?: ReadonlyMap<string, {
|
|
23
|
+
readonly categories: ReadonlySet<string>;
|
|
24
|
+
readonly versions: readonly string[];
|
|
25
|
+
}>;
|
|
26
|
+
readonly advisories?: ReadonlyMap<string, readonly RegistryAdvisory[]>;
|
|
27
|
+
}
|
|
28
|
+
export declare function queryResolutionGraph(graph: ResolutionGraph, roots: ReadonlyMap<string, string>, requirements: readonly Requirement[], dangerousIds: ReadonlySet<string>, selector: string, rootManifest?: Readonly<Record<string, unknown>>, enrichment?: QueryEnrichment): readonly QueryResult[];
|
|
29
|
+
export declare function enrichQuery(options: {
|
|
30
|
+
readonly selector: string;
|
|
31
|
+
readonly graph: ResolutionGraph;
|
|
32
|
+
readonly roots: ReadonlyMap<string, string>;
|
|
33
|
+
readonly requirements: readonly Requirement[];
|
|
34
|
+
readonly paths: BnpmPaths;
|
|
35
|
+
readonly registry?: URL;
|
|
36
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
37
|
+
readonly signal?: AbortSignal;
|
|
38
|
+
}): Promise<QueryEnrichment>;
|
|
39
|
+
export declare function queryInstalledPackages(options: {
|
|
40
|
+
readonly cwd: string;
|
|
41
|
+
readonly selector: string;
|
|
42
|
+
readonly paths?: BnpmPaths;
|
|
43
|
+
readonly allWorkspaces?: boolean;
|
|
44
|
+
readonly registry?: URL;
|
|
45
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
46
|
+
readonly signal?: AbortSignal;
|
|
47
|
+
}): Promise<readonly QueryResult[]>;
|
|
48
|
+
export {};
|