@void/deploy-cloudflare 1.3.0 → 1.4.0
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/index.d.mts +40 -3
- package/dist/index.mjs +84 -10
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -10,7 +10,7 @@ type WorkerTarget = ConfigTarget & {
|
|
|
10
10
|
type CloudflareOperation = ({
|
|
11
11
|
type: "auth.whoami" | "auth.login" | "auth.logout" | "auth.token";
|
|
12
12
|
} & ConfigTarget) | ({
|
|
13
|
-
type: "d1.list" | "kv.namespace.list" | "containers.list";
|
|
13
|
+
type: "d1.list" | "kv.namespace.list" | "containers.list" | "workers.subdomain.get";
|
|
14
14
|
} & ConfigTarget) | ({
|
|
15
15
|
type: "d1.info";
|
|
16
16
|
name: string;
|
|
@@ -268,6 +268,7 @@ type CloudflareStaticDeployConfig = Readonly<{
|
|
|
268
268
|
/** Generate the deterministic thin Worker entry bundled by Wrangler. */
|
|
269
269
|
export declare function renderCloudflareStaticEntry(options: {
|
|
270
270
|
runtimeImport?: string;
|
|
271
|
+
alwaysUseHttps?: boolean;
|
|
271
272
|
headerRules?: ReadonlyArray<HeaderRule>;
|
|
272
273
|
redirectRules?: ReadonlyArray<RedirectRule>;
|
|
273
274
|
fallbackRules?: ReadonlyArray<RedirectRule>;
|
|
@@ -311,6 +312,8 @@ type CloudflareTriggerConfig = Readonly<{
|
|
|
311
312
|
settingsHash?: string;
|
|
312
313
|
/** Explicit Worker-wide observability settings, published after version activation. */
|
|
313
314
|
observability?: Readonly<Record<string, unknown>>;
|
|
315
|
+
/** Explicit Worker-wide Logpush setting, published after version activation. */
|
|
316
|
+
logpush?: boolean;
|
|
314
317
|
workers_dev: boolean;
|
|
315
318
|
preview_urls: boolean;
|
|
316
319
|
routes: ReadonlyArray<unknown>;
|
|
@@ -318,7 +321,7 @@ type CloudflareTriggerConfig = Readonly<{
|
|
|
318
321
|
queueConsumers: ReadonlyArray<unknown>;
|
|
319
322
|
workflows: ReadonlyArray<unknown>;
|
|
320
323
|
/**
|
|
321
|
-
* Email Routing addresses (`addresses` in Wrangler config).
|
|
324
|
+
* Email Routing addresses (`addresses` in Wrangler config). The Cloudflare CLI applies its
|
|
322
325
|
* Email Routing plan inside `triggers deploy` — `undefined` skips the plan entirely, while
|
|
323
326
|
* `[]` is a destructive plan that deletes every rule this Worker owns — so the two must stay
|
|
324
327
|
* distinct through the snapshot. Absent from annotations written before this field existed.
|
|
@@ -326,6 +329,17 @@ type CloudflareTriggerConfig = Readonly<{
|
|
|
326
329
|
addresses?: ReadonlyArray<string>;
|
|
327
330
|
}>;
|
|
328
331
|
type CloudflareTrafficConfig = Pick<CloudflareTriggerConfig, "workers_dev" | "preview_urls" | "routes">;
|
|
332
|
+
/**
|
|
333
|
+
* Result of an account workers.dev subdomain lookup. `uploader-changed` means the lookup refused
|
|
334
|
+
* to run a changed uploader with the session credentials.
|
|
335
|
+
*/
|
|
336
|
+
type CloudflareWorkersDevSubdomainLookup = {
|
|
337
|
+
ok: true;
|
|
338
|
+
subdomain: string;
|
|
339
|
+
} | {
|
|
340
|
+
ok: false;
|
|
341
|
+
reason: "unavailable" | "uploader-changed";
|
|
342
|
+
};
|
|
329
343
|
type CloudflareVersionActivation = {
|
|
330
344
|
ok: true;
|
|
331
345
|
versionId: string;
|
|
@@ -356,6 +370,11 @@ type CloudflareVersionActivation = {
|
|
|
356
370
|
activeVersionId?: string | null;
|
|
357
371
|
/** Whether Void restored the active version's immutable trigger snapshot. */
|
|
358
372
|
triggerRepair?: "succeeded" | "failed" | "unavailable";
|
|
373
|
+
/**
|
|
374
|
+
* Access denied a readiness probe to this custom-route origin. The probe carried no Access
|
|
375
|
+
* credentials because `readinessHeadersOrigin` did not name the origin.
|
|
376
|
+
*/
|
|
377
|
+
customRouteReadinessOrigin?: string;
|
|
359
378
|
};
|
|
360
379
|
/** Encode migration state into Cloudflare's version annotation for safe rollback diagnostics. */
|
|
361
380
|
export declare function encodeCloudflareVersionMessage(migrations: ReadonlyArray<string>, triggerConfig?: CloudflareTriggerConfig, contentHash?: string): string;
|
|
@@ -430,11 +449,23 @@ type CloudflareVersionActivationOptions = {
|
|
|
430
449
|
readinessHeaders?: Readonly<Record<string, string>>;
|
|
431
450
|
/** Account workers.dev subdomain used when this Worker cannot expose version preview URLs. */
|
|
432
451
|
workersDevSubdomain?: string;
|
|
452
|
+
/**
|
|
453
|
+
* Look up the account workers.dev subdomain when a first publish reports no URL and
|
|
454
|
+
* `workersDevSubdomain` is not set. The subdomain includes the compliance-region label, for
|
|
455
|
+
* example `team.fed` for FedRAMP High. A thrown error counts as `unavailable`.
|
|
456
|
+
*/
|
|
457
|
+
resolveWorkersDevSubdomain?: () => Promise<CloudflareWorkersDevSubdomainLookup>;
|
|
433
458
|
/**
|
|
434
459
|
* Operator-provided workers.dev subdomain that may receive readiness credentials even when
|
|
435
460
|
* Wrangler cannot report a preview URL. Cached/project-controlled values must not be used here.
|
|
436
461
|
*/
|
|
437
462
|
readinessHeadersWorkersDevSubdomain?: string;
|
|
463
|
+
/**
|
|
464
|
+
* Operator-provided HTTPS origin that may receive readiness credentials when the probe uses a
|
|
465
|
+
* configured custom route. A route hostname is not guaranteed to reach this Worker, so only an
|
|
466
|
+
* exact origin match receives them. Project-controlled values must not be used here.
|
|
467
|
+
*/
|
|
468
|
+
readinessHeadersOrigin?: string;
|
|
438
469
|
message: string;
|
|
439
470
|
/** Direct empty-domain publisher for the Wrangler reconciliation gap. */
|
|
440
471
|
publishEmptyCustomDomains?: () => Promise<CloudflareCommandResult>;
|
|
@@ -474,6 +505,12 @@ type CloudflareVersionActivationOptions = {
|
|
|
474
505
|
};
|
|
475
506
|
/** Upload, probe, and atomically activate a verified Worker Version. */
|
|
476
507
|
export declare function activateCloudflareVersion(options: CloudflareVersionActivationOptions): Promise<CloudflareVersionActivation>;
|
|
508
|
+
/**
|
|
509
|
+
* Normalize an operator-selected readiness origin. Returns `undefined` unless the value is one
|
|
510
|
+
* exact `https:` origin without a wildcard, credentials, a path, a query, or a fragment. A probe
|
|
511
|
+
* URL never has a wildcard host, so a wildcard value could never match.
|
|
512
|
+
*/
|
|
513
|
+
export declare function normalizeReadinessAccessOrigin(value: string | undefined): string | undefined;
|
|
477
514
|
/** Change version traffic without synchronizing Worker settings from local config. */
|
|
478
515
|
export declare function deployCloudflareVersionTraffic(options: {
|
|
479
516
|
runWrangler: CloudflareCommandRunner;
|
|
@@ -514,4 +551,4 @@ export declare function cloudflareCommandDiagnostic(result: CloudflareCommandRes
|
|
|
514
551
|
//#region src/secret-draft.d.ts
|
|
515
552
|
export declare const VOID_SECRET_DRAFT_SOURCE = "export default { fetch() { return new Response(\"\"); } };\n";
|
|
516
553
|
//#endregion
|
|
517
|
-
export type { ApprovedCloudflareKvBinding, CloudflareCommandResult, CloudflareCommandRunner, CloudflareDeployExecution, CloudflareFrameworkDeployConfig, CloudflareOperation, CloudflareProviderError, CloudflareStaticDeployConfig, CloudflareTrafficConfig, CloudflareTriggerConfig, CloudflareTriggerStabilization, CloudflareUploadResult, CloudflareVersionActivation, CloudflareVersionActivationOptions, CloudflareVersionMetadata, CloudflareWorkerMigrationTagOptions, ExistingCloudflareWorker };
|
|
554
|
+
export type { ApprovedCloudflareKvBinding, CloudflareCommandResult, CloudflareCommandRunner, CloudflareDeployExecution, CloudflareFrameworkDeployConfig, CloudflareOperation, CloudflareProviderError, CloudflareStaticDeployConfig, CloudflareTrafficConfig, CloudflareTriggerConfig, CloudflareTriggerStabilization, CloudflareUploadResult, CloudflareVersionActivation, CloudflareVersionActivationOptions, CloudflareVersionMetadata, CloudflareWorkerMigrationTagOptions, CloudflareWorkersDevSubdomainLookup, ExistingCloudflareWorker };
|
package/dist/index.mjs
CHANGED
|
@@ -645,6 +645,7 @@ function writeCloudflareFrameworkDeployConfig(options) {
|
|
|
645
645
|
/** Generate the deterministic thin Worker entry bundled by Wrangler. */
|
|
646
646
|
function renderCloudflareStaticEntry(options) {
|
|
647
647
|
const config = JSON.stringify({
|
|
648
|
+
...options.alwaysUseHttps !== void 0 ? { alwaysUseHttps: options.alwaysUseHttps } : {},
|
|
648
649
|
...options.headerRules?.length ? { headerRules: options.headerRules } : {},
|
|
649
650
|
...options.redirectRules?.length ? { redirectRules: options.redirectRules } : {},
|
|
650
651
|
...options.fallbackRules?.length ? { fallbackRules: options.fallbackRules } : {},
|
|
@@ -844,7 +845,8 @@ function readCloudflareTriggerConfig(configPath, sourceConfigPath) {
|
|
|
844
845
|
const source = sourceConfigPath ? parseRootWranglerConfig(sourceConfigPath) : config;
|
|
845
846
|
const result = triggerConfigFromWrangler({
|
|
846
847
|
...config,
|
|
847
|
-
observability: source.observability
|
|
848
|
+
observability: source.observability,
|
|
849
|
+
logpush: source.logpush
|
|
848
850
|
});
|
|
849
851
|
if (!sourceConfigPath) return result;
|
|
850
852
|
return {
|
|
@@ -1085,6 +1087,7 @@ function triggerConfigFromWrangler(config) {
|
|
|
1085
1087
|
...config.preview_urls === void 0 ? { preservePreviewUrls: true } : {},
|
|
1086
1088
|
settingsHash: nonVersionedSettingsHash(config),
|
|
1087
1089
|
...isRecord(config.observability) ? { observability: config.observability } : {},
|
|
1090
|
+
...typeof config.logpush === "boolean" ? { logpush: config.logpush } : {},
|
|
1088
1091
|
workers_dev: workersDev,
|
|
1089
1092
|
preview_urls: typeof config.preview_urls === "boolean" ? config.preview_urls : workersDev,
|
|
1090
1093
|
routes,
|
|
@@ -1118,7 +1121,8 @@ function parseTriggerConfig(value) {
|
|
|
1118
1121
|
"preserve",
|
|
1119
1122
|
"preserveRoutes",
|
|
1120
1123
|
"preserveWorkersDev",
|
|
1121
|
-
"preservePreviewUrls"
|
|
1124
|
+
"preservePreviewUrls",
|
|
1125
|
+
"logpush"
|
|
1122
1126
|
].some((key) => value[key] !== void 0 && typeof value[key] !== "boolean") || value.settingsHash !== void 0 && typeof value.settingsHash !== "string" || value.observability !== void 0 && !isRecord(value.observability) || typeof value.workers_dev !== "boolean" || typeof value.preview_urls !== "boolean" || !Array.isArray(value.routes) || !Array.isArray(value.crons) || !Array.isArray(value.queueConsumers) || !Array.isArray(value.workflows) || value.addresses !== void 0 && readEmailAddresses(value.addresses) === void 0) return null;
|
|
1123
1127
|
return {
|
|
1124
1128
|
...value.preserve === true ? { preserve: true } : {},
|
|
@@ -1127,6 +1131,7 @@ function parseTriggerConfig(value) {
|
|
|
1127
1131
|
...value.preservePreviewUrls === true ? { preservePreviewUrls: true } : {},
|
|
1128
1132
|
...typeof value.settingsHash === "string" ? { settingsHash: value.settingsHash } : {},
|
|
1129
1133
|
...isRecord(value.observability) ? { observability: value.observability } : {},
|
|
1134
|
+
...typeof value.logpush === "boolean" ? { logpush: value.logpush } : {},
|
|
1130
1135
|
workers_dev: value.workers_dev,
|
|
1131
1136
|
preview_urls: value.preview_urls,
|
|
1132
1137
|
routes: value.routes,
|
|
@@ -1144,6 +1149,7 @@ function triggerWranglerConfig(base, triggerConfig, manageRoutes = true) {
|
|
|
1144
1149
|
const config = {
|
|
1145
1150
|
...base,
|
|
1146
1151
|
...triggerConfig.observability === void 0 ? {} : { observability: triggerConfig.observability },
|
|
1152
|
+
...triggerConfig.logpush === void 0 ? {} : { logpush: triggerConfig.logpush },
|
|
1147
1153
|
triggers,
|
|
1148
1154
|
queues,
|
|
1149
1155
|
workflows: [...triggerConfig.workflows],
|
|
@@ -1163,6 +1169,7 @@ function resolvePreservedTraffic(desired, previous, workerExists) {
|
|
|
1163
1169
|
...desired.preserve ? { preserve: true } : {},
|
|
1164
1170
|
...desired.settingsHash ? { settingsHash: desired.settingsHash } : {},
|
|
1165
1171
|
...desired.observability === void 0 ? {} : { observability: desired.observability },
|
|
1172
|
+
...desired.logpush === void 0 ? {} : { logpush: desired.logpush },
|
|
1166
1173
|
workers_dev: desired.preserveWorkersDev ? previous?.workers_dev ?? desired.workers_dev : desired.workers_dev,
|
|
1167
1174
|
preview_urls: desired.preservePreviewUrls ? previous?.preview_urls ?? desired.preview_urls : desired.preview_urls,
|
|
1168
1175
|
routes: desired.preserveRoutes ? previous?.routes ?? desired.routes : desired.routes,
|
|
@@ -1507,7 +1514,9 @@ async function activateCloudflareVersionWithSecretsFile(options) {
|
|
|
1507
1514
|
if (stagingFailure) return stagingFailure;
|
|
1508
1515
|
stagedVersionOverride = true;
|
|
1509
1516
|
}
|
|
1510
|
-
const
|
|
1517
|
+
const trustedReadinessOrigin = normalizeReadinessAccessOrigin(options.readinessHeadersOrigin);
|
|
1518
|
+
const withholdsCustomRouteHeaders = (url) => readinessUsesCustomRoute && !isTrustedReadinessOrigin(url, trustedReadinessOrigin);
|
|
1519
|
+
const probe = (url) => probeReadiness(`${url.replace(/\/$/, "")}/__void/ready`, options.workerName, withholdsCustomRouteHeaders(url) ? void 0 : options.readinessHeaders, authenticatedWorkersDevSubdomain, readinessUsesCustomRoute ? trustedReadinessOrigin : void 0, stagedVersionOverride ? versionId : void 0, options.fetch ?? globalThis.fetch, options.sleep ?? setTimeout, options.readinessAttempts ?? 6, Number.POSITIVE_INFINITY, options.requireVersionMetadata ? versionId : void 0);
|
|
1511
1520
|
options.onProgress?.("Waiting for the Worker to become ready...");
|
|
1512
1521
|
let ready = await probe(readinessUrl);
|
|
1513
1522
|
if (ready === "access-denied" && !stagedVersionOverride && previous.versionId !== null && !options.requirePreviewForReadiness) {
|
|
@@ -1527,6 +1536,7 @@ async function activateCloudflareVersionWithSecretsFile(options) {
|
|
|
1527
1536
|
reason: ready === "access-denied" ? "readiness-access-denied" : "readiness-failed",
|
|
1528
1537
|
versionId,
|
|
1529
1538
|
previousVersionId: previous.versionId,
|
|
1539
|
+
...ready === "access-denied" && withholdsCustomRouteHeaders(readinessUrl) ? customRouteReadinessOriginField(readinessUrl) : {},
|
|
1530
1540
|
...stagedVersionOverride ? await restorePreviousVersion(options, previous.versionId, "readiness failed", [stagedVersionPercentages(previous.versionId, versionId)]) : { rollback: "not-needed" }
|
|
1531
1541
|
};
|
|
1532
1542
|
if (!options.verifyUploader()) return {
|
|
@@ -1895,7 +1905,33 @@ async function bootstrapFirstDeployment(options, previousVersionId, atomic = fal
|
|
|
1895
1905
|
const published = readUploadResult(bootstrap);
|
|
1896
1906
|
const versionId = published?.versionId;
|
|
1897
1907
|
const desiredTriggerConfig = desiredTriggerConfigFor(parseCloudflareVersionMessage(options.message), options.configPath);
|
|
1898
|
-
|
|
1908
|
+
let reportedOrConfiguredUrl = published?.previewUrl ?? published?.workersDevUrl ?? (desiredTriggerConfig.workers_dev ? workersDevReadinessUrl(options.workerName, options.workersDevSubdomain) : customRouteReadinessUrl(desiredTriggerConfig.routes));
|
|
1909
|
+
if (versionId && !reportedOrConfiguredUrl && desiredTriggerConfig.workers_dev && !desiredTriggerConfig.preserve && !desiredTriggerConfig.preserveWorkersDev && !options.preserveTriggers && options.resolveWorkersDevSubdomain) {
|
|
1910
|
+
if (!options.verifyUploader()) return {
|
|
1911
|
+
ok: false,
|
|
1912
|
+
reason: "uploader-changed",
|
|
1913
|
+
versionId,
|
|
1914
|
+
previousVersionId,
|
|
1915
|
+
rollback: "unsafe"
|
|
1916
|
+
};
|
|
1917
|
+
let lookup;
|
|
1918
|
+
try {
|
|
1919
|
+
lookup = await options.resolveWorkersDevSubdomain();
|
|
1920
|
+
} catch {
|
|
1921
|
+
lookup = {
|
|
1922
|
+
ok: false,
|
|
1923
|
+
reason: "unavailable"
|
|
1924
|
+
};
|
|
1925
|
+
}
|
|
1926
|
+
if (!lookup.ok && lookup.reason === "uploader-changed") return {
|
|
1927
|
+
ok: false,
|
|
1928
|
+
reason: "uploader-changed",
|
|
1929
|
+
versionId,
|
|
1930
|
+
previousVersionId,
|
|
1931
|
+
rollback: "unsafe"
|
|
1932
|
+
};
|
|
1933
|
+
reportedOrConfiguredUrl = lookup.ok ? workersDevReadinessUrl(options.workerName, lookup.subdomain) : void 0;
|
|
1934
|
+
}
|
|
1899
1935
|
if (!versionId || !reportedOrConfiguredUrl) return {
|
|
1900
1936
|
ok: false,
|
|
1901
1937
|
reason: atomic ? "atomic-output-invalid" : "bootstrap-output-invalid",
|
|
@@ -2000,14 +2036,18 @@ async function bootstrapFirstDeployment(options, previousVersionId, atomic = fal
|
|
|
2000
2036
|
const usesCustomDomain = !desiredTriggerConfig.workers_dev && desiredTriggerConfig.routes.some((route) => isRecord(route) && route.custom_domain === true);
|
|
2001
2037
|
const customDomainBootstrap = !atomic && usesCustomDomain;
|
|
2002
2038
|
const readinessTimeoutMs = customDomainBootstrap ? 3e5 : 6e4;
|
|
2039
|
+
const previewSubdomain = extractWorkersDevSubdomain(previewUrl);
|
|
2040
|
+
const trustedReadinessOrigin = previewSubdomain ? void 0 : normalizeReadinessAccessOrigin(options.readinessHeadersOrigin);
|
|
2041
|
+
const withholdsCustomRouteHeaders = !previewSubdomain && !isTrustedReadinessOrigin(previewUrl, trustedReadinessOrigin);
|
|
2003
2042
|
options.onProgress?.("Waiting for the Worker to become ready...");
|
|
2004
|
-
const ready = await probeReadiness(`${previewUrl.replace(/\/$/, "")}/__void/ready`, options.workerName,
|
|
2043
|
+
const ready = await probeReadiness(`${previewUrl.replace(/\/$/, "")}/__void/ready`, options.workerName, withholdsCustomRouteHeaders ? void 0 : options.readinessHeaders, previewSubdomain, trustedReadinessOrigin, void 0, options.fetch ?? globalThis.fetch, options.sleep ?? setTimeout, options.readinessAttempts ?? (customDomainBootstrap ? 150 : 30), readinessTimeoutMs, options.requireVersionMetadata ? versionId : void 0);
|
|
2005
2044
|
if (ready !== "ready") return {
|
|
2006
2045
|
ok: false,
|
|
2007
2046
|
reason: ready === "access-denied" ? atomic ? "atomic-readiness-access-denied" : "bootstrap-readiness-access-denied" : atomic ? "atomic-readiness-failed" : "bootstrap-readiness-failed",
|
|
2008
2047
|
versionId,
|
|
2009
2048
|
previousVersionId,
|
|
2010
2049
|
rollback: "unavailable",
|
|
2050
|
+
...ready === "access-denied" && withholdsCustomRouteHeaders ? customRouteReadinessOriginField(previewUrl) : {},
|
|
2011
2051
|
...ready === "failed" && usesCustomDomain ? { diagnostic: "The Custom Domain may still be propagating DNS or its TLS certificate. Check the configured domain in Cloudflare, then retry `void deploy --platform cloudflare` once its /__void/ready endpoint is reachable." } : {}
|
|
2012
2052
|
};
|
|
2013
2053
|
if (!options.verifyUploader()) return {
|
|
@@ -2183,8 +2223,8 @@ async function verifyReadinessStagingOwner(options, previousVersionId, versionId
|
|
|
2183
2223
|
};
|
|
2184
2224
|
return null;
|
|
2185
2225
|
}
|
|
2186
|
-
async function probeReadiness(url, workerName, readinessHeaders, authenticatedWorkersDevSubdomain, versionOverride, fetcher, sleep, attempts, timeoutMs = Number.POSITIVE_INFINITY, expectedVersionId) {
|
|
2187
|
-
const headers = guardedReadinessHeaders(url, workerName, readinessHeaders, authenticatedWorkersDevSubdomain);
|
|
2226
|
+
async function probeReadiness(url, workerName, readinessHeaders, authenticatedWorkersDevSubdomain, trustedReadinessOrigin, versionOverride, fetcher, sleep, attempts, timeoutMs = Number.POSITIVE_INFINITY, expectedVersionId) {
|
|
2227
|
+
const headers = guardedReadinessHeaders(url, workerName, readinessHeaders, authenticatedWorkersDevSubdomain, trustedReadinessOrigin);
|
|
2188
2228
|
if (headers === null) return "failed";
|
|
2189
2229
|
const deadline = Date.now() + timeoutMs;
|
|
2190
2230
|
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
@@ -2215,9 +2255,13 @@ async function probeReadiness(url, workerName, readinessHeaders, authenticatedWo
|
|
|
2215
2255
|
}
|
|
2216
2256
|
return "failed";
|
|
2217
2257
|
}
|
|
2218
|
-
/**
|
|
2219
|
-
|
|
2258
|
+
/**
|
|
2259
|
+
* Never forward Access headers to a hostname that cannot be this Worker, unless the operator
|
|
2260
|
+
* named that exact origin.
|
|
2261
|
+
*/
|
|
2262
|
+
function guardedReadinessHeaders(url, workerName, headers, authenticatedWorkersDevSubdomain, trustedReadinessOrigin) {
|
|
2220
2263
|
if (!headers || Object.keys(headers).length === 0) return {};
|
|
2264
|
+
if (isTrustedReadinessOrigin(url, trustedReadinessOrigin)) return headers;
|
|
2221
2265
|
try {
|
|
2222
2266
|
const parsed = new URL(url);
|
|
2223
2267
|
const firstLabel = parsed.hostname.toLowerCase().split(".")[0] ?? "";
|
|
@@ -2229,6 +2273,36 @@ function guardedReadinessHeaders(url, workerName, headers, authenticatedWorkersD
|
|
|
2229
2273
|
return null;
|
|
2230
2274
|
}
|
|
2231
2275
|
}
|
|
2276
|
+
/**
|
|
2277
|
+
* Normalize an operator-selected readiness origin. Returns `undefined` unless the value is one
|
|
2278
|
+
* exact `https:` origin without a wildcard, credentials, a path, a query, or a fragment. A probe
|
|
2279
|
+
* URL never has a wildcard host, so a wildcard value could never match.
|
|
2280
|
+
*/
|
|
2281
|
+
function normalizeReadinessAccessOrigin(value) {
|
|
2282
|
+
if (!value) return;
|
|
2283
|
+
try {
|
|
2284
|
+
const url = new URL(value);
|
|
2285
|
+
return url.protocol === "https:" && !url.hostname.includes("*") && !url.username && !url.password && url.pathname === "/" && !url.search && !url.hash ? url.origin : void 0;
|
|
2286
|
+
} catch {
|
|
2287
|
+
return;
|
|
2288
|
+
}
|
|
2289
|
+
}
|
|
2290
|
+
function isTrustedReadinessOrigin(url, trustedOrigin) {
|
|
2291
|
+
if (trustedOrigin === void 0) return false;
|
|
2292
|
+
try {
|
|
2293
|
+
const parsed = new URL(url);
|
|
2294
|
+
return parsed.protocol === "https:" && !parsed.username && !parsed.password && parsed.origin === trustedOrigin;
|
|
2295
|
+
} catch {
|
|
2296
|
+
return false;
|
|
2297
|
+
}
|
|
2298
|
+
}
|
|
2299
|
+
function customRouteReadinessOriginField(url) {
|
|
2300
|
+
try {
|
|
2301
|
+
return { customRouteReadinessOrigin: new URL(url).origin };
|
|
2302
|
+
} catch {
|
|
2303
|
+
return {};
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2232
2306
|
async function isCloudflareAccessDenial(response) {
|
|
2233
2307
|
if (response.status >= 300 && response.status < 400 && response.headers.get("location")?.includes("/cdn-cgi/access/")) return true;
|
|
2234
2308
|
if (response.status !== 403) return false;
|
|
@@ -2424,4 +2498,4 @@ function createCloudflareMetadataRunner(options) {
|
|
|
2424
2498
|
};
|
|
2425
2499
|
}
|
|
2426
2500
|
//#endregion
|
|
2427
|
-
export { CloudflareWorkerInspectionError, VOID_SECRET_DRAFT_SOURCE, activateCloudflareVersion, assertCloudflareBindingsPreserved, assertCloudflareDurableObjectLifecycleSupported, assertExistingCloudflareConfig, cloudflareCommandDiagnostic, createCloudflareMetadataRunner, deployCloudflareVersionTraffic, deployCloudflareVersionTriggers, encodeCloudflareVersionMessage, executeCloudflareDeploy, extractWorkersDevSubdomain, normalizeWorkersDevSubdomain, parseCloudflareVersionMessage, parseRootWranglerConfig, readBindingFieldPresence, readCloudflareTriggerConfig, readCloudflareVersionMigrationTag, readCloudflareWorkerMigrationTag, readConfigEntryString, readExistingCloudflareWorker, readStoredResourceName, readWranglerTopLevelString, renderCloudflareStaticEntry, resolveD1MigrateTarget, stabilizeCloudflareVersionTriggers, stageCloudflareStaticAssets, writeCloudflareFrameworkDeployConfig, writeCloudflareStaticDeployConfig };
|
|
2501
|
+
export { CloudflareWorkerInspectionError, VOID_SECRET_DRAFT_SOURCE, activateCloudflareVersion, assertCloudflareBindingsPreserved, assertCloudflareDurableObjectLifecycleSupported, assertExistingCloudflareConfig, cloudflareCommandDiagnostic, createCloudflareMetadataRunner, deployCloudflareVersionTraffic, deployCloudflareVersionTriggers, encodeCloudflareVersionMessage, executeCloudflareDeploy, extractWorkersDevSubdomain, normalizeReadinessAccessOrigin, normalizeWorkersDevSubdomain, parseCloudflareVersionMessage, parseRootWranglerConfig, readBindingFieldPresence, readCloudflareTriggerConfig, readCloudflareVersionMigrationTag, readCloudflareWorkerMigrationTag, readConfigEntryString, readExistingCloudflareWorker, readStoredResourceName, readWranglerTopLevelString, renderCloudflareStaticEntry, resolveD1MigrateTarget, stabilizeCloudflareVersionTriggers, stageCloudflareStaticAssets, writeCloudflareFrameworkDeployConfig, writeCloudflareStaticDeployConfig };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@void/deploy-cloudflare",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Cloudflare deployment primitives for Void runtimes and deployment adapters.",
|
|
5
5
|
"homepage": "https://void.cloud",
|
|
6
6
|
"bugs": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@void/deploy-core": "1.
|
|
29
|
+
"@void/deploy-core": "1.4.0",
|
|
30
30
|
"jsonc-parser": "^3.3.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|