hatchkit 0.1.30 → 0.1.32

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 (41) hide show
  1. package/dist/adopt.d.ts.map +1 -1
  2. package/dist/adopt.js +38 -3
  3. package/dist/adopt.js.map +1 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +27 -6
  6. package/dist/config.js.map +1 -1
  7. package/dist/deploy/gh-actions-secrets.d.ts +16 -0
  8. package/dist/deploy/gh-actions-secrets.d.ts.map +1 -1
  9. package/dist/deploy/gh-actions-secrets.js +38 -0
  10. package/dist/deploy/gh-actions-secrets.js.map +1 -1
  11. package/dist/deploy/rollback.d.ts.map +1 -1
  12. package/dist/deploy/rollback.js +71 -2
  13. package/dist/deploy/rollback.js.map +1 -1
  14. package/dist/doctor.d.ts.map +1 -1
  15. package/dist/doctor.js +37 -17
  16. package/dist/doctor.js.map +1 -1
  17. package/dist/index.js +70 -9
  18. package/dist/index.js.map +1 -1
  19. package/dist/provision/index.d.ts +16 -1
  20. package/dist/provision/index.d.ts.map +1 -1
  21. package/dist/provision/index.js +62 -2
  22. package/dist/provision/index.js.map +1 -1
  23. package/dist/provision/s3-buckets.d.ts +16 -0
  24. package/dist/provision/s3-buckets.d.ts.map +1 -1
  25. package/dist/provision/s3-buckets.js +126 -44
  26. package/dist/provision/s3-buckets.js.map +1 -1
  27. package/dist/provision/s3.d.ts +77 -0
  28. package/dist/provision/s3.d.ts.map +1 -0
  29. package/dist/provision/s3.js +347 -0
  30. package/dist/provision/s3.js.map +1 -0
  31. package/dist/scaffold/manifest.d.ts +45 -5
  32. package/dist/scaffold/manifest.d.ts.map +1 -1
  33. package/dist/scaffold/manifest.js.map +1 -1
  34. package/dist/utils/cloudflare-api.d.ts +67 -5
  35. package/dist/utils/cloudflare-api.d.ts.map +1 -1
  36. package/dist/utils/cloudflare-api.js +133 -10
  37. package/dist/utils/cloudflare-api.js.map +1 -1
  38. package/dist/utils/run-ledger.d.ts +33 -0
  39. package/dist/utils/run-ledger.d.ts.map +1 -1
  40. package/dist/utils/run-ledger.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,347 @@
1
+ /*
2
+ * S3 / R2 token provisioning for the `hatchkit add` flow.
3
+ *
4
+ * Sister flow to `hatchkit provision s3` (s3-buckets.ts), which creates
5
+ * the bucket pair and mints a single shared token. THIS flow is the
6
+ * "buckets already exist; just give me scoped credentials" path. It's
7
+ * what runs when the project's `.hatchkit.json` declares `s3Buckets`
8
+ * (e.g. `s3Provider: "existing"`) and the user runs:
9
+ *
10
+ * hatchkit add <project> s3
11
+ *
12
+ * For each bucket entry in the manifest, we mint a Cloudflare R2
13
+ * **Account** API token (`POST /accounts/{id}/tokens`) scoped to that
14
+ * bucket only — Object Read + Write permissions. One token per bucket
15
+ * is the deliberate choice: narrower blast radius than a single
16
+ * multi-bucket token, and it matches the `R2_<NAME>_*` env-var naming
17
+ * the runtime expects (each bucket has its own credential pair).
18
+ *
19
+ * Source of truth for which tokens exist: the manifest. Each minted
20
+ * token's id is pinned under `s3Buckets[bucketKey].tokenId` in
21
+ * `.hatchkit.json` (committed) so re-runs reuse it instead of
22
+ * minting a duplicate, and `hatchkit remove <project> s3` knows
23
+ * which tokens to revoke. Credentials never go in the manifest —
24
+ * they live encrypted in `.env.production` only.
25
+ *
26
+ * Coexists with `hatchkit provision s3`'s shared-token model: that
27
+ * flow records ONE token id at `s3Buckets.tokenId` covering both
28
+ * built-in buckets (`assets` + `state`). Per-bucket tokens minted
29
+ * here use `s3Buckets[bucketKey].tokenId` instead — distinct field,
30
+ * distinct semantics.
31
+ *
32
+ * Inverse: `unprovisionR2BucketTokens` — revokes each token via
33
+ * DELETE /accounts/{id}/tokens/{id}. Called by `hatchkit remove`.
34
+ */
35
+ import { join } from "node:path";
36
+ import chalk from "chalk";
37
+ import ora from "ora";
38
+ import { readManifest, writeManifest } from "../scaffold/manifest.js";
39
+ import { CloudflareApi } from "../utils/cloudflare-api.js";
40
+ import { SECRET_KEYS, getSecret } from "../utils/secrets.js";
41
+ import { accountIdFromR2Endpoint } from "./s3-buckets.js";
42
+ /** Mint (or reuse) a per-bucket scoped R2 Account API token for every
43
+ * bucket declared in `.hatchkit.json` → `s3Buckets`. Returns the
44
+ * endpoint + per-bucket S3-style credential pairs ready for the env
45
+ * writer. The token id of every minted token is persisted into the
46
+ * manifest so re-runs are idempotent and destroy can clean up. */
47
+ export async function provisionR2BucketTokens(opts) {
48
+ const provider = "r2";
49
+ const manifest = readManifest(opts.projectDir);
50
+ if (!manifest) {
51
+ throw new Error(`No .hatchkit.json in ${opts.projectDir}. Run \`hatchkit adopt\` (or move into the project directory) first.`);
52
+ }
53
+ // Manifest's S3 provider must be R2-compatible. `existing` is the
54
+ // primary user-facing case (buckets pre-created elsewhere); `r2`
55
+ // means hatchkit created them itself. Both go through the same
56
+ // token-minting code path.
57
+ if (manifest.s3Provider !== "existing" && manifest.s3Provider !== "r2") {
58
+ if (manifest.s3Provider === "hetzner" || manifest.s3Provider === "aws") {
59
+ throw new Error(`s3Provider "${manifest.s3Provider}" is not yet supported by \`hatchkit add s3\`. Only Cloudflare R2 (provider "r2" or "existing") can mint scoped tokens today.`);
60
+ }
61
+ throw new Error(`s3Provider "${manifest.s3Provider}" — nothing to provision. Add s3Buckets to .hatchkit.json or run \`hatchkit provision s3\`.`);
62
+ }
63
+ const buckets = enumerateBuckets(manifest);
64
+ if (buckets.length === 0) {
65
+ throw new Error(`No s3Buckets declared in ${join(opts.projectDir, ".hatchkit.json")}. Add at least one bucket entry (e.g. "assets": { "name": "<bucket>", "publicUrl": "..." }) and re-run.`);
66
+ }
67
+ // Pull provider metadata (endpoint) from the global config store.
68
+ const { getStore } = await import("../config.js");
69
+ const meta = getStore().get(`providers.s3.${provider}`);
70
+ if (!meta || meta.status !== "configured" || !meta.endpoint) {
71
+ throw new Error(`R2 provider is not configured globally. Run \`hatchkit config add s3 r2\` to paste the admin token + endpoint, then re-run.`);
72
+ }
73
+ const accountId = accountIdFromR2Endpoint(meta.endpoint);
74
+ const adminToken = await getSecret(SECRET_KEYS.r2AdminToken);
75
+ if (!adminToken) {
76
+ throw new Error("R2 admin token missing from the keychain. Run `hatchkit config add s3 r2` to paste + verify it, then re-run.");
77
+ }
78
+ const cf = new CloudflareApi({ token: adminToken });
79
+ // Read the .env.production keys to know whether existing manifest
80
+ // tokens still have usable credentials in the file. CF doesn't
81
+ // expose the secret-access-key after creation, so a manifest token
82
+ // without matching env entries is effectively dead — re-mint.
83
+ const envPath = join(opts.projectDir, ".env.production");
84
+ const existingEnv = await readEnvKeysSet(envPath);
85
+ const bucketTokens = [];
86
+ const updatedBucketEntries = {};
87
+ for (const bucket of buckets) {
88
+ const existingTokenId = bucket.tokenId;
89
+ const reusable = existingTokenId && hasBucketEnvCreds(existingEnv, bucket.key);
90
+ let probe = null;
91
+ if (reusable) {
92
+ try {
93
+ probe = await cf.getAccountToken(accountId, existingTokenId);
94
+ }
95
+ catch (err) {
96
+ // Probe failure (network/permissions) — fall through to mint
97
+ // fresh. Better to lose one token to orphans than to keep
98
+ // running with credentials we can't verify.
99
+ console.log(chalk.dim(` · Couldn't verify R2 token ${existingTokenId.slice(0, 8)}… for ${bucket.key} (${err.message.split("\n")[0]}). Minting a fresh one.`));
100
+ }
101
+ }
102
+ if (reusable && probe?.status === "active") {
103
+ // Reuse: env already has the credentials, just record the entry.
104
+ bucketTokens.push({
105
+ bucketKey: bucket.key,
106
+ bucketName: bucket.name,
107
+ accessKeyId: existingTokenId,
108
+ secretAccessKey: "", // unknown to us; .env.production has the live one
109
+ tokenId: existingTokenId,
110
+ accountId,
111
+ minted: false,
112
+ });
113
+ updatedBucketEntries[bucket.key] = {
114
+ name: bucket.name,
115
+ publicUrl: bucket.publicUrl,
116
+ tokenId: existingTokenId,
117
+ };
118
+ console.log(chalk.dim(` · Reusing R2 account token ${existingTokenId.slice(0, 8)}… for bucket ${bucket.key} (alive in CF; creds in .env.production)`));
119
+ continue;
120
+ }
121
+ // Revoke a stale manifest token (status disabled/expired/404)
122
+ // before minting the replacement so we don't pile up orphans.
123
+ if (existingTokenId) {
124
+ try {
125
+ await cf.deleteAccountToken(accountId, existingTokenId);
126
+ }
127
+ catch {
128
+ /* best-effort */
129
+ }
130
+ }
131
+ const spinner = ora(`R2: minting scoped account token for bucket ${chalk.cyan(bucket.name)} (${bucket.key})`).start();
132
+ try {
133
+ const minted = await cf.createR2AccountToken({
134
+ accountId,
135
+ name: `hatchkit-${opts.projectName}-${bucket.key}`,
136
+ bucketNames: [bucket.name],
137
+ permissions: "read-write",
138
+ });
139
+ bucketTokens.push({
140
+ bucketKey: bucket.key,
141
+ bucketName: bucket.name,
142
+ accessKeyId: minted.accessKeyId,
143
+ secretAccessKey: minted.secretAccessKey,
144
+ tokenId: minted.tokenId,
145
+ accountId,
146
+ minted: true,
147
+ });
148
+ updatedBucketEntries[bucket.key] = {
149
+ name: bucket.name,
150
+ publicUrl: bucket.publicUrl,
151
+ tokenId: minted.tokenId,
152
+ };
153
+ spinner.succeed(`R2: minted account token for ${bucket.name} (id ${minted.tokenId.slice(0, 8)}…, visible in R2 → Manage R2 API Tokens)`);
154
+ }
155
+ catch (err) {
156
+ spinner.fail(`R2: minting account token for ${bucket.name} failed`);
157
+ const msg = err.message;
158
+ if (/9109|10000|10001|403|invalid api token/i.test(msg)) {
159
+ throw new Error(`${msg}\n\n → The admin token (s3:r2:admin-token) needs:\n · Account > Workers R2 Storage > Edit (list/access buckets)\n · Account Settings > Edit (mint per-project account tokens — commonly the missing one)\n → Edit at https://dash.cloudflare.com/profile/api-tokens, save, re-run.`);
160
+ }
161
+ throw err;
162
+ }
163
+ }
164
+ // Persist the per-bucket tokenIds back into the manifest. Preserve
165
+ // any other s3Buckets fields (like `tokenId` + `accountId` from a
166
+ // prior `provision s3` shared-token run, or built-in `state` entry
167
+ // we didn't touch on this run).
168
+ if (bucketTokens.some((bt) => bt.minted)) {
169
+ const merged = {
170
+ ...(manifest.s3Buckets ?? {}),
171
+ ...updatedBucketEntries,
172
+ };
173
+ const updated = { ...manifest, s3Buckets: merged };
174
+ writeManifest(opts.projectDir, updated);
175
+ }
176
+ return { endpoint: meta.endpoint, bucketTokens };
177
+ }
178
+ /** Convert a `provisionR2BucketTokens` result into the KEY=VALUE lines
179
+ * the orchestrator writes to `.env.production`. Names follow the
180
+ * R2_ prefix convention; for projects with a single bucket we ALSO
181
+ * emit unprefixed `R2_ACCESS_KEY_ID` / `R2_SECRET_ACCESS_KEY` aliases
182
+ * so existing single-bucket runtimes (which expect the unprefixed
183
+ * form) keep working without code changes.
184
+ *
185
+ * Reused tokens (where we don't know the secret-access-key; CF
186
+ * doesn't expose it after creation) emit only the bucket-name +
187
+ * endpoint lines — the existing encrypted .env.production is the
188
+ * source of truth for the credentials, and we don't want to overwrite
189
+ * it with a placeholder. */
190
+ export function renderR2BucketTokensEnv(result) {
191
+ const lines = [];
192
+ lines.push(`R2_ENDPOINT=${result.endpoint}`);
193
+ for (const bt of result.bucketTokens) {
194
+ const name = bt.bucketKey.toUpperCase();
195
+ lines.push(`R2_${name}_BUCKET=${bt.bucketName}`);
196
+ if (bt.minted) {
197
+ lines.push(`R2_${name}_ACCESS_KEY_ID=${bt.accessKeyId}`);
198
+ lines.push(`R2_${name}_SECRET_ACCESS_KEY=${bt.secretAccessKey}`);
199
+ }
200
+ }
201
+ // Single-bucket alias. Most single-bucket consumers (Next.js apps,
202
+ // standalone sync scripts) read R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY
203
+ // directly without the bucket-name segment. Skip when there's
204
+ // ambiguity (multi-bucket).
205
+ if (result.bucketTokens.length === 1 && result.bucketTokens[0].minted) {
206
+ const sole = result.bucketTokens[0];
207
+ lines.push(`R2_ACCESS_KEY_ID=${sole.accessKeyId}`);
208
+ lines.push(`R2_SECRET_ACCESS_KEY=${sole.secretAccessKey}`);
209
+ }
210
+ return lines;
211
+ }
212
+ /** Delete every per-bucket scoped R2 account token minted for this
213
+ * project, both upstream (CF API) and locally (manifest). Idempotent
214
+ * — missing upstream tokens count as `not-found`.
215
+ *
216
+ * Source of truth: the manifest's `s3Buckets[bucketKey].tokenId`
217
+ * fields. When the manifest is missing or unreadable, returns an
218
+ * empty result — the user must manually revoke tokens via the CF
219
+ * dashboard. (No keychain fallback exists for the per-bucket model;
220
+ * unlike the legacy single-token-per-project flow, tokens are never
221
+ * written to the OS keychain in the new design.) */
222
+ export async function unprovisionR2BucketTokens(opts) {
223
+ const out = { buckets: [] };
224
+ if (!opts.projectDir)
225
+ return out;
226
+ let manifest = null;
227
+ try {
228
+ manifest = readManifest(opts.projectDir);
229
+ }
230
+ catch {
231
+ return out;
232
+ }
233
+ if (!manifest)
234
+ return out;
235
+ const buckets = enumerateBuckets(manifest);
236
+ if (buckets.length === 0)
237
+ return out;
238
+ const accountId = manifest.s3Buckets?.accountId ?? deriveAccountId();
239
+ const adminToken = await getSecret(SECRET_KEYS.r2AdminToken);
240
+ if (!adminToken) {
241
+ throw new Error("R2 admin token not in keychain — re-add via `hatchkit config add s3 r2`, then retry remove.");
242
+ }
243
+ const cf = new CloudflareApi({ token: adminToken });
244
+ const resolvedAccountId = accountId ?? (await fallbackAccountId());
245
+ for (const bucket of buckets) {
246
+ const tokenId = bucket.tokenId;
247
+ if (!tokenId) {
248
+ out.buckets.push({ bucketKey: bucket.key, outcome: "not-found" });
249
+ continue;
250
+ }
251
+ if (!resolvedAccountId) {
252
+ throw new Error("Couldn't resolve the Cloudflare account id for this project — manifest has no `s3Buckets.accountId` and the global R2 endpoint is not set. Run `hatchkit config add s3 r2` to fix.");
253
+ }
254
+ let outcome = "not-found";
255
+ try {
256
+ outcome = await cf.deleteAccountToken(resolvedAccountId, tokenId);
257
+ }
258
+ catch (err) {
259
+ throw new Error(`Could not delete R2 account token for bucket ${bucket.key}: ${err.message}`);
260
+ }
261
+ out.buckets.push({ bucketKey: bucket.key, outcome });
262
+ }
263
+ // Wipe per-bucket tokenIds from the manifest (keep names + URLs —
264
+ // the buckets still exist; only the tokens are gone).
265
+ if (manifest.s3Buckets) {
266
+ const updated = { ...manifest.s3Buckets };
267
+ for (const bucket of buckets) {
268
+ const entry = updated[bucket.key];
269
+ if (entry && typeof entry === "object") {
270
+ updated[bucket.key] = {
271
+ name: entry.name,
272
+ publicUrl: entry.publicUrl,
273
+ };
274
+ }
275
+ }
276
+ writeManifest(opts.projectDir, { ...manifest, s3Buckets: updated });
277
+ }
278
+ return out;
279
+ }
280
+ /** Read the manifest's `s3Buckets` map into a stable, sorted list.
281
+ * Sort by key so multi-bucket runs always produce the same env-var
282
+ * order on disk. Skips the scalar `tokenId` / `accountId` fields
283
+ * that share the s3Buckets namespace — those belong to the legacy
284
+ * single-token flow, not to this per-bucket flow. */
285
+ function enumerateBuckets(manifest) {
286
+ const map = manifest.s3Buckets;
287
+ if (!map)
288
+ return [];
289
+ const entries = [];
290
+ for (const key of Object.keys(map).sort()) {
291
+ if (key === "tokenId" || key === "accountId")
292
+ continue;
293
+ const value = map[key];
294
+ if (!value || typeof value !== "object" || typeof value.name !== "string" || value.name === "")
295
+ continue;
296
+ entries.push({
297
+ key,
298
+ name: value.name,
299
+ publicUrl: value.publicUrl ?? null,
300
+ tokenId: value.tokenId,
301
+ });
302
+ }
303
+ return entries;
304
+ }
305
+ /** Read every `KEY=` line out of a `.env.production` file (encrypted or
306
+ * not — we only care about the keys present). Returns an empty set
307
+ * when the file doesn't exist. */
308
+ async function readEnvKeysSet(envPath) {
309
+ const { existsSync, readFileSync } = await import("node:fs");
310
+ if (!existsSync(envPath))
311
+ return new Set();
312
+ const text = readFileSync(envPath, "utf-8");
313
+ const out = new Set();
314
+ for (const line of text.split("\n")) {
315
+ const m = line.match(/^([A-Z][A-Z0-9_]*)=/);
316
+ if (m)
317
+ out.add(m[1]);
318
+ }
319
+ return out;
320
+ }
321
+ /** Returns true if the `.env.production` already has access-key + secret
322
+ * entries for the bucket, so reusing an existing manifest tokenId is
323
+ * safe (we won't be left with credentials we can't recover). Checks
324
+ * the prefixed `R2_<NAME>_*` form first; falls back to the unprefixed
325
+ * alias used for single-bucket projects. */
326
+ function hasBucketEnvCreds(envKeys, bucketKey) {
327
+ const upper = bucketKey.toUpperCase();
328
+ const prefixed = envKeys.has(`R2_${upper}_ACCESS_KEY_ID`) && envKeys.has(`R2_${upper}_SECRET_ACCESS_KEY`);
329
+ const aliased = envKeys.has("R2_ACCESS_KEY_ID") && envKeys.has("R2_SECRET_ACCESS_KEY");
330
+ return prefixed || aliased;
331
+ }
332
+ function deriveAccountId() {
333
+ return undefined;
334
+ }
335
+ async function fallbackAccountId() {
336
+ const { getStore } = await import("../config.js");
337
+ const meta = getStore().get("providers.s3.r2");
338
+ if (!meta?.endpoint)
339
+ return undefined;
340
+ try {
341
+ return accountIdFromR2Endpoint(meta.endpoint);
342
+ }
343
+ catch {
344
+ return undefined;
345
+ }
346
+ }
347
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/provision/s3.ts"],"names":[],"mappings":"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"}
@@ -45,10 +45,10 @@ export interface ProjectManifest {
45
45
  * Optional for back-compat with manifests written before this
46
46
  * field existed; readers should fall back to detection. */
47
47
  surfaces?: "server-only" | "client-only" | "both";
48
- /** S3 buckets provisioned by `hatchkit provision s3`. Names go in
49
- * the manifest (so re-runs are idempotent and `hatchkit destroy`
50
- * knows what to undo); credentials never do — those live in the
51
- * global config / OS keychain.
48
+ /** S3 buckets provisioned by `hatchkit provision s3`. Names + the
49
+ * shared token id go in the manifest (so re-runs are idempotent and
50
+ * `hatchkit destroy` knows what to undo); credentials never do —
51
+ * those live encrypted in `.env.production`.
52
52
  *
53
53
  * `assets` is the public bucket fronting NEXT_PUBLIC_ASSETS_BASE_URL
54
54
  * or equivalent. Reachable over HTTPS via either an r2.dev
@@ -58,16 +58,56 @@ export interface ProjectManifest {
58
58
  *
59
59
  * `publicUrl` is the canonical no-trailing-slash URL the runtime
60
60
  * should serve assets from. Always present on `assets`; null on
61
- * `state` (private buckets aren't publicly reachable). */
61
+ * `state` (private buckets aren't publicly reachable).
62
+ *
63
+ * `tokenId` + `accountId` (top-level) identify the Cloudflare R2
64
+ * Account API Token whose resource policy is scoped to whichever
65
+ * buckets exist for this project. ONE token covers both buckets —
66
+ * the runtime is a single app reading both. Destroy revokes the
67
+ * token via `DELETE /accounts/{accountId}/tokens/{tokenId}` after
68
+ * the buckets themselves are gone.
69
+ *
70
+ * Neither field is a credential — the token id is an identifier
71
+ * (= S3 access key id), and accountId is already public-safe. The
72
+ * actual access/secret pair lives encrypted in .env.production.
73
+ *
74
+ * Both are optional for back-compat with manifests written before
75
+ * account-token provisioning landed (legacy projects still have
76
+ * user-tokens stashed in the OS keychain; provision migrates them
77
+ * on next run). */
62
78
  s3Buckets?: {
63
79
  assets?: {
64
80
  name: string;
65
81
  publicUrl: string;
82
+ tokenId?: string;
66
83
  };
67
84
  state?: {
68
85
  name: string;
69
86
  publicUrl: null;
87
+ tokenId?: string;
70
88
  };
89
+ /** Shared Cloudflare R2 Account API Token id covering the
90
+ * built-in `assets`/`state` pair (one token, one resource policy
91
+ * listing both buckets). Recorded by `hatchkit provision s3`.
92
+ * Per-bucket tokens minted by `hatchkit add s3` for arbitrary
93
+ * user-declared buckets live under each bucket entry's own
94
+ * `tokenId` field instead. */
95
+ tokenId?: string;
96
+ /** Account that owns the buckets and the shared token. */
97
+ accountId?: string;
98
+ /** Arbitrary user-declared bucket entries (beyond the built-in
99
+ * `assets`/`state` pair) — `hatchkit add <project> s3` mints a
100
+ * per-bucket scoped R2 token for each one. The union value type
101
+ * also covers the scalar `tokenId`/`accountId` fields above:
102
+ * TS requires the index signature to be no narrower than any
103
+ * named property, so `string` (for those scalars) is part of
104
+ * the union. Callers narrow on `typeof === "object"` before
105
+ * reading `name` / `publicUrl` / `tokenId`. */
106
+ [key: string]: {
107
+ name: string;
108
+ publicUrl: string | null;
109
+ tokenId?: string;
110
+ } | string | undefined;
71
111
  };
72
112
  }
73
113
  /** Build a manifest from the internal ProjectConfig, explicitly
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAClD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,OAAO,EAAE,OAAO,gBAAgB,CAAC;IACjC,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0CAA0C;IAC1C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;6DACyD;IACzD,UAAU,EAAE,UAAU,CAAC;IACvB;qDACiD;IACjD,YAAY,EAAE,UAAU,GAAG,KAAK,CAAC;IACjC;;mDAE+C;IAC/C,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;oEACgE;IAChE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D;;;;;gEAK4D;IAC5D,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,MAAM,CAAC;IAClD;;;;;;;;;;;;;+DAa2D;IAC3D,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,IAAI,CAAA;SAAE,CAAC;KAC3C,CAAC;CACH;AAED;;oEAEoE;AACpE,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,eAAe,CAoBjB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAGhF;AAED;;;gCAGgC;AAChC,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiBvE"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAClD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,OAAO,EAAE,OAAO,gBAAgB,CAAC;IACjC,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0CAA0C;IAC1C,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;6DACyD;IACzD,UAAU,EAAE,UAAU,CAAC;IACvB;qDACiD;IACjD,YAAY,EAAE,UAAU,GAAG,KAAK,CAAC;IACjC;;mDAE+C;IAC/C,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;oEACgE;IAChE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D;;;;;gEAK4D;IAC5D,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,GAAG,MAAM,CAAC;IAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6BoB;IACpB,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/D,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,IAAI,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5D;;;;;uCAK+B;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,0DAA0D;QAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;;;;;;;wDAOgD;QAChD,CAAC,GAAG,EAAE,MAAM,GACR;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAC5D,MAAM,GACN,SAAS,CAAC;KACf,CAAC;CACH;AAED;;oEAEoE;AACpE,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,eAAe,CAoBjB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAGhF;AAED;;;gCAGgC;AAChC,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiBvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AA6DlC;;oEAEoE;AACpE,MAAM,UAAU,UAAU,CACxB,MAAqB,EACrB,KAAmB,EACnB,UAAkB;IAElB,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,UAAU;QACV,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,KAAK,EAAE;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,QAAyB;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;gCAGgC;AAChC,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QACzB,MAAgC,CAAC,OAAO,KAAK,gBAAgB,EAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,kCAAkC,gBAAgB,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAyB,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/scaffold/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAkGlC;;oEAEoE;AACpE,MAAM,UAAU,UAAU,CACxB,MAAqB,EACrB,KAAmB,EACnB,UAAkB;IAElB,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,UAAU;QACV,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,KAAK,EAAE;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,QAAyB;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;gCAGgC;AAChC,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QACzB,MAAgC,CAAC,OAAO,KAAK,gBAAgB,EAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,kCAAkC,gBAAgB,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAyB,CAAC;AACnC,CAAC"}
@@ -99,6 +99,16 @@ export declare class CloudflareApi {
99
99
  creation_date?: string;
100
100
  storage_class?: string;
101
101
  } | null>;
102
+ /** Delete a bucket. Idempotent: 404 → "not-found".
103
+ *
104
+ * Cloudflare refuses to delete a bucket that still has objects in
105
+ * it (returns 10039 / "bucket is not empty"); the caller should
106
+ * surface that as a `RollbackSkip` with a recipe for the user to
107
+ * empty manually rather than silently destroying their data.
108
+ * We don't auto-empty here — that's a destructive choice that
109
+ * belongs at the rollback layer, not the API client.
110
+ */
111
+ deleteR2Bucket(accountId: string, name: string): Promise<"deleted" | "not-found" | "not-empty">;
102
112
  /** Enable (or disable) the managed `pub-<hash>.r2.dev` public URL on
103
113
  * a bucket. Returns the assigned `pub-<hash>.r2.dev` hostname. */
104
114
  enableR2ManagedDomain(accountId: string, bucket: string, enabled?: boolean): Promise<{
@@ -157,12 +167,64 @@ export declare class CloudflareApi {
157
167
  /** S3 Secret Access Key — sha256(tokenValue), hex. */
158
168
  secretAccessKey: string;
159
169
  }>;
160
- /** Cached lookup of /user/tokens/permission_groups filtered to R2
161
- * groups. Returns at minimum the entries hatchkit looks up by name
162
- * in `createR2ApiToken`. */
163
- private permissionGroupsCache?;
170
+ /** Mint a per-bucket-scoped R2 **Account** API token via
171
+ * `POST /accounts/{accountId}/tokens`. Same resource policy shape as
172
+ * `createR2ApiToken`, but the token is account-scoped (visible in
173
+ * `R2 → Manage R2 API Tokens` in the dashboard, and tied to the
174
+ * account rather than the user — survives any one user being
175
+ * removed from the account).
176
+ *
177
+ * Why this exists alongside `createR2ApiToken`: the user-token
178
+ * variant predates this, requires `User > API Tokens > Edit` on
179
+ * the calling token, and tucks the result into a list users
180
+ * rarely visit (`Profile > API Tokens`). New code paths use this
181
+ * one; the user-token flavour stays for legacy migration only
182
+ * (revoking old user-tokens during provision).
183
+ *
184
+ * The calling token needs `Account Settings > Edit` (which lets it
185
+ * create account tokens). An R2-only admin token won't have that
186
+ * by default — the caller surfaces a hint when the 403 comes back.
187
+ */
188
+ createR2AccountToken(params: {
189
+ accountId: string;
190
+ name: string;
191
+ bucketNames: string[];
192
+ jurisdiction?: "default" | "eu" | "fedramp";
193
+ permissions?: "read" | "read-write";
194
+ }): Promise<{
195
+ tokenId: string;
196
+ tokenValue: string;
197
+ accessKeyId: string;
198
+ secretAccessKey: string;
199
+ }>;
200
+ /** GET /accounts/{accountId}/tokens/{tokenId} — used to verify a
201
+ * recorded token still exists (and isn't disabled/expired) before
202
+ * we trust the encrypted credentials in the project's
203
+ * .env.production. Returns null on 404. */
204
+ getAccountToken(accountId: string, tokenId: string): Promise<{
205
+ id: string;
206
+ status: string;
207
+ name: string;
208
+ } | null>;
209
+ /** DELETE /accounts/{accountId}/tokens/{tokenId} — used by the
210
+ * destroy / rollback flow to take the per-bucket token down with
211
+ * its bucket(s). Idempotent: 404 → "not-found". */
212
+ deleteAccountToken(accountId: string, tokenId: string): Promise<"deleted" | "not-found">;
213
+ /** Cached lookup of permission groups. Pass `accountId` to use the
214
+ * per-account endpoint (preferred — works with R2 admin tokens that
215
+ * don't have `User > API Tokens > Read`). When `accountId` is
216
+ * omitted, falls back to `/user/tokens/permission_groups` for the
217
+ * legacy `createR2ApiToken` (user-token) path. Both return the same
218
+ * permission group catalog.
219
+ *
220
+ * Cache is keyed on `accountId ?? ""` so user-token + account-token
221
+ * flows can coexist in one process without crosstalk. */
222
+ private permissionGroupsCache;
164
223
  private getR2PermissionGroups;
165
- /** Delete a Cloudflare API token by id. Idempotent: 404 → "not-found". */
224
+ /** Delete a USER-scoped API token by id (`DELETE /user/tokens/{id}`).
225
+ * Distinct from `deleteAccountToken` — this is used during
226
+ * migration to clean up the legacy user-tokens hatchkit minted
227
+ * before we switched provisioning to account tokens. Idempotent. */
166
228
  deleteApiToken(tokenId: string): Promise<"deleted" | "not-found">;
167
229
  /** Attach a custom domain (a hostname on a Cloudflare zone you own)
168
230
  * to an R2 bucket. Idempotent — duplicates short-circuit via list. */
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare-api.d.ts","sourceRoot":"","sources":["../../src/utils/cloudflare-api.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,kCAAkC;AAClC,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,OAAO,EAAE,oBAAoB;YAK3B,OAAO;IAoBrB,iDAAiD;IAC3C,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IA2B5C,gEAAgE;IAC1D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAOjE,6DAA6D;IACvD,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,GAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAQhG;;;qEAGiE;IAC3D,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IA8B9D;4EACwE;IAClE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;IA0BtF;;;gEAG4D;IACtD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzE,0DAA0D;IACpD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASzF;;;;;;;;;;;;;;;;;;;;+DAoB2D;IAoB3D;sEACkE;IAC5D,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAAA;KAAO,GACnF,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAwBF,gDAAgD;IAC1C,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI,CAAC;IAST;uEACmE;IAC7D,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,UAAO,GACb,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAMlE;iDAC6C;IACvC,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CACR,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAC3F;IAeD;;;;;;;;;;;;;;;;;;oEAkBgE;IAC1D,gBAAgB,CAAC,MAAM,EAAE;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB;kCAC0B;QAC1B,IAAI,EAAE,MAAM,CAAC;QACb,uEAAuE;QACvE,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB;8EACsE;QACtE,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;QAC5C,wEAAwE;QACxE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;KACrC,GAAG,OAAO,CAAC;QACV,6DAA6D;QAC7D,OAAO,EAAE,MAAM,CAAC;QAChB,+CAA+C;QAC/C,UAAU,EAAE,MAAM,CAAC;QACnB,yEAAyE;QACzE,WAAW,EAAE,MAAM,CAAC;QACpB,sDAAsD;QACtD,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAkDF;;iCAE6B;IAC7B,OAAO,CAAC,qBAAqB,CAAC,CAAsC;YACtD,qBAAqB;IAiBnC,0EAA0E;IACpE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;IAUvE;2EACuE;IACjE,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;KAAE,GACjF,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAoB5E,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAC;YAAC,EAAE,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC3D,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC;CAkDH"}
1
+ {"version":3,"file":"cloudflare-api.d.ts","sourceRoot":"","sources":["../../src/utils/cloudflare-api.ts"],"names":[],"mappings":"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"}