vitarx-router 4.0.0-beta.2 → 4.0.0-beta.21
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 +42 -17
- package/dist/{plugin-vite/auto-routes → auto-routes}/handleHotUpdate.d.ts +1 -1
- package/dist/components/RouterView.js +5 -4
- package/dist/core/common/constant.d.ts +5 -6
- package/dist/core/common/constant.js +5 -6
- package/dist/core/common/utils.js +2 -1
- package/dist/core/router/checkOptions.d.ts +11 -0
- package/dist/core/router/checkOptions.js +119 -0
- package/dist/core/router/manager.js +27 -23
- package/dist/core/router/router.d.ts +154 -1
- package/dist/core/router/router.js +303 -230
- package/dist/core/router/web.d.ts +13 -0
- package/dist/core/router/web.js +35 -4
- package/dist/core/shared/link.d.ts +7 -0
- package/dist/core/shared/link.js +11 -8
- package/dist/core/shared/route.js +1 -2
- package/dist/core/shared/router.d.ts +3 -3
- package/dist/core/shared/router.js +7 -4
- package/dist/core/types/options.d.ts +2 -0
- package/dist/file-router/config/index.d.ts +2 -1
- package/dist/file-router/config/index.js +2 -1
- package/dist/file-router/config/resolve.d.ts +43 -0
- package/dist/file-router/config/resolve.js +69 -0
- package/dist/file-router/{utils/validateOptions.d.ts → config/validate.d.ts} +11 -10
- package/dist/file-router/config/validate.js +280 -0
- package/dist/file-router/constants.d.ts +12 -2
- package/dist/file-router/constants.js +13 -3
- package/dist/file-router/generator/generateRoutes.d.ts +44 -13
- package/dist/file-router/generator/generateRoutes.js +159 -80
- package/dist/file-router/generator/generateTypes.d.ts +3 -29
- package/dist/file-router/generator/generateTypes.js +36 -41
- package/dist/file-router/global.d.ts +1 -1
- package/dist/file-router/index.d.ts +224 -90
- package/dist/file-router/index.js +571 -135
- package/dist/file-router/macros/astValueExtractor.d.ts +1 -1
- package/dist/file-router/macros/astValueExtractor.js +27 -7
- package/dist/file-router/macros/definePage.d.ts +20 -3
- package/dist/file-router/macros/definePage.js +120 -40
- package/dist/file-router/parser/exportChecker.d.ts +4 -23
- package/dist/file-router/parser/exportChecker.js +38 -79
- package/dist/file-router/parser/filterUtils.d.ts +25 -0
- package/dist/file-router/parser/filterUtils.js +43 -0
- package/dist/file-router/parser/index.d.ts +2 -1
- package/dist/file-router/parser/index.js +2 -1
- package/dist/file-router/parser/parsePage.d.ts +56 -9
- package/dist/file-router/parser/parsePage.js +194 -172
- package/dist/file-router/parser/routePath.d.ts +22 -0
- package/dist/file-router/parser/routePath.js +74 -0
- package/dist/file-router/types/hooks.d.ts +52 -0
- package/dist/file-router/types/index.d.ts +3 -0
- package/dist/file-router/types/index.js +1 -0
- package/dist/file-router/types/options.d.ts +279 -0
- package/dist/file-router/types/options.js +1 -0
- package/dist/file-router/types/route.d.ts +114 -0
- package/dist/file-router/types/route.js +1 -0
- package/dist/file-router/utils/fileReader.d.ts +11 -0
- package/dist/file-router/utils/fileReader.js +22 -0
- package/dist/file-router/utils/findRoute.d.ts +8 -0
- package/dist/file-router/utils/findRoute.js +22 -0
- package/dist/file-router/utils/index.d.ts +4 -2
- package/dist/file-router/utils/index.js +4 -2
- package/dist/file-router/utils/logger.d.ts +6 -6
- package/dist/file-router/utils/logger.js +44 -4
- package/dist/file-router/utils/pathStrategy.d.ts +28 -0
- package/dist/file-router/utils/{namingStrategy.js → pathStrategy.js} +18 -28
- package/dist/file-router/utils/pathUtils.d.ts +31 -0
- package/dist/file-router/utils/pathUtils.js +53 -1
- package/dist/plugin-vite/constant.d.ts +9 -0
- package/dist/plugin-vite/constant.js +9 -0
- package/dist/plugin-vite/index.d.ts +4 -24
- package/dist/plugin-vite/index.js +4 -94
- package/dist/plugin-vite/plugin.d.ts +86 -0
- package/dist/plugin-vite/plugin.js +181 -0
- package/dist/plugin-vite/watcher.d.ts +15 -0
- package/dist/plugin-vite/watcher.js +65 -0
- package/package.json +9 -7
- package/dist/file-router/config/configUtils.d.ts +0 -54
- package/dist/file-router/config/configUtils.js +0 -88
- package/dist/file-router/scanner/filterUtils.d.ts +0 -35
- package/dist/file-router/scanner/filterUtils.js +0 -188
- package/dist/file-router/scanner/index.d.ts +0 -8
- package/dist/file-router/scanner/index.js +0 -8
- package/dist/file-router/scanner/routeTreeBuilder.d.ts +0 -21
- package/dist/file-router/scanner/routeTreeBuilder.js +0 -312
- package/dist/file-router/scanner/scanPages.d.ts +0 -48
- package/dist/file-router/scanner/scanPages.js +0 -174
- package/dist/file-router/types.d.ts +0 -344
- package/dist/file-router/utils/namingStrategy.d.ts +0 -57
- package/dist/file-router/utils/validateOptions.js +0 -233
- /package/dist/{plugin-vite/auto-routes → auto-routes}/handleHotUpdate.js +0 -0
- /package/dist/{plugin-vite/auto-routes → auto-routes}/index.d.ts +0 -0
- /package/dist/{plugin-vite/auto-routes → auto-routes}/index.js +0 -0
- /package/dist/file-router/{types.js → types/hooks.js} +0 -0
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview 类型定义模块
|
|
3
|
-
*
|
|
4
|
-
* 定义文件路由功能所需的所有 TypeScript 类型接口。
|
|
5
|
-
* 这些类型用于描述页面配置、解析结果、路由生成等各个环节的数据结构。
|
|
6
|
-
*/
|
|
7
|
-
import type { NavOptions, RouteMetaData } from '../core/index.js';
|
|
8
|
-
/**
|
|
9
|
-
* 页面配置选项
|
|
10
|
-
*
|
|
11
|
-
* 用于 definePage 宏函数,允许开发者在页面组件中自定义路由配置。
|
|
12
|
-
* 仅支持可序列化的配置项。
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```tsx
|
|
16
|
-
* import { definePage } from 'vitarx-router/auto-routes'
|
|
17
|
-
*
|
|
18
|
-
* definePage({
|
|
19
|
-
* name: 'user-detail',
|
|
20
|
-
* meta: { title: '用户详情', requiresAuth: true },
|
|
21
|
-
* redirect: '/login',
|
|
22
|
-
* pattern: { id: /^\d+$/ }
|
|
23
|
-
* })
|
|
24
|
-
*
|
|
25
|
-
* export default function UserDetail() {
|
|
26
|
-
* return <div>User Detail</div>
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export interface PageOptions {
|
|
31
|
-
/** 自定义路由名称,优先级高于自动生成的名称 */
|
|
32
|
-
name?: string;
|
|
33
|
-
/**
|
|
34
|
-
* 路由元数据,可存储标题、权限等自定义信息
|
|
35
|
-
*
|
|
36
|
-
* 注意:meta 必须是可序列化的对象,不支持函数或复杂对象。
|
|
37
|
-
*/
|
|
38
|
-
meta?: RouteMetaData;
|
|
39
|
-
/**
|
|
40
|
-
* 动态参数匹配模式
|
|
41
|
-
*
|
|
42
|
-
* 用于为动态路由参数定义更精确的匹配规则。
|
|
43
|
-
* 键为参数名,值为正则表达式。
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* definePage({
|
|
48
|
-
* pattern: {
|
|
49
|
-
* id: /^\d+$/, // 匹配纯数字
|
|
50
|
-
* slug: /^[a-z-]+$/ // 匹配小写字母和横线
|
|
51
|
-
* }
|
|
52
|
-
* })
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
pattern?: Record<string, RegExp>;
|
|
56
|
-
/**
|
|
57
|
-
* 路由重定向目标
|
|
58
|
-
*
|
|
59
|
-
* 支持字符串路径或导航配置对象。
|
|
60
|
-
*
|
|
61
|
-
* @example
|
|
62
|
-
* ```TypeScript
|
|
63
|
-
* // 字符串路径
|
|
64
|
-
* definePage({ redirect: '/dashboard' })
|
|
65
|
-
*
|
|
66
|
-
* // 导航配置对象
|
|
67
|
-
* definePage({ redirect: { index: 'home', query: { from: 'old' } } })
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
redirect?: string | RedirectConfig;
|
|
71
|
-
/**
|
|
72
|
-
* 路由的别名,用于匹配多个路径到同一个路由
|
|
73
|
-
*/
|
|
74
|
-
alias?: string | string[];
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* 重定向配置对象
|
|
78
|
-
*
|
|
79
|
-
* 与 NavigateOptions 类似,但仅包含可序列化的属性。
|
|
80
|
-
*/
|
|
81
|
-
export interface RedirectConfig {
|
|
82
|
-
/** 路由索引,/开头为路径,否则为名称 */
|
|
83
|
-
index: string;
|
|
84
|
-
/** URL 查询参数 */
|
|
85
|
-
query?: Record<string, string>;
|
|
86
|
-
/** 路由参数 */
|
|
87
|
-
params?: Record<string, string>;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 解析后的页面信息
|
|
91
|
-
*
|
|
92
|
-
* 由 parsePageFile 函数生成,包含从文件路径解析出的所有路由相关信息。
|
|
93
|
-
* 这是路由生成流程中的核心数据结构。
|
|
94
|
-
*/
|
|
95
|
-
export interface ParsedPage {
|
|
96
|
-
/** 路由路径,如 '/', '/user', '/user/{id}' */
|
|
97
|
-
path: string;
|
|
98
|
-
/** 文件绝对路径 */
|
|
99
|
-
filePath: string;
|
|
100
|
-
/** 路由名称,用于编程式导航 */
|
|
101
|
-
name: string;
|
|
102
|
-
/** 动态参数名称列表 */
|
|
103
|
-
params: string[];
|
|
104
|
-
/** 是否为索引页面(index.tsx) */
|
|
105
|
-
isIndex: boolean;
|
|
106
|
-
/** 是否包含动态参数 */
|
|
107
|
-
isDynamic: boolean;
|
|
108
|
-
/** 子路由列表 */
|
|
109
|
-
children: ParsedPage[];
|
|
110
|
-
/** 路由元数据 */
|
|
111
|
-
meta?: RouteMetaData;
|
|
112
|
-
/** 自定义路由名称(通过 definePage 设置) */
|
|
113
|
-
customName?: string;
|
|
114
|
-
/** 动态参数匹配模式 */
|
|
115
|
-
pattern?: Record<string, RegExp>;
|
|
116
|
-
/** 父级路径 */
|
|
117
|
-
parentPath: string;
|
|
118
|
-
/** 路由重定向目标 */
|
|
119
|
-
redirect?: string | RedirectConfig;
|
|
120
|
-
/** 路由别名 */
|
|
121
|
-
alias?: string | string[];
|
|
122
|
-
/**
|
|
123
|
-
* 是否为布局文件
|
|
124
|
-
* 当同名文件和目录同时存在时,文件作为布局组件
|
|
125
|
-
*/
|
|
126
|
-
isLayoutFile?: boolean;
|
|
127
|
-
/**
|
|
128
|
-
* 布局文件路径
|
|
129
|
-
* 当目录有同名文件时,记录布局文件的路径
|
|
130
|
-
*/
|
|
131
|
-
layoutFilePath?: string;
|
|
132
|
-
/**
|
|
133
|
-
* 命名视图名称
|
|
134
|
-
* 从文件名解析,如 index@aux.tsx -> aux
|
|
135
|
-
* 默认为 null,表示默认视图
|
|
136
|
-
*/
|
|
137
|
-
viewName?: string | null;
|
|
138
|
-
/**
|
|
139
|
-
* 命名视图映射
|
|
140
|
-
* 键为视图名称,值为文件路径
|
|
141
|
-
*/
|
|
142
|
-
namedViews?: Record<string, string>;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 解析后的路由配置
|
|
146
|
-
*
|
|
147
|
-
* 用于代码生成阶段的中间数据结构,表示一个完整的路由记录。
|
|
148
|
-
*/
|
|
149
|
-
export interface ResolvedRoute {
|
|
150
|
-
/** 路由路径 */
|
|
151
|
-
path: string;
|
|
152
|
-
/** 路由名称(分组路由无此属性) */
|
|
153
|
-
name?: string;
|
|
154
|
-
/**
|
|
155
|
-
* 组件文件路径
|
|
156
|
-
* - 单一组件:字符串形式,如 `/src/pages/index.tsx`
|
|
157
|
-
* - 命名视图:对象形式,如 `{ default: '/src/pages/index.tsx', sidebar: '/src/pages/index@sidebar.tsx' }`
|
|
158
|
-
* 注意:这里存储的是文件路径,在代码生成阶段才根据 importMode 转换为代码
|
|
159
|
-
*/
|
|
160
|
-
component?: string | Record<string, string>;
|
|
161
|
-
/** 路由元数据 */
|
|
162
|
-
meta?: RouteMetaData;
|
|
163
|
-
/** 动态参数匹配模式 */
|
|
164
|
-
pattern?: Record<string, RegExp>;
|
|
165
|
-
/** 子路由列表 */
|
|
166
|
-
children?: ResolvedRoute[];
|
|
167
|
-
/**
|
|
168
|
-
* 路由重定向目标
|
|
169
|
-
*/
|
|
170
|
-
redirect?: string | NavOptions;
|
|
171
|
-
/**
|
|
172
|
-
* 路由别名
|
|
173
|
-
*/
|
|
174
|
-
alias?: string | string[];
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* 路由扩展钩子
|
|
178
|
-
*
|
|
179
|
-
* 在生成路由配置时调用,允许开发者自定义扩展路由配置。
|
|
180
|
-
* 支持异步操作,可以用于动态获取路由配置。
|
|
181
|
-
*
|
|
182
|
-
* @param route - 解析后的路由配置
|
|
183
|
-
* @returns 扩展后的路由配置或 void(表示不修改)
|
|
184
|
-
*
|
|
185
|
-
* @example
|
|
186
|
-
* ```typescript
|
|
187
|
-
* extendRoute: async (route) => {
|
|
188
|
-
* const permissions = await fetchPermissions(route.path)
|
|
189
|
-
* route.meta = { ...route.meta, permissions }
|
|
190
|
-
* return route
|
|
191
|
-
* }
|
|
192
|
-
* ```
|
|
193
|
-
*/
|
|
194
|
-
export type ExtendRouteHook = (route: ResolvedRoute) => ResolvedRoute | void | Promise<ResolvedRoute | void>;
|
|
195
|
-
/**
|
|
196
|
-
* 页面目录配置项
|
|
197
|
-
*
|
|
198
|
-
* 用于配置多个页面目录时,可以为每个目录指定独立的包含/排除规则。
|
|
199
|
-
*
|
|
200
|
-
* @example
|
|
201
|
-
* ```typescript
|
|
202
|
-
* const pagesDirs: PagesDirConfig[] = [
|
|
203
|
-
* { dir: 'src/pages', exclude: ['components'] },
|
|
204
|
-
* { dir: 'src/admin', include: ['**\/*.tsx'], prefix: '/admin' }
|
|
205
|
-
* ]
|
|
206
|
-
* ```
|
|
207
|
-
*/
|
|
208
|
-
export interface PageConfig {
|
|
209
|
-
/** 页面目录路径 */
|
|
210
|
-
dir: string;
|
|
211
|
-
/**
|
|
212
|
-
* 要包含的文件/目录 glob 模式列表
|
|
213
|
-
*
|
|
214
|
-
* 默认匹配所有文件。只有匹配 include 模式的文件才会被扫描。
|
|
215
|
-
*/
|
|
216
|
-
include?: string[];
|
|
217
|
-
/** 要排除的文件/目录 glob 模式列表 */
|
|
218
|
-
exclude?: string[];
|
|
219
|
-
/**
|
|
220
|
-
* 路由路径前缀
|
|
221
|
-
*
|
|
222
|
-
* 用于为该目录下的所有路由添加统一的前缀。
|
|
223
|
-
*
|
|
224
|
-
* 拼接规则:
|
|
225
|
-
* 1. 前缀不以 / 开头时,自动添加 / 前缀
|
|
226
|
-
* 2. 直接拼接前缀和路径(去掉路径开头的 /)
|
|
227
|
-
*
|
|
228
|
-
* @default ''
|
|
229
|
-
*
|
|
230
|
-
* @example
|
|
231
|
-
* ```typescript
|
|
232
|
-
* // src/admin/home.tsx -> /admin/home(需要指定结尾的 /)
|
|
233
|
-
* { dir: 'src/admin', prefix: '/admin/' }
|
|
234
|
-
*
|
|
235
|
-
* // src/admin/home.tsx -> /adminhome(不指定结尾的 / 会直接拼接)
|
|
236
|
-
* { dir: 'src/admin', prefix: '/admin' }
|
|
237
|
-
*
|
|
238
|
-
* // src/promos/black-friday.vue -> /promos-black-friday
|
|
239
|
-
* { dir: 'src/promos', prefix: 'promos-' }
|
|
240
|
-
* ```
|
|
241
|
-
*/
|
|
242
|
-
prefix?: string;
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* 组件导入模式
|
|
246
|
-
*
|
|
247
|
-
* - `lazy`: 使用 lazy(() => import(...)) 懒加载组件
|
|
248
|
-
* - `file`: 直接使用文件路径作为组件,由用户自行处理导入
|
|
249
|
-
*/
|
|
250
|
-
export type ImportMode = 'lazy' | 'file';
|
|
251
|
-
/**
|
|
252
|
-
* 路由命名策略
|
|
253
|
-
*
|
|
254
|
-
* - `kebab`: 将驼峰命名转换为 kebab-case(默认),如 MainHome → main-home
|
|
255
|
-
* - `lowercase`: 简单转换为小写,如 MainHome → mainhome
|
|
256
|
-
* - `none`: 保持原始命名,不进行转换
|
|
257
|
-
*/
|
|
258
|
-
export type NamingStrategy = 'kebab' | 'lowercase' | 'none';
|
|
259
|
-
/**
|
|
260
|
-
* 文件路由配置选项(与构建工具无关)
|
|
261
|
-
*
|
|
262
|
-
* 用于配置文件路由的核心行为。
|
|
263
|
-
*
|
|
264
|
-
* @example
|
|
265
|
-
* ```typescript
|
|
266
|
-
* // 基本使用
|
|
267
|
-
* const options: FileRouterOptions = {
|
|
268
|
-
* pagesDir: 'src/views',
|
|
269
|
-
* extensions: ['.tsx', '.ts', '.vue'],
|
|
270
|
-
* }
|
|
271
|
-
*
|
|
272
|
-
* // 多个目录
|
|
273
|
-
* const options: FileRouterOptions = {
|
|
274
|
-
* pagesDir: ['src/pages', 'src/admin']
|
|
275
|
-
* }
|
|
276
|
-
*
|
|
277
|
-
* // 多个目录,每个目录独立配置
|
|
278
|
-
* const options: FileRouterOptions = {
|
|
279
|
-
* pagesDir: [
|
|
280
|
-
* { dir: 'src/pages', exclude: ['components'] },
|
|
281
|
-
* { dir: 'src/admin', include: ['**\/*.tsx'] }
|
|
282
|
-
* ]
|
|
283
|
-
* }
|
|
284
|
-
* ```
|
|
285
|
-
*/
|
|
286
|
-
export interface FileRouterOptions {
|
|
287
|
-
/**
|
|
288
|
-
* 项目根目录
|
|
289
|
-
*
|
|
290
|
-
* 用于解析相对路径。
|
|
291
|
-
*
|
|
292
|
-
* @default process.cwd()
|
|
293
|
-
*/
|
|
294
|
-
root?: string;
|
|
295
|
-
/**
|
|
296
|
-
* 页面目录配置
|
|
297
|
-
*
|
|
298
|
-
* 支持四种配置方式:
|
|
299
|
-
* 1. 字符串:单个页面目录路径
|
|
300
|
-
* 2. 对象:单个页面目录配置,可以有独立的 include/exclude 规则
|
|
301
|
-
* 3. 字符串数组:多个页面目录路径,使用全局 include/exclude 规则
|
|
302
|
-
* 4. 对象数组:多个页面目录,每个目录可以有独立的 include/exclude 规则
|
|
303
|
-
*
|
|
304
|
-
* @default 'src/pages'
|
|
305
|
-
*/
|
|
306
|
-
pages?: string | PageConfig | (PageConfig | string)[];
|
|
307
|
-
/**
|
|
308
|
-
* 路由前缀
|
|
309
|
-
*/
|
|
310
|
-
prefix?: string;
|
|
311
|
-
/** 支持的文件扩展名,默认为 ['.tsx', '.ts', '.jsx', '.js'] */
|
|
312
|
-
extensions?: string[];
|
|
313
|
-
/**
|
|
314
|
-
* 要包含的文件/目录 glob 模式列表,默认匹配所有文件
|
|
315
|
-
*/
|
|
316
|
-
include?: string[];
|
|
317
|
-
/**
|
|
318
|
-
* 要排除的文件/目录 glob 模式列表
|
|
319
|
-
*/
|
|
320
|
-
exclude?: string[];
|
|
321
|
-
/**
|
|
322
|
-
* 组件导入模式
|
|
323
|
-
*
|
|
324
|
-
* - `lazy`: 使用 lazy(() => import(...)) 懒加载组件(默认)
|
|
325
|
-
* - `file`: 直接使用文件路径作为组件,由用户自行处理导入
|
|
326
|
-
*
|
|
327
|
-
* @default 'lazy'
|
|
328
|
-
*/
|
|
329
|
-
importMode?: ImportMode;
|
|
330
|
-
/**
|
|
331
|
-
* 路由扩展钩子
|
|
332
|
-
*/
|
|
333
|
-
extendRoute?: ExtendRouteHook;
|
|
334
|
-
/**
|
|
335
|
-
* 注入自定义导入语句
|
|
336
|
-
*/
|
|
337
|
-
injectImports?: string[];
|
|
338
|
-
/**
|
|
339
|
-
* 路由命名策略
|
|
340
|
-
*
|
|
341
|
-
* @default 'kebab'
|
|
342
|
-
*/
|
|
343
|
-
namingStrategy?: NamingStrategy;
|
|
344
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview 命名策略工具模块
|
|
3
|
-
*
|
|
4
|
-
* 提供路由名称和路径的命名转换功能,支持三种策略:
|
|
5
|
-
* - kebab: 将驼峰命名转换为 kebab-case(默认)
|
|
6
|
-
* - lowercase: 简单转换为小写
|
|
7
|
-
* - none: 保持原始命名
|
|
8
|
-
*
|
|
9
|
-
* 注意:只处理路径段名称,不处理动态参数变量名。
|
|
10
|
-
*/
|
|
11
|
-
import type { NamingStrategy } from '../types.js';
|
|
12
|
-
/**
|
|
13
|
-
* 应用命名策略转换字符串
|
|
14
|
-
*
|
|
15
|
-
* @param str - 输入字符串
|
|
16
|
-
* @param strategy - 命名策略
|
|
17
|
-
* @returns 转换后的字符串
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* applyNamingStrategy('MainHome', 'kebab') // => 'main-home'
|
|
22
|
-
* applyNamingStrategy('MainHome', 'lowercase') // => 'mainhome'
|
|
23
|
-
* applyNamingStrategy('MainHome', 'none') // => 'MainHome'
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export declare function applyNamingStrategy(str: string, strategy: NamingStrategy): string;
|
|
27
|
-
/**
|
|
28
|
-
* 应用命名策略转换路由路径
|
|
29
|
-
*
|
|
30
|
-
* 只处理路径段名称,不处理动态参数变量名。
|
|
31
|
-
*
|
|
32
|
-
* @param path - 路由路径
|
|
33
|
-
* @param strategy - 命名策略
|
|
34
|
-
* @returns 转换后的路径
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* applyNamingStrategyToPath('/MainHome', 'kebab') // => '/main-home'
|
|
39
|
-
* applyNamingStrategyToPath('/User/{userName}', 'kebab') // => '/user/{userName}'
|
|
40
|
-
* applyNamingStrategyToPath('/API/UserProfile', 'kebab') // => '/api/user-profile'
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export declare function applyNamingStrategyToPath(path: string, strategy: NamingStrategy): string;
|
|
44
|
-
/**
|
|
45
|
-
* 应用命名策略转换路由名称
|
|
46
|
-
*
|
|
47
|
-
* @param name - 路由名称
|
|
48
|
-
* @param strategy - 命名策略
|
|
49
|
-
* @returns 转换后的名称
|
|
50
|
-
*
|
|
51
|
-
* @example
|
|
52
|
-
* ```typescript
|
|
53
|
-
* applyNamingStrategyToName('MainHome', 'kebab') // => 'main-home'
|
|
54
|
-
* applyNamingStrategyToName('user-MainHome', 'kebab') // => 'user-main-home'
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export declare function applyNamingStrategyToName(name: string, strategy: NamingStrategy): string;
|
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 验证 pages 配置
|
|
3
|
-
*
|
|
4
|
-
* @param opts - 配置选项
|
|
5
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
6
|
-
*/
|
|
7
|
-
function validatePagesDir(opts) {
|
|
8
|
-
if (opts.pages === undefined)
|
|
9
|
-
return;
|
|
10
|
-
if (typeof opts.pages === 'string') {
|
|
11
|
-
if (opts.pages.trim() === '') {
|
|
12
|
-
throw new Error('options.pagesDir 不能为空字符串');
|
|
13
|
-
}
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
if (Array.isArray(opts.pages)) {
|
|
17
|
-
if (opts.pages.length === 0) {
|
|
18
|
-
throw new Error('options.pagesDir 数组不能为空');
|
|
19
|
-
}
|
|
20
|
-
opts.pages.forEach((item, i) => {
|
|
21
|
-
validatePagesDirItem(item, i);
|
|
22
|
-
});
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
throw new Error('options.pagesDir 必须是字符串、字符串数组或对象数组');
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* 验证 pages 数组中的单个项目
|
|
29
|
-
*
|
|
30
|
-
* @param item - 数组项
|
|
31
|
-
* @param index - 数组索引
|
|
32
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
33
|
-
*/
|
|
34
|
-
function validatePagesDirItem(item, index) {
|
|
35
|
-
if (typeof item === 'string') {
|
|
36
|
-
if (item.trim() === '') {
|
|
37
|
-
throw new Error(`options.pagesDir[${index}] 不能为空字符串`);
|
|
38
|
-
}
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (typeof item === 'object' && item !== null) {
|
|
42
|
-
const config = item;
|
|
43
|
-
if (!config.dir || typeof config.dir !== 'string' || config.dir.trim() === '') {
|
|
44
|
-
throw new Error(`options.pagesDir[${index}].dir 必须是非空字符串`);
|
|
45
|
-
}
|
|
46
|
-
if (config.include !== undefined && !Array.isArray(config.include)) {
|
|
47
|
-
throw new Error(`options.pagesDir[${index}].include 必须是数组`);
|
|
48
|
-
}
|
|
49
|
-
if (config.exclude !== undefined && !Array.isArray(config.exclude)) {
|
|
50
|
-
throw new Error(`options.pagesDir[${index}].exclude 必须是数组`);
|
|
51
|
-
}
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
throw new Error(`options.pagesDir[${index}] 必须是字符串或对象`);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 验证 extensions 配置
|
|
58
|
-
*
|
|
59
|
-
* @param opts - 配置选项
|
|
60
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
61
|
-
*/
|
|
62
|
-
function validateExtensions(opts) {
|
|
63
|
-
if (opts.extensions === undefined)
|
|
64
|
-
return;
|
|
65
|
-
if (!Array.isArray(opts.extensions)) {
|
|
66
|
-
throw new Error('options.extensions 必须是数组');
|
|
67
|
-
}
|
|
68
|
-
if (opts.extensions.length === 0) {
|
|
69
|
-
throw new Error('options.extensions 数组不能为空');
|
|
70
|
-
}
|
|
71
|
-
opts.extensions.forEach((ext, i) => {
|
|
72
|
-
if (typeof ext !== 'string') {
|
|
73
|
-
throw new Error(`options.extensions[${i}] 必须是字符串`);
|
|
74
|
-
}
|
|
75
|
-
if (!ext.startsWith('.')) {
|
|
76
|
-
throw new Error(`options.extensions[${i}] "${ext}" 必须以 "." 开头`);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* 验证 include 配置
|
|
82
|
-
*
|
|
83
|
-
* @param opts - 配置选项
|
|
84
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
85
|
-
*/
|
|
86
|
-
function validateInclude(opts) {
|
|
87
|
-
if (opts.include === undefined)
|
|
88
|
-
return;
|
|
89
|
-
if (!Array.isArray(opts.include)) {
|
|
90
|
-
throw new Error('options.include 必须是数组');
|
|
91
|
-
}
|
|
92
|
-
opts.include.forEach((item, i) => {
|
|
93
|
-
if (typeof item !== 'string') {
|
|
94
|
-
throw new Error(`options.include[${i}] 必须是字符串`);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 验证 exclude 配置
|
|
100
|
-
*
|
|
101
|
-
* @param opts - 配置选项
|
|
102
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
103
|
-
*/
|
|
104
|
-
function validateExclude(opts) {
|
|
105
|
-
if (opts.exclude === undefined)
|
|
106
|
-
return;
|
|
107
|
-
if (!Array.isArray(opts.exclude)) {
|
|
108
|
-
throw new Error('options.exclude 必须是数组');
|
|
109
|
-
}
|
|
110
|
-
opts.exclude.forEach((item, i) => {
|
|
111
|
-
if (typeof item !== 'string') {
|
|
112
|
-
throw new Error(`options.exclude[${i}] 必须是字符串`);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* 验证 root 配置
|
|
118
|
-
*
|
|
119
|
-
* @param opts - 配置选项
|
|
120
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
121
|
-
*/
|
|
122
|
-
function validateRoot(opts) {
|
|
123
|
-
if (opts.root === undefined)
|
|
124
|
-
return;
|
|
125
|
-
if (typeof opts.root !== 'string') {
|
|
126
|
-
throw new Error('options.root 必须是字符串');
|
|
127
|
-
}
|
|
128
|
-
if (opts.root.trim() === '') {
|
|
129
|
-
throw new Error('options.root 不能为空字符串');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* 验证 prefix 配置
|
|
134
|
-
*
|
|
135
|
-
* @param opts - 配置选项
|
|
136
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
137
|
-
*/
|
|
138
|
-
function validatePrefix(opts) {
|
|
139
|
-
if (opts.prefix === undefined)
|
|
140
|
-
return;
|
|
141
|
-
if (typeof opts.prefix !== 'string') {
|
|
142
|
-
throw new Error('options.prefix 必须是字符串');
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* 验证 importMode 配置
|
|
147
|
-
*
|
|
148
|
-
* @param opts - 配置选项
|
|
149
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
150
|
-
*/
|
|
151
|
-
function validateImportMode(opts) {
|
|
152
|
-
if (opts.importMode === undefined)
|
|
153
|
-
return;
|
|
154
|
-
const validModes = ['lazy', 'file'];
|
|
155
|
-
if (!validModes.includes(opts.importMode)) {
|
|
156
|
-
throw new Error(`options.importMode 必须是 'lazy' 或 'file'`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* 验证 extendRoute 配置
|
|
161
|
-
*
|
|
162
|
-
* @param opts - 配置选项
|
|
163
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
164
|
-
*/
|
|
165
|
-
function validateExtendRoute(opts) {
|
|
166
|
-
if (opts.extendRoute === undefined)
|
|
167
|
-
return;
|
|
168
|
-
if (typeof opts.extendRoute !== 'function') {
|
|
169
|
-
throw new Error('options.extendRoute 必须是函数');
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* 验证 injectImports 配置
|
|
174
|
-
*
|
|
175
|
-
* @param opts - 配置选项
|
|
176
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
177
|
-
*/
|
|
178
|
-
function validateInjectImports(opts) {
|
|
179
|
-
if (opts.injectImports === undefined)
|
|
180
|
-
return;
|
|
181
|
-
if (!Array.isArray(opts.injectImports)) {
|
|
182
|
-
throw new Error('options.injectImports 必须是数组');
|
|
183
|
-
}
|
|
184
|
-
opts.injectImports.forEach((imp, i) => {
|
|
185
|
-
if (typeof imp !== 'string') {
|
|
186
|
-
throw new Error(`options.injectImports[${i}] 必须是字符串`);
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* 验证 namingStrategy 配置
|
|
192
|
-
*
|
|
193
|
-
* @param opts - 配置选项
|
|
194
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
195
|
-
*/
|
|
196
|
-
function validateNamingStrategy(opts) {
|
|
197
|
-
if (opts.namingStrategy === undefined)
|
|
198
|
-
return;
|
|
199
|
-
const validStrategies = ['kebab', 'lowercase', 'none'];
|
|
200
|
-
if (!validStrategies.includes(opts.namingStrategy)) {
|
|
201
|
-
throw new Error(`options.namingStrategy 必须是 'kebab'、'lowercase' 或 'none'`);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* 验证插件配置选项
|
|
206
|
-
*
|
|
207
|
-
* 验证顺序:
|
|
208
|
-
* 1. root 配置
|
|
209
|
-
* 2. prefix 配置
|
|
210
|
-
* 3. pages 配置
|
|
211
|
-
* 4. extensions 配置
|
|
212
|
-
* 5. include 配置
|
|
213
|
-
* 6. exclude 配置
|
|
214
|
-
* 7. importMode 配置
|
|
215
|
-
* 8. extendRoute 配置
|
|
216
|
-
* 9. injectImports 配置
|
|
217
|
-
* 10. namingStrategy 配置
|
|
218
|
-
*
|
|
219
|
-
* @param opts - 用户提供的配置选项
|
|
220
|
-
* @throws {Error} 当配置无效时抛出错误
|
|
221
|
-
*/
|
|
222
|
-
export function validateOptions(opts) {
|
|
223
|
-
validateRoot(opts);
|
|
224
|
-
validatePrefix(opts);
|
|
225
|
-
validatePagesDir(opts);
|
|
226
|
-
validateExtensions(opts);
|
|
227
|
-
validateInclude(opts);
|
|
228
|
-
validateExclude(opts);
|
|
229
|
-
validateImportMode(opts);
|
|
230
|
-
validateExtendRoute(opts);
|
|
231
|
-
validateInjectImports(opts);
|
|
232
|
-
validateNamingStrategy(opts);
|
|
233
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|