wrangler 0.0.0-e41c7e41 → 0.0.0-e44afaf79

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 (275) hide show
  1. package/README.md +35 -45
  2. package/bin/wrangler.js +27 -102
  3. package/config-schema.json +2487 -0
  4. package/package.json +179 -192
  5. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  6. package/templates/__tests__/tsconfig.json +8 -0
  7. package/templates/checked-fetch.js +19 -6
  8. package/templates/facade.d.ts +19 -0
  9. package/templates/gitignore +2 -3
  10. package/templates/init-tests/test-jest-new-worker.js +3 -5
  11. package/templates/init-tests/test-vitest-new-worker.js +4 -6
  12. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  13. package/templates/middleware/common.ts +9 -4
  14. package/templates/middleware/loader-modules.ts +94 -44
  15. package/templates/middleware/loader-sw.ts +6 -4
  16. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  17. package/templates/middleware/middleware-miniflare3-json-error.ts +17 -5
  18. package/templates/middleware/middleware-patch-console-prefix.d.ts +3 -0
  19. package/templates/middleware/middleware-patch-console-prefix.ts +21 -0
  20. package/templates/middleware/middleware-scheduled.ts +15 -1
  21. package/templates/mixedMode/proxyServerWorker/index.ts +40 -0
  22. package/templates/mixedMode/proxyServerWorker/wrangler.jsonc +4 -0
  23. package/templates/modules-watch-stub.js +4 -0
  24. package/templates/new-worker-scheduled.ts +1 -1
  25. package/templates/new-worker.ts +4 -1
  26. package/templates/pages-dev-pipeline.ts +8 -3
  27. package/templates/pages-dev-util.ts +4 -1
  28. package/templates/pages-shim.ts +1 -1
  29. package/templates/pages-template-plugin.ts +33 -14
  30. package/templates/pages-template-worker.ts +12 -3
  31. package/templates/startDevWorker/InspectorProxyWorker.ts +679 -0
  32. package/templates/startDevWorker/ProxyWorker.ts +336 -0
  33. package/templates/strip-cf-connecting-ip-header.js +13 -0
  34. package/templates/tsconfig-sanity.ts +11 -0
  35. package/templates/tsconfig.init.json +22 -0
  36. package/templates/tsconfig.json +12 -103
  37. package/templates/tsconfig.tsbuildinfo +1 -0
  38. package/wrangler-dist/InspectorProxyWorker.js +471 -0
  39. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  40. package/wrangler-dist/ProxyWorker.js +238 -0
  41. package/wrangler-dist/ProxyWorker.js.map +6 -0
  42. package/wrangler-dist/cli.d.ts +2054 -512
  43. package/wrangler-dist/cli.js +172903 -159717
  44. package/wrangler-dist/cli.js.map +1 -0
  45. package/wrangler-dist/metafile-cjs.json +1 -0
  46. package/Cloudflare_CA.pem +0 -18
  47. package/import_meta_url.js +0 -3
  48. package/miniflare-config-stubs/.env.empty +0 -0
  49. package/miniflare-config-stubs/package.empty.json +0 -1
  50. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  51. package/miniflare-dist/index.mjs +0 -6316
  52. package/src/__tests__/access.test.ts +0 -25
  53. package/src/__tests__/api-dev.test.ts +0 -209
  54. package/src/__tests__/api-devregistry.test.js +0 -56
  55. package/src/__tests__/api.test.ts +0 -80
  56. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  57. package/src/__tests__/config-cache.test.ts +0 -42
  58. package/src/__tests__/configuration.test.ts +0 -3981
  59. package/src/__tests__/d1.test.ts +0 -80
  60. package/src/__tests__/delete.test.ts +0 -230
  61. package/src/__tests__/deployments.test.ts +0 -91
  62. package/src/__tests__/dev.test.tsx +0 -1536
  63. package/src/__tests__/dialogs.test.tsx +0 -40
  64. package/src/__tests__/generate.test.ts +0 -235
  65. package/src/__tests__/get-host-from-url.test.ts +0 -16
  66. package/src/__tests__/guess-worker-format.test.ts +0 -85
  67. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  68. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  69. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  70. package/src/__tests__/helpers/mock-bin.ts +0 -36
  71. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  72. package/src/__tests__/helpers/mock-console.ts +0 -106
  73. package/src/__tests__/helpers/mock-dialogs.ts +0 -153
  74. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
  75. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  76. package/src/__tests__/helpers/mock-istty.ts +0 -74
  77. package/src/__tests__/helpers/mock-known-routes.ts +0 -7
  78. package/src/__tests__/helpers/mock-kv.ts +0 -33
  79. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
  80. package/src/__tests__/helpers/mock-process.ts +0 -39
  81. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  82. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  83. package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
  84. package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
  85. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
  86. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
  87. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
  88. package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
  89. package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
  90. package/src/__tests__/helpers/msw/handlers/zones.ts +0 -22
  91. package/src/__tests__/helpers/msw/index.ts +0 -21
  92. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  93. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  94. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  95. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  96. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  97. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
  98. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  99. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  100. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  101. package/src/__tests__/https-options.test.ts +0 -163
  102. package/src/__tests__/index.test.ts +0 -264
  103. package/src/__tests__/init.test.ts +0 -2900
  104. package/src/__tests__/jest.setup.ts +0 -202
  105. package/src/__tests__/kv.test.ts +0 -1675
  106. package/src/__tests__/logger.test.ts +0 -141
  107. package/src/__tests__/metrics.test.ts +0 -450
  108. package/src/__tests__/middleware.scheduled.test.ts +0 -135
  109. package/src/__tests__/middleware.test.ts +0 -726
  110. package/src/__tests__/package-manager.test.ts +0 -353
  111. package/src/__tests__/pages-deployment-tail.test.ts +0 -820
  112. package/src/__tests__/pages.test.ts +0 -2442
  113. package/src/__tests__/parse.test.ts +0 -330
  114. package/src/__tests__/paths.test.ts +0 -39
  115. package/src/__tests__/publish.test.ts +0 -7633
  116. package/src/__tests__/pubsub.test.ts +0 -370
  117. package/src/__tests__/queues.test.ts +0 -371
  118. package/src/__tests__/r2.test.ts +0 -393
  119. package/src/__tests__/route.test.ts +0 -45
  120. package/src/__tests__/secret.test.ts +0 -644
  121. package/src/__tests__/tail.test.ts +0 -800
  122. package/src/__tests__/test-old-node-version.js +0 -31
  123. package/src/__tests__/type-generation.test.ts +0 -226
  124. package/src/__tests__/user.test.ts +0 -155
  125. package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
  126. package/src/__tests__/validate-dev-props.test.ts +0 -56
  127. package/src/__tests__/version.test.ts +0 -35
  128. package/src/__tests__/whoami.test.tsx +0 -278
  129. package/src/__tests__/worker-namespace.test.ts +0 -326
  130. package/src/abort.d.ts +0 -3
  131. package/src/api/dev.ts +0 -210
  132. package/src/api/index.ts +0 -2
  133. package/src/bundle-reporter.tsx +0 -68
  134. package/src/bundle.ts +0 -823
  135. package/src/cfetch/index.ts +0 -160
  136. package/src/cfetch/internal.ts +0 -263
  137. package/src/cli.ts +0 -28
  138. package/src/config/README.md +0 -107
  139. package/src/config/config.ts +0 -275
  140. package/src/config/diagnostics.ts +0 -80
  141. package/src/config/environment.ts +0 -561
  142. package/src/config/index.ts +0 -334
  143. package/src/config/validation-helpers.ts +0 -597
  144. package/src/config/validation.ts +0 -2103
  145. package/src/config-cache.ts +0 -85
  146. package/src/create-worker-preview.ts +0 -282
  147. package/src/create-worker-upload-form.ts +0 -316
  148. package/src/d1/backups.tsx +0 -218
  149. package/src/d1/constants.ts +0 -2
  150. package/src/d1/create.tsx +0 -63
  151. package/src/d1/delete.tsx +0 -56
  152. package/src/d1/execute.tsx +0 -352
  153. package/src/d1/formatTimeAgo.ts +0 -14
  154. package/src/d1/index.ts +0 -99
  155. package/src/d1/list.tsx +0 -48
  156. package/src/d1/migrations.tsx +0 -446
  157. package/src/d1/options.ts +0 -22
  158. package/src/d1/types.tsx +0 -24
  159. package/src/d1/utils.ts +0 -48
  160. package/src/delete.ts +0 -108
  161. package/src/deployments.ts +0 -77
  162. package/src/deprecated/index.ts +0 -438
  163. package/src/dev/dev-vars.ts +0 -39
  164. package/src/dev/dev.tsx +0 -590
  165. package/src/dev/get-local-persistence-path.tsx +0 -31
  166. package/src/dev/local.tsx +0 -886
  167. package/src/dev/remote.tsx +0 -603
  168. package/src/dev/start-server.ts +0 -538
  169. package/src/dev/use-esbuild.ts +0 -204
  170. package/src/dev/validate-dev-props.ts +0 -31
  171. package/src/dev-registry.tsx +0 -201
  172. package/src/dev.tsx +0 -905
  173. package/src/dialogs.tsx +0 -168
  174. package/src/dispatch-namespace.ts +0 -207
  175. package/src/durable.ts +0 -102
  176. package/src/entry.ts +0 -329
  177. package/src/environment-variables.ts +0 -50
  178. package/src/errors.ts +0 -11
  179. package/src/git-client.ts +0 -124
  180. package/src/global-wrangler-config-path.ts +0 -26
  181. package/src/https-options.ts +0 -127
  182. package/src/index.tsx +0 -682
  183. package/src/init.ts +0 -970
  184. package/src/inspect.ts +0 -767
  185. package/src/intl-polyfill.d.ts +0 -139
  186. package/src/is-ci.ts +0 -14
  187. package/src/is-interactive.ts +0 -16
  188. package/src/kv/helpers.ts +0 -430
  189. package/src/kv/index.ts +0 -596
  190. package/src/logger.ts +0 -92
  191. package/src/metrics/index.ts +0 -5
  192. package/src/metrics/metrics-config.ts +0 -239
  193. package/src/metrics/metrics-dispatcher.ts +0 -96
  194. package/src/metrics/metrics-usage-headers.ts +0 -24
  195. package/src/metrics/send-event.ts +0 -96
  196. package/src/miniflare-cli/README.md +0 -30
  197. package/src/miniflare-cli/assets.ts +0 -215
  198. package/src/miniflare-cli/index.ts +0 -213
  199. package/src/miniflare-cli/request-context.ts +0 -40
  200. package/src/module-collection.ts +0 -267
  201. package/src/open-in-browser.ts +0 -17
  202. package/src/package-manager.ts +0 -219
  203. package/src/pages/build.tsx +0 -270
  204. package/src/pages/constants.ts +0 -18
  205. package/src/pages/deployment-tails.tsx +0 -284
  206. package/src/pages/deployments.tsx +0 -84
  207. package/src/pages/dev.tsx +0 -708
  208. package/src/pages/errors.ts +0 -66
  209. package/src/pages/functions/buildPlugin.ts +0 -107
  210. package/src/pages/functions/buildWorker.ts +0 -166
  211. package/src/pages/functions/filepath-routing.test.ts +0 -234
  212. package/src/pages/functions/filepath-routing.ts +0 -189
  213. package/src/pages/functions/identifiers.ts +0 -78
  214. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  215. package/src/pages/functions/routes-consolidation.ts +0 -73
  216. package/src/pages/functions/routes-transformation.test.ts +0 -282
  217. package/src/pages/functions/routes-transformation.ts +0 -115
  218. package/src/pages/functions/routes-validation.test.ts +0 -403
  219. package/src/pages/functions/routes-validation.ts +0 -202
  220. package/src/pages/functions/routes.ts +0 -151
  221. package/src/pages/functions.tsx +0 -82
  222. package/src/pages/hash.tsx +0 -13
  223. package/src/pages/index.tsx +0 -102
  224. package/src/pages/projects.tsx +0 -169
  225. package/src/pages/prompt-select-project.tsx +0 -31
  226. package/src/pages/publish.tsx +0 -451
  227. package/src/pages/types.ts +0 -41
  228. package/src/pages/upload.tsx +0 -426
  229. package/src/pages/utils.ts +0 -23
  230. package/src/parse.ts +0 -286
  231. package/src/paths.ts +0 -71
  232. package/src/proxy.ts +0 -689
  233. package/src/publish/index.ts +0 -270
  234. package/src/publish/publish.ts +0 -1035
  235. package/src/pubsub/index.ts +0 -286
  236. package/src/pubsub/pubsub-commands.tsx +0 -624
  237. package/src/queues/cli/commands/consumer/add.ts +0 -71
  238. package/src/queues/cli/commands/consumer/index.ts +0 -22
  239. package/src/queues/cli/commands/consumer/remove.ts +0 -38
  240. package/src/queues/cli/commands/create.ts +0 -25
  241. package/src/queues/cli/commands/delete.ts +0 -26
  242. package/src/queues/cli/commands/index.ts +0 -33
  243. package/src/queues/cli/commands/list.ts +0 -25
  244. package/src/queues/client.ts +0 -135
  245. package/src/r2/constants.ts +0 -4
  246. package/src/r2/helpers.ts +0 -131
  247. package/src/r2/index.ts +0 -289
  248. package/src/routes.ts +0 -140
  249. package/src/secret/index.ts +0 -378
  250. package/src/selfsigned.d.ts +0 -29
  251. package/src/sites.tsx +0 -372
  252. package/src/tail/createTail.ts +0 -379
  253. package/src/tail/filters.ts +0 -277
  254. package/src/tail/index.ts +0 -214
  255. package/src/tail/printing.ts +0 -107
  256. package/src/type-generation.ts +0 -173
  257. package/src/update-check.ts +0 -19
  258. package/src/user/access.ts +0 -69
  259. package/src/user/choose-account.tsx +0 -69
  260. package/src/user/env-vars.ts +0 -46
  261. package/src/user/generate-auth-url.ts +0 -33
  262. package/src/user/generate-random-state.ts +0 -16
  263. package/src/user/index.ts +0 -3
  264. package/src/user/user.tsx +0 -1192
  265. package/src/utils/collectKeyValues.ts +0 -14
  266. package/src/whoami.tsx +0 -169
  267. package/src/worker.ts +0 -245
  268. package/src/yargs-types.ts +0 -24
  269. package/src/zones.ts +0 -191
  270. package/templates/d1-beta-facade.js +0 -205
  271. package/templates/first-party-worker-module-facade.ts +0 -18
  272. package/templates/format-dev-errors.ts +0 -32
  273. package/templates/serve-static-assets.ts +0 -63
  274. package/templates/service-bindings-module-facade.js +0 -54
  275. package/templates/service-bindings-sw-facade.js +0 -42
@@ -1,603 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import React, { useState, useEffect, useRef } from "react";
4
- import { useErrorHandler } from "react-error-boundary";
5
- import { printBundleSize } from "../bundle-reporter";
6
- import {
7
- createPreviewSession,
8
- createWorkerPreview,
9
- } from "../create-worker-preview";
10
- import useInspector from "../inspect";
11
- import { logger } from "../logger";
12
- import { startPreviewServer, usePreviewServer } from "../proxy";
13
- import { syncAssets } from "../sites";
14
- import {
15
- ChooseAccount,
16
- getAccountChoices,
17
- requireApiToken,
18
- saveAccountToCache,
19
- } from "../user";
20
- import type { Route } from "../config/environment";
21
- import type {
22
- CfPreviewToken,
23
- CfPreviewSession,
24
- } from "../create-worker-preview";
25
- import type { AssetPaths } from "../sites";
26
- import type { ChooseAccountItem } from "../user";
27
- import type {
28
- CfModule,
29
- CfWorkerInit,
30
- CfScriptFormat,
31
- CfAccount,
32
- CfWorkerContext,
33
- } from "../worker";
34
- import type { EsbuildBundle } from "./use-esbuild";
35
-
36
- interface RemoteProps {
37
- name: string | undefined;
38
- bundle: EsbuildBundle | undefined;
39
- format: CfScriptFormat | undefined;
40
- isWorkersSite: boolean;
41
- assetPaths: AssetPaths | undefined;
42
- port: number;
43
- ip: string;
44
- localProtocol: "https" | "http";
45
- inspect: boolean;
46
- inspectorPort: number;
47
- accountId: string | undefined;
48
- bindings: CfWorkerInit["bindings"];
49
- compatibilityDate: string;
50
- compatibilityFlags: string[] | undefined;
51
- usageModel: "bundled" | "unbound" | undefined;
52
- env: string | undefined;
53
- legacyEnv: boolean | undefined;
54
- zone: string | undefined;
55
- host: string | undefined;
56
- routes: Route[] | undefined;
57
- onReady?: ((ip: string, port: number) => void) | undefined;
58
- sourceMapPath: string | undefined;
59
- sendMetrics: boolean | undefined;
60
- }
61
-
62
- export function Remote(props: RemoteProps) {
63
- const [accountId, setAccountId] = useState(props.accountId);
64
- const accountChoicesRef = useRef<Promise<ChooseAccountItem[]>>();
65
- const [accountChoices, setAccountChoices] = useState<ChooseAccountItem[]>();
66
-
67
- const previewToken = useWorker({
68
- name: props.name,
69
- bundle: props.bundle,
70
- format: props.format,
71
- modules: props.bundle ? props.bundle.modules : [],
72
- accountId,
73
- bindings: props.bindings,
74
- assetPaths: props.assetPaths,
75
- isWorkersSite: props.isWorkersSite,
76
- compatibilityDate: props.compatibilityDate,
77
- compatibilityFlags: props.compatibilityFlags,
78
- usageModel: props.usageModel,
79
- env: props.env,
80
- legacyEnv: props.legacyEnv,
81
- zone: props.zone,
82
- host: props.host,
83
- routes: props.routes,
84
- onReady: props.onReady,
85
- sendMetrics: props.sendMetrics,
86
- port: props.port,
87
- });
88
-
89
- usePreviewServer({
90
- previewToken,
91
- assetDirectory: props.isWorkersSite
92
- ? undefined
93
- : props.assetPaths?.assetDirectory,
94
- localProtocol: props.localProtocol,
95
- localPort: props.port,
96
- ip: props.ip,
97
- });
98
-
99
- useInspector({
100
- inspectorUrl:
101
- props.inspect && previewToken
102
- ? previewToken.inspectorUrl.href
103
- : undefined,
104
- port: props.inspectorPort,
105
- logToTerminal: true,
106
- sourceMapPath: props.sourceMapPath,
107
- host: previewToken?.host,
108
- });
109
-
110
- const errorHandler = useErrorHandler();
111
-
112
- // This effect handles the async step of fetching the available accounts for the current user.
113
- // If only one account is available then it is just used by calling `setAccountId()`.
114
- useEffect(() => {
115
- if (
116
- accountChoicesRef.current !== undefined ||
117
- props.accountId !== undefined
118
- ) {
119
- return;
120
- }
121
- accountChoicesRef.current = getAccountChoices();
122
- accountChoicesRef.current.then(
123
- (accounts) => {
124
- if (accounts.length === 1) {
125
- saveAccountToCache({
126
- id: accounts[0].id,
127
- name: accounts[0].name,
128
- });
129
- setAccountId(accounts[0].id);
130
- } else {
131
- setAccountChoices(accounts);
132
- }
133
- },
134
- (err) => {
135
- errorHandler(err);
136
- }
137
- );
138
- });
139
-
140
- // If we have not already chosen an account and there are multiple accounts available
141
- // allow the users to select one.
142
- return accountId === undefined && accountChoices !== undefined ? (
143
- <ChooseAccount
144
- accounts={accountChoices}
145
- onSelect={(selectedAccount) => {
146
- saveAccountToCache(selectedAccount);
147
- setAccountId(selectedAccount.id);
148
- }}
149
- onError={(err) => errorHandler(err)}
150
- ></ChooseAccount>
151
- ) : null;
152
- }
153
-
154
- interface RemoteWorkerProps {
155
- name: string | undefined;
156
- bundle: EsbuildBundle | undefined;
157
- format: CfScriptFormat | undefined;
158
- modules: CfModule[];
159
- accountId: string | undefined;
160
- bindings: CfWorkerInit["bindings"];
161
- assetPaths: AssetPaths | undefined;
162
- isWorkersSite: boolean;
163
- compatibilityDate: string | undefined;
164
- compatibilityFlags: string[] | undefined;
165
- usageModel: "bundled" | "unbound" | undefined;
166
- env: string | undefined;
167
- legacyEnv: boolean | undefined;
168
- zone: string | undefined;
169
- host: string | undefined;
170
- routes: Route[] | undefined;
171
- onReady: ((ip: string, port: number) => void) | undefined;
172
- sendMetrics: boolean | undefined;
173
- port: number;
174
- }
175
-
176
- export function useWorker(
177
- props: RemoteWorkerProps
178
- ): CfPreviewToken | undefined {
179
- const [session, setSession] = useState<CfPreviewSession | undefined>();
180
- const [token, setToken] = useState<CfPreviewToken | undefined>();
181
- const [restartCounter, setRestartCounter] = useState<number>(0);
182
- // This is the most reliable way to detect whether
183
- // something's "happened" in our system; We make a ref and
184
- // mark it once we log our initial message. Refs are vars!
185
- const startedRef = useRef(false);
186
- // functions must be destructured before use inside a useEffect, otherwise the entire props object has to be added to the dependency array
187
- const { onReady } = props;
188
- // This effect sets up the preview session
189
- useEffect(() => {
190
- const abortController = new AbortController();
191
- async function start() {
192
- if (props.accountId === undefined) {
193
- return;
194
- }
195
- const { workerAccount, workerContext } = getWorkerAccountAndContext({
196
- accountId: props.accountId,
197
- env: props.env,
198
- legacyEnv: props.legacyEnv,
199
- zone: props.zone,
200
- host: props.host,
201
- routes: props.routes,
202
- sendMetrics: props.sendMetrics,
203
- });
204
-
205
- setSession(
206
- await createPreviewSession(
207
- workerAccount,
208
- workerContext,
209
- abortController.signal
210
- )
211
- );
212
- }
213
- start().catch((err) => {
214
- // instead of logging the raw API error to the user,
215
- // give them friendly instructions
216
- // for error 10063 (workers.dev subdomain required)
217
- if (err.code === 10063) {
218
- const errorMessage =
219
- "Error: You need to register a workers.dev subdomain before running the dev command in remote mode";
220
- const solutionMessage =
221
- "You can either enable local mode by pressing l, or register a workers.dev subdomain here:";
222
- const onboardingLink = `https://dash.cloudflare.com/${props.accountId}/workers/onboarding`;
223
- logger.error(`${errorMessage}\n${solutionMessage}\n${onboardingLink}`);
224
- }
225
- // we want to log the error, but not end the process
226
- // since it could recover after the developer fixes whatever's wrong
227
- else if ((err as { code: string }).code !== "ABORT_ERR") {
228
- logger.error("Error while creating remote dev session:", err);
229
- }
230
- });
231
-
232
- return () => {
233
- abortController.abort();
234
- };
235
- }, [
236
- props.accountId,
237
- props.env,
238
- props.host,
239
- props.legacyEnv,
240
- props.routes,
241
- props.zone,
242
- props.sendMetrics,
243
- restartCounter,
244
- ]);
245
-
246
- // This effect uses the session to upload the worker and create a preview
247
- useEffect(() => {
248
- const abortController = new AbortController();
249
- async function start() {
250
- if (props.accountId === undefined) {
251
- return;
252
- }
253
- if (session === undefined) {
254
- return;
255
- }
256
- setToken(undefined); // reset token in case we're re-running
257
-
258
- if (!props.bundle || !props.format) return;
259
-
260
- if (!startedRef.current) {
261
- startedRef.current = true;
262
- } else {
263
- logger.log("⎔ Detected changes, restarted server.");
264
- }
265
-
266
- const init = await createRemoteWorkerInit({
267
- bundle: props.bundle,
268
- modules: props.modules,
269
- accountId: props.accountId,
270
- name: props.name,
271
- legacyEnv: props.legacyEnv,
272
- env: props.env,
273
- isWorkersSite: props.isWorkersSite,
274
- assetPaths: props.assetPaths,
275
- format: props.format,
276
- bindings: props.bindings,
277
- compatibilityDate: props.compatibilityDate,
278
- compatibilityFlags: props.compatibilityFlags,
279
- usageModel: props.usageModel,
280
- });
281
-
282
- const { workerAccount, workerContext } = getWorkerAccountAndContext({
283
- accountId: props.accountId,
284
- env: props.env,
285
- legacyEnv: props.legacyEnv,
286
- zone: props.zone,
287
- host: props.host,
288
- routes: props.routes,
289
- sendMetrics: props.sendMetrics,
290
- });
291
-
292
- const workerPreviewToken = await createWorkerPreview(
293
- init,
294
- workerAccount,
295
- workerContext,
296
- session,
297
- abortController.signal
298
- );
299
-
300
- setToken(workerPreviewToken);
301
-
302
- // TODO: Once we get service bindings working in the
303
- // edge preview server, we can define remote dev service bindings
304
- // and you can uncomment this code.
305
- // https://github.com/cloudflare/wrangler2/issues/1182
306
-
307
- /*
308
- if (name) {
309
- await registerWorker(name, {
310
- mode: "remote",
311
- // upstream protocol is always https (https://github.com/cloudflare/wrangler2/issues/583)
312
- protocol: "https",
313
- port: undefined,
314
- host: workerPreviewToken.host,
315
- headers: {
316
- "cf-workers-preview-token": workerPreviewToken.value,
317
- host: workerPreviewToken.host,
318
- },
319
- });
320
- }
321
- */
322
- onReady?.(props.host || "localhost", props.port);
323
- }
324
- start().catch((err) => {
325
- // we want to log the error, but not end the process
326
- // since it could recover after the developer fixes whatever's wrong
327
- if ((err as { code: string }).code !== "ABORT_ERR") {
328
- // instead of logging the raw API error to the user,
329
- // give them friendly instructions
330
- // for error 10063 (workers.dev subdomain required)
331
- if (err.code === 10063) {
332
- const errorMessage =
333
- "Error: You need to register a workers.dev subdomain before running the dev command in remote mode";
334
- const solutionMessage =
335
- "You can either enable local mode by pressing l, or register a workers.dev subdomain here:";
336
- const onboardingLink = `https://dash.cloudflare.com/${props.accountId}/workers/onboarding`;
337
- logger.error(
338
- `${errorMessage}\n${solutionMessage}\n${onboardingLink}`
339
- );
340
- } else if (err.code === 10049) {
341
- logger.log("Preview token expired, fetching a new one");
342
- // code 10049 happens when the preview token expires
343
- // since we want a new preview token when this happens,
344
- // lets increment the counter, and trigger a rerun of
345
- // the useEffect above
346
- setRestartCounter((prevCount) => prevCount + 1);
347
- } else {
348
- logger.error("Error on remote worker:", err);
349
- }
350
- }
351
- });
352
-
353
- return () => {
354
- abortController.abort();
355
- };
356
- }, [
357
- props.name,
358
- props.bundle,
359
- props.format,
360
- props.accountId,
361
- props.assetPaths,
362
- props.isWorkersSite,
363
- props.compatibilityDate,
364
- props.compatibilityFlags,
365
- props.usageModel,
366
- props.bindings,
367
- props.modules,
368
- props.env,
369
- props.legacyEnv,
370
- props.zone,
371
- props.host,
372
- props.routes,
373
- session,
374
- onReady,
375
- props.sendMetrics,
376
- props.port,
377
- ]);
378
-
379
- return token;
380
- }
381
-
382
- export async function startRemoteServer(props: RemoteProps) {
383
- let accountId = props.accountId;
384
- if (accountId === undefined) {
385
- const accountChoices = await getAccountChoices();
386
- if (accountChoices.length === 1) {
387
- saveAccountToCache({
388
- id: accountChoices[0].id,
389
- name: accountChoices[0].name,
390
- });
391
- accountId = accountChoices[0].id;
392
- } else {
393
- throw logger.error(
394
- "In a non-interactive environment, it is mandatory to specify an account ID, either by assigning its value to CLOUDFLARE_ACCOUNT_ID, or as `account_id` in your `wrangler.toml` file."
395
- );
396
- }
397
- }
398
-
399
- const previewToken = await getRemotePreviewToken({
400
- ...props,
401
- accountId: accountId,
402
- });
403
-
404
- if (previewToken === undefined) {
405
- throw logger.error("Failed to get a previewToken");
406
- }
407
- // start our proxy server
408
- const previewServer = await startPreviewServer({
409
- previewToken,
410
- assetDirectory: props.isWorkersSite
411
- ? undefined
412
- : props.assetPaths?.assetDirectory,
413
- localProtocol: props.localProtocol,
414
- localPort: props.port,
415
- ip: props.ip,
416
- onReady: props.onReady,
417
- });
418
- if (!previewServer) {
419
- throw logger.error("Failed to start remote server");
420
- }
421
- return { stop: previewServer.stop };
422
- }
423
-
424
- /**
425
- * getRemotePreviewToken is a react-free version of `useWorker`.
426
- * It returns a preview token, which we then use in our proxy server
427
- */
428
- export async function getRemotePreviewToken(props: RemoteProps) {
429
- //setup the preview session
430
- async function start() {
431
- if (props.accountId === undefined) {
432
- throw logger.error("no accountId provided");
433
- }
434
- const abortController = new AbortController();
435
- const { workerAccount, workerContext } = getWorkerAccountAndContext({
436
- accountId: props.accountId,
437
- env: props.env,
438
- legacyEnv: props.legacyEnv,
439
- zone: props.zone,
440
- host: props.host,
441
- routes: props.routes,
442
- sendMetrics: props.sendMetrics,
443
- });
444
- const session = await createPreviewSession(
445
- workerAccount,
446
- workerContext,
447
- abortController.signal
448
- );
449
- //use the session to upload the worker, and create a preview
450
-
451
- if (session === undefined) {
452
- throw logger.error("Failed to start a session");
453
- }
454
- if (!props.bundle || !props.format) return;
455
-
456
- const init = await createRemoteWorkerInit({
457
- bundle: props.bundle,
458
- modules: props.bundle ? props.bundle.modules : [],
459
- accountId: props.accountId,
460
- name: props.name,
461
- legacyEnv: props.legacyEnv,
462
- env: props.env,
463
- isWorkersSite: props.isWorkersSite,
464
- assetPaths: props.assetPaths,
465
- format: props.format,
466
- bindings: props.bindings,
467
- compatibilityDate: props.compatibilityDate,
468
- compatibilityFlags: props.compatibilityFlags,
469
- usageModel: props.usageModel,
470
- });
471
- const workerPreviewToken = await createWorkerPreview(
472
- init,
473
- workerAccount,
474
- workerContext,
475
- session,
476
- abortController.signal
477
- );
478
- return workerPreviewToken;
479
- }
480
- return start().catch((err) => {
481
- if ((err as { code?: string })?.code !== "ABORT_ERR") {
482
- // instead of logging the raw API error to the user,
483
- // give them friendly instructions
484
- // for error 10063 (workers.dev subdomain required)
485
- if (err?.code === 10063) {
486
- const errorMessage =
487
- "Error: You need to register a workers.dev subdomain before running the dev command in remote mode";
488
- const solutionMessage =
489
- "You can either enable local mode by pressing l, or register a workers.dev subdomain here:";
490
- const onboardingLink = `https://dash.cloudflare.com/${props.accountId}/workers/onboarding`;
491
- logger.error(`${errorMessage}\n${solutionMessage}\n${onboardingLink}`);
492
- } else if (err?.code === 10049) {
493
- // code 10049 happens when the preview token expires
494
- logger.log("Preview token expired, restart server to fetch a new one");
495
- } else {
496
- logger.error("Error on remote worker:", err);
497
- }
498
- }
499
- });
500
- }
501
-
502
- async function createRemoteWorkerInit(props: {
503
- bundle: EsbuildBundle;
504
- modules: CfModule[];
505
- accountId: string;
506
- name: string | undefined;
507
- legacyEnv: boolean | undefined;
508
- env: string | undefined;
509
- isWorkersSite: boolean;
510
- assetPaths: AssetPaths | undefined;
511
- format: CfScriptFormat;
512
- bindings: CfWorkerInit["bindings"];
513
- compatibilityDate: string | undefined;
514
- compatibilityFlags: string[] | undefined;
515
- usageModel: "bundled" | "unbound" | undefined;
516
- }) {
517
- const content = await readFile(props.bundle.path, "utf-8");
518
-
519
- // TODO: For Dev we could show the reporter message in the interactive box.
520
- void printBundleSize(
521
- { name: path.basename(props.bundle.path), content: content },
522
- props.modules
523
- );
524
-
525
- const assets = await syncAssets(
526
- props.accountId,
527
- // When we're using the newer service environments, we wouldn't
528
- // have added the env name on to the script name. However, we must
529
- // include it in the kv namespace name regardless (since there's no
530
- // concept of service environments for kv namespaces yet).
531
- props.name + (!props.legacyEnv && props.env ? `-${props.env}` : ""),
532
- props.isWorkersSite ? props.assetPaths : undefined,
533
- true,
534
- false
535
- ); // TODO: cancellable?
536
-
537
- const init: CfWorkerInit = {
538
- name: props.name,
539
- main: {
540
- name: path.basename(props.bundle.path),
541
- type: props.format === "modules" ? "esm" : "commonjs",
542
- content,
543
- },
544
- modules: props.modules.concat(
545
- assets.manifest
546
- ? {
547
- name: "__STATIC_CONTENT_MANIFEST",
548
- content: JSON.stringify(assets.manifest),
549
- type: "text",
550
- }
551
- : []
552
- ),
553
- bindings: {
554
- ...props.bindings,
555
- kv_namespaces: (props.bindings.kv_namespaces || []).concat(
556
- assets.namespace
557
- ? { binding: "__STATIC_CONTENT", id: assets.namespace }
558
- : []
559
- ),
560
- text_blobs: {
561
- ...props.bindings.text_blobs,
562
- ...(assets.manifest &&
563
- props.format === "service-worker" && {
564
- __STATIC_CONTENT_MANIFEST: "__STATIC_CONTENT_MANIFEST",
565
- }),
566
- },
567
- },
568
- migrations: undefined, // no migrations in dev
569
- compatibility_date: props.compatibilityDate,
570
- compatibility_flags: props.compatibilityFlags,
571
- usage_model: props.usageModel,
572
- keepVars: true,
573
- logpush: false,
574
- };
575
-
576
- return init;
577
- }
578
-
579
- function getWorkerAccountAndContext(props: {
580
- accountId: string;
581
- env?: string;
582
- legacyEnv?: boolean;
583
- zone?: string;
584
- host?: string;
585
- routes: Route[] | undefined;
586
- sendMetrics?: boolean;
587
- }): { workerAccount: CfAccount; workerContext: CfWorkerContext } {
588
- const workerAccount: CfAccount = {
589
- accountId: props.accountId,
590
- apiToken: requireApiToken(),
591
- };
592
-
593
- const workerContext: CfWorkerContext = {
594
- env: props.env,
595
- legacyEnv: props.legacyEnv,
596
- zone: props.zone,
597
- host: props.host,
598
- routes: props.routes,
599
- sendMetrics: props.sendMetrics,
600
- };
601
-
602
- return { workerAccount, workerContext };
603
- }