2025-11-10 16:28:01 +08:00
|
|
|
// @ts-nocheck
|
|
|
|
|
// This file is generated by Umi automatically
|
|
|
|
|
// DO NOT CHANGE IT MANUALLY!
|
|
|
|
|
import { getRoutes } from './route'
|
2025-11-11 10:06:36 +08:00
|
|
|
import type { History } from 'D:/work/SHIHEZI/shz-admin/node_modules/@umijs/renderer-react'
|
2025-11-10 16:28:01 +08:00
|
|
|
|
|
|
|
|
type Routes = Awaited<ReturnType<typeof getRoutes>>['routes']
|
|
|
|
|
type AllRoute = Routes[keyof Routes]
|
|
|
|
|
type IsRoot<T extends any> = 'parentId' extends keyof T ? false : true
|
|
|
|
|
|
|
|
|
|
// show `/` in not `layout / wrapper` only
|
|
|
|
|
type GetAllRouteWithoutLayout<Item extends AllRoute> = Item extends any
|
|
|
|
|
? 'isWrapper' extends keyof Item
|
|
|
|
|
? never
|
|
|
|
|
: 'isLayout' extends keyof Item
|
|
|
|
|
? never
|
|
|
|
|
: Item
|
|
|
|
|
: never
|
|
|
|
|
type AllRouteWithoutLayout = GetAllRouteWithoutLayout<AllRoute>
|
|
|
|
|
type IndexRoutePathname = '/' extends AllRouteWithoutLayout['path']
|
|
|
|
|
? '/'
|
|
|
|
|
: never
|
|
|
|
|
|
|
|
|
|
type GetChildrens<T extends any> = T extends any
|
|
|
|
|
? IsRoot<T> extends true
|
|
|
|
|
? never
|
|
|
|
|
: T
|
|
|
|
|
: never
|
|
|
|
|
type Childrens = GetChildrens<AllRoute>
|
|
|
|
|
type Root = Exclude<AllRoute, Childrens>
|
|
|
|
|
type AllIds = AllRoute['id']
|
|
|
|
|
|
|
|
|
|
type GetChildrensByParentId<
|
|
|
|
|
Id extends AllIds,
|
|
|
|
|
Item = AllRoute
|
|
|
|
|
> = Item extends any
|
|
|
|
|
? 'parentId' extends keyof Item
|
|
|
|
|
? Item['parentId'] extends Id
|
|
|
|
|
? Item
|
|
|
|
|
: never
|
|
|
|
|
: never
|
|
|
|
|
: never
|
|
|
|
|
|
|
|
|
|
type RouteObject<
|
|
|
|
|
Id extends AllIds,
|
|
|
|
|
Item = GetChildrensByParentId<Id>
|
|
|
|
|
> = IsNever<Item> extends true
|
|
|
|
|
? ''
|
|
|
|
|
: Item extends AllRoute
|
|
|
|
|
? {
|
|
|
|
|
[Key in Item['path'] as TrimSlash<Key>]: UnionMerge<
|
|
|
|
|
RouteObject<Item['id']>
|
|
|
|
|
>
|
|
|
|
|
}
|
|
|
|
|
: never
|
|
|
|
|
|
|
|
|
|
type GetRootRouteObject<Item extends Root> = Item extends Root
|
|
|
|
|
? {
|
|
|
|
|
[K in Item['path'] as TrimSlash<K>]: UnionMerge<RouteObject<Item['id']>>
|
|
|
|
|
}
|
|
|
|
|
: never
|
|
|
|
|
type MergedResult = UnionMerge<GetRootRouteObject<Root>>
|
|
|
|
|
|
|
|
|
|
// --- patch history types ---
|
|
|
|
|
|
|
|
|
|
type HistoryTo = Parameters<History['push']>['0']
|
|
|
|
|
type HistoryPath = Exclude<HistoryTo, string>
|
|
|
|
|
|
|
|
|
|
type UmiPathname = Path<MergedResult> | (string & {})
|
|
|
|
|
interface UmiPath extends HistoryPath {
|
|
|
|
|
pathname: UmiPathname
|
|
|
|
|
}
|
|
|
|
|
type UmiTo = UmiPathname | UmiPath
|
|
|
|
|
|
|
|
|
|
type UmiPush = (to: UmiTo, state?: any) => void
|
|
|
|
|
type UmiReplace = (to: UmiTo, state?: any) => void
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export interface UmiHistory extends History {
|
|
|
|
|
push: UmiPush
|
|
|
|
|
replace: UmiReplace
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --- type utils ---
|
|
|
|
|
type TrimLeftSlash<T extends string> = T extends `/${infer R}`
|
|
|
|
|
? TrimLeftSlash<R>
|
|
|
|
|
: T
|
|
|
|
|
type TrimRightSlash<T extends string> = T extends `${infer R}/`
|
|
|
|
|
? TrimRightSlash<R>
|
|
|
|
|
: T
|
|
|
|
|
type TrimSlash<T extends string> = TrimLeftSlash<TrimRightSlash<T>>
|
|
|
|
|
|
|
|
|
|
type IsNever<T> = [T] extends [never] ? true : false
|
|
|
|
|
type IsEqual<A, B> = (<G>() => G extends A ? 1 : 2) extends <G>() => G extends B
|
|
|
|
|
? 1
|
|
|
|
|
: 2
|
|
|
|
|
? true
|
|
|
|
|
: false
|
|
|
|
|
|
|
|
|
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
|
|
|
k: infer I
|
|
|
|
|
) => void
|
|
|
|
|
? I
|
|
|
|
|
: never
|
|
|
|
|
type UnionMerge<U> = UnionToIntersection<U> extends infer O
|
|
|
|
|
? { [K in keyof O]: O[K] }
|
|
|
|
|
: never
|
|
|
|
|
|
|
|
|
|
type ExcludeEmptyKey<T> = IsEqual<T, ''> extends true ? never : T
|
|
|
|
|
|
|
|
|
|
type PathConcat<
|
|
|
|
|
TKey extends string,
|
|
|
|
|
TValue,
|
|
|
|
|
N = TrimSlash<TKey>
|
|
|
|
|
> = TValue extends string
|
|
|
|
|
? ExcludeEmptyKey<N>
|
|
|
|
|
:
|
|
|
|
|
| ExcludeEmptyKey<N>
|
|
|
|
|
| `${N & string}${IsNever<ExcludeEmptyKey<N>> extends true
|
|
|
|
|
? ''
|
|
|
|
|
: '/'}${UnionPath<TValue>}`
|
|
|
|
|
|
|
|
|
|
type UnionPath<T> = {
|
|
|
|
|
[K in keyof T]-?: PathConcat<K & string, T[K]>
|
|
|
|
|
}[keyof T]
|
|
|
|
|
|
|
|
|
|
type MakeSureLeftSlash<T> = T extends any
|
|
|
|
|
? `/${TrimRightSlash<T & string>}`
|
|
|
|
|
: never
|
|
|
|
|
|
|
|
|
|
// exclude `/*`, because it always at the top of the IDE tip list
|
|
|
|
|
type Path<T, K = UnionPath<T>> = Exclude<MakeSureLeftSlash<K>, '/*'> | IndexRoutePathname
|