@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 { RegistryError } from "../registry/client.js";
|
|
2
|
+
import { loadRegistryConfiguration } from "../registry/configuration.js";
|
|
3
|
+
import { generateProvenance, transparencyLogUrl } from "./provenance.js";
|
|
4
|
+
import { trustedPublishingToken } from "./trusted-publishing.js";
|
|
5
|
+
function stringSetting(value, key) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (typeof value !== "string" || value.length === 0)
|
|
9
|
+
throw new RegistryError(`package.json publishConfig.${key} must be a non-empty string`);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function publishConfig(manifest) {
|
|
13
|
+
const value = manifest.publishConfig;
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
return {};
|
|
16
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
17
|
+
throw new RegistryError("package.json publishConfig must be an object");
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function registryOverride(value) {
|
|
21
|
+
if (value === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
let url;
|
|
24
|
+
try {
|
|
25
|
+
url = new URL(value);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new RegistryError("publishConfig.registry must be an absolute HTTPS URL");
|
|
29
|
+
}
|
|
30
|
+
if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash) {
|
|
31
|
+
throw new RegistryError("publishConfig.registry must be HTTPS and must not contain credentials, query, or fragment");
|
|
32
|
+
}
|
|
33
|
+
if (!url.pathname.endsWith("/"))
|
|
34
|
+
url.pathname += "/";
|
|
35
|
+
return url;
|
|
36
|
+
}
|
|
37
|
+
async function boundedError(response) {
|
|
38
|
+
if (!response.body)
|
|
39
|
+
return "";
|
|
40
|
+
const chunks = [];
|
|
41
|
+
let size = 0;
|
|
42
|
+
for await (const value of response.body) {
|
|
43
|
+
const chunk = Buffer.from(value);
|
|
44
|
+
size += chunk.length;
|
|
45
|
+
if (size > 1024 * 1024)
|
|
46
|
+
return "registry response exceeded the size limit";
|
|
47
|
+
chunks.push(chunk);
|
|
48
|
+
}
|
|
49
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(text);
|
|
52
|
+
const message = typeof parsed.error === "string" ? parsed.error : typeof parsed.reason === "string" ? parsed.reason : undefined;
|
|
53
|
+
return message?.slice(0, 500) ?? "";
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return text.replace(/[\u0000-\u001f\u007f]/g, " ").slice(0, 500);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function publishPackage(options) {
|
|
60
|
+
if (options.artifact.manifest.private === true)
|
|
61
|
+
throw new RegistryError("Refusing to publish a package marked private");
|
|
62
|
+
const config = publishConfig(options.artifact.manifest);
|
|
63
|
+
const configuredRegistry = registryOverride(stringSetting(config.registry, "registry"));
|
|
64
|
+
const defaultRegistry = options.registry ?? configuredRegistry;
|
|
65
|
+
const configuration = await loadRegistryConfiguration({
|
|
66
|
+
userNpmrc: options.paths.userNpmrc,
|
|
67
|
+
projectNpmrc: options.paths.projectNpmrc,
|
|
68
|
+
...(defaultRegistry === undefined ? {} : { defaultRegistry }),
|
|
69
|
+
});
|
|
70
|
+
const registry = options.registry ?? configuredRegistry ?? configuration.registryForPackage(options.artifact.name);
|
|
71
|
+
const configuredTag = stringSetting(config.tag, "tag");
|
|
72
|
+
const tag = options.tag ?? configuredTag ?? "latest";
|
|
73
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(tag))
|
|
74
|
+
throw new RegistryError(`Invalid distribution tag ${tag}`);
|
|
75
|
+
const configuredAccess = stringSetting(config.access, "access");
|
|
76
|
+
const access = options.access ?? (configuredAccess === "private" ? "restricted" : configuredAccess);
|
|
77
|
+
if (access !== undefined && access !== "public" && access !== "restricted")
|
|
78
|
+
throw new RegistryError("publish access must be public or restricted");
|
|
79
|
+
if (options.generateProvenance && options.provenance)
|
|
80
|
+
throw new RegistryError("generated and supplied provenance are mutually exclusive");
|
|
81
|
+
if (options.generateProvenance && access !== "public")
|
|
82
|
+
throw new RegistryError("provenance generation requires explicit public access");
|
|
83
|
+
const provenance = options.generateProvenance
|
|
84
|
+
? await (options.provenanceGenerator ?? generateProvenance)(options.artifact)
|
|
85
|
+
: options.provenance;
|
|
86
|
+
const request = options.fetch ?? globalThis.fetch;
|
|
87
|
+
const trustedToken = await trustedPublishingToken({
|
|
88
|
+
packageName: options.artifact.name,
|
|
89
|
+
registry,
|
|
90
|
+
environment: options.environment ?? process.env,
|
|
91
|
+
fetch: request,
|
|
92
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
93
|
+
});
|
|
94
|
+
const packagePath = encodeURIComponent(options.artifact.name);
|
|
95
|
+
const endpoint = options.stage ? new URL(`/-/stage/package/${packagePath}`, registry) : new URL(packagePath, registry);
|
|
96
|
+
const tarballUrl = new URL(`${packagePath}/-/${encodeURIComponent(options.artifact.filename)}`, registry).href;
|
|
97
|
+
const versionManifest = {
|
|
98
|
+
...options.artifact.manifest,
|
|
99
|
+
_id: options.artifact.id,
|
|
100
|
+
dist: { integrity: options.artifact.integrity, shasum: options.artifact.shasum, tarball: tarballUrl },
|
|
101
|
+
};
|
|
102
|
+
const attachments = {
|
|
103
|
+
[options.artifact.filename]: {
|
|
104
|
+
content_type: "application/octet-stream",
|
|
105
|
+
data: options.artifact.tarball.toString("base64"),
|
|
106
|
+
length: options.artifact.size,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
if (provenance) {
|
|
110
|
+
const serialized = JSON.stringify(provenance);
|
|
111
|
+
attachments[`${options.artifact.name}-${options.artifact.version}.sigstore`] = {
|
|
112
|
+
content_type: provenance.mediaType,
|
|
113
|
+
data: serialized,
|
|
114
|
+
length: Buffer.byteLength(serialized),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const body = JSON.stringify({
|
|
118
|
+
_id: options.artifact.name,
|
|
119
|
+
name: options.artifact.name,
|
|
120
|
+
...(typeof options.artifact.manifest.description === "string" ? { description: options.artifact.manifest.description } : {}),
|
|
121
|
+
"dist-tags": { [tag]: options.artifact.version },
|
|
122
|
+
versions: { [options.artifact.version]: versionManifest },
|
|
123
|
+
...(access === undefined ? {} : { access }),
|
|
124
|
+
_attachments: attachments,
|
|
125
|
+
});
|
|
126
|
+
let url = endpoint;
|
|
127
|
+
for (let redirect = 0; redirect <= 5; redirect += 1) {
|
|
128
|
+
const timeout = AbortSignal.timeout(30_000);
|
|
129
|
+
const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;
|
|
130
|
+
const response = await request(url, {
|
|
131
|
+
method: options.stage ? "POST" : "PUT",
|
|
132
|
+
redirect: "manual",
|
|
133
|
+
signal,
|
|
134
|
+
headers: {
|
|
135
|
+
accept: "application/json",
|
|
136
|
+
"content-type": "application/json",
|
|
137
|
+
"content-length": String(Buffer.byteLength(body)),
|
|
138
|
+
...configuration.headersFor(url),
|
|
139
|
+
...(trustedToken === undefined ? {} : { authorization: `Bearer ${trustedToken}` }),
|
|
140
|
+
...(options.otp === undefined ? {} : { "npm-otp": options.otp }),
|
|
141
|
+
},
|
|
142
|
+
body,
|
|
143
|
+
});
|
|
144
|
+
if ([307, 308].includes(response.status)) {
|
|
145
|
+
if (redirect === 5)
|
|
146
|
+
throw new RegistryError("Publish request exceeded the redirect limit");
|
|
147
|
+
const location = response.headers.get("location");
|
|
148
|
+
if (!location)
|
|
149
|
+
throw new RegistryError("Publish redirect did not provide a location");
|
|
150
|
+
url = new URL(location, url);
|
|
151
|
+
if (url.protocol !== "https:")
|
|
152
|
+
throw new RegistryError("Publish redirect must use HTTPS");
|
|
153
|
+
if (url.origin !== registry.origin)
|
|
154
|
+
throw new RegistryError("Publish redirect must remain on the registry origin");
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if ([301, 302, 303].includes(response.status))
|
|
158
|
+
throw new RegistryError("Publish registry returned an unsafe method-changing redirect", response.status);
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
const detail = await boundedError(response);
|
|
161
|
+
throw new RegistryError(`Publish of ${options.artifact.id} failed with ${response.status}${detail ? `: ${detail}` : ""}`, response.status);
|
|
162
|
+
}
|
|
163
|
+
let stageId;
|
|
164
|
+
if (options.stage && response.body) {
|
|
165
|
+
const chunks = [];
|
|
166
|
+
let size = 0;
|
|
167
|
+
for await (const value of response.body) {
|
|
168
|
+
const chunk = Buffer.from(value);
|
|
169
|
+
size += chunk.length;
|
|
170
|
+
if (size > 1024 * 1024)
|
|
171
|
+
throw new RegistryError("Staged publish response exceeded 1 MiB");
|
|
172
|
+
chunks.push(chunk);
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
176
|
+
stageId = typeof value.stageId === "string" ? value.stageId : typeof value.id === "string" ? value.id : undefined;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
throw new RegistryError("Staged publish returned invalid JSON");
|
|
180
|
+
}
|
|
181
|
+
if (!stageId)
|
|
182
|
+
throw new RegistryError("Staged publish response has no stage id");
|
|
183
|
+
}
|
|
184
|
+
const tlog = provenance ? transparencyLogUrl(provenance) : undefined;
|
|
185
|
+
return { registry: registry.href, tag, ...(access === undefined ? {} : { access }), status: response.status, provenance: provenance !== undefined, ...(tlog === undefined ? {} : { transparencyLogUrl: tlog }), ...(stageId === undefined ? {} : { stageId }) };
|
|
186
|
+
}
|
|
187
|
+
throw new RegistryError("Publish request exceeded the redirect limit");
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/package/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function trustedPublishingToken(options: {
|
|
2
|
+
readonly packageName: string;
|
|
3
|
+
readonly registry: URL;
|
|
4
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
5
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
6
|
+
readonly signal?: AbortSignal;
|
|
7
|
+
}): Promise<string | undefined>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import npa from "npm-package-arg";
|
|
2
|
+
const maxResponseBytes = 1024 * 1024;
|
|
3
|
+
function requestSignal(signal) {
|
|
4
|
+
const timeout = AbortSignal.timeout(30_000);
|
|
5
|
+
return signal === undefined ? timeout : AbortSignal.any([signal, timeout]);
|
|
6
|
+
}
|
|
7
|
+
async function boundedJson(response) {
|
|
8
|
+
if (!response.body)
|
|
9
|
+
return undefined;
|
|
10
|
+
const chunks = [];
|
|
11
|
+
let size = 0;
|
|
12
|
+
for await (const value of response.body) {
|
|
13
|
+
const chunk = Buffer.from(value);
|
|
14
|
+
size += chunk.length;
|
|
15
|
+
if (size > maxResponseBytes)
|
|
16
|
+
return undefined;
|
|
17
|
+
chunks.push(chunk);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
21
|
+
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed : undefined;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function supportedCi(environment) {
|
|
28
|
+
return environment.GITHUB_ACTIONS === "true" || environment.GITLAB_CI === "true" || environment.CIRCLECI === "true";
|
|
29
|
+
}
|
|
30
|
+
async function githubIdToken(registry, environment, request, signal) {
|
|
31
|
+
const rawUrl = environment.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
32
|
+
const requestToken = environment.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
33
|
+
if (!rawUrl || !requestToken)
|
|
34
|
+
return undefined;
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(rawUrl);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
if (url.protocol !== "https:" || url.username || url.password || url.hash)
|
|
43
|
+
return undefined;
|
|
44
|
+
url.searchParams.set("audience", `npm:${registry.hostname}`);
|
|
45
|
+
const response = await request(url, {
|
|
46
|
+
redirect: "error",
|
|
47
|
+
signal: requestSignal(signal),
|
|
48
|
+
headers: { accept: "application/json", authorization: `Bearer ${requestToken}` },
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok)
|
|
51
|
+
return undefined;
|
|
52
|
+
const body = await boundedJson(response);
|
|
53
|
+
return typeof body?.value === "string" && body.value.length > 0 ? body.value : undefined;
|
|
54
|
+
}
|
|
55
|
+
export async function trustedPublishingToken(options) {
|
|
56
|
+
const environment = options.environment ?? process.env;
|
|
57
|
+
if (!supportedCi(environment))
|
|
58
|
+
return undefined;
|
|
59
|
+
const request = options.fetch ?? globalThis.fetch;
|
|
60
|
+
try {
|
|
61
|
+
const idToken = environment.NPM_ID_TOKEN ?? (environment.GITHUB_ACTIONS === "true"
|
|
62
|
+
? await githubIdToken(options.registry, environment, request, options.signal)
|
|
63
|
+
: undefined);
|
|
64
|
+
if (!idToken)
|
|
65
|
+
return undefined;
|
|
66
|
+
const parsed = npa(options.packageName);
|
|
67
|
+
const escapedName = "escapedName" in parsed && typeof parsed.escapedName === "string" ? parsed.escapedName : encodeURIComponent(options.packageName);
|
|
68
|
+
const endpoint = new URL(`/-/npm/v1/oidc/token/exchange/package/${escapedName}`, options.registry);
|
|
69
|
+
const response = await request(endpoint, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
redirect: "error",
|
|
72
|
+
signal: requestSignal(options.signal),
|
|
73
|
+
headers: { accept: "application/json", authorization: `Bearer ${idToken}` },
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok)
|
|
76
|
+
return undefined;
|
|
77
|
+
const body = await boundedJson(response);
|
|
78
|
+
return typeof body?.token === "string" && body.token.length > 0 ? body.token : undefined;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=trusted-publishing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-publishing.js","sourceRoot":"","sources":["../../../src/package/trusted-publishing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-error.js","sourceRoot":"","sources":["../../../src/project/dependency-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class DevEnginesError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function checkDevEngines(cwd: string, options?: {
|
|
5
|
+
readonly packageManagerVersion?: string;
|
|
6
|
+
readonly platform?: string;
|
|
7
|
+
readonly architecture?: string;
|
|
8
|
+
readonly libc?: string;
|
|
9
|
+
readonly nodeVersion?: string;
|
|
10
|
+
}): Promise<readonly string[]>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
import packageMetadata from "../../package.json" with { type: "json" };
|
|
5
|
+
import { parseManifest } from "./manifest.js";
|
|
6
|
+
export class DevEnginesError extends Error {
|
|
7
|
+
constructor(message) { super(`devEngines: ${message}`); this.name = "DevEnginesError"; }
|
|
8
|
+
}
|
|
9
|
+
function entries(value, key) {
|
|
10
|
+
const raw = Array.isArray(value) ? value : [value];
|
|
11
|
+
if (raw.length === 0)
|
|
12
|
+
throw new DevEnginesError(`${key} must not be an empty array`);
|
|
13
|
+
return raw.map((item) => {
|
|
14
|
+
if (typeof item !== "object" || item === null || Array.isArray(item))
|
|
15
|
+
throw new DevEnginesError(`${key} must be an object or array of objects`);
|
|
16
|
+
const record = item;
|
|
17
|
+
if (typeof record.name !== "string" || !record.name || record.name.includes("\0"))
|
|
18
|
+
throw new DevEnginesError(`${key}.name must be a non-empty string`);
|
|
19
|
+
if (record.version !== undefined && (typeof record.version !== "string" || semver.validRange(record.version) === null))
|
|
20
|
+
throw new DevEnginesError(`${key}.version must be a semantic version range`);
|
|
21
|
+
if (record.onFail !== undefined && !["error", "warn", "ignore"].includes(String(record.onFail)))
|
|
22
|
+
throw new DevEnginesError(`${key}.onFail must be error, warn, or ignore`);
|
|
23
|
+
return { name: record.name, ...(typeof record.version === "string" ? { version: record.version } : {}), onFail: (record.onFail ?? "error") };
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function runtimeLibc() {
|
|
27
|
+
if (process.platform !== "linux")
|
|
28
|
+
return undefined;
|
|
29
|
+
const report = process.report?.getReport();
|
|
30
|
+
if (typeof report?.header?.glibcVersionRuntime === "string")
|
|
31
|
+
return "glibc";
|
|
32
|
+
return report?.sharedObjects?.some((value) => /(?:^|[\\/])(?:libc\.musl|ld-musl)/.test(value)) ? "musl" : undefined;
|
|
33
|
+
}
|
|
34
|
+
export async function checkDevEngines(cwd, options = {}) {
|
|
35
|
+
const path = join(cwd, "package.json");
|
|
36
|
+
const bytes = await readFile(path, "utf8");
|
|
37
|
+
parseManifest(bytes, path);
|
|
38
|
+
const raw = JSON.parse(bytes);
|
|
39
|
+
if (raw.devEngines === undefined)
|
|
40
|
+
return [];
|
|
41
|
+
if (typeof raw.devEngines !== "object" || raw.devEngines === null || Array.isArray(raw.devEngines))
|
|
42
|
+
throw new DevEnginesError("must be an object");
|
|
43
|
+
const configured = raw.devEngines;
|
|
44
|
+
const supported = new Set(["cpu", "os", "libc", "runtime", "packageManager"]);
|
|
45
|
+
for (const key of Object.keys(configured))
|
|
46
|
+
if (!supported.has(key))
|
|
47
|
+
throw new DevEnginesError(`unsupported key ${key}`);
|
|
48
|
+
const libc = options.libc ?? runtimeLibc();
|
|
49
|
+
const environment = {
|
|
50
|
+
cpu: { name: options.architecture ?? process.arch }, os: { name: options.platform ?? process.platform }, libc: libc === undefined ? {} : { name: libc },
|
|
51
|
+
runtime: { name: "node", version: options.nodeVersion ?? process.versions.node }, packageManager: { name: "bnpm", version: options.packageManagerVersion ?? packageMetadata.version },
|
|
52
|
+
};
|
|
53
|
+
const warnings = [];
|
|
54
|
+
for (const key of [...supported].sort()) {
|
|
55
|
+
if (configured[key] === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
const expected = entries(configured[key], key);
|
|
58
|
+
const actual = environment[key] ?? {};
|
|
59
|
+
const matches = expected.some((entry) => entry.name === actual.name && (entry.version === undefined || (actual.version !== undefined && semver.satisfies(actual.version, entry.version))));
|
|
60
|
+
if (matches)
|
|
61
|
+
continue;
|
|
62
|
+
const message = `${key} requires ${expected.map((entry) => `${entry.name}${entry.version ? `@${entry.version}` : ""}`).join(" or ")}, current ${actual.name ?? "unknown"}${actual.version ? `@${actual.version}` : ""}`;
|
|
63
|
+
if (expected.some((entry) => entry.onFail === "error"))
|
|
64
|
+
throw new DevEnginesError(message);
|
|
65
|
+
if (expected.some((entry) => entry.onFail === "warn"))
|
|
66
|
+
warnings.push(message);
|
|
67
|
+
}
|
|
68
|
+
return warnings;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=dev-engines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-engines.js","sourceRoot":"","sources":["../../../src/project/dev-engines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import { dirname, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { parseManifest } from "./manifest.js";
|
|
4
|
+
async function manifestAt(root) {
|
|
5
|
+
try {
|
|
6
|
+
const path = resolve(root, "package.json");
|
|
7
|
+
const manifest = parseManifest(await readFile(path, "utf8"), path);
|
|
8
|
+
return { root, workspaces: manifest.workspaces };
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (error.code === "ENOENT")
|
|
12
|
+
return undefined;
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function workspacePatternMatches(pattern, importerPath) {
|
|
17
|
+
const normalizedPattern = pattern.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
18
|
+
const normalizedPath = importerPath.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
19
|
+
const expression = new RegExp(`^${normalizedPattern
|
|
20
|
+
.split("*")
|
|
21
|
+
.map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
|
|
22
|
+
.join("[^/]*")}$`);
|
|
23
|
+
return expression.test(normalizedPath);
|
|
24
|
+
}
|
|
25
|
+
export async function discoverProject(cwd) {
|
|
26
|
+
let current = await realpath(cwd);
|
|
27
|
+
const manifests = [];
|
|
28
|
+
while (true) {
|
|
29
|
+
const manifest = await manifestAt(current);
|
|
30
|
+
if (manifest)
|
|
31
|
+
manifests.push(manifest);
|
|
32
|
+
const parent = dirname(current);
|
|
33
|
+
if (parent === current)
|
|
34
|
+
break;
|
|
35
|
+
current = parent;
|
|
36
|
+
}
|
|
37
|
+
const importer = manifests[0];
|
|
38
|
+
if (!importer)
|
|
39
|
+
return undefined;
|
|
40
|
+
if (importer.workspaces.length > 0) {
|
|
41
|
+
return { projectRoot: importer.root, importerRoot: importer.root, kind: "project" };
|
|
42
|
+
}
|
|
43
|
+
for (const workspace of manifests.slice(1)) {
|
|
44
|
+
const importerPath = relative(workspace.root, importer.root).split(sep).join("/");
|
|
45
|
+
if (workspace.workspaces.some((pattern) => workspacePatternMatches(pattern, importerPath))) {
|
|
46
|
+
return { projectRoot: workspace.root, importerRoot: importer.root, kind: "workspace" };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { projectRoot: importer.root, importerRoot: importer.root, kind: "project" };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/project/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { lstat, mkdir, readlink, rename, rm, symlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
export async function ensureGlobalProject(paths) {
|
|
5
|
+
await mkdir(paths.globalRoot, { recursive: true, mode: 0o755 });
|
|
6
|
+
const manifest = join(paths.globalRoot, "package.json");
|
|
7
|
+
try {
|
|
8
|
+
await writeFile(manifest, '{\n "name": "bnpm-global",\n "private": true,\n "dependencies": {}\n}\n', { encoding: "utf8", mode: 0o644, flag: "wx" });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (error.code !== "EEXIST")
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function exposeGlobalBins(paths) {
|
|
16
|
+
const target = join(paths.globalRoot, "node_modules", ".bin");
|
|
17
|
+
await mkdir(target, { recursive: true, mode: 0o755 });
|
|
18
|
+
await mkdir(dirname(paths.globalBin), { recursive: true, mode: 0o755 });
|
|
19
|
+
try {
|
|
20
|
+
const existing = await lstat(paths.globalBin);
|
|
21
|
+
if (existing.isSymbolicLink()) {
|
|
22
|
+
const linked = await readlink(paths.globalBin);
|
|
23
|
+
if (resolve(dirname(paths.globalBin), linked) === target)
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (existing.isDirectory() && process.platform === "win32")
|
|
27
|
+
return;
|
|
28
|
+
throw new Error(`Global bin path already exists and is not managed by bnpm: ${paths.globalBin}`);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error.code !== "ENOENT")
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
const temporary = `${paths.globalBin}.${randomUUID()}.tmp`;
|
|
35
|
+
try {
|
|
36
|
+
await symlink(process.platform === "win32" ? target : relative(dirname(temporary), target), temporary, process.platform === "win32" ? "junction" : "dir");
|
|
37
|
+
await rename(temporary, paths.globalBin);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await rm(temporary, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/project/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAgB;IACxD,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,4EAA4E,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACtE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAgB;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM;gBAAE,OAAO;QACnE,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO;QACnE,MAAM,IAAI,KAAK,CAAC,8DAA8D,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACnG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,UAAU,EAAE,MAAM,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1J,MAAM,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function invalidateInstalledLayout(projectRoot: string, reason: string): Promise<void>;
|
|
2
|
+
export declare function installedLayoutIsInvalidated(projectRoot: string): Promise<boolean>;
|
|
3
|
+
export declare function clearInstalledLayoutInvalidation(projectRoot: string): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { access, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const marker = ".bnpm-install-invalidated";
|
|
4
|
+
export async function invalidateInstalledLayout(projectRoot, reason) {
|
|
5
|
+
await writeFile(join(projectRoot, marker), `${JSON.stringify({ version: 1, reason })}\n`, { mode: 0o600 });
|
|
6
|
+
}
|
|
7
|
+
export async function installedLayoutIsInvalidated(projectRoot) {
|
|
8
|
+
try {
|
|
9
|
+
await access(join(projectRoot, marker));
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error.code === "ENOENT")
|
|
14
|
+
return false;
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function clearInstalledLayoutInvalidation(projectRoot) {
|
|
19
|
+
await rm(join(projectRoot, marker), { force: true });
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=invalidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation.js","sourceRoot":"","sources":["../../../src/project/invalidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,2BAA2B,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,WAAmB,EAAE,MAAc;IACjF,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,WAAmB;IACpE,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC7D,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACtG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,WAAmB;IACxE,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type BnpmPaths } from "../config/paths.js";
|
|
2
|
+
export declare function registerLink(options: {
|
|
3
|
+
readonly cwd: string;
|
|
4
|
+
readonly paths?: BnpmPaths;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly target: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function linkPackages(options: {
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly names: readonly string[];
|
|
12
|
+
readonly paths?: BnpmPaths;
|
|
13
|
+
}): Promise<readonly {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly target: string;
|
|
16
|
+
}[]>;
|
|
17
|
+
export declare function unregisterLink(options: {
|
|
18
|
+
readonly cwd: string;
|
|
19
|
+
readonly names: readonly string[];
|
|
20
|
+
readonly paths?: BnpmPaths;
|
|
21
|
+
}): Promise<readonly string[]>;
|