@package-broker/cli 0.19.7 → 2.0.0-rc.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 (181) 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 +801 -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 +129 -0
  40. package/dist/commands/cloudflare/api.d.ts.map +1 -0
  41. package/dist/commands/cloudflare/api.js +480 -0
  42. package/dist/commands/cloudflare/api.js.map +1 -0
  43. package/dist/commands/cloudflare/deploy.d.ts +81 -0
  44. package/dist/commands/cloudflare/deploy.d.ts.map +1 -0
  45. package/dist/commands/cloudflare/deploy.js +1848 -0
  46. package/dist/commands/cloudflare/deploy.js.map +1 -0
  47. package/dist/commands/cloudflare/inventory.d.ts +243 -0
  48. package/dist/commands/cloudflare/inventory.d.ts.map +1 -0
  49. package/dist/commands/cloudflare/inventory.js +786 -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/provision.d.ts +79 -0
  60. package/dist/commands/cloudflare/provision.d.ts.map +1 -0
  61. package/dist/commands/cloudflare/provision.js +961 -0
  62. package/dist/commands/cloudflare/provision.js.map +1 -0
  63. package/dist/commands/cloudflare/queue-consumer.d.ts +4 -0
  64. package/dist/commands/cloudflare/queue-consumer.d.ts.map +1 -0
  65. package/dist/commands/cloudflare/queue-consumer.js +57 -0
  66. package/dist/commands/cloudflare/queue-consumer.js.map +1 -0
  67. package/dist/commands/cloudflare/setup.d.ts +48 -0
  68. package/dist/commands/cloudflare/setup.d.ts.map +1 -0
  69. package/dist/commands/cloudflare/setup.js +836 -0
  70. package/dist/commands/cloudflare/setup.js.map +1 -0
  71. package/dist/commands/cloudflare/smoke.d.ts +29 -0
  72. package/dist/commands/cloudflare/smoke.d.ts.map +1 -0
  73. package/dist/commands/cloudflare/smoke.js +715 -0
  74. package/dist/commands/cloudflare/smoke.js.map +1 -0
  75. package/dist/commands/cloudflare/teardown.d.ts +62 -0
  76. package/dist/commands/cloudflare/teardown.d.ts.map +1 -0
  77. package/dist/commands/cloudflare/teardown.js +906 -0
  78. package/dist/commands/cloudflare/teardown.js.map +1 -0
  79. package/dist/commands/cloudflare/worker-settings.d.ts +4 -0
  80. package/dist/commands/cloudflare/worker-settings.d.ts.map +1 -0
  81. package/dist/commands/cloudflare/worker-settings.js +93 -0
  82. package/dist/commands/cloudflare/worker-settings.js.map +1 -0
  83. package/dist/commands/cloudflare.d.ts +55 -0
  84. package/dist/commands/cloudflare.d.ts.map +1 -0
  85. package/dist/commands/cloudflare.js +393 -0
  86. package/dist/commands/cloudflare.js.map +1 -0
  87. package/dist/commands/import-cutover.d.ts +5 -0
  88. package/dist/commands/import-cutover.d.ts.map +1 -0
  89. package/dist/commands/import-cutover.js +25 -0
  90. package/dist/commands/import-cutover.js.map +1 -0
  91. package/dist/commands/import-private-packagist.d.ts +38 -0
  92. package/dist/commands/import-private-packagist.d.ts.map +1 -0
  93. package/dist/commands/import-private-packagist.js +232 -0
  94. package/dist/commands/import-private-packagist.js.map +1 -0
  95. package/dist/commands/import-satis.d.ts +11 -0
  96. package/dist/commands/import-satis.d.ts.map +1 -0
  97. package/dist/commands/import-satis.js +112 -0
  98. package/dist/commands/import-satis.js.map +1 -0
  99. package/dist/commands/import.d.ts +22 -0
  100. package/dist/commands/import.d.ts.map +1 -0
  101. package/dist/commands/import.js +343 -0
  102. package/dist/commands/import.js.map +1 -0
  103. package/dist/commands/openapi-specs.d.ts +4 -0
  104. package/dist/commands/openapi-specs.d.ts.map +1 -0
  105. package/dist/commands/openapi-specs.js +94 -0
  106. package/dist/commands/openapi-specs.js.map +1 -0
  107. package/dist/commands/openapi.d.ts +12 -0
  108. package/dist/commands/openapi.d.ts.map +1 -0
  109. package/dist/commands/openapi.js +44 -0
  110. package/dist/commands/openapi.js.map +1 -0
  111. package/dist/commands/source.d.ts +8 -0
  112. package/dist/commands/source.d.ts.map +1 -0
  113. package/dist/commands/source.js +61 -0
  114. package/dist/commands/source.js.map +1 -0
  115. package/dist/commands/sqlite.d.ts +11 -0
  116. package/dist/commands/sqlite.d.ts.map +1 -0
  117. package/dist/commands/sqlite.js +76 -0
  118. package/dist/commands/sqlite.js.map +1 -0
  119. package/dist/import/client.d.ts +71 -0
  120. package/dist/import/client.d.ts.map +1 -0
  121. package/dist/import/client.js +348 -0
  122. package/dist/import/client.js.map +1 -0
  123. package/dist/import/credential-refs.d.ts +2 -0
  124. package/dist/import/credential-refs.d.ts.map +1 -0
  125. package/dist/import/credential-refs.js +22 -0
  126. package/dist/import/credential-refs.js.map +1 -0
  127. package/dist/import/cutover.d.ts +64 -0
  128. package/dist/import/cutover.d.ts.map +1 -0
  129. package/dist/import/cutover.js +544 -0
  130. package/dist/import/cutover.js.map +1 -0
  131. package/dist/import/private-packagist/api.d.ts +57 -0
  132. package/dist/import/private-packagist/api.d.ts.map +1 -0
  133. package/dist/import/private-packagist/api.js +246 -0
  134. package/dist/import/private-packagist/api.js.map +1 -0
  135. package/dist/import/private-packagist/dates.d.ts +30 -0
  136. package/dist/import/private-packagist/dates.d.ts.map +1 -0
  137. package/dist/import/private-packagist/dates.js +189 -0
  138. package/dist/import/private-packagist/dates.js.map +1 -0
  139. package/dist/import/private-packagist/map.d.ts +48 -0
  140. package/dist/import/private-packagist/map.d.ts.map +1 -0
  141. package/dist/import/private-packagist/map.js +162 -0
  142. package/dist/import/private-packagist/map.js.map +1 -0
  143. package/dist/import/private-packagist/plan.d.ts +61 -0
  144. package/dist/import/private-packagist/plan.d.ts.map +1 -0
  145. package/dist/import/private-packagist/plan.js +936 -0
  146. package/dist/import/private-packagist/plan.js.map +1 -0
  147. package/dist/import/private-packagist/snapshot.d.ts +31 -0
  148. package/dist/import/private-packagist/snapshot.d.ts.map +1 -0
  149. package/dist/import/private-packagist/snapshot.js +406 -0
  150. package/dist/import/private-packagist/snapshot.js.map +1 -0
  151. package/dist/import/satis.d.ts +93 -0
  152. package/dist/import/satis.d.ts.map +1 -0
  153. package/dist/import/satis.js +873 -0
  154. package/dist/import/satis.js.map +1 -0
  155. package/dist/index.d.ts +3 -2
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +3 -96
  158. package/dist/index.js.map +1 -1
  159. package/dist/manifest.d.ts +55 -0
  160. package/dist/manifest.d.ts.map +1 -0
  161. package/dist/manifest.js +125 -0
  162. package/dist/manifest.js.map +1 -0
  163. package/dist/migrations-collect.d.ts +6 -0
  164. package/dist/migrations-collect.d.ts.map +1 -0
  165. package/dist/migrations-collect.js +39 -0
  166. package/dist/migrations-collect.js.map +1 -0
  167. package/dist/prebuilt-expected.json +7 -0
  168. package/dist/prebuilt.d.ts +27 -0
  169. package/dist/prebuilt.d.ts.map +1 -0
  170. package/dist/prebuilt.js +391 -0
  171. package/dist/prebuilt.js.map +1 -0
  172. package/package.json +21 -25
  173. package/README.md +0 -29
  174. package/dist/__tests__/migrate.test.d.ts +0 -2
  175. package/dist/__tests__/migrate.test.d.ts.map +0 -1
  176. package/dist/__tests__/migrate.test.js +0 -116
  177. package/dist/__tests__/migrate.test.js.map +0 -1
  178. package/dist/migrate.d.ts +0 -40
  179. package/dist/migrate.d.ts.map +0 -1
  180. package/dist/migrate.js +0 -335
  181. package/dist/migrate.js.map +0 -1
@@ -0,0 +1,343 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { open, rename, unlink } from 'node:fs/promises';
3
+ import { isUlid } from '@package-broker/core/ids';
4
+ import { isCanonicalUrl } from '@package-broker/core/import/source-config';
5
+ import { brokerOrigin, ImportClient, ImportClientError, importManifest, localError, object, timestamp, uploadsAccepted, } from '../import/client.js';
6
+ async function readLocal(path, maxBytes) {
7
+ try {
8
+ const file = await open(path, 'r');
9
+ try {
10
+ const stat = await file.stat();
11
+ if (!stat.isFile() || stat.size > maxBytes)
12
+ throw new Error();
13
+ const buffer = Buffer.alloc(maxBytes + 1);
14
+ let size = 0;
15
+ while (size < buffer.length) {
16
+ const result = await file.read(buffer, size, buffer.length - size, null);
17
+ if (result.bytesRead === 0)
18
+ break;
19
+ size += result.bytesRead;
20
+ }
21
+ if (size > maxBytes)
22
+ throw new Error();
23
+ return new TextDecoder('utf-8', { fatal: true }).decode(buffer.subarray(0, size));
24
+ }
25
+ finally {
26
+ await file.close();
27
+ }
28
+ }
29
+ catch {
30
+ throw localError('input_unreadable', 'Could not read a local input within its size limit.');
31
+ }
32
+ }
33
+ export function localResolver(env) {
34
+ return async (reference) => {
35
+ if (reference === 'env:PB_IMPORT_TOKEN')
36
+ throw localError('invalid_credential_ref', 'The broker token cannot be used as a source credential.');
37
+ if (/^env:[A-Z_][A-Z0-9_]{0,127}$/.test(reference)) {
38
+ const value = env[reference.slice(4)];
39
+ if (value !== undefined)
40
+ return value;
41
+ }
42
+ if (reference.startsWith('file:') &&
43
+ reference.length > 5 &&
44
+ Buffer.byteLength(reference.slice(5)) <= 1024 &&
45
+ !/\p{Cc}/u.test(reference))
46
+ return readLocal(reference.slice(5), 16384);
47
+ throw localError('credential_resolution_failed', 'Could not resolve credential material.');
48
+ };
49
+ }
50
+ const KINDS = [
51
+ 'http_basic',
52
+ 'bearer',
53
+ 'header',
54
+ 'query',
55
+ 'github_app',
56
+ 'npm_token',
57
+ 'ssh_key',
58
+ ];
59
+ const strictKeys = (obj, keys) => Object.keys(obj).every((key) => keys.includes(key));
60
+ function identity(value) {
61
+ const url = new URL(value);
62
+ return url.hostname === 'github.com'
63
+ ? `${url.origin}${url.pathname
64
+ .replace(/\/$/, '')
65
+ .replace(/\.git$/, '')
66
+ .toLowerCase()}`
67
+ : value;
68
+ }
69
+ export function credentialBindings(text, manifest) {
70
+ const invalid = () => localError('invalid_credential_map', 'Use explicit source references, matching credential references and supported kinds.');
71
+ let raw;
72
+ try {
73
+ raw = JSON.parse(text);
74
+ }
75
+ catch {
76
+ throw invalid();
77
+ }
78
+ if (!object(raw) || raw.version !== 1)
79
+ throw invalid();
80
+ const result = [];
81
+ if (strictKeys(raw, ['version', 'sources']) && Array.isArray(raw.sources)) {
82
+ for (const entry of raw.sources) {
83
+ if (!object(entry) ||
84
+ !strictKeys(entry, ['external_ref', 'credential_ref', 'kind']) ||
85
+ typeof entry.external_ref !== 'string' ||
86
+ typeof entry.credential_ref !== 'string' ||
87
+ !KINDS.includes(entry.kind))
88
+ throw invalid();
89
+ result.push({
90
+ external_ref: entry.external_ref,
91
+ credential_ref: entry.credential_ref,
92
+ kind: entry.kind,
93
+ });
94
+ }
95
+ return result;
96
+ }
97
+ // The planner's repository map is an adapter; the transport only sees external refs.
98
+ if (manifest.source_system !== 'satis' ||
99
+ !strictKeys(raw, ['version', 'repositories']) ||
100
+ !Array.isArray(raw.repositories))
101
+ throw invalid();
102
+ const seen = new Set();
103
+ for (const entry of raw.repositories) {
104
+ if (!object(entry) ||
105
+ !strictKeys(entry, ['url', 'kind', 'ref']) ||
106
+ typeof entry.url !== 'string' ||
107
+ !isCanonicalUrl(entry.url) ||
108
+ typeof entry.ref !== 'string' ||
109
+ !KINDS.includes(entry.kind))
110
+ throw invalid();
111
+ const key = identity(entry.url);
112
+ if (seen.has(key))
113
+ throw invalid();
114
+ seen.add(key);
115
+ for (const item of manifest.items) {
116
+ if (item.type !== 'source' || item.credential_ref === null)
117
+ continue;
118
+ const repository = 'repository' in item.config ? item.config.repository : null;
119
+ const target = item.url ??
120
+ (typeof repository === 'string'
121
+ ? repository.startsWith('https://')
122
+ ? repository
123
+ : `https://github.com/${repository}`
124
+ : null);
125
+ if (target !== null && identity(target) === key) {
126
+ if (item.credential_ref !== entry.ref)
127
+ throw invalid();
128
+ result.push({
129
+ external_ref: item.external_ref,
130
+ credential_ref: entry.ref,
131
+ kind: entry.kind,
132
+ });
133
+ }
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+ async function writeReceipt(path, receipt, fresh) {
139
+ const target = fresh ? path : `${path}.${randomUUID()}.tmp`;
140
+ try {
141
+ const file = await open(target, 'wx', 0o600);
142
+ try {
143
+ await file.writeFile(JSON.stringify(receipt));
144
+ await file.sync();
145
+ }
146
+ finally {
147
+ await file.close();
148
+ }
149
+ if (!fresh)
150
+ await rename(target, path);
151
+ }
152
+ catch {
153
+ throw localError('receipt_unwritable', 'Could not save receipt; use --resume for an existing receipt.');
154
+ }
155
+ finally {
156
+ if (!fresh)
157
+ await unlink(target).catch(() => undefined);
158
+ }
159
+ }
160
+ async function submit(options, client, token) {
161
+ const tokenFingerprint = createHash('sha256').update(token).digest('hex');
162
+ if (!options.manifest ||
163
+ !options.receipt ||
164
+ !options.principal ||
165
+ !/^[a-z][a-z0-9_-]{0,63}$/.test(options.principal))
166
+ throw localError('invalid_input', 'Submit requires --manifest, --receipt and a non-secret --principal label.');
167
+ const plan = await importManifest(await readLocal(options.manifest, 1048576));
168
+ if (plan.manifest.items.length === 0)
169
+ throw localError('no_changes', 'No changes to submit.');
170
+ const now = (options.now ?? Date.now)();
171
+ let receipt;
172
+ if (options.resume) {
173
+ let raw;
174
+ try {
175
+ raw = JSON.parse(await readLocal(options.receipt, 4096));
176
+ }
177
+ catch {
178
+ throw localError('invalid_receipt', 'Could not read a valid submit receipt.');
179
+ }
180
+ if (!object(raw) ||
181
+ !strictKeys(raw, [
182
+ 'version',
183
+ 'origin',
184
+ 'hash',
185
+ 'key',
186
+ 'principal',
187
+ 'tokenFingerprint',
188
+ 'attemptedAt',
189
+ 'run',
190
+ ]) ||
191
+ raw.version !== 1 ||
192
+ raw.origin !== client.origin ||
193
+ raw.hash !== plan.hash ||
194
+ raw.principal !== options.principal ||
195
+ !(raw.tokenFingerprint === undefined ||
196
+ (typeof raw.tokenFingerprint === 'string' && /^[a-f0-9]{64}$/.test(raw.tokenFingerprint))) ||
197
+ typeof raw.key !== 'string' ||
198
+ !/^[A-Za-z0-9_-]{1,128}$/.test(raw.key) ||
199
+ !timestamp(raw.attemptedAt) ||
200
+ !(raw.run === null || (typeof raw.run === 'string' && isUlid(raw.run))))
201
+ throw localError('receipt_mismatch', 'Receipt does not match this origin, principal label or manifest.');
202
+ receipt = raw;
203
+ if (receipt.run !== null) {
204
+ const status = await client.status(receipt.run);
205
+ if (status.planHash !== plan.hash)
206
+ throw localError('plan_hash_mismatch', 'The receipt run does not match the manifest.');
207
+ printStatus(status, now);
208
+ return failed(status) ? 1 : 0;
209
+ }
210
+ if (receipt.tokenFingerprint !== tokenFingerprint)
211
+ throw localError('receipt_mismatch', 'Receipt does not match this authentication token; reconcile the run in the UI.');
212
+ const age = now - Date.parse(receipt.attemptedAt);
213
+ if (age < 0 || age >= 86400000 - 3600000)
214
+ throw new ImportClientError('outcome_unknown', 6, 'Submit replay window expired; reconcile the run in the UI.');
215
+ }
216
+ else {
217
+ receipt = {
218
+ version: 1,
219
+ origin: client.origin,
220
+ hash: plan.hash,
221
+ key: randomUUID(),
222
+ principal: options.principal,
223
+ tokenFingerprint,
224
+ attemptedAt: new Date(now).toISOString(),
225
+ run: null,
226
+ };
227
+ await writeReceipt(options.receipt, receipt, true);
228
+ }
229
+ const result = await client.submit(plan.canonical, receipt.key);
230
+ if (result.planHash !== plan.hash)
231
+ throw new ImportClientError('outcome_unknown', 6, 'Broker plan hash differs; reconcile the run in the UI.');
232
+ try {
233
+ await writeReceipt(options.receipt, { ...receipt, run: result.id }, false);
234
+ }
235
+ catch {
236
+ throw new ImportClientError('receipt_unwritable', 6, 'Run created but receipt could not be saved; reconcile in the UI before retrying.');
237
+ }
238
+ if (result.replayed) {
239
+ const status = await client.status(result.id);
240
+ if (status.planHash !== plan.hash)
241
+ throw localError('plan_hash_mismatch', 'The receipt run does not match the manifest.');
242
+ printStatus(status, (options.now ?? Date.now)());
243
+ return failed(status) ? 1 : 0;
244
+ }
245
+ else {
246
+ console.log(`${result.id}: planned. Review, approve and apply in the UI at ${client.origin}.`);
247
+ }
248
+ return 0;
249
+ }
250
+ function printStatus(status, nowMs) {
251
+ const bound = status.credentials.filter((entry) => entry.bound).length;
252
+ const credentials = status.credentials.length === 0
253
+ ? ''
254
+ : `; credentials=${bound}/${status.credentials.length} bound${uploadsAccepted(status, nowMs) ? `, upload until ${status.credentialWindowUntil}` : ''}`;
255
+ console.log(`${status.id}: ${status.state}; approved=${status.approvedAt ?? 'pending'}; accepted=${status.acceptedAt ?? 'pending'}${credentials}`);
256
+ }
257
+ function failed(status) {
258
+ return ['failed', 'rolled_back', 'cancelled'].includes(status.state);
259
+ }
260
+ export async function runImport(options) {
261
+ try {
262
+ brokerOrigin(options.broker);
263
+ const envToken = options.env['PB_IMPORT_TOKEN'];
264
+ if (options.tokenFile !== undefined && envToken !== undefined)
265
+ throw localError('ambiguous_token', 'Use either PB_IMPORT_TOKEN or --token-file.');
266
+ const token = options.tokenFile === undefined
267
+ ? envToken
268
+ : (await readLocal(options.tokenFile, 4096)).trim();
269
+ const client = new ImportClient({
270
+ broker: options.broker,
271
+ token: token ?? '',
272
+ ...(options.fetch === undefined ? {} : { fetch: options.fetch }),
273
+ ...(options.now === undefined ? {} : { now: options.now }),
274
+ });
275
+ if (options.command === 'submit')
276
+ return await submit(options, client, token);
277
+ if (!options.run)
278
+ throw localError('invalid_run', 'Supply an import run ID.');
279
+ if (options.command === 'credentials') {
280
+ if (!options.manifest || !options.credentials)
281
+ throw localError('invalid_input', 'Credentials requires --manifest and --credentials.');
282
+ const plan = await importManifest(await readLocal(options.manifest, 1048576));
283
+ const bindings = credentialBindings(await readLocal(options.credentials, 8 * 1048576), plan.manifest);
284
+ const result = await client.credentials(options.run, plan.manifest, bindings, options.resolve ?? localResolver(options.env));
285
+ console.log(`Uploaded credentials for ${result.uploaded} source entries; ${result.skipped} already bound.`);
286
+ return 0;
287
+ }
288
+ const wait = options.waitSeconds ?? 0;
289
+ if (!Number.isInteger(wait) || wait < 0 || wait > 300)
290
+ throw localError('invalid_wait', 'Use --wait-seconds between 0 and 300.');
291
+ const now = options.now ?? Date.now;
292
+ const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
293
+ const deadline = now() + wait * 1000;
294
+ let reads = 0;
295
+ const readStatus = async () => {
296
+ while (true) {
297
+ if (wait > 0 && reads++ > wait)
298
+ throw new ImportClientError('wait_timeout', 3, 'Import status wait timed out.');
299
+ try {
300
+ return await client.status(options.run, wait > 0 ? deadline : undefined);
301
+ }
302
+ catch (error) {
303
+ if (!(error instanceof ImportClientError) || error.code !== 'rate_limited' || wait === 0)
304
+ throw error;
305
+ const delay = error.retryAfterMs ?? 1000;
306
+ if (delay > 30000 || now() + delay >= deadline)
307
+ throw new ImportClientError('wait_timeout', 3, 'Import status wait timed out.');
308
+ await sleep(delay);
309
+ }
310
+ }
311
+ };
312
+ if (options.command === 'verify')
313
+ await client.verify(options.run, wait > 0 ? deadline : undefined);
314
+ let status = await readStatus();
315
+ const pending = () => options.command === 'accept'
316
+ ? status.acceptedAt === null
317
+ : options.command === 'verify'
318
+ ? status.state !== 'verified'
319
+ : ['planned', 'applying', 'verifying'].includes(status.state);
320
+ // The iteration bound also limits waits when a test clock or system clock stops advancing.
321
+ for (let i = 0; i < wait && pending() && !failed(status) && (options.now ?? Date.now)() < deadline; i++) {
322
+ await sleep(Math.min(1000, Math.max(0, deadline - now())));
323
+ status = await readStatus();
324
+ }
325
+ printStatus(status, now());
326
+ if (failed(status))
327
+ return 1;
328
+ if (options.command === 'accept' && status.acceptedAt === null) {
329
+ console.log(`Accept run ${status.id} in the UI at ${client.origin}.`);
330
+ return 3;
331
+ }
332
+ return pending() && (wait > 0 || options.command === 'verify') ? 3 : 0;
333
+ }
334
+ catch (error) {
335
+ if (error instanceof ImportClientError) {
336
+ console.error(`${error.code}: ${error.message}`);
337
+ return error.exitCode;
338
+ }
339
+ console.error('import_failed: Import command failed.');
340
+ return 1;
341
+ }
342
+ }
343
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiRouteSpec } from '@package-broker/core/api/route';
2
+ /** The specs behind the served document: the API module routes plus the auth routes. */
3
+ export declare function servedApiSpecs(): readonly ApiRouteSpec[];
4
+ //# sourceMappingURL=openapi-specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-specs.d.ts","sourceRoot":"","sources":["../../src/commands/openapi-specs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAoEnE,wFAAwF;AACxF,wBAAgB,cAAc,IAAI,SAAS,YAAY,EAAE,CAsBxD"}
@@ -0,0 +1,94 @@
1
+ import { createApiModule } from '@package-broker/core/api/module';
2
+ import { AUTH_API } from '@package-broker/core/api/auth-schemas';
3
+ import * as access from '@package-broker/core/api/routes/access-schemas';
4
+ import * as imports from '@package-broker/core/api/routes/import.schemas';
5
+ import * as organization from '@package-broker/core/api/routes/organization-schemas';
6
+ import * as packages from '@package-broker/core/api/routes/packages-schemas';
7
+ import * as projectAccess from '@package-broker/core/api/routes/project-access-schemas';
8
+ import * as projects from '@package-broker/core/api/routes/projects-schemas';
9
+ import * as servicePrincipals from '@package-broker/core/api/routes/service-principals-schemas';
10
+ import * as sourceAttachments from '@package-broker/core/api/routes/source-attachment-schemas';
11
+ import * as sourceNames from '@package-broker/core/api/routes/source-names-schemas';
12
+ import * as sources from '@package-broker/core/api/routes/sources-schemas';
13
+ import * as tokens from '@package-broker/core/api/routes/tokens-schemas';
14
+ const MAX_STUB_ROUNDS = 1000;
15
+ const MISSING = /^API module requires dependency: dependencies\.(.+)$/;
16
+ /** Route construction never calls a dependency, so each required one is satisfied by a stub. */
17
+ function stubDependencies() {
18
+ const deps = {
19
+ imports: {},
20
+ sources: { service: { acceptRemoval: () => undefined } },
21
+ };
22
+ for (let round = 0; round < MAX_STUB_ROUNDS; round += 1) {
23
+ try {
24
+ createApiModule(deps);
25
+ return deps;
26
+ }
27
+ catch (error) {
28
+ const path = MISSING.exec(error instanceof Error ? error.message : '')?.[1]?.split('.');
29
+ if (path === undefined)
30
+ throw error;
31
+ let holder = deps;
32
+ for (const key of path.slice(0, -1))
33
+ holder = holder[key];
34
+ const leaf = path[path.length - 1];
35
+ holder[leaf] = holder[leaf] === undefined ? {} : () => undefined;
36
+ }
37
+ }
38
+ throw new Error('api_module_stub_failed');
39
+ }
40
+ function declaredSpecs() {
41
+ const byOperation = new Map();
42
+ const collect = (value) => {
43
+ if (Array.isArray(value))
44
+ value.forEach(collect);
45
+ else if (value !== null && typeof value === 'object') {
46
+ const spec = value;
47
+ if (typeof spec.method === 'string' && typeof spec.api?.operationId === 'string') {
48
+ byOperation.set(spec.api.operationId, spec);
49
+ }
50
+ }
51
+ };
52
+ for (const module of [
53
+ access,
54
+ imports,
55
+ organization,
56
+ packages,
57
+ projectAccess,
58
+ projects,
59
+ servicePrincipals,
60
+ sourceAttachments,
61
+ sourceNames,
62
+ sources,
63
+ tokens,
64
+ ]) {
65
+ Object.values(module).forEach(collect);
66
+ }
67
+ return byOperation;
68
+ }
69
+ /** The specs behind the served document: the API module routes plus the auth routes. */
70
+ export function servedApiSpecs() {
71
+ const declared = declaredSpecs();
72
+ const specs = [];
73
+ for (const route of createApiModule(stubDependencies()).routes) {
74
+ if (route.api === undefined || 'exempt' in route.api)
75
+ continue;
76
+ const source = declared.get(route.api.operationId);
77
+ specs.push({
78
+ method: route.method,
79
+ path: route.path,
80
+ permission: route.permission,
81
+ ...(route.boundary === undefined ? {} : { boundary: route.boundary }),
82
+ ...(route.allowArchived === true ? { allowArchived: true } : {}),
83
+ ...(source?.concurrency === undefined ? {} : { concurrency: source.concurrency }),
84
+ ...(source?.service === undefined ? {} : { service: source.service }),
85
+ api: route.api,
86
+ });
87
+ }
88
+ for (const [key, api] of Object.entries(AUTH_API)) {
89
+ const [method, path] = key.split(' ');
90
+ specs.push({ method, path, permission: null, api });
91
+ }
92
+ return specs;
93
+ }
94
+ //# sourceMappingURL=openapi-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-specs.js","sourceRoot":"","sources":["../../src/commands/openapi-specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ApiRouteSpec } from '@package-broker/core/api/route';
2
+ export declare function openapiCommand(deps: {
3
+ specs: () => readonly ApiRouteSpec[];
4
+ info: {
5
+ title: string;
6
+ version: string;
7
+ };
8
+ write: (path: string, bytes: string) => Promise<void>;
9
+ }): (out: string | undefined) => Promise<number>;
10
+ export declare const openApiVersion: string;
11
+ export declare const runOpenApi: (out: string | undefined) => Promise<number>;
12
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/commands/openapi.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,KAAK,EAAE,MAAM,SAAS,YAAY,EAAE,CAAC;IACrC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,CA6B/C;AAID,eAAO,MAAM,cAAc,QAA6B,CAAC;AACzD,eAAO,MAAM,UAAU,QAlCb,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,MAAM,CAsC7C,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { stat, writeFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import { generateOpenApi } from '@package-broker/core/api/openapi';
4
+ import { servedApiSpecs } from './openapi-specs.js';
5
+ export function openapiCommand(deps) {
6
+ return async (out) => {
7
+ if (!out) {
8
+ console.error('openapi_out_required');
9
+ return 2;
10
+ }
11
+ try {
12
+ let existing;
13
+ try {
14
+ existing = await stat(out);
15
+ }
16
+ catch (error) {
17
+ if (error.code !== 'ENOENT')
18
+ throw error;
19
+ }
20
+ if (existing?.isDirectory()) {
21
+ console.error('openapi_out_is_directory');
22
+ return 2;
23
+ }
24
+ const bytes = JSON.stringify(generateOpenApi(deps.specs(), deps.info));
25
+ await deps.write(out, bytes);
26
+ return 0;
27
+ }
28
+ catch (error) {
29
+ console.error(error instanceof Error && error.message === 'no_api_specs'
30
+ ? 'no_api_specs'
31
+ : 'openapi_failed');
32
+ return 1;
33
+ }
34
+ };
35
+ }
36
+ const pkg = createRequire(import.meta.url)('../../package.json');
37
+ // Release PRs bump package versions without regenerating the committed document; the API major stays stable across them.
38
+ export const openApiVersion = pkg.version.split('.')[0];
39
+ export const runOpenApi = openapiCommand({
40
+ specs: servedApiSpecs,
41
+ info: { title: 'Package Broker', version: openApiVersion },
42
+ write: (path, bytes) => writeFile(path, bytes, 'utf8'),
43
+ });
44
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/commands/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,cAAc,CAAC,IAI9B;IACC,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YACtE,CAAC;YACD,IAAI,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,OAAO,CAAC,CAAC;YACX,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc;gBACxD,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AACxF,yHAAyH;AACzH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC;IACvC,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE;IAC1D,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;CACvD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface AcceptRemovalOptions {
2
+ readonly url: string;
3
+ readonly source: string;
4
+ readonly env: Readonly<Record<string, string | undefined>>;
5
+ readonly fetch?: typeof fetch;
6
+ }
7
+ export declare function runSourceAcceptRemoval(options: AcceptRemovalOptions): Promise<number>;
8
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgE3F"}
@@ -0,0 +1,61 @@
1
+ import { SESSION_COOKIE, COOKIE_VALUE_PATTERN } from '@package-broker/core/auth/cookies';
2
+ import { isUlid } from '@package-broker/core/ids';
3
+ export async function runSourceAcceptRemoval(options) {
4
+ const say = (message) => console.error(`source accept-removal: ${message}`);
5
+ let origin;
6
+ try {
7
+ origin = new URL(options.url);
8
+ if (origin.protocol !== 'https:' ||
9
+ origin.username ||
10
+ origin.password ||
11
+ origin.pathname !== '/' ||
12
+ origin.search ||
13
+ origin.hash)
14
+ throw new TypeError();
15
+ }
16
+ catch {
17
+ say('invalid broker origin; use an HTTPS origin');
18
+ return 2;
19
+ }
20
+ if (!isUlid(options.source)) {
21
+ say('invalid source');
22
+ return 2;
23
+ }
24
+ const session = options.env['PB_SESSION'];
25
+ const csrf = options.env['PB_CSRF_TOKEN'];
26
+ if (!session ||
27
+ !COOKIE_VALUE_PATTERN.test(session) ||
28
+ !csrf ||
29
+ !/^[A-Za-z0-9_-]{43}$/.test(csrf)) {
30
+ say('set PB_SESSION and PB_CSRF_TOKEN from an organization admin session');
31
+ return 2;
32
+ }
33
+ try {
34
+ const response = await (options.fetch ?? fetch)(new URL(`/_pb/sources/${options.source}/accept-removal`, origin), {
35
+ method: 'POST',
36
+ redirect: 'error',
37
+ headers: {
38
+ origin: origin.origin,
39
+ cookie: `${SESSION_COOKIE}=${session}`,
40
+ 'x-csrf-token': csrf,
41
+ },
42
+ });
43
+ if (response.status === 204) {
44
+ console.log('Removal acceptance armed for the next refused sync.');
45
+ return 0;
46
+ }
47
+ say(response.status === 409
48
+ ? 'no acceptable refusal to accept'
49
+ : response.status === 404
50
+ ? 'source not found'
51
+ : response.status === 401 || response.status === 403
52
+ ? 'authorization refused'
53
+ : 'request failed');
54
+ return 1;
55
+ }
56
+ catch {
57
+ say('outcome unknown; check source state before retrying');
58
+ return 6;
59
+ }
60
+ }
61
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AASlD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAA6B;IACxE,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACpF,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IACE,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAC5B,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,QAAQ,KAAK,GAAG;YACvB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,IAAI;YAEX,MAAM,IAAI,SAAS,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,IACE,CAAC,OAAO;QACR,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;QACnC,CAAC,IAAI;QACL,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACjC,CAAC;QACD,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAC7C,IAAI,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,iBAAiB,EAAE,MAAM,CAAC,EAChE;YACE,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,GAAG,cAAc,IAAI,OAAO,EAAE;gBACtC,cAAc,EAAE,IAAI;aACrB;SACF,CACF,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,CACD,QAAQ,CAAC,MAAM,KAAK,GAAG;YACrB,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;oBAClD,CAAC,CAAC,uBAAuB;oBACzB,CAAC,CAAC,gBAAgB,CACzB,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,qDAAqD,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function runMigrateSqlite(o: {
2
+ file: string;
3
+ outDir: string;
4
+ dryRun: boolean;
5
+ }): Promise<number>;
6
+ export declare function runBootstrapSqlite(o: {
7
+ file: string;
8
+ slug: string;
9
+ name: string;
10
+ }): Promise<number>;
11
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/commands/sqlite.ts"],"names":[],"mappings":"AAmBA,wBAAsB,gBAAgB,CAAC,CAAC,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BlB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BlB"}