@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.
Files changed (204) hide show
  1. package/README.md +83 -0
  2. package/dist/package.json +45 -0
  3. package/dist/src/cache/archive.d.ts +15 -0
  4. package/dist/src/cache/archive.js +163 -0
  5. package/dist/src/cache/archive.js.map +1 -0
  6. package/dist/src/cache/commands.d.ts +15 -0
  7. package/dist/src/cache/commands.js +168 -0
  8. package/dist/src/cache/commands.js.map +1 -0
  9. package/dist/src/cache/quarantine.d.ts +18 -0
  10. package/dist/src/cache/quarantine.js +104 -0
  11. package/dist/src/cache/quarantine.js.map +1 -0
  12. package/dist/src/cache/store.d.ts +10 -0
  13. package/dist/src/cache/store.js +155 -0
  14. package/dist/src/cache/store.js.map +1 -0
  15. package/dist/src/cli.d.ts +2 -0
  16. package/dist/src/cli.js +4 -0
  17. package/dist/src/cli.js.map +1 -0
  18. package/dist/src/commands/diff.d.ts +34 -0
  19. package/dist/src/commands/diff.js +223 -0
  20. package/dist/src/commands/diff.js.map +1 -0
  21. package/dist/src/commands/doctor.d.ts +14 -0
  22. package/dist/src/commands/doctor.js +42 -0
  23. package/dist/src/commands/doctor.js.map +1 -0
  24. package/dist/src/commands/edit.d.ts +12 -0
  25. package/dist/src/commands/edit.js +100 -0
  26. package/dist/src/commands/edit.js.map +1 -0
  27. package/dist/src/commands/fund.d.ts +10 -0
  28. package/dist/src/commands/fund.js +32 -0
  29. package/dist/src/commands/fund.js.map +1 -0
  30. package/dist/src/commands/graph.d.ts +29 -0
  31. package/dist/src/commands/graph.js +90 -0
  32. package/dist/src/commands/graph.js.map +1 -0
  33. package/dist/src/commands/index.d.ts +20 -0
  34. package/dist/src/commands/index.js +1753 -0
  35. package/dist/src/commands/index.js.map +1 -0
  36. package/dist/src/commands/navigation.d.ts +2 -0
  37. package/dist/src/commands/navigation.js +47 -0
  38. package/dist/src/commands/navigation.js.map +1 -0
  39. package/dist/src/commands/outdated.d.ts +17 -0
  40. package/dist/src/commands/outdated.js +69 -0
  41. package/dist/src/commands/outdated.js.map +1 -0
  42. package/dist/src/commands/process.d.ts +11 -0
  43. package/dist/src/commands/process.js +189 -0
  44. package/dist/src/commands/process.js.map +1 -0
  45. package/dist/src/commands/prompts.d.ts +6 -0
  46. package/dist/src/commands/prompts.js +86 -0
  47. package/dist/src/commands/prompts.js.map +1 -0
  48. package/dist/src/commands/query.d.ts +48 -0
  49. package/dist/src/commands/query.js +639 -0
  50. package/dist/src/commands/query.js.map +1 -0
  51. package/dist/src/commands/rebuild.d.ts +16 -0
  52. package/dist/src/commands/rebuild.js +44 -0
  53. package/dist/src/commands/rebuild.js.map +1 -0
  54. package/dist/src/commands/sbom.d.ts +6 -0
  55. package/dist/src/commands/sbom.js +31 -0
  56. package/dist/src/commands/sbom.js.map +1 -0
  57. package/dist/src/commands/script-approvals.d.ts +22 -0
  58. package/dist/src/commands/script-approvals.js +128 -0
  59. package/dist/src/commands/script-approvals.js.map +1 -0
  60. package/dist/src/commands/shrinkwrap.d.ts +6 -0
  61. package/dist/src/commands/shrinkwrap.js +97 -0
  62. package/dist/src/commands/shrinkwrap.js.map +1 -0
  63. package/dist/src/commands/stage.d.ts +20 -0
  64. package/dist/src/commands/stage.js +40 -0
  65. package/dist/src/commands/stage.js.map +1 -0
  66. package/dist/src/commands/token.d.ts +2 -0
  67. package/dist/src/commands/token.js +47 -0
  68. package/dist/src/commands/token.js.map +1 -0
  69. package/dist/src/commands/trust.d.ts +5 -0
  70. package/dist/src/commands/trust.js +41 -0
  71. package/dist/src/commands/trust.js.map +1 -0
  72. package/dist/src/config/commands.d.ts +5 -0
  73. package/dist/src/config/commands.js +91 -0
  74. package/dist/src/config/commands.js.map +1 -0
  75. package/dist/src/config/configuration.d.ts +40 -0
  76. package/dist/src/config/configuration.js +157 -0
  77. package/dist/src/config/configuration.js.map +1 -0
  78. package/dist/src/config/interactive.d.ts +16 -0
  79. package/dist/src/config/interactive.js +19 -0
  80. package/dist/src/config/interactive.js.map +1 -0
  81. package/dist/src/config/paths.d.ts +22 -0
  82. package/dist/src/config/paths.js +46 -0
  83. package/dist/src/config/paths.js.map +1 -0
  84. package/dist/src/config/types.d.ts +15 -0
  85. package/dist/src/config/types.js +6 -0
  86. package/dist/src/config/types.js.map +1 -0
  87. package/dist/src/core/cli-parser.d.ts +102 -0
  88. package/dist/src/core/cli-parser.js +1148 -0
  89. package/dist/src/core/cli-parser.js.map +1 -0
  90. package/dist/src/core/cli-runner.d.ts +15 -0
  91. package/dist/src/core/cli-runner.js +261 -0
  92. package/dist/src/core/cli-runner.js.map +1 -0
  93. package/dist/src/core/exit-codes.d.ts +13 -0
  94. package/dist/src/core/exit-codes.js +13 -0
  95. package/dist/src/core/exit-codes.js.map +1 -0
  96. package/dist/src/core/output.d.ts +23 -0
  97. package/dist/src/core/output.js +123 -0
  98. package/dist/src/core/output.js.map +1 -0
  99. package/dist/src/installer/install.d.ts +73 -0
  100. package/dist/src/installer/install.js +596 -0
  101. package/dist/src/installer/install.js.map +1 -0
  102. package/dist/src/installer/mutations.d.ts +5 -0
  103. package/dist/src/installer/mutations.js +160 -0
  104. package/dist/src/installer/mutations.js.map +1 -0
  105. package/dist/src/linker/project-linker.d.ts +9 -0
  106. package/dist/src/linker/project-linker.js +223 -0
  107. package/dist/src/linker/project-linker.js.map +1 -0
  108. package/dist/src/lockfile/index.d.ts +27 -0
  109. package/dist/src/lockfile/index.js +221 -0
  110. package/dist/src/lockfile/index.js.map +1 -0
  111. package/dist/src/package/authoring.d.ts +31 -0
  112. package/dist/src/package/authoring.js +125 -0
  113. package/dist/src/package/authoring.js.map +1 -0
  114. package/dist/src/package/pack.d.ts +22 -0
  115. package/dist/src/package/pack.js +238 -0
  116. package/dist/src/package/pack.js.map +1 -0
  117. package/dist/src/package/provenance.d.ts +28 -0
  118. package/dist/src/package/provenance.js +162 -0
  119. package/dist/src/package/provenance.js.map +1 -0
  120. package/dist/src/package/publish.d.ts +28 -0
  121. package/dist/src/package/publish.js +189 -0
  122. package/dist/src/package/publish.js.map +1 -0
  123. package/dist/src/package/trusted-publishing.d.ts +7 -0
  124. package/dist/src/package/trusted-publishing.js +84 -0
  125. package/dist/src/package/trusted-publishing.js.map +1 -0
  126. package/dist/src/project/dependency-error.d.ts +3 -0
  127. package/dist/src/project/dependency-error.js +7 -0
  128. package/dist/src/project/dependency-error.js.map +1 -0
  129. package/dist/src/project/dev-engines.d.ts +10 -0
  130. package/dist/src/project/dev-engines.js +70 -0
  131. package/dist/src/project/dev-engines.js.map +1 -0
  132. package/dist/src/project/discovery.d.ts +6 -0
  133. package/dist/src/project/discovery.js +51 -0
  134. package/dist/src/project/discovery.js.map +1 -0
  135. package/dist/src/project/global.d.ts +3 -0
  136. package/dist/src/project/global.js +43 -0
  137. package/dist/src/project/global.js.map +1 -0
  138. package/dist/src/project/invalidation.d.ts +3 -0
  139. package/dist/src/project/invalidation.js +21 -0
  140. package/dist/src/project/invalidation.js.map +1 -0
  141. package/dist/src/project/link.d.ts +21 -0
  142. package/dist/src/project/link.js +152 -0
  143. package/dist/src/project/link.js.map +1 -0
  144. package/dist/src/project/manifest.d.ts +27 -0
  145. package/dist/src/project/manifest.js +378 -0
  146. package/dist/src/project/manifest.js.map +1 -0
  147. package/dist/src/project/pkg.d.ts +5 -0
  148. package/dist/src/project/pkg.js +94 -0
  149. package/dist/src/project/pkg.js.map +1 -0
  150. package/dist/src/project/recovery.d.ts +2 -0
  151. package/dist/src/project/recovery.js +82 -0
  152. package/dist/src/project/recovery.js.map +1 -0
  153. package/dist/src/project/workspaces.d.ts +4 -0
  154. package/dist/src/project/workspaces.js +59 -0
  155. package/dist/src/project/workspaces.js.map +1 -0
  156. package/dist/src/registry/account.d.ts +79 -0
  157. package/dist/src/registry/account.js +305 -0
  158. package/dist/src/registry/account.js.map +1 -0
  159. package/dist/src/registry/audit.d.ts +18 -0
  160. package/dist/src/registry/audit.js +74 -0
  161. package/dist/src/registry/audit.js.map +1 -0
  162. package/dist/src/registry/client.d.ts +19 -0
  163. package/dist/src/registry/client.js +102 -0
  164. package/dist/src/registry/client.js.map +1 -0
  165. package/dist/src/registry/configuration.d.ts +36 -0
  166. package/dist/src/registry/configuration.js +133 -0
  167. package/dist/src/registry/configuration.js.map +1 -0
  168. package/dist/src/registry/operations.d.ts +163 -0
  169. package/dist/src/registry/operations.js +502 -0
  170. package/dist/src/registry/operations.js.map +1 -0
  171. package/dist/src/registry/types.d.ts +30 -0
  172. package/dist/src/registry/types.js +2 -0
  173. package/dist/src/registry/types.js.map +1 -0
  174. package/dist/src/resolver/registry-resolver.d.ts +40 -0
  175. package/dist/src/resolver/registry-resolver.js +354 -0
  176. package/dist/src/resolver/registry-resolver.js.map +1 -0
  177. package/dist/src/resolver/source-provider.d.ts +17 -0
  178. package/dist/src/resolver/source-provider.js +336 -0
  179. package/dist/src/resolver/source-provider.js.map +1 -0
  180. package/dist/src/resolver/types.d.ts +28 -0
  181. package/dist/src/resolver/types.js +2 -0
  182. package/dist/src/resolver/types.js.map +1 -0
  183. package/dist/src/security/analyzer.d.ts +38 -0
  184. package/dist/src/security/analyzer.js +241 -0
  185. package/dist/src/security/analyzer.js.map +1 -0
  186. package/dist/src/security/audit.d.ts +19 -0
  187. package/dist/src/security/audit.js +61 -0
  188. package/dist/src/security/audit.js.map +1 -0
  189. package/dist/src/security/findings.d.ts +23 -0
  190. package/dist/src/security/findings.js +2 -0
  191. package/dist/src/security/findings.js.map +1 -0
  192. package/dist/src/security/integrity.d.ts +14 -0
  193. package/dist/src/security/integrity.js +40 -0
  194. package/dist/src/security/integrity.js.map +1 -0
  195. package/dist/src/security/policy.d.ts +16 -0
  196. package/dist/src/security/policy.js +24 -0
  197. package/dist/src/security/policy.js.map +1 -0
  198. package/dist/src/security/recent-release.d.ts +19 -0
  199. package/dist/src/security/recent-release.js +27 -0
  200. package/dist/src/security/recent-release.js.map +1 -0
  201. package/dist/src/security/script-runner.d.ts +13 -0
  202. package/dist/src/security/script-runner.js +73 -0
  203. package/dist/src/security/script-runner.js.map +1 -0
  204. package/package.json +45 -0
@@ -0,0 +1,47 @@
1
+ import npa from "npm-package-arg";
2
+ import { RegistryError } from "../registry/client.js";
3
+ function packageName(value) {
4
+ let parsed;
5
+ try {
6
+ parsed = npa(value);
7
+ }
8
+ catch {
9
+ throw new RegistryError(`Invalid token package ${value}`);
10
+ }
11
+ if (!parsed.name || parsed.rawSpec !== "*" || parsed.type !== "range")
12
+ throw new RegistryError(`Token package must be an exact package name: ${value}`);
13
+ return parsed.name;
14
+ }
15
+ function ipv4Cidr(value) {
16
+ const match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,2})$/.exec(value);
17
+ if (!match || match.slice(1, 5).some((part) => Number(part) > 255) || Number(match[5]) > 32)
18
+ throw new RegistryError(`Invalid IPv4 CIDR ${value}`);
19
+ return value;
20
+ }
21
+ export function tokenCreationBody(options) {
22
+ if (options.tokenName !== undefined && (!options.tokenName.trim() || options.tokenName.length > 128))
23
+ throw new RegistryError("Token name must contain 1-128 characters");
24
+ if (options.tokenDescription !== undefined && options.tokenDescription.length > 1024)
25
+ throw new RegistryError("Token description exceeds 1024 characters");
26
+ const scopes = (options.tokenScopes ?? []).map((value) => value.replace(/^@/, ""));
27
+ const organizations = options.tokenOrganizations ?? [];
28
+ if (scopes.some((value) => !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)))
29
+ throw new RegistryError("Token scopes must be exact scope names");
30
+ if (organizations.some((value) => !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)))
31
+ throw new RegistryError("Token organizations must be exact organization names");
32
+ return {
33
+ ...(options.tokenName === undefined ? {} : { name: options.tokenName }),
34
+ ...(options.tokenDescription === undefined ? {} : { description: options.tokenDescription }),
35
+ ...(options.tokenExpires === undefined ? {} : { expires: options.tokenExpires }),
36
+ ...(options.tokenPackages === undefined ? {} : { packages: options.tokenPackages.map(packageName) }),
37
+ ...(options.tokenPackagesAll ? { packages_all: true } : {}),
38
+ ...(scopes.length === 0 ? {} : { scopes }),
39
+ ...(organizations.length === 0 ? {} : { orgs: organizations }),
40
+ ...(options.tokenPackagesPermission === undefined ? {} : { packages_and_scopes_permission: options.tokenPackagesPermission }),
41
+ ...(options.tokenOrganizationsPermission === undefined ? {} : { orgs_permission: options.tokenOrganizationsPermission }),
42
+ ...(options.tokenCidrs === undefined ? {} : { cidr_whitelist: options.tokenCidrs.map(ipv4Cidr) }),
43
+ ...(options.tokenBypass2fa ? { bypass_2fa: true } : {}),
44
+ ...(options.tokenReadOnly ? { readonly: true } : {}),
45
+ };
46
+ }
47
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/commands/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CommandOptions } from "../core/cli-parser.js";
2
+ export declare class TrustError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export declare function trustConfiguration(provider: "github" | "gitlab" | "circleci", options: CommandOptions): Readonly<Record<string, unknown>>;
@@ -0,0 +1,41 @@
1
+ import { basename } from "node:path";
2
+ export class TrustError extends Error {
3
+ constructor(message) { super(message); this.name = "TrustError"; }
4
+ }
5
+ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
6
+ function yamlFile(value, provider) {
7
+ if (!value || basename(value) !== value || !/\.ya?ml$/i.test(value))
8
+ throw new TrustError(`${provider} trust requires a basename-only YAML file`);
9
+ return value;
10
+ }
11
+ function entity(value, provider) {
12
+ const parts = value?.split("/") ?? [];
13
+ if ((provider === "github" && parts.length !== 2) || (provider === "gitlab" && parts.length < 2) || parts.some((part) => !/^[A-Za-z0-9._-]+$/.test(part))) {
14
+ throw new TrustError(`${provider} trust requires ${provider === "github" ? "owner/repository" : "group/project"}`);
15
+ }
16
+ return parts.join("/");
17
+ }
18
+ function requiredUuid(value, field) {
19
+ if (!value || !uuid.test(value))
20
+ throw new TrustError(`${field} must be a UUID`);
21
+ return value;
22
+ }
23
+ export function trustConfiguration(provider, options) {
24
+ const permissions = [...(options.allowPublish ? ["createPackage"] : []), ...(options.allowStagePublish ? ["createStagedPackage"] : [])];
25
+ if (permissions.length === 0)
26
+ throw new TrustError("At least one trusted-publisher permission is required");
27
+ if (provider === "github") {
28
+ return { type: provider, claims: { repository: entity(options.trustRepository, provider), workflow_ref: { file: yamlFile(options.trustFile, provider) }, ...(options.trustEnvironment === undefined ? {} : { environment: options.trustEnvironment }) }, permissions };
29
+ }
30
+ if (provider === "gitlab") {
31
+ return { type: provider, claims: { project_path: entity(options.trustProject ?? options.trustRepository, provider), ci_config_ref_uri: { file: yamlFile(options.trustFile, provider) }, ...(options.trustEnvironment === undefined ? {} : { environment: options.trustEnvironment }) }, permissions };
32
+ }
33
+ const vcsOrigin = options.trustVcsOrigin;
34
+ if (!vcsOrigin || vcsOrigin.includes("://") || vcsOrigin.split("/").length < 3 || !/^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+){2,}$/.test(vcsOrigin))
35
+ throw new TrustError("CircleCI vcs-origin must use provider/owner/repository without a URL scheme");
36
+ const contexts = options.trustContextIds ?? [];
37
+ if (contexts.some((value) => !uuid.test(value)))
38
+ throw new TrustError("CircleCI context-id must be a UUID");
39
+ return { type: provider, claims: { "oidc.circleci.com/org-id": requiredUuid(options.trustOrganizationId, "org-id"), "oidc.circleci.com/project-id": requiredUuid(options.trustProjectId, "project-id"), "oidc.circleci.com/pipeline-definition-id": requiredUuid(options.trustPipelineDefinitionId, "pipeline-definition-id"), "oidc.circleci.com/vcs-origin": vcsOrigin, ...(contexts.length === 0 ? {} : { "oidc.circleci.com/context-ids": contexts }) }, permissions };
40
+ }
41
+ //# sourceMappingURL=trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../../../src/commands/trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { BnpmPaths } from "./paths.js";
2
+ export type WritableConfigKey = "registry" | "recentReleaseHours";
3
+ export declare function getConfig(paths: BnpmPaths, rawKey: string): Promise<string | number>;
4
+ export declare function listConfig(paths: BnpmPaths): Promise<Readonly<Record<WritableConfigKey, string | number>>>;
5
+ export declare function mutateConfig(paths: BnpmPaths, action: "set" | "delete", rawKey: string, value?: string): Promise<void>;
@@ -0,0 +1,91 @@
1
+ import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { randomBytes } from "node:crypto";
4
+ import YAML from "yaml";
5
+ import { ConfigError, loadConfigFile, parseConfig } from "./configuration.js";
6
+ import { defaultConfig, recentReleaseHours } from "./types.js";
7
+ import { loadRegistryConfiguration } from "../registry/configuration.js";
8
+ function key(value) {
9
+ if (value !== "registry" && value !== "recentReleaseHours")
10
+ throw new ConfigError(`unsupported writable key ${value}`);
11
+ return value;
12
+ }
13
+ async function optional(path) {
14
+ try {
15
+ return await readFile(path, "utf8");
16
+ }
17
+ catch (error) {
18
+ if (error.code === "ENOENT")
19
+ return "";
20
+ throw error;
21
+ }
22
+ }
23
+ async function atomic(path, bytes) {
24
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
25
+ const temporary = join(dirname(path), `.${process.pid}.${randomBytes(8).toString("hex")}.tmp`);
26
+ try {
27
+ await writeFile(temporary, bytes, { flag: "wx", mode: 0o600 });
28
+ await chmod(temporary, 0o600);
29
+ await rename(temporary, path);
30
+ await chmod(path, 0o600);
31
+ }
32
+ catch (error) {
33
+ await rm(temporary, { force: true });
34
+ throw error;
35
+ }
36
+ }
37
+ function validRegistry(value) {
38
+ let url;
39
+ try {
40
+ url = new URL(value);
41
+ }
42
+ catch {
43
+ throw new ConfigError("registry must be an absolute HTTPS URL");
44
+ }
45
+ if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash)
46
+ throw new ConfigError("registry must use HTTPS without credentials, query, or fragment");
47
+ if (!url.pathname.endsWith("/"))
48
+ url.pathname += "/";
49
+ return url.href;
50
+ }
51
+ async function setRegistry(path, value) {
52
+ const lines = (await optional(path)).split(/\r?\n/).filter((line) => !/^\s*registry\s*=/.test(line));
53
+ while (lines.at(-1) === "")
54
+ lines.pop();
55
+ if (value !== undefined)
56
+ lines.push(`registry=${validRegistry(value)}`);
57
+ await atomic(path, lines.length === 0 ? "" : `${lines.join("\n")}\n`);
58
+ }
59
+ async function setRecency(path, value) {
60
+ const current = await loadConfigFile(path) ?? {};
61
+ let hours;
62
+ if (value !== undefined) {
63
+ const number = Number(value);
64
+ if (!recentReleaseHours.includes(number))
65
+ throw new ConfigError("recentReleaseHours must be one of 1, 6, 24");
66
+ hours = number;
67
+ }
68
+ const next = { ...(hours === undefined ? {} : { recentReleaseHours: hours }), ...(current.trustedPackages === undefined ? {} : { trustedPackages: current.trustedPackages }) };
69
+ const bytes = Object.keys(next).length === 0 ? "" : YAML.stringify(next, { sortMapEntries: true });
70
+ parseConfig(bytes, path);
71
+ await atomic(path, bytes);
72
+ }
73
+ export async function getConfig(paths, rawKey) {
74
+ const selected = key(rawKey);
75
+ if (selected === "registry")
76
+ return (await loadRegistryConfiguration({ userNpmrc: paths.userNpmrc, projectNpmrc: paths.projectNpmrc })).defaultRegistry.href;
77
+ return (await loadConfigFile(paths.globalConfig))?.recentReleaseHours ?? defaultConfig.recentReleaseHours;
78
+ }
79
+ export async function listConfig(paths) {
80
+ return { registry: await getConfig(paths, "registry"), recentReleaseHours: await getConfig(paths, "recentReleaseHours") };
81
+ }
82
+ export async function mutateConfig(paths, action, rawKey, value) {
83
+ const selected = key(rawKey);
84
+ if (action === "set" && value === undefined)
85
+ throw new ConfigError(`config set ${selected} requires a value`);
86
+ if (selected === "registry")
87
+ await setRegistry(paths.userNpmrc, action === "set" ? value : undefined);
88
+ else
89
+ await setRecency(paths.globalConfig, action === "set" ? value : undefined);
90
+ }
91
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/config/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type RecentReleaseHours, type TrustedPackageApproval } from "./types.js";
2
+ import type { InteractiveMode } from "./interactive.js";
3
+ export declare class ConfigError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ export type ConfigSource = "default" | "global" | "project" | "environment" | "override";
7
+ export interface ConfigInput {
8
+ readonly recentReleaseHours?: RecentReleaseHours;
9
+ readonly trustedPackages?: Readonly<Record<string, TrustedPackageApproval>>;
10
+ }
11
+ export interface EffectiveValue<T> {
12
+ readonly value: T;
13
+ readonly source: ConfigSource;
14
+ }
15
+ export interface EffectiveConfig {
16
+ readonly recentReleaseHours: EffectiveValue<RecentReleaseHours>;
17
+ readonly trustedPackages: EffectiveValue<Readonly<Record<string, TrustedPackageApproval>>>;
18
+ readonly allowRecent: EffectiveValue<readonly string[]>;
19
+ }
20
+ export declare function parseConfig(bytes: string, source: string): ConfigInput;
21
+ export declare function loadConfigFile(path: string): Promise<ConfigInput | undefined>;
22
+ export declare function composeConfig(options: {
23
+ readonly global?: ConfigInput;
24
+ readonly project?: ConfigInput;
25
+ readonly environment?: ConfigInput;
26
+ readonly overrides?: {
27
+ readonly allowRecent?: readonly string[];
28
+ };
29
+ }): EffectiveConfig;
30
+ export interface RecencySetupOptions {
31
+ readonly commandIsSecuritySensitive: boolean;
32
+ readonly existingConfiguration: boolean;
33
+ readonly mode: InteractiveMode;
34
+ readonly configPath: string;
35
+ readonly prompt?: () => Promise<string | undefined>;
36
+ }
37
+ export declare function selectRecencyConfiguration(options: RecencySetupOptions): Promise<{
38
+ readonly hours: RecentReleaseHours;
39
+ readonly source: "default" | "first-use";
40
+ }>;
@@ -0,0 +1,157 @@
1
+ import { chmod, mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import YAML from "yaml";
5
+ import { defaultConfig, recentReleaseHours } from "./types.js";
6
+ export class ConfigError extends Error {
7
+ constructor(message) {
8
+ super(`Configuration error: ${message}`);
9
+ this.name = "ConfigError";
10
+ }
11
+ }
12
+ const packageName = /^(?:@[^/@\s]+\/)?[A-Za-z0-9][A-Za-z0-9._-]*$/;
13
+ const exactIdentity = /^(?:@[^/@\s]+\/)?[A-Za-z0-9][A-Za-z0-9._-]*@[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
14
+ function object(value, source, key) {
15
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
16
+ throw new ConfigError(`${source}: ${key} must be an object`);
17
+ }
18
+ return value;
19
+ }
20
+ function recentHours(value, source) {
21
+ if (typeof value !== "number" || !recentReleaseHours.includes(value)) {
22
+ throw new ConfigError(`${source}: recentReleaseHours must be one of 1, 6, 24`);
23
+ }
24
+ return value;
25
+ }
26
+ function approvals(value, source) {
27
+ const parsed = {};
28
+ for (const [name, approvalValue] of Object.entries(object(value, source, "trustedPackages"))) {
29
+ if (!packageName.test(name)) {
30
+ throw new ConfigError(`${source}: trustedPackages has invalid package name ${name}`);
31
+ }
32
+ const approval = object(approvalValue, source, `trustedPackages.${name}`);
33
+ if (typeof approval.version !== "string" || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(approval.version)) {
34
+ throw new ConfigError(`${source}: trustedPackages.${name}.version must be an exact semantic version`);
35
+ }
36
+ if (typeof approval.integrity !== "string" || approval.integrity.length === 0) {
37
+ throw new ConfigError(`${source}: trustedPackages.${name}.integrity must be a non-empty string`);
38
+ }
39
+ const scripts = object(approval.scripts, source, `trustedPackages.${name}.scripts`);
40
+ const parsedScripts = {};
41
+ for (const [stage, scriptValue] of Object.entries(scripts)) {
42
+ const script = object(scriptValue, source, `trustedPackages.${name}.scripts.${stage}`);
43
+ if (typeof script.commandHash !== "string" || script.commandHash.length === 0 || typeof script.contentHash !== "string" || script.contentHash.length === 0) {
44
+ throw new ConfigError(`${source}: trustedPackages.${name}.scripts.${stage} requires non-empty commandHash and contentHash`);
45
+ }
46
+ parsedScripts[stage] = { commandHash: script.commandHash, contentHash: script.contentHash };
47
+ }
48
+ parsed[name] = { version: approval.version, integrity: approval.integrity, scripts: parsedScripts };
49
+ }
50
+ return parsed;
51
+ }
52
+ export function parseConfig(bytes, source) {
53
+ const document = YAML.parseDocument(bytes, { uniqueKeys: true, strict: true });
54
+ if (document.errors.length > 0) {
55
+ throw new ConfigError(`${source}: ${document.errors[0]?.message ?? "invalid YAML"}`);
56
+ }
57
+ const value = document.toJS();
58
+ if (value === null || value === undefined) {
59
+ return {};
60
+ }
61
+ const parsed = object(value, source, "root");
62
+ const allowed = new Set(["recentReleaseHours", "trustedPackages"]);
63
+ for (const key of Object.keys(parsed)) {
64
+ if (!allowed.has(key)) {
65
+ throw new ConfigError(`${source}: unknown security-sensitive key ${key}`);
66
+ }
67
+ }
68
+ return {
69
+ ...(parsed.recentReleaseHours === undefined ? {} : { recentReleaseHours: recentHours(parsed.recentReleaseHours, source) }),
70
+ ...(parsed.trustedPackages === undefined ? {} : { trustedPackages: approvals(parsed.trustedPackages, source) }),
71
+ };
72
+ }
73
+ export async function loadConfigFile(path) {
74
+ try {
75
+ return parseConfig(await readFile(path, "utf8"), path);
76
+ }
77
+ catch (error) {
78
+ if (error.code === "ENOENT") {
79
+ return undefined;
80
+ }
81
+ throw error;
82
+ }
83
+ }
84
+ function sourceFor(input, source) {
85
+ return input?.recentReleaseHours === undefined ? "default" : source;
86
+ }
87
+ function validateExactOverrides(values) {
88
+ for (const value of values) {
89
+ if (!exactIdentity.test(value)) {
90
+ throw new ConfigError(`one-shot override must be an exact name@version identity: ${value}`);
91
+ }
92
+ }
93
+ return [...values];
94
+ }
95
+ export function composeConfig(options) {
96
+ const globalHours = options.global?.recentReleaseHours ?? defaultConfig.recentReleaseHours;
97
+ const projectHours = options.project?.recentReleaseHours;
98
+ if (projectHours !== undefined && projectHours < globalHours) {
99
+ throw new ConfigError("project recentReleaseHours cannot weaken global policy");
100
+ }
101
+ const projectEffective = projectHours ?? globalHours;
102
+ const environmentHours = options.environment?.recentReleaseHours;
103
+ if (environmentHours !== undefined && environmentHours < projectEffective) {
104
+ throw new ConfigError("environment recentReleaseHours cannot weaken effective policy");
105
+ }
106
+ const effectiveHours = environmentHours ?? projectEffective;
107
+ const trusted = { ...(options.global?.trustedPackages ?? {}), ...(options.project?.trustedPackages ?? {}) };
108
+ return {
109
+ recentReleaseHours: {
110
+ value: effectiveHours,
111
+ source: environmentHours !== undefined
112
+ ? "environment"
113
+ : projectHours !== undefined
114
+ ? "project"
115
+ : sourceFor(options.global, "global"),
116
+ },
117
+ trustedPackages: {
118
+ value: trusted,
119
+ source: options.project?.trustedPackages === undefined ? (options.global?.trustedPackages === undefined ? "default" : "global") : "project",
120
+ },
121
+ allowRecent: {
122
+ value: validateExactOverrides(options.overrides?.allowRecent ?? []),
123
+ source: options.overrides?.allowRecent === undefined ? "default" : "override",
124
+ },
125
+ };
126
+ }
127
+ async function saveRecencyConfiguration(path, hours) {
128
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
129
+ const temporary = join(dirname(path), `.${randomUUID()}.tmp`);
130
+ try {
131
+ await writeFile(temporary, `recentReleaseHours: ${hours}\n`, { encoding: "utf8", mode: 0o600, flag: "wx" });
132
+ await chmod(temporary, 0o600);
133
+ await rename(temporary, path);
134
+ await chmod(path, 0o600);
135
+ }
136
+ finally {
137
+ await import("node:fs/promises").then(({ rm }) => rm(temporary, { force: true }));
138
+ }
139
+ }
140
+ export async function selectRecencyConfiguration(options) {
141
+ if (!options.commandIsSecuritySensitive || options.existingConfiguration || !options.mode.interactive || options.prompt === undefined) {
142
+ return { hours: 1, source: "default" };
143
+ }
144
+ for (let attempts = 0; attempts < 3; attempts += 1) {
145
+ const response = await options.prompt();
146
+ if (response === undefined) {
147
+ return { hours: 1, source: "default" };
148
+ }
149
+ if (response === "1" || response === "6" || response === "24") {
150
+ const hours = Number(response);
151
+ await saveRecencyConfiguration(options.configPath, hours);
152
+ return { hours, source: "first-use" };
153
+ }
154
+ }
155
+ return { hours: 1, source: "default" };
156
+ }
157
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../../src/config/configuration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type NonInteractiveReason = "json" | "ci" | "stdin-not-tty" | "stderr-not-tty" | "prompt-unavailable";
2
+ export type InteractiveMode = {
3
+ readonly interactive: true;
4
+ readonly reason: "terminal";
5
+ } | {
6
+ readonly interactive: false;
7
+ readonly reason: NonInteractiveReason;
8
+ };
9
+ export interface InteractiveDetectionOptions {
10
+ readonly json: boolean;
11
+ readonly environment: Readonly<Record<string, string | undefined>>;
12
+ readonly stdinIsTTY: boolean | undefined;
13
+ readonly stderrIsTTY: boolean | undefined;
14
+ readonly promptAvailable: boolean;
15
+ }
16
+ export declare function detectInteractiveMode(options: InteractiveDetectionOptions): InteractiveMode;
@@ -0,0 +1,19 @@
1
+ export function detectInteractiveMode(options) {
2
+ if (options.json) {
3
+ return { interactive: false, reason: "json" };
4
+ }
5
+ if (options.environment.CI !== undefined && options.environment.CI !== "" && options.environment.CI !== "0") {
6
+ return { interactive: false, reason: "ci" };
7
+ }
8
+ if (options.stdinIsTTY !== true) {
9
+ return { interactive: false, reason: "stdin-not-tty" };
10
+ }
11
+ if (options.stderrIsTTY !== true) {
12
+ return { interactive: false, reason: "stderr-not-tty" };
13
+ }
14
+ if (!options.promptAvailable) {
15
+ return { interactive: false, reason: "prompt-unavailable" };
16
+ }
17
+ return { interactive: true, reason: "terminal" };
18
+ }
19
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../../src/config/interactive.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,qBAAqB,CAAC,OAAoC;IACxE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;QAC5G,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface PathEnvironment {
2
+ readonly home?: string;
3
+ readonly cwd?: string;
4
+ readonly temp?: string;
5
+ readonly environment?: Readonly<Record<string, string | undefined>>;
6
+ readonly platform?: NodeJS.Platform;
7
+ }
8
+ export interface BnpmPaths {
9
+ readonly globalConfig: string;
10
+ readonly userNpmrc: string;
11
+ readonly store: string;
12
+ readonly cache: string;
13
+ readonly quarantine: string;
14
+ readonly projectConfig: string;
15
+ readonly projectNpmrc: string;
16
+ readonly lockfile: string;
17
+ readonly virtualStore: string;
18
+ readonly ephemeralRoot: string;
19
+ readonly globalRoot: string;
20
+ readonly globalBin: string;
21
+ }
22
+ export declare function createBnpmPaths(options?: PathEnvironment): BnpmPaths;
@@ -0,0 +1,46 @@
1
+ import { join } from "node:path";
2
+ function required(value, name) {
3
+ if (!value) {
4
+ throw new Error(`${name} is required to resolve bnpm paths`);
5
+ }
6
+ return value;
7
+ }
8
+ export function createBnpmPaths(options = {}) {
9
+ const environment = options.environment ?? process.env;
10
+ const home = options.home ?? environment.HOME;
11
+ const cwd = options.cwd ?? process.cwd();
12
+ const temp = options.temp ?? environment.TMPDIR ?? environment.TEMP ?? "/tmp";
13
+ const platform = options.platform ?? process.platform;
14
+ const configHome = environment.BNPM_CONFIG_HOME ??
15
+ (platform === "darwin"
16
+ ? join(required(home, "HOME"), "Library", "Application Support", "bnpm")
17
+ : platform === "win32"
18
+ ? join(environment.APPDATA ?? join(required(home, "HOME"), "AppData", "Roaming"), "bnpm")
19
+ : join(required(home, "HOME"), ".config", "bnpm"));
20
+ const cacheHome = environment.BNPM_CACHE_HOME ??
21
+ (platform === "darwin"
22
+ ? join(required(home, "HOME"), "Library", "Caches", "bnpm")
23
+ : platform === "win32"
24
+ ? join(environment.LOCALAPPDATA ?? join(required(home, "HOME"), "AppData", "Local"), "bnpm")
25
+ : join(required(home, "HOME"), ".cache", "bnpm"));
26
+ const globalRoot = environment.BNPM_GLOBAL_HOME ?? (platform === "darwin"
27
+ ? join(required(home, "HOME"), "Library", "Application Support", "bnpm", "global")
28
+ : platform === "win32"
29
+ ? join(environment.LOCALAPPDATA ?? join(required(home, "HOME"), "AppData", "Local"), "bnpm", "global")
30
+ : join(environment.XDG_DATA_HOME ?? join(required(home, "HOME"), ".local", "share"), "bnpm", "global"));
31
+ return {
32
+ globalConfig: join(configHome, "config.yaml"),
33
+ userNpmrc: environment.NPM_CONFIG_USERCONFIG ?? join(required(home, "HOME"), ".npmrc"),
34
+ store: join(cacheHome, "store"),
35
+ cache: join(cacheHome, "cache"),
36
+ quarantine: join(cacheHome, "quarantine"),
37
+ projectConfig: join(cwd, "bnpm.yaml"),
38
+ projectNpmrc: join(cwd, ".npmrc"),
39
+ lockfile: join(cwd, "bnpm-lock.yaml"),
40
+ virtualStore: join(cwd, "node_modules", ".bnpm"),
41
+ ephemeralRoot: join(temp, "bnpmx"),
42
+ globalRoot,
43
+ globalBin: join(globalRoot, "bin"),
44
+ };
45
+ }
46
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const recentReleaseHours: readonly [1, 6, 24];
2
+ export type RecentReleaseHours = (typeof recentReleaseHours)[number];
3
+ export interface BnpmConfig {
4
+ recentReleaseHours: RecentReleaseHours;
5
+ trustedPackages: Readonly<Record<string, TrustedPackageApproval>>;
6
+ }
7
+ export interface TrustedPackageApproval {
8
+ version: string;
9
+ integrity: string;
10
+ scripts: Readonly<Record<string, {
11
+ commandHash: string;
12
+ contentHash: string;
13
+ }>>;
14
+ }
15
+ export declare const defaultConfig: BnpmConfig;
@@ -0,0 +1,6 @@
1
+ export const recentReleaseHours = [1, 6, 24];
2
+ export const defaultConfig = {
3
+ recentReleaseHours: 1,
4
+ trustedPackages: {},
5
+ };
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAU,CAAC;AActD,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,kBAAkB,EAAE,CAAC;IACrB,eAAe,EAAE,EAAE;CACpB,CAAC"}