@cloudflare/workers-utils 0.38.0 → 0.39.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.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  export { MetricsRegistry } from './chunk-Z62CVNHJ.mjs';
2
2
  export { _forceColour, formatZodError } from './chunk-7AX24RFK.mjs';
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-IQDQ5WRD.mjs';
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, getDurableObjectContainerApps, getDurableObjectExports, hasDurableObjectExports, indexLocation, isDurableObjectContainerApp, isRedirectedConfig, parseByteSize, parseHumanDuration, parseJSON, parseJSONC, parseNonHyphenedUuid, parsePackageJSON, parseTOML, partitionExports, readFileSync, readFileSyncToBuffer, resolveContainerClassName, resolveWranglerConfigPath, searchLocation } from './chunk-IQDQ5WRD.mjs';
5
- import { assertNever } from './chunk-S3ANQ67D.mjs';
6
- export { DEFAULT_COMPAT_DATE, assertNever, constructWranglerConfig, mapWorkerMetadataBindings } from './chunk-S3ANQ67D.mjs';
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
+ 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';
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';
@@ -1692,7 +1692,6 @@ var defaultWranglerConfig = {
1692
1692
  vectorize: [],
1693
1693
  ai_search_namespaces: [],
1694
1694
  ai_search: [],
1695
- websearch: void 0,
1696
1695
  agent_memory: [],
1697
1696
  hyperdrive: [],
1698
1697
  workflows: [],
@@ -17214,7 +17213,6 @@ var friendlyBindingNames = {
17214
17213
  vectorize: "Vectorize Index",
17215
17214
  ai_search_namespaces: "AI Search Namespace",
17216
17215
  ai_search: "AI Search Instance",
17217
- websearch: "Web Search",
17218
17216
  agent_memory: "Agent Memory",
17219
17217
  hyperdrive: "Hyperdrive Config",
17220
17218
  r2_buckets: "R2 Bucket",
@@ -17268,7 +17266,6 @@ var bindingTypeFriendlyNames = {
17268
17266
  vectorize: "Vectorize Index",
17269
17267
  ai_search_namespace: "AI Search Namespace",
17270
17268
  ai_search: "AI Search Instance",
17271
- websearch: "Web Search",
17272
17269
  agent_memory: "Agent Memory",
17273
17270
  hyperdrive: "Hyperdrive Config",
17274
17271
  service: "Worker",
@@ -18543,16 +18540,6 @@ function normalizeAndValidateEnvironment(diagnostics, configPath, rawEnv, isDisp
18543
18540
  validateBindingArray(envName, validateAISearchBinding),
18544
18541
  []
18545
18542
  ),
18546
- websearch: notInheritable(
18547
- diagnostics,
18548
- topLevelEnv,
18549
- rawConfig,
18550
- rawEnv,
18551
- envName,
18552
- "websearch",
18553
- validateNamedSimpleBinding(envName),
18554
- void 0
18555
- ),
18556
18543
  agent_memory: notInheritable(
18557
18544
  diagnostics,
18558
18545
  topLevelEnv,
@@ -19805,7 +19792,6 @@ var validateUnsafeBinding = /* @__PURE__ */ __name((diagnostics, field, value) =
19805
19792
  "ai",
19806
19793
  "ai_search_namespace",
19807
19794
  "ai_search",
19808
- "websearch",
19809
19795
  "agent_memory",
19810
19796
  "kv_namespace",
19811
19797
  "durable_object_namespace",
@@ -20021,8 +20007,25 @@ function validateDurableObjectContainerImages(diagnostics, field, images, compli
20021
20007
  valid = false;
20022
20008
  }
20023
20009
  }
20010
+ const isDockerfileBuild = hasDockerfile && !hasImage;
20011
+ if (isDockerfileBuild) {
20012
+ if (image.build_context !== void 0 && (typeof image.build_context !== "string" || image.build_context.length === 0)) {
20013
+ diagnostics.errors.push(
20014
+ `"${imageField}.build_context" must be a non-empty string.`
20015
+ );
20016
+ valid = false;
20017
+ }
20018
+ if (image.build_vars !== void 0 && (typeof image.build_vars !== "object" || image.build_vars === null || Array.isArray(image.build_vars) || Object.values(image.build_vars).some(
20019
+ (value) => typeof value !== "string"
20020
+ ))) {
20021
+ diagnostics.errors.push(
20022
+ `"${imageField}.build_vars" must be an object with string values.`
20023
+ );
20024
+ valid = false;
20025
+ }
20026
+ }
20024
20027
  const unsupportedFields = Object.keys(image).filter(
20025
- (property) => property !== "dockerfile" && property !== "image"
20028
+ (property) => property !== "dockerfile" && property !== "image" && !(isDockerfileBuild && (property === "build_context" || property === "build_vars"))
20026
20029
  );
20027
20030
  if (unsupportedFields.length > 0) {
20028
20031
  diagnostics.errors.push(
@@ -20034,6 +20037,32 @@ function validateDurableObjectContainerImages(diagnostics, field, images, compli
20034
20037
  return valid;
20035
20038
  }
20036
20039
  __name(validateDurableObjectContainerImages, "validateDurableObjectContainerImages");
20040
+ function validateDurableObjectContainerUnsafe(diagnostics, field, value) {
20041
+ if (value === void 0) {
20042
+ return;
20043
+ }
20044
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
20045
+ diagnostics.errors.push(`"${field}" should be an object.`);
20046
+ return;
20047
+ }
20048
+ const unsafe = value;
20049
+ const configuration = unsafe.configuration;
20050
+ if (Object.keys(unsafe).some((key) => key !== "configuration") || configuration !== void 0 && (typeof configuration !== "object" || configuration === null || Array.isArray(configuration) || Object.keys(configuration).some((key) => key !== "experimental_flags"))) {
20051
+ diagnostics.errors.push(
20052
+ `Only "${field}.configuration.experimental_flags" is supported for Durable Object-managed Containers.`
20053
+ );
20054
+ return;
20055
+ }
20056
+ if (configuration !== void 0) {
20057
+ const flags = configuration.experimental_flags;
20058
+ if (flags !== void 0 && (!Array.isArray(flags) || flags.some((flag) => typeof flag !== "string"))) {
20059
+ diagnostics.errors.push(
20060
+ `"${field}.configuration.experimental_flags" should be an array of strings.`
20061
+ );
20062
+ }
20063
+ }
20064
+ }
20065
+ __name(validateDurableObjectContainerUnsafe, "validateDurableObjectContainerUnsafe");
20037
20066
  function validateContainerApp(envName, topLevelName, configPath, options = {}) {
20038
20067
  const { generateDefaultName = true } = options;
20039
20068
  return (diagnostics, field, value, config2) => {
@@ -20049,19 +20078,16 @@ function validateContainerApp(envName, topLevelName, configPath, options = {}) {
20049
20078
  for (const containerAppOptional of value) {
20050
20079
  const isDurableObjectManaged = containerAppOptional.scheduling_policy === "durable_object";
20051
20080
  const hasValidDurableObjectClassName = typeof containerAppOptional.class_name === "string" && containerAppOptional.class_name.length > 0;
20052
- if (isDurableObjectManaged) {
20053
- if (!hasValidDurableObjectClassName) {
20054
- diagnostics.errors.push(
20055
- `"containers.class_name" must be a non-empty string when "containers.scheduling_policy" is "durable_object".`
20056
- );
20057
- }
20058
- } else {
20059
- validateOptionalProperty(
20060
- diagnostics,
20061
- field,
20062
- "class_name",
20063
- containerAppOptional.class_name,
20064
- "string"
20081
+ validateOptionalProperty(
20082
+ diagnostics,
20083
+ field,
20084
+ "class_name",
20085
+ containerAppOptional.class_name,
20086
+ "string"
20087
+ );
20088
+ if (isDurableObjectManaged && containerAppOptional.class_name === "") {
20089
+ diagnostics.errors.push(
20090
+ `"containers.class_name" must be a non-empty string when specified for a Durable Object-managed Container.`
20065
20091
  );
20066
20092
  }
20067
20093
  validateOptionalProperty(
@@ -20071,7 +20097,7 @@ function validateContainerApp(envName, topLevelName, configPath, options = {}) {
20071
20097
  containerAppOptional.name,
20072
20098
  "string"
20073
20099
  );
20074
- if (generateDefaultName && !containerAppOptional.name && (!isDurableObjectManaged || hasValidDurableObjectClassName)) {
20100
+ if (generateDefaultName && !containerAppOptional.name && (!isDurableObjectManaged || containerAppOptional.class_name === void 0 || hasValidDurableObjectClassName)) {
20075
20101
  if (containerAppOptional.class_name === void 0) {
20076
20102
  diagnostics.errors.push(
20077
20103
  `"containers.name" is required when "containers.class_name" is not defined, because there is no class name to derive a default name from. Either name this container and reference it from a Durable Object's \`exports\` entry, or set "containers.class_name".`
@@ -20093,12 +20119,35 @@ function validateContainerApp(envName, topLevelName, configPath, options = {}) {
20093
20119
  containerAppOptional.images,
20094
20120
  options.complianceConfig
20095
20121
  );
20122
+ validateContainerObservability(
20123
+ diagnostics,
20124
+ `${field}.observability`,
20125
+ containerAppOptional.observability,
20126
+ config2
20127
+ );
20128
+ if (containerAppOptional.observability?.target_instance_count !== void 0 || containerAppOptional.observability?.target_instance_percentage !== void 0) {
20129
+ diagnostics.errors.push(
20130
+ `"${field}.observability" only supports enabling or disabling logs for Durable Object-managed Containers; instance targeting is not supported.`
20131
+ );
20132
+ }
20133
+ validateDurableObjectContainerUnsafe(
20134
+ diagnostics,
20135
+ `${field}.unsafe`,
20136
+ containerAppOptional.unsafe
20137
+ );
20096
20138
  const unsupportedFields = Object.keys(containerAppOptional).filter(
20097
- (key) => !["name", "class_name", "scheduling_policy", "images"].includes(key)
20139
+ (key) => ![
20140
+ "name",
20141
+ "class_name",
20142
+ "scheduling_policy",
20143
+ "images",
20144
+ "observability",
20145
+ "unsafe"
20146
+ ].includes(key)
20098
20147
  );
20099
20148
  if (unsupportedFields.length > 0) {
20100
20149
  diagnostics.errors.push(
20101
- `Unsupported fields for Durable Object-managed Containers in ${field}: ${unsupportedFields.map((key) => `"${key}"`).join(",")}. Only "name", "class_name", "scheduling_policy", and "images" are supported.`
20150
+ `Unsupported fields for Durable Object-managed Containers in ${field}: ${unsupportedFields.map((key) => `"${key}"`).join(",")}. Only "name", "class_name", "scheduling_policy", "images", "observability", and restricted "unsafe" settings are supported.`
20102
20151
  );
20103
20152
  }
20104
20153
  continue;
@@ -21940,6 +21989,8 @@ var validatePreviewsConfig = /* @__PURE__ */ __name((envName, configPath) => (di
21940
21989
  "d1_databases",
21941
21990
  "r2_buckets",
21942
21991
  "vectorize",
21992
+ "ai_search_namespaces",
21993
+ "ai_search",
21943
21994
  "hyperdrive",
21944
21995
  "services",
21945
21996
  "analytics_engine_datasets",
@@ -22026,6 +22077,18 @@ var validatePreviewsConfig = /* @__PURE__ */ __name((envName, configPath) => (di
22026
22077
  previews.vectorize,
22027
22078
  void 0
22028
22079
  ) && isValid;
22080
+ isValid = validateBindingArray(envName, validateAISearchNamespaceBinding)(
22081
+ diagnostics,
22082
+ `${field}.ai_search_namespaces`,
22083
+ previews.ai_search_namespaces,
22084
+ void 0
22085
+ ) && isValid;
22086
+ isValid = validateBindingArray(envName, validateAISearchBinding)(
22087
+ diagnostics,
22088
+ `${field}.ai_search`,
22089
+ previews.ai_search,
22090
+ void 0
22091
+ ) && isValid;
22029
22092
  isValid = validateBindingArray(envName, validateHyperdriveBinding)(
22030
22093
  diagnostics,
22031
22094
  `${field}.hyperdrive`,
@@ -23181,7 +23244,6 @@ var BINDING_LOCAL_SUPPORT = {
23181
23244
  flagship: "DO-NOT-USE-this-resource-will-never-have-a-local-simulator",
23182
23245
  vpc_service: "DO-NOT-USE-this-resource-will-never-have-a-local-simulator",
23183
23246
  vpc_network: "DO-NOT-USE-this-resource-will-never-have-a-local-simulator",
23184
- websearch: "DO-NOT-USE-this-resource-will-never-have-a-local-simulator",
23185
23247
  agent_memory: "DO-NOT-USE-this-resource-will-never-have-a-local-simulator"
23186
23248
  };
23187
23249
  function getBindingLocalSupport(type) {
@@ -23679,11 +23741,6 @@ function convertConfigToBindings(config2, options) {
23679
23741
  }
23680
23742
  break;
23681
23743
  }
23682
- case "websearch": {
23683
- const { binding, ...x } = info;
23684
- output[binding] = { type: "websearch", ...x };
23685
- break;
23686
- }
23687
23744
  case "agent_memory": {
23688
23745
  for (const { binding, ...x } of info) {
23689
23746
  output[binding] = { type: "agent_memory", ...x };
@@ -23856,7 +23913,6 @@ function printBindings(bindings, options) {
23856
23913
  bindings
23857
23914
  );
23858
23915
  const ai_search = extractBindingsOfType("ai_search", bindings);
23859
- const websearch = extractBindingsOfType("websearch", bindings);
23860
23916
  const agent_memory = extractBindingsOfType("agent_memory", bindings);
23861
23917
  const hyperdrive = extractBindingsOfType("hyperdrive", bindings);
23862
23918
  const r2_buckets = extractBindingsOfType("r2_bucket", bindings);
@@ -24074,16 +24130,6 @@ function printBindings(bindings, options) {
24074
24130
  }))
24075
24131
  );
24076
24132
  }
24077
- if (websearch.length > 0) {
24078
- output.push(
24079
- ...websearch.map(({ binding }) => ({
24080
- name: binding,
24081
- type: getBindingTypeFriendlyName("websearch"),
24082
- value: void 0,
24083
- mode: getMode({ isSimulatedLocally: false })
24084
- }))
24085
- );
24086
- }
24087
24133
  if (agent_memory.length > 0) {
24088
24134
  output.push(
24089
24135
  ...agent_memory.map(({ binding, namespace }) => ({
@@ -24565,7 +24611,7 @@ ${allTailConsumers.map(({ service, streaming }) => {
24565
24611
  log(
24566
24612
  `${containersTitle}
24567
24613
  ${containers.map(
24568
- (container) => container.scheduling_policy === "durable_object" ? `- ${container.class_name} (durable_object)` : `- ${container.name} (${container.image})`
24614
+ (container) => container.scheduling_policy === "durable_object" ? `- ${container.class_name ?? container.name} (durable_object)` : `- ${container.name} (${container.image})`
24569
24615
  ).join("\n")}`
24570
24616
  );
24571
24617
  log("");