vercel 53.3.1 → 53.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.
Files changed (51) hide show
  1. package/dist/chunks/{add-PGPQCMJK.js → add-FYITUY65.js} +4 -4
  2. package/dist/chunks/{chunk-7EJTBI6M.js → chunk-44EL4BJL.js} +5 -5
  3. package/dist/chunks/{chunk-TR6DYQV6.js → chunk-54T7XV3H.js} +1 -1
  4. package/dist/chunks/{chunk-3GJFG6GX.js → chunk-5HTDIHTQ.js} +2 -2
  5. package/dist/chunks/{chunk-RYUPBGRO.js → chunk-6447C5WV.js} +1 -1
  6. package/dist/chunks/{chunk-QV34LTI7.js → chunk-6EI6XOUG.js} +2 -2
  7. package/dist/chunks/{chunk-PR72OE3G.js → chunk-73EVSBLA.js} +1 -1
  8. package/dist/chunks/{chunk-XYYGNWMQ.js → chunk-7TCOOSFP.js} +1 -1
  9. package/dist/chunks/{chunk-H57DZL5B.js → chunk-CMAHZSFA.js} +12 -2
  10. package/dist/chunks/{chunk-7Z5XFBB4.js → chunk-IVC36JQ5.js} +3 -3
  11. package/dist/chunks/{chunk-AORK3I3E.js → chunk-KHDOCVQF.js} +1 -1
  12. package/dist/chunks/{chunk-RI23R2QO.js → chunk-KM7WTYJ4.js} +2 -2
  13. package/dist/chunks/{chunk-4L73BR7G.js → chunk-KTULXE6M.js} +1 -1
  14. package/dist/chunks/{chunk-JJ36CB7A.js → chunk-LBP7YFBV.js} +336 -51
  15. package/dist/chunks/{chunk-2TNGZL25.js → chunk-MW7BI4C2.js} +1 -1
  16. package/dist/chunks/{chunk-25WI74GM.js → chunk-PU7YKGJI.js} +4 -4
  17. package/dist/chunks/{chunk-HJVSVCAZ.js → chunk-SLWOG5CX.js} +60 -2
  18. package/dist/chunks/{chunk-SOSCFYOT.js → chunk-WZO6BNJ7.js} +1 -1
  19. package/dist/chunks/{chunk-AAPG3P4D.js → chunk-YWCYZANP.js} +3 -3
  20. package/dist/chunks/{chunk-3YDXZRSZ.js → chunk-Z2ES2XHU.js} +1 -1
  21. package/dist/chunks/{chunk-4VJ3GTBX.js → chunk-ZY4YCCXG.js} +1 -1
  22. package/dist/chunks/{compile-vercel-config-H4BUE5BZ.js → compile-vercel-config-ED6WXKEL.js} +1 -1
  23. package/dist/chunks/{delete-HVWVDBQF.js → delete-FYRG67YL.js} +2 -2
  24. package/dist/chunks/{disable-CMBQPZ7L.js → disable-T6JFY4LL.js} +2 -2
  25. package/dist/chunks/{discard-ZDNWUYLY.js → discard-OLVACEPN.js} +2 -2
  26. package/dist/chunks/{edit-YJYM3EKS.js → edit-JI2VCMGG.js} +3 -3
  27. package/dist/chunks/{enable-ITE7U5C4.js → enable-2W35HGRM.js} +2 -2
  28. package/dist/chunks/{export-VVN33IBK.js → export-FFMFMPGE.js} +2 -2
  29. package/dist/chunks/{inspect-I7ILS3E2.js → inspect-RDRV6BUD.js} +3 -3
  30. package/dist/chunks/{list-6PZO3UIZ.js → list-5WGQ7F6P.js} +2 -2
  31. package/dist/chunks/{list-BWIEHOTA.js → list-F2GP6UZ7.js} +3 -3
  32. package/dist/chunks/{ls-LZZFID76.js → ls-ZLHJPSZZ.js} +4 -4
  33. package/dist/chunks/{publish-NULVZ7RB.js → publish-S2PGRBDP.js} +2 -2
  34. package/dist/chunks/{query-BGI3AVJA.js → query-G5K7DLLJ.js} +5 -5
  35. package/dist/chunks/{reorder-G66QSKTR.js → reorder-K5VXZ7F5.js} +2 -2
  36. package/dist/chunks/{restore-LHDVXFOH.js → restore-QJYBYUIZ.js} +2 -2
  37. package/dist/chunks/{rm-DTAOTWXD.js → rm-WCHM3XXB.js} +4 -4
  38. package/dist/chunks/{rule-inspect-AOITFBTB.js → rule-inspect-VMWUI4WH.js} +4 -4
  39. package/dist/chunks/{rules-IW3XGCNA.js → rules-SOQXK4AE.js} +6 -6
  40. package/dist/chunks/{schema-2VCQ2MAA.js → schema-2H2WLFJN.js} +2 -2
  41. package/dist/chunks/{update-L3DZ5STE.js → update-W6DZOFHV.js} +4 -4
  42. package/dist/commands/build/index.js +52 -45
  43. package/dist/commands/deploy/index.js +10 -10
  44. package/dist/commands/dev/index.js +209 -32
  45. package/dist/commands/env/index.js +5 -5
  46. package/dist/commands/link/index.js +7 -7
  47. package/dist/commands/list/index.js +3 -3
  48. package/dist/commands-bulk.js +1756 -1257
  49. package/dist/index.js +9 -9
  50. package/dist/version.mjs +1 -1
  51. package/package.json +23 -23
@@ -15966,6 +15966,40 @@ var require_frameworks = __commonJS({
15966
15966
  }
15967
15967
  ]
15968
15968
  },
15969
+ {
15970
+ name: "Ash",
15971
+ slug: "ash",
15972
+ logo: "https://api-frameworks.vercel.sh/framework-logos/ash.svg",
15973
+ darkModeLogo: "https://api-frameworks.vercel.sh/framework-logos/ash-dark.svg",
15974
+ tagline: "A filesystem-first framework for durable backend agents on Vercel.",
15975
+ description: "An Ash app: agents authored as a directory of files, compiled and served on Vercel.",
15976
+ detectors: {
15977
+ every: [
15978
+ {
15979
+ path: "package.json",
15980
+ matchContent: '"(dev)?(d|D)ependencies":\\s*{[^}]*"experimental-ash":\\s*".+?"[^}]*}'
15981
+ }
15982
+ ]
15983
+ },
15984
+ settings: {
15985
+ installCommand: {
15986
+ placeholder: "`pnpm install`, `yarn install`, or `npm install`"
15987
+ },
15988
+ buildCommand: {
15989
+ value: "ash build",
15990
+ placeholder: "`npm run build` or `ash build`"
15991
+ },
15992
+ devCommand: {
15993
+ value: "ash dev",
15994
+ placeholder: "ash dev"
15995
+ },
15996
+ outputDirectory: {
15997
+ value: ".output"
15998
+ }
15999
+ },
16000
+ getOutputDirName: async () => ".output",
16001
+ experimental: true
16002
+ },
15969
16003
  {
15970
16004
  name: "Sanity (v3)",
15971
16005
  slug: "sanity-v3",
@@ -22640,9 +22674,11 @@ var require_utils3 = __commonJS({
22640
22674
  inferRuntimeFromFramework: () => inferRuntimeFromFramework,
22641
22675
  inferServiceRuntime: () => inferServiceRuntime,
22642
22676
  isFrontendFramework: () => isFrontendFramework,
22677
+ isPublicServicesEnabled: () => isPublicServicesEnabled2,
22643
22678
  isRouteOwningBuilder: () => isRouteOwningBuilder2,
22644
22679
  isStaticBuild: () => isStaticBuild2,
22645
- readVercelConfig: () => readVercelConfig
22680
+ readVercelConfig: () => readVercelConfig,
22681
+ validateServicesConfigGate: () => validateServicesConfigGate
22646
22682
  });
22647
22683
  module.exports = __toCommonJS2(utils_exports);
22648
22684
  var import_framework_helpers = __require("@vercel/build-utils/dist/framework-helpers");
@@ -22655,6 +22691,18 @@ var require_utils3 = __commonJS({
22655
22691
  return false;
22656
22692
  }
22657
22693
  }
22694
+ function isPublicServicesEnabled2() {
22695
+ return process.env.VERCEL_USE_SERVICES === "1" || process.env.VERCEL_USE_SERVICES?.toLowerCase() === "true";
22696
+ }
22697
+ function validateServicesConfigGate(config) {
22698
+ if (config?.services !== void 0 && !isPublicServicesEnabled2()) {
22699
+ return {
22700
+ code: "INVALID_VERCEL_CONFIG",
22701
+ message: "Invalid vercel.json - should NOT have additional property `services`. Please remove it."
22702
+ };
22703
+ }
22704
+ return null;
22705
+ }
22658
22706
  var INTERNAL_QUEUES_PREFIX = "/_svc/_queues";
22659
22707
  function normalizeInternalServiceEntrypoint(entrypoint) {
22660
22708
  const normalized = entrypoint.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\.[^/.]+$/, "");
@@ -22739,6 +22787,10 @@ var require_utils3 = __commonJS({
22739
22787
  try {
22740
22788
  const content = await fs5.readFile("vercel.json");
22741
22789
  const config = JSON.parse(content.toString());
22790
+ const gateError = validateServicesConfigGate(config);
22791
+ if (gateError) {
22792
+ return { config: null, error: gateError };
22793
+ }
22742
22794
  return { config, error: null };
22743
22795
  } catch {
22744
22796
  return {
@@ -22756,6 +22808,10 @@ var require_utils3 = __commonJS({
22756
22808
  const { parse: tomlParse3 } = await import("smol-toml");
22757
22809
  const content = await fs5.readFile("vercel.toml");
22758
22810
  const config = tomlParse3(content.toString());
22811
+ const gateError = validateServicesConfigGate(config);
22812
+ if (gateError) {
22813
+ return { config: null, error: gateError };
22814
+ }
22759
22815
  return { config, error: null };
22760
22816
  } catch {
22761
22817
  return {
@@ -23075,6 +23131,11 @@ var require_resolve2 = __commonJS({
23075
23131
  var SERVICE_NAME_REGEX = /^[a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$/;
23076
23132
  var DNS_LABEL_RE = /^(?!-)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
23077
23133
  var ENV_PREFIX_RE = /^[A-Z][A-Z0-9_]*_$/;
23134
+ var ENTRYPOINT_REQUIRED_RUNTIMES = /* @__PURE__ */ new Set([
23135
+ "node",
23136
+ "python",
23137
+ "go"
23138
+ ]);
23078
23139
  async function getServiceFs(fs5, serviceName, root) {
23079
23140
  if (!root) {
23080
23141
  return { fs: fs5 };
@@ -23106,6 +23167,38 @@ var require_resolve2 = __commonJS({
23106
23167
  const normalized = import_path11.posix.normalize(entrypoint);
23107
23168
  return normalized === "" ? "." : normalized;
23108
23169
  }
23170
+ function getEffectiveServiceTrigger(config) {
23171
+ if (config.type === "cron") {
23172
+ return "schedule";
23173
+ }
23174
+ if (config.type === "worker") {
23175
+ return "queue";
23176
+ }
23177
+ if (config.type !== "job") {
23178
+ return void 0;
23179
+ }
23180
+ return config.trigger;
23181
+ }
23182
+ function getEntrypointRequiredRuntime(config) {
23183
+ if (config.runtime && config.runtime in import_types.RUNTIME_BUILDERS) {
23184
+ return config.runtime;
23185
+ }
23186
+ return (0, import_utils4.inferRuntimeFromFramework)(config.framework);
23187
+ }
23188
+ function validateBackendFileEntrypoint(name, config, resolvedEntrypoint, options) {
23189
+ if (!options.requireFileEntrypointForBackendRuntimes || !resolvedEntrypoint?.isDirectory) {
23190
+ return null;
23191
+ }
23192
+ const runtime = getEntrypointRequiredRuntime(config);
23193
+ if (!runtime || !ENTRYPOINT_REQUIRED_RUNTIMES.has(runtime)) {
23194
+ return null;
23195
+ }
23196
+ return {
23197
+ code: "INVALID_ENTRYPOINT",
23198
+ message: `Service "${name}" must specify a file "entrypoint" when using "${config.runtime ? "runtime" : "framework"}" "${config.runtime || config.framework}".`,
23199
+ serviceName: name
23200
+ };
23201
+ }
23109
23202
  async function resolveEntrypointPath({
23110
23203
  fs: fs5,
23111
23204
  serviceName,
@@ -23200,7 +23293,7 @@ var require_resolve2 = __commonJS({
23200
23293
  return {
23201
23294
  error: {
23202
23295
  code: "MULTIPLE_FRAMEWORKS_SERVICE",
23203
- message: `Multiple frameworks detected in ${workspace === "." ? "project root" : `${workspace}/`}: ${frameworkNames}. Specify "framework" explicitly in experimentalServices.`,
23296
+ message: `Multiple frameworks detected in ${workspace === "." ? "project root" : `${workspace}/`}: ${frameworkNames}. Specify "framework" explicitly in services.`,
23204
23297
  serviceName
23205
23298
  }
23206
23299
  };
@@ -23294,7 +23387,7 @@ var require_resolve2 = __commonJS({
23294
23387
  }
23295
23388
  };
23296
23389
  }
23297
- function validateServiceConfig(name, config) {
23390
+ function validateServiceConfig(name, config, options = {}) {
23298
23391
  if (!SERVICE_NAME_REGEX.test(name)) {
23299
23392
  return {
23300
23393
  code: "INVALID_SERVICE_NAME",
@@ -23310,13 +23403,15 @@ var require_resolve2 = __commonJS({
23310
23403
  };
23311
23404
  }
23312
23405
  const serviceType = config.type || "web";
23313
- const isJobService = serviceType === "job" || serviceType === "cron";
23314
- const isScheduleJobService = (0, import_build_utils5.isScheduleTriggeredService)({
23406
+ const effectiveTrigger = getEffectiveServiceTrigger(config);
23407
+ const effectiveService = {
23315
23408
  type: serviceType,
23316
- trigger: config.trigger
23317
- });
23318
- const isQueueJobService = serviceType === "job" && config.trigger === "queue";
23319
- const isWorkflowService = serviceType === "job" && config.trigger === "workflow";
23409
+ trigger: effectiveTrigger
23410
+ };
23411
+ const isJobService = serviceType === "job" || serviceType === "cron";
23412
+ const isScheduleJobService = (0, import_build_utils5.isScheduleTriggeredService)(effectiveService);
23413
+ const isQueueJobService = serviceType === "job" && (0, import_build_utils5.isQueueTriggeredService)(effectiveService);
23414
+ const isWorkflowService = serviceType === "job" && effectiveTrigger === "workflow";
23320
23415
  const isNonWebService = serviceType === "worker" || isJobService;
23321
23416
  const serviceTypeLabel = isJobService ? "Job" : serviceType === "worker" ? "Worker" : "Web";
23322
23417
  const routingResult = resolveServiceRoutingConfig(name, config);
@@ -23362,17 +23457,17 @@ var require_resolve2 = __commonJS({
23362
23457
  serviceName: name
23363
23458
  };
23364
23459
  }
23365
- if (serviceType === "job" && config.trigger === void 0) {
23460
+ if (serviceType === "job" && effectiveTrigger === void 0) {
23366
23461
  return {
23367
23462
  code: "MISSING_JOB_TRIGGER",
23368
23463
  message: `Job service "${name}" is missing required "trigger" field.`,
23369
23464
  serviceName: name
23370
23465
  };
23371
23466
  }
23372
- if (serviceType === "job" && config.trigger && !import_build_utils5.JOB_TRIGGERS.includes(config.trigger)) {
23467
+ if (serviceType === "job" && effectiveTrigger && !import_build_utils5.JOB_TRIGGERS.includes(effectiveTrigger)) {
23373
23468
  return {
23374
23469
  code: "INVALID_JOB_TRIGGER",
23375
- message: `Job service "${name}" has invalid trigger "${config.trigger}". Expected ${import_build_utils5.JOB_TRIGGERS.map((t) => `"${t}"`).join(", ")}.`,
23470
+ message: `Job service "${name}" has invalid trigger "${effectiveTrigger}". Expected ${import_build_utils5.JOB_TRIGGERS.map((t) => `"${t}"`).join(", ")}.`,
23376
23471
  serviceName: name
23377
23472
  };
23378
23473
  }
@@ -23450,6 +23545,7 @@ var require_resolve2 = __commonJS({
23450
23545
  const hasFramework = Boolean(config.framework);
23451
23546
  const hasBuilderOrRuntime = Boolean(config.builder || config.runtime);
23452
23547
  const hasEntrypoint = Boolean(config.entrypoint);
23548
+ const entrypointRequiredRuntime = getEntrypointRequiredRuntime(config);
23453
23549
  if (!hasFramework && !hasBuilderOrRuntime && !hasEntrypoint) {
23454
23550
  return {
23455
23551
  code: "MISSING_SERVICE_CONFIG",
@@ -23457,6 +23553,13 @@ var require_resolve2 = __commonJS({
23457
23553
  serviceName: name
23458
23554
  };
23459
23555
  }
23556
+ if (options.requireFileEntrypointForBackendRuntimes && !hasEntrypoint && entrypointRequiredRuntime && ENTRYPOINT_REQUIRED_RUNTIMES.has(entrypointRequiredRuntime)) {
23557
+ return {
23558
+ code: "MISSING_ENTRYPOINT",
23559
+ message: `Service "${name}" must specify "entrypoint" when using "${config.runtime ? "runtime" : "framework"}" "${config.runtime || config.framework}".`,
23560
+ serviceName: name
23561
+ };
23562
+ }
23460
23563
  if (hasBuilderOrRuntime && !hasFramework && !hasEntrypoint) {
23461
23564
  return {
23462
23565
  code: "MISSING_ENTRYPOINT",
@@ -23494,7 +23597,7 @@ var require_resolve2 = __commonJS({
23494
23597
  routePrefixSource = "configured"
23495
23598
  } = options;
23496
23599
  const type = config.type || "web";
23497
- const trigger = type === "cron" ? "schedule" : type === "job" ? config.trigger : void 0;
23600
+ const trigger = getEffectiveServiceTrigger(config);
23498
23601
  const rawEntrypoint = config.entrypoint;
23499
23602
  const moduleAttrParsed = typeof rawEntrypoint === "string" ? parsePyModuleAttrEntrypoint(rawEntrypoint) : null;
23500
23603
  const routingResult = resolveServiceRoutingConfig(name, config);
@@ -23640,13 +23743,13 @@ var require_resolve2 = __commonJS({
23640
23743
  envPrefix: config.envPrefix
23641
23744
  };
23642
23745
  }
23643
- async function resolveAllConfiguredServices(services, fs5, routePrefixSource = "configured") {
23746
+ async function resolveAllConfiguredServices(services, fs5, routePrefixSource = "configured", options = {}) {
23644
23747
  const resolved = [];
23645
23748
  const errors = [];
23646
23749
  const webServicesByRoutePrefix = /* @__PURE__ */ new Map();
23647
23750
  for (const name of Object.keys(services)) {
23648
23751
  const serviceConfig = services[name];
23649
- const validationError = validateServiceConfig(name, serviceConfig);
23752
+ const validationError = validateServiceConfig(name, serviceConfig, options);
23650
23753
  if (validationError) {
23651
23754
  errors.push(validationError);
23652
23755
  continue;
@@ -23684,6 +23787,16 @@ var require_resolve2 = __commonJS({
23684
23787
  continue;
23685
23788
  }
23686
23789
  }
23790
+ const explicitBackendEntrypointError = validateBackendFileEntrypoint(
23791
+ name,
23792
+ serviceConfig,
23793
+ resolvedEntrypoint,
23794
+ options
23795
+ );
23796
+ if (explicitBackendEntrypointError) {
23797
+ errors.push(explicitBackendEntrypointError);
23798
+ continue;
23799
+ }
23687
23800
  let resolvedConfig = serviceConfig;
23688
23801
  if (!serviceConfig.framework && resolvedEntrypoint) {
23689
23802
  if (resolvedEntrypoint.isDirectory) {
@@ -23740,6 +23853,16 @@ var require_resolve2 = __commonJS({
23740
23853
  }
23741
23854
  }
23742
23855
  }
23856
+ const backendEntrypointError = validateBackendFileEntrypoint(
23857
+ name,
23858
+ resolvedConfig,
23859
+ resolvedEntrypoint,
23860
+ options
23861
+ );
23862
+ if (backendEntrypointError) {
23863
+ errors.push(backendEntrypointError);
23864
+ continue;
23865
+ }
23743
23866
  const service = await resolveConfiguredService({
23744
23867
  name,
23745
23868
  config: resolvedConfig,
@@ -23819,7 +23942,7 @@ var require_auto_detect = __commonJS({
23819
23942
  errors: [
23820
23943
  {
23821
23944
  code: "MULTIPLE_FRAMEWORKS_ROOT",
23822
- message: `Multiple frameworks detected at root: ${frameworkNames}. Use explicit experimentalServices config.`
23945
+ message: `Multiple frameworks detected at root: ${frameworkNames}. Use explicit services config.`
23823
23946
  }
23824
23947
  ]
23825
23948
  };
@@ -23844,7 +23967,7 @@ var require_auto_detect = __commonJS({
23844
23967
  errors: [
23845
23968
  {
23846
23969
  code: "MULTIPLE_FRAMEWORKS_SERVICE",
23847
- message: `Multiple frameworks detected in ${frontendLocation}/: ${frameworkNames}. Use explicit experimentalServices config.`
23970
+ message: `Multiple frameworks detected in ${frontendLocation}/: ${frameworkNames}. Use explicit services config.`
23848
23971
  }
23849
23972
  ]
23850
23973
  };
@@ -23862,7 +23985,7 @@ var require_auto_detect = __commonJS({
23862
23985
  errors: [
23863
23986
  {
23864
23987
  code: "NO_SERVICES_CONFIGURED",
23865
- message: "No services detected. Configure experimentalServices in vercel.json or ensure a framework exists at project root, frontend/, or apps/web/."
23988
+ message: "No services detected. Configure services in vercel.json or ensure a framework exists at project root, frontend/, or apps/web/."
23866
23989
  }
23867
23990
  ]
23868
23991
  };
@@ -23943,7 +24066,7 @@ var require_auto_detect = __commonJS({
23943
24066
  services: {},
23944
24067
  error: {
23945
24068
  code: "SERVICE_NAME_CONFLICT",
23946
- message: `Service name conflict: "${serviceName}" exists in both ${BACKEND_DIR}/ and ${SERVICES_DIR}/${serviceName}/. Rename one of the directories or use explicit experimentalServices config.`,
24069
+ message: `Service name conflict: "${serviceName}" exists in both ${BACKEND_DIR}/ and ${SERVICES_DIR}/${serviceName}/. Rename one of the directories or use explicit services config.`,
23947
24070
  serviceName
23948
24071
  }
23949
24072
  };
@@ -23992,7 +24115,7 @@ var require_auto_detect = __commonJS({
23992
24115
  return {
23993
24116
  error: {
23994
24117
  code: "MULTIPLE_FRAMEWORKS_SERVICE",
23995
- message: `Multiple frameworks detected in ${dirPath}/: ${frameworkNames}. Use explicit experimentalServices config.`,
24118
+ message: `Multiple frameworks detected in ${dirPath}/: ${frameworkNames}. Use explicit services config.`,
23996
24119
  serviceName
23997
24120
  }
23998
24121
  };
@@ -24126,7 +24249,7 @@ var require_detect_railway = __commonJS({
24126
24249
  if (frameworks.length === 0) {
24127
24250
  warnings.push({
24128
24251
  code: "SERVICE_SKIPPED",
24129
- message: `Skipped service in ${dirLabel}/: no framework detected. Configure it manually in experimentalServices.`
24252
+ message: `Skipped service in ${dirLabel}/: no framework detected. Configure it manually in services.`
24130
24253
  });
24131
24254
  continue;
24132
24255
  }
@@ -24134,7 +24257,7 @@ var require_detect_railway = __commonJS({
24134
24257
  const names = frameworks.map((f) => f.name).join(", ");
24135
24258
  errors.push({
24136
24259
  code: "MULTIPLE_FRAMEWORKS_SERVICE",
24137
- message: `Multiple frameworks detected in ${dirLabel}/: ${names}. Use explicit experimentalServices config.`,
24260
+ message: `Multiple frameworks detected in ${dirLabel}/: ${names}. Use explicit services config.`,
24138
24261
  serviceName
24139
24262
  });
24140
24263
  continue;
@@ -24376,7 +24499,8 @@ var require_detect_services = __commonJS({
24376
24499
  warnings: []
24377
24500
  });
24378
24501
  }
24379
- const configuredServices = vercelConfig?.experimentalServices;
24502
+ const hasNonEmptyPublicServicesConfig = vercelConfig?.services && Object.keys(vercelConfig.services).length > 0;
24503
+ const configuredServices = hasNonEmptyPublicServicesConfig ? vercelConfig.services : vercelConfig?.experimentalServices;
24380
24504
  const hasConfiguredServices = configuredServices && Object.keys(configuredServices).length > 0;
24381
24505
  if (!hasConfiguredServices) {
24382
24506
  const railwayResult = await (0, import_detect_railway.detectRailwayServices)({ fs: scopedFs });
@@ -24453,7 +24577,7 @@ var require_detect_services = __commonJS({
24453
24577
  errors: [
24454
24578
  {
24455
24579
  code: "NO_SERVICES_CONFIGURED",
24456
- message: "No services configured. Add `experimentalServices` to vercel.json."
24580
+ message: "No services configured. Add `services` to vercel.json."
24457
24581
  }
24458
24582
  ],
24459
24583
  warnings: []
@@ -24462,7 +24586,12 @@ var require_detect_services = __commonJS({
24462
24586
  const result = await (0, import_resolve.resolveAllConfiguredServices)(
24463
24587
  configuredServices,
24464
24588
  scopedFs,
24465
- "configured"
24589
+ "configured",
24590
+ {
24591
+ requireFileEntrypointForBackendRuntimes: Boolean(
24592
+ hasNonEmptyPublicServicesConfig
24593
+ )
24594
+ }
24466
24595
  );
24467
24596
  const routes = generateServicesRoutes2(result.services);
24468
24597
  return withResolvedResult({
@@ -24890,7 +25019,7 @@ var require_get_services_builders = __commonJS({
24890
25019
  errors: [
24891
25020
  {
24892
25021
  code: "NO_SERVICES_CONFIGURED",
24893
- message: "No services configured. Add `experimentalServices` to vercel.json."
25022
+ message: "No services configured. Add `services` to vercel.json."
24894
25023
  }
24895
25024
  ],
24896
25025
  warnings: warningResponses,
@@ -25020,13 +25149,14 @@ var require_detect_builders = __commonJS({
25020
25149
  return publicBuilder ? publicBuilder.src.replace("/**/*", "") : null;
25021
25150
  }
25022
25151
  async function detectBuilders2(files, pkg, options = {}) {
25023
- const { experimentalServices: services, projectSettings = {} } = options;
25152
+ const { services, experimentalServices, projectSettings = {} } = options;
25024
25153
  const { framework } = projectSettings;
25025
- const hasServicesConfig = services != null && typeof services === "object";
25154
+ const configuredServices = services ?? experimentalServices;
25155
+ const hasServicesConfig = configuredServices != null && typeof configuredServices === "object";
25026
25156
  if (hasServicesConfig || framework === "services") {
25027
25157
  return (0, import_get_services_builders.getServicesBuilders)({
25028
25158
  workPath: options.workPath,
25029
- configuredServices: services,
25159
+ configuredServices,
25030
25160
  projectFramework: framework
25031
25161
  });
25032
25162
  }
@@ -38908,7 +39038,7 @@ var require_package = __commonJS({
38908
39038
  "../client/package.json"(exports, module) {
38909
39039
  module.exports = {
38910
39040
  name: "@vercel/client",
38911
- version: "17.4.1",
39041
+ version: "17.4.3",
38912
39042
  main: "dist/index.js",
38913
39043
  typings: "dist/index.d.ts",
38914
39044
  homepage: "https://vercel.com",
@@ -55193,6 +55323,9 @@ var envTargetChoices = import_constants.PROJECT_ENV_TARGET.map((t) => ({
55193
55323
  name: (0, import_title.default)(t),
55194
55324
  value: t
55195
55325
  }));
55326
+ function isValidEnvTarget(target) {
55327
+ return typeof target === "undefined" || envTargetChoices.map((c) => c.value).includes(target);
55328
+ }
55196
55329
  function getEnvTargetPlaceholder() {
55197
55330
  return `<${envTargetChoices.map((c) => c.value).join(" | ")}>`;
55198
55331
  }
@@ -55965,7 +56098,7 @@ var cronsSchema = {
55965
56098
  }
55966
56099
  }
55967
56100
  };
55968
- var serviceMountSchema = {
56101
+ var experimentalServicesMountSchema = {
55969
56102
  oneOf: [
55970
56103
  {
55971
56104
  type: "string",
@@ -55991,10 +56124,46 @@ var serviceMountSchema = {
55991
56124
  }
55992
56125
  ]
55993
56126
  };
55994
- var serviceScheduleSchema = {
56127
+ var servicesMountSchema = {
56128
+ oneOf: [
56129
+ {
56130
+ type: "string",
56131
+ minLength: 1,
56132
+ maxLength: 512
56133
+ },
56134
+ {
56135
+ type: "object",
56136
+ additionalProperties: false,
56137
+ required: ["path"],
56138
+ properties: {
56139
+ path: {
56140
+ type: "string",
56141
+ minLength: 1,
56142
+ maxLength: 512
56143
+ }
56144
+ }
56145
+ }
56146
+ ]
56147
+ };
56148
+ var staticServiceScheduleSchema = {
55995
56149
  type: "string",
55996
56150
  minLength: 9,
55997
- maxLength: 256
56151
+ maxLength: 256,
56152
+ not: { const: "<dynamic>" }
56153
+ };
56154
+ var serviceScheduleSchema = {
56155
+ oneOf: [
56156
+ {
56157
+ type: "string",
56158
+ minLength: 9,
56159
+ maxLength: 256
56160
+ },
56161
+ {
56162
+ type: "array",
56163
+ minItems: 1,
56164
+ items: staticServiceScheduleSchema
56165
+ }
56166
+ ]
55998
56167
  };
55999
56168
  var serviceQueueTopicSchema = {
56000
56169
  type: "object",
@@ -56036,13 +56205,18 @@ var serviceTopicsSchema = {
56036
56205
  }
56037
56206
  ]
56038
56207
  };
56039
- var serviceCommonProperties = {
56208
+ var experimentalServicesCommonProperties = {
56209
+ entrypoint: {
56210
+ type: "string",
56211
+ minLength: 1,
56212
+ maxLength: 512
56213
+ },
56040
56214
  root: {
56041
56215
  type: "string",
56042
56216
  minLength: 1,
56043
56217
  maxLength: 512
56044
56218
  },
56045
- entrypoint: {
56219
+ workspace: {
56046
56220
  type: "string",
56047
56221
  minLength: 1,
56048
56222
  maxLength: 512
@@ -56072,6 +56246,11 @@ var serviceCommonProperties = {
56072
56246
  minLength: 1,
56073
56247
  maxLength: 2048
56074
56248
  },
56249
+ preDeployCommand: {
56250
+ type: "string",
56251
+ minLength: 1,
56252
+ maxLength: 2048
56253
+ },
56075
56254
  memory: {
56076
56255
  type: "integer",
56077
56256
  minimum: 128,
@@ -56102,8 +56281,8 @@ var serviceCommonProperties = {
56102
56281
  ]
56103
56282
  }
56104
56283
  };
56105
- var serviceRoutableProperties = {
56106
- mount: serviceMountSchema,
56284
+ var experimentalServicesRoutableProperties = {
56285
+ mount: experimentalServicesMountSchema,
56107
56286
  routePrefix: {
56108
56287
  type: "string",
56109
56288
  minLength: 1,
@@ -56115,14 +56294,30 @@ var serviceRoutableProperties = {
56115
56294
  maxLength: 63
56116
56295
  }
56117
56296
  };
56118
- var serviceConfigSchema = {
56297
+ var servicesCommonProperties = {
56298
+ entrypoint: experimentalServicesCommonProperties.entrypoint,
56299
+ root: experimentalServicesCommonProperties.root,
56300
+ framework: experimentalServicesCommonProperties.framework,
56301
+ runtime: experimentalServicesCommonProperties.runtime,
56302
+ buildCommand: experimentalServicesCommonProperties.buildCommand,
56303
+ preDeployCommand: experimentalServicesCommonProperties.preDeployCommand,
56304
+ memory: experimentalServicesCommonProperties.memory,
56305
+ maxDuration: experimentalServicesCommonProperties.maxDuration,
56306
+ includeFiles: experimentalServicesCommonProperties.includeFiles,
56307
+ excludeFiles: experimentalServicesCommonProperties.excludeFiles
56308
+ };
56309
+ var servicesRoutableProperties = {
56310
+ mount: servicesMountSchema
56311
+ };
56312
+ var servicesRequiredProperties = ["type", "root"];
56313
+ var experimentalServicesServiceConfigSchema = {
56119
56314
  oneOf: [
56120
56315
  {
56121
56316
  type: "object",
56122
56317
  additionalProperties: false,
56123
56318
  properties: {
56124
- ...serviceCommonProperties,
56125
- ...serviceRoutableProperties,
56319
+ ...experimentalServicesCommonProperties,
56320
+ ...experimentalServicesRoutableProperties,
56126
56321
  type: {
56127
56322
  enum: ["web"]
56128
56323
  }
@@ -56133,7 +56328,7 @@ var serviceConfigSchema = {
56133
56328
  additionalProperties: false,
56134
56329
  required: ["type", "trigger", "schedule"],
56135
56330
  properties: {
56136
- ...serviceCommonProperties,
56331
+ ...experimentalServicesCommonProperties,
56137
56332
  type: {
56138
56333
  const: "job"
56139
56334
  },
@@ -56148,7 +56343,7 @@ var serviceConfigSchema = {
56148
56343
  additionalProperties: false,
56149
56344
  required: ["type", "trigger", "topics"],
56150
56345
  properties: {
56151
- ...serviceCommonProperties,
56346
+ ...experimentalServicesCommonProperties,
56152
56347
  type: {
56153
56348
  const: "job"
56154
56349
  },
@@ -56168,7 +56363,7 @@ var serviceConfigSchema = {
56168
56363
  additionalProperties: false,
56169
56364
  required: ["type", "trigger", "entrypoint"],
56170
56365
  properties: {
56171
- ...serviceCommonProperties,
56366
+ ...experimentalServicesCommonProperties,
56172
56367
  type: {
56173
56368
  const: "job"
56174
56369
  },
@@ -56182,7 +56377,7 @@ var serviceConfigSchema = {
56182
56377
  additionalProperties: false,
56183
56378
  required: ["type"],
56184
56379
  properties: {
56185
- ...serviceCommonProperties,
56380
+ ...experimentalServicesCommonProperties,
56186
56381
  type: {
56187
56382
  const: "worker"
56188
56383
  },
@@ -56207,7 +56402,7 @@ var serviceConfigSchema = {
56207
56402
  additionalProperties: false,
56208
56403
  required: ["type", "schedule"],
56209
56404
  properties: {
56210
- ...serviceCommonProperties,
56405
+ ...experimentalServicesCommonProperties,
56211
56406
  type: {
56212
56407
  const: "cron"
56213
56408
  },
@@ -56216,13 +56411,81 @@ var serviceConfigSchema = {
56216
56411
  }
56217
56412
  ]
56218
56413
  };
56414
+ var servicesServiceConfigSchema = {
56415
+ oneOf: [
56416
+ {
56417
+ type: "object",
56418
+ additionalProperties: false,
56419
+ required: servicesRequiredProperties,
56420
+ properties: {
56421
+ ...servicesCommonProperties,
56422
+ ...servicesRoutableProperties,
56423
+ type: {
56424
+ enum: ["web"]
56425
+ }
56426
+ }
56427
+ },
56428
+ {
56429
+ type: "object",
56430
+ additionalProperties: false,
56431
+ required: [...servicesRequiredProperties, "trigger", "schedule"],
56432
+ properties: {
56433
+ ...servicesCommonProperties,
56434
+ type: {
56435
+ const: "job"
56436
+ },
56437
+ trigger: {
56438
+ const: "schedule"
56439
+ },
56440
+ schedule: serviceScheduleSchema
56441
+ }
56442
+ },
56443
+ {
56444
+ type: "object",
56445
+ additionalProperties: false,
56446
+ required: [...servicesRequiredProperties, "trigger", "topics"],
56447
+ properties: {
56448
+ ...servicesCommonProperties,
56449
+ type: {
56450
+ const: "job"
56451
+ },
56452
+ trigger: {
56453
+ const: "queue"
56454
+ },
56455
+ topics: serviceTopicsSchema
56456
+ }
56457
+ },
56458
+ {
56459
+ type: "object",
56460
+ additionalProperties: false,
56461
+ required: [...servicesRequiredProperties, "trigger", "entrypoint"],
56462
+ properties: {
56463
+ ...servicesCommonProperties,
56464
+ type: {
56465
+ const: "job"
56466
+ },
56467
+ trigger: {
56468
+ const: "workflow"
56469
+ }
56470
+ }
56471
+ }
56472
+ ]
56473
+ };
56474
+ var servicesSchema = {
56475
+ type: "object",
56476
+ propertyNames: {
56477
+ pattern: "^[a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$",
56478
+ maxLength: 64
56479
+ },
56480
+ additionalProperties: servicesServiceConfigSchema
56481
+ };
56219
56482
  var experimentalServicesSchema = {
56220
56483
  type: "object",
56221
56484
  propertyNames: {
56222
56485
  pattern: "^[a-zA-Z]([a-zA-Z0-9_-]*[a-zA-Z0-9])?$",
56223
56486
  maxLength: 64
56224
56487
  },
56225
- additionalProperties: serviceConfigSchema
56488
+ additionalProperties: experimentalServicesServiceConfigSchema
56226
56489
  };
56227
56490
  var experimentalServiceGroupsSchema = {
56228
56491
  type: "object",
@@ -56256,13 +56519,26 @@ var vercelConfigSchema = {
56256
56519
  images: imagesSchema,
56257
56520
  crons: cronsSchema,
56258
56521
  bunVersion: { type: "string" },
56522
+ services: servicesSchema,
56259
56523
  experimentalServices: experimentalServicesSchema,
56260
56524
  experimentalServiceGroups: experimentalServiceGroupsSchema
56261
56525
  }
56262
56526
  };
56263
56527
  var ajv = new import_ajv.default();
56264
56528
  var validate = ajv.compile(vercelConfigSchema);
56529
+ function isPublicServicesEnabled() {
56530
+ return process.env.VERCEL_USE_SERVICES === "1" || process.env.VERCEL_USE_SERVICES?.toLowerCase() === "true";
56531
+ }
56265
56532
  function validateConfig(config) {
56533
+ if (Object.prototype.hasOwnProperty.call(config, "services") && !isPublicServicesEnabled()) {
56534
+ const fileName = config[import_client.fileNameSymbol] || "vercel.json";
56535
+ const niceError = getPrettyError({
56536
+ dataPath: "",
56537
+ params: { additionalProperty: "services" }
56538
+ });
56539
+ niceError.message = `Invalid ${fileName} - ${niceError.message}`;
56540
+ return niceError;
56541
+ }
56266
56542
  if (!validate(config)) {
56267
56543
  if (validate.errors && validate.errors[0]) {
56268
56544
  const error = validate.errors[0];
@@ -56279,16 +56555,24 @@ function validateConfig(config) {
56279
56555
  link: "https://vercel.link/functions-and-builds"
56280
56556
  });
56281
56557
  }
56282
- if (config.experimentalServices && config.builds) {
56558
+ const hasServices = Boolean(config.services);
56559
+ const hasExperimentalServices = Boolean(config.experimentalServices);
56560
+ if (hasServices && hasExperimentalServices) {
56561
+ return new NowBuildError({
56562
+ code: "SERVICES_AND_EXPERIMENTAL_SERVICES",
56563
+ message: "The `services` property cannot be used in conjunction with the `experimentalServices` property. Please remove one of them."
56564
+ });
56565
+ }
56566
+ if ((hasServices || hasExperimentalServices) && config.builds) {
56283
56567
  return new NowBuildError({
56284
56568
  code: "SERVICES_AND_BUILDS",
56285
- message: "The `experimentalServices` property cannot be used in conjunction with the `builds` property. Please remove one of them."
56569
+ message: "The `services` property cannot be used in conjunction with the `builds` property. Please remove one of them."
56286
56570
  });
56287
56571
  }
56288
- if (config.experimentalServices && config.functions) {
56572
+ if ((hasServices || hasExperimentalServices) && config.functions) {
56289
56573
  return new NowBuildError({
56290
56574
  code: "SERVICES_AND_FUNCTIONS",
56291
- message: "The `experimentalServices` property cannot be used in conjunction with the `functions` property. Please remove one of them."
56575
+ message: "The `services` property cannot be used in conjunction with the `functions` property. Please remove one of them."
56292
56576
  });
56293
56577
  }
56294
56578
  if (config.experimentalServiceGroups && !config.experimentalServices) {
@@ -56314,7 +56598,7 @@ async function hasExperimentalServicesConfig(cwd) {
56314
56598
  );
56315
56599
  if (!config || config instanceof Error)
56316
56600
  return false;
56317
- return config.experimentalServices != null && typeof config.experimentalServices === "object";
56601
+ return config.services != null && typeof config.services === "object" || config.experimentalServices != null && typeof config.experimentalServices === "object";
56318
56602
  } catch {
56319
56603
  return false;
56320
56604
  }
@@ -57135,6 +57419,7 @@ export {
57135
57419
  require_lib2 as require_lib,
57136
57420
  humanizePath,
57137
57421
  envTargetChoices,
57422
+ isValidEnvTarget,
57138
57423
  getEnvTargetPlaceholder,
57139
57424
  listSubcommand,
57140
57425
  addSubcommand,