hatchkit 0.1.22 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adopt.d.ts.map +1 -1
- package/dist/adopt.js +119 -5
- package/dist/adopt.js.map +1 -1
- package/dist/completion.d.ts.map +1 -1
- package/dist/completion.js +2 -0
- package/dist/completion.js.map +1 -1
- package/dist/config.d.ts +36 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +138 -3
- package/dist/config.js.map +1 -1
- package/dist/deploy/coolify-app.d.ts +10 -2
- package/dist/deploy/coolify-app.d.ts.map +1 -1
- package/dist/deploy/coolify-app.js +191 -13
- package/dist/deploy/coolify-app.js.map +1 -1
- package/dist/deploy/coolify.d.ts.map +1 -1
- package/dist/deploy/coolify.js +30 -17
- package/dist/deploy/coolify.js.map +1 -1
- package/dist/deploy/ghcr.d.ts +68 -0
- package/dist/deploy/ghcr.d.ts.map +1 -0
- package/dist/deploy/ghcr.js +228 -0
- package/dist/deploy/ghcr.js.map +1 -0
- package/dist/deploy/rollback.d.ts.map +1 -1
- package/dist/deploy/rollback.js +12 -0
- package/dist/deploy/rollback.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +83 -2
- package/dist/doctor.js.map +1 -1
- package/dist/explain.js +1 -1
- package/dist/explain.js.map +1 -1
- package/dist/index.js +126 -4
- package/dist/index.js.map +1 -1
- package/dist/prompts.js +1 -1
- package/dist/prompts.js.map +1 -1
- package/dist/provision/s3-buckets.d.ts +62 -0
- package/dist/provision/s3-buckets.d.ts.map +1 -0
- package/dist/provision/s3-buckets.js +376 -0
- package/dist/provision/s3-buckets.js.map +1 -0
- package/dist/scaffold/manifest.d.ts +24 -0
- package/dist/scaffold/manifest.d.ts.map +1 -1
- package/dist/scaffold/manifest.js.map +1 -1
- package/dist/utils/cloudflare-api.d.ts +88 -0
- package/dist/utils/cloudflare-api.d.ts.map +1 -1
- package/dist/utils/cloudflare-api.js +174 -0
- package/dist/utils/cloudflare-api.js.map +1 -1
- package/dist/utils/coolify-api.d.ts +39 -1
- package/dist/utils/coolify-api.d.ts.map +1 -1
- package/dist/utils/coolify-api.js +56 -0
- package/dist/utils/coolify-api.js.map +1 -1
- package/dist/utils/run-ledger.d.ts +8 -0
- package/dist/utils/run-ledger.d.ts.map +1 -1
- package/dist/utils/run-ledger.js.map +1 -1
- package/dist/utils/secrets.d.ts +14 -0
- package/dist/utils/secrets.d.ts.map +1 -1
- package/dist/utils/secrets.js +14 -0
- package/dist/utils/secrets.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* S3/R2 bucket provisioning for adopted projects.
|
|
3
|
+
*
|
|
4
|
+
* Closes the gap between `hatchkit config add s3 r2` (which only stores
|
|
5
|
+
* credentials in the global config + keychain) and a project that
|
|
6
|
+
* actually needs working buckets + env wiring at runtime. Splits the
|
|
7
|
+
* provisioning into two clear roles:
|
|
8
|
+
*
|
|
9
|
+
* · "assets" — public, hot path. Fronts large pre-built media
|
|
10
|
+
* (AVIF/WebP/originals). Public URL goes into a
|
|
11
|
+
* NEXT_PUBLIC_ASSETS_BASE_URL-style env var so the
|
|
12
|
+
* client can fetch directly.
|
|
13
|
+
* · "state" — private, cold. Used for small server-side files
|
|
14
|
+
* (cron state, audit logs). Never publicly reachable.
|
|
15
|
+
*
|
|
16
|
+
* Public URL strategy for the assets bucket, in order:
|
|
17
|
+
* 1. Custom domain on a Cloudflare zone the user owns
|
|
18
|
+
* (`assets.<project-domain>` or a caller-provided override) —
|
|
19
|
+
* preferred long-term, no `r2.dev` rate limits.
|
|
20
|
+
* 2. Managed `pub-<hash>.r2.dev` domain — fallback when no zone
|
|
21
|
+
* matches the project's domain.
|
|
22
|
+
*
|
|
23
|
+
* Env var names are project-specific. Some projects standardised on
|
|
24
|
+
* R2_*; others on the generic S3_* / AWS_* set the starter ships. We
|
|
25
|
+
* sniff the project's `.env.example` for whichever prefix the runtime
|
|
26
|
+
* already reads, so the seeded values match. Without this the env
|
|
27
|
+
* lands under names the app's `process.env.X` calls won't pick up.
|
|
28
|
+
*
|
|
29
|
+
* Idempotent on every step: existing buckets are reused (409 →
|
|
30
|
+
* success), existing managed/custom domains are re-fetched, and env
|
|
31
|
+
* vars overwrite in place (so re-runs after a failure don't duplicate
|
|
32
|
+
* lines or leave the file half-written).
|
|
33
|
+
*/
|
|
34
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
35
|
+
import { join } from "node:path";
|
|
36
|
+
import { set as dotenvxSet } from "@dotenvx/dotenvx";
|
|
37
|
+
import chalk from "chalk";
|
|
38
|
+
import ora from "ora";
|
|
39
|
+
import { getDnsConfig, getS3Config } from "../config.js";
|
|
40
|
+
import { MANIFEST_FILENAME, readManifest, writeManifest, } from "../scaffold/manifest.js";
|
|
41
|
+
import { CloudflareApi } from "../utils/cloudflare-api.js";
|
|
42
|
+
import { SECRET_KEYS, getSecret } from "../utils/secrets.js";
|
|
43
|
+
/** Account ID = the subdomain in the S3 endpoint
|
|
44
|
+
* `https://<accountId>.r2.cloudflarestorage.com`. */
|
|
45
|
+
export function accountIdFromR2Endpoint(endpoint) {
|
|
46
|
+
const m = endpoint.match(/https?:\/\/([0-9a-f]{32})\.r2\.cloudflarestorage\.com/i);
|
|
47
|
+
if (!m)
|
|
48
|
+
throw new Error(`Endpoint ${endpoint} doesn't look like an R2 S3 endpoint.`);
|
|
49
|
+
return m[1];
|
|
50
|
+
}
|
|
51
|
+
/** Sniff the project's `.env.example` (and falling back to source files)
|
|
52
|
+
* to pick the env-var prefix the runtime already reads. Some projects
|
|
53
|
+
* use R2_*, others S3_*, others AWS_*. Picking the wrong prefix here
|
|
54
|
+
* is the difference between "deploys" and "deploys but every request
|
|
55
|
+
* throws Missing required env var". */
|
|
56
|
+
export function detectEnvPrefix(projectDir) {
|
|
57
|
+
const candidates = [
|
|
58
|
+
join(projectDir, ".env.example"),
|
|
59
|
+
join(projectDir, ".env.development"),
|
|
60
|
+
join(projectDir, ".env.production"),
|
|
61
|
+
];
|
|
62
|
+
let r2 = 0;
|
|
63
|
+
let s3 = 0;
|
|
64
|
+
let aws = 0;
|
|
65
|
+
for (const p of candidates) {
|
|
66
|
+
if (!existsSync(p))
|
|
67
|
+
continue;
|
|
68
|
+
const text = readFileSync(p, "utf-8");
|
|
69
|
+
r2 += (text.match(/(^|\s)R2_[A-Z_]+\s*=/gm) ?? []).length;
|
|
70
|
+
s3 += (text.match(/(^|\s)S3_[A-Z_]+\s*=/gm) ?? []).length;
|
|
71
|
+
aws += (text.match(/(^|\s)AWS_(REGION|ACCESS_KEY_ID|SECRET_ACCESS_KEY)\s*=/gm) ?? []).length;
|
|
72
|
+
}
|
|
73
|
+
// Highest wins; ties prefer R2 (most explicit) > S3 > AWS.
|
|
74
|
+
const pairs = [
|
|
75
|
+
["R2", r2],
|
|
76
|
+
["S3", s3],
|
|
77
|
+
["AWS", aws],
|
|
78
|
+
];
|
|
79
|
+
pairs.sort((a, b) => b[1] - a[1]);
|
|
80
|
+
if (pairs[0][1] === 0)
|
|
81
|
+
return "S3"; // nothing detected — match starter default
|
|
82
|
+
return pairs[0][0];
|
|
83
|
+
}
|
|
84
|
+
/** Map the detected prefix to the full set of env var names. R2 and S3
|
|
85
|
+
* use distinct endpoint/bucket names but share the access-key shape;
|
|
86
|
+
* AWS uses the AWS_* triple instead of S3_*. */
|
|
87
|
+
export function envKeysForPrefix(prefix) {
|
|
88
|
+
if (prefix === "R2") {
|
|
89
|
+
return {
|
|
90
|
+
endpoint: "R2_ENDPOINT",
|
|
91
|
+
accessKey: "R2_ACCESS_KEY_ID",
|
|
92
|
+
secretKey: "R2_SECRET_ACCESS_KEY",
|
|
93
|
+
region: "R2_REGION",
|
|
94
|
+
bucket: "R2_STATE_BUCKET",
|
|
95
|
+
publicUrl: "NEXT_PUBLIC_ASSETS_BASE_URL",
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (prefix === "AWS") {
|
|
99
|
+
return {
|
|
100
|
+
endpoint: "S3_ENDPOINT",
|
|
101
|
+
accessKey: "AWS_ACCESS_KEY_ID",
|
|
102
|
+
secretKey: "AWS_SECRET_ACCESS_KEY",
|
|
103
|
+
region: "AWS_REGION",
|
|
104
|
+
bucket: "S3_BUCKET_NAME",
|
|
105
|
+
publicUrl: "S3_PUBLIC_URL",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
endpoint: "S3_ENDPOINT",
|
|
110
|
+
accessKey: "S3_ACCESS_KEY_ID",
|
|
111
|
+
secretKey: "S3_SECRET_ACCESS_KEY",
|
|
112
|
+
region: "S3_REGION",
|
|
113
|
+
bucket: "S3_BUCKET_NAME",
|
|
114
|
+
publicUrl: "S3_PUBLIC_URL",
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Read existing keys in `.env.production` so re-runs don't clobber a
|
|
118
|
+
* value the user has since edited. Returns the set of plain or
|
|
119
|
+
* encrypted KEYs present (we don't try to decrypt — encrypted values
|
|
120
|
+
* always have a `KEY="encrypted:..."` shape). */
|
|
121
|
+
function existingEnvKeys(envPath) {
|
|
122
|
+
if (!existsSync(envPath))
|
|
123
|
+
return new Set();
|
|
124
|
+
const text = readFileSync(envPath, "utf-8");
|
|
125
|
+
const keys = new Set();
|
|
126
|
+
for (const line of text.split("\n")) {
|
|
127
|
+
const m = line.match(/^([A-Z][A-Z0-9_]*)=/);
|
|
128
|
+
if (m)
|
|
129
|
+
keys.add(m[1]);
|
|
130
|
+
}
|
|
131
|
+
return keys;
|
|
132
|
+
}
|
|
133
|
+
/** Build the rclone config snippet the user can paste into
|
|
134
|
+
* `~/.config/rclone/rclone.conf`. Keeps this OUT of the file system
|
|
135
|
+
* (the user's existing rclone config has other remotes — we don't
|
|
136
|
+
* want to mangle them). */
|
|
137
|
+
function buildRcloneSnippet(opts) {
|
|
138
|
+
return [
|
|
139
|
+
`[${opts.remoteName}]`,
|
|
140
|
+
`type = s3`,
|
|
141
|
+
`provider = Cloudflare`,
|
|
142
|
+
`access_key_id = ${opts.accessKey}`,
|
|
143
|
+
`secret_access_key = ${opts.secretKey}`,
|
|
144
|
+
`endpoint = ${opts.endpoint}`,
|
|
145
|
+
`acl = private`,
|
|
146
|
+
`no_check_bucket = true`,
|
|
147
|
+
"",
|
|
148
|
+
].join("\n");
|
|
149
|
+
}
|
|
150
|
+
/** Provision the public+private bucket pair for an adopted project,
|
|
151
|
+
* wire the resulting credentials/URLs into its `.env.production`, and
|
|
152
|
+
* record the bucket names in `.hatchkit.json`. Idempotent on re-run. */
|
|
153
|
+
export async function provisionS3ForProject(opts) {
|
|
154
|
+
const provider = opts.provider ?? "r2";
|
|
155
|
+
const manifest = readManifest(opts.projectDir);
|
|
156
|
+
if (!manifest) {
|
|
157
|
+
throw new Error(`No ${MANIFEST_FILENAME} in ${opts.projectDir}. Run \`hatchkit adopt\` first.`);
|
|
158
|
+
}
|
|
159
|
+
// Provider config + credentials. Both must be present — without
|
|
160
|
+
// them we'd be writing CHANGE_ME values into the encrypted file,
|
|
161
|
+
// which is worse than failing fast.
|
|
162
|
+
const s3 = await getS3Config(provider);
|
|
163
|
+
if (!s3) {
|
|
164
|
+
throw new Error(`S3 provider "${provider}" is not configured. Run \`hatchkit config add s3\` and pick ${provider}.`);
|
|
165
|
+
}
|
|
166
|
+
if (!s3.endpoint) {
|
|
167
|
+
throw new Error(`S3 provider "${provider}" has no endpoint set in global config.`);
|
|
168
|
+
}
|
|
169
|
+
if (provider !== "r2") {
|
|
170
|
+
throw new Error(`Bucket auto-provisioning is only implemented for R2 today (got ${provider}). The runtime env wiring still works for any S3 — see \`hatchkit provision s3 --skip-create\` (TODO).`);
|
|
171
|
+
}
|
|
172
|
+
const accountId = accountIdFromR2Endpoint(s3.endpoint);
|
|
173
|
+
// DNS config — needed only when we're about to attempt a custom
|
|
174
|
+
// domain. Absence is fine; we fall back to the managed r2.dev URL.
|
|
175
|
+
const dns = await getDnsConfig();
|
|
176
|
+
// R2 admin token. Kept separate from the DNS token because the DNS
|
|
177
|
+
// token is typically scoped narrowly (Zone:DNS:Edit + Zone:Zone:Read)
|
|
178
|
+
// and the R2 admin endpoints need account-level perms. Caller
|
|
179
|
+
// (handleProvisionS3) is responsible for prompting + storing this
|
|
180
|
+
// when missing — this function fails fast so non-interactive callers
|
|
181
|
+
// (adopt's auto-step) get a clear hint instead of an opaque 10000.
|
|
182
|
+
const adminToken = await getSecret(SECRET_KEYS.r2AdminToken);
|
|
183
|
+
if (!adminToken) {
|
|
184
|
+
throw new Error("R2 admin token not configured. Run `hatchkit provision s3` interactively, " +
|
|
185
|
+
"or pre-set with: hatchkit config add s3 (TODO) — needs Account > Workers R2 Storage > Edit.");
|
|
186
|
+
}
|
|
187
|
+
// For the zone lookup (custom-domain attach) we need the DNS token's
|
|
188
|
+
// Zone:Zone:Read; the admin token may or may not have it. Use whichever
|
|
189
|
+
// we have available, preferring the DNS token because that's the one
|
|
190
|
+
// that's been verified for zone reads in `hatchkit doctor`.
|
|
191
|
+
const zoneToken = dns?.provider === "cloudflare" ? (dns.apiToken ?? adminToken) : adminToken;
|
|
192
|
+
const cf = new CloudflareApi({ token: adminToken });
|
|
193
|
+
const cfZone = new CloudflareApi({ token: zoneToken });
|
|
194
|
+
const projectName = manifest.name;
|
|
195
|
+
const domain = manifest.domain;
|
|
196
|
+
const assetsBucketName = opts.assetsBucketName ?? `${projectName}-assets`;
|
|
197
|
+
const stateBucketName = opts.stateBucketName ?? `${projectName}-state`;
|
|
198
|
+
const locationHint = opts.locationHint ?? "weur";
|
|
199
|
+
// 1. Create the two buckets (idempotent).
|
|
200
|
+
const spinner = ora(`Creating R2 buckets (${assetsBucketName}, ${stateBucketName})`).start();
|
|
201
|
+
let assetsBucket;
|
|
202
|
+
let stateBucket;
|
|
203
|
+
try {
|
|
204
|
+
assetsBucket = await cf.createR2Bucket(accountId, assetsBucketName, { locationHint });
|
|
205
|
+
stateBucket = await cf.createR2Bucket(accountId, stateBucketName, { locationHint });
|
|
206
|
+
spinner.succeed(`R2 buckets ready — ${assetsBucketName} (${assetsBucket.existed ? "exists" : "created"}), ${stateBucketName} (${stateBucket.existed ? "exists" : "created"})`);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
spinner.fail("R2 bucket creation failed");
|
|
210
|
+
const msg = err.message;
|
|
211
|
+
if (/403|10001|permission/i.test(msg)) {
|
|
212
|
+
throw new Error(`${msg}\n\n → Cloudflare token is missing the "Workers R2 Storage: Edit" permission.\n → Edit it at https://dash.cloudflare.com/profile/api-tokens, then re-run.`);
|
|
213
|
+
}
|
|
214
|
+
throw err;
|
|
215
|
+
}
|
|
216
|
+
// 2. Public URL for the assets bucket. Prefer a custom domain on a
|
|
217
|
+
// Cloudflare zone we own; fall back to the managed r2.dev URL.
|
|
218
|
+
let publicUrl;
|
|
219
|
+
let publicUrlSource;
|
|
220
|
+
// Pick the hostname. Default `assets.<domain>`; allow caller override.
|
|
221
|
+
const customHostname = opts.publicHostname ?? `assets.${domain}`;
|
|
222
|
+
// Find the closest matching zone (the registrable name — last
|
|
223
|
+
// two labels of the host, or the host itself if the user passed a
|
|
224
|
+
// bare apex).
|
|
225
|
+
const zoneName = pickClosestZoneName(customHostname);
|
|
226
|
+
try {
|
|
227
|
+
const zone = await cfZone.getZoneByName(zoneName);
|
|
228
|
+
if (zone) {
|
|
229
|
+
const customSpinner = ora(`Attaching custom domain ${customHostname}`).start();
|
|
230
|
+
try {
|
|
231
|
+
const cd = await cf.addR2CustomDomain(accountId, assetsBucketName, {
|
|
232
|
+
domain: customHostname,
|
|
233
|
+
zoneId: zone.id,
|
|
234
|
+
minTLS: "1.2",
|
|
235
|
+
});
|
|
236
|
+
publicUrl = `https://${cd.domain}`;
|
|
237
|
+
publicUrlSource = "custom-domain";
|
|
238
|
+
customSpinner.succeed(`Custom domain ${cd.existed ? "already attached" : "attached"} — ${publicUrl}`);
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
customSpinner.warn(`Custom domain failed (${err.message.split("\n")[0]}) — falling back to r2.dev managed URL`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
// Zone lookup is best-effort. Don't fail the whole flow on it.
|
|
247
|
+
console.log(chalk.dim(` · Zone lookup for ${zoneName} failed: ${err.message.split("\n")[0]}`));
|
|
248
|
+
}
|
|
249
|
+
if (!publicUrl) {
|
|
250
|
+
const managedSpinner = ora(`Enabling managed r2.dev URL on ${assetsBucketName}`).start();
|
|
251
|
+
try {
|
|
252
|
+
const md = await cf.enableR2ManagedDomain(accountId, assetsBucketName, true);
|
|
253
|
+
publicUrl = `https://${md.domain}`;
|
|
254
|
+
publicUrlSource = "managed-r2dev";
|
|
255
|
+
managedSpinner.succeed(`Managed r2.dev URL enabled — ${publicUrl}`);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
managedSpinner.fail("Could not enable a public URL on the assets bucket");
|
|
259
|
+
throw err;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// 3. Seed `.env.production` with the credentials + URLs. Names are
|
|
263
|
+
// chosen by the prefix the project's runtime actually reads —
|
|
264
|
+
// detected from `.env.example` etc.
|
|
265
|
+
const envPrefix = opts.envPrefix ?? detectEnvPrefix(opts.projectDir);
|
|
266
|
+
const keys = envKeysForPrefix(envPrefix);
|
|
267
|
+
const envPath = join(opts.projectDir, ".env.production");
|
|
268
|
+
const existingKeys = existingEnvKeys(envPath);
|
|
269
|
+
const toWrite = [];
|
|
270
|
+
const skip = (key) => existingKeys.has(key);
|
|
271
|
+
// ENDPOINT, ACCESS_KEY, SECRET_KEY, REGION are credentials that
|
|
272
|
+
// the runtime always needs. Re-write on every run (cheap, and the
|
|
273
|
+
// user might've rotated keys). REGION is "auto" for R2 — the SDK
|
|
274
|
+
// ignores it anyway when an explicit endpoint is given, but
|
|
275
|
+
// setting it suppresses an `AWS_REGION` warning at runtime.
|
|
276
|
+
toWrite.push({ key: keys.endpoint, value: s3.endpoint });
|
|
277
|
+
toWrite.push({ key: keys.accessKey, value: s3.accessKey });
|
|
278
|
+
toWrite.push({ key: keys.secretKey, value: s3.secretKey });
|
|
279
|
+
toWrite.push({ key: keys.region, value: s3.region ?? "auto" });
|
|
280
|
+
// BUCKET name — keys.bucket is "<PREFIX>_STATE_BUCKET" for R2 (the
|
|
281
|
+
// private bucket is the only one a server lib reads through env;
|
|
282
|
+
// assets are URL-driven). For S3/AWS prefixes the canonical key is
|
|
283
|
+
// <PREFIX>_BUCKET_NAME pointing at the assets bucket. Match the
|
|
284
|
+
// semantics of each prefix.
|
|
285
|
+
if (envPrefix === "R2") {
|
|
286
|
+
toWrite.push({ key: keys.bucket, value: stateBucketName });
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
toWrite.push({ key: keys.bucket, value: assetsBucketName });
|
|
290
|
+
}
|
|
291
|
+
// Public URL — only seed if the project's runtime reads the
|
|
292
|
+
// matching key. Detected via `.env.example` keys for both the
|
|
293
|
+
// primary (`NEXT_PUBLIC_ASSETS_BASE_URL`) and the prefixed fallback.
|
|
294
|
+
// Always write it under NEXT_PUBLIC_ASSETS_BASE_URL when present in
|
|
295
|
+
// .env.example since that's the next.js convention; under
|
|
296
|
+
// <PREFIX>_PUBLIC_URL for non-Next projects.
|
|
297
|
+
const examplePath = join(opts.projectDir, ".env.example");
|
|
298
|
+
const exampleText = existsSync(examplePath) ? readFileSync(examplePath, "utf-8") : "";
|
|
299
|
+
const usesNextPublicAssets = /NEXT_PUBLIC_ASSETS_BASE_URL/.test(exampleText);
|
|
300
|
+
if (usesNextPublicAssets) {
|
|
301
|
+
toWrite.push({ key: "NEXT_PUBLIC_ASSETS_BASE_URL", value: publicUrl });
|
|
302
|
+
}
|
|
303
|
+
else if (envPrefix === "S3" || envPrefix === "AWS") {
|
|
304
|
+
toWrite.push({ key: keys.publicUrl, value: publicUrl });
|
|
305
|
+
}
|
|
306
|
+
// CRON_SECRET — the project's .env.example documents one if it has
|
|
307
|
+
// a cron route. Generate fresh, encrypt. Skip if already set.
|
|
308
|
+
if (opts.generateCronSecret !== false &&
|
|
309
|
+
/CRON_SECRET/.test(exampleText) &&
|
|
310
|
+
!skip("CRON_SECRET")) {
|
|
311
|
+
const { randomBytes } = await import("node:crypto");
|
|
312
|
+
toWrite.push({ key: "CRON_SECRET", value: randomBytes(32).toString("hex") });
|
|
313
|
+
}
|
|
314
|
+
const envWritten = [];
|
|
315
|
+
const envKept = [];
|
|
316
|
+
const envSpinner = ora(`Writing ${toWrite.length} entries to .env.production`).start();
|
|
317
|
+
try {
|
|
318
|
+
for (const { key, value } of toWrite) {
|
|
319
|
+
// Idempotency: re-write everything except CRON_SECRET (treated
|
|
320
|
+
// above) on every run. dotenvx.set overwrites in place, so
|
|
321
|
+
// values stay singletons in the file.
|
|
322
|
+
if (key === "CRON_SECRET" && skip(key)) {
|
|
323
|
+
envKept.push(key);
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
dotenvxSet(key, value, { path: envPath, encrypt: true });
|
|
327
|
+
envWritten.push(key);
|
|
328
|
+
}
|
|
329
|
+
envSpinner.succeed(`Wrote ${envWritten.length} encrypted entries to .env.production`);
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
envSpinner.fail("Could not write .env.production");
|
|
333
|
+
throw err;
|
|
334
|
+
}
|
|
335
|
+
// 4. Record bucket names + public URL in the manifest so re-runs
|
|
336
|
+
// don't have to re-derive them and a future `hatchkit destroy`
|
|
337
|
+
// knows what to clean up.
|
|
338
|
+
const updated = {
|
|
339
|
+
...manifest,
|
|
340
|
+
s3Buckets: {
|
|
341
|
+
assets: { name: assetsBucketName, publicUrl },
|
|
342
|
+
state: { name: stateBucketName, publicUrl: null },
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
writeManifest(opts.projectDir, updated);
|
|
346
|
+
console.log(chalk.dim(` · Recorded bucket names in ${MANIFEST_FILENAME} (${publicUrlSource}).`));
|
|
347
|
+
// 5. rclone snippet (printed by caller, returned here so callers
|
|
348
|
+
// can capture it programmatically too). Don't write the snippet
|
|
349
|
+
// to disk — the user's existing rclone config has unrelated
|
|
350
|
+
// remotes and we don't want to mangle them.
|
|
351
|
+
const rcloneSnippet = buildRcloneSnippet({
|
|
352
|
+
remoteName: `r2-${projectName}`,
|
|
353
|
+
endpoint: s3.endpoint,
|
|
354
|
+
accessKey: s3.accessKey,
|
|
355
|
+
secretKey: s3.secretKey,
|
|
356
|
+
});
|
|
357
|
+
return {
|
|
358
|
+
assets: { name: assetsBucketName, publicUrl, created: !assetsBucket.existed },
|
|
359
|
+
state: { name: stateBucketName, created: !stateBucket.existed },
|
|
360
|
+
envWritten,
|
|
361
|
+
envKept,
|
|
362
|
+
rcloneSnippet,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/** Pick the registrable zone name for a hostname. Cloudflare keeps
|
|
366
|
+
* zones at the registrable level (example.com), so to attach
|
|
367
|
+
* `assets.foo.example.com` we look up `example.com`. Two-label
|
|
368
|
+
* apex stays as-is. This is the same shape the existing DNS code
|
|
369
|
+
* uses; see `cli/src/deploy/coolify-app.ts` for parallels. */
|
|
370
|
+
function pickClosestZoneName(hostname) {
|
|
371
|
+
const parts = hostname.split(".");
|
|
372
|
+
if (parts.length <= 2)
|
|
373
|
+
return hostname;
|
|
374
|
+
return parts.slice(-2).join(".");
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=s3-buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-buckets.js","sourceRoot":"","sources":["../../src/provision/s3-buckets.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,30 @@ 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.
|
|
52
|
+
*
|
|
53
|
+
* `assets` is the public bucket fronting NEXT_PUBLIC_ASSETS_BASE_URL
|
|
54
|
+
* or equivalent. Reachable over HTTPS via either an r2.dev
|
|
55
|
+
* managed domain or a custom domain on a zone the user owns.
|
|
56
|
+
* `state` is the private bucket — used for state files, logs, cron
|
|
57
|
+
* inputs. Never publicly readable.
|
|
58
|
+
*
|
|
59
|
+
* `publicUrl` is the canonical no-trailing-slash URL the runtime
|
|
60
|
+
* should serve assets from. Always present on `assets`; null on
|
|
61
|
+
* `state` (private buckets aren't publicly reachable). */
|
|
62
|
+
s3Buckets?: {
|
|
63
|
+
assets?: {
|
|
64
|
+
name: string;
|
|
65
|
+
publicUrl: string;
|
|
66
|
+
};
|
|
67
|
+
state?: {
|
|
68
|
+
name: string;
|
|
69
|
+
publicUrl: null;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
48
72
|
}
|
|
49
73
|
/** Build a manifest from the internal ProjectConfig, explicitly
|
|
50
74
|
* whitelisting only the safe fields. Any new field on ProjectConfig
|
|
@@ -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;
|
|
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 +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;
|
|
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"}
|
|
@@ -52,5 +52,93 @@ export declare class CloudflareApi {
|
|
|
52
52
|
/** Delete a DNS record by id. Returns "not-found" on 404 so the
|
|
53
53
|
* caller can treat already-gone records as success during rollback. */
|
|
54
54
|
deleteRecord(zoneId: string, recordId: string): Promise<"deleted" | "not-found">;
|
|
55
|
+
/** Read a single zone setting's current value. Used by
|
|
56
|
+
* `enableEdgeHardening` to skip no-op PATCHes (and avoid downgrading
|
|
57
|
+
* user-set stricter values). Returns the raw `value` field — typed
|
|
58
|
+
* loosely because each setting has its own value shape. */
|
|
59
|
+
getZoneSetting(zoneId: string, settingId: string): Promise<unknown>;
|
|
60
|
+
/** Patch a single zone setting. Returns the new value. */
|
|
61
|
+
setZoneSetting(zoneId: string, settingId: string, value: unknown): Promise<unknown>;
|
|
62
|
+
/** Apply hatchkit's curated edge-hardening defaults idempotently.
|
|
63
|
+
* Only changes settings that are currently weaker than the target —
|
|
64
|
+
* stricter user-set values are left alone (e.g. if the user has TLS
|
|
65
|
+
* 1.3 enforced, we don't pull it back to 1.2).
|
|
66
|
+
*
|
|
67
|
+
* Settings (and why):
|
|
68
|
+
* · `always_use_https = on` — 301s plain `http://` to `https://`
|
|
69
|
+
* at the edge so users who type the bare URL aren't left wondering
|
|
70
|
+
* why nothing loads. Default off, has to be opted in.
|
|
71
|
+
* · `ssl = full` — Cloudflare → origin uses HTTPS, but accepts
|
|
72
|
+
* self-signed certs. Coolify auto-issues Let's Encrypt at the
|
|
73
|
+
* origin but the cert can be a few seconds late on a cold deploy;
|
|
74
|
+
* `full` (vs `full (strict)`) means we don't 526 the user during
|
|
75
|
+
* that window. Bump to `strict` once the deploy is stable.
|
|
76
|
+
* · `min_tls_version = 1.2` — drops legacy TLS 1.0/1.1 with no
|
|
77
|
+
* practical compat cost in 2026.
|
|
78
|
+
* · `automatic_https_rewrites = on` — Cloudflare rewrites any
|
|
79
|
+
* remaining `http://` references in HTML responses, killing the
|
|
80
|
+
* mixed-content warnings that bite static-export apps.
|
|
81
|
+
*
|
|
82
|
+
* Returns a per-setting summary for the caller to log. */
|
|
83
|
+
/** Create a bucket. Returns the metadata. If the bucket already
|
|
84
|
+
* exists (409), returns `{ existed: true }` plus a fresh GET. */
|
|
85
|
+
createR2Bucket(accountId: string, name: string, opts?: {
|
|
86
|
+
locationHint?: string;
|
|
87
|
+
storageClass?: "Standard" | "InfrequentAccess";
|
|
88
|
+
}): Promise<{
|
|
89
|
+
name: string;
|
|
90
|
+
location?: string;
|
|
91
|
+
creation_date?: string;
|
|
92
|
+
storage_class?: string;
|
|
93
|
+
existed: boolean;
|
|
94
|
+
}>;
|
|
95
|
+
/** Get bucket metadata. Returns null on 404. */
|
|
96
|
+
getR2Bucket(accountId: string, name: string): Promise<{
|
|
97
|
+
name: string;
|
|
98
|
+
location?: string;
|
|
99
|
+
creation_date?: string;
|
|
100
|
+
storage_class?: string;
|
|
101
|
+
} | null>;
|
|
102
|
+
/** Enable (or disable) the managed `pub-<hash>.r2.dev` public URL on
|
|
103
|
+
* a bucket. Returns the assigned `pub-<hash>.r2.dev` hostname. */
|
|
104
|
+
enableR2ManagedDomain(accountId: string, bucket: string, enabled?: boolean): Promise<{
|
|
105
|
+
bucketId: string;
|
|
106
|
+
domain: string;
|
|
107
|
+
enabled: boolean;
|
|
108
|
+
}>;
|
|
109
|
+
/** List custom domains attached to a bucket — used to short-circuit
|
|
110
|
+
* re-runs that already added the domain. */
|
|
111
|
+
listR2CustomDomains(accountId: string, bucket: string): Promise<Array<{
|
|
112
|
+
domain: string;
|
|
113
|
+
enabled: boolean;
|
|
114
|
+
status?: {
|
|
115
|
+
ownership?: string;
|
|
116
|
+
ssl?: string;
|
|
117
|
+
};
|
|
118
|
+
}>>;
|
|
119
|
+
/** Attach a custom domain (a hostname on a Cloudflare zone you own)
|
|
120
|
+
* to an R2 bucket. Idempotent — duplicates short-circuit via list. */
|
|
121
|
+
addR2CustomDomain(accountId: string, bucket: string, params: {
|
|
122
|
+
domain: string;
|
|
123
|
+
zoneId: string;
|
|
124
|
+
minTLS?: "1.0" | "1.1" | "1.2" | "1.3";
|
|
125
|
+
}): Promise<{
|
|
126
|
+
domain: string;
|
|
127
|
+
enabled: boolean;
|
|
128
|
+
zoneId: string;
|
|
129
|
+
existed: boolean;
|
|
130
|
+
}>;
|
|
131
|
+
enableEdgeHardening(zoneId: string): Promise<{
|
|
132
|
+
changed: Array<{
|
|
133
|
+
id: string;
|
|
134
|
+
from: unknown;
|
|
135
|
+
to: unknown;
|
|
136
|
+
}>;
|
|
137
|
+
kept: string[];
|
|
138
|
+
failed: Array<{
|
|
139
|
+
id: string;
|
|
140
|
+
error: string;
|
|
141
|
+
}>;
|
|
142
|
+
}>;
|
|
55
143
|
}
|
|
56
144
|
//# sourceMappingURL=cloudflare-api.d.ts.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"cloudflare-api.d.ts","sourceRoot":"","sources":["../../src/utils/cloudflare-api.ts"],"names":[],"mappings":"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"}
|