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
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import type { BeforeWriteRoutesHook, CodeTransformHook, ExtendRouteHook } from './hooks.js';
|
|
2
|
+
import type { PageOptions } from './route.js';
|
|
3
|
+
/**
|
|
4
|
+
* 自定义导入模式函数的上下文
|
|
5
|
+
*/
|
|
6
|
+
export interface ImportModeContext {
|
|
7
|
+
/**
|
|
8
|
+
* 组件文件路径(已 JSON.stringify)
|
|
9
|
+
*/
|
|
10
|
+
importPath: string;
|
|
11
|
+
/**
|
|
12
|
+
* 组件文件原始路径
|
|
13
|
+
*/
|
|
14
|
+
filePath: string;
|
|
15
|
+
/**
|
|
16
|
+
* 添加导入语句
|
|
17
|
+
* 用于向生成的代码顶部添加 import 语句
|
|
18
|
+
*/
|
|
19
|
+
addImport: (statement: string) => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 自定义导入处理函数
|
|
23
|
+
*
|
|
24
|
+
* @param context - 导入上下文
|
|
25
|
+
* @returns 'lazy' | 'sync' | 表达式字符串
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* // 返回预设模式
|
|
30
|
+
* (context) => 'lazy'
|
|
31
|
+
* (context) => 'sync'
|
|
32
|
+
*
|
|
33
|
+
* // 返回自定义表达式
|
|
34
|
+
* (context) => {
|
|
35
|
+
* context.addImport(`import { lazy } from 'vitarx'`)
|
|
36
|
+
* return `lazy(() => import(${context.importPath}))`
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export type ComponentImportHandler = (context: ImportModeContext) => 'lazy' | 'sync' | string;
|
|
41
|
+
/**
|
|
42
|
+
* 组件导入模式。
|
|
43
|
+
*
|
|
44
|
+
* - 'lazy': 生成懒加载表达式 `lazy(() => import(path))`
|
|
45
|
+
* - 'sync': 同步加载组件,生成 `import` 语句
|
|
46
|
+
* - 函数: 自定义导入逻辑
|
|
47
|
+
*/
|
|
48
|
+
export type ImportMode = 'lazy' | 'sync' | ComponentImportHandler;
|
|
49
|
+
/**
|
|
50
|
+
* 生成路径的策略。
|
|
51
|
+
*/
|
|
52
|
+
export type PathStrategy = 'kebab' | 'lowercase' | 'raw';
|
|
53
|
+
export type PageSource = string | PageDirOptions;
|
|
54
|
+
/**
|
|
55
|
+
* 路径解析结果
|
|
56
|
+
*/
|
|
57
|
+
export interface PageParseResult {
|
|
58
|
+
/** 解析后的路径 如:home.jsx -> 'home' */
|
|
59
|
+
path: string;
|
|
60
|
+
/**
|
|
61
|
+
* 页面相关可配置选项
|
|
62
|
+
*/
|
|
63
|
+
options?: PageOptions;
|
|
64
|
+
/** 视图名称 如:home.nav.jsx -> 'nav' */
|
|
65
|
+
viewName?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface GroupParseResult {
|
|
68
|
+
/**
|
|
69
|
+
* 用于Route的路径 如:1.group -> 'group'
|
|
70
|
+
*/
|
|
71
|
+
path: string;
|
|
72
|
+
/**
|
|
73
|
+
* 分组相关可配置选项
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```js
|
|
77
|
+
* {
|
|
78
|
+
* options: {
|
|
79
|
+
* meta: {
|
|
80
|
+
* order: 1
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
options?: PageOptions;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 页面文件前置解析器
|
|
90
|
+
*
|
|
91
|
+
* @param basename - 文件名称(不包含扩展名)
|
|
92
|
+
* @param filePath - 完整的文件路径
|
|
93
|
+
* @returns {PageParseResult | string} 如果返回字符串则交由内置解析器处理,否则返回`FileParseResult`对象
|
|
94
|
+
*/
|
|
95
|
+
export type PageParser = (basename: string, filePath: string) => string | PageParseResult;
|
|
96
|
+
/**
|
|
97
|
+
* 分组目录前置解析器
|
|
98
|
+
*/
|
|
99
|
+
export type GroupParser = (dirName: string, dirPath: string) => string | GroupParseResult;
|
|
100
|
+
/**
|
|
101
|
+
* 页面目录选项
|
|
102
|
+
*/
|
|
103
|
+
export interface PageDirOptions {
|
|
104
|
+
/**
|
|
105
|
+
* 页面目录
|
|
106
|
+
*/
|
|
107
|
+
dir: string;
|
|
108
|
+
/**
|
|
109
|
+
* 包含规则
|
|
110
|
+
*
|
|
111
|
+
* @default ['**\/*.{jsx,tsx}']
|
|
112
|
+
*/
|
|
113
|
+
include?: readonly string[];
|
|
114
|
+
/**
|
|
115
|
+
* 排除规则
|
|
116
|
+
*
|
|
117
|
+
* @default ['**\/node_modules\/**', '**\/dist\/**', '**\/.*']
|
|
118
|
+
*/
|
|
119
|
+
exclude?: readonly string[];
|
|
120
|
+
/**
|
|
121
|
+
* 路径前缀(当 group=true 时)
|
|
122
|
+
* 或字符串前缀(当 group=false 时)
|
|
123
|
+
*/
|
|
124
|
+
prefix?: string;
|
|
125
|
+
/**
|
|
126
|
+
* 是否作为路由分组
|
|
127
|
+
*/
|
|
128
|
+
group?: boolean;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 文件路由配置
|
|
132
|
+
*/
|
|
133
|
+
export interface FileRouterOptions {
|
|
134
|
+
/**
|
|
135
|
+
* 项目根目录
|
|
136
|
+
*
|
|
137
|
+
* @default process.cwd()
|
|
138
|
+
*/
|
|
139
|
+
root?: string;
|
|
140
|
+
/**
|
|
141
|
+
* 页面来源配置
|
|
142
|
+
*
|
|
143
|
+
* @default 'src/pages'
|
|
144
|
+
*/
|
|
145
|
+
pages?: PageSource | readonly PageSource[];
|
|
146
|
+
/**
|
|
147
|
+
* 路径转换策略
|
|
148
|
+
*
|
|
149
|
+
* - 'kebab': 转换为 kebab-case
|
|
150
|
+
* - 'lowercase': 转换为 lowercase
|
|
151
|
+
* - 'raw': 不转换
|
|
152
|
+
*
|
|
153
|
+
* @values 'kebab' | 'lowercase' | 'raw'
|
|
154
|
+
* @default 'kebab'
|
|
155
|
+
*/
|
|
156
|
+
pathStrategy?: PathStrategy;
|
|
157
|
+
/**
|
|
158
|
+
* 组件导入模式
|
|
159
|
+
*
|
|
160
|
+
* - 'lazy': 生成懒加载表达式 `lazy(() => import(path))`
|
|
161
|
+
* - 'sync': 同步加载组件,生成 `import` 语句
|
|
162
|
+
* - 函数: 自定义导入逻辑
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```ts
|
|
166
|
+
* // 使用预设模式
|
|
167
|
+
* importMode: 'lazy'
|
|
168
|
+
*
|
|
169
|
+
* // 使用自定义函数
|
|
170
|
+
* importMode: (context) => {
|
|
171
|
+
* context.addImport(`import { lazy } from 'vitarx'`)
|
|
172
|
+
* return `lazy(() => import(${context.importPath}))`
|
|
173
|
+
* }
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* @default 'lazy'
|
|
177
|
+
*/
|
|
178
|
+
importMode?: ImportMode;
|
|
179
|
+
/**
|
|
180
|
+
* 注入在路由虚拟模块顶部的导入语句
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```js
|
|
184
|
+
* {
|
|
185
|
+
* injectImports: ['import { lazy } from "vitarx"']
|
|
186
|
+
* }
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
injectImports?: readonly string[];
|
|
190
|
+
/**
|
|
191
|
+
* 是否生成 dts 文件
|
|
192
|
+
*
|
|
193
|
+
* - `true`: 生成 dts 文件,文件名为 `router.d.ts`
|
|
194
|
+
* - `false`: 不生成 dts 文件
|
|
195
|
+
* - `string`: 生成 dts 文件,支持绝对路径和相对路径(相对于root)如:`'typed-router.d.ts'`
|
|
196
|
+
*
|
|
197
|
+
* @default false
|
|
198
|
+
*/
|
|
199
|
+
dts?: boolean | string;
|
|
200
|
+
/**
|
|
201
|
+
* 布局文件名
|
|
202
|
+
*
|
|
203
|
+
* @default '_layout'
|
|
204
|
+
*/
|
|
205
|
+
layoutFileName?: string;
|
|
206
|
+
/**
|
|
207
|
+
* 分组配置文件名
|
|
208
|
+
*
|
|
209
|
+
* @default '_config'
|
|
210
|
+
*/
|
|
211
|
+
configFileName?: string;
|
|
212
|
+
/**
|
|
213
|
+
* 代码转换
|
|
214
|
+
*
|
|
215
|
+
* 通常用于转换 markdown 文件内容为 `EsModule`。
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```js
|
|
219
|
+
* {
|
|
220
|
+
* transform(content, file) {
|
|
221
|
+
* const { ext, name } = path.parse(file)
|
|
222
|
+
* if (ext === '.md') {
|
|
223
|
+
* const html = markdownToHtml(content)
|
|
224
|
+
* return `export default function ${name}() { return ${html} }`
|
|
225
|
+
* }
|
|
226
|
+
* return content
|
|
227
|
+
* }
|
|
228
|
+
* }
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
transform?: CodeTransformHook;
|
|
232
|
+
/**
|
|
233
|
+
* 扩展路由
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```js
|
|
237
|
+
* {
|
|
238
|
+
* extendRoute(route) {
|
|
239
|
+
* route.meta ??= { auth: true }
|
|
240
|
+
* }
|
|
241
|
+
* }
|
|
242
|
+
* ```
|
|
243
|
+
*/
|
|
244
|
+
extendRoute?: ExtendRouteHook;
|
|
245
|
+
/**
|
|
246
|
+
* 写入路由之前
|
|
247
|
+
*/
|
|
248
|
+
beforeWriteRoutes?: BeforeWriteRoutesHook;
|
|
249
|
+
/**
|
|
250
|
+
* 页面文件前置解析器
|
|
251
|
+
*
|
|
252
|
+
* @see {@linkcode PageParser}
|
|
253
|
+
*/
|
|
254
|
+
pageParser?: PageParser;
|
|
255
|
+
/**
|
|
256
|
+
* 分组目录前置解析器
|
|
257
|
+
*
|
|
258
|
+
* @see {@linkcode GroupParser}
|
|
259
|
+
* @example
|
|
260
|
+
* ```js
|
|
261
|
+
* {
|
|
262
|
+
* groupParser(dirName) {
|
|
263
|
+
* // dirName = '1.group'
|
|
264
|
+
* const result = parseOrderAndName(dirName)
|
|
265
|
+
* return {
|
|
266
|
+
* path: result.name, // 'group'
|
|
267
|
+
* options: {
|
|
268
|
+
* meta: {
|
|
269
|
+
* // 往 meta 中添加 order 字段
|
|
270
|
+
* order: result.order // 1
|
|
271
|
+
* }
|
|
272
|
+
* }
|
|
273
|
+
* }
|
|
274
|
+
* }
|
|
275
|
+
* }
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
groupParser?: GroupParser;
|
|
279
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 页面可配置路由选项(definePage)
|
|
3
|
+
*/
|
|
4
|
+
import type { RouteMetaData } from '../../core/index.js';
|
|
5
|
+
export interface RedirectConfig {
|
|
6
|
+
/**
|
|
7
|
+
* 路由索引,支持path或name
|
|
8
|
+
*/
|
|
9
|
+
index: string;
|
|
10
|
+
/**
|
|
11
|
+
* 查询参数
|
|
12
|
+
*/
|
|
13
|
+
query?: Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* URL动态参数
|
|
16
|
+
*/
|
|
17
|
+
params?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
export interface PageOptions {
|
|
20
|
+
/**
|
|
21
|
+
* 路由名称
|
|
22
|
+
*/
|
|
23
|
+
name?: string;
|
|
24
|
+
/**
|
|
25
|
+
* 路由元数据
|
|
26
|
+
*/
|
|
27
|
+
meta?: RouteMetaData;
|
|
28
|
+
/**
|
|
29
|
+
* 动态参数匹配模式
|
|
30
|
+
*/
|
|
31
|
+
pattern?: Record<string, RegExp>;
|
|
32
|
+
/**
|
|
33
|
+
* 重定向配置
|
|
34
|
+
*/
|
|
35
|
+
redirect?: string | RedirectConfig;
|
|
36
|
+
/**
|
|
37
|
+
* 路由别名
|
|
38
|
+
*/
|
|
39
|
+
alias?: string | string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 扫描的节点 - 核心 IR 节点
|
|
43
|
+
*/
|
|
44
|
+
export interface ScanNode {
|
|
45
|
+
/**
|
|
46
|
+
* 目录配置文件
|
|
47
|
+
*/
|
|
48
|
+
dirConfigFile?: string;
|
|
49
|
+
/**
|
|
50
|
+
* 是否为分组
|
|
51
|
+
*/
|
|
52
|
+
readonly isGroup: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 文件绝对路径
|
|
55
|
+
*/
|
|
56
|
+
readonly filePath: string;
|
|
57
|
+
/**
|
|
58
|
+
* 当前 path(不含父级)
|
|
59
|
+
*/
|
|
60
|
+
readonly path: string;
|
|
61
|
+
/**
|
|
62
|
+
* 父节点
|
|
63
|
+
*/
|
|
64
|
+
parent?: ScanNode;
|
|
65
|
+
/**
|
|
66
|
+
* 子节点映射
|
|
67
|
+
*/
|
|
68
|
+
children?: Set<ScanNode>;
|
|
69
|
+
/**
|
|
70
|
+
* 组件映射(命名视图)
|
|
71
|
+
*/
|
|
72
|
+
components?: Record<string, string>;
|
|
73
|
+
/**
|
|
74
|
+
* 页面配置选项
|
|
75
|
+
*/
|
|
76
|
+
options?: PageOptions;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 路由节点 - 解析后的路由节点
|
|
80
|
+
*/
|
|
81
|
+
export interface RouteNode extends PageOptions {
|
|
82
|
+
/**
|
|
83
|
+
* 是否为分组
|
|
84
|
+
*/
|
|
85
|
+
isGroup: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* 文件绝对路径
|
|
88
|
+
*/
|
|
89
|
+
filePath: string;
|
|
90
|
+
/**
|
|
91
|
+
* 当前 path(不含父级)
|
|
92
|
+
*/
|
|
93
|
+
path: string;
|
|
94
|
+
/**
|
|
95
|
+
* 完整 path(含父级)
|
|
96
|
+
*/
|
|
97
|
+
fullPath: string;
|
|
98
|
+
/**
|
|
99
|
+
* 子节点
|
|
100
|
+
*/
|
|
101
|
+
children?: RouteNode[];
|
|
102
|
+
/**
|
|
103
|
+
* 组件映射(命名视图)
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```js
|
|
107
|
+
* {
|
|
108
|
+
* default: '/src/pages/Home.jsx', // 实际为系统绝对路径!
|
|
109
|
+
* sidebar: '/src/pages/Sidebar.jsx'
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
component?: Record<string, string>;
|
|
114
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CodeTransformHook } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 读取文件内容
|
|
4
|
+
*
|
|
5
|
+
* 根据是否提供自定义读取函数,选择相应的读取方式。
|
|
6
|
+
*
|
|
7
|
+
* @param filePath - 文件绝对路径
|
|
8
|
+
* @param transform - 代码转换钩子
|
|
9
|
+
* @returns 文件内容
|
|
10
|
+
*/
|
|
11
|
+
export declare function readFileContent(filePath: string, transform?: CodeTransformHook): string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 文件读取工具模块
|
|
3
|
+
*
|
|
4
|
+
* 提供文件读取的默认实现和自定义读取函数的调用封装。
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* 读取文件内容
|
|
9
|
+
*
|
|
10
|
+
* 根据是否提供自定义读取函数,选择相应的读取方式。
|
|
11
|
+
*
|
|
12
|
+
* @param filePath - 文件绝对路径
|
|
13
|
+
* @param transform - 代码转换钩子
|
|
14
|
+
* @returns 文件内容
|
|
15
|
+
*/
|
|
16
|
+
export function readFileContent(filePath, transform) {
|
|
17
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
18
|
+
if (transform) {
|
|
19
|
+
return transform(content, filePath);
|
|
20
|
+
}
|
|
21
|
+
return content;
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 查找路由
|
|
3
|
+
*
|
|
4
|
+
* @param routes - 路由列表
|
|
5
|
+
* @param path - 路径
|
|
6
|
+
*/
|
|
7
|
+
export function findRoute(routes, path) {
|
|
8
|
+
for (const route of routes) {
|
|
9
|
+
if (!route.isGroup && route.fullPath === path)
|
|
10
|
+
return route;
|
|
11
|
+
if (route.isGroup && route.children) {
|
|
12
|
+
for (const child of route.children) {
|
|
13
|
+
if (child.fullPath === path)
|
|
14
|
+
return route;
|
|
15
|
+
if (child.isGroup && child.children) {
|
|
16
|
+
return findRoute(child.children, path);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
@@ -6,5 +6,7 @@
|
|
|
6
6
|
export * from './pathUtils.js';
|
|
7
7
|
export * from './babelUtils.js';
|
|
8
8
|
export * from './logger.js';
|
|
9
|
-
export * from './
|
|
10
|
-
export * from '
|
|
9
|
+
export * from './pathStrategy.js';
|
|
10
|
+
export * from '../config/validate.js';
|
|
11
|
+
export * from './fileReader.js';
|
|
12
|
+
export * from './findRoute.js';
|
|
@@ -6,5 +6,7 @@
|
|
|
6
6
|
export * from './pathUtils.js';
|
|
7
7
|
export * from './babelUtils.js';
|
|
8
8
|
export * from './logger.js';
|
|
9
|
-
export * from './
|
|
10
|
-
export * from '
|
|
9
|
+
export * from './pathStrategy.js';
|
|
10
|
+
export * from '../config/validate.js';
|
|
11
|
+
export * from './fileReader.js';
|
|
12
|
+
export * from './findRoute.js';
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
/**
|
|
8
8
|
* 设置日志上下文
|
|
9
9
|
*
|
|
10
|
-
* @param
|
|
10
|
+
* @param prefix - 前缀字符串
|
|
11
11
|
*/
|
|
12
|
-
export declare function setLogPrefix(
|
|
12
|
+
export declare function setLogPrefix(prefix: string): void;
|
|
13
13
|
/**
|
|
14
14
|
* 启用/禁用调试日志
|
|
15
15
|
*
|
|
@@ -24,7 +24,7 @@ export declare function setDebugEnabled(enabled: boolean): void;
|
|
|
24
24
|
* @param message 日志消息
|
|
25
25
|
* @param details 详细信息(可选)
|
|
26
26
|
*/
|
|
27
|
-
export declare function info(message: string, details?:
|
|
27
|
+
export declare function info(message: string, details?: unknown): void;
|
|
28
28
|
/**
|
|
29
29
|
* 警告级日志
|
|
30
30
|
*
|
|
@@ -33,7 +33,7 @@ export declare function info(message: string, details?: string): void;
|
|
|
33
33
|
* @param message 日志消息
|
|
34
34
|
* @param details 详细信息(可选)
|
|
35
35
|
*/
|
|
36
|
-
export declare function warn(message: string, details?:
|
|
36
|
+
export declare function warn(message: string, details?: unknown): void;
|
|
37
37
|
/**
|
|
38
38
|
* 错误级日志
|
|
39
39
|
*
|
|
@@ -42,7 +42,7 @@ export declare function warn(message: string, details?: string): void;
|
|
|
42
42
|
* @param message 日志消息
|
|
43
43
|
* @param details 详细信息(可选)
|
|
44
44
|
*/
|
|
45
|
-
export declare function error(message: string, details?:
|
|
45
|
+
export declare function error(message: string, details?: unknown): void;
|
|
46
46
|
/**
|
|
47
47
|
* 调试级日志
|
|
48
48
|
*
|
|
@@ -51,4 +51,4 @@ export declare function error(message: string, details?: string): void;
|
|
|
51
51
|
* @param message 日志消息
|
|
52
52
|
* @param details 详细信息(可选)
|
|
53
53
|
*/
|
|
54
|
-
export declare function debug(message: string, details?:
|
|
54
|
+
export declare function debug(message: string, details?: unknown): void;
|
|
@@ -16,10 +16,10 @@ let debugEnabled = false;
|
|
|
16
16
|
/**
|
|
17
17
|
* 设置日志上下文
|
|
18
18
|
*
|
|
19
|
-
* @param
|
|
19
|
+
* @param prefix - 前缀字符串
|
|
20
20
|
*/
|
|
21
|
-
export function setLogPrefix(
|
|
22
|
-
globalLogPrefix =
|
|
21
|
+
export function setLogPrefix(prefix) {
|
|
22
|
+
globalLogPrefix = prefix;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* 启用/禁用调试日志
|
|
@@ -61,6 +61,45 @@ function getLevelColor(level) {
|
|
|
61
61
|
return chalk.white;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* 格式化错误信息
|
|
66
|
+
* @param error 错误对象
|
|
67
|
+
* @returns 格式化后的错误字符串
|
|
68
|
+
*/
|
|
69
|
+
function formatError(error) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
lines.push(`${chalk.red(error.name)}: ${error.message}`);
|
|
72
|
+
if (error.stack) {
|
|
73
|
+
const stackLines = error.stack
|
|
74
|
+
.split('\n')
|
|
75
|
+
.slice(1, 4)
|
|
76
|
+
.map(line => line.trim())
|
|
77
|
+
.filter(Boolean);
|
|
78
|
+
if (stackLines.length > 0) {
|
|
79
|
+
lines.push(chalk.gray(stackLines.join('\n ')));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return lines.join('\n ');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 格式化详细信息
|
|
86
|
+
* @param details 详细信息
|
|
87
|
+
* @returns 格式化后的字符串
|
|
88
|
+
*/
|
|
89
|
+
function formatDetails(details) {
|
|
90
|
+
if (details instanceof Error) {
|
|
91
|
+
return formatError(details);
|
|
92
|
+
}
|
|
93
|
+
if (details && (Array.isArray(details) || typeof details === 'object')) {
|
|
94
|
+
try {
|
|
95
|
+
return JSON.stringify(details, null, 2);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return String(details);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return String(details);
|
|
102
|
+
}
|
|
64
103
|
/**
|
|
65
104
|
* 基础日志函数
|
|
66
105
|
* @param level 日志级别
|
|
@@ -75,7 +114,8 @@ function log(level, message, details) {
|
|
|
75
114
|
const levelColor = getLevelColor(level);
|
|
76
115
|
const prefix = `${chalk.gray(timestamp)} ${chalk.cyan(`[${globalLogPrefix}]`)}`;
|
|
77
116
|
const levelTag = chalk.gray(`(${level})`);
|
|
78
|
-
const
|
|
117
|
+
const formattedDetails = details !== undefined ? formatDetails(details) : '';
|
|
118
|
+
const detailsPart = formattedDetails ? `\n ${chalk.gray(formattedDetails)}` : '';
|
|
79
119
|
console.log(`${prefix} ${levelTag} ${levelColor(message)}${detailsPart}`);
|
|
80
120
|
}
|
|
81
121
|
/**
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview 命名策略工具模块
|
|
3
|
+
*
|
|
4
|
+
* 提供路由名称和路径的命名转换功能,支持三种策略:
|
|
5
|
+
* - kebab: 将驼峰命名转换为 kebab-case(默认)
|
|
6
|
+
* - lowercase: 简单转换为小写
|
|
7
|
+
* - none: 保持原始命名
|
|
8
|
+
*
|
|
9
|
+
* 注意:只处理路径段名称,不处理动态参数变量名。
|
|
10
|
+
*/
|
|
11
|
+
import type { PathStrategy } from '../types/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* 应用命名策略转换路由路径
|
|
14
|
+
*
|
|
15
|
+
* 只处理路径段名称,不处理动态参数变量名。
|
|
16
|
+
*
|
|
17
|
+
* @param path - 路由路径
|
|
18
|
+
* @param strategy - 命名策略
|
|
19
|
+
* @returns 转换后的路径
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* applyNamingStrategyToPath('/MainHome', 'kebab') // => '/main-home'
|
|
24
|
+
* applyNamingStrategyToPath('/User/[userName]', 'kebab') // => '/user/[userName]'
|
|
25
|
+
* applyNamingStrategyToPath('/API/UserProfile', 'kebab') // => '/api/user-profile'
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function applyPathStrategy(path: string, strategy: PathStrategy): string;
|