wrangler 0.0.0-e5a3814 → 0.0.0-e5ae13ade

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 (157) hide show
  1. package/README.md +46 -36
  2. package/bin/wrangler.js +83 -70
  3. package/config-schema.json +2431 -0
  4. package/kv-asset-handler.js +1 -0
  5. package/package.json +130 -103
  6. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  7. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  8. package/templates/__tests__/tsconfig.json +8 -0
  9. package/templates/checked-fetch.js +30 -0
  10. package/templates/facade.d.ts +19 -0
  11. package/templates/gitignore +2 -3
  12. package/templates/init-tests/test-jest-new-worker.js +23 -0
  13. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  14. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  15. package/templates/middleware/common.ts +67 -0
  16. package/templates/middleware/loader-modules.ts +134 -0
  17. package/templates/middleware/loader-sw.ts +229 -0
  18. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  19. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  20. package/templates/middleware/middleware-patch-console-prefix.d.ts +3 -0
  21. package/templates/middleware/middleware-patch-console-prefix.ts +21 -0
  22. package/templates/middleware/middleware-pretty-error.ts +40 -0
  23. package/templates/middleware/middleware-scheduled.ts +29 -0
  24. package/templates/mixedMode/proxyServerWorker/index.ts +40 -0
  25. package/templates/mixedMode/proxyServerWorker/wrangler.jsonc +4 -0
  26. package/templates/modules-watch-stub.js +4 -0
  27. package/templates/new-worker-scheduled.js +3 -3
  28. package/templates/new-worker-scheduled.ts +16 -16
  29. package/templates/new-worker.js +3 -3
  30. package/templates/new-worker.ts +19 -16
  31. package/templates/no-op-worker.js +10 -0
  32. package/templates/pages-dev-pipeline.ts +33 -0
  33. package/templates/pages-dev-util.ts +55 -0
  34. package/templates/pages-shim.ts +9 -0
  35. package/templates/pages-template-plugin.ts +190 -0
  36. package/templates/pages-template-worker.ts +198 -0
  37. package/templates/startDevWorker/InspectorProxyWorker.ts +679 -0
  38. package/templates/startDevWorker/ProxyWorker.ts +336 -0
  39. package/templates/strip-cf-connecting-ip-header.js +13 -0
  40. package/templates/tsconfig-sanity.ts +11 -0
  41. package/templates/tsconfig.init.json +22 -0
  42. package/templates/tsconfig.json +13 -103
  43. package/templates/tsconfig.tsbuildinfo +1 -0
  44. package/wrangler-dist/InspectorProxyWorker.js +471 -0
  45. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  46. package/wrangler-dist/ProxyWorker.js +238 -0
  47. package/wrangler-dist/ProxyWorker.js.map +6 -0
  48. package/wrangler-dist/cli.d.ts +26903 -0
  49. package/wrangler-dist/cli.js +170631 -120854
  50. package/wrangler-dist/cli.js.map +7 -0
  51. package/Cloudflare_CA.pem +0 -18
  52. package/import_meta_url.js +0 -3
  53. package/miniflare-config-stubs/.env.empty +0 -0
  54. package/miniflare-config-stubs/package.empty.json +0 -1
  55. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  56. package/miniflare-dist/index.mjs +0 -4886
  57. package/pages/functions/buildPlugin.ts +0 -105
  58. package/pages/functions/buildWorker.ts +0 -151
  59. package/pages/functions/filepath-routing.test.ts +0 -234
  60. package/pages/functions/filepath-routing.ts +0 -189
  61. package/pages/functions/identifiers.ts +0 -78
  62. package/pages/functions/routes.ts +0 -156
  63. package/pages/functions/template-plugin.ts +0 -147
  64. package/pages/functions/template-worker.ts +0 -143
  65. package/src/__tests__/config-cache.test.ts +0 -36
  66. package/src/__tests__/configuration.test.ts +0 -3487
  67. package/src/__tests__/dev.test.tsx +0 -983
  68. package/src/__tests__/guess-worker-format.test.ts +0 -85
  69. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  70. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  71. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  72. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  73. package/src/__tests__/helpers/mock-bin.ts +0 -36
  74. package/src/__tests__/helpers/mock-cfetch.ts +0 -211
  75. package/src/__tests__/helpers/mock-console.ts +0 -87
  76. package/src/__tests__/helpers/mock-dialogs.ts +0 -130
  77. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  78. package/src/__tests__/helpers/mock-istty.ts +0 -27
  79. package/src/__tests__/helpers/mock-kv.ts +0 -33
  80. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -255
  81. package/src/__tests__/helpers/mock-stdin.ts +0 -103
  82. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  83. package/src/__tests__/helpers/run-in-tmp.ts +0 -39
  84. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  85. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  86. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  87. package/src/__tests__/https-options.test.ts +0 -130
  88. package/src/__tests__/index.test.ts +0 -257
  89. package/src/__tests__/init.test.ts +0 -1637
  90. package/src/__tests__/jest.setup.ts +0 -77
  91. package/src/__tests__/kv.test.ts +0 -1481
  92. package/src/__tests__/logger.test.ts +0 -115
  93. package/src/__tests__/package-manager.test.ts +0 -353
  94. package/src/__tests__/pages.test.ts +0 -754
  95. package/src/__tests__/parse.test.ts +0 -330
  96. package/src/__tests__/publish.test.ts +0 -5754
  97. package/src/__tests__/r2.test.ts +0 -233
  98. package/src/__tests__/route.test.ts +0 -45
  99. package/src/__tests__/secret.test.ts +0 -481
  100. package/src/__tests__/tail.test.ts +0 -690
  101. package/src/__tests__/user.test.ts +0 -131
  102. package/src/__tests__/whoami.test.tsx +0 -139
  103. package/src/abort.d.ts +0 -3
  104. package/src/bundle.ts +0 -197
  105. package/src/cfetch/index.ts +0 -121
  106. package/src/cfetch/internal.ts +0 -142
  107. package/src/cli.ts +0 -13
  108. package/src/config/README.md +0 -107
  109. package/src/config/config.ts +0 -234
  110. package/src/config/diagnostics.ts +0 -80
  111. package/src/config/environment.ts +0 -420
  112. package/src/config/index.ts +0 -225
  113. package/src/config/validation-helpers.ts +0 -584
  114. package/src/config/validation.ts +0 -1552
  115. package/src/config-cache.ts +0 -45
  116. package/src/create-worker-preview.ts +0 -185
  117. package/src/create-worker-upload-form.ts +0 -254
  118. package/src/dev/dev-vars.ts +0 -36
  119. package/src/dev/dev.tsx +0 -401
  120. package/src/dev/local.tsx +0 -322
  121. package/src/dev/remote.tsx +0 -237
  122. package/src/dev/use-esbuild.ts +0 -118
  123. package/src/dialogs.tsx +0 -135
  124. package/src/durable.ts +0 -102
  125. package/src/entry.ts +0 -322
  126. package/src/environment-variables.ts +0 -35
  127. package/src/errors.ts +0 -11
  128. package/src/https-options.ts +0 -123
  129. package/src/index.tsx +0 -2846
  130. package/src/inspect.ts +0 -662
  131. package/src/intl-polyfill.d.ts +0 -139
  132. package/src/kv.ts +0 -408
  133. package/src/logger.ts +0 -66
  134. package/src/miniflare-cli/README.md +0 -30
  135. package/src/miniflare-cli/enum-keys.ts +0 -17
  136. package/src/miniflare-cli/index.ts +0 -41
  137. package/src/miniflare-cli/request-context.ts +0 -40
  138. package/src/module-collection.ts +0 -258
  139. package/src/open-in-browser.ts +0 -19
  140. package/src/package-manager.ts +0 -174
  141. package/src/pages.tsx +0 -2093
  142. package/src/parse.ts +0 -203
  143. package/src/paths.ts +0 -26
  144. package/src/proxy.ts +0 -478
  145. package/src/publish.ts +0 -716
  146. package/src/r2.ts +0 -50
  147. package/src/selfsigned.d.ts +0 -29
  148. package/src/sites.tsx +0 -326
  149. package/src/tail/filters.ts +0 -279
  150. package/src/tail/index.ts +0 -299
  151. package/src/tail/printing.ts +0 -67
  152. package/src/update-check.ts +0 -19
  153. package/src/user.tsx +0 -1214
  154. package/src/whoami.tsx +0 -71
  155. package/src/worker.ts +0 -181
  156. package/src/zones.ts +0 -73
  157. package/templates/static-asset-facade.js +0 -43
@@ -0,0 +1 @@
1
+ export * from "@cloudflare/kv-asset-handler";
package/package.json CHANGED
@@ -1,17 +1,7 @@
1
1
  {
2
2
  "name": "wrangler",
3
- "version": "0.0.0-e5a3814",
4
- "author": "wrangler@cloudflare.com",
3
+ "version": "0.0.0-e5ae13ade",
5
4
  "description": "Command-line interface for all things Cloudflare Workers",
6
- "bin": {
7
- "wrangler": "./bin/wrangler.js",
8
- "wrangler2": "./bin/wrangler.js"
9
- },
10
- "license": "MIT OR Apache-2.0",
11
- "bugs": {
12
- "url": "https://github.com/cloudflare/wrangler2/issues"
13
- },
14
- "homepage": "https://github.com/cloudflare/wrangler2#readme",
15
5
  "keywords": [
16
6
  "wrangler",
17
7
  "cloudflare",
@@ -28,128 +18,165 @@
28
18
  "webassembly",
29
19
  "rust",
30
20
  "emscripten",
31
- "rust",
32
21
  "typescript",
33
22
  "graphql",
34
23
  "router",
35
24
  "http",
36
25
  "cli"
37
26
  ],
38
- "dependencies": {
39
- "@cloudflare/kv-asset-handler": "^0.2.0",
40
- "@esbuild-plugins/node-globals-polyfill": "^0.1.1",
41
- "@esbuild-plugins/node-modules-polyfill": "^0.1.4",
42
- "blake3-wasm": "^2.1.5",
43
- "esbuild": "0.14.34",
44
- "miniflare": "^2.5.0",
45
- "nanoid": "^3.3.3",
46
- "path-to-regexp": "^6.2.0",
47
- "selfsigned": "^2.0.1",
48
- "semiver": "^1.1.0",
49
- "xxhash-wasm": "^1.0.1"
27
+ "homepage": "https://github.com/cloudflare/workers-sdk#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/cloudflare/workers-sdk/issues"
50
30
  },
51
- "optionalDependencies": {
52
- "fsevents": "~2.3.2"
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/cloudflare/workers-sdk.git",
34
+ "directory": "packages/wrangler"
35
+ },
36
+ "license": "MIT OR Apache-2.0",
37
+ "author": "wrangler@cloudflare.com",
38
+ "main": "wrangler-dist/cli.js",
39
+ "types": "wrangler-dist/cli.d.ts",
40
+ "bin": {
41
+ "wrangler": "./bin/wrangler.js",
42
+ "wrangler2": "./bin/wrangler.js"
43
+ },
44
+ "files": [
45
+ "bin",
46
+ "miniflare-dist",
47
+ "wrangler-dist",
48
+ "templates",
49
+ "kv-asset-handler.js",
50
+ "config-schema.json"
51
+ ],
52
+ "dependencies": {
53
+ "@cloudflare/unenv-preset": "2.3.2",
54
+ "blake3-wasm": "2.1.5",
55
+ "esbuild": "0.25.4",
56
+ "path-to-regexp": "6.3.0",
57
+ "unenv": "2.0.0-rc.17",
58
+ "workerd": "1.20250508.0",
59
+ "@cloudflare/kv-asset-handler": "0.4.0",
60
+ "miniflare": "0.0.0-e5ae13ade"
53
61
  },
54
62
  "devDependencies": {
63
+ "@aws-sdk/client-s3": "^3.721.0",
64
+ "@cloudflare/types": "6.18.4",
65
+ "@cloudflare/workers-types": "^4.20250508.0",
66
+ "@cspotcode/source-map-support": "0.8.1",
55
67
  "@iarna/toml": "^3.0.0",
68
+ "@microsoft/api-extractor": "^7.47.0",
69
+ "@sentry/node": "^7.86.0",
70
+ "@sentry/types": "^7.86.0",
71
+ "@sentry/utils": "^7.86.0",
56
72
  "@types/command-exists": "^1.2.0",
57
- "@types/glob-to-regexp": "0.4.1",
58
- "@types/mime": "^2.0.3",
73
+ "@types/glob-to-regexp": "^0.4.1",
74
+ "@types/is-ci": "^3.0.0",
75
+ "@types/javascript-time-ago": "^2.0.3",
76
+ "@types/mime": "^3.0.4",
77
+ "@types/minimatch": "^5.1.2",
78
+ "@types/node": "^20.17.32",
79
+ "@types/node-forge": "^1.3.11",
59
80
  "@types/prompts": "^2.0.14",
60
- "@types/react": "^17.0.37",
61
- "@types/serve-static": "^1.13.10",
81
+ "@types/resolve": "^1.20.6",
82
+ "@types/shell-quote": "^1.7.2",
62
83
  "@types/signal-exit": "^3.0.1",
63
84
  "@types/supports-color": "^8.1.1",
64
- "@types/ws": "^8.5.3",
65
- "@types/yargs": "^17.0.10",
66
- "@webcontainer/env": "^1.0.1",
67
- "chokidar": "^3.5.3",
68
- "clipboardy": "^3.0.0",
85
+ "@types/ws": "^8.5.7",
86
+ "@types/yargs": "^17.0.22",
87
+ "@vitest/ui": "~3.1.1",
88
+ "@webcontainer/env": "^1.1.0",
89
+ "chalk": "^5.2.0",
90
+ "chokidar": "^4.0.1",
91
+ "cli-table3": "^0.6.3",
69
92
  "cmd-shim": "^4.1.0",
70
93
  "command-exists": "^1.2.9",
71
- "devtools-protocol": "^0.0.955664",
72
- "dotenv": "^16.0.0",
94
+ "concurrently": "^8.2.2",
95
+ "date-fns": "^4.1.0",
96
+ "devtools-protocol": "^0.0.1182435",
97
+ "dotenv": "^16.3.1",
73
98
  "execa": "^6.1.0",
74
- "faye-websocket": "^0.11.4",
75
- "finalhandler": "^1.2.0",
76
99
  "find-up": "^6.3.0",
77
- "get-port": "^6.1.2",
78
- "glob-to-regexp": "0.4.1",
79
- "http-terminator": "^3.2.0",
80
- "ignore": "^5.2.0",
81
- "ink": "^3.2.0",
82
- "ink-select-input": "^4.2.1",
83
- "ink-spinner": "^4.0.3",
84
- "ink-table": "^3.0.0",
85
- "ink-testing-library": "^2.1.0",
86
- "ink-text-input": "^4.0.3",
87
- "jest-fetch-mock": "^3.0.3",
88
- "jest-websocket-mock": "^2.3.0",
100
+ "get-port": "^7.0.0",
101
+ "glob-to-regexp": "^0.4.1",
102
+ "https-proxy-agent": "7.0.2",
103
+ "is-ci": "^3.0.1",
104
+ "itty-time": "^1.0.6",
105
+ "javascript-time-ago": "^2.5.4",
106
+ "md5-file": "5.0.0",
89
107
  "mime": "^3.0.0",
108
+ "minimatch": "^5.1.0",
109
+ "mock-socket": "^9.3.1",
110
+ "msw": "2.4.3",
111
+ "node-forge": "^1.3.1",
90
112
  "open": "^8.4.0",
91
113
  "p-queue": "^7.2.0",
114
+ "patch-console": "^1.0.0",
92
115
  "pretty-bytes": "^6.0.0",
93
116
  "prompts": "^2.4.2",
94
- "react": "^17.0.2",
95
- "react-error-boundary": "^3.1.4",
96
- "serve-static": "^1.15.0",
117
+ "resolve": "^1.22.8",
118
+ "rimraf": "^6.0.1",
119
+ "selfsigned": "^2.0.1",
120
+ "semiver": "^1.1.0",
121
+ "shell-quote": "^1.8.1",
97
122
  "signal-exit": "^3.0.7",
123
+ "source-map": "^0.6.1",
124
+ "strip-ansi": "^7.1.0",
98
125
  "supports-color": "^9.2.2",
99
126
  "timeago.js": "^4.0.2",
100
- "tmp-promise": "^3.0.3",
101
127
  "ts-dedent": "^2.2.0",
102
- "undici": "^5.3.0",
128
+ "ts-json-schema-generator": "^1.5.0",
129
+ "typescript": "^5.7.2",
130
+ "undici": "^5.28.5",
103
131
  "update-check": "^1.5.4",
104
- "ws": "^8.5.0",
105
- "yargs": "^17.4.1"
132
+ "vitest": "~3.1.1",
133
+ "vitest-websocket-mock": "^0.4.0",
134
+ "ws": "8.18.0",
135
+ "xdg-app-paths": "^8.3.0",
136
+ "xxhash-wasm": "^1.0.1",
137
+ "yargs": "^17.7.2",
138
+ "@cloudflare/cli": "1.1.1",
139
+ "@cloudflare/eslint-config-worker": "1.1.0",
140
+ "@cloudflare/workers-shared": "0.0.0-e5ae13ade",
141
+ "@cloudflare/workers-tsconfig": "0.0.0",
142
+ "@cloudflare/pages-shared": "^0.13.40"
106
143
  },
107
- "files": [
108
- "src",
109
- "bin",
110
- "pages",
111
- "miniflare-config-stubs",
112
- "miniflare-dist",
113
- "wrangler-dist",
114
- "templates",
115
- "vendor",
116
- "import_meta_url.js",
117
- "Cloudflare_CA.pem"
118
- ],
119
- "scripts": {
120
- "clean": "rm -rf wrangler-dist miniflare-dist",
121
- "check:type": "tsc",
122
- "bundle": "node -r esbuild-register scripts/bundle.ts",
123
- "build": "npm run clean && npm run bundle",
124
- "prepublishOnly": "SOURCEMAPS=false npm run build",
125
- "start": "npm run bundle && NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
126
- "test": "jest --silent=false --verbose=true",
127
- "test-watch": "npm run test -- --runInBand --testTimeout=50000 --watch"
144
+ "peerDependencies": {
145
+ "@cloudflare/workers-types": "^4.20250508.0"
146
+ },
147
+ "peerDependenciesMeta": {
148
+ "@cloudflare/workers-types": {
149
+ "optional": true
150
+ }
151
+ },
152
+ "optionalDependencies": {
153
+ "fsevents": "~2.3.2"
128
154
  },
129
155
  "engines": {
130
- "node": ">=16.7.0"
156
+ "node": ">=18.0.0"
157
+ },
158
+ "volta": {
159
+ "extends": "../../package.json"
160
+ },
161
+ "workers-sdk": {
162
+ "prerelease": true
131
163
  },
132
- "jest": {
133
- "restoreMocks": true,
134
- "testTimeout": 30000,
135
- "testRegex": ".*.(test|spec)\\.[jt]sx?$",
136
- "transformIgnorePatterns": [
137
- "node_modules/(?!find-up|locate-path|p-locate|p-limit|p-timeout|p-queue|yocto-queue|path-exists|execa|strip-final-newline|npm-run-path|path-key|onetime|mimic-fn|human-signals|is-stream|get-port|supports-color|pretty-bytes)"
138
- ],
139
- "moduleNameMapper": {
140
- "clipboardy": "<rootDir>/src/__tests__/helpers/clipboardy-mock.js",
141
- "miniflare/cli": "<rootDir>/../../node_modules/miniflare/dist/src/cli.js"
142
- },
143
- "transform": {
144
- "^.+\\.c?(t|j)sx?$": [
145
- "esbuild-jest",
146
- {
147
- "sourcemap": true
148
- }
149
- ]
150
- },
151
- "setupFilesAfterEnv": [
152
- "<rootDir>/src/__tests__/jest.setup.ts"
153
- ]
164
+ "scripts": {
165
+ "assert-git-version": "node -r esbuild-register scripts/assert-git-version.ts",
166
+ "build": "pnpm run clean && pnpm run bundle && pnpm run emit-types && pnpm run generate-json-schema",
167
+ "bundle": "node -r esbuild-register scripts/bundle.ts",
168
+ "check:lint": "eslint . --max-warnings=0",
169
+ "check:type": "tsc -p ./tsconfig.json && tsc -p ./templates/tsconfig.json",
170
+ "clean": "rimraf wrangler-dist miniflare-dist emitted-types",
171
+ "dev": "pnpm run clean && concurrently -c black,blue --kill-others-on-fail false \"pnpm run bundle --watch\" \"pnpm run check:type --watch --preserveWatchOutput\"",
172
+ "emit-types": "tsc -p tsconfig.emit.json && node -r esbuild-register scripts/emit-types.ts",
173
+ "generate-json-schema": "node -r esbuild-register scripts/generate-json-schema.ts",
174
+ "start": "pnpm run bundle && cross-env NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
175
+ "test": "dotenv -- pnpm run assert-git-version && dotenv -- vitest",
176
+ "test:ci": "pnpm run test run",
177
+ "test:debug": "pnpm run test --silent=false --verbose=true",
178
+ "test:e2e": "dotenv -- vitest run -c ./e2e/vitest.config.mts",
179
+ "test:watch": "pnpm run test --testTimeout=50000 --watch",
180
+ "type:tests": "tsc -p ./src/__tests__/tsconfig.json && tsc -p ./e2e/tsconfig.json"
154
181
  }
155
- }
182
+ }
@@ -0,0 +1,128 @@
1
+ import { isRoutingRuleMatch } from "../pages-dev-util";
2
+
3
+ describe("isRoutingRuleMatch", () => {
4
+ it("should match rules referencing root level correctly", () => {
5
+ const routingRule = "/";
6
+
7
+ expect(isRoutingRuleMatch("/", routingRule)).toBeTruthy();
8
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeFalsy();
9
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeFalsy();
10
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeFalsy();
11
+ });
12
+
13
+ it("should match include-all rules correctly", () => {
14
+ const routingRule = "/*";
15
+
16
+ expect(isRoutingRuleMatch("/", routingRule)).toBeTruthy();
17
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
18
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
19
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
20
+ expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
21
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
22
+ expect(isRoutingRuleMatch("/foo/bar/baz/", routingRule)).toBeTruthy();
23
+ });
24
+
25
+ it("should match `/*` suffix-ed rules correctly", () => {
26
+ let routingRule = "/foo/*";
27
+
28
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
29
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
30
+ expect(isRoutingRuleMatch("/foobar", routingRule)).toBeFalsy();
31
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
32
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
33
+ expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
34
+ expect(isRoutingRuleMatch("/bar/foo/baz", routingRule)).toBeFalsy();
35
+
36
+ routingRule = "/foo/bar/*";
37
+
38
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeFalsy();
39
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeFalsy();
40
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
41
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
42
+ expect(isRoutingRuleMatch("/foo/barfoo", routingRule)).toBeFalsy();
43
+ expect(isRoutingRuleMatch("baz/foo/bar", routingRule)).toBeFalsy();
44
+ expect(isRoutingRuleMatch("baz/foo/bar/", routingRule)).toBeFalsy();
45
+ });
46
+
47
+ it("should match `/` suffix-ed rules correctly", () => {
48
+ let routingRule = "/foo/";
49
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
50
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
51
+
52
+ routingRule = "/foo/bar/";
53
+ expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
54
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
55
+ });
56
+
57
+ it("should match `*` suffix-ed rules correctly", () => {
58
+ let routingRule = "/foo*";
59
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
60
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
61
+ expect(isRoutingRuleMatch("/foobar", routingRule)).toBeTruthy();
62
+ expect(isRoutingRuleMatch("/barfoo", routingRule)).toBeFalsy();
63
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
64
+ expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
65
+ expect(isRoutingRuleMatch("/bar/foobar", routingRule)).toBeFalsy();
66
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
67
+ expect(isRoutingRuleMatch("/bar/foo/baz", routingRule)).toBeFalsy();
68
+
69
+ routingRule = "/foo/bar*";
70
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
71
+ expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
72
+ expect(isRoutingRuleMatch("/foo/barfoo", routingRule)).toBeTruthy();
73
+ expect(isRoutingRuleMatch("/bar/foo/barfoo", routingRule)).toBeFalsy();
74
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
75
+ expect(isRoutingRuleMatch("/bar/foo/bar/baz", routingRule)).toBeFalsy();
76
+ });
77
+
78
+ it("should match rules without wildcards correctly", () => {
79
+ let routingRule = "/foo";
80
+
81
+ expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
82
+ expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
83
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeFalsy();
84
+ expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
85
+
86
+ routingRule = "/foo/bar";
87
+ expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
88
+ expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
89
+ expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeFalsy();
90
+ expect(isRoutingRuleMatch("/baz/foo/bar", routingRule)).toBeFalsy();
91
+ });
92
+
93
+ it("should throw an error if pathname or routing rule params are missing", () => {
94
+ // MISSING PATHNAME
95
+ expect(() =>
96
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
97
+ // @ts-ignore: sanity check
98
+ isRoutingRuleMatch(undefined, "/*")
99
+ ).toThrow("Pathname is undefined.");
100
+
101
+ expect(() =>
102
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
103
+ // @ts-ignore: sanity check
104
+ isRoutingRuleMatch(null, "/*")
105
+ ).toThrow("Pathname is undefined.");
106
+
107
+ expect(() => isRoutingRuleMatch("", "/*")).toThrow(
108
+ "Pathname is undefined."
109
+ );
110
+
111
+ // MISSING ROUTING RULE
112
+ expect(() =>
113
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
114
+ // @ts-ignore: sanity check
115
+ isRoutingRuleMatch("/foo", undefined)
116
+ ).toThrow("Routing rule is undefined.");
117
+
118
+ expect(() =>
119
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
120
+ // @ts-ignore: sanity check
121
+ isRoutingRuleMatch("/foo", null)
122
+ ).toThrow("Routing rule is undefined.");
123
+
124
+ expect(() => isRoutingRuleMatch("/foo", "")).toThrow(
125
+ "Routing rule is undefined."
126
+ );
127
+ });
128
+ });
@@ -0,0 +1,12 @@
1
+ // `@types/node` should be included
2
+ Buffer.from("test");
3
+
4
+ // `@types/jest` should be included
5
+ test("test");
6
+
7
+ // @ts-expect-error `@cloudflare/workers-types` should NOT be included
8
+ const _handler: ExportedHandler = {};
9
+ // @ts-expect-error `@cloudflare/workers-types` should NOT be included
10
+ new HTMLRewriter();
11
+
12
+ export {};
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@cloudflare/workers-tsconfig/tsconfig.json",
3
+ "compilerOptions": {
4
+ "types": ["node", "jest"]
5
+ },
6
+ "include": ["**/*.ts"],
7
+ "exclude": []
8
+ }
@@ -0,0 +1,30 @@
1
+ const urls = new Set();
2
+
3
+ function checkURL(request, init) {
4
+ const url =
5
+ request instanceof URL
6
+ ? request
7
+ : new URL(
8
+ (typeof request === "string"
9
+ ? new Request(request, init)
10
+ : request
11
+ ).url
12
+ );
13
+ if (url.port && url.port !== "443" && url.protocol === "https:") {
14
+ if (!urls.has(url.toString())) {
15
+ urls.add(url.toString());
16
+ console.warn(
17
+ `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` +
18
+ ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n`
19
+ );
20
+ }
21
+ }
22
+ }
23
+
24
+ globalThis.fetch = new Proxy(globalThis.fetch, {
25
+ apply(target, thisArg, argArray) {
26
+ const [request, init] = argArray;
27
+ checkURL(request, init);
28
+ return Reflect.apply(target, thisArg, argArray);
29
+ },
30
+ });
@@ -0,0 +1,19 @@
1
+ declare module "__ENTRY_POINT__" {
2
+ import { Middleware } from "./middleware/common";
3
+ import { WorkerEntrypoint } from "cloudflare:workers";
4
+
5
+ export type WorkerEntrypointConstructor = typeof WorkerEntrypoint;
6
+
7
+ const worker: ExportedHandler | WorkerEntrypointConstructor;
8
+ export default worker;
9
+ export const __INTERNAL_WRANGLER_MIDDLEWARE__: Middleware[];
10
+ }
11
+
12
+ declare module "__KV_ASSET_HANDLER__" {
13
+ export * from "@cloudflare/kv-asset-handler";
14
+ }
15
+
16
+ declare module "__STATIC_CONTENT_MANIFEST" {
17
+ const manifest: string;
18
+ export default manifest;
19
+ }
@@ -166,6 +166,5 @@ dist
166
166
  .yarn/install-state.gz
167
167
  .pnp.\*
168
168
 
169
- # wrangler project
170
-
171
- .dev.vars
169
+ .wrangler
170
+ .DS_Store
@@ -0,0 +1,23 @@
1
+ const { unstable_dev } = require("wrangler");
2
+
3
+ describe("Worker", () => {
4
+ let worker;
5
+
6
+ beforeAll(async () => {
7
+ worker = await unstable_dev("src/index.js", {
8
+ experimental: { disableExperimentalWarning: true },
9
+ });
10
+ });
11
+
12
+ afterAll(async () => {
13
+ await worker.stop();
14
+ });
15
+
16
+ it("should return Hello World", async () => {
17
+ const resp = await worker.fetch();
18
+ if (resp) {
19
+ const text = await resp.text();
20
+ expect(text).toMatchInlineSnapshot(`"Hello World!"`);
21
+ }
22
+ });
23
+ });
@@ -0,0 +1,24 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
2
+ import { unstable_dev } from "wrangler";
3
+
4
+ describe("Worker", () => {
5
+ let worker;
6
+
7
+ beforeAll(async () => {
8
+ worker = await unstable_dev("src/index.js", {
9
+ experimental: { disableExperimentalWarning: true },
10
+ });
11
+ });
12
+
13
+ afterAll(async () => {
14
+ await worker.stop();
15
+ });
16
+
17
+ it("should return Hello World", async () => {
18
+ const resp = await worker.fetch();
19
+ if (resp) {
20
+ const text = await resp.text();
21
+ expect(text).toMatchInlineSnapshot(`"Hello World!"`);
22
+ }
23
+ });
24
+ });
@@ -0,0 +1,25 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
2
+ import { unstable_dev } from "wrangler";
3
+ import type { Unstable_DevWorker } from "wrangler";
4
+
5
+ describe("Worker", () => {
6
+ let worker: Unstable_DevWorker;
7
+
8
+ beforeAll(async () => {
9
+ worker = await unstable_dev("src/index.ts", {
10
+ experimental: { disableExperimentalWarning: true },
11
+ });
12
+ });
13
+
14
+ afterAll(async () => {
15
+ await worker.stop();
16
+ });
17
+
18
+ it("should return Hello World", async () => {
19
+ const resp = await worker.fetch();
20
+ if (resp) {
21
+ const text = await resp.text();
22
+ expect(text).toMatchInlineSnapshot(`"Hello World!"`);
23
+ }
24
+ });
25
+ });
@@ -0,0 +1,67 @@
1
+ export type Awaitable<T> = T | Promise<T>;
2
+ // TODO: allow dispatching more events?
3
+ export type Dispatcher = (
4
+ type: "scheduled",
5
+ init: { cron?: string }
6
+ ) => Awaitable<void>;
7
+
8
+ export type IncomingRequest = Request<
9
+ unknown,
10
+ IncomingRequestCfProperties<unknown>
11
+ >;
12
+
13
+ export interface MiddlewareContext {
14
+ dispatch: Dispatcher;
15
+ next(request: IncomingRequest, env: any): Awaitable<Response>;
16
+ }
17
+
18
+ export type Middleware = (
19
+ request: IncomingRequest,
20
+ env: any,
21
+ ctx: ExecutionContext,
22
+ middlewareCtx: MiddlewareContext
23
+ ) => Awaitable<Response>;
24
+
25
+ const __facade_middleware__: Middleware[] = [];
26
+
27
+ // The register functions allow for the insertion of one or many middleware,
28
+ // We register internal middleware first in the stack, but have no way of controlling
29
+ // the order that addMiddleware is run in service workers so need an internal function.
30
+ export function __facade_register__(...args: (Middleware | Middleware[])[]) {
31
+ __facade_middleware__.push(...args.flat());
32
+ }
33
+ export function __facade_registerInternal__(
34
+ ...args: (Middleware | Middleware[])[]
35
+ ) {
36
+ __facade_middleware__.unshift(...args.flat());
37
+ }
38
+
39
+ function __facade_invokeChain__(
40
+ request: IncomingRequest,
41
+ env: any,
42
+ ctx: ExecutionContext,
43
+ dispatch: Dispatcher,
44
+ middlewareChain: Middleware[]
45
+ ): Awaitable<Response> {
46
+ const [head, ...tail] = middlewareChain;
47
+ const middlewareCtx: MiddlewareContext = {
48
+ dispatch,
49
+ next(newRequest, newEnv) {
50
+ return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);
51
+ },
52
+ };
53
+ return head(request, env, ctx, middlewareCtx);
54
+ }
55
+
56
+ export function __facade_invoke__(
57
+ request: IncomingRequest,
58
+ env: any,
59
+ ctx: ExecutionContext,
60
+ dispatch: Dispatcher,
61
+ finalMiddleware: Middleware
62
+ ): Awaitable<Response> {
63
+ return __facade_invokeChain__(request, env, ctx, dispatch, [
64
+ ...__facade_middleware__,
65
+ finalMiddleware,
66
+ ]);
67
+ }