create-cloudflare 2.70.14 → 2.70.16

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/cli.js CHANGED
@@ -75471,7 +75471,7 @@ function getGlobalWranglerCachePath() {
75471
75471
  }
75472
75472
  __name(getGlobalWranglerCachePath, "getGlobalWranglerCachePath");
75473
75473
 
75474
- // ../workers-utils/dist/chunk-Y3JVLYM6.mjs
75474
+ // ../workers-utils/dist/chunk-3K53PSCY.mjs
75475
75475
  init_chunk_Q72B4Q5Z();
75476
75476
  var import_node_fs2 = require("node:fs");
75477
75477
  var import_node_path2 = __toESM(require("node:path"), 1);
@@ -77822,10 +77822,20 @@ var APIError = class extends ParseError {
77822
77822
  * endpoint-specific structured error payloads.
77823
77823
  */
77824
77824
  meta;
77825
- constructor({ status: status2, ...rest }) {
77825
+ /**
77826
+ * Optional number of milliseconds the API asked us to wait before retrying,
77827
+ * derived from the response's `Retry-After` header (if present).
77828
+ */
77829
+ retryAfterMs;
77830
+ constructor({
77831
+ status: status2,
77832
+ retryAfterMs,
77833
+ ...rest
77834
+ }) {
77826
77835
  super(rest);
77827
77836
  this.name = this.constructor.name;
77828
77837
  this.#status = status2;
77838
+ this.retryAfterMs = retryAfterMs;
77829
77839
  }
77830
77840
  get status() {
77831
77841
  return this.#status;
@@ -78345,6 +78355,7 @@ var import_undici = __toESM(require_undici(), 1);
78345
78355
  var import_node_url2 = require("node:url");
78346
78356
  var timersPromises = __toESM(require("node:timers/promises"), 1);
78347
78357
  var import_promises2 = require("node:timers/promises");
78358
+ var import_node_console = require("node:console");
78348
78359
  var require_vendors = __commonJS2({
78349
78360
  "../../node_modules/.pnpm/ci-info@4.4.0/node_modules/ci-info/vendors.json"(exports2, module2) {
78350
78361
  module2.exports = [
@@ -98668,12 +98679,47 @@ var validateR2Binding = /* @__PURE__ */ __name((diagnostics, field, value) => {
98668
98679
  if (!isRemoteValid(value, field, diagnostics)) {
98669
98680
  isValid = false;
98670
98681
  }
98682
+ if (hasProperty(value, "local_dev")) {
98683
+ const localDev = value.local_dev;
98684
+ if (typeof localDev !== "object" || localDev === null) {
98685
+ diagnostics.errors.push(
98686
+ `"${field}" bindings should, optionally, have an object "local_dev" field but got ${JSON.stringify(
98687
+ value
98688
+ )}.`
98689
+ );
98690
+ isValid = false;
98691
+ } else {
98692
+ experimental(
98693
+ diagnostics,
98694
+ { local_dev: localDev },
98695
+ "local_dev.experimental_s3_credentials"
98696
+ );
98697
+ if (hasProperty(localDev, "experimental_s3_credentials")) {
98698
+ const credentials = localDev.experimental_s3_credentials;
98699
+ if (typeof credentials !== "object" || credentials === null || !isRequiredProperty(credentials, "accessKeyId", "string") || !isRequiredProperty(credentials, "secretAccessKey", "string")) {
98700
+ diagnostics.errors.push(
98701
+ `"${field}" bindings should, optionally, have a "local_dev.experimental_s3_credentials" field with string "accessKeyId" and "secretAccessKey" fields, but got ${JSON.stringify(
98702
+ value
98703
+ )}.`
98704
+ );
98705
+ isValid = false;
98706
+ }
98707
+ }
98708
+ validateAdditionalProperties(
98709
+ diagnostics,
98710
+ `${field}.local_dev`,
98711
+ Object.keys(localDev),
98712
+ ["experimental_s3_credentials"]
98713
+ );
98714
+ }
98715
+ }
98671
98716
  validateAdditionalProperties(diagnostics, field, Object.keys(value), [
98672
98717
  "binding",
98673
98718
  "bucket_name",
98674
98719
  "preview_bucket_name",
98675
98720
  "jurisdiction",
98676
- "remote"
98721
+ "remote",
98722
+ "local_dev"
98677
98723
  ]);
98678
98724
  return isValid;
98679
98725
  }, "validateR2Binding");
@@ -102107,6 +102153,7 @@ async function fetchInternalBase(complianceConfig, resource, init = {}, userAgen
102107
102153
  logHeaders(response.headers, logger);
102108
102154
  logger.debugWithSanitization?.("RESPONSE:", jsonText);
102109
102155
  logger.debug("-- END CF API RESPONSE");
102156
+ const retryAfterMs = parseRetryAfterMs(response.headers);
102110
102157
  if (!jsonText && (response.status === 204 || response.status === 205)) {
102111
102158
  return {
102112
102159
  response: {
@@ -102115,7 +102162,8 @@ async function fetchInternalBase(complianceConfig, resource, init = {}, userAgen
102115
102162
  errors: [],
102116
102163
  messages: []
102117
102164
  },
102118
- status: response.status
102165
+ status: response.status,
102166
+ retryAfterMs
102119
102167
  };
102120
102168
  }
102121
102169
  if (isWAFBlockResponse(response.headers)) {
@@ -102124,12 +102172,13 @@ async function fetchInternalBase(complianceConfig, resource, init = {}, userAgen
102124
102172
  method,
102125
102173
  resource,
102126
102174
  response.status,
102127
- response.statusText
102175
+ response.statusText,
102176
+ retryAfterMs
102128
102177
  );
102129
102178
  }
102130
102179
  try {
102131
102180
  const json2 = parseJSON(jsonText);
102132
- return { response: json2, status: response.status };
102181
+ return { response: json2, status: response.status, retryAfterMs };
102133
102182
  } catch {
102134
102183
  const rayId = extractWAFBlockRayId(response.headers);
102135
102184
  throw new APIError({
@@ -102144,13 +102193,18 @@ async function fetchInternalBase(complianceConfig, resource, init = {}, userAgen
102144
102193
  ...rayId ? [{ text: `Cloudflare Ray ID: ${rayId}` }] : []
102145
102194
  ],
102146
102195
  status: response.status,
102196
+ retryAfterMs,
102147
102197
  telemetryMessage: false
102148
102198
  });
102149
102199
  }
102150
102200
  }
102151
102201
  __name(fetchInternalBase, "fetchInternalBase");
102152
102202
  async function fetchResultBase(complianceConfig, resource, init = {}, userAgent, logger, queryParams, abortSignal, credentials) {
102153
- const { response: json2, status: status2 } = await fetchInternalBase(
102203
+ const {
102204
+ response: json2,
102205
+ status: status2,
102206
+ retryAfterMs
102207
+ } = await fetchInternalBase(
102154
102208
  complianceConfig,
102155
102209
  resource,
102156
102210
  init,
@@ -102163,7 +102217,7 @@ async function fetchResultBase(complianceConfig, resource, init = {}, userAgent,
102163
102217
  if (json2.success) {
102164
102218
  return json2.result;
102165
102219
  } else {
102166
- throwFetchError(resource, json2, status2);
102220
+ throwFetchError(resource, json2, status2, retryAfterMs);
102167
102221
  }
102168
102222
  }
102169
102223
  __name(fetchResultBase, "fetchResultBase");
@@ -102176,7 +102230,11 @@ async function fetchListResultBase(complianceConfig, resource, init = {}, userAg
102176
102230
  queryParams = new import_node_url2.URLSearchParams(queryParams);
102177
102231
  queryParams.set("cursor", cursor);
102178
102232
  }
102179
- const { response: json2, status: status2 } = await fetchInternalBase(
102233
+ const {
102234
+ response: json2,
102235
+ status: status2,
102236
+ retryAfterMs
102237
+ } = await fetchInternalBase(
102180
102238
  complianceConfig,
102181
102239
  resource,
102182
102240
  init,
@@ -102194,7 +102252,7 @@ async function fetchListResultBase(complianceConfig, resource, init = {}, userAg
102194
102252
  getMoreResults = false;
102195
102253
  }
102196
102254
  } else {
102197
- throwFetchError(resource, json2, status2);
102255
+ throwFetchError(resource, json2, status2, retryAfterMs);
102198
102256
  }
102199
102257
  }
102200
102258
  return results;
@@ -102212,6 +102270,24 @@ function isWAFBlockResponse(headers) {
102212
102270
  return headers.get("cf-mitigated") === "challenge";
102213
102271
  }
102214
102272
  __name(isWAFBlockResponse, "isWAFBlockResponse");
102273
+ function parseRetryAfterValue(retryAfter) {
102274
+ if (!retryAfter) {
102275
+ return void 0;
102276
+ }
102277
+ if (/^\d+$/.test(retryAfter.trim())) {
102278
+ return Number(retryAfter) * 1e3;
102279
+ }
102280
+ const retryAfterDate = new Date(retryAfter);
102281
+ if (!Number.isNaN(retryAfterDate.getTime())) {
102282
+ return Math.max(0, retryAfterDate.getTime() - Date.now());
102283
+ }
102284
+ return void 0;
102285
+ }
102286
+ __name(parseRetryAfterValue, "parseRetryAfterValue");
102287
+ function parseRetryAfterMs(headers) {
102288
+ return parseRetryAfterValue(headers.get("Retry-After"));
102289
+ }
102290
+ __name(parseRetryAfterMs, "parseRetryAfterMs");
102215
102291
  function extractWAFBlockRayId(headers) {
102216
102292
  return headers.get("cf-ray") ?? void 0;
102217
102293
  }
@@ -102291,7 +102367,7 @@ function escapeCharacter(character) {
102291
102367
  }).join("");
102292
102368
  }
102293
102369
  __name(escapeCharacter, "escapeCharacter");
102294
- function throwFetchError(resource, response, status2) {
102370
+ function throwFetchError(resource, response, status2, retryAfterMs) {
102295
102371
  const errors = response.errors ?? [];
102296
102372
  for (const error52 of errors) {
102297
102373
  maybeThrowFriendlyError(error52);
@@ -102309,10 +102385,19 @@ function throwFetchError(resource, response, status2) {
102309
102385
  notes.push({ text: fallbackMessage });
102310
102386
  }
102311
102387
  }
102388
+ if (retryAfterMs !== void 0) {
102389
+ notes.push({
102390
+ text: `The API responded with a "Retry-After" header indicating you should wait ${Math.ceil(retryAfterMs / 1e3)} second(s) before retrying.`
102391
+ });
102392
+ }
102312
102393
  const error512 = new APIError({
102313
102394
  text: `A request to the Cloudflare API (${resource}) failed.`,
102314
102395
  notes,
102315
102396
  status: status2,
102397
+ // hoist the parsed `Retry-After` header (if any) so consumers such as
102398
+ // `retryOnAPIFailure()` can back off for the amount of time the API
102399
+ // asked us to wait, e.g. when rate limited (HTTP 429).
102400
+ retryAfterMs,
102316
102401
  telemetryMessage: false
102317
102402
  });
102318
102403
  const code = errors[0]?.code;
@@ -102327,7 +102412,7 @@ function throwFetchError(resource, response, status2) {
102327
102412
  throw error512;
102328
102413
  }
102329
102414
  __name(throwFetchError, "throwFetchError");
102330
- function throwWAFBlockError(headers, method, resource, status2, statusText) {
102415
+ function throwWAFBlockError(headers, method, resource, status2, statusText, retryAfterMs) {
102331
102416
  const rayId = extractWAFBlockRayId(headers);
102332
102417
  throw new APIError({
102333
102418
  text: "The Cloudflare API responded with a WAF block page instead of the expected JSON response",
@@ -102344,6 +102429,7 @@ function throwWAFBlockError(headers, method, resource, status2, statusText) {
102344
102429
  }
102345
102430
  ],
102346
102431
  status: status2,
102432
+ retryAfterMs,
102347
102433
  telemetryMessage: false
102348
102434
  });
102349
102435
  }
@@ -102442,24 +102528,42 @@ ${url2}`
102442
102528
  }
102443
102529
  __name(handleBrowserOpenError, "handleBrowserOpenError");
102444
102530
  var MAX_ATTEMPTS = 3;
102531
+ var MAX_RETRY_AFTER_MS = 6e4;
102445
102532
  async function retryOnAPIFailure(action, logger, backoff = 0, attempts = MAX_ATTEMPTS, abortSignal) {
102446
102533
  try {
102447
102534
  return await action();
102448
102535
  } catch (err) {
102449
102536
  if (err instanceof APIError) {
102450
- if (!err.isRetryable()) {
102537
+ if (!err.isRetryable() && err.status !== 429) {
102451
102538
  throw err;
102452
102539
  }
102453
102540
  } else if (err instanceof DOMException && err.name === "TimeoutError") ;
102454
102541
  else if (!(err instanceof TypeError)) {
102455
102542
  throw err;
102456
102543
  }
102457
- logger.debug(`Retrying API call after error...`);
102458
- logger.debug(err);
102544
+ const retryAfterMs = err instanceof APIError ? err.retryAfterMs : void 0;
102545
+ if (retryAfterMs !== void 0 && retryAfterMs > MAX_RETRY_AFTER_MS) {
102546
+ throw err;
102547
+ }
102459
102548
  if (attempts <= 1) {
102460
102549
  throw err;
102461
102550
  }
102462
- await (0, import_promises2.setTimeout)(backoff, void 0, { signal: abortSignal });
102551
+ const jitter = Math.random() * 1e3;
102552
+ let wait = backoff;
102553
+ if (retryAfterMs !== void 0) {
102554
+ wait = retryAfterMs + jitter;
102555
+ } else if (err instanceof APIError && err.status === 429) {
102556
+ wait = Math.max(backoff, 1e3) + jitter;
102557
+ }
102558
+ if (retryAfterMs !== void 0) {
102559
+ logger.info(
102560
+ `Received a "Retry-After" header from the Cloudflare API. Waiting ${Math.ceil(retryAfterMs / 1e3)} second(s) before retrying...`
102561
+ );
102562
+ } else {
102563
+ logger.debug(`Retrying API call after error...`);
102564
+ logger.debug(err);
102565
+ }
102566
+ await (0, import_promises2.setTimeout)(wait, void 0, { signal: abortSignal });
102463
102567
  return retryOnAPIFailure(
102464
102568
  action,
102465
102569
  logger,
@@ -102570,6 +102674,14 @@ function getWorkerNameFromProject(projectPath) {
102570
102674
  return getWorkerName(packageJsonName, projectPath);
102571
102675
  }
102572
102676
  __name(getWorkerNameFromProject, "getWorkerNameFromProject");
102677
+ function toUrlPath(filePath) {
102678
+ (0, import_node_console.assert)(
102679
+ !/^[a-z]:/i.test(filePath),
102680
+ "Tried to convert a Windows file path with a drive to a URL path."
102681
+ );
102682
+ return filePath.replace(/\\/g, "/");
102683
+ }
102684
+ __name(toUrlPath, "toUrlPath");
102573
102685
 
102574
102686
  // ../cli/dist/check-macos-version.mjs
102575
102687
  var import_ci_info2 = __toESM(require_ci_info2(), 1);
@@ -109455,7 +109567,7 @@ var Yargs = YargsFactory(esm_default2);
109455
109567
  var yargs_default = Yargs;
109456
109568
 
109457
109569
  // package.json
109458
- var version2 = "2.70.14";
109570
+ var version2 = "2.70.16";
109459
109571
 
109460
109572
  // src/metrics.ts
109461
109573
  var import_node_async_hooks = require("node:async_hooks");
@@ -112024,24 +112136,24 @@ __name2(getPropertyName, "getPropertyName");
112024
112136
  var package_default = {
112025
112137
  name: "frameworks_clis_info",
112026
112138
  dependencies: {
112027
- "@angular/create": "22.0.7",
112028
- "@tanstack/cli": "0.69.5",
112029
- "create-analog": "2.6.3",
112030
- "create-astro": "5.2.2",
112139
+ "@angular/create": "22.0.9",
112140
+ "@tanstack/cli": "0.70.1",
112141
+ "create-analog": "2.6.4",
112142
+ "create-astro": "5.2.3",
112031
112143
  "create-docusaurus": "3.10.2",
112032
112144
  "create-hono": "0.19.4",
112033
- "create-next-app": "16.2.11",
112145
+ "create-next-app": "16.2.12",
112034
112146
  "create-qwik": "1.20.0",
112035
- "create-react-router": "8.2.0",
112147
+ "create-react-router": "8.3.0",
112036
112148
  "create-rwsdk": "3.1.3",
112037
- "create-solid": "0.7.0",
112038
- "create-vike": "0.0.664",
112149
+ "create-solid": "0.8.0",
112150
+ "create-vike": "0.0.671",
112039
112151
  "create-vite": "9.1.1",
112040
- "create-vue": "3.22.4",
112152
+ "create-vue": "3.23.0",
112041
112153
  "create-waku": "0.12.5-1.0.0-alpha.10-0",
112042
112154
  gatsby: "5.16.1",
112043
112155
  nuxi: "3.37.0",
112044
- sv: "0.16.3"
112156
+ sv: "0.16.6"
112045
112157
  },
112046
112158
  info: [
112047
112159
  "This package.json is only used to keep track of the frameworks cli dependencies",
@@ -114545,7 +114657,7 @@ If the application uses Durable Objects or Workflows, refer to the relevant best
114545
114657
  var import_node_assert6 = __toESM(require("node:assert"));
114546
114658
 
114547
114659
  // ../wrangler/package.json
114548
- var version3 = "4.114.0";
114660
+ var version3 = "4.116.0";
114549
114661
 
114550
114662
  // src/git.ts
114551
114663
  var offerGit = async (ctx) => {
@@ -114600,16 +114712,24 @@ var gitCommit = async (ctx) => {
114600
114712
  silent: true,
114601
114713
  cwd: ctx.project.path
114602
114714
  });
114715
+ } catch {
114716
+ s.stop(`${brandColor("git")} ${dim(`commit failed`)}`);
114717
+ updateStatus(
114718
+ "Failed to create initial commit. You can commit manually later."
114719
+ );
114720
+ return;
114721
+ }
114722
+ s.stop();
114723
+ try {
114603
114724
  await runCommand(
114604
114725
  ["git", "commit", "-m", ctx.commitMessage, "--no-verify"],
114605
114726
  {
114606
- silent: true,
114607
114727
  cwd: ctx.project.path
114608
114728
  }
114609
114729
  );
114610
- s.stop(`${brandColor("git")} ${dim(`commit`)}`);
114730
+ updateStatus(`${brandColor("git")} ${dim(`commit`)}`);
114611
114731
  } catch {
114612
- s.stop(`${brandColor("git")} ${dim(`commit failed`)}`);
114732
+ updateStatus(`${brandColor("git")} ${dim(`commit failed`)}`);
114613
114733
  updateStatus(
114614
114734
  "Failed to create initial commit. You can commit manually later."
114615
114735
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-cloudflare",
3
- "version": "2.70.14",
3
+ "version": "2.70.16",
4
4
  "description": "A CLI for creating and deploying new applications to Cloudflare.",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -31,7 +31,7 @@
31
31
  "@babel/parser": "^7.21.3",
32
32
  "@babel/types": "^7.21.4",
33
33
  "@clack/prompts": "^1.2.0",
34
- "@cloudflare/workers-types": "^5.20260722.1",
34
+ "@cloudflare/workers-types": "^5.20260730.1",
35
35
  "@types/command-exists": "^1.2.0",
36
36
  "@types/cross-spawn": "^6.0.2",
37
37
  "@types/deepmerge": "^2.2.0",
@@ -65,19 +65,19 @@
65
65
  "tree-kill": "1.2.2",
66
66
  "typescript": "5.8.3",
67
67
  "undici": "7.28.0",
68
- "vite": "8.0.13",
68
+ "vite": "8.1.5",
69
69
  "vite-tsconfig-paths": "^4.0.8",
70
70
  "vitest": "4.1.0",
71
71
  "which-pm-runs": "^1.1.0",
72
72
  "wrap-ansi": "^9.0.0",
73
73
  "yargs": "^17.7.2",
74
- "@cloudflare/cli-shared-helpers": "0.1.16",
75
- "@cloudflare/vite-plugin": "1.47.0",
74
+ "@cloudflare/cli-shared-helpers": "0.1.18",
75
+ "@cloudflare/codemod": "1.1.0",
76
76
  "@cloudflare/mock-npm-registry": "0.0.0",
77
+ "@cloudflare/vite-plugin": "1.49.0",
77
78
  "@cloudflare/workers-tsconfig": "0.0.0",
78
- "@cloudflare/workers-utils": "0.28.0",
79
- "@cloudflare/codemod": "1.1.0",
80
- "wrangler": "4.114.0"
79
+ "@cloudflare/workers-utils": "0.30.0",
80
+ "wrangler": "4.116.0"
81
81
  },
82
82
  "engines": {
83
83
  "node": ">=22.0.0"
@@ -22,13 +22,6 @@ import { WorkflowEntrypoint } from "cloudflare:workers";
22
22
  */
23
23
 
24
24
  export class MyWorkflow extends WorkflowEntrypoint {
25
- /**
26
- * @param {Env} env
27
- */
28
- constructor(env) {
29
- this.env = env;
30
- }
31
-
32
25
  /**
33
26
  * @param {WorkflowEvent<Params>} event
34
27
  * @param {WorkflowStep} step