wrangler 0.0.0-e61fba8 → 0.0.0-e640ed9d

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 (152) hide show
  1. package/README.md +29 -11
  2. package/bin/wrangler.js +86 -67
  3. package/config-schema.json +2947 -0
  4. package/package.json +114 -79
  5. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  6. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  7. package/templates/__tests__/tsconfig.json +8 -0
  8. package/templates/checked-fetch.js +30 -0
  9. package/templates/facade.d.ts +19 -0
  10. package/templates/gitignore +0 -4
  11. package/templates/init-tests/test-jest-new-worker.js +23 -0
  12. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  13. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  14. package/templates/middleware/common.ts +67 -0
  15. package/templates/middleware/loader-modules.ts +134 -0
  16. package/templates/middleware/loader-sw.ts +229 -0
  17. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  18. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  19. package/templates/middleware/middleware-pretty-error.ts +40 -0
  20. package/templates/middleware/middleware-scheduled.ts +15 -0
  21. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  22. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  23. package/templates/modules-watch-stub.js +4 -0
  24. package/templates/new-worker-scheduled.js +3 -3
  25. package/templates/new-worker-scheduled.ts +16 -16
  26. package/templates/new-worker.js +3 -3
  27. package/templates/new-worker.ts +19 -16
  28. package/templates/no-op-worker.js +10 -0
  29. package/templates/pages-dev-pipeline.ts +32 -0
  30. package/templates/pages-dev-util.ts +55 -0
  31. package/templates/pages-shim.ts +9 -0
  32. package/templates/pages-template-plugin.ts +190 -0
  33. package/templates/pages-template-worker.ts +198 -0
  34. package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
  35. package/templates/startDevWorker/ProxyWorker.ts +334 -0
  36. package/templates/tsconfig-sanity.ts +11 -0
  37. package/templates/tsconfig.init.json +105 -0
  38. package/templates/tsconfig.json +6 -103
  39. package/wrangler-dist/InspectorProxyWorker.js +464 -0
  40. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  41. package/wrangler-dist/ProxyWorker.js +240 -0
  42. package/wrangler-dist/ProxyWorker.js.map +6 -0
  43. package/wrangler-dist/cli.d.ts +24215 -0
  44. package/wrangler-dist/cli.js +191630 -110162
  45. package/wrangler-dist/wasm-sync.wasm +0 -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 -4886
  52. package/pages/functions/buildPlugin.ts +0 -105
  53. package/pages/functions/buildWorker.ts +0 -151
  54. package/pages/functions/filepath-routing.test.ts +0 -234
  55. package/pages/functions/filepath-routing.ts +0 -189
  56. package/pages/functions/identifiers.ts +0 -78
  57. package/pages/functions/routes.ts +0 -156
  58. package/pages/functions/template-plugin.ts +0 -147
  59. package/pages/functions/template-worker.ts +0 -143
  60. package/src/__tests__/config-cache.test.ts +0 -36
  61. package/src/__tests__/configuration.test.ts +0 -3487
  62. package/src/__tests__/dev.test.tsx +0 -1010
  63. package/src/__tests__/guess-worker-format.test.ts +0 -85
  64. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  65. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  66. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  67. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  68. package/src/__tests__/helpers/mock-bin.ts +0 -36
  69. package/src/__tests__/helpers/mock-cfetch.ts +0 -211
  70. package/src/__tests__/helpers/mock-console.ts +0 -87
  71. package/src/__tests__/helpers/mock-dialogs.ts +0 -130
  72. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  73. package/src/__tests__/helpers/mock-istty.ts +0 -27
  74. package/src/__tests__/helpers/mock-kv.ts +0 -33
  75. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -255
  76. package/src/__tests__/helpers/mock-stdin.ts +0 -103
  77. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  78. package/src/__tests__/helpers/run-in-tmp.ts +0 -39
  79. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  80. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  81. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  82. package/src/__tests__/https-options.test.ts +0 -130
  83. package/src/__tests__/index.test.ts +0 -257
  84. package/src/__tests__/init.test.ts +0 -1637
  85. package/src/__tests__/jest.setup.ts +0 -77
  86. package/src/__tests__/kv.test.ts +0 -1502
  87. package/src/__tests__/logger.test.ts +0 -115
  88. package/src/__tests__/package-manager.test.ts +0 -353
  89. package/src/__tests__/pages.test.ts +0 -754
  90. package/src/__tests__/parse.test.ts +0 -330
  91. package/src/__tests__/publish.test.ts +0 -5820
  92. package/src/__tests__/r2.test.ts +0 -233
  93. package/src/__tests__/route.test.ts +0 -45
  94. package/src/__tests__/secret.test.ts +0 -481
  95. package/src/__tests__/tail.test.ts +0 -690
  96. package/src/__tests__/user.test.ts +0 -131
  97. package/src/__tests__/whoami.test.tsx +0 -139
  98. package/src/abort.d.ts +0 -3
  99. package/src/bundle.ts +0 -204
  100. package/src/cfetch/index.ts +0 -121
  101. package/src/cfetch/internal.ts +0 -142
  102. package/src/cli.ts +0 -13
  103. package/src/config/README.md +0 -107
  104. package/src/config/config.ts +0 -234
  105. package/src/config/diagnostics.ts +0 -80
  106. package/src/config/environment.ts +0 -420
  107. package/src/config/index.ts +0 -225
  108. package/src/config/validation-helpers.ts +0 -584
  109. package/src/config/validation.ts +0 -1548
  110. package/src/config-cache.ts +0 -45
  111. package/src/create-worker-preview.ts +0 -185
  112. package/src/create-worker-upload-form.ts +0 -254
  113. package/src/dev/dev-vars.ts +0 -36
  114. package/src/dev/dev.tsx +0 -395
  115. package/src/dev/local.tsx +0 -321
  116. package/src/dev/remote.tsx +0 -240
  117. package/src/dev/use-esbuild.ts +0 -115
  118. package/src/dialogs.tsx +0 -135
  119. package/src/durable.ts +0 -102
  120. package/src/entry.ts +0 -322
  121. package/src/environment-variables.ts +0 -35
  122. package/src/errors.ts +0 -11
  123. package/src/https-options.ts +0 -123
  124. package/src/index.tsx +0 -2859
  125. package/src/inspect.ts +0 -662
  126. package/src/intl-polyfill.d.ts +0 -139
  127. package/src/kv.ts +0 -408
  128. package/src/logger.ts +0 -66
  129. package/src/miniflare-cli/README.md +0 -30
  130. package/src/miniflare-cli/enum-keys.ts +0 -17
  131. package/src/miniflare-cli/index.ts +0 -41
  132. package/src/miniflare-cli/request-context.ts +0 -40
  133. package/src/module-collection.ts +0 -258
  134. package/src/open-in-browser.ts +0 -19
  135. package/src/package-manager.ts +0 -174
  136. package/src/pages.tsx +0 -2093
  137. package/src/parse.ts +0 -222
  138. package/src/paths.ts +0 -26
  139. package/src/proxy.ts +0 -478
  140. package/src/publish.ts +0 -721
  141. package/src/r2.ts +0 -50
  142. package/src/selfsigned.d.ts +0 -29
  143. package/src/sites.tsx +0 -326
  144. package/src/tail/filters.ts +0 -279
  145. package/src/tail/index.ts +0 -299
  146. package/src/tail/printing.ts +0 -67
  147. package/src/update-check.ts +0 -19
  148. package/src/user.tsx +0 -1214
  149. package/src/whoami.tsx +0 -71
  150. package/src/worker.ts +0 -181
  151. package/src/zones.ts +0 -73
  152. package/templates/static-asset-facade.js +0 -43
package/package.json CHANGED
@@ -1,17 +1,7 @@
1
1
  {
2
2
  "name": "wrangler",
3
- "version": "0.0.0-e61fba8",
4
- "author": "wrangler@cloudflare.com",
3
+ "version": "0.0.0-e640ed9d",
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,129 +18,174 @@
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
  ],
27
+ "homepage": "https://github.com/cloudflare/workers-sdk#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/cloudflare/workers-sdk/issues"
30
+ },
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
+ ],
38
52
  "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",
53
+ "@esbuild-plugins/node-globals-polyfill": "^0.2.3",
54
+ "@esbuild-plugins/node-modules-polyfill": "^0.2.2",
42
55
  "blake3-wasm": "^2.1.5",
43
- "esbuild": "0.14.34",
44
- "miniflare": "^2.5.0",
56
+ "chokidar": "^3.5.3",
57
+ "esbuild": "0.17.19",
45
58
  "nanoid": "^3.3.3",
46
59
  "path-to-regexp": "^6.2.0",
60
+ "resolve": "^1.22.8",
61
+ "resolve.exports": "^2.0.2",
47
62
  "selfsigned": "^2.0.1",
48
- "semiver": "^1.1.0",
49
- "xxhash-wasm": "^1.0.1"
50
- },
51
- "optionalDependencies": {
52
- "fsevents": "~2.3.2"
63
+ "source-map": "0.6.1",
64
+ "xxhash-wasm": "^1.0.1",
65
+ "@cloudflare/kv-asset-handler": "0.3.2",
66
+ "miniflare": "3.20240524.2"
53
67
  },
54
68
  "devDependencies": {
69
+ "@cloudflare/types": "^6.18.4",
70
+ "@cloudflare/workers-types": "^4.20240524.0",
71
+ "@cspotcode/source-map-support": "0.8.1",
55
72
  "@iarna/toml": "^3.0.0",
73
+ "@microsoft/api-extractor": "^7.28.3",
74
+ "@sentry/node": "^7.86.0",
75
+ "@sentry/types": "^7.86.0",
76
+ "@sentry/utils": "^7.86.0",
77
+ "@types/body-parser": "^1.19.2",
56
78
  "@types/command-exists": "^1.2.0",
79
+ "@types/express": "^4.17.13",
57
80
  "@types/glob-to-regexp": "0.4.1",
81
+ "@types/is-ci": "^3.0.0",
82
+ "@types/javascript-time-ago": "^2.0.3",
58
83
  "@types/mime": "^2.0.3",
84
+ "@types/minimatch": "^5.1.2",
59
85
  "@types/prompts": "^2.0.14",
60
86
  "@types/react": "^17.0.37",
87
+ "@types/resolve": "^1.20.6",
61
88
  "@types/serve-static": "^1.13.10",
89
+ "@types/shell-quote": "^1.7.2",
62
90
  "@types/signal-exit": "^3.0.1",
63
91
  "@types/supports-color": "^8.1.1",
64
92
  "@types/ws": "^8.5.3",
65
93
  "@types/yargs": "^17.0.10",
66
- "@webcontainer/env": "^1.0.1",
67
- "chokidar": "^3.5.3",
94
+ "@vitest/ui": "^1.6.0",
95
+ "@webcontainer/env": "^1.1.0",
96
+ "body-parser": "^1.20.0",
97
+ "chalk": "^2.4.2",
98
+ "cli-table3": "^0.6.3",
68
99
  "clipboardy": "^3.0.0",
69
100
  "cmd-shim": "^4.1.0",
70
101
  "command-exists": "^1.2.9",
102
+ "concurrently": "^7.2.2",
71
103
  "devtools-protocol": "^0.0.955664",
72
104
  "dotenv": "^16.0.0",
105
+ "es-module-lexer": "^1.3.0",
73
106
  "execa": "^6.1.0",
74
- "faye-websocket": "^0.11.4",
75
- "finalhandler": "^1.2.0",
107
+ "express": "^4.18.1",
76
108
  "find-up": "^6.3.0",
77
109
  "get-port": "^6.1.2",
78
110
  "glob-to-regexp": "0.4.1",
79
111
  "http-terminator": "^3.2.0",
112
+ "https-proxy-agent": "7.0.2",
80
113
  "ignore": "^5.2.0",
81
114
  "ink": "^3.2.0",
82
115
  "ink-select-input": "^4.2.1",
83
116
  "ink-spinner": "^4.0.3",
84
117
  "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",
118
+ "is-ci": "^3.0.1",
119
+ "javascript-time-ago": "^2.5.4",
120
+ "md5-file": "5.0.0",
89
121
  "mime": "^3.0.0",
122
+ "minimatch": "^5.1.0",
123
+ "mock-socket": "^9.3.1",
124
+ "msw": "^2.3.0",
90
125
  "open": "^8.4.0",
91
126
  "p-queue": "^7.2.0",
127
+ "patch-console": "^1.0.0",
92
128
  "pretty-bytes": "^6.0.0",
93
129
  "prompts": "^2.4.2",
130
+ "ps-list": "^8.1.1",
94
131
  "react": "^17.0.2",
95
132
  "react-error-boundary": "^3.1.4",
133
+ "semiver": "^1.1.0",
96
134
  "serve-static": "^1.15.0",
135
+ "shell-quote": "^1.8.1",
136
+ "shellac": "^0.8.0",
97
137
  "signal-exit": "^3.0.7",
138
+ "strip-ansi": "^7.0.1",
98
139
  "supports-color": "^9.2.2",
99
140
  "timeago.js": "^4.0.2",
100
- "tmp-promise": "^3.0.3",
101
141
  "ts-dedent": "^2.2.0",
102
- "undici": "^5.3.0",
142
+ "ts-json-schema-generator": "^1.5.0",
143
+ "undici": "5.28.4",
103
144
  "update-check": "^1.5.4",
145
+ "vitest": "^1.6.0",
146
+ "vitest-websocket-mock": "^0.3.0",
104
147
  "ws": "^8.5.0",
105
- "yargs": "^17.4.1"
148
+ "xdg-app-paths": "^8.3.0",
149
+ "yargs": "^17.7.2",
150
+ "yoga-layout": "file:../../vendor/yoga-layout-2.0.0-beta.1.tgz",
151
+ "@cloudflare/cli": "1.1.1",
152
+ "@cloudflare/pages-shared": "^0.11.41",
153
+ "@cloudflare/workers-tsconfig": "0.0.0",
154
+ "@cloudflare/eslint-config-worker": "1.1.0"
106
155
  },
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
- "kv-asset-handler.js",
118
- "Cloudflare_CA.pem"
119
- ],
120
- "scripts": {
121
- "clean": "rm -rf wrangler-dist miniflare-dist",
122
- "check:type": "tsc",
123
- "bundle": "node -r esbuild-register scripts/bundle.ts",
124
- "build": "npm run clean && npm run bundle",
125
- "prepublishOnly": "SOURCEMAPS=false npm run build",
126
- "start": "npm run bundle && NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
127
- "test": "jest --silent=false --verbose=true",
128
- "test-watch": "npm run test -- --runInBand --testTimeout=50000 --watch"
156
+ "optionalDependencies": {
157
+ "fsevents": "~2.3.2"
158
+ },
159
+ "peerDependencies": {
160
+ "@cloudflare/workers-types": "^4.20240524.0"
161
+ },
162
+ "peerDependenciesMeta": {
163
+ "@cloudflare/workers-types": {
164
+ "optional": true
165
+ }
129
166
  },
130
167
  "engines": {
131
- "node": ">=16.7.0"
168
+ "node": ">=16.17.0"
169
+ },
170
+ "workers-sdk": {
171
+ "prerelease": true
132
172
  },
133
- "jest": {
134
- "restoreMocks": true,
135
- "testTimeout": 30000,
136
- "testRegex": ".*.(test|spec)\\.[jt]sx?$",
137
- "transformIgnorePatterns": [
138
- "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)"
139
- ],
140
- "moduleNameMapper": {
141
- "clipboardy": "<rootDir>/src/__tests__/helpers/clipboardy-mock.js",
142
- "miniflare/cli": "<rootDir>/../../node_modules/miniflare/dist/src/cli.js"
143
- },
144
- "transform": {
145
- "^.+\\.c?(t|j)sx?$": [
146
- "esbuild-jest",
147
- {
148
- "sourcemap": true
149
- }
150
- ]
151
- },
152
- "setupFilesAfterEnv": [
153
- "<rootDir>/src/__tests__/jest.setup.ts"
154
- ]
173
+ "scripts": {
174
+ "assert-git-version": "node -r esbuild-register scripts/assert-git-version.ts",
175
+ "build": "pnpm run clean && pnpm run bundle && pnpm run emit-types && pnpm run generate-json-schema",
176
+ "bundle": "node -r esbuild-register scripts/bundle.ts",
177
+ "check:lint": "eslint .",
178
+ "check:type": "tsc",
179
+ "clean": "rimraf wrangler-dist miniflare-dist emitted-types",
180
+ "dev": "pnpm run clean && concurrently -c black,blue --kill-others-on-fail false \"pnpm run bundle --watch\" \"pnpm run check:type --watch --preserveWatchOutput\"",
181
+ "emit-types": "tsc -p tsconfig.emit.json && node -r esbuild-register scripts/emit-types.ts",
182
+ "generate-json-schema": "pnpm exec ts-json-schema-generator --no-type-check --path src/config/config.ts --type RawConfig --out config-schema.json",
183
+ "start": "pnpm run bundle && cross-env NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
184
+ "test": "pnpm run assert-git-version && vitest",
185
+ "test:ci": "pnpm run test run",
186
+ "test:debug": "pnpm run test --silent=false --verbose=true",
187
+ "test:e2e": "vitest -c ./e2e/vitest.config.ts",
188
+ "test:watch": "pnpm run test --testTimeout=50000 --watch",
189
+ "type:tests": "tsc -p ./src/__tests__/tsconfig.json && tsc -p ./e2e/tsconfig.json"
155
190
  }
156
- }
191
+ }
@@ -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
+ }
@@ -165,7 +165,3 @@ dist
165
165
  .yarn/build-state.yml
166
166
  .yarn/install-state.gz
167
167
  .pnp.\*
168
-
169
- # wrangler project
170
-
171
- .dev.vars
@@ -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 { UnstableDevWorker } from "wrangler";
4
+
5
+ describe("Worker", () => {
6
+ let worker: UnstableDevWorker;
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
+ }