vinext 0.0.26 → 0.0.28
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/README.md +89 -85
- package/dist/build/static-export.d.ts +1 -1
- package/dist/build/static-export.d.ts.map +1 -1
- package/dist/build/static-export.js +5 -9
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +152 -48
- package/dist/check.js.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare/kv-cache-handler.d.ts +43 -1
- package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +135 -44
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.d.ts.map +1 -1
- package/dist/cloudflare/tpr.js +15 -4
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +28 -0
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +353 -79
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts.map +1 -1
- package/dist/config/dotenv.js +1 -6
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +7 -0
- package/dist/config/next-config.d.ts.map +1 -1
- package/dist/config/next-config.js +44 -19
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +81 -48
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +3 -1
- package/dist/entries/app-rsc-entry.d.ts.map +1 -1
- package/dist/entries/app-rsc-entry.js +584 -113
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.d.ts.map +1 -1
- package/dist/entries/pages-client-entry.js +5 -3
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.d.ts.map +1 -1
- package/dist/entries/pages-server-entry.js +100 -32
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/index.d.ts +24 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +327 -154
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +6 -5
- package/dist/init.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +19 -0
- package/dist/plugins/client-reference-dedup.d.ts.map +1 -0
- package/dist/plugins/client-reference-dedup.js +96 -0
- package/dist/plugins/client-reference-dedup.js.map +1 -0
- package/dist/routing/app-router.d.ts +2 -0
- package/dist/routing/app-router.d.ts.map +1 -1
- package/dist/routing/app-router.js +70 -107
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts.map +1 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.d.ts +3 -1
- package/dist/routing/pages-router.d.ts.map +1 -1
- package/dist/routing/pages-router.js +33 -18
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-validation.d.ts +8 -0
- package/dist/routing/route-validation.d.ts.map +1 -0
- package/dist/routing/route-validation.js +124 -0
- package/dist/routing/route-validation.js.map +1 -0
- package/dist/routing/utils.d.ts.map +1 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.d.ts.map +1 -1
- package/dist/server/api-handler.js +31 -9
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-router-entry.d.ts +3 -2
- package/dist/server/app-router-entry.d.ts.map +1 -1
- package/dist/server/app-router-entry.js +8 -4
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/dev-module-runner.d.ts.map +1 -1
- package/dist/server/dev-module-runner.js +1 -1
- package/dist/server/dev-module-runner.js.map +1 -1
- package/dist/server/dev-origin-check.d.ts.map +1 -1
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +39 -21
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/image-optimization.d.ts.map +1 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/instrumentation.js +1 -1
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +5 -1
- package/dist/server/isr-cache.d.ts.map +1 -1
- package/dist/server/isr-cache.js +13 -3
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +8 -2
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-routes.js +78 -45
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts +1 -1
- package/dist/server/middleware-codegen.d.ts.map +1 -1
- package/dist/server/middleware-codegen.js +177 -22
- package/dist/server/middleware-codegen.js.map +1 -1
- package/dist/server/middleware-request-headers.d.ts +9 -0
- package/dist/server/middleware-request-headers.d.ts.map +1 -0
- package/dist/server/middleware-request-headers.js +77 -0
- package/dist/server/middleware-request-headers.js.map +1 -0
- package/dist/server/middleware.d.ts +9 -8
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +112 -32
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +127 -82
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +2 -1
- package/dist/server/request-pipeline.d.ts.map +1 -1
- package/dist/server/request-pipeline.js +5 -7
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts.map +1 -1
- package/dist/shims/cache-runtime.js +21 -16
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +2 -0
- package/dist/shims/cache.d.ts.map +1 -1
- package/dist/shims/cache.js +38 -25
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/constants.d.ts.map +1 -1
- package/dist/shims/constants.js +1 -6
- package/dist/shims/constants.js.map +1 -1
- package/dist/shims/dynamic.d.ts.map +1 -1
- package/dist/shims/dynamic.js +1 -1
- package/dist/shims/dynamic.js.map +1 -1
- package/dist/shims/error-boundary.d.ts.map +1 -1
- package/dist/shims/error-boundary.js +2 -3
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts.map +1 -1
- package/dist/shims/error.js +1 -3
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +57 -30
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts.map +1 -1
- package/dist/shims/font-google-base.js +16 -4
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.generated.d.ts.map +1 -1
- package/dist/shims/font-google.generated.js +412 -206
- package/dist/shims/font-google.generated.js.map +1 -1
- package/dist/shims/font-google.js +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts.map +1 -1
- package/dist/shims/font-local.js +13 -3
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/form.d.ts.map +1 -1
- package/dist/shims/form.js +105 -10
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/head.d.ts.map +1 -1
- package/dist/shims/head.js +10 -8
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +34 -8
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +268 -53
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/image.js +35 -8
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/parse-cookie-header.d.ts +12 -0
- package/dist/shims/internal/parse-cookie-header.d.ts.map +1 -0
- package/dist/shims/internal/parse-cookie-header.js +32 -0
- package/dist/shims/internal/parse-cookie-header.js.map +1 -0
- package/dist/shims/legacy-image.d.ts.map +1 -1
- package/dist/shims/legacy-image.js +1 -1
- package/dist/shims/legacy-image.js.map +1 -1
- package/dist/shims/link.d.ts +2 -1
- package/dist/shims/link.d.ts.map +1 -1
- package/dist/shims/link.js +37 -17
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +12 -2
- package/dist/shims/metadata.d.ts.map +1 -1
- package/dist/shims/metadata.js +10 -8
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.d.ts.map +1 -1
- package/dist/shims/navigation-state.js +3 -2
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +3 -7
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/shims/navigation.js +46 -29
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/readonly-url-search-params.d.ts +11 -0
- package/dist/shims/readonly-url-search-params.d.ts.map +1 -0
- package/dist/shims/readonly-url-search-params.js +24 -0
- package/dist/shims/readonly-url-search-params.js.map +1 -0
- package/dist/shims/request-context.d.ts +50 -0
- package/dist/shims/request-context.d.ts.map +1 -0
- package/dist/shims/request-context.js +59 -0
- package/dist/shims/request-context.js.map +1 -0
- package/dist/shims/router-state.d.ts.map +1 -1
- package/dist/shims/router-state.js +2 -1
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +4 -3
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +59 -53
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.d.ts.map +1 -1
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.d.ts +14 -1
- package/dist/shims/server.d.ts.map +1 -1
- package/dist/shims/server.js +107 -47
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts.map +1 -1
- package/dist/shims/url-utils.js +1 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/base-path.d.ts +17 -0
- package/dist/utils/base-path.d.ts.map +1 -0
- package/dist/utils/base-path.js +25 -0
- package/dist/utils/base-path.js.map +1 -0
- package/dist/utils/manifest-paths.d.ts +4 -0
- package/dist/utils/manifest-paths.d.ts.map +1 -0
- package/dist/utils/manifest-paths.js +20 -0
- package/dist/utils/manifest-paths.js.map +1 -0
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +2 -4
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/query.d.ts +9 -0
- package/dist/utils/query.d.ts.map +1 -1
- package/dist/utils/query.js +59 -7
- package/dist/utils/query.js.map +1 -1
- package/package.json +47 -33
|
@@ -128,7 +128,7 @@ function __normalizePath(pathname) {
|
|
|
128
128
|
*
|
|
129
129
|
* This includes:
|
|
130
130
|
* - `matchMiddlewarePattern(pathname, pattern)` — matches a single pattern
|
|
131
|
-
* - `matchesMiddleware(pathname, matcher)` — matches the full matcher config
|
|
131
|
+
* - `matchesMiddleware(pathname, matcher, request, i18nConfig)` — matches the full matcher config
|
|
132
132
|
*
|
|
133
133
|
* The generated code depends on `__safeRegExp` being defined in the same scope
|
|
134
134
|
* (use `generateSafeRegExpCode` to emit it).
|
|
@@ -138,23 +138,15 @@ function __normalizePath(pathname) {
|
|
|
138
138
|
export function generateMiddlewareMatcherCode(style = "modern") {
|
|
139
139
|
const v = style === "modern" ? "const" : "var";
|
|
140
140
|
const l = style === "modern" ? "let" : "var";
|
|
141
|
-
const fn = style === "modern"
|
|
142
|
-
? (params, body) => `(${params}) => { ${body} }`
|
|
143
|
-
: (params, body) => `function(${params}) { ${body} }`;
|
|
144
141
|
// The pattern matching logic must be identical to matchPattern() in
|
|
145
142
|
// packages/vinext/src/server/middleware.ts. Any changes here must be
|
|
146
143
|
// mirrored there and vice versa.
|
|
147
144
|
return `
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// pass it through to RegExp directly WITHOUT dot-escaping.
|
|
151
|
-
// This guard prevents regex pattern corruption from dot-escaping.
|
|
145
|
+
${v} __mwPatternCache = new Map();
|
|
146
|
+
function __compileMwPattern(pattern) {
|
|
152
147
|
if (pattern.includes("(") || pattern.includes("\\\\")) {
|
|
153
|
-
|
|
154
|
-
if (re) return re.test(pathname);
|
|
148
|
+
return __safeRegExp("^" + pattern + "$");
|
|
155
149
|
}
|
|
156
|
-
// Single-pass tokenizer (avoids chained .replace() flagged by CodeQL as
|
|
157
|
-
// incomplete sanitization — later passes could re-process earlier outputs).
|
|
158
150
|
${l} regexStr = "";
|
|
159
151
|
${v} tokenRe = /\\/:([\\w-]+)\\*|\\/:([\\w-]+)\\+|:([\\w-]+)|[.]|[^/:.]+|./g;
|
|
160
152
|
${l} tok;
|
|
@@ -165,23 +157,186 @@ function matchMiddlewarePattern(pathname, pattern) {
|
|
|
165
157
|
else if (tok[0] === ".") { regexStr += "\\\\."; }
|
|
166
158
|
else { regexStr += tok[0]; }
|
|
167
159
|
}
|
|
168
|
-
|
|
169
|
-
|
|
160
|
+
return __safeRegExp("^" + regexStr + "$");
|
|
161
|
+
}
|
|
162
|
+
function matchMiddlewarePattern(pathname, pattern) {
|
|
163
|
+
${l} cached = __mwPatternCache.get(pattern);
|
|
164
|
+
if (cached === undefined) {
|
|
165
|
+
cached = __compileMwPattern(pattern);
|
|
166
|
+
__mwPatternCache.set(pattern, cached);
|
|
167
|
+
}
|
|
168
|
+
return cached ? cached.test(pathname) : pathname === pattern;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
${v} __middlewareConditionRegexCache = new Map();
|
|
172
|
+
// Requestless matcher checks reuse this singleton. Treat it as immutable.
|
|
173
|
+
${v} __emptyMiddlewareRequestContext = {
|
|
174
|
+
headers: new Headers(),
|
|
175
|
+
cookies: {},
|
|
176
|
+
query: new URLSearchParams(),
|
|
177
|
+
host: "",
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
function __normalizeMiddlewareHost(hostHeader, fallbackHostname) {
|
|
181
|
+
${v} host = hostHeader ?? fallbackHostname;
|
|
182
|
+
return host.split(":", 1)[0].toLowerCase();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function __parseMiddlewareCookies(cookieHeader) {
|
|
186
|
+
if (!cookieHeader) return {};
|
|
187
|
+
${v} cookies = {};
|
|
188
|
+
for (${v} part of cookieHeader.split(";")) {
|
|
189
|
+
${v} eq = part.indexOf("=");
|
|
190
|
+
if (eq === -1) continue;
|
|
191
|
+
${v} key = part.slice(0, eq).trim();
|
|
192
|
+
${v} value = part.slice(eq + 1).trim();
|
|
193
|
+
if (key) cookies[key] = value;
|
|
194
|
+
}
|
|
195
|
+
return cookies;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function __middlewareRequestContextFromRequest(request) {
|
|
199
|
+
if (!request) return __emptyMiddlewareRequestContext;
|
|
200
|
+
${v} url = new URL(request.url);
|
|
201
|
+
return {
|
|
202
|
+
headers: request.headers,
|
|
203
|
+
cookies: __parseMiddlewareCookies(request.headers.get("cookie")),
|
|
204
|
+
query: url.searchParams,
|
|
205
|
+
host: __normalizeMiddlewareHost(request.headers.get("host"), url.hostname),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function __stripMiddlewareLocalePrefix(pathname, i18nConfig) {
|
|
210
|
+
if (pathname === "/") return null;
|
|
211
|
+
${v} segments = pathname.split("/");
|
|
212
|
+
${v} firstSegment = segments[1];
|
|
213
|
+
if (!firstSegment || !i18nConfig || !i18nConfig.locales.includes(firstSegment)) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
${v} stripped = "/" + segments.slice(2).join("/");
|
|
217
|
+
return stripped === "/" ? "/" : stripped.replace(/\\/+$/, "") || "/";
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function __matchMiddlewareMatcherPattern(pathname, pattern, i18nConfig) {
|
|
221
|
+
if (!i18nConfig) return matchMiddlewarePattern(pathname, pattern);
|
|
222
|
+
${v} localeStrippedPathname = __stripMiddlewareLocalePrefix(pathname, i18nConfig);
|
|
223
|
+
return matchMiddlewarePattern(localeStrippedPathname ?? pathname, pattern);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function __middlewareConditionRegex(value) {
|
|
227
|
+
if (__middlewareConditionRegexCache.has(value)) {
|
|
228
|
+
return __middlewareConditionRegexCache.get(value);
|
|
229
|
+
}
|
|
230
|
+
${v} re = __safeRegExp(value);
|
|
231
|
+
__middlewareConditionRegexCache.set(value, re);
|
|
232
|
+
return re;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function __checkMiddlewareCondition(condition, ctx) {
|
|
236
|
+
switch (condition.type) {
|
|
237
|
+
case "header": {
|
|
238
|
+
${v} headerValue = ctx.headers.get(condition.key);
|
|
239
|
+
if (headerValue === null) return false;
|
|
240
|
+
if (condition.value !== undefined) {
|
|
241
|
+
${v} re = __middlewareConditionRegex(condition.value);
|
|
242
|
+
if (re) return re.test(headerValue);
|
|
243
|
+
return headerValue === condition.value;
|
|
244
|
+
}
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
case "cookie": {
|
|
248
|
+
${v} cookieValue = ctx.cookies[condition.key];
|
|
249
|
+
if (cookieValue === undefined) return false;
|
|
250
|
+
if (condition.value !== undefined) {
|
|
251
|
+
${v} re = __middlewareConditionRegex(condition.value);
|
|
252
|
+
if (re) return re.test(cookieValue);
|
|
253
|
+
return cookieValue === condition.value;
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
case "query": {
|
|
258
|
+
${v} queryValue = ctx.query.get(condition.key);
|
|
259
|
+
if (queryValue === null) return false;
|
|
260
|
+
if (condition.value !== undefined) {
|
|
261
|
+
${v} re = __middlewareConditionRegex(condition.value);
|
|
262
|
+
if (re) return re.test(queryValue);
|
|
263
|
+
return queryValue === condition.value;
|
|
264
|
+
}
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
case "host": {
|
|
268
|
+
if (condition.value !== undefined) {
|
|
269
|
+
${v} re = __middlewareConditionRegex(condition.value);
|
|
270
|
+
if (re) return re.test(ctx.host);
|
|
271
|
+
return ctx.host === condition.value;
|
|
272
|
+
}
|
|
273
|
+
return ctx.host === condition.key;
|
|
274
|
+
}
|
|
275
|
+
default:
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function __checkMiddlewareHasConditions(has, missing, ctx) {
|
|
281
|
+
if (has) {
|
|
282
|
+
for (${v} condition of has) {
|
|
283
|
+
if (!__checkMiddlewareCondition(condition, ctx)) return false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (missing) {
|
|
287
|
+
for (${v} condition of missing) {
|
|
288
|
+
if (__checkMiddlewareCondition(condition, ctx)) return false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Keep this in sync with isValidMiddlewareMatcherObject in middleware.ts.
|
|
295
|
+
function __isValidMiddlewareMatcherObject(matcher) {
|
|
296
|
+
if (!matcher || typeof matcher !== "object" || Array.isArray(matcher)) return false;
|
|
297
|
+
if (typeof matcher.source !== "string") return false;
|
|
298
|
+
for (${v} key of Object.keys(matcher)) {
|
|
299
|
+
if (key !== "source" && key !== "locale" && key !== "has" && key !== "missing") {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if ("locale" in matcher && matcher.locale !== undefined && matcher.locale !== false) return false;
|
|
304
|
+
if ("has" in matcher && matcher.has !== undefined && !Array.isArray(matcher.has)) return false;
|
|
305
|
+
if ("missing" in matcher && matcher.missing !== undefined && !Array.isArray(matcher.missing)) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
return true;
|
|
170
309
|
}
|
|
171
310
|
|
|
172
|
-
function
|
|
311
|
+
function __matchMiddlewareObject(pathname, matcher, i18nConfig) {
|
|
312
|
+
return matcher.locale === false
|
|
313
|
+
? matchMiddlewarePattern(pathname, matcher.source)
|
|
314
|
+
: __matchMiddlewareMatcherPattern(pathname, matcher.source, i18nConfig);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function matchesMiddleware(pathname, matcher, request, i18nConfig) {
|
|
173
318
|
if (!matcher) {
|
|
174
319
|
return true;
|
|
175
320
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
321
|
+
if (typeof matcher === "string") {
|
|
322
|
+
return __matchMiddlewareMatcherPattern(pathname, matcher, i18nConfig);
|
|
323
|
+
}
|
|
324
|
+
if (!Array.isArray(matcher)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
${v} requestContext = __middlewareRequestContextFromRequest(request);
|
|
328
|
+
for (${v} m of matcher) {
|
|
329
|
+
if (typeof m === "string") {
|
|
330
|
+
if (__matchMiddlewareMatcherPattern(pathname, m, i18nConfig)) return true;
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (__isValidMiddlewareMatcherObject(m)) {
|
|
334
|
+
if (!__matchMiddlewareObject(pathname, m, i18nConfig)) continue;
|
|
335
|
+
if (!__checkMiddlewareHasConditions(m.has, m.missing, requestContext)) continue;
|
|
336
|
+
return true;
|
|
182
337
|
}
|
|
183
338
|
}
|
|
184
|
-
return
|
|
339
|
+
return false;
|
|
185
340
|
}`;
|
|
186
341
|
}
|
|
187
342
|
//# sourceMappingURL=middleware-codegen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-codegen.js","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,QAAQ;IACvE,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;IAEL,CAAC;IACD,CAAC;IACD,CAAC;;MAEC,CAAC;;;;;;;;;;;;;;;;;;;QAmBC,CAAC;;QAED,CAAC;;;;;;;;;;;;;;QAcD,CAAC;;;;;;;;QAQD,CAAC;;;;;;;;;;;;;;;;;;EAkBP,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA0B,QAAQ;IAC1E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;;;;;;;;;;;;;IAcL,CAAC;IACD,CAAC;SACI,CAAC;MACJ,CAAC;;;;;;EAML,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAA0B,QAAQ;IAC9E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,MAAM,EAAE,GAAG,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,MAAM,UAAU,IAAI,IAAI;QAChE,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,YAAY,MAAM,OAAO,IAAI,IAAI,CAAC;IAExE,oEAAoE;IACpE,qEAAqE;IACrE,iCAAiC;IACjC,OAAO;;;;;;MAMH,CAAC;;;;;IAKH,CAAC;IACD,CAAC;IACD,CAAC;;;;;;;;IAQD,CAAC;;;;;;;;IAQD,CAAC;;;WAGM,CAAC;;;;;yBAKa,EAAE,CAAC,GAAG,EAAE,6CAA6C,CAAC;EAC7E,CAAC;AACH,CAAC","sourcesContent":["/**\n * Shared middleware matching code generator.\n *\n * Both the App Router RSC entry (entries/app-rsc-entry.ts) and the Pages Router\n * production entry (index.ts) need middleware matching logic inlined as\n * generated JavaScript strings. This module provides a single source of\n * truth to prevent the implementations from diverging.\n *\n * The regex detection guard (checking for \"(\" or \"\\\\\") is critical.\n * Without it, dot-escaping corrupts regex patterns like\n * /((?!api|_next).*), causing middleware to silently skip paths.\n */\n\n/**\n * Returns the generated JavaScript source for `__isSafeRegex` and `__safeRegExp`.\n *\n * @param style - \"modern\" emits const/let (for RSC entry), \"es5\" emits var (for prod entry)\n */\nexport function generateSafeRegExpCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __isSafeRegex(pattern) {\n ${v} quantifierAtDepth = [];\n ${l} depth = 0;\n ${l} i = 0;\n while (i < pattern.length) {\n ${v} ch = pattern[i];\n if (ch === \"\\\\\\\\\") { i += 2; continue; }\n if (ch === \"[\") {\n i++;\n while (i < pattern.length && pattern[i] !== \"]\") {\n if (pattern[i] === \"\\\\\\\\\") i++;\n i++;\n }\n i++;\n continue;\n }\n if (ch === \"(\") {\n depth++;\n if (quantifierAtDepth.length <= depth) quantifierAtDepth.push(false);\n else quantifierAtDepth[depth] = false;\n i++;\n continue;\n }\n if (ch === \")\") {\n ${v} hadQ = depth > 0 && quantifierAtDepth[depth];\n if (depth > 0) depth--;\n ${v} next = pattern[i + 1];\n if (next === \"+\" || next === \"*\" || next === \"{\") {\n if (hadQ) return false;\n if (depth >= 0 && depth < quantifierAtDepth.length) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"+\" || ch === \"*\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i++;\n continue;\n }\n if (ch === \"?\") {\n ${v} prev = i > 0 ? pattern[i - 1] : \"\";\n if (prev !== \"+\" && prev !== \"*\" && prev !== \"?\" && prev !== \"}\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n ${l} j = i + 1;\n while (j < pattern.length && /[\\\\d,]/.test(pattern[j])) j++;\n if (j < pattern.length && pattern[j] === \"}\" && j > i + 1) {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i = j + 1;\n continue;\n }\n }\n i++;\n }\n return true;\n}\nfunction __safeRegExp(pattern, flags) {\n if (!__isSafeRegex(pattern)) {\n console.warn(\"[vinext] Ignoring potentially unsafe regex pattern (ReDoS risk): \" + pattern);\n return null;\n }\n try { return new RegExp(pattern, flags); } catch { return null; }\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for `__normalizePath`.\n *\n * This must be kept in sync with `normalizePath()` in `normalize-path.ts`.\n * The inline version is used by codegen entries that can't import modules.\n *\n * @param style - \"modern\" emits const/let, \"es5\" emits var\n */\nexport function generateNormalizePathCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __normalizePath(pathname) {\n if (\n pathname === \"/\" ||\n (pathname.length > 1 &&\n pathname[0] === \"/\" &&\n !pathname.includes(\"//\") &&\n !pathname.includes(\"/./\") &&\n !pathname.includes(\"/../\") &&\n !pathname.endsWith(\"/.\") &&\n !pathname.endsWith(\"/..\"))\n ) {\n return pathname;\n }\n ${v} segments = pathname.split(\"/\");\n ${v} resolved = [];\n for (${l} i = 0; i < segments.length; i++) {\n ${v} seg = segments[i];\n if (seg === \"\" || seg === \".\") continue;\n if (seg === \"..\") { resolved.pop(); }\n else { resolved.push(seg); }\n }\n return \"/\" + resolved.join(\"/\");\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for middleware pattern matching.\n *\n * This includes:\n * - `matchMiddlewarePattern(pathname, pattern)` — matches a single pattern\n * - `matchesMiddleware(pathname, matcher)` — matches the full matcher config\n *\n * The generated code depends on `__safeRegExp` being defined in the same scope\n * (use `generateSafeRegExpCode` to emit it).\n *\n * @param style - \"modern\" emits const/let/arrow functions, \"es5\" emits var/function\n */\nexport function generateMiddlewareMatcherCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n const fn = style === \"modern\"\n ? (params: string, body: string) => `(${params}) => { ${body} }`\n : (params: string, body: string) => `function(${params}) { ${body} }`;\n\n // The pattern matching logic must be identical to matchPattern() in\n // packages/vinext/src/server/middleware.ts. Any changes here must be\n // mirrored there and vice versa.\n return `\nfunction matchMiddlewarePattern(pathname, pattern) {\n // Regex patterns: if the pattern contains \"(\" or \"\\\\\" it's a regex —\n // pass it through to RegExp directly WITHOUT dot-escaping.\n // This guard prevents regex pattern corruption from dot-escaping.\n if (pattern.includes(\"(\") || pattern.includes(\"\\\\\\\\\")) {\n ${v} re = __safeRegExp(\"^\" + pattern + \"$\");\n if (re) return re.test(pathname);\n }\n // Single-pass tokenizer (avoids chained .replace() flagged by CodeQL as\n // incomplete sanitization — later passes could re-process earlier outputs).\n ${l} regexStr = \"\";\n ${v} tokenRe = /\\\\/:([\\\\w-]+)\\\\*|\\\\/:([\\\\w-]+)\\\\+|:([\\\\w-]+)|[.]|[^/:.]+|./g;\n ${l} tok;\n while ((tok = tokenRe.exec(pattern)) !== null) {\n if (tok[1] !== undefined) { regexStr += \"(?:/.*)?\"; }\n else if (tok[2] !== undefined) { regexStr += \"(?:/.+)\"; }\n else if (tok[3] !== undefined) { regexStr += \"([^/]+)\"; }\n else if (tok[0] === \".\") { regexStr += \"\\\\\\\\.\"; }\n else { regexStr += tok[0]; }\n }\n ${v} re2 = __safeRegExp(\"^\" + regexStr + \"$\");\n return re2 ? re2.test(pathname) : pathname === pattern;\n}\n\nfunction matchesMiddleware(pathname, matcher) {\n if (!matcher) {\n return true;\n }\n ${v} patterns = [];\n if (typeof matcher === \"string\") { patterns.push(matcher); }\n else if (Array.isArray(matcher)) {\n for (${v} m of matcher) {\n if (typeof m === \"string\") patterns.push(m);\n else if (m && typeof m === \"object\" && \"source\" in m) patterns.push(m.source);\n }\n }\n return patterns.some(${fn(\"p\", \"return matchMiddlewarePattern(pathname, p);\")});\n}`;\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"file":"middleware-codegen.js","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,QAAQ;IACvE,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;IAEL,CAAC;IACD,CAAC;IACD,CAAC;;MAEC,CAAC;;;;;;;;;;;;;;;;;;;QAmBC,CAAC;;QAED,CAAC;;;;;;;;;;;;;;QAcD,CAAC;;;;;;;;QAQD,CAAC;;;;;;;;;;;;;;;;;;EAkBP,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA0B,QAAQ;IAC1E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;;;;;;;;;;;;;IAcL,CAAC;IACD,CAAC;SACI,CAAC;MACJ,CAAC;;;;;;EAML,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAA0B,QAAQ;IAC9E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAE7C,oEAAoE;IACpE,qEAAqE;IACrE,iCAAiC;IACjC,OAAO;EACP,CAAC;;;;;IAKC,CAAC;IACD,CAAC;IACD,CAAC;;;;;;;;;;;IAWD,CAAC;;;;;;;;EAQH,CAAC;;EAED,CAAC;;;;;;;;IAQC,CAAC;;;;;;IAMD,CAAC;SACI,CAAC;MACJ,CAAC;;MAED,CAAC;MACD,CAAC;;;;;;;;IAQH,CAAC;;;;;;;;;;;IAWD,CAAC;IACD,CAAC;;;;IAID,CAAC;;;;;;IAMD,CAAC;;;;;;;;IAQD,CAAC;;;;;;;;QAQG,CAAC;;;UAGC,CAAC;;;;;;;QAOH,CAAC;;;UAGC,CAAC;;;;;;;QAOH,CAAC;;;UAGC,CAAC;;;;;;;;UAQD,CAAC;;;;;;;;;;;;;WAaA,CAAC;;;;;WAKD,CAAC;;;;;;;;;;;SAWH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6BN,CAAC;SACI,CAAC;;;;;;;;;;;;EAYR,CAAC;AACH,CAAC","sourcesContent":["/**\n * Shared middleware matching code generator.\n *\n * Both the App Router RSC entry (entries/app-rsc-entry.ts) and the Pages Router\n * production entry (index.ts) need middleware matching logic inlined as\n * generated JavaScript strings. This module provides a single source of\n * truth to prevent the implementations from diverging.\n *\n * The regex detection guard (checking for \"(\" or \"\\\\\") is critical.\n * Without it, dot-escaping corrupts regex patterns like\n * /((?!api|_next).*), causing middleware to silently skip paths.\n */\n\n/**\n * Returns the generated JavaScript source for `__isSafeRegex` and `__safeRegExp`.\n *\n * @param style - \"modern\" emits const/let (for RSC entry), \"es5\" emits var (for prod entry)\n */\nexport function generateSafeRegExpCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __isSafeRegex(pattern) {\n ${v} quantifierAtDepth = [];\n ${l} depth = 0;\n ${l} i = 0;\n while (i < pattern.length) {\n ${v} ch = pattern[i];\n if (ch === \"\\\\\\\\\") { i += 2; continue; }\n if (ch === \"[\") {\n i++;\n while (i < pattern.length && pattern[i] !== \"]\") {\n if (pattern[i] === \"\\\\\\\\\") i++;\n i++;\n }\n i++;\n continue;\n }\n if (ch === \"(\") {\n depth++;\n if (quantifierAtDepth.length <= depth) quantifierAtDepth.push(false);\n else quantifierAtDepth[depth] = false;\n i++;\n continue;\n }\n if (ch === \")\") {\n ${v} hadQ = depth > 0 && quantifierAtDepth[depth];\n if (depth > 0) depth--;\n ${v} next = pattern[i + 1];\n if (next === \"+\" || next === \"*\" || next === \"{\") {\n if (hadQ) return false;\n if (depth >= 0 && depth < quantifierAtDepth.length) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"+\" || ch === \"*\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i++;\n continue;\n }\n if (ch === \"?\") {\n ${v} prev = i > 0 ? pattern[i - 1] : \"\";\n if (prev !== \"+\" && prev !== \"*\" && prev !== \"?\" && prev !== \"}\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n ${l} j = i + 1;\n while (j < pattern.length && /[\\\\d,]/.test(pattern[j])) j++;\n if (j < pattern.length && pattern[j] === \"}\" && j > i + 1) {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i = j + 1;\n continue;\n }\n }\n i++;\n }\n return true;\n}\nfunction __safeRegExp(pattern, flags) {\n if (!__isSafeRegex(pattern)) {\n console.warn(\"[vinext] Ignoring potentially unsafe regex pattern (ReDoS risk): \" + pattern);\n return null;\n }\n try { return new RegExp(pattern, flags); } catch { return null; }\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for `__normalizePath`.\n *\n * This must be kept in sync with `normalizePath()` in `normalize-path.ts`.\n * The inline version is used by codegen entries that can't import modules.\n *\n * @param style - \"modern\" emits const/let, \"es5\" emits var\n */\nexport function generateNormalizePathCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __normalizePath(pathname) {\n if (\n pathname === \"/\" ||\n (pathname.length > 1 &&\n pathname[0] === \"/\" &&\n !pathname.includes(\"//\") &&\n !pathname.includes(\"/./\") &&\n !pathname.includes(\"/../\") &&\n !pathname.endsWith(\"/.\") &&\n !pathname.endsWith(\"/..\"))\n ) {\n return pathname;\n }\n ${v} segments = pathname.split(\"/\");\n ${v} resolved = [];\n for (${l} i = 0; i < segments.length; i++) {\n ${v} seg = segments[i];\n if (seg === \"\" || seg === \".\") continue;\n if (seg === \"..\") { resolved.pop(); }\n else { resolved.push(seg); }\n }\n return \"/\" + resolved.join(\"/\");\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for middleware pattern matching.\n *\n * This includes:\n * - `matchMiddlewarePattern(pathname, pattern)` — matches a single pattern\n * - `matchesMiddleware(pathname, matcher, request, i18nConfig)` — matches the full matcher config\n *\n * The generated code depends on `__safeRegExp` being defined in the same scope\n * (use `generateSafeRegExpCode` to emit it).\n *\n * @param style - \"modern\" emits const/let/arrow functions, \"es5\" emits var/function\n */\nexport function generateMiddlewareMatcherCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n\n // The pattern matching logic must be identical to matchPattern() in\n // packages/vinext/src/server/middleware.ts. Any changes here must be\n // mirrored there and vice versa.\n return `\n${v} __mwPatternCache = new Map();\nfunction __compileMwPattern(pattern) {\n if (pattern.includes(\"(\") || pattern.includes(\"\\\\\\\\\")) {\n return __safeRegExp(\"^\" + pattern + \"$\");\n }\n ${l} regexStr = \"\";\n ${v} tokenRe = /\\\\/:([\\\\w-]+)\\\\*|\\\\/:([\\\\w-]+)\\\\+|:([\\\\w-]+)|[.]|[^/:.]+|./g;\n ${l} tok;\n while ((tok = tokenRe.exec(pattern)) !== null) {\n if (tok[1] !== undefined) { regexStr += \"(?:/.*)?\"; }\n else if (tok[2] !== undefined) { regexStr += \"(?:/.+)\"; }\n else if (tok[3] !== undefined) { regexStr += \"([^/]+)\"; }\n else if (tok[0] === \".\") { regexStr += \"\\\\\\\\.\"; }\n else { regexStr += tok[0]; }\n }\n return __safeRegExp(\"^\" + regexStr + \"$\");\n}\nfunction matchMiddlewarePattern(pathname, pattern) {\n ${l} cached = __mwPatternCache.get(pattern);\n if (cached === undefined) {\n cached = __compileMwPattern(pattern);\n __mwPatternCache.set(pattern, cached);\n }\n return cached ? cached.test(pathname) : pathname === pattern;\n}\n\n${v} __middlewareConditionRegexCache = new Map();\n// Requestless matcher checks reuse this singleton. Treat it as immutable.\n${v} __emptyMiddlewareRequestContext = {\n headers: new Headers(),\n cookies: {},\n query: new URLSearchParams(),\n host: \"\",\n};\n\nfunction __normalizeMiddlewareHost(hostHeader, fallbackHostname) {\n ${v} host = hostHeader ?? fallbackHostname;\n return host.split(\":\", 1)[0].toLowerCase();\n}\n\nfunction __parseMiddlewareCookies(cookieHeader) {\n if (!cookieHeader) return {};\n ${v} cookies = {};\n for (${v} part of cookieHeader.split(\";\")) {\n ${v} eq = part.indexOf(\"=\");\n if (eq === -1) continue;\n ${v} key = part.slice(0, eq).trim();\n ${v} value = part.slice(eq + 1).trim();\n if (key) cookies[key] = value;\n }\n return cookies;\n}\n\nfunction __middlewareRequestContextFromRequest(request) {\n if (!request) return __emptyMiddlewareRequestContext;\n ${v} url = new URL(request.url);\n return {\n headers: request.headers,\n cookies: __parseMiddlewareCookies(request.headers.get(\"cookie\")),\n query: url.searchParams,\n host: __normalizeMiddlewareHost(request.headers.get(\"host\"), url.hostname),\n };\n}\n\nfunction __stripMiddlewareLocalePrefix(pathname, i18nConfig) {\n if (pathname === \"/\") return null;\n ${v} segments = pathname.split(\"/\");\n ${v} firstSegment = segments[1];\n if (!firstSegment || !i18nConfig || !i18nConfig.locales.includes(firstSegment)) {\n return null;\n }\n ${v} stripped = \"/\" + segments.slice(2).join(\"/\");\n return stripped === \"/\" ? \"/\" : stripped.replace(/\\\\/+$/, \"\") || \"/\";\n}\n\nfunction __matchMiddlewareMatcherPattern(pathname, pattern, i18nConfig) {\n if (!i18nConfig) return matchMiddlewarePattern(pathname, pattern);\n ${v} localeStrippedPathname = __stripMiddlewareLocalePrefix(pathname, i18nConfig);\n return matchMiddlewarePattern(localeStrippedPathname ?? pathname, pattern);\n}\n\nfunction __middlewareConditionRegex(value) {\n if (__middlewareConditionRegexCache.has(value)) {\n return __middlewareConditionRegexCache.get(value);\n }\n ${v} re = __safeRegExp(value);\n __middlewareConditionRegexCache.set(value, re);\n return re;\n}\n\nfunction __checkMiddlewareCondition(condition, ctx) {\n switch (condition.type) {\n case \"header\": {\n ${v} headerValue = ctx.headers.get(condition.key);\n if (headerValue === null) return false;\n if (condition.value !== undefined) {\n ${v} re = __middlewareConditionRegex(condition.value);\n if (re) return re.test(headerValue);\n return headerValue === condition.value;\n }\n return true;\n }\n case \"cookie\": {\n ${v} cookieValue = ctx.cookies[condition.key];\n if (cookieValue === undefined) return false;\n if (condition.value !== undefined) {\n ${v} re = __middlewareConditionRegex(condition.value);\n if (re) return re.test(cookieValue);\n return cookieValue === condition.value;\n }\n return true;\n }\n case \"query\": {\n ${v} queryValue = ctx.query.get(condition.key);\n if (queryValue === null) return false;\n if (condition.value !== undefined) {\n ${v} re = __middlewareConditionRegex(condition.value);\n if (re) return re.test(queryValue);\n return queryValue === condition.value;\n }\n return true;\n }\n case \"host\": {\n if (condition.value !== undefined) {\n ${v} re = __middlewareConditionRegex(condition.value);\n if (re) return re.test(ctx.host);\n return ctx.host === condition.value;\n }\n return ctx.host === condition.key;\n }\n default:\n return false;\n }\n}\n\nfunction __checkMiddlewareHasConditions(has, missing, ctx) {\n if (has) {\n for (${v} condition of has) {\n if (!__checkMiddlewareCondition(condition, ctx)) return false;\n }\n }\n if (missing) {\n for (${v} condition of missing) {\n if (__checkMiddlewareCondition(condition, ctx)) return false;\n }\n }\n return true;\n}\n\n// Keep this in sync with isValidMiddlewareMatcherObject in middleware.ts.\nfunction __isValidMiddlewareMatcherObject(matcher) {\n if (!matcher || typeof matcher !== \"object\" || Array.isArray(matcher)) return false;\n if (typeof matcher.source !== \"string\") return false;\n for (${v} key of Object.keys(matcher)) {\n if (key !== \"source\" && key !== \"locale\" && key !== \"has\" && key !== \"missing\") {\n return false;\n }\n }\n if (\"locale\" in matcher && matcher.locale !== undefined && matcher.locale !== false) return false;\n if (\"has\" in matcher && matcher.has !== undefined && !Array.isArray(matcher.has)) return false;\n if (\"missing\" in matcher && matcher.missing !== undefined && !Array.isArray(matcher.missing)) {\n return false;\n }\n return true;\n}\n\nfunction __matchMiddlewareObject(pathname, matcher, i18nConfig) {\n return matcher.locale === false\n ? matchMiddlewarePattern(pathname, matcher.source)\n : __matchMiddlewareMatcherPattern(pathname, matcher.source, i18nConfig);\n}\n\nfunction matchesMiddleware(pathname, matcher, request, i18nConfig) {\n if (!matcher) {\n return true;\n }\n if (typeof matcher === \"string\") {\n return __matchMiddlewareMatcherPattern(pathname, matcher, i18nConfig);\n }\n if (!Array.isArray(matcher)) {\n return false;\n }\n ${v} requestContext = __middlewareRequestContextFromRequest(request);\n for (${v} m of matcher) {\n if (typeof m === \"string\") {\n if (__matchMiddlewareMatcherPattern(pathname, m, i18nConfig)) return true;\n continue;\n }\n if (__isValidMiddlewareMatcherObject(m)) {\n if (!__matchMiddlewareObject(pathname, m, i18nConfig)) continue;\n if (!__checkMiddlewareHasConditions(m.has, m.missing, requestContext)) continue;\n return true;\n }\n }\n return false;\n}`;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
|
|
2
|
+
export declare const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
|
|
3
|
+
type MiddlewareHeaderValue = string | string[];
|
|
4
|
+
type MiddlewareHeaderSource = Headers | Record<string, MiddlewareHeaderValue>;
|
|
5
|
+
export declare function encodeMiddlewareRequestHeaders(targetHeaders: Headers, requestHeaders: Headers): void;
|
|
6
|
+
export declare function buildRequestHeadersFromMiddlewareResponse(baseHeaders: Headers, middlewareHeaders: MiddlewareHeaderSource): Headers | null;
|
|
7
|
+
export declare function shouldKeepMiddlewareHeader(key: string): boolean;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=middleware-request-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-request-headers.d.ts","sourceRoot":"","sources":["../../src/server/middleware-request-headers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gCAAgC,0BAA0B,CAAC;AACxE,eAAO,MAAM,2BAA2B,kCAAkC,CAAC;AAE3E,KAAK,qBAAqB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAC/C,KAAK,sBAAsB,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAkD9E,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,OAAO,EACtB,cAAc,EAAE,OAAO,GACtB,IAAI,CAON;AAED,wBAAgB,yCAAyC,CACvD,WAAW,EAAE,OAAO,EACpB,iBAAiB,EAAE,sBAAsB,GACxC,OAAO,GAAG,IAAI,CAyBhB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
|
|
2
|
+
export const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
|
|
3
|
+
function getMiddlewareHeaderValue(source, key) {
|
|
4
|
+
if (source instanceof Headers) {
|
|
5
|
+
return source.get(key);
|
|
6
|
+
}
|
|
7
|
+
const value = source[key];
|
|
8
|
+
if (value === undefined)
|
|
9
|
+
return null;
|
|
10
|
+
return Array.isArray(value) ? (value[0] ?? null) : value;
|
|
11
|
+
}
|
|
12
|
+
function getOverrideHeaderNames(source) {
|
|
13
|
+
const rawValue = getMiddlewareHeaderValue(source, MIDDLEWARE_OVERRIDE_HEADERS);
|
|
14
|
+
if (rawValue === null)
|
|
15
|
+
return null;
|
|
16
|
+
return rawValue
|
|
17
|
+
.split(",")
|
|
18
|
+
.map((key) => key.trim())
|
|
19
|
+
.filter(Boolean);
|
|
20
|
+
}
|
|
21
|
+
function getForwardedRequestHeaders(source) {
|
|
22
|
+
const forwardedHeaders = new Map();
|
|
23
|
+
if (source instanceof Headers) {
|
|
24
|
+
for (const [key, value] of source.entries()) {
|
|
25
|
+
if (key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX)) {
|
|
26
|
+
forwardedHeaders.set(key.slice(MIDDLEWARE_REQUEST_HEADER_PREFIX.length), value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return forwardedHeaders;
|
|
30
|
+
}
|
|
31
|
+
for (const [key, value] of Object.entries(source)) {
|
|
32
|
+
if (!key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX))
|
|
33
|
+
continue;
|
|
34
|
+
const normalizedValue = Array.isArray(value) ? (value[0] ?? "") : value;
|
|
35
|
+
forwardedHeaders.set(key.slice(MIDDLEWARE_REQUEST_HEADER_PREFIX.length), normalizedValue);
|
|
36
|
+
}
|
|
37
|
+
return forwardedHeaders;
|
|
38
|
+
}
|
|
39
|
+
function cloneHeaders(source) {
|
|
40
|
+
const cloned = new Headers();
|
|
41
|
+
for (const [key, value] of source.entries()) {
|
|
42
|
+
cloned.append(key, value);
|
|
43
|
+
}
|
|
44
|
+
return cloned;
|
|
45
|
+
}
|
|
46
|
+
export function encodeMiddlewareRequestHeaders(targetHeaders, requestHeaders) {
|
|
47
|
+
const overrideHeaderNames = [...requestHeaders.keys()];
|
|
48
|
+
targetHeaders.set(MIDDLEWARE_OVERRIDE_HEADERS, overrideHeaderNames.join(","));
|
|
49
|
+
for (const [key, value] of requestHeaders.entries()) {
|
|
50
|
+
targetHeaders.set(`${MIDDLEWARE_REQUEST_HEADER_PREFIX}${key}`, value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function buildRequestHeadersFromMiddlewareResponse(baseHeaders, middlewareHeaders) {
|
|
54
|
+
const overrideHeaderNames = getOverrideHeaderNames(middlewareHeaders);
|
|
55
|
+
const forwardedHeaders = getForwardedRequestHeaders(middlewareHeaders);
|
|
56
|
+
if (overrideHeaderNames === null && forwardedHeaders.size === 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const nextHeaders = overrideHeaderNames === null ? cloneHeaders(baseHeaders) : new Headers();
|
|
60
|
+
if (overrideHeaderNames === null) {
|
|
61
|
+
for (const [key, value] of forwardedHeaders) {
|
|
62
|
+
nextHeaders.set(key, value);
|
|
63
|
+
}
|
|
64
|
+
return nextHeaders;
|
|
65
|
+
}
|
|
66
|
+
for (const key of overrideHeaderNames) {
|
|
67
|
+
const value = forwardedHeaders.get(key);
|
|
68
|
+
if (value !== undefined) {
|
|
69
|
+
nextHeaders.set(key, value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return nextHeaders;
|
|
73
|
+
}
|
|
74
|
+
export function shouldKeepMiddlewareHeader(key) {
|
|
75
|
+
return key === MIDDLEWARE_OVERRIDE_HEADERS || key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=middleware-request-headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-request-headers.js","sourceRoot":"","sources":["../../src/server/middleware-request-headers.ts"],"names":[],"mappings":"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","sourcesContent":["export const MIDDLEWARE_REQUEST_HEADER_PREFIX = \"x-middleware-request-\";\nexport const MIDDLEWARE_OVERRIDE_HEADERS = \"x-middleware-override-headers\";\n\ntype MiddlewareHeaderValue = string | string[];\ntype MiddlewareHeaderSource = Headers | Record<string, MiddlewareHeaderValue>;\n\nfunction getMiddlewareHeaderValue(source: MiddlewareHeaderSource, key: string): string | null {\n if (source instanceof Headers) {\n return source.get(key);\n }\n\n const value = source[key];\n if (value === undefined) return null;\n return Array.isArray(value) ? (value[0] ?? null) : value;\n}\n\nfunction getOverrideHeaderNames(source: MiddlewareHeaderSource): string[] | null {\n const rawValue = getMiddlewareHeaderValue(source, MIDDLEWARE_OVERRIDE_HEADERS);\n if (rawValue === null) return null;\n return rawValue\n .split(\",\")\n .map((key) => key.trim())\n .filter(Boolean);\n}\n\nfunction getForwardedRequestHeaders(source: MiddlewareHeaderSource): Map<string, string> {\n const forwardedHeaders = new Map<string, string>();\n\n if (source instanceof Headers) {\n for (const [key, value] of source.entries()) {\n if (key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX)) {\n forwardedHeaders.set(key.slice(MIDDLEWARE_REQUEST_HEADER_PREFIX.length), value);\n }\n }\n return forwardedHeaders;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (!key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX)) continue;\n const normalizedValue = Array.isArray(value) ? (value[0] ?? \"\") : value;\n forwardedHeaders.set(key.slice(MIDDLEWARE_REQUEST_HEADER_PREFIX.length), normalizedValue);\n }\n\n return forwardedHeaders;\n}\n\nfunction cloneHeaders(source: Headers): Headers {\n const cloned = new Headers();\n for (const [key, value] of source.entries()) {\n cloned.append(key, value);\n }\n return cloned;\n}\n\nexport function encodeMiddlewareRequestHeaders(\n targetHeaders: Headers,\n requestHeaders: Headers,\n): void {\n const overrideHeaderNames = [...requestHeaders.keys()];\n targetHeaders.set(MIDDLEWARE_OVERRIDE_HEADERS, overrideHeaderNames.join(\",\"));\n\n for (const [key, value] of requestHeaders.entries()) {\n targetHeaders.set(`${MIDDLEWARE_REQUEST_HEADER_PREFIX}${key}`, value);\n }\n}\n\nexport function buildRequestHeadersFromMiddlewareResponse(\n baseHeaders: Headers,\n middlewareHeaders: MiddlewareHeaderSource,\n): Headers | null {\n const overrideHeaderNames = getOverrideHeaderNames(middlewareHeaders);\n const forwardedHeaders = getForwardedRequestHeaders(middlewareHeaders);\n\n if (overrideHeaderNames === null && forwardedHeaders.size === 0) {\n return null;\n }\n\n const nextHeaders = overrideHeaderNames === null ? cloneHeaders(baseHeaders) : new Headers();\n\n if (overrideHeaderNames === null) {\n for (const [key, value] of forwardedHeaders) {\n nextHeaders.set(key, value);\n }\n return nextHeaders;\n }\n\n for (const key of overrideHeaderNames) {\n const value = forwardedHeaders.get(key);\n if (value !== undefined) {\n nextHeaders.set(key, value);\n }\n }\n\n return nextHeaders;\n}\n\nexport function shouldKeepMiddlewareHeader(key: string): boolean {\n return key === MIDDLEWARE_OVERRIDE_HEADERS || key.startsWith(MIDDLEWARE_REQUEST_HEADER_PREFIX);\n}\n"]}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* Supports the `config.matcher` export for path filtering.
|
|
19
19
|
*/
|
|
20
20
|
import type { ModuleRunner } from "vite/module-runner";
|
|
21
|
+
import type { HasCondition, NextI18nConfig } from "../config/next-config.js";
|
|
21
22
|
/**
|
|
22
23
|
* Determine whether a middleware/proxy file path refers to a proxy file.
|
|
23
24
|
* proxy.ts files accept `proxy` or `default` exports.
|
|
@@ -47,19 +48,19 @@ export declare function resolveMiddlewareHandler(mod: Record<string, unknown>, f
|
|
|
47
48
|
*/
|
|
48
49
|
export declare function findMiddlewareFile(root: string): string | null;
|
|
49
50
|
/** Matcher pattern from middleware config export. */
|
|
50
|
-
type
|
|
51
|
+
type MiddlewareMatcherObject = {
|
|
51
52
|
source: string;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
locale?: false;
|
|
54
|
+
has?: HasCondition[];
|
|
55
|
+
missing?: HasCondition[];
|
|
56
|
+
};
|
|
57
|
+
type MatcherConfig = string | Array<string | MiddlewareMatcherObject>;
|
|
57
58
|
/**
|
|
58
59
|
* Check if a pathname matches the middleware matcher config.
|
|
59
60
|
* If no matcher is configured, middleware runs on all paths
|
|
60
61
|
* except static files and internal Next.js paths.
|
|
61
62
|
*/
|
|
62
|
-
export declare function matchesMiddleware(pathname: string, matcher: MatcherConfig | undefined): boolean;
|
|
63
|
+
export declare function matchesMiddleware(pathname: string, matcher: MatcherConfig | undefined, request?: Request, i18nConfig?: NextI18nConfig | null): boolean;
|
|
63
64
|
/**
|
|
64
65
|
* Match a single pattern against a pathname.
|
|
65
66
|
* Supports Next.js matcher patterns:
|
|
@@ -98,6 +99,6 @@ export interface MiddlewareResult {
|
|
|
98
99
|
* @param request - The incoming Request object
|
|
99
100
|
* @returns Middleware result describing what action to take
|
|
100
101
|
*/
|
|
101
|
-
export declare function runMiddleware(runner: ModuleRunner, middlewarePath: string, request: Request): Promise<MiddlewareResult>;
|
|
102
|
+
export declare function runMiddleware(runner: ModuleRunner, middlewarePath: string, request: Request, i18nConfig?: NextI18nConfig | null): Promise<MiddlewareResult>;
|
|
102
103
|
export {};
|
|
103
104
|
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK7E;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAajG;AA0BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB9D;AAED,qDAAqD;AACrD,KAAK,uBAAuB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B,CAAC;AAEF,KAAK,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,uBAAuB,CAAC,CAAC;AAStE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,GACjC,OAAO,CAwCT;AAyED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQvE;AAqCD,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAoI3B"}
|