f354f46b3f
This PR deprecates declaring a middleware under `pages` in favour of the project root naming it after `middleware` instead of `_middleware`. This is in the context of having a simpler execution model for middleware and also ships some refactor work. There is a ton of a code to be simplified after this deprecation but I think it is best to do it progressively. With this PR, when in development, we will **fail** whenever we find a nested middleware but we do **not** include it in the compiler so if the project is using it, it will no longer work. For production we will **fail** too so it will not be possible to build and deploy a deprecated middleware. The error points to a page that should also be reviewed as part of **documentation**. Aside from the deprecation, this migrates all middleware tests to work with a single middleware. It also splits tests into multiple folders to make them easier to isolate and work with. Finally it ships some small code refactor and simplifications.
41 lines
1 KiB
TypeScript
41 lines
1 KiB
TypeScript
import type { RouteRegex } from './route-regex'
|
|
import { DecodeError } from '../../utils'
|
|
|
|
export interface RouteMatch {
|
|
(pathname: string | null | undefined): false | Params
|
|
}
|
|
|
|
export interface Params {
|
|
[param: string]: any
|
|
}
|
|
|
|
export function getRouteMatcher({ re, groups }: RouteRegex): RouteMatch {
|
|
return (pathname: string | null | undefined) => {
|
|
const routeMatch = re.exec(pathname!)
|
|
if (!routeMatch) {
|
|
return false
|
|
}
|
|
|
|
const decode = (param: string) => {
|
|
try {
|
|
return decodeURIComponent(param)
|
|
} catch (_) {
|
|
throw new DecodeError('failed to decode param')
|
|
}
|
|
}
|
|
const params: { [paramName: string]: string | string[] } = {}
|
|
|
|
Object.keys(groups).forEach((slugName: string) => {
|
|
const g = groups[slugName]
|
|
const m = routeMatch[g.pos]
|
|
if (m !== undefined) {
|
|
params[slugName] = ~m.indexOf('/')
|
|
? m.split('/').map((entry) => decode(entry))
|
|
: g.repeat
|
|
? [decode(m)]
|
|
: decode(m)
|
|
}
|
|
})
|
|
return params
|
|
}
|
|
}
|