@samebase/convex-hosting 0.3.2 → 0.4.0
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/CHANGELOG.md +10 -134
- package/README.md +136 -398
- package/dist/cli/convex.d.ts +63 -0
- package/dist/cli/convex.js +108 -0
- package/dist/cli/convex.js.map +1 -0
- package/dist/cli/files.d.ts +18 -0
- package/dist/cli/files.js +106 -0
- package/dist/cli/files.js.map +1 -0
- package/dist/cli/index.d.ts +1 -11
- package/dist/cli/index.js +3 -58
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +346 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/client/index.d.ts +8 -115
- package/dist/client/index.js +65 -242
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts +5 -0
- package/dist/client/version-module.d.ts +6 -0
- package/dist/component/_generated/api.d.ts +0 -5
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +20 -18
- package/dist/component/_generated/dataModel.d.ts +0 -1
- package/dist/component/_generated/server.d.ts +12 -1
- package/dist/component/_generated/server.js +2 -0
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/convex.config.d.ts +0 -1
- package/dist/component/lib.d.ts +175 -156
- package/dist/component/lib.js +396 -710
- package/dist/component/lib.js.map +1 -1
- package/dist/component/schema.d.ts +76 -72
- package/dist/component/schema.js +35 -59
- package/dist/component/schema.js.map +1 -1
- package/dist/workers-shared/asset-worker/src/analytics.d.ts +39 -0
- package/dist/workers-shared/asset-worker/src/analytics.js +86 -0
- package/dist/workers-shared/asset-worker/src/analytics.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/compatibility-flags.d.ts +19 -0
- package/dist/workers-shared/asset-worker/src/compatibility-flags.js +29 -0
- package/dist/workers-shared/asset-worker/src/compatibility-flags.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/configuration.d.ts +3 -0
- package/dist/workers-shared/asset-worker/src/configuration.js +30 -0
- package/dist/workers-shared/asset-worker/src/configuration.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/constants.d.ts +1 -0
- package/dist/workers-shared/asset-worker/src/constants.js +3 -0
- package/dist/workers-shared/asset-worker/src/constants.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/handler.d.ts +28 -0
- package/dist/workers-shared/asset-worker/src/handler.js +717 -0
- package/dist/workers-shared/asset-worker/src/handler.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/types.d.ts +13 -0
- package/dist/workers-shared/asset-worker/src/types.js +2 -0
- package/dist/workers-shared/asset-worker/src/types.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/utils/base-path.d.ts +29 -0
- package/dist/workers-shared/asset-worker/src/utils/base-path.js +56 -0
- package/dist/workers-shared/asset-worker/src/utils/base-path.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/utils/headers.d.ts +11 -0
- package/dist/workers-shared/asset-worker/src/utils/headers.js +77 -0
- package/dist/workers-shared/asset-worker/src/utils/headers.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/utils/rules-engine.d.ts +23 -0
- package/dist/workers-shared/asset-worker/src/utils/rules-engine.js +133 -0
- package/dist/workers-shared/asset-worker/src/utils/rules-engine.js.map +1 -0
- package/dist/workers-shared/asset-worker/src/worker.d.ts +14 -0
- package/dist/workers-shared/asset-worker/src/worker.js +12 -0
- package/dist/workers-shared/asset-worker/src/worker.js.map +1 -0
- package/dist/workers-shared/utils/base-path.d.ts +32 -0
- package/dist/workers-shared/utils/base-path.js +94 -0
- package/dist/workers-shared/utils/base-path.js.map +1 -0
- package/dist/workers-shared/utils/configuration/constants.d.ts +15 -0
- package/dist/workers-shared/utils/configuration/constants.js +16 -0
- package/dist/workers-shared/utils/configuration/constants.js.map +1 -0
- package/dist/workers-shared/utils/configuration/constructConfiguration.d.ts +12 -0
- package/dist/workers-shared/utils/configuration/constructConfiguration.js +103 -0
- package/dist/workers-shared/utils/configuration/constructConfiguration.js.map +1 -0
- package/dist/workers-shared/utils/configuration/parseHeaders.d.ts +5 -0
- package/dist/workers-shared/utils/configuration/parseHeaders.js +181 -0
- package/dist/workers-shared/utils/configuration/parseHeaders.js.map +1 -0
- package/dist/workers-shared/utils/configuration/parseRedirects.d.ts +8 -0
- package/dist/workers-shared/utils/configuration/parseRedirects.js +129 -0
- package/dist/workers-shared/utils/configuration/parseRedirects.js.map +1 -0
- package/dist/workers-shared/utils/configuration/parseStaticRouting.d.ts +2 -0
- package/dist/workers-shared/utils/configuration/parseStaticRouting.js +94 -0
- package/dist/workers-shared/utils/configuration/parseStaticRouting.js.map +1 -0
- package/dist/workers-shared/utils/configuration/types.d.ts +38 -0
- package/dist/workers-shared/utils/configuration/types.js +2 -0
- package/dist/workers-shared/utils/configuration/types.js.map +1 -0
- package/dist/workers-shared/utils/configuration/validateURL.d.ts +3 -0
- package/dist/workers-shared/utils/configuration/validateURL.js +56 -0
- package/dist/workers-shared/utils/configuration/validateURL.js.map +1 -0
- package/dist/workers-shared/utils/constants.d.ts +28 -0
- package/dist/workers-shared/utils/constants.js +34 -0
- package/dist/workers-shared/utils/constants.js.map +1 -0
- package/dist/workers-shared/utils/helpers.d.ts +22 -0
- package/dist/workers-shared/utils/helpers.js +73 -0
- package/dist/workers-shared/utils/helpers.js.map +1 -0
- package/dist/workers-shared/utils/responses.d.ts +43 -0
- package/dist/workers-shared/utils/responses.js +125 -0
- package/dist/workers-shared/utils/responses.js.map +1 -0
- package/dist/workers-shared/utils/tracing.d.ts +3 -0
- package/dist/workers-shared/utils/tracing.js +29 -0
- package/dist/workers-shared/utils/tracing.js.map +1 -0
- package/dist/workers-shared/utils/types.d.ts +131 -0
- package/dist/workers-shared/utils/types.js +72 -0
- package/dist/workers-shared/utils/types.js.map +1 -0
- package/package.json +16 -32
- package/INTEGRATION.md +0 -399
- package/dist/cli/args.d.ts +0 -28
- package/dist/cli/args.d.ts.map +0 -1
- package/dist/cli/args.js +0 -148
- package/dist/cli/args.js.map +0 -1
- package/dist/cli/argumentChunks.d.ts +0 -3
- package/dist/cli/argumentChunks.d.ts.map +0 -1
- package/dist/cli/argumentChunks.js +0 -29
- package/dist/cli/argumentChunks.js.map +0 -1
- package/dist/cli/collectFiles.d.ts +0 -10
- package/dist/cli/collectFiles.d.ts.map +0 -1
- package/dist/cli/collectFiles.js +0 -53
- package/dist/cli/collectFiles.js.map +0 -1
- package/dist/cli/commands.d.ts +0 -8
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -56
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/componentName.d.ts +0 -32
- package/dist/cli/componentName.d.ts.map +0 -1
- package/dist/cli/componentName.js +0 -43
- package/dist/cli/componentName.js.map +0 -1
- package/dist/cli/deploy.d.ts +0 -16
- package/dist/cli/deploy.d.ts.map +0 -1
- package/dist/cli/deploy.js +0 -283
- package/dist/cli/deploy.js.map +0 -1
- package/dist/cli/deployEnvironment.d.ts +0 -10
- package/dist/cli/deployEnvironment.d.ts.map +0 -1
- package/dist/cli/deployEnvironment.js +0 -12
- package/dist/cli/deployEnvironment.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/upload.d.ts +0 -22
- package/dist/cli/upload.d.ts.map +0 -1
- package/dist/cli/upload.js +0 -630
- package/dist/cli/upload.js.map +0 -1
- package/dist/client/_generated/_ignore.d.ts +0 -1
- package/dist/client/_generated/_ignore.d.ts.map +0 -1
- package/dist/client/_generated/_ignore.js +0 -3
- package/dist/client/_generated/_ignore.js.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/component/_generated/api.d.ts.map +0 -1
- package/dist/component/_generated/component.d.ts.map +0 -1
- package/dist/component/_generated/dataModel.d.ts.map +0 -1
- package/dist/component/_generated/server.d.ts.map +0 -1
- package/dist/component/convex.config.d.ts.map +0 -1
- package/dist/component/http.d.ts +0 -4
- package/dist/component/http.d.ts.map +0 -1
- package/dist/component/http.js +0 -113
- package/dist/component/http.js.map +0 -1
- package/dist/component/lib.d.ts.map +0 -1
- package/dist/component/schema.d.ts.map +0 -1
- package/dist/component/serving.d.ts +0 -23
- package/dist/component/serving.d.ts.map +0 -1
- package/dist/component/serving.js +0 -161
- package/dist/component/serving.js.map +0 -1
- package/dist/react/index.d.ts +0 -59
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js +0 -137
- package/dist/react/index.js.map +0 -1
- package/src/cli/args.test.ts +0 -79
- package/src/cli/args.ts +0 -153
- package/src/cli/argumentChunks.test.ts +0 -27
- package/src/cli/argumentChunks.ts +0 -40
- package/src/cli/collectFiles.test.ts +0 -26
- package/src/cli/collectFiles.ts +0 -59
- package/src/cli/commands.ts +0 -68
- package/src/cli/componentName.test.ts +0 -41
- package/src/cli/componentName.ts +0 -46
- package/src/cli/deploy.ts +0 -336
- package/src/cli/deployEnvironment.test.ts +0 -27
- package/src/cli/deployEnvironment.ts +0 -17
- package/src/cli/index.ts +0 -65
- package/src/cli/upload.ts +0 -837
- package/src/client/_generated/_ignore.ts +0 -1
- package/src/client/index.test.ts +0 -549
- package/src/client/index.ts +0 -344
- package/src/client/setup.test.ts +0 -22
- package/src/component/_generated/api.ts +0 -54
- package/src/component/_generated/component.ts +0 -55
- package/src/component/_generated/dataModel.ts +0 -60
- package/src/component/_generated/server.ts +0 -156
- package/src/component/convex.config.ts +0 -3
- package/src/component/http.test.ts +0 -254
- package/src/component/http.ts +0 -133
- package/src/component/lib.test.ts +0 -1007
- package/src/component/lib.ts +0 -862
- package/src/component/schema.ts +0 -75
- package/src/component/serving.ts +0 -170
- package/src/component/setup.test.ts +0 -11
- package/src/react/index.tsx +0 -197
- package/src/test.ts +0 -23
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,yDAAyD;AACzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AssetConfig } from "../types.js";
|
|
2
|
+
import type { Logger, ParsedHeaders, ParsedRedirects } from "./types.js";
|
|
3
|
+
export declare function constructRedirects({ redirects, redirectsFile, logger, }: {
|
|
4
|
+
redirects?: ParsedRedirects;
|
|
5
|
+
redirectsFile?: string;
|
|
6
|
+
logger: Logger;
|
|
7
|
+
}): Pick<AssetConfig, "redirects">;
|
|
8
|
+
export declare function constructHeaders({ headers, headersFile, logger, }: {
|
|
9
|
+
headers?: ParsedHeaders;
|
|
10
|
+
headersFile?: string;
|
|
11
|
+
logger: Logger;
|
|
12
|
+
}): Pick<AssetConfig, "headers">;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { relative } from "node:path";
|
|
2
|
+
import { HEADERS_VERSION, PLACEHOLDER_REGEX, REDIRECTS_VERSION, SPLAT_REGEX, } from "./constants.js";
|
|
3
|
+
export function constructRedirects({ redirects, redirectsFile, logger, }) {
|
|
4
|
+
if (!redirects) {
|
|
5
|
+
return {};
|
|
6
|
+
}
|
|
7
|
+
const num_valid = redirects.rules.length;
|
|
8
|
+
const num_invalid = redirects.invalid.length;
|
|
9
|
+
// exhaustive check, since we could not have parsed `redirects` out of
|
|
10
|
+
// a non-existing redirects file
|
|
11
|
+
const redirectsRelativePath = redirectsFile
|
|
12
|
+
? relative(process.cwd(), redirectsFile)
|
|
13
|
+
: "";
|
|
14
|
+
logger.log(`✨ Parsed ${num_valid} valid redirect rule${num_valid === 1 ? "" : "s"}.`);
|
|
15
|
+
if (num_invalid > 0) {
|
|
16
|
+
let invalidRedirectRulesList = ``;
|
|
17
|
+
for (const { line, lineNumber, message } of redirects.invalid) {
|
|
18
|
+
invalidRedirectRulesList += `▶︎ ${message}\n`;
|
|
19
|
+
if (line) {
|
|
20
|
+
invalidRedirectRulesList += ` at ${redirectsRelativePath}${lineNumber ? `:${lineNumber}` : ""} | ${line}\n\n`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
logger.warn(`Found ${num_invalid} invalid redirect rule${num_invalid === 1 ? "" : "s"}:\n` +
|
|
24
|
+
`${invalidRedirectRulesList}`);
|
|
25
|
+
}
|
|
26
|
+
/* Better to return no Redirects object at all than one with empty rules */
|
|
27
|
+
if (num_valid === 0) {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
const staticRedirects = {};
|
|
31
|
+
const dynamicRedirects = {};
|
|
32
|
+
let canCreateStaticRule = true;
|
|
33
|
+
for (const rule of redirects.rules) {
|
|
34
|
+
if (!rule.from.match(SPLAT_REGEX) && !rule.from.match(PLACEHOLDER_REGEX)) {
|
|
35
|
+
if (canCreateStaticRule) {
|
|
36
|
+
staticRedirects[rule.from] = {
|
|
37
|
+
status: rule.status,
|
|
38
|
+
to: rule.to,
|
|
39
|
+
lineNumber: rule.lineNumber,
|
|
40
|
+
};
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
logger.info(`The redirect rule ${rule.from} → ${rule.status} ${rule.to} could be made more performant by bringing it above any lines with splats or placeholders.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
dynamicRedirects[rule.from] = { status: rule.status, to: rule.to };
|
|
48
|
+
canCreateStaticRule = false;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
redirects: {
|
|
52
|
+
version: REDIRECTS_VERSION,
|
|
53
|
+
staticRules: staticRedirects,
|
|
54
|
+
rules: dynamicRedirects,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function constructHeaders({ headers, headersFile, logger, }) {
|
|
59
|
+
if (!headers) {
|
|
60
|
+
return {};
|
|
61
|
+
}
|
|
62
|
+
const num_valid = headers.rules.length;
|
|
63
|
+
const num_invalid = headers.invalid.length;
|
|
64
|
+
// exhaustive check, since we could not have parsed `headers` out of
|
|
65
|
+
// a non-existing headers file
|
|
66
|
+
const headersRelativePath = headersFile
|
|
67
|
+
? relative(process.cwd(), headersFile)
|
|
68
|
+
: "";
|
|
69
|
+
logger.log(`✨ Parsed ${num_valid} valid header rule${num_valid === 1 ? "" : "s"}.`);
|
|
70
|
+
if (num_invalid > 0) {
|
|
71
|
+
let invalidHeaderRulesList = ``;
|
|
72
|
+
for (const { line, lineNumber, message } of headers.invalid) {
|
|
73
|
+
invalidHeaderRulesList += `▶︎ ${message}\n`;
|
|
74
|
+
if (line) {
|
|
75
|
+
invalidHeaderRulesList += ` at ${headersRelativePath}${lineNumber ? `:${lineNumber}` : ""} | ${line}\n\n`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
logger.warn(`Found ${num_invalid} invalid header rule${num_invalid === 1 ? "" : "s"}:\n` +
|
|
79
|
+
`${invalidHeaderRulesList}`);
|
|
80
|
+
}
|
|
81
|
+
/* Better to return no Headers object at all than one with empty rules */
|
|
82
|
+
if (num_valid === 0) {
|
|
83
|
+
return {};
|
|
84
|
+
}
|
|
85
|
+
const rules = {};
|
|
86
|
+
for (const rule of headers.rules) {
|
|
87
|
+
const configuredRule = {};
|
|
88
|
+
if (Object.keys(rule.headers).length) {
|
|
89
|
+
configuredRule.set = rule.headers;
|
|
90
|
+
}
|
|
91
|
+
if (rule.unsetHeaders.length) {
|
|
92
|
+
configuredRule.unset = rule.unsetHeaders;
|
|
93
|
+
}
|
|
94
|
+
rules[rule.path] = configuredRule;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
headers: {
|
|
98
|
+
version: HEADERS_VERSION,
|
|
99
|
+
rules,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=constructConfiguration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructConfiguration.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/constructConfiguration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { HEADER_SEPARATOR, MAX_HEADER_RULES, MAX_LINE_LENGTH, SPLAT_REGEX, UNSET_OPERATOR, } from "./constants.js";
|
|
2
|
+
import { validateUrl } from "./validateURL.js";
|
|
3
|
+
// Not strictly necessary to check for all protocols-like beginnings, since _technically_ that could be a legit header (e.g. name=http, value=://I'm a value).
|
|
4
|
+
// But we're checking here since some people might be caught out and it'll help 99.9% of people who get it wrong.
|
|
5
|
+
// We do the proper validation in `validateUrl` anyway :)
|
|
6
|
+
const LINE_IS_PROBABLY_A_PATH = new RegExp(/^([^\s]+:\/\/|^\/)/);
|
|
7
|
+
export function parseHeaders(input, { maxRules = MAX_HEADER_RULES, maxLineLength = MAX_LINE_LENGTH, } = {}) {
|
|
8
|
+
const lines = input.split("\n");
|
|
9
|
+
const rules = [];
|
|
10
|
+
const invalid = [];
|
|
11
|
+
let rule = undefined;
|
|
12
|
+
// When a path line is rejected (invalid URL, multiple wildcards, etc.),
|
|
13
|
+
// we silently skip subsequent header lines until the next path line
|
|
14
|
+
// rather than emitting confusing "Path should come before header" errors.
|
|
15
|
+
let skipUntilNextPath = false;
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
const line = (lines[i] || "").trim();
|
|
18
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (line.length > maxLineLength) {
|
|
22
|
+
invalid.push({
|
|
23
|
+
message: `Ignoring line ${i + 1} as it exceeds the maximum allowed length of ${maxLineLength}.`,
|
|
24
|
+
});
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (LINE_IS_PROBABLY_A_PATH.test(line)) {
|
|
28
|
+
skipUntilNextPath = false;
|
|
29
|
+
if (rules.length >= maxRules) {
|
|
30
|
+
invalid.push({
|
|
31
|
+
message: `Maximum number of rules supported is ${maxRules}. Skipping remaining ${lines.length - i} lines of file.`,
|
|
32
|
+
});
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (rule) {
|
|
36
|
+
if (isValidRule(rule)) {
|
|
37
|
+
rules.push({
|
|
38
|
+
path: rule.path,
|
|
39
|
+
headers: rule.headers,
|
|
40
|
+
unsetHeaders: rule.unsetHeaders,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
invalid.push({
|
|
45
|
+
line: rule.line,
|
|
46
|
+
lineNumber: i + 1,
|
|
47
|
+
message: "No headers specified",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const [path, pathError] = validateUrl(line, false, true);
|
|
52
|
+
if (pathError) {
|
|
53
|
+
invalid.push({
|
|
54
|
+
line,
|
|
55
|
+
lineNumber: i + 1,
|
|
56
|
+
message: pathError,
|
|
57
|
+
});
|
|
58
|
+
rule = undefined;
|
|
59
|
+
skipUntilNextPath = true;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const wildcardError = validateNoMultipleWildcards(path);
|
|
63
|
+
if (wildcardError) {
|
|
64
|
+
invalid.push({
|
|
65
|
+
line,
|
|
66
|
+
lineNumber: i + 1,
|
|
67
|
+
message: wildcardError,
|
|
68
|
+
});
|
|
69
|
+
rule = undefined;
|
|
70
|
+
skipUntilNextPath = true;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
rule = {
|
|
74
|
+
path: path,
|
|
75
|
+
line,
|
|
76
|
+
headers: {},
|
|
77
|
+
unsetHeaders: [],
|
|
78
|
+
};
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (skipUntilNextPath) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (!line.includes(HEADER_SEPARATOR)) {
|
|
85
|
+
if (!rule) {
|
|
86
|
+
invalid.push({
|
|
87
|
+
line,
|
|
88
|
+
lineNumber: i + 1,
|
|
89
|
+
message: "Expected a path beginning with at least one forward-slash",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (line.trim().startsWith(UNSET_OPERATOR)) {
|
|
94
|
+
rule.unsetHeaders.push(line.trim().replace(UNSET_OPERATOR, ""));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
invalid.push({
|
|
98
|
+
line,
|
|
99
|
+
lineNumber: i + 1,
|
|
100
|
+
message: "Expected a colon-separated header pair (e.g. name: value)",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const [rawName, ...rawValue] = line.split(HEADER_SEPARATOR);
|
|
107
|
+
const name = (rawName || "").trim().toLowerCase();
|
|
108
|
+
if (name.includes(" ")) {
|
|
109
|
+
invalid.push({
|
|
110
|
+
line,
|
|
111
|
+
lineNumber: i + 1,
|
|
112
|
+
message: "Header name cannot include spaces",
|
|
113
|
+
});
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const value = rawValue.join(HEADER_SEPARATOR).trim();
|
|
117
|
+
if (name === "") {
|
|
118
|
+
invalid.push({
|
|
119
|
+
line,
|
|
120
|
+
lineNumber: i + 1,
|
|
121
|
+
message: "No header name specified",
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (value === "") {
|
|
126
|
+
invalid.push({
|
|
127
|
+
line,
|
|
128
|
+
lineNumber: i + 1,
|
|
129
|
+
message: "No header value specified",
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!rule) {
|
|
134
|
+
invalid.push({
|
|
135
|
+
line,
|
|
136
|
+
lineNumber: i + 1,
|
|
137
|
+
message: `Path should come before header (${name}: ${value})`,
|
|
138
|
+
});
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const existingValues = rule.headers[name];
|
|
142
|
+
rule.headers[name] = existingValues ? `${existingValues}, ${value}` : value;
|
|
143
|
+
}
|
|
144
|
+
if (rule) {
|
|
145
|
+
if (isValidRule(rule)) {
|
|
146
|
+
rules.push({
|
|
147
|
+
path: rule.path,
|
|
148
|
+
headers: rule.headers,
|
|
149
|
+
unsetHeaders: rule.unsetHeaders,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
invalid.push({ line: rule.line, message: "No headers specified" });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
rules,
|
|
158
|
+
invalid,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function isValidRule(rule) {
|
|
162
|
+
return Object.keys(rule.headers).length > 0 || rule.unsetHeaders.length > 0;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* At runtime, `*` wildcards are converted to `:splat` placeholders. This means
|
|
166
|
+
* a path with multiple wildcards, or a wildcard combined with an explicit
|
|
167
|
+
* `:splat` placeholder, would result in duplicate `:splat` parameters which is
|
|
168
|
+
* unsupported.
|
|
169
|
+
*/
|
|
170
|
+
function validateNoMultipleWildcards(path) {
|
|
171
|
+
const wildcardCount = (path.match(SPLAT_REGEX) ?? []).length;
|
|
172
|
+
const hasSplatPlaceholder = /:splat(?!\w)/.test(path);
|
|
173
|
+
if (wildcardCount > 1) {
|
|
174
|
+
return `Only one wildcard is allowed per rule. Use a named placeholder (e.g. :project) instead. Skipping ${path}.`;
|
|
175
|
+
}
|
|
176
|
+
if (wildcardCount > 0 && hasSplatPlaceholder) {
|
|
177
|
+
return `Cannot combine a wildcard * with a :splat placeholder because wildcards are converted to :splat at runtime. Skipping ${path}.`;
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=parseHeaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseHeaders.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/parseHeaders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AssetConfig } from "../types.js";
|
|
2
|
+
import type { ParsedRedirects } from "./types.js";
|
|
3
|
+
export declare function parseRedirects(input: string, { htmlHandling, maxStaticRules, maxDynamicRules, maxLineLength, }?: {
|
|
4
|
+
htmlHandling?: AssetConfig["html_handling"];
|
|
5
|
+
maxStaticRules?: number;
|
|
6
|
+
maxDynamicRules?: number;
|
|
7
|
+
maxLineLength?: number;
|
|
8
|
+
}): ParsedRedirects;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { MAX_DYNAMIC_REDIRECT_RULES, MAX_LINE_LENGTH, MAX_STATIC_REDIRECT_RULES, PERMITTED_STATUS_CODES, PLACEHOLDER_REGEX, SPLAT_REGEX, } from "./constants.js";
|
|
2
|
+
import { urlHasHost, validateUrl } from "./validateURL.js";
|
|
3
|
+
export function parseRedirects(input, { htmlHandling = undefined, maxStaticRules = MAX_STATIC_REDIRECT_RULES, maxDynamicRules = MAX_DYNAMIC_REDIRECT_RULES, maxLineLength = MAX_LINE_LENGTH, } = {}) {
|
|
4
|
+
const lines = input.split("\n");
|
|
5
|
+
const rules = [];
|
|
6
|
+
const seen_paths = new Set();
|
|
7
|
+
const invalid = [];
|
|
8
|
+
let staticRules = 0;
|
|
9
|
+
let dynamicRules = 0;
|
|
10
|
+
let canCreateStaticRule = true;
|
|
11
|
+
for (let i = 0; i < lines.length; i++) {
|
|
12
|
+
const line = (lines[i] || "").trim();
|
|
13
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (line.length > maxLineLength) {
|
|
17
|
+
invalid.push({
|
|
18
|
+
message: `Ignoring line ${i + 1} as it exceeds the maximum allowed length of ${maxLineLength}.`,
|
|
19
|
+
});
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// Handle inline comments: strip off from the first `#` token that starts a comment, but not URL fragments.
|
|
23
|
+
// This allows `/a /b#fragment` but strips `/a /b # comment`
|
|
24
|
+
const tokens = line.replace(/\s+#.*$/, "").split(/\s+/);
|
|
25
|
+
if (tokens.length < 2 || tokens.length > 3) {
|
|
26
|
+
invalid.push({
|
|
27
|
+
line,
|
|
28
|
+
lineNumber: i + 1,
|
|
29
|
+
message: `Expected exactly 2 or 3 whitespace-separated tokens. Got ${tokens.length}.`,
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const [str_from, str_to, str_status = "302"] = tokens;
|
|
34
|
+
const fromResult = validateUrl(str_from, true, true, false, false);
|
|
35
|
+
if (fromResult[0] === undefined) {
|
|
36
|
+
invalid.push({
|
|
37
|
+
line,
|
|
38
|
+
lineNumber: i + 1,
|
|
39
|
+
message: fromResult[1],
|
|
40
|
+
});
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const from = fromResult[0];
|
|
44
|
+
if (canCreateStaticRule &&
|
|
45
|
+
!from.match(SPLAT_REGEX) &&
|
|
46
|
+
!from.match(PLACEHOLDER_REGEX)) {
|
|
47
|
+
staticRules += 1;
|
|
48
|
+
if (staticRules > maxStaticRules) {
|
|
49
|
+
invalid.push({
|
|
50
|
+
message: `Maximum number of static rules supported is ${maxStaticRules}. Skipping line.`,
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
dynamicRules += 1;
|
|
57
|
+
canCreateStaticRule = false;
|
|
58
|
+
if (dynamicRules > maxDynamicRules) {
|
|
59
|
+
invalid.push({
|
|
60
|
+
message: `Maximum number of dynamic rules supported is ${maxDynamicRules}. Skipping remaining ${lines.length - i} lines of file.`,
|
|
61
|
+
});
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const toResult = validateUrl(str_to, false, false, true, true);
|
|
66
|
+
if (toResult[0] === undefined) {
|
|
67
|
+
invalid.push({
|
|
68
|
+
line,
|
|
69
|
+
lineNumber: i + 1,
|
|
70
|
+
message: toResult[1],
|
|
71
|
+
});
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const to = toResult[0];
|
|
75
|
+
const status = Number(str_status);
|
|
76
|
+
if (isNaN(status) || !PERMITTED_STATUS_CODES.has(status)) {
|
|
77
|
+
invalid.push({
|
|
78
|
+
line,
|
|
79
|
+
lineNumber: i + 1,
|
|
80
|
+
message: `Valid status codes are 200, 301, 302 (default), 303, 307, or 308. Got ${str_status}.`,
|
|
81
|
+
});
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Here we reject two patterns:
|
|
85
|
+
// 1. `/* /index.html` Is always rejected.
|
|
86
|
+
// 2. `/ /index` Is rejected when HTML handling is enabled.
|
|
87
|
+
// Allowing the redirect in other cases will cause TOO_MANY_REDIRECTS errors as the asset Worker will
|
|
88
|
+
// redirect it back to `/` by removing the `/index.html`.
|
|
89
|
+
// We only want to run this on relative URLs.
|
|
90
|
+
const hasRelativePath = !urlHasHost(to);
|
|
91
|
+
const hasWildcardToIndex = from.endsWith("/*") && /\/index(.html)?$/.test(to);
|
|
92
|
+
const hasRootToIndex = from.endsWith("/") && /\/index(.html)?$/.test(to);
|
|
93
|
+
const hasHTMLHandling = htmlHandling !== "none"; // HTML handling is enabled by default.
|
|
94
|
+
if (hasRelativePath &&
|
|
95
|
+
(hasWildcardToIndex || (hasRootToIndex && hasHTMLHandling))) {
|
|
96
|
+
invalid.push({
|
|
97
|
+
line,
|
|
98
|
+
lineNumber: i + 1,
|
|
99
|
+
message: "Infinite loop detected in this rule and has been ignored. This will cause a redirect to strip `.html` or `/index` and end up triggering this rule again. Please fix or remove this rule to silence this warning.",
|
|
100
|
+
});
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (seen_paths.has(from)) {
|
|
104
|
+
invalid.push({
|
|
105
|
+
line,
|
|
106
|
+
lineNumber: i + 1,
|
|
107
|
+
message: `Ignoring duplicate rule for path ${from}.`,
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
seen_paths.add(from);
|
|
112
|
+
if (status === 200) {
|
|
113
|
+
if (urlHasHost(to)) {
|
|
114
|
+
invalid.push({
|
|
115
|
+
line,
|
|
116
|
+
lineNumber: i + 1,
|
|
117
|
+
message: `Proxy (200) redirects can only point to relative paths. Got ${to}`,
|
|
118
|
+
});
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
rules.push({ from, to, status, lineNumber: i + 1 });
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
rules,
|
|
126
|
+
invalid,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=parseRedirects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseRedirects.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/parseRedirects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { MAX_ROUTES_RULE_LENGTH, MAX_ROUTES_RULES } from "./constants.js";
|
|
2
|
+
const MAX_REPORTED_DUPLICATED_RULES = 5;
|
|
3
|
+
// copy of what EWC does. Wrangler uploads the rules in one array (so the API is consistent with Wrangler config),
|
|
4
|
+
// but router Worker expects the rules to be split into two arrays, which we do here.
|
|
5
|
+
// This logic is translated from assets/staticrouting.go.
|
|
6
|
+
export function parseStaticRouting(input) {
|
|
7
|
+
if (input.length === 0) {
|
|
8
|
+
throw new Error("No `run_worker_first` rules were provided; must provide at least 1 rule.");
|
|
9
|
+
}
|
|
10
|
+
if (input.length > MAX_ROUTES_RULES) {
|
|
11
|
+
const seenRules = new Set();
|
|
12
|
+
const duplicatedRules = new Set();
|
|
13
|
+
for (const rule of input) {
|
|
14
|
+
if (seenRules.has(rule)) {
|
|
15
|
+
duplicatedRules.add(rule);
|
|
16
|
+
}
|
|
17
|
+
seenRules.add(rule);
|
|
18
|
+
}
|
|
19
|
+
if (duplicatedRules.size > 0) {
|
|
20
|
+
const duplicateEntryCount = input.length - seenRules.size;
|
|
21
|
+
const reportedDuplicatedRules = [...seenRules]
|
|
22
|
+
.filter((rule) => duplicatedRules.has(rule))
|
|
23
|
+
.slice(0, MAX_REPORTED_DUPLICATED_RULES);
|
|
24
|
+
const unreportedDuplicatedRuleCount = duplicatedRules.size - reportedDuplicatedRules.length;
|
|
25
|
+
const unreportedDuplicatedRulesMessage = unreportedDuplicatedRuleCount > 0
|
|
26
|
+
? `\n...and ${unreportedDuplicatedRuleCount} more duplicated ${unreportedDuplicatedRuleCount === 1 ? "rule" : "rules"}.`
|
|
27
|
+
: "";
|
|
28
|
+
throw new Error(`Too many \`run_worker_first\` rules were provided; ${input.length} rules provided (${seenRules.size} distinct, ${duplicateEntryCount} duplicate ${duplicateEntryCount === 1 ? "entry" : "entries"}) exceeds max of ${MAX_ROUTES_RULES}. Note: duplicate entries count towards the route limit. Ensure that no duplicate rules are present in your \`run_worker_first\` configuration.\n\nThe duplicated rules found are:\n${reportedDuplicatedRules.map((rule) => `- ${JSON.stringify(rule)}`).join("\n")}${unreportedDuplicatedRulesMessage}`);
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Too many \`run_worker_first\` rules were provided; ${input.length} rules provided exceeds max of ${MAX_ROUTES_RULES}.`);
|
|
31
|
+
}
|
|
32
|
+
const rawAssetWorkerRules = [];
|
|
33
|
+
const assetWorkerRules = [];
|
|
34
|
+
const userWorkerRules = [];
|
|
35
|
+
const invalidRules = [];
|
|
36
|
+
for (const rule of input) {
|
|
37
|
+
if (rule.startsWith("!/")) {
|
|
38
|
+
assetWorkerRules.push(rule.slice(1)); // Remove leading !
|
|
39
|
+
rawAssetWorkerRules.push(rule);
|
|
40
|
+
}
|
|
41
|
+
else if (rule.startsWith("/")) {
|
|
42
|
+
userWorkerRules.push(rule);
|
|
43
|
+
}
|
|
44
|
+
else if (rule.startsWith("!")) {
|
|
45
|
+
invalidRules.push(`'${rule}': negative rules must start with '!/'`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
invalidRules.push(`'${rule}': rules must start with '/' or '!/'`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (assetWorkerRules.length > 0 && userWorkerRules.length === 0) {
|
|
52
|
+
throw new Error("Only negative `run_worker_first` rules were provided; must provide at least 1 non-negative rule");
|
|
53
|
+
}
|
|
54
|
+
const invalidAssetWorkerRules = validateStaticRoutingRules(rawAssetWorkerRules);
|
|
55
|
+
const invalidUserWorkerRules = validateStaticRoutingRules(userWorkerRules);
|
|
56
|
+
const errorMessage = formatInvalidRoutes([
|
|
57
|
+
...invalidRules,
|
|
58
|
+
...invalidUserWorkerRules,
|
|
59
|
+
...invalidAssetWorkerRules,
|
|
60
|
+
]);
|
|
61
|
+
if (errorMessage) {
|
|
62
|
+
throw new Error(errorMessage);
|
|
63
|
+
}
|
|
64
|
+
return { asset_worker: assetWorkerRules, user_worker: userWorkerRules };
|
|
65
|
+
}
|
|
66
|
+
function validateStaticRoutingRules(rules) {
|
|
67
|
+
const invalid = [];
|
|
68
|
+
const seen = new Set();
|
|
69
|
+
for (const rule of rules) {
|
|
70
|
+
if (rule.length > MAX_ROUTES_RULE_LENGTH) {
|
|
71
|
+
invalid.push(`'${rule}': all rules must be less than ${MAX_ROUTES_RULE_LENGTH} characters in length`);
|
|
72
|
+
}
|
|
73
|
+
if (seen.has(rule)) {
|
|
74
|
+
invalid.push(`'${rule}': rule is a duplicate; rules must be unique`);
|
|
75
|
+
}
|
|
76
|
+
if (rule.endsWith("*")) {
|
|
77
|
+
// Check for redundant rules due to a glob
|
|
78
|
+
for (const otherRule of rules) {
|
|
79
|
+
if (otherRule !== rule && otherRule.startsWith(rule.slice(0, -1))) {
|
|
80
|
+
invalid.push(`'${otherRule}': rule '${rule}' makes it redundant`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
seen.add(rule);
|
|
85
|
+
}
|
|
86
|
+
return invalid;
|
|
87
|
+
}
|
|
88
|
+
const formatInvalidRoutes = (invalidRules) => {
|
|
89
|
+
if (invalidRules.length === 0) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
return `Invalid routes in \`run_worker_first\`:\n` + invalidRules.join("\n");
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=parseStaticRouting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseStaticRouting.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/parseStaticRouting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type RedirectLine = [from: string, to: string, status?: number];
|
|
2
|
+
export type RedirectRule = {
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
status: number;
|
|
6
|
+
lineNumber: number;
|
|
7
|
+
};
|
|
8
|
+
export type Headers = Record<string, string>;
|
|
9
|
+
export type HeadersRule = {
|
|
10
|
+
path: string;
|
|
11
|
+
headers: Headers;
|
|
12
|
+
unsetHeaders: string[];
|
|
13
|
+
};
|
|
14
|
+
export type InvalidRedirectRule = {
|
|
15
|
+
line?: string;
|
|
16
|
+
lineNumber?: number;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export type InvalidHeadersRule = {
|
|
20
|
+
line?: string;
|
|
21
|
+
lineNumber?: number;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
export type ParsedRedirects = {
|
|
25
|
+
invalid: InvalidRedirectRule[];
|
|
26
|
+
rules: RedirectRule[];
|
|
27
|
+
};
|
|
28
|
+
export type ParsedHeaders = {
|
|
29
|
+
invalid: InvalidHeadersRule[];
|
|
30
|
+
rules: HeadersRule[];
|
|
31
|
+
};
|
|
32
|
+
export interface Logger {
|
|
33
|
+
debug: (message: string) => void;
|
|
34
|
+
log: (message: string) => void;
|
|
35
|
+
info: (message: string) => void;
|
|
36
|
+
warn: (message: string) => void;
|
|
37
|
+
error: (error: Error) => void;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/workers-shared/utils/configuration/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const extractPathname: (path: string | undefined, includeSearch: boolean, includeHash: boolean) => string;
|
|
2
|
+
export declare const validateUrl: (token: string, onlyRelative?: boolean, disallowPorts?: boolean, includeSearch?: boolean, includeHash?: boolean) => [undefined, string] | [string, undefined];
|
|
3
|
+
export declare function urlHasHost(token: string): boolean;
|