@package-broker/cli 0.19.8 → 2.0.0-rc.2

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 (193) hide show
  1. package/LICENSE +661 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +12 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/build-artifacts.d.ts +27 -0
  8. package/dist/build-artifacts.d.ts.map +1 -0
  9. package/dist/build-artifacts.js +169 -0
  10. package/dist/build-artifacts.js.map +1 -0
  11. package/dist/build-assets.d.ts +36 -0
  12. package/dist/build-assets.d.ts.map +1 -0
  13. package/dist/build-assets.js +224 -0
  14. package/dist/build-assets.js.map +1 -0
  15. package/dist/build.d.ts +31 -0
  16. package/dist/build.d.ts.map +1 -0
  17. package/dist/build.js +277 -0
  18. package/dist/build.js.map +1 -0
  19. package/dist/cli.d.ts +2 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +828 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/cloudflare/d1-http-executor.d.ts +30 -0
  24. package/dist/cloudflare/d1-http-executor.d.ts.map +1 -0
  25. package/dist/cloudflare/d1-http-executor.js +230 -0
  26. package/dist/cloudflare/d1-http-executor.js.map +1 -0
  27. package/dist/cloudflare/d1-http-response.d.ts +4 -0
  28. package/dist/cloudflare/d1-http-response.d.ts.map +1 -0
  29. package/dist/cloudflare/d1-http-response.js +113 -0
  30. package/dist/cloudflare/d1-http-response.js.map +1 -0
  31. package/dist/commands/admin.d.ts +47 -0
  32. package/dist/commands/admin.d.ts.map +1 -0
  33. package/dist/commands/admin.js +447 -0
  34. package/dist/commands/admin.js.map +1 -0
  35. package/dist/commands/built-manifest.d.ts +13 -0
  36. package/dist/commands/built-manifest.d.ts.map +1 -0
  37. package/dist/commands/built-manifest.js +197 -0
  38. package/dist/commands/built-manifest.js.map +1 -0
  39. package/dist/commands/cloudflare/api.d.ts +132 -0
  40. package/dist/commands/cloudflare/api.d.ts.map +1 -0
  41. package/dist/commands/cloudflare/api.js +502 -0
  42. package/dist/commands/cloudflare/api.js.map +1 -0
  43. package/dist/commands/cloudflare/deploy.d.ts +111 -0
  44. package/dist/commands/cloudflare/deploy.d.ts.map +1 -0
  45. package/dist/commands/cloudflare/deploy.js +2170 -0
  46. package/dist/commands/cloudflare/deploy.js.map +1 -0
  47. package/dist/commands/cloudflare/inventory.d.ts +257 -0
  48. package/dist/commands/cloudflare/inventory.d.ts.map +1 -0
  49. package/dist/commands/cloudflare/inventory.js +842 -0
  50. package/dist/commands/cloudflare/inventory.js.map +1 -0
  51. package/dist/commands/cloudflare/janitor.d.ts +10 -0
  52. package/dist/commands/cloudflare/janitor.d.ts.map +1 -0
  53. package/dist/commands/cloudflare/janitor.js +84 -0
  54. package/dist/commands/cloudflare/janitor.js.map +1 -0
  55. package/dist/commands/cloudflare/migrations-check.d.ts +5 -0
  56. package/dist/commands/cloudflare/migrations-check.d.ts.map +1 -0
  57. package/dist/commands/cloudflare/migrations-check.js +10 -0
  58. package/dist/commands/cloudflare/migrations-check.js.map +1 -0
  59. package/dist/commands/cloudflare/providers-file.d.ts +17 -0
  60. package/dist/commands/cloudflare/providers-file.d.ts.map +1 -0
  61. package/dist/commands/cloudflare/providers-file.js +155 -0
  62. package/dist/commands/cloudflare/providers-file.js.map +1 -0
  63. package/dist/commands/cloudflare/provision.d.ts +79 -0
  64. package/dist/commands/cloudflare/provision.d.ts.map +1 -0
  65. package/dist/commands/cloudflare/provision.js +961 -0
  66. package/dist/commands/cloudflare/provision.js.map +1 -0
  67. package/dist/commands/cloudflare/queue-consumer.d.ts +4 -0
  68. package/dist/commands/cloudflare/queue-consumer.d.ts.map +1 -0
  69. package/dist/commands/cloudflare/queue-consumer.js +57 -0
  70. package/dist/commands/cloudflare/queue-consumer.js.map +1 -0
  71. package/dist/commands/cloudflare/routes.d.ts +3 -0
  72. package/dist/commands/cloudflare/routes.d.ts.map +1 -0
  73. package/dist/commands/cloudflare/routes.js +26 -0
  74. package/dist/commands/cloudflare/routes.js.map +1 -0
  75. package/dist/commands/cloudflare/setup.d.ts +50 -0
  76. package/dist/commands/cloudflare/setup.d.ts.map +1 -0
  77. package/dist/commands/cloudflare/setup.js +836 -0
  78. package/dist/commands/cloudflare/setup.js.map +1 -0
  79. package/dist/commands/cloudflare/smoke.d.ts +29 -0
  80. package/dist/commands/cloudflare/smoke.d.ts.map +1 -0
  81. package/dist/commands/cloudflare/smoke.js +701 -0
  82. package/dist/commands/cloudflare/smoke.js.map +1 -0
  83. package/dist/commands/cloudflare/teardown.d.ts +65 -0
  84. package/dist/commands/cloudflare/teardown.d.ts.map +1 -0
  85. package/dist/commands/cloudflare/teardown.js +984 -0
  86. package/dist/commands/cloudflare/teardown.js.map +1 -0
  87. package/dist/commands/cloudflare/worker-settings.d.ts +4 -0
  88. package/dist/commands/cloudflare/worker-settings.d.ts.map +1 -0
  89. package/dist/commands/cloudflare/worker-settings.js +93 -0
  90. package/dist/commands/cloudflare/worker-settings.js.map +1 -0
  91. package/dist/commands/cloudflare/zone.d.ts +3 -0
  92. package/dist/commands/cloudflare/zone.d.ts.map +1 -0
  93. package/dist/commands/cloudflare/zone.js +73 -0
  94. package/dist/commands/cloudflare/zone.js.map +1 -0
  95. package/dist/commands/cloudflare.d.ts +55 -0
  96. package/dist/commands/cloudflare.d.ts.map +1 -0
  97. package/dist/commands/cloudflare.js +393 -0
  98. package/dist/commands/cloudflare.js.map +1 -0
  99. package/dist/commands/import-cutover.d.ts +5 -0
  100. package/dist/commands/import-cutover.d.ts.map +1 -0
  101. package/dist/commands/import-cutover.js +25 -0
  102. package/dist/commands/import-cutover.js.map +1 -0
  103. package/dist/commands/import-private-packagist.d.ts +38 -0
  104. package/dist/commands/import-private-packagist.d.ts.map +1 -0
  105. package/dist/commands/import-private-packagist.js +232 -0
  106. package/dist/commands/import-private-packagist.js.map +1 -0
  107. package/dist/commands/import-satis.d.ts +11 -0
  108. package/dist/commands/import-satis.d.ts.map +1 -0
  109. package/dist/commands/import-satis.js +112 -0
  110. package/dist/commands/import-satis.js.map +1 -0
  111. package/dist/commands/import.d.ts +22 -0
  112. package/dist/commands/import.d.ts.map +1 -0
  113. package/dist/commands/import.js +343 -0
  114. package/dist/commands/import.js.map +1 -0
  115. package/dist/commands/openapi-specs.d.ts +4 -0
  116. package/dist/commands/openapi-specs.d.ts.map +1 -0
  117. package/dist/commands/openapi-specs.js +94 -0
  118. package/dist/commands/openapi-specs.js.map +1 -0
  119. package/dist/commands/openapi.d.ts +12 -0
  120. package/dist/commands/openapi.d.ts.map +1 -0
  121. package/dist/commands/openapi.js +44 -0
  122. package/dist/commands/openapi.js.map +1 -0
  123. package/dist/commands/source.d.ts +8 -0
  124. package/dist/commands/source.d.ts.map +1 -0
  125. package/dist/commands/source.js +61 -0
  126. package/dist/commands/source.js.map +1 -0
  127. package/dist/commands/sqlite.d.ts +11 -0
  128. package/dist/commands/sqlite.d.ts.map +1 -0
  129. package/dist/commands/sqlite.js +76 -0
  130. package/dist/commands/sqlite.js.map +1 -0
  131. package/dist/import/client.d.ts +71 -0
  132. package/dist/import/client.d.ts.map +1 -0
  133. package/dist/import/client.js +348 -0
  134. package/dist/import/client.js.map +1 -0
  135. package/dist/import/credential-refs.d.ts +2 -0
  136. package/dist/import/credential-refs.d.ts.map +1 -0
  137. package/dist/import/credential-refs.js +22 -0
  138. package/dist/import/credential-refs.js.map +1 -0
  139. package/dist/import/cutover.d.ts +64 -0
  140. package/dist/import/cutover.d.ts.map +1 -0
  141. package/dist/import/cutover.js +544 -0
  142. package/dist/import/cutover.js.map +1 -0
  143. package/dist/import/private-packagist/api.d.ts +57 -0
  144. package/dist/import/private-packagist/api.d.ts.map +1 -0
  145. package/dist/import/private-packagist/api.js +246 -0
  146. package/dist/import/private-packagist/api.js.map +1 -0
  147. package/dist/import/private-packagist/dates.d.ts +30 -0
  148. package/dist/import/private-packagist/dates.d.ts.map +1 -0
  149. package/dist/import/private-packagist/dates.js +189 -0
  150. package/dist/import/private-packagist/dates.js.map +1 -0
  151. package/dist/import/private-packagist/map.d.ts +48 -0
  152. package/dist/import/private-packagist/map.d.ts.map +1 -0
  153. package/dist/import/private-packagist/map.js +162 -0
  154. package/dist/import/private-packagist/map.js.map +1 -0
  155. package/dist/import/private-packagist/plan.d.ts +61 -0
  156. package/dist/import/private-packagist/plan.d.ts.map +1 -0
  157. package/dist/import/private-packagist/plan.js +936 -0
  158. package/dist/import/private-packagist/plan.js.map +1 -0
  159. package/dist/import/private-packagist/snapshot.d.ts +31 -0
  160. package/dist/import/private-packagist/snapshot.d.ts.map +1 -0
  161. package/dist/import/private-packagist/snapshot.js +406 -0
  162. package/dist/import/private-packagist/snapshot.js.map +1 -0
  163. package/dist/import/satis.d.ts +93 -0
  164. package/dist/import/satis.d.ts.map +1 -0
  165. package/dist/import/satis.js +873 -0
  166. package/dist/import/satis.js.map +1 -0
  167. package/dist/index.d.ts +3 -2
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js +3 -96
  170. package/dist/index.js.map +1 -1
  171. package/dist/manifest.d.ts +56 -0
  172. package/dist/manifest.d.ts.map +1 -0
  173. package/dist/manifest.js +137 -0
  174. package/dist/manifest.js.map +1 -0
  175. package/dist/migrations-collect.d.ts +6 -0
  176. package/dist/migrations-collect.d.ts.map +1 -0
  177. package/dist/migrations-collect.js +39 -0
  178. package/dist/migrations-collect.js.map +1 -0
  179. package/dist/prebuilt-expected.json +7 -0
  180. package/dist/prebuilt.d.ts +27 -0
  181. package/dist/prebuilt.d.ts.map +1 -0
  182. package/dist/prebuilt.js +391 -0
  183. package/dist/prebuilt.js.map +1 -0
  184. package/package.json +22 -25
  185. package/README.md +0 -29
  186. package/dist/__tests__/migrate.test.d.ts +0 -2
  187. package/dist/__tests__/migrate.test.d.ts.map +0 -1
  188. package/dist/__tests__/migrate.test.js +0 -116
  189. package/dist/__tests__/migrate.test.js.map +0 -1
  190. package/dist/migrate.d.ts +0 -40
  191. package/dist/migrate.d.ts.map +0 -1
  192. package/dist/migrate.js +0 -335
  193. package/dist/migrate.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ import { ORG_SLUG_PATTERN } from '@package-broker/core/db/organization';
2
+ import { DbError } from '@package-broker/core/db/errors';
3
+ import { isoTimestamp, systemClock, ulid } from '@package-broker/core/ids';
4
+ import { MigrationLockedError } from '@package-broker/db-sqlite/migrations/lock';
5
+ import { migrate, MigrationChecksumError } from '@package-broker/db-sqlite/migrations/runner';
6
+ import { createOrganizationBootstrap } from '@package-broker/db-sqlite/repositories/organization';
7
+ import { openBetterSqliteExecutor } from '@package-broker/runtime-node/db/better-sqlite3-executor';
8
+ import { BuiltManifestError, loadBuiltMigrations, routesAreValid } from './built-manifest.js';
9
+ function reportError(error) {
10
+ const name = error?.name;
11
+ const message = error?.message;
12
+ const text = typeof name === 'string' && typeof message === 'string'
13
+ ? `${name}: ${message}`
14
+ : `Error: ${String(error)}`;
15
+ console.error(text.replace(/[\r\n]+/g, ' '));
16
+ }
17
+ export async function runMigrateSqlite(o) {
18
+ try {
19
+ const sources = await loadBuiltMigrations(o.outDir);
20
+ if (!(await routesAreValid(o.outDir)))
21
+ return 2;
22
+ const opened = openBetterSqliteExecutor(o.file);
23
+ try {
24
+ const result = await migrate(opened.executor, sources, { holder: ulid(), dryRun: o.dryRun });
25
+ console.log(JSON.stringify(result));
26
+ return 0;
27
+ }
28
+ finally {
29
+ await opened.close();
30
+ }
31
+ }
32
+ catch (error) {
33
+ reportError(error);
34
+ if (error instanceof MigrationChecksumError ||
35
+ (error instanceof BuiltManifestError &&
36
+ /checksum does not match the file/.test(error.message)))
37
+ return 3;
38
+ if (error instanceof MigrationLockedError ||
39
+ (error instanceof DbError && error.kind === 'busy'))
40
+ return 4;
41
+ return 1;
42
+ }
43
+ }
44
+ export async function runBootstrapSqlite(o) {
45
+ if (!ORG_SLUG_PATTERN.test(o.slug)) {
46
+ reportError(new TypeError(`invalid organization slug ${JSON.stringify(o.slug)}`));
47
+ return 2;
48
+ }
49
+ try {
50
+ const opened = openBetterSqliteExecutor(o.file);
51
+ try {
52
+ const result = await createOrganizationBootstrap(opened.executor).bootstrap({
53
+ id: ulid(),
54
+ slug: o.slug,
55
+ name: o.name,
56
+ now: isoTimestamp(systemClock.now()),
57
+ });
58
+ if (!result.created && result.slug !== o.slug) {
59
+ reportError(Object.assign(new Error(`organization already bootstrapped as ${result.slug}`), {
60
+ name: 'AlreadyBootstrapped',
61
+ }));
62
+ return 5;
63
+ }
64
+ console.log(JSON.stringify(result));
65
+ return 0;
66
+ }
67
+ finally {
68
+ await opened.close();
69
+ }
70
+ }
71
+ catch (error) {
72
+ reportError(error);
73
+ return 1;
74
+ }
75
+ }
76
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/commands/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { type ParsedManifest } from '@package-broker/core/import/manifest';
2
+ import { type CredentialKind } from '@package-broker/core/sources/credentials';
3
+ export declare class ImportClientError extends Error {
4
+ readonly code: string;
5
+ readonly exitCode: number;
6
+ readonly retryAfterMs?: number | undefined;
7
+ constructor(code: string, exitCode: number, message: string, retryAfterMs?: number | undefined);
8
+ }
9
+ export declare function localError(code: string, message: string): ImportClientError;
10
+ export declare function brokerOrigin(value: string): string;
11
+ export declare function importManifest(text: string): Promise<{
12
+ manifest: ParsedManifest;
13
+ canonical: string;
14
+ hash: string;
15
+ }>;
16
+ export declare const RUN_STATES: readonly ["planned", "applying", "failed", "applied", "verifying", "verified", "rolled_back", "cancelled"];
17
+ export interface CredentialState {
18
+ readonly sourceRef: string;
19
+ readonly bound: boolean;
20
+ }
21
+ export interface RunStatus {
22
+ readonly id: string;
23
+ readonly state: (typeof RUN_STATES)[number];
24
+ readonly planHash: string | null;
25
+ readonly approvedAt: string | null;
26
+ readonly acceptedAt: string | null;
27
+ readonly credentialWindowUntil: string | null;
28
+ readonly credentials: readonly CredentialState[];
29
+ }
30
+ /** Sources exist only once apply has run; the server refuses uploads before that. */
31
+ export declare const UPLOAD_STATES: ReadonlySet<RunStatus['state']>;
32
+ export declare function uploadsAccepted(status: RunStatus, nowMs: number): boolean;
33
+ export interface CredentialBinding {
34
+ readonly external_ref: string;
35
+ readonly credential_ref: string;
36
+ readonly kind: CredentialKind;
37
+ }
38
+ export type CredentialResolver = (reference: string) => Promise<string>;
39
+ export declare function object(value: unknown): value is Record<string, unknown>;
40
+ export declare function timestamp(value: unknown): value is string;
41
+ export declare function runId(value: string): string;
42
+ export declare class ImportClient {
43
+ readonly origin: string;
44
+ private readonly token;
45
+ private readonly fetcher;
46
+ private readonly now;
47
+ constructor(options: {
48
+ broker: string;
49
+ token: string;
50
+ fetch?: typeof fetch;
51
+ now?: () => number;
52
+ });
53
+ private request;
54
+ submit(canonical: string, key: string): Promise<{
55
+ id: string;
56
+ planHash: string;
57
+ state: 'planned';
58
+ replayed: boolean;
59
+ }>;
60
+ status(id: string, deadline?: number): Promise<RunStatus>;
61
+ verify(id: string, deadline?: number): Promise<void>;
62
+ /**
63
+ * Uploads material for every manifest source the broker reports unbound, re-reading the run
64
+ * before each upload so a rerun after a partial failure skips sources bound meanwhile.
65
+ */
66
+ credentials(id: string, manifest: ParsedManifest, bindings: readonly CredentialBinding[], resolve: CredentialResolver): Promise<{
67
+ uploaded: number;
68
+ skipped: number;
69
+ }>;
70
+ }
71
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/import/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ import { API_ERROR_CODES } from '@package-broker/core/api/response';
2
+ import { isUlid } from '@package-broker/core/ids';
3
+ import { canonicalManifest, MAX_MANIFEST_BYTES, parseManifest, planHash, } from '@package-broker/core/import/manifest';
4
+ import { parseCredentialMaterial, } from '@package-broker/core/sources/credentials';
5
+ export class ImportClientError extends Error {
6
+ code;
7
+ exitCode;
8
+ retryAfterMs;
9
+ constructor(code, exitCode, message, retryAfterMs) {
10
+ super(message);
11
+ this.code = code;
12
+ this.exitCode = exitCode;
13
+ this.retryAfterMs = retryAfterMs;
14
+ this.name = 'ImportClientError';
15
+ }
16
+ }
17
+ export function localError(code, message) {
18
+ return new ImportClientError(code, 2, message);
19
+ }
20
+ export function brokerOrigin(value) {
21
+ try {
22
+ const url = new URL(value);
23
+ if ((url.protocol !== 'https:' && !(url.protocol === 'http:' && url.hostname === 'localhost')) ||
24
+ url.username ||
25
+ url.password ||
26
+ url.pathname !== '/' ||
27
+ url.search ||
28
+ url.hash ||
29
+ ![url.origin, `${url.origin}/`].includes(value))
30
+ throw new Error();
31
+ return url.origin;
32
+ }
33
+ catch {
34
+ throw localError('invalid_origin', 'Use a bare HTTPS broker origin (HTTP is allowed only for localhost).');
35
+ }
36
+ }
37
+ export async function importManifest(text) {
38
+ let raw;
39
+ try {
40
+ raw = JSON.parse(text);
41
+ }
42
+ catch {
43
+ throw localError('invalid_manifest', 'Invalid import manifest.');
44
+ }
45
+ const parsed = parseManifest(raw);
46
+ if (!parsed.ok)
47
+ throw localError('invalid_manifest', 'Invalid import manifest.');
48
+ const canonical = canonicalManifest(parsed.data);
49
+ if (Buffer.byteLength(canonical) > MAX_MANIFEST_BYTES)
50
+ throw localError('manifest_too_large', 'The manifest exceeds the single-run limit.');
51
+ return { manifest: parsed.data, canonical, hash: await planHash(parsed.data) };
52
+ }
53
+ export const RUN_STATES = [
54
+ 'planned',
55
+ 'applying',
56
+ 'failed',
57
+ 'applied',
58
+ 'verifying',
59
+ 'verified',
60
+ 'rolled_back',
61
+ 'cancelled',
62
+ ];
63
+ const WINDOW_MARGIN_MS = 5000;
64
+ /** Sources exist only once apply has run; the server refuses uploads before that. */
65
+ export const UPLOAD_STATES = new Set([
66
+ 'applied',
67
+ 'verifying',
68
+ 'verified',
69
+ ]);
70
+ export function uploadsAccepted(status, nowMs) {
71
+ return (status.approvedAt !== null &&
72
+ status.credentialWindowUntil !== null &&
73
+ UPLOAD_STATES.has(status.state) &&
74
+ Date.parse(status.credentialWindowUntil) > nowMs + WINDOW_MARGIN_MS);
75
+ }
76
+ export function object(value) {
77
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
78
+ }
79
+ export function timestamp(value) {
80
+ return (typeof value === 'string' &&
81
+ /^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z$/.test(value) &&
82
+ Number.isFinite(Date.parse(value)) &&
83
+ new Date(value).toISOString() === value);
84
+ }
85
+ function hash(value) {
86
+ return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
87
+ }
88
+ function nullableDate(value) {
89
+ return value === null || timestamp(value);
90
+ }
91
+ function credentialStates(value) {
92
+ return (Array.isArray(value) &&
93
+ value.length <= 10000 &&
94
+ value.every((entry) => object(entry) &&
95
+ typeof entry.sourceRef === 'string' &&
96
+ typeof entry.bound === 'boolean' &&
97
+ Object.keys(entry).length === 2) &&
98
+ new Set(value.map((entry) => entry.sourceRef)).size === value.length);
99
+ }
100
+ export function runId(value) {
101
+ if (!isUlid(value))
102
+ throw localError('invalid_run', 'Invalid import run ID.');
103
+ return value;
104
+ }
105
+ const incompatible = () => new ImportClientError('incompatible_response', 1, 'The broker returned an incompatible import response.');
106
+ const unknownOutcome = () => new ImportClientError('outcome_unknown', 6, 'Outcome unknown; check the run in the UI before retrying.');
107
+ // Credential summaries repeat only a subset of manifest content; allow room for the run DTO.
108
+ const MAX_STATUS_BYTES = MAX_MANIFEST_BYTES + 65536;
109
+ const waitTimeout = () => new ImportClientError('wait_timeout', 3, 'Import status wait timed out.');
110
+ async function readResponse(response, maxBytes) {
111
+ if (response.body === null)
112
+ throw incompatible();
113
+ const reader = response.body.getReader();
114
+ const chunks = [];
115
+ let bytes = 0;
116
+ try {
117
+ while (true) {
118
+ const chunk = await reader.read();
119
+ if (chunk.done)
120
+ break;
121
+ bytes += chunk.value.byteLength;
122
+ if (bytes > maxBytes)
123
+ throw incompatible();
124
+ chunks.push(chunk.value);
125
+ }
126
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
127
+ }
128
+ finally {
129
+ await reader.cancel().catch(() => undefined);
130
+ }
131
+ }
132
+ export class ImportClient {
133
+ origin;
134
+ token;
135
+ fetcher;
136
+ now;
137
+ constructor(options) {
138
+ this.origin = brokerOrigin(options.broker);
139
+ if (!options.token || !/^[\x21-\x7e]+$/.test(options.token))
140
+ throw localError('invalid_token', 'Provide PB_IMPORT_TOKEN or --token-file.');
141
+ this.token = options.token;
142
+ this.fetcher = options.fetch ?? fetch;
143
+ this.now = options.now ?? Date.now;
144
+ }
145
+ async request(path, method, body, key, deadline) {
146
+ const remaining = deadline === undefined ? 30000 : deadline - this.now();
147
+ if (remaining <= 0)
148
+ throw waitTimeout();
149
+ const signal = AbortSignal.timeout(Math.min(30000, remaining));
150
+ const mutating = method !== 'GET';
151
+ let response;
152
+ let data;
153
+ try {
154
+ response = await this.fetcher(new URL(`/_pb/import-runs${path}`, this.origin), {
155
+ method,
156
+ redirect: 'error',
157
+ signal,
158
+ headers: {
159
+ authorization: `Bearer ${this.token}`,
160
+ accept: 'application/json',
161
+ ...(body === undefined ? {} : { 'content-type': 'application/json' }),
162
+ ...(key === undefined ? {} : { 'idempotency-key': key }),
163
+ },
164
+ ...(body === undefined ? {} : { body }),
165
+ });
166
+ if (deadline !== undefined && this.now() >= deadline)
167
+ throw waitTimeout();
168
+ if (response.status === 204) {
169
+ if (method === 'GET' || path === '')
170
+ throw incompatible();
171
+ return { data: null, headers: response.headers };
172
+ }
173
+ if (response.status === 429)
174
+ void response.body?.cancel().catch(() => undefined);
175
+ else
176
+ data = await readResponse(response, method === 'GET' ? MAX_STATUS_BYTES : 65536);
177
+ }
178
+ catch {
179
+ if (deadline !== undefined &&
180
+ (this.now() >= deadline || (remaining <= 30000 && signal.aborted)))
181
+ throw waitTimeout();
182
+ throw mutating
183
+ ? unknownOutcome()
184
+ : new ImportClientError('request_failed', 1, 'Could not read broker response.');
185
+ }
186
+ if (deadline !== undefined && this.now() >= deadline)
187
+ throw waitTimeout();
188
+ if (!response.ok) {
189
+ if (response.status === 429) {
190
+ const header = response.headers.get('retry-after');
191
+ const seconds = header !== null && /^\d+$/.test(header) ? Number(header) : NaN;
192
+ const delay = Number.isFinite(seconds)
193
+ ? seconds * 1000
194
+ : header === null
195
+ ? 1000
196
+ : Date.parse(header) - this.now();
197
+ const retryAfterMs = Number.isFinite(delay) ? Math.max(1000, delay) : 1000;
198
+ throw new ImportClientError('rate_limited', 1, 'Rate limited; retry later.', retryAfterMs);
199
+ }
200
+ const envelope = object(data) && object(data.error) ? data.error : null;
201
+ const code = envelope?.code;
202
+ if (typeof code === 'string' && Object.hasOwn(API_ERROR_CODES, code)) {
203
+ const known = code;
204
+ throw new ImportClientError(known, 1, API_ERROR_CODES[known].message);
205
+ }
206
+ throw new ImportClientError('request_failed', 1, 'Broker request refused.');
207
+ }
208
+ if ((path === '' && response.status !== 201) ||
209
+ (method === 'GET' && response.status !== 200) ||
210
+ (method !== 'GET' && path !== ''))
211
+ throw mutating ? unknownOutcome() : incompatible();
212
+ return { data, headers: response.headers };
213
+ }
214
+ async submit(canonical, key) {
215
+ if (!/^[A-Za-z0-9_-]{1,128}$/.test(key))
216
+ throw localError('invalid_key', 'Invalid idempotency key.');
217
+ let answer;
218
+ try {
219
+ answer = await this.request('', 'POST', canonical, key);
220
+ }
221
+ catch (error) {
222
+ if (error instanceof ImportClientError && error.code === 'idempotency_mismatch')
223
+ throw new ImportClientError('idempotency_mismatch', 1, 'The broker already holds a different manifest under this receipt key; reconcile the run in the UI and submit with a new receipt.');
224
+ throw error;
225
+ }
226
+ const { data, headers } = answer;
227
+ if (!object(data) ||
228
+ typeof data.id !== 'string' ||
229
+ !isUlid(data.id) ||
230
+ !hash(data.planHash) ||
231
+ data.state !== 'planned')
232
+ throw unknownOutcome();
233
+ return {
234
+ id: data.id,
235
+ planHash: data.planHash,
236
+ state: 'planned',
237
+ replayed: headers.get('idempotent-replayed') === 'true',
238
+ };
239
+ }
240
+ async status(id, deadline) {
241
+ const { data } = await this.request(`/${runId(id)}`, 'GET', undefined, undefined, deadline);
242
+ if (!object(data) ||
243
+ data.id !== id ||
244
+ !RUN_STATES.includes(data.state) ||
245
+ !(data.planHash === null || hash(data.planHash)) ||
246
+ !nullableDate(data.approvedAt) ||
247
+ !nullableDate(data.acceptedAt) ||
248
+ !nullableDate(data.credentialWindowUntil) ||
249
+ !credentialStates(data.credentials))
250
+ throw incompatible();
251
+ return {
252
+ id,
253
+ state: data.state,
254
+ planHash: data.planHash,
255
+ approvedAt: data.approvedAt,
256
+ acceptedAt: data.acceptedAt,
257
+ credentialWindowUntil: data.credentialWindowUntil,
258
+ credentials: data.credentials.map(({ sourceRef, bound }) => ({ sourceRef, bound })),
259
+ };
260
+ }
261
+ async verify(id, deadline) {
262
+ await this.request(`/${runId(id)}/verify`, 'POST', undefined, undefined, deadline);
263
+ }
264
+ /**
265
+ * Uploads material for every manifest source the broker reports unbound, re-reading the run
266
+ * before each upload so a rerun after a partial failure skips sources bound meanwhile.
267
+ */
268
+ async credentials(id, manifest, bindings, resolve) {
269
+ runId(id);
270
+ const sources = manifest.items.filter((item) => item.type === 'source' && item.credential_ref !== null);
271
+ if (sources.some((source) => source.external_ref === '.' || source.external_ref === '..'))
272
+ throw localError('invalid_external_ref', 'Credential source reference cannot be a dot segment.');
273
+ if (sources.some((source) => source.type === 'source' && source.credential_ref === 'env:PB_IMPORT_TOKEN'))
274
+ throw localError('invalid_credential_ref', 'The broker token cannot be used as a source credential.');
275
+ const byRef = new Map();
276
+ for (const binding of bindings) {
277
+ const source = sources.find((item) => item.external_ref === binding.external_ref);
278
+ if (source?.type !== 'source' ||
279
+ source.credential_ref !== binding.credential_ref ||
280
+ byRef.has(binding.external_ref))
281
+ throw localError('credential_binding_mismatch', 'Credential bindings must match manifest source entries exactly.');
282
+ if (!['http_basic', 'bearer', 'header', 'query', 'github_app', 'npm_token', 'ssh_key'].includes(binding.kind) ||
283
+ (binding.kind === 'query' && source.source_type !== 'composer_repository') ||
284
+ (binding.kind === 'github_app' &&
285
+ (source.source_type !== 'vcs' ||
286
+ source.project !== null ||
287
+ !('provider' in source.config) ||
288
+ source.config.provider !== 'github')))
289
+ throw localError('invalid_credential_kind', 'Credential kind is incompatible with the manifest source.');
290
+ byRef.set(binding.external_ref, binding);
291
+ }
292
+ const expectedHash = await planHash(manifest);
293
+ const expectedRefs = sources.map((item) => item.external_ref).sort();
294
+ const ready = async () => {
295
+ const status = await this.status(id);
296
+ if (status.planHash !== expectedHash)
297
+ throw localError('plan_hash_mismatch', 'The local manifest does not match the broker plan.');
298
+ const reported = status.credentials.map((entry) => entry.sourceRef).sort();
299
+ if (reported.length !== expectedRefs.length ||
300
+ reported.some((ref, index) => ref !== expectedRefs[index]))
301
+ throw incompatible();
302
+ return status;
303
+ };
304
+ const assertOpen = (status) => {
305
+ if (status.approvedAt === null)
306
+ throw new ImportClientError('not_ready', 3, 'The credential window opens when the run is approved; approve and apply it in the UI first.');
307
+ if (status.credentialWindowUntil === null)
308
+ throw new ImportClientError('credential_window_closed', 1, 'The credential window for this run is closed; bind the remaining credentials in the UI.');
309
+ if (!UPLOAD_STATES.has(status.state))
310
+ throw new ImportClientError('not_ready', 3, 'Wait for apply to finish in the UI before uploading credentials.');
311
+ if (!uploadsAccepted(status, this.now()))
312
+ throw new ImportClientError('credential_window_closed', 1, 'The credential window for this run is closing; bind the remaining credentials in the UI.');
313
+ };
314
+ let status = await ready();
315
+ const pending = status.credentials.filter((entry) => !entry.bound);
316
+ if (pending.length === 0)
317
+ return { uploaded: 0, skipped: status.credentials.length };
318
+ assertOpen(status);
319
+ if (pending.some((entry) => !byRef.has(entry.sourceRef)))
320
+ throw localError('credential_binding_missing', 'Supply a credential kind for every source the broker reports unbound.');
321
+ let uploaded = 0;
322
+ for (const [index, entry] of pending.entries()) {
323
+ if (index > 0) {
324
+ status = await ready();
325
+ if (status.credentials.some((item) => item.sourceRef === entry.sourceRef && item.bound))
326
+ continue;
327
+ assertOpen(status);
328
+ }
329
+ const binding = byRef.get(entry.sourceRef);
330
+ let material;
331
+ try {
332
+ material = await resolve(binding.credential_ref);
333
+ if (Buffer.byteLength(material) > 16384)
334
+ throw new Error();
335
+ parseCredentialMaterial(binding.kind, material);
336
+ }
337
+ catch {
338
+ throw localError('credential_resolution_failed', 'Could not resolve valid credential material.');
339
+ }
340
+ if (!uploadsAccepted(status, this.now()))
341
+ throw new ImportClientError('credential_window_closed', 1, 'The credential window for this run is closing; bind the remaining credentials in the UI.');
342
+ await this.request(`/${id}/credentials/${encodeURIComponent(binding.external_ref)}`, 'PUT', JSON.stringify({ kind: binding.kind, material }));
343
+ uploaded++;
344
+ }
345
+ return { uploaded, skipped: status.credentials.length - uploaded };
346
+ }
347
+ }
348
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/import/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isCredentialReference(ref: string): boolean;
2
+ //# sourceMappingURL=credential-refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-refs.d.ts","sourceRoot":"","sources":["../../src/import/credential-refs.ts"],"names":[],"mappings":"AAMA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkB1D"}
@@ -0,0 +1,22 @@
1
+ import { isCredentialValue } from '@package-broker/core/audit/redact';
2
+ const ENV_REF = /^env:[A-Z_][A-Z0-9_]{0,127}$/;
3
+ const TOKEN_ENV_PREFIXES = ['AKIA', 'ASIA', 'GHP_', 'GHO_', 'GHS_', 'GITHUB_PAT_', 'XOX', 'GLPAT'];
4
+ const ABSOLUTE_PATH = /^(?:\/|[A-Za-z]:[\\/])/;
5
+ export function isCredentialReference(ref) {
6
+ if (/\p{Cc}/u.test(ref))
7
+ return false;
8
+ if (ref.startsWith('env:')) {
9
+ const name = ref.slice(4);
10
+ return (ENV_REF.test(ref) &&
11
+ !TOKEN_ENV_PREFIXES.some((prefix) => name.startsWith(prefix)) &&
12
+ !isCredentialValue(name));
13
+ }
14
+ if (!ref.startsWith('file:'))
15
+ return false;
16
+ const path = ref.slice(5);
17
+ return (ABSOLUTE_PATH.test(path) &&
18
+ !path.split(/[\\/]/).includes('..') &&
19
+ Buffer.byteLength(path) <= 1024 &&
20
+ !isCredentialValue(path));
21
+ }
22
+ //# sourceMappingURL=credential-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-refs.js","sourceRoot":"","sources":["../../src/import/credential-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAC/C,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACnG,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC,iBAAiB,CAAC,IAAI,CAAC,CACzB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,CACL,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI;QAC/B,CAAC,iBAAiB,CAAC,IAAI,CAAC,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,64 @@
1
+ export interface ComposerResult {
2
+ readonly exitCode: number | null;
3
+ readonly errorCode?: string;
4
+ readonly signal?: string;
5
+ readonly stdout: string;
6
+ readonly stderr: string;
7
+ }
8
+ export type ComposerRunner = (args: readonly string[], options: {
9
+ readonly cwd: string;
10
+ readonly env: NodeJS.ProcessEnv;
11
+ readonly shell: false;
12
+ readonly signal?: AbortSignal;
13
+ readonly timeout?: number;
14
+ }) => Promise<ComposerResult>;
15
+ export interface CutoverOptions {
16
+ readonly projectDir: string;
17
+ readonly oldRepository: string;
18
+ readonly newRepository: string;
19
+ readonly oldAuthEnv: string;
20
+ readonly newAuthEnv: string;
21
+ readonly historicLocks?: readonly string[];
22
+ readonly composer?: ComposerRunner;
23
+ readonly timeoutSeconds?: number;
24
+ }
25
+ declare const MESSAGES: {
26
+ readonly passed: "Composer cutover check passed.";
27
+ readonly resolution_difference: "Composer lock resolutions differ.";
28
+ readonly old_dist_host: "New repository lock still uses the old repository host.";
29
+ readonly update_failed: "Composer lock update failed.";
30
+ readonly install_failed: "Composer install failed.";
31
+ readonly historic_failed: "Historic lock check failed.";
32
+ readonly composer_v2_required: "Composer v2 is required; install Composer v2 and make it available on PATH.";
33
+ readonly invalid_input: "Supply a project, HTTP(S) repository URLs and named authentication environment variables.";
34
+ readonly repository_match: "Exactly one repository entry must match the old repository URL.";
35
+ readonly input_unreadable: "Could not read valid Composer project or historic lock files.";
36
+ readonly local_failed: "Could not prepare, read or remove temporary Composer files.";
37
+ };
38
+ type Code = keyof typeof MESSAGES;
39
+ export interface CutoverResult {
40
+ readonly exitCode: 0 | 1 | 2;
41
+ readonly code: Code;
42
+ readonly message: string;
43
+ readonly counts: {
44
+ readonly old: number;
45
+ readonly new: number;
46
+ };
47
+ readonly differences: readonly string[];
48
+ readonly distOnly: readonly string[];
49
+ readonly oldHostPackages: readonly string[];
50
+ readonly diagnostics: readonly {
51
+ readonly step: 'version' | 'update' | 'install';
52
+ readonly exitCode: number | null;
53
+ readonly errorCode?: string;
54
+ readonly signal?: string;
55
+ }[];
56
+ readonly historic: readonly {
57
+ readonly index: number;
58
+ readonly ok: boolean;
59
+ readonly missingPackages: readonly string[];
60
+ }[];
61
+ }
62
+ export declare function runCutoverCheck(options: CutoverOptions): Promise<CutoverResult>;
63
+ export {};
64
+ //# sourceMappingURL=cutover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cutover.d.ts","sourceRoot":"","sources":["../../src/import/cutover.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IACP,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,KACE,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,QAAA,MAAM,QAAQ;;;;;;;;;;;;CAcJ,CAAC;AACX,KAAK,IAAI,GAAG,MAAM,OAAO,QAAQ,CAAC;AAElC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;KAC7C,EAAE,CAAC;CACL;AAiPD,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA8RrF"}