nitro-nightly 4.0.0-20251010-091516-7cafddba → 4.0.0-20251030-091344-d4418b98
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/dist/{_chunks/build2.mjs → _build/build.mjs} +108 -58
- package/dist/_build/build2.mjs +556 -0
- package/dist/_build/info.mjs +1002 -0
- package/dist/_build/prepare.mjs +1511 -0
- package/dist/_build/snapshot.mjs +185 -0
- package/dist/{_chunks/plugin.mjs → _build/vite.mjs} +295 -296
- package/dist/_build/vite2.mjs +149 -0
- package/dist/_chunks/_deps/@jridgewell/gen-mapping.mjs +189 -0
- package/dist/_chunks/_deps/@jridgewell/remapping.mjs +137 -0
- package/dist/_chunks/_deps/@jridgewell/resolve-uri.mjs +231 -0
- package/dist/_chunks/_deps/@jridgewell/sourcemap-codec.mjs +173 -0
- package/dist/_chunks/_deps/@jridgewell/trace-mapping.mjs +170 -0
- package/dist/_chunks/_deps/@pi0/vite-plugin-fullstack.mjs +575 -0
- package/dist/_chunks/_deps/@rollup/plugin-alias.mjs +89 -0
- package/dist/_chunks/_deps/@rollup/plugin-commonjs.mjs +2376 -0
- package/dist/_chunks/{index2.mjs → _deps/@rollup/plugin-inject.mjs} +5 -90
- package/dist/_chunks/_deps/@rollup/plugin-json.mjs +37 -0
- package/dist/_chunks/_deps/@rollup/plugin-node-resolve.mjs +1386 -0
- package/dist/_chunks/_deps/@rollup/plugin-replace.mjs +133 -0
- package/dist/_chunks/_deps/@rollup/pluginutils.mjs +346 -0
- package/dist/_chunks/_deps/acorn.mjs +6225 -0
- package/dist/_chunks/_deps/c12.mjs +510 -0
- package/dist/_chunks/_deps/chokidar.mjs +1428 -0
- package/dist/_chunks/_deps/citty.mjs +460 -0
- package/dist/_chunks/_deps/commondir.mjs +77 -0
- package/dist/_chunks/_deps/compatx.mjs +76 -0
- package/dist/_chunks/_deps/confbox.mjs +300 -0
- package/dist/_chunks/_deps/debug.mjs +885 -0
- package/dist/_chunks/_deps/deepmerge.mjs +147 -0
- package/dist/_chunks/_deps/depd.mjs +550 -0
- package/dist/_chunks/_deps/dot-prop.mjs +282 -0
- package/dist/_chunks/_deps/dotenv.mjs +555 -0
- package/dist/_chunks/_deps/duplexer.mjs +1 -0
- package/dist/_chunks/_deps/ee-first.mjs +104 -0
- package/dist/_chunks/_deps/encodeurl.mjs +69 -0
- package/dist/_chunks/_deps/escape-html.mjs +87 -0
- package/dist/_chunks/_deps/escape-string-regexp.mjs +13 -0
- package/dist/_chunks/_deps/estree-walker.mjs +433 -0
- package/dist/_chunks/_deps/etag.mjs +147 -0
- package/dist/_chunks/_deps/exsolve.mjs +1416 -0
- package/dist/_chunks/_deps/fdir.mjs +569 -0
- package/dist/_chunks/_deps/fresh.mjs +145 -0
- package/dist/_chunks/_deps/function-bind.mjs +106 -0
- package/dist/_chunks/{index4.mjs → _deps/giget.mjs} +21 -776
- package/dist/_chunks/_deps/gzip-size.mjs +19 -0
- package/dist/_chunks/_deps/hasown.mjs +19 -0
- package/dist/_chunks/_deps/http-errors.mjs +307 -0
- package/dist/_chunks/_deps/httpxy.mjs +580 -0
- package/dist/_chunks/_deps/inherits.mjs +57 -0
- package/dist/_chunks/_deps/is-core-module.mjs +596 -0
- package/dist/_chunks/_deps/is-module.mjs +25 -0
- package/dist/_chunks/_deps/is-reference.mjs +31 -0
- package/dist/_chunks/_deps/js-tokens.mjs +411 -0
- package/dist/_chunks/_deps/klona.mjs +137 -0
- package/dist/_chunks/_deps/knitwork.mjs +172 -0
- package/dist/_chunks/_deps/local-pkg.mjs +163 -0
- package/dist/_chunks/_deps/magic-string.mjs +1296 -0
- package/dist/_chunks/_deps/mime-db.mjs +11685 -0
- package/dist/_chunks/_deps/mime-types.mjs +287 -0
- package/dist/_chunks/_deps/mime.mjs +1172 -0
- package/dist/_chunks/_deps/mlly.mjs +2413 -0
- package/dist/_chunks/_deps/ms.mjs +172 -0
- package/dist/_chunks/_deps/node-fetch-native.mjs +3 -0
- package/dist/_chunks/_deps/nypm.mjs +219 -0
- package/dist/_chunks/_deps/on-finished.mjs +246 -0
- package/dist/_chunks/_deps/parseurl.mjs +168 -0
- package/dist/_chunks/_deps/path-parse.mjs +85 -0
- package/dist/_chunks/{pathe.M-eThtNZ.mjs → _deps/pathe.mjs} +48 -1
- package/dist/_chunks/_deps/perfect-debounce.mjs +88 -0
- package/dist/_chunks/_deps/picomatch.mjs +2144 -0
- package/dist/_chunks/_deps/pkg-types.mjs +247 -0
- package/dist/_chunks/{snapshot.mjs → _deps/pretty-bytes.mjs} +1 -105
- package/dist/_chunks/_deps/quansync.mjs +99 -0
- package/dist/_chunks/_deps/range-parser.mjs +171 -0
- package/dist/_chunks/_deps/rc9.mjs +219 -0
- package/dist/_chunks/_deps/readdirp.mjs +245 -0
- package/dist/_chunks/_deps/resolve.mjs +1260 -0
- package/dist/_chunks/_deps/rou3.mjs +326 -0
- package/dist/_chunks/_deps/send.mjs +1022 -0
- package/dist/_chunks/_deps/serve-static.mjs +228 -0
- package/dist/_chunks/_deps/setprototypeof.mjs +26 -0
- package/dist/_chunks/_deps/statuses.mjs +457 -0
- package/dist/_chunks/_deps/std-env.mjs +3 -0
- package/dist/_chunks/_deps/strip-literal.mjs +67 -0
- package/dist/_chunks/_deps/supports-color.mjs +44 -0
- package/dist/_chunks/_deps/tinyexec.mjs +552 -0
- package/dist/_chunks/_deps/tinyglobby.mjs +293 -0
- package/dist/_chunks/_deps/toidentifier.mjs +41 -0
- package/dist/_chunks/_deps/ultrahtml.mjs +3 -0
- package/dist/_chunks/_deps/unimport.mjs +2267 -0
- package/dist/_chunks/_deps/unplugin-utils.mjs +65 -0
- package/dist/_chunks/_deps/unplugin.mjs +1294 -0
- package/dist/_chunks/_deps/untyped.mjs +375 -0
- package/dist/_chunks/{info.mjs → _deps/unwasm.mjs} +8 -4206
- package/dist/_chunks/_deps/webpack-virtual-modules.mjs +360 -0
- package/dist/_chunks/_presets/_all.mjs +59 -0
- package/dist/_chunks/_presets/_nitro.mjs +74 -0
- package/dist/_chunks/_presets/_resolve.mjs +64 -0
- package/dist/_chunks/_presets/_static.mjs +69 -0
- package/dist/_chunks/_presets/_types.mjs +3 -0
- package/dist/_chunks/_presets/_utils.mjs +31 -0
- package/dist/_chunks/_presets/alwaysdata.mjs +17 -0
- package/dist/_chunks/_presets/aws-amplify.mjs +111 -0
- package/dist/_chunks/_presets/aws-lambda.mjs +23 -0
- package/dist/_chunks/_presets/azure.mjs +162 -0
- package/dist/_chunks/_presets/bun.mjs +19 -0
- package/dist/_chunks/_presets/cleavr.mjs +15 -0
- package/dist/_chunks/_presets/cloudflare.mjs +608 -0
- package/dist/_chunks/_presets/deno.mjs +196 -0
- package/dist/_chunks/_presets/digitalocean.mjs +14 -0
- package/dist/_chunks/_presets/firebase.mjs +47 -0
- package/dist/_chunks/_presets/flightcontrol.mjs +14 -0
- package/dist/_chunks/_presets/genezio.mjs +13 -0
- package/dist/_chunks/_presets/heroku.mjs +14 -0
- package/dist/_chunks/_presets/iis.mjs +194 -0
- package/dist/_chunks/_presets/index.mjs +62 -0
- package/dist/_chunks/_presets/koyeb.mjs +14 -0
- package/dist/_chunks/_presets/netlify.mjs +241 -0
- package/dist/_chunks/_presets/node.mjs +54 -0
- package/dist/_chunks/_presets/platform.mjs +14 -0
- package/dist/_chunks/_presets/render.mjs +14 -0
- package/dist/_chunks/_presets/standard.mjs +23 -0
- package/dist/_chunks/_presets/stormkit.mjs +18 -0
- package/dist/_chunks/_presets/vercel.mjs +375 -0
- package/dist/_chunks/_presets/winterjs.mjs +22 -0
- package/dist/_chunks/_presets/zeabur.mjs +69 -0
- package/dist/_chunks/_presets/zerops.mjs +27 -0
- package/dist/_chunks/app.mjs +9 -19206
- package/dist/_chunks/{index3.mjs → builder.mjs} +560 -970
- package/dist/_chunks/server.mjs +6 -4
- package/dist/{cli → _cli}/build.mjs +3 -8
- package/dist/{cli → _cli}/dev.mjs +38 -12
- package/dist/{cli/index2.mjs → _cli/index.mjs} +1 -2
- package/dist/{cli → _cli}/list.mjs +3 -4
- package/dist/{cli → _cli}/prepare.mjs +3 -4
- package/dist/{cli → _cli}/run.mjs +3 -4
- package/dist/{index.d.mts → builder.d.mts} +11 -11
- package/dist/builder.mjs +117 -0
- package/dist/cli/index.mjs +7 -464
- package/dist/node_modules/@speed-highlight/core/dist/index.js +1 -1
- package/dist/node_modules/@speed-highlight/core/dist/terminal.js +1 -1
- package/dist/node_modules/@speed-highlight/core/package.json +7 -3
- package/dist/node_modules/cookie-es/dist/index.mjs +262 -0
- package/dist/node_modules/cookie-es/package.json +37 -0
- package/dist/node_modules/hookable/dist/index.mjs +243 -266
- package/dist/node_modules/hookable/package.json +29 -26
- package/dist/node_modules/rendu/dist/index.mjs +380 -0
- package/dist/node_modules/rendu/package.json +47 -0
- package/dist/presets/_nitro/runtime/nitro-dev.mjs +4 -7
- package/dist/presets/_nitro/runtime/nitro-prerenderer.mjs +5 -4
- package/dist/presets/azure/runtime/azure-swa.mjs +1 -1
- package/dist/presets/cloudflare/runtime/_module-handler.mjs +7 -6
- package/dist/presets/cloudflare/runtime/cloudflare-durable.mjs +4 -5
- package/dist/presets/cloudflare/runtime/plugin.dev.mjs +7 -10
- package/dist/presets/cloudflare/runtime/shims/workers.dev.d.mts +21 -0
- package/dist/presets/cloudflare/runtime/shims/workers.dev.mjs +27 -0
- package/dist/presets/node/runtime/node-server.mjs +1 -1
- package/dist/runtime/index.d.mts +1 -1
- package/dist/runtime/index.mjs +1 -1
- package/dist/runtime/internal/app.d.mts +3 -1
- package/dist/runtime/internal/app.mjs +90 -64
- package/dist/runtime/internal/error/prod.d.mts +3 -2
- package/dist/runtime/internal/error/prod.mjs +9 -13
- package/dist/runtime/internal/renderer.mjs +4 -4
- package/dist/runtime/internal/routes/dev-tasks.d.mts +30 -2
- package/dist/runtime/internal/shutdown.d.mts +1 -2
- package/dist/runtime/internal/shutdown.mjs +3 -2
- package/dist/runtime/internal/task.mjs +1 -2
- package/dist/types/index.d.mts +1603 -10
- package/dist/vite.d.mts +5 -0
- package/dist/vite.mjs +94 -30
- package/lib/index.mjs +1 -0
- package/lib/indexd.mts +1 -0
- package/lib/runtime/meta.mjs +35 -0
- package/package.json +40 -41
- package/dist/_chunks/build.mjs +0 -84
- package/dist/_chunks/build3.mjs +0 -6452
- package/dist/_chunks/detect-acorn.mjs +0 -503
- package/dist/_chunks/index.mjs +0 -22242
- package/dist/_chunks/json5.mjs +0 -68
- package/dist/_chunks/jsonc.mjs +0 -51
- package/dist/_chunks/toml.mjs +0 -259
- package/dist/_chunks/yaml.mjs +0 -86
- package/dist/index.mjs +0 -55
- package/dist/node_modules/klona/dist/index.mjs +0 -81
- package/dist/node_modules/klona/full/index.mjs +0 -53
- package/dist/node_modules/klona/package.json +0 -74
- package/dist/node_modules/std-env/dist/index.mjs +0 -1
- package/dist/node_modules/std-env/package.json +0 -46
- package/dist/presets.mjs +0 -2460
- package/dist/runtime/internal/debug.d.mts +0 -2
- package/dist/runtime/internal/debug.mjs +0 -5
- package/lib/runtime-meta.mjs +0 -38
- /package/dist/{cli → _cli}/common.mjs +0 -0
- /package/lib/{runtime-meta.d.mts → runtime/meta.d.mts} +0 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
const NullProtoObj = /* @__PURE__ */ (() => {
|
|
2
|
+
const e = function() {};
|
|
3
|
+
return e.prototype = Object.create(null), Object.freeze(e.prototype), e;
|
|
4
|
+
})();
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a new router context.
|
|
8
|
+
*/
|
|
9
|
+
function createRouter() {
|
|
10
|
+
return {
|
|
11
|
+
root: { key: "" },
|
|
12
|
+
static: new NullProtoObj()
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function splitPath(path) {
|
|
17
|
+
const [_, ...s] = path.split("/");
|
|
18
|
+
return s[s.length - 1] === "" ? s.slice(0, -1) : s;
|
|
19
|
+
}
|
|
20
|
+
function getMatchParams(segments, paramsMap) {
|
|
21
|
+
const params = new NullProtoObj();
|
|
22
|
+
for (const [index, name] of paramsMap) {
|
|
23
|
+
const segment = index < 0 ? segments.slice(-1 * index).join("/") : segments[index];
|
|
24
|
+
if (typeof name === "string") params[name] = segment;
|
|
25
|
+
else {
|
|
26
|
+
const match = segment.match(name);
|
|
27
|
+
if (match) for (const key in match.groups) params[key] = match.groups[key];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return params;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Add a route to the router context.
|
|
35
|
+
*/
|
|
36
|
+
function addRoute(ctx, method = "", path, data) {
|
|
37
|
+
method = method.toUpperCase();
|
|
38
|
+
if (path.charCodeAt(0) !== 47) path = `/${path}`;
|
|
39
|
+
const segments = splitPath(path);
|
|
40
|
+
let node = ctx.root;
|
|
41
|
+
let _unnamedParamIndex = 0;
|
|
42
|
+
const paramsMap = [];
|
|
43
|
+
const paramsRegexp = [];
|
|
44
|
+
for (let i = 0; i < segments.length; i++) {
|
|
45
|
+
const segment = segments[i];
|
|
46
|
+
if (segment.startsWith("**")) {
|
|
47
|
+
if (!node.wildcard) node.wildcard = { key: "**" };
|
|
48
|
+
node = node.wildcard;
|
|
49
|
+
paramsMap.push([
|
|
50
|
+
-i,
|
|
51
|
+
segment.split(":")[1] || "_",
|
|
52
|
+
segment.length === 2
|
|
53
|
+
]);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
if (segment === "*" || segment.includes(":")) {
|
|
57
|
+
if (!node.param) node.param = { key: "*" };
|
|
58
|
+
node = node.param;
|
|
59
|
+
if (segment === "*") paramsMap.push([
|
|
60
|
+
i,
|
|
61
|
+
`_${_unnamedParamIndex++}`,
|
|
62
|
+
true
|
|
63
|
+
]);
|
|
64
|
+
else if (segment.includes(":", 1)) {
|
|
65
|
+
const regexp = getParamRegexp(segment);
|
|
66
|
+
paramsRegexp[i] = regexp;
|
|
67
|
+
node.hasRegexParam = true;
|
|
68
|
+
paramsMap.push([
|
|
69
|
+
i,
|
|
70
|
+
regexp,
|
|
71
|
+
false
|
|
72
|
+
]);
|
|
73
|
+
} else paramsMap.push([
|
|
74
|
+
i,
|
|
75
|
+
segment.slice(1),
|
|
76
|
+
false
|
|
77
|
+
]);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const child = node.static?.[segment];
|
|
81
|
+
if (child) node = child;
|
|
82
|
+
else {
|
|
83
|
+
const staticNode = { key: segment };
|
|
84
|
+
if (!node.static) node.static = new NullProtoObj();
|
|
85
|
+
node.static[segment] = staticNode;
|
|
86
|
+
node = staticNode;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const hasParams = paramsMap.length > 0;
|
|
90
|
+
if (!node.methods) node.methods = new NullProtoObj();
|
|
91
|
+
node.methods[method] ??= [];
|
|
92
|
+
node.methods[method].push({
|
|
93
|
+
data: data || null,
|
|
94
|
+
paramsRegexp,
|
|
95
|
+
paramsMap: hasParams ? paramsMap : void 0
|
|
96
|
+
});
|
|
97
|
+
if (!hasParams) ctx.static[path] = node;
|
|
98
|
+
}
|
|
99
|
+
function getParamRegexp(segment) {
|
|
100
|
+
const regex = segment.replace(/:(\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\./g, "\\.");
|
|
101
|
+
return /* @__PURE__ */ new RegExp(`^${regex}$`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Find a route by path.
|
|
106
|
+
*/
|
|
107
|
+
function findRoute(ctx, method = "", path, opts) {
|
|
108
|
+
if (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);
|
|
109
|
+
const staticNode = ctx.static[path];
|
|
110
|
+
if (staticNode && staticNode.methods) {
|
|
111
|
+
const staticMatch = staticNode.methods[method] || staticNode.methods[""];
|
|
112
|
+
if (staticMatch !== void 0) return staticMatch[0];
|
|
113
|
+
}
|
|
114
|
+
const segments = splitPath(path);
|
|
115
|
+
const match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];
|
|
116
|
+
if (match === void 0) return;
|
|
117
|
+
return {
|
|
118
|
+
data: match.data,
|
|
119
|
+
params: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function _lookupTree(ctx, node, method, segments, index) {
|
|
123
|
+
if (index === segments.length) {
|
|
124
|
+
if (node.methods) {
|
|
125
|
+
const match = node.methods[method] || node.methods[""];
|
|
126
|
+
if (match) return match;
|
|
127
|
+
}
|
|
128
|
+
if (node.param && node.param.methods) {
|
|
129
|
+
const match = node.param.methods[method] || node.param.methods[""];
|
|
130
|
+
if (match) {
|
|
131
|
+
const pMap = match[0].paramsMap;
|
|
132
|
+
if (pMap?.[pMap?.length - 1]?.[2]) return match;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (node.wildcard && node.wildcard.methods) {
|
|
136
|
+
const match = node.wildcard.methods[method] || node.wildcard.methods[""];
|
|
137
|
+
if (match) {
|
|
138
|
+
const pMap = match[0].paramsMap;
|
|
139
|
+
if (pMap?.[pMap?.length - 1]?.[2]) return match;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const segment = segments[index];
|
|
145
|
+
if (node.static) {
|
|
146
|
+
const staticChild = node.static[segment];
|
|
147
|
+
if (staticChild) {
|
|
148
|
+
const match = _lookupTree(ctx, staticChild, method, segments, index + 1);
|
|
149
|
+
if (match) return match;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (node.param) {
|
|
153
|
+
const match = _lookupTree(ctx, node.param, method, segments, index + 1);
|
|
154
|
+
if (match) {
|
|
155
|
+
if (node.param.hasRegexParam) {
|
|
156
|
+
const exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);
|
|
157
|
+
return exactMatch ? [exactMatch] : void 0;
|
|
158
|
+
}
|
|
159
|
+
return match;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[""];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Find all route patterns that match the given path.
|
|
167
|
+
*/
|
|
168
|
+
function findAllRoutes(ctx, method = "", path, opts) {
|
|
169
|
+
if (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);
|
|
170
|
+
const segments = splitPath(path);
|
|
171
|
+
const matches = _findAll(ctx, ctx.root, method, segments, 0);
|
|
172
|
+
return matches.map((m) => {
|
|
173
|
+
return {
|
|
174
|
+
data: m.data,
|
|
175
|
+
params: m.paramsMap ? getMatchParams(segments, m.paramsMap) : void 0
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function _findAll(ctx, node, method, segments, index, matches = []) {
|
|
180
|
+
const segment = segments[index];
|
|
181
|
+
if (node.wildcard && node.wildcard.methods) {
|
|
182
|
+
const match = node.wildcard.methods[method] || node.wildcard.methods[""];
|
|
183
|
+
if (match) matches.push(...match);
|
|
184
|
+
}
|
|
185
|
+
if (node.param) {
|
|
186
|
+
_findAll(ctx, node.param, method, segments, index + 1, matches);
|
|
187
|
+
if (index === segments.length && node.param.methods) {
|
|
188
|
+
const match = node.param.methods[method] || node.param.methods[""];
|
|
189
|
+
if (match) {
|
|
190
|
+
const pMap = match[0].paramsMap;
|
|
191
|
+
if (pMap?.[pMap?.length - 1]?.[2]) matches.push(...match);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const staticChild = node.static?.[segment];
|
|
196
|
+
if (staticChild) _findAll(ctx, staticChild, method, segments, index + 1, matches);
|
|
197
|
+
if (index === segments.length && node.methods) {
|
|
198
|
+
const match = node.methods[method] || node.methods[""];
|
|
199
|
+
if (match) matches.push(...match);
|
|
200
|
+
}
|
|
201
|
+
return matches;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Compiles the router instance into a faster route-matching function.
|
|
206
|
+
*
|
|
207
|
+
* **IMPORTANT:** `compileRouter` requires eval support with `new Function()` in the runtime for JIT compilation.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* import { createRouter, addRoute } from "rou3";
|
|
211
|
+
* import { compileRouter } from "rou3/compiler";
|
|
212
|
+
* const router = createRouter();
|
|
213
|
+
* // [add some routes]
|
|
214
|
+
* const findRoute = compileRouter(router);
|
|
215
|
+
* const matchAll = compileRouter(router, { matchAll: true });
|
|
216
|
+
* findRoute("GET", "/path/foo/bar");
|
|
217
|
+
*
|
|
218
|
+
* @param router - The router context to compile.
|
|
219
|
+
*/
|
|
220
|
+
/**
|
|
221
|
+
* Compile the router instance into a compact runnable code.
|
|
222
|
+
*
|
|
223
|
+
* **IMPORTANT:** Route data must be serializable to JSON (i.e., no functions or classes) or implement the `toJSON()` method to render custom code or you can pass custom `serialize` function in options.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* import { createRouter, addRoute } from "rou3";
|
|
227
|
+
* import { compileRouterToString } from "rou3/compiler";
|
|
228
|
+
* const router = createRouter();
|
|
229
|
+
* // [add some routes with serializable data]
|
|
230
|
+
* const compilerCode = compileRouterToString(router, "findRoute");
|
|
231
|
+
* // "const findRoute=(m, p) => {}"
|
|
232
|
+
*/
|
|
233
|
+
function compileRouterToString(router, functionName, opts) {
|
|
234
|
+
const compiled = `(m,p)=>{${compileRouteMatch({
|
|
235
|
+
opts: opts || {},
|
|
236
|
+
router,
|
|
237
|
+
deps: void 0
|
|
238
|
+
})}}`;
|
|
239
|
+
return functionName ? `const ${functionName}=${compiled};` : compiled;
|
|
240
|
+
}
|
|
241
|
+
function compileRouteMatch(ctx) {
|
|
242
|
+
let code = "";
|
|
243
|
+
const staticNodes = /* @__PURE__ */ new Set();
|
|
244
|
+
for (const key in ctx.router.static) {
|
|
245
|
+
const node = ctx.router.static[key];
|
|
246
|
+
if (node?.methods) {
|
|
247
|
+
staticNodes.add(node);
|
|
248
|
+
code += `if(p===${JSON.stringify(key.replace(/\/$/, "") || "/")}){${compileMethodMatch(ctx, node.methods, [], -1)}}`;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const match = compileNode(ctx, ctx.router.root, [], 0, staticNodes);
|
|
252
|
+
if (match) code += `let s=p.split("/"),l=s.length-1;${match}`;
|
|
253
|
+
if (!code) return ctx.opts?.matchAll ? `return [];` : "";
|
|
254
|
+
return `${ctx.opts?.matchAll ? `let r=[];` : ""}if(p.charCodeAt(p.length-1)===47)p=p.slice(0,-1)||"/";${code}${ctx.opts?.matchAll ? "return r;" : ""}`;
|
|
255
|
+
}
|
|
256
|
+
function compileMethodMatch(ctx, methods, params, currentIdx) {
|
|
257
|
+
let code = "";
|
|
258
|
+
for (const key in methods) {
|
|
259
|
+
const matchers = methods[key];
|
|
260
|
+
if (matchers && matchers?.length > 0) {
|
|
261
|
+
if (key !== "") code += `if(m==="${key}")${matchers.length > 1 ? "{" : ""}`;
|
|
262
|
+
const _matchers = matchers.map((m) => compileFinalMatch(ctx, m, currentIdx, params)).sort((a, b) => b.weight - a.weight);
|
|
263
|
+
for (const matcher of _matchers) code += matcher.code;
|
|
264
|
+
if (key !== "") code += matchers.length > 1 ? "}" : "";
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return code;
|
|
268
|
+
}
|
|
269
|
+
function compileFinalMatch(ctx, data, currentIdx, params) {
|
|
270
|
+
let ret = `{data:${serializeData(ctx, data.data)}`;
|
|
271
|
+
const conditions = [];
|
|
272
|
+
const { paramsMap, paramsRegexp } = data;
|
|
273
|
+
if (paramsMap && paramsMap.length > 0) {
|
|
274
|
+
if (!paramsMap[paramsMap.length - 1][2] && currentIdx !== -1) conditions.push(`l>=${currentIdx}`);
|
|
275
|
+
for (let i = 0; i < paramsRegexp.length; i++) {
|
|
276
|
+
const regexp = paramsRegexp[i];
|
|
277
|
+
if (!regexp) continue;
|
|
278
|
+
conditions.push(`${regexp.toString()}.test(s[${i + 1}])`);
|
|
279
|
+
}
|
|
280
|
+
ret += ",params:{";
|
|
281
|
+
for (let i = 0; i < paramsMap.length; i++) {
|
|
282
|
+
const map = paramsMap[i];
|
|
283
|
+
ret += typeof map[1] === "string" ? `${JSON.stringify(map[1])}:${params[i]},` : `...(${map[1].toString()}.exec(${params[i]}))?.groups,`;
|
|
284
|
+
}
|
|
285
|
+
ret += "}";
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
code: (conditions.length > 0 ? `if(${conditions.join("&&")})` : "") + (ctx.opts?.matchAll ? `r.unshift(${ret}});` : `return ${ret}};`),
|
|
289
|
+
weight: conditions.length
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
function compileNode(ctx, node, params, startIdx, staticNodes) {
|
|
293
|
+
let code = "";
|
|
294
|
+
if (node.methods && !staticNodes.has(node)) {
|
|
295
|
+
const match = compileMethodMatch(ctx, node.methods, params, node.key === "*" ? startIdx : -1);
|
|
296
|
+
if (match) {
|
|
297
|
+
const hasLastOptionalParam = node.key === "*";
|
|
298
|
+
code += `if(l===${startIdx}${hasLastOptionalParam ? `||l===${startIdx - 1}` : ""}){${match}}`;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (node.static) for (const key in node.static) {
|
|
302
|
+
const match = compileNode(ctx, node.static[key], params, startIdx + 1, staticNodes);
|
|
303
|
+
if (match) code += `if(s[${startIdx + 1}]===${JSON.stringify(key)}){${match}}`;
|
|
304
|
+
}
|
|
305
|
+
if (node.param) {
|
|
306
|
+
const match = compileNode(ctx, node.param, [...params, `s[${startIdx + 1}]`], startIdx + 1, staticNodes);
|
|
307
|
+
if (match) code += match;
|
|
308
|
+
}
|
|
309
|
+
if (node.wildcard) {
|
|
310
|
+
const { wildcard } = node;
|
|
311
|
+
if (wildcard.static || wildcard.param || wildcard.wildcard) throw new Error("Compiler mode does not support patterns after wildcard");
|
|
312
|
+
if (wildcard.methods) {
|
|
313
|
+
const match = compileMethodMatch(ctx, wildcard.methods, [...params, `s.slice(${startIdx + 1}).join('/')`], startIdx);
|
|
314
|
+
if (match) code += match;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return code;
|
|
318
|
+
}
|
|
319
|
+
function serializeData(ctx, value) {
|
|
320
|
+
if (ctx.deps) return `d${ctx.deps.push(value)}`;
|
|
321
|
+
if (ctx.opts?.serialize) return ctx.opts.serialize(value);
|
|
322
|
+
if (typeof value?.toJSON === "function") return value.toJSON();
|
|
323
|
+
return JSON.stringify(value);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export { addRoute as a, compileRouterToString as b, createRouter as c, findRoute as d, findAllRoutes as f };
|