@cloudflare/workers-utils 0.39.0 → 0.40.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.
@@ -1,4 +1,4 @@
1
- import { bf as TailConsumer, bj as WorkerMetadata, R as RawConfig } from './compliance-yQnxg2l5.mjs';
1
+ import { bf as TailConsumer, bj as WorkerMetadata, R as RawConfig } from './compliance-kb1BOFhx.mjs';
2
2
  import { AssetConfig } from '@cloudflare/workers-shared';
3
3
  import { Cloudflare } from 'cloudflare';
4
4
  import 'node:url';
package/dist/browser.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export { constructWranglerConfig } from './chunk-5H6GBNUC.mjs';
1
+ export { constructWranglerConfig } from './chunk-2OPNWQJ5.mjs';
2
2
  import './chunk-Q72B4Q5Z.mjs';
@@ -1,7 +1,7 @@
1
1
  import { __name } from './chunk-Q72B4Q5Z.mjs';
2
2
 
3
3
  // src/default-compat-date.ts
4
- var DEFAULT_COMPAT_DATE = "2026-09-15";
4
+ var DEFAULT_COMPAT_DATE = "2026-09-17";
5
5
 
6
6
  // src/assert-never.ts
7
7
  function assertNever(_value) {
@@ -3314,6 +3314,11 @@ interface Observability {
3314
3314
  * @default false
3315
3315
  */
3316
3316
  redact_query_string?: boolean;
3317
+ /** Real-time Issues settings for this Worker. */
3318
+ issues?: {
3319
+ /** Whether real-time Issues are enabled. */
3320
+ enabled?: boolean;
3321
+ };
3317
3322
  logs?: {
3318
3323
  enabled?: boolean;
3319
3324
  /** The sampling rate */
@@ -3384,11 +3389,11 @@ type ContainerEngine = {
3384
3389
  *
3385
3390
  * The `previews` block contains any intentionally divergent configuration intended solely for Previews, including:
3386
3391
  * - All non-inheritable properties (environment variables and bindings like KV, D1, R2, etc.)
3387
- * - Select inheritable properties: `logpush`, `observability`, `limits`, `cache`
3392
+ * - Select inheritable properties: `logpush`, `observability`, `limits`, `placement`, `cache`
3388
3393
  *
3389
3394
  * @inheritable
3390
3395
  */
3391
- interface PreviewsConfig extends Partial<EnvironmentNonInheritable>, Partial<Pick<EnvironmentInheritable, "logpush" | "observability" | "limits" | "cache">> {
3396
+ interface PreviewsConfig extends Partial<EnvironmentNonInheritable>, Partial<Pick<EnvironmentInheritable, "logpush" | "observability" | "limits" | "placement" | "cache">> {
3392
3397
  }
3393
3398
 
3394
3399
  /**
@@ -1,4 +1,4 @@
1
- export { q as COMPLIANCE_REGION_CONFIG_PUBLIC, r as COMPLIANCE_REGION_CONFIG_UNKNOWN, f as ComplianceConfig, bF as getCloudflareApiBaseUrl, bH as getCloudflareComplianceRegion, bI as getCloudflareContainerRegistry, bN as getComplianceRegionSubdomain } from './compliance-yQnxg2l5.mjs';
1
+ export { q as COMPLIANCE_REGION_CONFIG_PUBLIC, r as COMPLIANCE_REGION_CONFIG_UNKNOWN, f as ComplianceConfig, bF as getCloudflareApiBaseUrl, bH as getCloudflareComplianceRegion, bI as getCloudflareContainerRegistry, bN as getComplianceRegionSubdomain } from './compliance-kb1BOFhx.mjs';
2
2
  import 'node:url';
3
3
  import 'undici';
4
4
  import '@cloudflare/workers-shared';
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ComputedFields, B as Binding, R as RawConfig, b as Config, E as Exports, D as DurableObjectExport, W as WorkerEntrypointExport, c as ContainerApp, d as WorkerMetadataBinding, e as CfTailConsumer, L as Logger, A as ApiCredentials, f as ComplianceConfig, g as Route } from './compliance-yQnxg2l5.mjs';
2
- export { h as ARTIFACTS_EVENT_TYPES, i as Access, j as ArtifactsEventTrigger, k as ArtifactsEventType, l as AssetConfigMetadata, m as Assets, n as AssetsOptions, o as AsyncHook, p as BinaryFile, q as COMPLIANCE_REGION_CONFIG_PUBLIC, r as COMPLIANCE_REGION_CONFIG_UNKNOWN, s as CacheOptions, t as CfAIBinding, u as CfAISearch, v as CfAISearchNamespace, w as CfAccount, x as CfAgentMemory, y as CfAnalyticsEngineDataset, z as CfArtifacts, F as CfAssetsBinding, G as CfBrowserBinding, H as CfCapnp, I as CfD1Database, J as CfDataBlobBindings, K as CfDevPluginCfg, M as CfDispatchNamespace, N as CfDurableObject, O as CfDurableObjectMigrations, P as CfExports, Q as CfFlagship, S as CfHelloWorld, T as CfHyperdrive, U as CfImagesBinding, V as CfKvNamespace, X as CfLogfwdr, Y as CfLogfwdrBinding, Z as CfMTlsCertificate, _ as CfMediaBinding, $ as CfModule, a0 as CfModuleType, a1 as CfPipeline, a2 as CfPlacement, a3 as CfQueue, a4 as CfR2Bucket, a5 as CfRateLimit, a6 as CfScriptFormat, a7 as CfSecretsStoreSecrets, a8 as CfSendEmailBindings, a9 as CfService, aa as CfStreamBinding, ab as CfTextBlobBindings, ac as CfUnsafe, ad as CfUnsafeBinding, ae as CfUserLimits, af as CfVars, ag as CfVectorize, ah as CfVersionMetadataBinding, ai as CfVpcNetwork, aj as CfVpcService, ak as CfWasmModuleBindings, al as CfWorkerContext, am as CfWorkerInit, an as CfWorkerLoader, ao as CfWorkerSourceMap, ap as CfWorkflow, aq as CloudchamberConfig, ar as ConfigFields, as as ConfigModuleRuleType, at as ConfiguredExport, au as ContainerEngine, av as ContainerObservability, aw as CustomDomainRoute, ax as DispatchNamespaceOutbound, ay as DockerConfiguration, az as DurableObjectBindings, aA as DurableObjectContainerImage, aB as DurableObjectExportStorage, aC as DurableObjectMigration, aD as ENVIRONMENT_TAG_PREFIX, aE as Entry, aF as Environment, aG as EnvironmentNonInheritable, aH as ExportsReconciliationEntryBase, aI as ExportsReconciliationErrorDetail, aJ as ExportsReconciliationInfo, aK as ExportsReconciliationRename, aL as ExportsReconciliationResult, aM as ExportsReconciliationTransfer, aN as ExportsReconciliationTransferPending, aO as ExportsReconciliationWarning, aP as FetchKVGetValueFetcher, aQ as FetchListResultFetcher, aR as FetchPagedListResultFetcher, aS as FetchResult, aT as FetchResultFetcher, aU as File, aV as Hook, aW as HookValues, aX as INHERIT_SYMBOL, aY as JSON_CONFIG_FORMATS, aZ as Json, a_ as LOGGER_LEVELS, a$ as LegacyAssetPaths, b0 as LocalS3Credentials, b1 as LogLevel, b2 as LoggerLevel, b3 as NodeJSCompatMode, b4 as Observability, b5 as PATH_TO_DEPLOY_CONFIG, b6 as PreviewsConfig, b7 as RawDevConfig, b8 as RawEnvironment, a as RedirectedRawConfig, b9 as Rule, ba as SERVICE_TAG_PREFIX, bb as ServiceFetch, bc as ServiceMetadataRes, bd as StartDevWorkerInput, be as StreamingTailConsumer, bf as TailConsumer, bg as Trigger, bh as UserLimits, bi as ValidatedAssetsOptions, bj as WorkerMetadata, bk as WorkflowBinding, bl as ZoneIdRoute, bm as ZoneNameRoute, bn as addAuthorizationHeader, bo as defaultWranglerConfig, bp as extractAccountTag, bq as extractWAFBlockRayId, br as fetchInternalBase, bs as fetchKVGetValueBase, bt as fetchListResultBase, bu as fetchResultBase, bv as getBrowserRenderingHeadfulFromEnv, bw as getBuildConditionsFromEnv, bx as getBuildPlatformFromEnv, by as getC3CommandFromEnv, bz as getCIGeneratePreviewAlias, bA as getCIMatchTag, bB as getCIOverrideName, bC as getCIOverrideNetworkModeHost, bD as getCfFetchEnabledFromEnv, bE as getCfFetchPathFromEnv, bF as getCloudflareApiBaseUrl, bG as getCloudflareApiEnvironmentFromEnv, bH as getCloudflareComplianceRegion, bI as getCloudflareContainerRegistry, bJ as getCloudflareEnv, bK as getCloudflareIncludeProcessEnvFromEnv, bL as getCloudflareLoadDevVarsFromDotEnv, bM as getCloudflaredPathFromEnv, bN as getComplianceRegionSubdomain, bO as getD1ExtraLocationChoices, bP as getDisableConfigWatching, bQ as getLocalExplorerEnabledFromEnv, bR as getLocalObservabilityEnabledFromEnv, bS as getNoSkillsUpdatePromptsFromEnv, bT as getOpenNextDeployFromEnv, bU as getOutputFileDirectoryFromEnv, bV as getOutputFilePathFromEnv, bW as getRegistryPath, bX as getSanitizeLogs, bY as getSubdomainMixedStateCheckDisabled, bZ as getTraceHeader, b_ as getWorkersCIBranchName, b$ as getWranglerCacheDirFromEnv, c0 as getWranglerHideBanner, c1 as getWranglerSendErrorReportsFromEnv, c2 as getWranglerSendMetricsFromEnv, c3 as hasCursor, c4 as hasMorePages, c5 as isDoNotTrackEnabled, c6 as isWAFBlockResponse, c7 as maybeAddTraceHeader, c8 as parseRetryAfterMs, c9 as parseRetryAfterValue, ca as performApiFetchBase, cb as renderError, cc as throwFetchError, cd as truncate } from './compliance-yQnxg2l5.mjs';
1
+ import { C as ComputedFields, B as Binding, R as RawConfig, b as Config, E as Exports, D as DurableObjectExport, W as WorkerEntrypointExport, c as ContainerApp, d as WorkerMetadataBinding, e as CfTailConsumer, L as Logger, A as ApiCredentials, f as ComplianceConfig, g as Route } from './compliance-kb1BOFhx.mjs';
2
+ export { h as ARTIFACTS_EVENT_TYPES, i as Access, j as ArtifactsEventTrigger, k as ArtifactsEventType, l as AssetConfigMetadata, m as Assets, n as AssetsOptions, o as AsyncHook, p as BinaryFile, q as COMPLIANCE_REGION_CONFIG_PUBLIC, r as COMPLIANCE_REGION_CONFIG_UNKNOWN, s as CacheOptions, t as CfAIBinding, u as CfAISearch, v as CfAISearchNamespace, w as CfAccount, x as CfAgentMemory, y as CfAnalyticsEngineDataset, z as CfArtifacts, F as CfAssetsBinding, G as CfBrowserBinding, H as CfCapnp, I as CfD1Database, J as CfDataBlobBindings, K as CfDevPluginCfg, M as CfDispatchNamespace, N as CfDurableObject, O as CfDurableObjectMigrations, P as CfExports, Q as CfFlagship, S as CfHelloWorld, T as CfHyperdrive, U as CfImagesBinding, V as CfKvNamespace, X as CfLogfwdr, Y as CfLogfwdrBinding, Z as CfMTlsCertificate, _ as CfMediaBinding, $ as CfModule, a0 as CfModuleType, a1 as CfPipeline, a2 as CfPlacement, a3 as CfQueue, a4 as CfR2Bucket, a5 as CfRateLimit, a6 as CfScriptFormat, a7 as CfSecretsStoreSecrets, a8 as CfSendEmailBindings, a9 as CfService, aa as CfStreamBinding, ab as CfTextBlobBindings, ac as CfUnsafe, ad as CfUnsafeBinding, ae as CfUserLimits, af as CfVars, ag as CfVectorize, ah as CfVersionMetadataBinding, ai as CfVpcNetwork, aj as CfVpcService, ak as CfWasmModuleBindings, al as CfWorkerContext, am as CfWorkerInit, an as CfWorkerLoader, ao as CfWorkerSourceMap, ap as CfWorkflow, aq as CloudchamberConfig, ar as ConfigFields, as as ConfigModuleRuleType, at as ConfiguredExport, au as ContainerEngine, av as ContainerObservability, aw as CustomDomainRoute, ax as DispatchNamespaceOutbound, ay as DockerConfiguration, az as DurableObjectBindings, aA as DurableObjectContainerImage, aB as DurableObjectExportStorage, aC as DurableObjectMigration, aD as ENVIRONMENT_TAG_PREFIX, aE as Entry, aF as Environment, aG as EnvironmentNonInheritable, aH as ExportsReconciliationEntryBase, aI as ExportsReconciliationErrorDetail, aJ as ExportsReconciliationInfo, aK as ExportsReconciliationRename, aL as ExportsReconciliationResult, aM as ExportsReconciliationTransfer, aN as ExportsReconciliationTransferPending, aO as ExportsReconciliationWarning, aP as FetchKVGetValueFetcher, aQ as FetchListResultFetcher, aR as FetchPagedListResultFetcher, aS as FetchResult, aT as FetchResultFetcher, aU as File, aV as Hook, aW as HookValues, aX as INHERIT_SYMBOL, aY as JSON_CONFIG_FORMATS, aZ as Json, a_ as LOGGER_LEVELS, a$ as LegacyAssetPaths, b0 as LocalS3Credentials, b1 as LogLevel, b2 as LoggerLevel, b3 as NodeJSCompatMode, b4 as Observability, b5 as PATH_TO_DEPLOY_CONFIG, b6 as PreviewsConfig, b7 as RawDevConfig, b8 as RawEnvironment, a as RedirectedRawConfig, b9 as Rule, ba as SERVICE_TAG_PREFIX, bb as ServiceFetch, bc as ServiceMetadataRes, bd as StartDevWorkerInput, be as StreamingTailConsumer, bf as TailConsumer, bg as Trigger, bh as UserLimits, bi as ValidatedAssetsOptions, bj as WorkerMetadata, bk as WorkflowBinding, bl as ZoneIdRoute, bm as ZoneNameRoute, bn as addAuthorizationHeader, bo as defaultWranglerConfig, bp as extractAccountTag, bq as extractWAFBlockRayId, br as fetchInternalBase, bs as fetchKVGetValueBase, bt as fetchListResultBase, bu as fetchResultBase, bv as getBrowserRenderingHeadfulFromEnv, bw as getBuildConditionsFromEnv, bx as getBuildPlatformFromEnv, by as getC3CommandFromEnv, bz as getCIGeneratePreviewAlias, bA as getCIMatchTag, bB as getCIOverrideName, bC as getCIOverrideNetworkModeHost, bD as getCfFetchEnabledFromEnv, bE as getCfFetchPathFromEnv, bF as getCloudflareApiBaseUrl, bG as getCloudflareApiEnvironmentFromEnv, bH as getCloudflareComplianceRegion, bI as getCloudflareContainerRegistry, bJ as getCloudflareEnv, bK as getCloudflareIncludeProcessEnvFromEnv, bL as getCloudflareLoadDevVarsFromDotEnv, bM as getCloudflaredPathFromEnv, bN as getComplianceRegionSubdomain, bO as getD1ExtraLocationChoices, bP as getDisableConfigWatching, bQ as getLocalExplorerEnabledFromEnv, bR as getLocalObservabilityEnabledFromEnv, bS as getNoSkillsUpdatePromptsFromEnv, bT as getOpenNextDeployFromEnv, bU as getOutputFileDirectoryFromEnv, bV as getOutputFilePathFromEnv, bW as getRegistryPath, bX as getSanitizeLogs, bY as getSubdomainMixedStateCheckDisabled, bZ as getTraceHeader, b_ as getWorkersCIBranchName, b$ as getWranglerCacheDirFromEnv, c0 as getWranglerHideBanner, c1 as getWranglerSendErrorReportsFromEnv, c2 as getWranglerSendMetricsFromEnv, c3 as hasCursor, c4 as hasMorePages, c5 as isDoNotTrackEnabled, c6 as isWAFBlockResponse, c7 as maybeAddTraceHeader, c8 as parseRetryAfterMs, c9 as parseRetryAfterValue, ca as performApiFetchBase, cb as renderError, cc as throwFetchError, cd as truncate } from './compliance-kb1BOFhx.mjs';
3
3
  import * as jsoncParser from 'jsonc-parser';
4
4
  import { UserError, TelemetryMessage } from './errors.mjs';
5
5
  export { CommandLineArgsError, DeprecationError, FatalError, JsonFriendlyFatalError, MissingConfigError, createFatalError } from './errors.mjs';
package/dist/index.mjs CHANGED
@@ -2,8 +2,8 @@ export { MetricsRegistry } from './chunk-Z62CVNHJ.mjs';
2
2
  export { _forceColour, formatZodError } from './chunk-7AX24RFK.mjs';
3
3
  import { isRedirectedRawConfig, configFileName, formatConfigSnippet, getDurableObjectExports, getContainerNameToClassNameMap, parsePackageJSON, readFileSync, ParseError, parseJSON, APIError, CONTAINER_IMAGES_BINDING, dir, parseTOML, modify, applyEdits, format, dist_default, parseJSONC } from './chunk-JGKSDUFK.mjs';
4
4
  export { APIError, CONTAINER_IMAGES_BINDING, ENVIRONMENT_TAG_PREFIX, INHERIT_SYMBOL, JSON_CONFIG_FORMATS, PATH_TO_DEPLOY_CONFIG, ParseError, SERVICE_TAG_PREFIX, configFileName, configFormat, experimental_readRawConfig, findWranglerConfig, formatConfigSnippet, getContainerDurableObjectClassNames, getContainerNameToClassNameMap, getDurableObjectClassNameToUseSQLiteMap, getDurableObjectContainerApps, getDurableObjectExports, getResolvedDurableObjectContainerApps, hasDurableObjectExports, indexLocation, isDurableObjectContainerApp, isRedirectedConfig, parseByteSize, parseHumanDuration, parseJSON, parseJSONC, parseNonHyphenedUuid, parsePackageJSON, parseTOML, partitionExports, readFileSync, readFileSyncToBuffer, resolveContainerClassName, resolveWranglerConfigPath, searchLocation, validateDurableObjectContainerApplications } from './chunk-JGKSDUFK.mjs';
5
- import { assertNever } from './chunk-5H6GBNUC.mjs';
6
- export { DEFAULT_COMPAT_DATE, assertNever, constructWranglerConfig, mapWorkerMetadataBindings } from './chunk-5H6GBNUC.mjs';
5
+ import { assertNever } from './chunk-2OPNWQJ5.mjs';
6
+ export { DEFAULT_COMPAT_DATE, assertNever, constructWranglerConfig, mapWorkerMetadataBindings } from './chunk-2OPNWQJ5.mjs';
7
7
  export { NODEJS_COMPAT_DEFAULT_ON_DATE, NODEJS_COMPAT_V2_SWITCH_OVER_DATE, getTodaysCompatDate, isCompatDate, isNodejsCompatDefaultOn, resolveNodejsCompat, stripRedundantNodejsCompatFlags } from './chunk-C6O4ION7.mjs';
8
8
  import { getCloudflareEnv, getCloudflareContainerRegistry, getCloudflareApiBaseUrl, getTraceHeader, getCloudflaredPathFromEnv, getOutputFilePathFromEnv, getOutputFileDirectoryFromEnv, getCIOverrideName, getWranglerCacheDirFromEnv } from './chunk-IYSONYTF.mjs';
9
9
  export { COMPLIANCE_REGION_CONFIG_PUBLIC, COMPLIANCE_REGION_CONFIG_UNKNOWN, getBrowserRenderingHeadfulFromEnv, getBuildConditionsFromEnv, getBuildPlatformFromEnv, getC3CommandFromEnv, getCIGeneratePreviewAlias, getCIMatchTag, getCIOverrideName, getCIOverrideNetworkModeHost, getCfFetchEnabledFromEnv, getCfFetchPathFromEnv, getCloudflareApiBaseUrl, getCloudflareApiEnvironmentFromEnv, getCloudflareComplianceRegion, getCloudflareContainerRegistry, getCloudflareEnv, getCloudflareIncludeProcessEnvFromEnv, getCloudflareLoadDevVarsFromDotEnv, getCloudflaredPathFromEnv, getComplianceRegionSubdomain, getD1ExtraLocationChoices, getDisableConfigWatching, getLocalExplorerEnabledFromEnv, getLocalObservabilityEnabledFromEnv, getNoSkillsUpdatePromptsFromEnv, getOpenNextDeployFromEnv, getOutputFileDirectoryFromEnv, getOutputFilePathFromEnv, getRegistryPath, getSanitizeLogs, getSubdomainMixedStateCheckDisabled, getTraceHeader, getWorkersCIBranchName, getWranglerCacheDirFromEnv, getWranglerHideBanner, getWranglerSendErrorReportsFromEnv, getWranglerSendMetricsFromEnv, isDoNotTrackEnabled } from './chunk-IYSONYTF.mjs';
@@ -29,7 +29,6 @@ import { createHash, randomBytes } from 'node:crypto';
29
29
  import { arch } from 'node:os';
30
30
  import * as timersPromises from 'node:timers/promises';
31
31
  import { setTimeout as setTimeout$1 } from 'node:timers/promises';
32
- import { assert as assert$1 } from 'node:console';
33
32
 
34
33
  // ../../node_modules/.pnpm/ci-info@4.4.0/node_modules/ci-info/vendors.json
35
34
  var require_vendors = __commonJS({
@@ -1801,6 +1800,9 @@ var getJSONPath = /* @__PURE__ */ __name((obj, allPaths, isArrayInsertion, prevP
1801
1800
  for (const [k, v] of Object.entries(obj)) {
1802
1801
  const currentPath = [...prevPath, k];
1803
1802
  if (Array.isArray(v)) {
1803
+ if (v.length === 0 && !isArrayInsertion) {
1804
+ allPaths.push([...currentPath, v]);
1805
+ }
1804
1806
  v.forEach((x, i) => {
1805
1807
  if (isArrayInsertion) {
1806
1808
  allPaths.push([...currentPath, -1, x]);
@@ -1811,7 +1813,13 @@ var getJSONPath = /* @__PURE__ */ __name((obj, allPaths, isArrayInsertion, prevP
1811
1813
  }
1812
1814
  });
1813
1815
  } else if (typeof v === "object" && v !== null) {
1814
- getJSONPath(v, allPaths, isArrayInsertion, currentPath);
1816
+ if (Object.keys(v).length === 0) {
1817
+ if (!isArrayInsertion) {
1818
+ allPaths.push([...currentPath, v]);
1819
+ }
1820
+ } else {
1821
+ getJSONPath(v, allPaths, isArrayInsertion, currentPath);
1822
+ }
1815
1823
  } else {
1816
1824
  allPaths.push([...currentPath, v]);
1817
1825
  }
@@ -17995,17 +18003,31 @@ function validateRoutes(diagnostics, topLevelEnv, rawEnv, envName) {
17995
18003
  return result;
17996
18004
  }
17997
18005
  __name(validateRoutes, "validateRoutes");
17998
- function normalizeAndValidatePlacement(diagnostics, topLevelEnv, rawEnv) {
17999
- if (rawEnv.placement) {
18006
+ function normalizeAndValidatePlacement(diagnostics, topLevelEnv, rawEnv, diagnosticField = "placement") {
18007
+ if (rawEnv.placement !== void 0) {
18008
+ if (typeof rawEnv.placement !== "object" || rawEnv.placement === null || Array.isArray(rawEnv.placement)) {
18009
+ diagnostics.errors.push(
18010
+ `The field "${diagnosticField}" should be an object but got ${JSON.stringify(rawEnv.placement)}.`
18011
+ );
18012
+ return inheritable(
18013
+ diagnostics,
18014
+ topLevelEnv,
18015
+ rawEnv,
18016
+ "placement",
18017
+ () => true,
18018
+ void 0
18019
+ );
18020
+ }
18000
18021
  const placement = rawEnv.placement;
18001
18022
  const hasHint = "hint" in placement;
18002
- const hasRegion = "region" in placement;
18003
- const hasHost = "host" in placement;
18004
- const hasHostname = "hostname" in placement;
18005
- const hasTargetedFields = hasRegion || hasHost || hasHostname;
18023
+ const targetedFields = ["region", "host", "hostname"];
18024
+ const presentTargetedFields = targetedFields.filter(
18025
+ (field) => field in placement
18026
+ );
18027
+ const hasTargetedFields = presentTargetedFields.length > 0;
18006
18028
  if (hasHint && hasTargetedFields) {
18007
18029
  diagnostics.errors.push(
18008
- `"placement" cannot have both "hint" (smart format) and "region"/"host"/"hostname" (targeted format) fields`
18030
+ `"${diagnosticField}" cannot have both "hint" (smart format) and "region"/"host"/"hostname" (targeted format) fields`
18009
18031
  );
18010
18032
  return inheritable(
18011
18033
  diagnostics,
@@ -18019,7 +18041,7 @@ function normalizeAndValidatePlacement(diagnostics, topLevelEnv, rawEnv) {
18019
18041
  if (hasHint) {
18020
18042
  validateRequiredProperty(
18021
18043
  diagnostics,
18022
- "placement",
18044
+ diagnosticField,
18023
18045
  "mode",
18024
18046
  placement.mode,
18025
18047
  "string",
@@ -18029,75 +18051,58 @@ function normalizeAndValidatePlacement(diagnostics, topLevelEnv, rawEnv) {
18029
18051
  const hint = placement.hint;
18030
18052
  if (hint !== void 0 && typeof hint !== "string") {
18031
18053
  diagnostics.errors.push(
18032
- `"placement.hint" must be a string when "placement.mode" is "${mode}"`
18054
+ `"${diagnosticField}.hint" must be a string when "${diagnosticField}.mode" is "${mode}"`
18033
18055
  );
18034
18056
  }
18035
18057
  if (hint && mode !== "smart") {
18036
18058
  diagnostics.errors.push(
18037
- `"placement.hint" can only be set when "placement.mode" is "smart"`
18059
+ `"${diagnosticField}.hint" can only be set when "${diagnosticField}.mode" is "smart"`
18038
18060
  );
18039
18061
  }
18040
18062
  } else if (hasTargetedFields) {
18041
18063
  validateOptionalProperty(
18042
18064
  diagnostics,
18043
- "placement",
18065
+ diagnosticField,
18044
18066
  "mode",
18045
18067
  placement.mode,
18046
18068
  "string",
18047
- ["off", "targeted"]
18069
+ ["targeted"]
18048
18070
  );
18049
- if (hasRegion) {
18050
- validateOptionalProperty(
18071
+ for (const field of presentTargetedFields) {
18072
+ validateRequiredProperty(
18051
18073
  diagnostics,
18052
- "placement",
18053
- "region",
18054
- placement.region,
18055
- "string"
18056
- );
18057
- }
18058
- if (hasHost) {
18059
- validateOptionalProperty(
18060
- diagnostics,
18061
- "placement",
18062
- "host",
18063
- placement.host,
18064
- "string"
18065
- );
18066
- }
18067
- if (hasHostname) {
18068
- validateOptionalProperty(
18069
- diagnostics,
18070
- "placement",
18071
- "hostname",
18072
- placement.hostname,
18074
+ diagnosticField,
18075
+ field,
18076
+ placement[field],
18073
18077
  "string"
18074
18078
  );
18075
- }
18076
- const fieldsPresent = [hasRegion, hasHost, hasHostname].filter(Boolean);
18077
- if (fieldsPresent.length > 1) {
18078
- const presentFields = [];
18079
- if (hasRegion) {
18080
- presentFields.push("region");
18081
- }
18082
- if (hasHost) {
18083
- presentFields.push("host");
18084
- }
18085
- if (hasHostname) {
18086
- presentFields.push("hostname");
18079
+ if (placement[field] === "") {
18080
+ diagnostics.errors.push(
18081
+ `"${diagnosticField}.${field}" must be a non-empty string.`
18082
+ );
18087
18083
  }
18084
+ }
18085
+ if (presentTargetedFields.length > 1) {
18088
18086
  diagnostics.errors.push(
18089
- `"placement" fields ${presentFields.map((f) => `"${f}"`).join(", ")} are mutually exclusive. Only one can be specified.`
18087
+ `"${diagnosticField}" fields ${presentTargetedFields.map((field) => `"${field}"`).join(", ")} are mutually exclusive. Only one can be specified.`
18090
18088
  );
18091
18089
  }
18092
18090
  } else {
18093
18091
  validateRequiredProperty(
18094
18092
  diagnostics,
18095
- "placement",
18093
+ diagnosticField,
18096
18094
  "mode",
18097
18095
  placement.mode,
18098
18096
  "string",
18099
18097
  ["off", "smart", "targeted"]
18100
18098
  );
18099
+ if (placement.mode === "targeted") {
18100
+ validateAtLeastOnePropertyRequired(diagnostics, diagnosticField, [
18101
+ { key: "region", value: placement.region, type: "string" },
18102
+ { key: "host", value: placement.host, type: "string" },
18103
+ { key: "hostname", value: placement.hostname, type: "string" }
18104
+ ]);
18105
+ }
18101
18106
  }
18102
18107
  }
18103
18108
  return inheritable(
@@ -22017,6 +22022,7 @@ var validatePreviewsConfig = /* @__PURE__ */ __name((envName, configPath) => (di
22017
22022
  "logpush",
22018
22023
  "observability",
22019
22024
  "limits",
22025
+ "placement",
22020
22026
  "cache"
22021
22027
  ]) && isValid;
22022
22028
  isValid = validateVars(envName)(
@@ -22031,6 +22037,12 @@ var validatePreviewsConfig = /* @__PURE__ */ __name((envName, configPath) => (di
22031
22037
  previews.define,
22032
22038
  void 0
22033
22039
  ) && isValid;
22040
+ normalizeAndValidatePlacement(
22041
+ diagnostics,
22042
+ void 0,
22043
+ previews,
22044
+ `${field}.placement`
22045
+ );
22034
22046
  isValid = validateBindingsProperty(envName, validateDurableObjectBinding)(
22035
22047
  diagnostics,
22036
22048
  `${field}.durable_objects`,
@@ -22749,6 +22761,11 @@ var validateObservability = /* @__PURE__ */ __name((diagnostics, field, value) =
22749
22761
  key: "traces.enabled",
22750
22762
  value: val.traces?.enabled,
22751
22763
  type: "boolean"
22764
+ },
22765
+ {
22766
+ key: "issues.enabled",
22767
+ value: val.issues?.enabled,
22768
+ type: "boolean"
22752
22769
  }
22753
22770
  ]) && isValid;
22754
22771
  isValid = validateOptionalProperty(
@@ -22765,6 +22782,13 @@ var validateObservability = /* @__PURE__ */ __name((diagnostics, field, value) =
22765
22782
  val.redact_query_string,
22766
22783
  "boolean"
22767
22784
  ) && isValid;
22785
+ const issuesIsObject = val.issues === void 0 || val.issues !== null && typeof val.issues === "object" && !Array.isArray(val.issues);
22786
+ if (!issuesIsObject) {
22787
+ diagnostics.errors.push(
22788
+ `"${field}.issues" should be an object but got ${JSON.stringify(val.issues)}.`
22789
+ );
22790
+ isValid = false;
22791
+ }
22768
22792
  isValid = validateOptionalProperty(diagnostics, field, "logs", val.logs, "object") && isValid;
22769
22793
  isValid = validateOptionalProperty(
22770
22794
  diagnostics,
@@ -22777,9 +22801,25 @@ var validateObservability = /* @__PURE__ */ __name((diagnostics, field, value) =
22777
22801
  "enabled",
22778
22802
  "head_sampling_rate",
22779
22803
  "redact_query_string",
22804
+ "issues",
22780
22805
  "logs",
22781
22806
  "traces"
22782
22807
  ]) && isValid;
22808
+ if (val.issues !== void 0 && issuesIsObject) {
22809
+ isValid = validateOptionalProperty(
22810
+ diagnostics,
22811
+ `${field}.issues`,
22812
+ "enabled",
22813
+ val.issues.enabled,
22814
+ "boolean"
22815
+ ) && isValid;
22816
+ isValid = validateAdditionalProperties(
22817
+ diagnostics,
22818
+ `${field}.issues`,
22819
+ Object.keys(val.issues),
22820
+ ["enabled"]
22821
+ ) && isValid;
22822
+ }
22783
22823
  if (typeof val.logs === "object") {
22784
22824
  isValid = validateOptionalProperty(
22785
22825
  diagnostics,
@@ -26682,7 +26722,7 @@ function getWorkerNameFromProject(projectPath) {
26682
26722
  }
26683
26723
  __name(getWorkerNameFromProject, "getWorkerNameFromProject");
26684
26724
  function toUrlPath(filePath) {
26685
- assert$1(
26725
+ assert2(
26686
26726
  !/^[a-z]:/i.test(filePath),
26687
26727
  "Tried to convert a Windows file path with a drive to a URL path."
26688
26728
  );