wrangler 0.0.0-e3cab74 → 0.0.0-e452a35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cloudflare_CA.pem +18 -0
- package/README.md +27 -14
- package/bin/wrangler.js +49 -5
- package/miniflare-dist/index.mjs +4886 -0
- package/package.json +42 -28
- package/pages/functions/buildPlugin.ts +105 -0
- package/pages/functions/buildWorker.ts +93 -4
- package/pages/functions/filepath-routing.test.ts +136 -25
- package/pages/functions/filepath-routing.ts +14 -3
- package/pages/functions/routes.ts +6 -1
- package/pages/functions/template-plugin.ts +147 -0
- package/pages/functions/template-worker.ts +21 -8
- package/src/__tests__/config-cache.test.ts +36 -0
- package/src/__tests__/configuration.test.ts +1514 -367
- package/src/__tests__/dev.test.tsx +870 -84
- package/src/__tests__/guess-worker-format.test.ts +37 -18
- package/src/__tests__/helpers/mock-account-id.ts +22 -4
- package/src/__tests__/helpers/mock-cfetch.ts +8 -4
- package/src/__tests__/helpers/mock-console.ts +35 -10
- package/src/__tests__/helpers/mock-dialogs.ts +26 -1
- package/src/__tests__/helpers/mock-http-server.ts +46 -0
- package/src/__tests__/helpers/mock-istty.ts +27 -0
- package/src/__tests__/helpers/mock-kv.ts +9 -16
- package/src/__tests__/helpers/mock-oauth-flow.ts +255 -0
- package/src/__tests__/helpers/mock-stdin.ts +103 -0
- package/src/__tests__/helpers/run-in-tmp.ts +10 -0
- package/src/__tests__/helpers/write-worker-source.ts +31 -0
- package/src/__tests__/https-options.test.ts +130 -0
- package/src/__tests__/index.test.ts +137 -747
- package/src/__tests__/init.test.ts +1557 -0
- package/src/__tests__/jest.setup.ts +28 -8
- package/src/__tests__/kv.test.ts +598 -258
- package/src/__tests__/logger.test.ts +115 -0
- package/src/__tests__/pages.test.ts +657 -0
- package/src/__tests__/parse.test.ts +8 -0
- package/src/__tests__/publish.test.ts +4003 -941
- package/src/__tests__/r2.test.ts +69 -34
- package/src/__tests__/route.test.ts +45 -0
- package/src/__tests__/secret.test.ts +228 -73
- package/src/__tests__/tail.test.ts +146 -20
- package/src/__tests__/user.test.ts +131 -0
- package/src/__tests__/whoami.test.tsx +26 -7
- package/src/abort.d.ts +3 -0
- package/src/bundle.ts +74 -7
- package/src/cfetch/index.ts +21 -4
- package/src/cfetch/internal.ts +20 -14
- package/src/cli.ts +5 -11
- package/src/config/README.md +7 -7
- package/src/config/config.ts +69 -100
- package/src/config/environment.ts +119 -4
- package/src/config/index.ts +177 -4
- package/src/config/validation-helpers.ts +228 -23
- package/src/config/validation.ts +687 -174
- package/src/config-cache.ts +45 -0
- package/src/{api/preview.ts → create-worker-preview.ts} +74 -36
- package/src/{api/form_data.ts → create-worker-upload-form.ts} +55 -18
- package/src/dev/dev-vars.ts +36 -0
- package/src/dev/dev.tsx +422 -0
- package/src/dev/local.tsx +318 -0
- package/src/dev/remote.tsx +227 -0
- package/src/dev/use-esbuild.ts +118 -0
- package/src/dialogs.tsx +16 -6
- package/src/durable.ts +102 -0
- package/src/entry.ts +279 -14
- package/src/environment-variables.ts +3 -1
- package/src/errors.ts +11 -0
- package/src/https-options.ts +123 -0
- package/src/index.tsx +1268 -806
- package/src/inspect.ts +64 -11
- package/src/intl-polyfill.d.ts +139 -0
- package/src/{kv.tsx → kv.ts} +195 -62
- package/src/logger.ts +66 -0
- package/src/miniflare-cli/README.md +30 -0
- package/src/miniflare-cli/enum-keys.ts +17 -0
- package/src/miniflare-cli/index.ts +41 -0
- package/src/miniflare-cli/request-context.ts +40 -0
- package/src/module-collection.ts +94 -6
- package/src/open-in-browser.ts +9 -3
- package/src/package-manager.ts +9 -8
- package/src/pages.tsx +1057 -75
- package/src/parse.ts +24 -5
- package/src/proxy.ts +143 -54
- package/src/publish.ts +444 -229
- package/src/selfsigned.d.ts +29 -0
- package/src/sites.tsx +98 -44
- package/src/tail/index.ts +2 -2
- package/src/tail/printing.ts +13 -8
- package/src/update-check.ts +19 -0
- package/src/user.tsx +263 -109
- package/src/whoami.tsx +2 -1
- package/src/{api/worker.ts → worker.ts} +24 -30
- package/templates/gitignore +171 -0
- package/templates/new-worker.ts +16 -1
- package/templates/static-asset-facade.js +1 -1
- package/wrangler-dist/cli.js +55345 -69246
- package/src/__tests__/helpers/mock-user.ts +0 -27
- package/src/__tests__/logout.test.ts +0 -50
- package/src/__tests__/sentry.test.ts +0 -146
- package/src/dev.tsx +0 -961
- package/src/guess-worker-format.ts +0 -68
- package/src/reporting.ts +0 -115
- package/wrangler-dist/cli.js.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wrangler",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-e452a35",
|
|
4
4
|
"author": "wrangler@cloudflare.com",
|
|
5
5
|
"description": "Command-line interface for all things Cloudflare Workers",
|
|
6
6
|
"bin": {
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT OR Apache-2.0",
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/cloudflare/
|
|
12
|
+
"url": "https://github.com/cloudflare/wrangler2/issues"
|
|
13
13
|
},
|
|
14
|
-
"homepage": "https://github.com/cloudflare/
|
|
14
|
+
"homepage": "https://github.com/cloudflare/wrangler2#readme",
|
|
15
15
|
"keywords": [
|
|
16
16
|
"wrangler",
|
|
17
17
|
"cloudflare",
|
|
@@ -36,9 +36,14 @@
|
|
|
36
36
|
"cli"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"esbuild": "0.
|
|
40
|
-
"
|
|
39
|
+
"@esbuild-plugins/node-globals-polyfill": "^0.1.1",
|
|
40
|
+
"@esbuild-plugins/node-modules-polyfill": "^0.1.4",
|
|
41
|
+
"blake3-wasm": "^2.1.5",
|
|
42
|
+
"esbuild": "0.14.34",
|
|
43
|
+
"miniflare": "^2.5.0",
|
|
44
|
+
"nanoid": "^3.3.3",
|
|
41
45
|
"path-to-regexp": "^6.2.0",
|
|
46
|
+
"selfsigned": "^2.0.1",
|
|
42
47
|
"semiver": "^1.1.0",
|
|
43
48
|
"xxhash-wasm": "^1.0.1"
|
|
44
49
|
},
|
|
@@ -46,68 +51,76 @@
|
|
|
46
51
|
"fsevents": "~2.3.2"
|
|
47
52
|
},
|
|
48
53
|
"devDependencies": {
|
|
49
|
-
"@
|
|
50
|
-
"@iarna/toml": "^2.2.5",
|
|
51
|
-
"@sentry/cli": "^1.71.0",
|
|
52
|
-
"@sentry/integrations": "^6.17.6",
|
|
53
|
-
"@sentry/node": "^6.17.6",
|
|
54
|
+
"@iarna/toml": "^3.0.0",
|
|
54
55
|
"@types/command-exists": "^1.2.0",
|
|
55
|
-
"@types/estree": "^0.0.50",
|
|
56
56
|
"@types/glob-to-regexp": "0.4.1",
|
|
57
57
|
"@types/mime": "^2.0.3",
|
|
58
58
|
"@types/prompts": "^2.0.14",
|
|
59
59
|
"@types/react": "^17.0.37",
|
|
60
60
|
"@types/serve-static": "^1.13.10",
|
|
61
61
|
"@types/signal-exit": "^3.0.1",
|
|
62
|
-
"@types/
|
|
63
|
-
"@types/
|
|
64
|
-
"
|
|
62
|
+
"@types/supports-color": "^8.1.1",
|
|
63
|
+
"@types/ws": "^8.5.3",
|
|
64
|
+
"@types/yargs": "^17.0.10",
|
|
65
|
+
"@webcontainer/env": "^1.0.1",
|
|
66
|
+
"chokidar": "^3.5.3",
|
|
65
67
|
"clipboardy": "^3.0.0",
|
|
66
68
|
"cmd-shim": "^4.1.0",
|
|
67
69
|
"command-exists": "^1.2.9",
|
|
68
70
|
"devtools-protocol": "^0.0.955664",
|
|
69
|
-
"
|
|
71
|
+
"dotenv": "^16.0.0",
|
|
72
|
+
"execa": "^6.1.0",
|
|
70
73
|
"faye-websocket": "^0.11.4",
|
|
71
|
-
"finalhandler": "^1.
|
|
72
|
-
"find-up": "^6.
|
|
74
|
+
"finalhandler": "^1.2.0",
|
|
75
|
+
"find-up": "^6.3.0",
|
|
73
76
|
"get-port": "^6.1.2",
|
|
74
77
|
"glob-to-regexp": "0.4.1",
|
|
78
|
+
"http-terminator": "^3.2.0",
|
|
75
79
|
"ignore": "^5.2.0",
|
|
76
80
|
"ink": "^3.2.0",
|
|
77
81
|
"ink-select-input": "^4.2.1",
|
|
82
|
+
"ink-spinner": "^4.0.3",
|
|
78
83
|
"ink-table": "^3.0.0",
|
|
79
84
|
"ink-testing-library": "^2.1.0",
|
|
80
|
-
"ink-text-input": "^4.0.
|
|
85
|
+
"ink-text-input": "^4.0.3",
|
|
81
86
|
"jest-fetch-mock": "^3.0.3",
|
|
82
87
|
"jest-websocket-mock": "^2.3.0",
|
|
83
88
|
"mime": "^3.0.0",
|
|
84
89
|
"open": "^8.4.0",
|
|
90
|
+
"p-queue": "^7.2.0",
|
|
91
|
+
"pretty-bytes": "^6.0.0",
|
|
85
92
|
"prompts": "^2.4.2",
|
|
86
93
|
"react": "^17.0.2",
|
|
87
94
|
"react-error-boundary": "^3.1.4",
|
|
88
|
-
"serve-static": "^1.
|
|
89
|
-
"signal-exit": "^3.0.
|
|
95
|
+
"serve-static": "^1.15.0",
|
|
96
|
+
"signal-exit": "^3.0.7",
|
|
97
|
+
"supports-color": "^9.2.2",
|
|
98
|
+
"timeago.js": "^4.0.2",
|
|
90
99
|
"tmp-promise": "^3.0.3",
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
100
|
+
"ts-dedent": "^2.2.0",
|
|
101
|
+
"undici": "^5.3.0",
|
|
102
|
+
"update-check": "^1.5.4",
|
|
103
|
+
"ws": "^8.5.0",
|
|
104
|
+
"yargs": "^17.4.1"
|
|
94
105
|
},
|
|
95
106
|
"files": [
|
|
96
107
|
"src",
|
|
97
108
|
"bin",
|
|
98
109
|
"pages",
|
|
99
110
|
"miniflare-config-stubs",
|
|
111
|
+
"miniflare-dist",
|
|
100
112
|
"wrangler-dist",
|
|
101
113
|
"templates",
|
|
102
114
|
"vendor",
|
|
103
|
-
"import_meta_url.js"
|
|
115
|
+
"import_meta_url.js",
|
|
116
|
+
"Cloudflare_CA.pem"
|
|
104
117
|
],
|
|
105
118
|
"scripts": {
|
|
106
|
-
"clean": "rm -rf wrangler-dist",
|
|
119
|
+
"clean": "rm -rf wrangler-dist miniflare-dist",
|
|
107
120
|
"check:type": "tsc",
|
|
108
121
|
"bundle": "node -r esbuild-register scripts/bundle.ts",
|
|
109
122
|
"build": "npm run clean && npm run bundle",
|
|
110
|
-
"prepublishOnly": "npm run build",
|
|
123
|
+
"prepublishOnly": "SOURCEMAPS=false npm run build",
|
|
111
124
|
"start": "npm run bundle && NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
|
|
112
125
|
"test": "jest --silent=false --verbose=true",
|
|
113
126
|
"test-watch": "npm run test -- --runInBand --testTimeout=50000 --watch"
|
|
@@ -120,10 +133,11 @@
|
|
|
120
133
|
"testTimeout": 30000,
|
|
121
134
|
"testRegex": ".*.(test|spec)\\.[jt]sx?$",
|
|
122
135
|
"transformIgnorePatterns": [
|
|
123
|
-
"node_modules/(?!find-up|locate-path|p-locate|p-limit|yocto-queue|path-exists|execa|strip-final-newline|npm-run-path|path-key|onetime|mimic-fn|human-signals|is-stream|get-port)"
|
|
136
|
+
"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)"
|
|
124
137
|
],
|
|
125
138
|
"moduleNameMapper": {
|
|
126
|
-
"clipboardy": "<rootDir>/src/__tests__/helpers/clipboardy-mock.js"
|
|
139
|
+
"clipboardy": "<rootDir>/src/__tests__/helpers/clipboardy-mock.js",
|
|
140
|
+
"miniflare/cli": "<rootDir>/../../node_modules/miniflare/dist/src/cli.js"
|
|
127
141
|
},
|
|
128
142
|
"transform": {
|
|
129
143
|
"^.+\\.c?(t|j)sx?$": [
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { access, lstat } from "node:fs/promises";
|
|
2
|
+
import { dirname, relative, resolve } from "node:path";
|
|
3
|
+
import NodeGlobalsPolyfills from "@esbuild-plugins/node-globals-polyfill";
|
|
4
|
+
import NodeModulesPolyfills from "@esbuild-plugins/node-modules-polyfill";
|
|
5
|
+
import { build } from "esbuild";
|
|
6
|
+
|
|
7
|
+
type Options = {
|
|
8
|
+
routesModule: string;
|
|
9
|
+
outfile: string;
|
|
10
|
+
minify?: boolean;
|
|
11
|
+
sourcemap?: boolean;
|
|
12
|
+
watch?: boolean;
|
|
13
|
+
nodeCompat?: boolean;
|
|
14
|
+
onEnd?: () => void;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export function buildPlugin({
|
|
18
|
+
routesModule,
|
|
19
|
+
outfile = "bundle.js",
|
|
20
|
+
minify = false,
|
|
21
|
+
sourcemap = false,
|
|
22
|
+
watch = false,
|
|
23
|
+
nodeCompat,
|
|
24
|
+
onEnd = () => {},
|
|
25
|
+
}: Options) {
|
|
26
|
+
return build({
|
|
27
|
+
entryPoints: [resolve(__dirname, "../pages/functions/template-plugin.ts")],
|
|
28
|
+
inject: [routesModule],
|
|
29
|
+
bundle: true,
|
|
30
|
+
format: "esm",
|
|
31
|
+
target: "esnext",
|
|
32
|
+
outfile,
|
|
33
|
+
minify,
|
|
34
|
+
sourcemap,
|
|
35
|
+
watch,
|
|
36
|
+
allowOverwrite: true,
|
|
37
|
+
define: { ...(nodeCompat ? { global: "globalThis" } : {}) },
|
|
38
|
+
plugins: [
|
|
39
|
+
{
|
|
40
|
+
name: "wrangler notifier and monitor",
|
|
41
|
+
setup(pluginBuild) {
|
|
42
|
+
pluginBuild.onEnd((result) => {
|
|
43
|
+
if (result.errors.length > 0) {
|
|
44
|
+
console.error(
|
|
45
|
+
`${result.errors.length} error(s) and ${result.warnings.length} warning(s) when compiling Worker.`
|
|
46
|
+
);
|
|
47
|
+
} else if (result.warnings.length > 0) {
|
|
48
|
+
console.warn(
|
|
49
|
+
`${result.warnings.length} warning(s) when compiling Worker.`
|
|
50
|
+
);
|
|
51
|
+
onEnd();
|
|
52
|
+
} else {
|
|
53
|
+
console.log("Compiled Worker successfully.");
|
|
54
|
+
onEnd();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "Assets",
|
|
61
|
+
setup(pluginBuild) {
|
|
62
|
+
if (pluginBuild.initialOptions.outfile) {
|
|
63
|
+
const outdir = dirname(pluginBuild.initialOptions.outfile);
|
|
64
|
+
|
|
65
|
+
pluginBuild.onResolve({ filter: /^assets:/ }, async (args) => {
|
|
66
|
+
const directory = resolve(
|
|
67
|
+
args.resolveDir,
|
|
68
|
+
args.path.slice("assets:".length)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
const exists = await access(directory)
|
|
72
|
+
.then(() => true)
|
|
73
|
+
.catch(() => false);
|
|
74
|
+
|
|
75
|
+
const isDirectory =
|
|
76
|
+
exists && (await lstat(directory)).isDirectory();
|
|
77
|
+
|
|
78
|
+
if (!isDirectory) {
|
|
79
|
+
return {
|
|
80
|
+
errors: [
|
|
81
|
+
{
|
|
82
|
+
text: `'${directory}' does not exist or is not a directory.`,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const path = `assets:./${relative(outdir, directory)}`;
|
|
89
|
+
|
|
90
|
+
return { path, external: true, namespace: "assets" };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
...(nodeCompat
|
|
96
|
+
? [
|
|
97
|
+
NodeGlobalsPolyfills({
|
|
98
|
+
buffer: true,
|
|
99
|
+
}),
|
|
100
|
+
NodeModulesPolyfills(),
|
|
101
|
+
]
|
|
102
|
+
: []),
|
|
103
|
+
],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { access, cp, lstat, rm } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import NodeGlobalsPolyfills from "@esbuild-plugins/node-globals-polyfill";
|
|
4
|
+
import NodeModulesPolyfills from "@esbuild-plugins/node-modules-polyfill";
|
|
2
5
|
import { build } from "esbuild";
|
|
6
|
+
import { nanoid } from "nanoid";
|
|
3
7
|
|
|
4
8
|
type Options = {
|
|
5
9
|
routesModule: string;
|
|
@@ -9,6 +13,8 @@ type Options = {
|
|
|
9
13
|
fallbackService?: string;
|
|
10
14
|
watch?: boolean;
|
|
11
15
|
onEnd?: () => void;
|
|
16
|
+
buildOutputDirectory?: string;
|
|
17
|
+
nodeCompat?: boolean;
|
|
12
18
|
};
|
|
13
19
|
|
|
14
20
|
export function buildWorker({
|
|
@@ -19,11 +25,11 @@ export function buildWorker({
|
|
|
19
25
|
fallbackService = "ASSETS",
|
|
20
26
|
watch = false,
|
|
21
27
|
onEnd = () => {},
|
|
28
|
+
buildOutputDirectory,
|
|
29
|
+
nodeCompat,
|
|
22
30
|
}: Options) {
|
|
23
31
|
return build({
|
|
24
|
-
entryPoints: [
|
|
25
|
-
path.resolve(__dirname, "../pages/functions/template-worker.ts"),
|
|
26
|
-
],
|
|
32
|
+
entryPoints: [resolve(__dirname, "../pages/functions/template-worker.ts")],
|
|
27
33
|
inject: [routesModule],
|
|
28
34
|
bundle: true,
|
|
29
35
|
format: "esm",
|
|
@@ -35,6 +41,7 @@ export function buildWorker({
|
|
|
35
41
|
allowOverwrite: true,
|
|
36
42
|
define: {
|
|
37
43
|
__FALLBACK_SERVICE__: JSON.stringify(fallbackService),
|
|
44
|
+
...(nodeCompat ? { global: "globalThis" } : {}),
|
|
38
45
|
},
|
|
39
46
|
plugins: [
|
|
40
47
|
{
|
|
@@ -57,6 +64,88 @@ export function buildWorker({
|
|
|
57
64
|
});
|
|
58
65
|
},
|
|
59
66
|
},
|
|
67
|
+
{
|
|
68
|
+
name: "Assets",
|
|
69
|
+
setup(pluginBuild) {
|
|
70
|
+
const identifiers = new Map<string, string>();
|
|
71
|
+
|
|
72
|
+
pluginBuild.onResolve({ filter: /^assets:/ }, async (args) => {
|
|
73
|
+
const directory = resolve(
|
|
74
|
+
args.resolveDir,
|
|
75
|
+
args.path.slice("assets:".length)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const exists = await access(directory)
|
|
79
|
+
.then(() => true)
|
|
80
|
+
.catch(() => false);
|
|
81
|
+
|
|
82
|
+
const isDirectory =
|
|
83
|
+
exists && (await lstat(directory)).isDirectory();
|
|
84
|
+
|
|
85
|
+
if (!isDirectory) {
|
|
86
|
+
return {
|
|
87
|
+
errors: [
|
|
88
|
+
{
|
|
89
|
+
text: `'${directory}' does not exist or is not a directory.`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// TODO: Consider hashing the contents rather than using a unique identifier every time?
|
|
96
|
+
identifiers.set(directory, nanoid());
|
|
97
|
+
if (!buildOutputDirectory) {
|
|
98
|
+
console.warn(
|
|
99
|
+
"You're attempting to import static assets as part of your Pages Functions, but have not specified a directory in which to put them. You must use 'wrangler pages dev <directory>' rather than 'wrangler pages dev -- <command>' to import static assets in Functions."
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return { path: directory, namespace: "assets" };
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
pluginBuild.onLoad(
|
|
106
|
+
{ filter: /.*/, namespace: "assets" },
|
|
107
|
+
async (args) => {
|
|
108
|
+
const identifier = identifiers.get(args.path);
|
|
109
|
+
|
|
110
|
+
if (buildOutputDirectory) {
|
|
111
|
+
const staticAssetsOutputDirectory = join(
|
|
112
|
+
buildOutputDirectory,
|
|
113
|
+
"cdn-cgi",
|
|
114
|
+
"pages-plugins",
|
|
115
|
+
identifier as string
|
|
116
|
+
);
|
|
117
|
+
await rm(staticAssetsOutputDirectory, {
|
|
118
|
+
force: true,
|
|
119
|
+
recursive: true,
|
|
120
|
+
});
|
|
121
|
+
await cp(args.path, staticAssetsOutputDirectory, {
|
|
122
|
+
force: true,
|
|
123
|
+
recursive: true,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
// TODO: Watch args.path for changes and re-copy when updated
|
|
128
|
+
contents: `export const onRequest = ({ request, env, functionPath }) => {
|
|
129
|
+
const url = new URL(request.url)
|
|
130
|
+
const relativePathname = \`/\${url.pathname.split(functionPath)[1] || ''}\`.replace(/^\\/\\//, '/');
|
|
131
|
+
url.pathname = '/cdn-cgi/pages-plugins/${identifier}' + relativePathname
|
|
132
|
+
request = new Request(url.toString(), request)
|
|
133
|
+
return env.ASSETS.fetch(request)
|
|
134
|
+
}`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
...(nodeCompat
|
|
142
|
+
? [
|
|
143
|
+
NodeGlobalsPolyfills({
|
|
144
|
+
buffer: true,
|
|
145
|
+
}),
|
|
146
|
+
NodeModulesPolyfills(),
|
|
147
|
+
]
|
|
148
|
+
: []),
|
|
60
149
|
],
|
|
61
150
|
});
|
|
62
151
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { writeFileSync } from "fs";
|
|
1
|
+
import { writeFileSync, mkdirSync } from "fs";
|
|
2
2
|
import { runInTempDir } from "../../src/__tests__/helpers/run-in-tmp";
|
|
3
3
|
import { toUrlPath } from "../../src/paths";
|
|
4
4
|
import { compareRoutes, generateConfigFromFileTree } from "./filepath-routing";
|
|
@@ -83,34 +83,144 @@ describe("filepath-routing", () => {
|
|
|
83
83
|
`
|
|
84
84
|
);
|
|
85
85
|
|
|
86
|
+
mkdirSync("todos");
|
|
87
|
+
|
|
88
|
+
writeFileSync(
|
|
89
|
+
"todos/[id].ts",
|
|
90
|
+
`
|
|
91
|
+
export function onRequestPost() {}
|
|
92
|
+
export function onRequestDelete() {}
|
|
93
|
+
`
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
mkdirSync("authors");
|
|
97
|
+
mkdirSync("authors/[authorId]");
|
|
98
|
+
mkdirSync("authors/[authorId]/todos");
|
|
99
|
+
|
|
100
|
+
writeFileSync(
|
|
101
|
+
"authors/[authorId]/todos/[todoId].ts",
|
|
102
|
+
`
|
|
103
|
+
export function onRequestPost() {}
|
|
104
|
+
`
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
mkdirSync("books");
|
|
108
|
+
|
|
109
|
+
writeFileSync(
|
|
110
|
+
"books/[[title]].ts",
|
|
111
|
+
`
|
|
112
|
+
export function onRequestPost() {}
|
|
113
|
+
`
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
mkdirSync("cats");
|
|
117
|
+
mkdirSync("cats/[[breed]]");
|
|
118
|
+
|
|
119
|
+
writeFileSync(
|
|
120
|
+
"cats/[[breed]]/blah.ts",
|
|
121
|
+
`
|
|
122
|
+
export function onRequestPost() {}
|
|
123
|
+
`
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// This won't actually work at runtime.
|
|
127
|
+
writeFileSync(
|
|
128
|
+
"cats/[[breed]]/[[name]].ts",
|
|
129
|
+
`
|
|
130
|
+
export function onRequestPost() {}
|
|
131
|
+
`
|
|
132
|
+
);
|
|
133
|
+
|
|
86
134
|
const entries = await generateConfigFromFileTree({
|
|
87
135
|
baseDir: ".",
|
|
88
136
|
baseURL: "/base" as UrlPath,
|
|
89
137
|
});
|
|
90
|
-
expect(entries).
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
138
|
+
expect(entries).toMatchInlineSnapshot(`
|
|
139
|
+
Object {
|
|
140
|
+
"routes": Array [
|
|
141
|
+
Object {
|
|
142
|
+
"method": "POST",
|
|
143
|
+
"module": Array [
|
|
144
|
+
"authors/[authorId]/todos/[todoId].ts:onRequestPost",
|
|
145
|
+
],
|
|
146
|
+
"mountPath": "/base/authors/:authorId/todos",
|
|
147
|
+
"routePath": "/base/authors/:authorId/todos/:todoId",
|
|
148
|
+
},
|
|
149
|
+
Object {
|
|
150
|
+
"method": "POST",
|
|
151
|
+
"module": Array [
|
|
152
|
+
"cats/[[breed]]/blah.ts:onRequestPost",
|
|
153
|
+
],
|
|
154
|
+
"mountPath": "/base/cats/:breed*",
|
|
155
|
+
"routePath": "/base/cats/:breed*/blah",
|
|
156
|
+
},
|
|
157
|
+
Object {
|
|
158
|
+
"method": "POST",
|
|
159
|
+
"module": Array [
|
|
160
|
+
"cats/[[breed]]/[[name]].ts:onRequestPost",
|
|
161
|
+
],
|
|
162
|
+
"mountPath": "/base/cats/:breed*",
|
|
163
|
+
"routePath": "/base/cats/:breed*/:name*",
|
|
164
|
+
},
|
|
165
|
+
Object {
|
|
166
|
+
"method": "DELETE",
|
|
167
|
+
"module": Array [
|
|
168
|
+
"todos/[id].ts:onRequestDelete",
|
|
169
|
+
],
|
|
170
|
+
"mountPath": "/base/todos",
|
|
171
|
+
"routePath": "/base/todos/:id",
|
|
172
|
+
},
|
|
173
|
+
Object {
|
|
174
|
+
"method": "POST",
|
|
175
|
+
"module": Array [
|
|
176
|
+
"todos/[id].ts:onRequestPost",
|
|
177
|
+
],
|
|
178
|
+
"mountPath": "/base/todos",
|
|
179
|
+
"routePath": "/base/todos/:id",
|
|
180
|
+
},
|
|
181
|
+
Object {
|
|
182
|
+
"method": "POST",
|
|
183
|
+
"module": Array [
|
|
184
|
+
"books/[[title]].ts:onRequestPost",
|
|
185
|
+
],
|
|
186
|
+
"mountPath": "/base/books",
|
|
187
|
+
"routePath": "/base/books/:title*",
|
|
188
|
+
},
|
|
189
|
+
Object {
|
|
190
|
+
"method": "DELETE",
|
|
191
|
+
"module": Array [
|
|
192
|
+
"bar.ts:onRequestDelete",
|
|
193
|
+
],
|
|
194
|
+
"mountPath": "/base/",
|
|
195
|
+
"routePath": "/base/bar",
|
|
196
|
+
},
|
|
197
|
+
Object {
|
|
198
|
+
"method": "PUT",
|
|
199
|
+
"module": Array [
|
|
200
|
+
"bar.ts:onRequestPut",
|
|
201
|
+
],
|
|
202
|
+
"mountPath": "/base/",
|
|
203
|
+
"routePath": "/base/bar",
|
|
204
|
+
},
|
|
205
|
+
Object {
|
|
206
|
+
"method": "GET",
|
|
207
|
+
"module": Array [
|
|
208
|
+
"foo.ts:onRequestGet",
|
|
209
|
+
],
|
|
210
|
+
"mountPath": "/base/",
|
|
211
|
+
"routePath": "/base/foo",
|
|
212
|
+
},
|
|
213
|
+
Object {
|
|
214
|
+
"method": "POST",
|
|
215
|
+
"module": Array [
|
|
216
|
+
"foo.ts:onRequestPost",
|
|
217
|
+
],
|
|
218
|
+
"mountPath": "/base/",
|
|
219
|
+
"routePath": "/base/foo",
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
}
|
|
223
|
+
`);
|
|
114
224
|
});
|
|
115
225
|
});
|
|
116
226
|
});
|
|
@@ -118,6 +228,7 @@ describe("filepath-routing", () => {
|
|
|
118
228
|
function routeConfig(routePath: string, method?: string): RouteConfig {
|
|
119
229
|
return {
|
|
120
230
|
routePath: toUrlPath(routePath),
|
|
231
|
+
mountPath: toUrlPath("/"),
|
|
121
232
|
method: method as HTTPMethod,
|
|
122
233
|
};
|
|
123
234
|
}
|
|
@@ -53,6 +53,7 @@ export async function generateConfigFromFileTree({
|
|
|
53
53
|
let routePath = path
|
|
54
54
|
.relative(baseDir, filepath)
|
|
55
55
|
.slice(0, -ext.length);
|
|
56
|
+
let mountPath = path.dirname(routePath);
|
|
56
57
|
|
|
57
58
|
if (isIndexFile || isMiddlewareFile) {
|
|
58
59
|
routePath = path.dirname(routePath);
|
|
@@ -61,17 +62,27 @@ export async function generateConfigFromFileTree({
|
|
|
61
62
|
if (routePath === ".") {
|
|
62
63
|
routePath = "";
|
|
63
64
|
}
|
|
65
|
+
if (mountPath === ".") {
|
|
66
|
+
mountPath = "";
|
|
67
|
+
}
|
|
64
68
|
|
|
65
69
|
routePath = `${baseURL}/${routePath}`;
|
|
70
|
+
mountPath = `${baseURL}/${mountPath}`;
|
|
71
|
+
|
|
72
|
+
routePath = routePath.replace(/\[\[([^\]]+)\]\]/g, ":$1*"); // transform [[id]] => :id*
|
|
73
|
+
routePath = routePath.replaceAll(/\[([^\]]+)\]/g, ":$1"); // transform [id] => :id
|
|
74
|
+
mountPath = mountPath.replace(/\[\[([^\]]+)\]\]/g, ":$1*"); // transform [[id]] => :id*
|
|
75
|
+
mountPath = mountPath.replaceAll(/\[([^\]]+)\]/g, ":$1"); // transform [id] => :id
|
|
66
76
|
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
// These are used as module specifiers so UrlPaths are okay to use even on Windows
|
|
78
|
+
const modulePath = toUrlPath(path.relative(baseDir, filepath));
|
|
69
79
|
|
|
70
80
|
const routeEntry: RouteConfig = {
|
|
71
81
|
routePath: toUrlPath(routePath),
|
|
82
|
+
mountPath: toUrlPath(mountPath),
|
|
72
83
|
method: method.toUpperCase() as HTTPMethod,
|
|
73
84
|
[isMiddlewareFile ? "middleware" : "module"]: [
|
|
74
|
-
`${
|
|
85
|
+
`${modulePath}:${exportName}`,
|
|
75
86
|
],
|
|
76
87
|
};
|
|
77
88
|
|
|
@@ -21,6 +21,7 @@ export function isHTTPMethod(
|
|
|
21
21
|
|
|
22
22
|
export type RoutesCollection = Array<{
|
|
23
23
|
routePath: UrlPath;
|
|
24
|
+
mountPath: UrlPath;
|
|
24
25
|
method?: HTTPMethod;
|
|
25
26
|
modules: string[];
|
|
26
27
|
middlewares: string[];
|
|
@@ -33,6 +34,7 @@ export type Config = {
|
|
|
33
34
|
|
|
34
35
|
export type RouteConfig = {
|
|
35
36
|
routePath: UrlPath;
|
|
37
|
+
mountPath: UrlPath;
|
|
36
38
|
method?: HTTPMethod;
|
|
37
39
|
middleware?: string | string[];
|
|
38
40
|
module?: string | string[];
|
|
@@ -113,9 +115,11 @@ export function parseConfig(config: Config, baseDir: string) {
|
|
|
113
115
|
});
|
|
114
116
|
}
|
|
115
117
|
|
|
116
|
-
for (const { routePath, method, ...props } of config.routes ??
|
|
118
|
+
for (const { routePath, mountPath, method, ...props } of config.routes ??
|
|
119
|
+
[]) {
|
|
117
120
|
routes.push({
|
|
118
121
|
routePath,
|
|
122
|
+
mountPath,
|
|
119
123
|
method,
|
|
120
124
|
middlewares: parseModuleIdentifiers(props.middleware),
|
|
121
125
|
modules: parseModuleIdentifiers(props.module),
|
|
@@ -141,6 +145,7 @@ export const routes = [
|
|
|
141
145
|
.map(
|
|
142
146
|
(route) => ` {
|
|
143
147
|
routePath: "${route.routePath}",
|
|
148
|
+
mountPath: "${route.mountPath}",
|
|
144
149
|
method: "${route.method}",
|
|
145
150
|
middlewares: [${route.middlewares.join(", ")}],
|
|
146
151
|
modules: [${route.modules.join(", ")}],
|