@fukict/router 0.1.0

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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Link.d.ts +38 -0
  3. package/dist/Link.d.ts.map +1 -0
  4. package/dist/Link.js +138 -0
  5. package/dist/Link.js.map +1 -0
  6. package/dist/RouteComponent.d.ts +85 -0
  7. package/dist/RouteComponent.d.ts.map +1 -0
  8. package/dist/RouteComponent.js +153 -0
  9. package/dist/RouteComponent.js.map +1 -0
  10. package/dist/Router.d.ts +128 -0
  11. package/dist/Router.d.ts.map +1 -0
  12. package/dist/Router.js +417 -0
  13. package/dist/Router.js.map +1 -0
  14. package/dist/RouterProvider.d.ts +41 -0
  15. package/dist/RouterProvider.d.ts.map +1 -0
  16. package/dist/RouterProvider.js +104 -0
  17. package/dist/RouterProvider.js.map +1 -0
  18. package/dist/RouterView.d.ts +27 -0
  19. package/dist/RouterView.d.ts.map +1 -0
  20. package/dist/RouterView.js +66 -0
  21. package/dist/RouterView.js.map +1 -0
  22. package/dist/history/base.d.ts +45 -0
  23. package/dist/history/base.d.ts.map +1 -0
  24. package/dist/history/base.js +47 -0
  25. package/dist/history/base.js.map +1 -0
  26. package/dist/history/browser.d.ts +17 -0
  27. package/dist/history/browser.d.ts.map +1 -0
  28. package/dist/history/browser.js +76 -0
  29. package/dist/history/browser.js.map +1 -0
  30. package/dist/history/hash.d.ts +14 -0
  31. package/dist/history/hash.d.ts.map +1 -0
  32. package/dist/history/hash.js +51 -0
  33. package/dist/history/hash.js.map +1 -0
  34. package/dist/history/index.d.ts +12 -0
  35. package/dist/history/index.d.ts.map +1 -0
  36. package/dist/history/index.js +16 -0
  37. package/dist/history/index.js.map +1 -0
  38. package/dist/history/types.d.ts +34 -0
  39. package/dist/history/types.d.ts.map +1 -0
  40. package/dist/history/types.js +2 -0
  41. package/dist/history/types.js.map +1 -0
  42. package/dist/index.d.ts +15 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/matcher.d.ts +59 -0
  47. package/dist/matcher.d.ts.map +1 -0
  48. package/dist/matcher.js +213 -0
  49. package/dist/matcher.js.map +1 -0
  50. package/dist/metadata.d.ts +14 -0
  51. package/dist/metadata.d.ts.map +1 -0
  52. package/dist/metadata.js +14 -0
  53. package/dist/metadata.js.map +1 -0
  54. package/dist/types.d.ts +331 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +54 -0
@@ -0,0 +1,213 @@
1
+ /**
2
+ * 路由匹配器
3
+ */
4
+ export class RouteMatcher {
5
+ /**
6
+ * 编译后的路由列表
7
+ */
8
+ compiledRoutes = [];
9
+ /**
10
+ * 原始路由配置(保留用于构建匹配链)
11
+ */
12
+ routes;
13
+ /**
14
+ * 构造函数
15
+ * @param routes 路由配置列表
16
+ * @param parentPath 父路径(用于嵌套路由)
17
+ */
18
+ constructor(routes, parentPath = '') {
19
+ this.routes = routes;
20
+ this.compile(routes, parentPath);
21
+ }
22
+ /**
23
+ * 编译路由配置
24
+ */
25
+ compile(routes, parentPath) {
26
+ for (const route of routes) {
27
+ const fullPath = this.normalizePath(parentPath + route.path);
28
+ const compiled = this.compileRoute(route, fullPath);
29
+ this.compiledRoutes.push(compiled);
30
+ // 递归编译子路由
31
+ if (route.children && route.children.length > 0) {
32
+ const childMatcher = new RouteMatcher(route.children, fullPath);
33
+ // 将子路由的编译结果合并到当前列表
34
+ this.compiledRoutes.push(...childMatcher.compiledRoutes);
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * 编译单个路由配置
40
+ */
41
+ compileRoute(config, fullPath) {
42
+ const segments = [];
43
+ const paramNames = [];
44
+ // 分割路径为段
45
+ const parts = fullPath.split('/').filter(part => part !== '');
46
+ for (const part of parts) {
47
+ if (part === '*') {
48
+ // 通配符
49
+ segments.push({ isDynamic: false, isWildcard: true });
50
+ }
51
+ else if (part.startsWith(':')) {
52
+ // 动态参数
53
+ const paramName = part.slice(1);
54
+ segments.push({ isDynamic: true, paramName, isWildcard: false });
55
+ paramNames.push(paramName);
56
+ }
57
+ else {
58
+ // 静态段
59
+ segments.push({ isDynamic: false, value: part, isWildcard: false });
60
+ }
61
+ }
62
+ // 构建正则表达式
63
+ const regex = this.buildRegex(segments);
64
+ return {
65
+ config,
66
+ segments,
67
+ regex,
68
+ paramNames,
69
+ };
70
+ }
71
+ /**
72
+ * 构建路由匹配的正则表达式
73
+ */
74
+ buildRegex(segments) {
75
+ if (segments.length === 0) {
76
+ // 根路径
77
+ return /^\/$/;
78
+ }
79
+ let pattern = '^';
80
+ for (const segment of segments) {
81
+ pattern += '\\/';
82
+ if (segment.isWildcard) {
83
+ // 通配符匹配任意内容
84
+ pattern += '.*';
85
+ }
86
+ else if (segment.isDynamic) {
87
+ // 动态参数匹配非 / 字符
88
+ pattern += '([^/]+)';
89
+ }
90
+ else {
91
+ // 静态段精确匹配
92
+ pattern += this.escapeRegex(segment.value);
93
+ }
94
+ }
95
+ // 如果最后一个段是通配符,不需要 $
96
+ const lastSegment = segments[segments.length - 1];
97
+ if (!lastSegment?.isWildcard) {
98
+ pattern += '\\/?$';
99
+ }
100
+ return new RegExp(pattern);
101
+ }
102
+ /**
103
+ * 转义正则表达式特殊字符
104
+ */
105
+ escapeRegex(str) {
106
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
107
+ }
108
+ /**
109
+ * 规范化路径
110
+ */
111
+ normalizePath(path) {
112
+ // 确保路径以 / 开头
113
+ if (!path.startsWith('/')) {
114
+ path = '/' + path;
115
+ }
116
+ // 移除末尾的 /(除非是根路径)
117
+ if (path.length > 1 && path.endsWith('/')) {
118
+ path = path.slice(0, -1);
119
+ }
120
+ // 移除重复的 /
121
+ path = path.replace(/\/+/g, '/');
122
+ return path;
123
+ }
124
+ /**
125
+ * 匹配路径
126
+ * @param path 要匹配的路径
127
+ * @returns 匹配结果列表(从顶层到当前层级)
128
+ */
129
+ match(path) {
130
+ path = this.normalizePath(path);
131
+ for (const compiled of this.compiledRoutes) {
132
+ const match = compiled.regex.exec(path);
133
+ if (match) {
134
+ // 提取参数
135
+ const params = {};
136
+ for (let i = 0; i < compiled.paramNames.length; i++) {
137
+ const paramName = compiled.paramNames[i];
138
+ const paramValue = match[i + 1];
139
+ params[paramName] = decodeURIComponent(paramValue);
140
+ }
141
+ // 构建匹配结果
142
+ const matches = this.buildMatchChain(compiled.config, path, params);
143
+ return matches;
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+ /**
149
+ * 构建匹配链(从顶层到当前层级)
150
+ */
151
+ buildMatchChain(config, path, params) {
152
+ const matches = [];
153
+ // 递归查找父路由链
154
+ const findParentChain = (targetConfig, routes) => {
155
+ for (const route of routes) {
156
+ if (route === targetConfig) {
157
+ return [route];
158
+ }
159
+ if (route.children && route.children.length > 0) {
160
+ const childChain = findParentChain(targetConfig, route.children);
161
+ if (childChain) {
162
+ return [route, ...childChain];
163
+ }
164
+ }
165
+ }
166
+ return null;
167
+ };
168
+ // 从根路由开始查找匹配链
169
+ const chain = findParentChain(config, this.routes);
170
+ if (chain) {
171
+ // 构建每个层级的 RouteMatch
172
+ for (const routeConfig of chain) {
173
+ matches.push({
174
+ config: routeConfig,
175
+ params,
176
+ path,
177
+ });
178
+ }
179
+ }
180
+ else {
181
+ // 如果找不到完整链,至少返回当前匹配
182
+ matches.push({
183
+ config,
184
+ params,
185
+ path,
186
+ });
187
+ }
188
+ return matches;
189
+ }
190
+ /**
191
+ * 根据路由名称查找路由配置
192
+ */
193
+ findByName(name) {
194
+ for (const compiled of this.compiledRoutes) {
195
+ if (compiled.config.name === name) {
196
+ return compiled.config;
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ /**
202
+ * 生成路径(根据路由配置和参数)
203
+ */
204
+ buildPath(config, params = {}) {
205
+ let path = config.path;
206
+ // 替换动态参数
207
+ for (const [key, value] of Object.entries(params)) {
208
+ path = path.replace(`:${key}`, encodeURIComponent(value));
209
+ }
210
+ return this.normalizePath(path);
211
+ }
212
+ }
213
+ //# sourceMappingURL=matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Package metadata
3
+ * Auto-generated by extract-metadata.ts - DO NOT EDIT MANUALLY
4
+ */
5
+ export declare const METADATA: {
6
+ readonly name: "@fukict/router";
7
+ readonly version: "0.1.0";
8
+ readonly description: "Router for Fukict framework with nested routing and lazy loading";
9
+ readonly author: "Fukict Team";
10
+ readonly license: "MIT";
11
+ readonly homepage: "";
12
+ readonly repository: "https://github.com/fukict/fukict.git";
13
+ };
14
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,QAAQ;;;;;;;;CAQX,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Package metadata
3
+ * Auto-generated by extract-metadata.ts - DO NOT EDIT MANUALLY
4
+ */
5
+ export const METADATA = {
6
+ name: '@fukict/router',
7
+ version: '0.1.0',
8
+ description: 'Router for Fukict framework with nested routing and lazy loading',
9
+ author: 'Fukict Team',
10
+ license: 'MIT',
11
+ homepage: '',
12
+ repository: 'https://github.com/fukict/fukict.git',
13
+ };
14
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,kEAAkE;IAC/E,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,sCAAsC;CAC1C,CAAC"}
@@ -0,0 +1,331 @@
1
+ import type { VNode } from '@fukict/basic';
2
+ import type { Router } from './Router';
3
+ /**
4
+ * 路由配置
5
+ */
6
+ export interface RouteConfig {
7
+ /**
8
+ * 路由路径(支持动态参数,如 /users/:id)
9
+ */
10
+ path: string;
11
+ /**
12
+ * 路由组件(可选,与 loader 二选一)
13
+ */
14
+ component?: RouteComponentClass;
15
+ /**
16
+ * 懒加载函数(可选,与 component 二选一)
17
+ * 返回 Promise<{ default: RouteComponentClass }>
18
+ */
19
+ loader?: () => Promise<{
20
+ default: RouteComponentClass;
21
+ }>;
22
+ /**
23
+ * 子路由配置
24
+ */
25
+ children?: RouteConfig[];
26
+ /**
27
+ * 路由元信息
28
+ */
29
+ meta?: RouteMeta;
30
+ /**
31
+ * 路由级别的导航守卫
32
+ */
33
+ beforeEnter?: NavigationGuard;
34
+ /**
35
+ * 路由名称(可选)
36
+ */
37
+ name?: string;
38
+ /**
39
+ * 重定向路径(可选)
40
+ */
41
+ redirect?: string;
42
+ }
43
+ /**
44
+ * 匹配的路由信息
45
+ */
46
+ export interface RouteMatch {
47
+ /**
48
+ * 匹配的路由配置
49
+ */
50
+ config: RouteConfig;
51
+ /**
52
+ * 路由参数(如 { id: '123' })
53
+ */
54
+ params: Record<string, string>;
55
+ /**
56
+ * 完整路径
57
+ */
58
+ path: string;
59
+ }
60
+ /**
61
+ * 路由元信息基础接口
62
+ *
63
+ * 这是一个空接口,允许用户通过模块扩展来定义项目特定的 meta 类型。
64
+ *
65
+ * @example 在项目的全局类型文件中扩展(例如 src/types/global.d.ts):
66
+ * ```typescript
67
+ * declare module '@fukict/router' {
68
+ * interface RouteMeta {
69
+ * title?: string;
70
+ * description?: string;
71
+ * requiresAuth?: boolean;
72
+ * }
73
+ * }
74
+ * ```
75
+ *
76
+ * 扩展后,所有路由的 meta 都会自动获得这些类型,无需手动导入。
77
+ */
78
+ export interface RouteMeta {
79
+ /**
80
+ * 内部重定向标记(不应该由用户直接使用)
81
+ * @internal
82
+ */
83
+ __redirect__?: string;
84
+ }
85
+ /**
86
+ * 当前路由对象
87
+ */
88
+ export interface Route {
89
+ /**
90
+ * 当前完整路径
91
+ */
92
+ path: string;
93
+ /**
94
+ * 查询参数
95
+ */
96
+ query: Record<string, string>;
97
+ /**
98
+ * 路由参数
99
+ */
100
+ params: Record<string, string>;
101
+ /**
102
+ * 路由元信息
103
+ */
104
+ meta: RouteMeta;
105
+ /**
106
+ * 匹配的路由配置列表(从顶层到当前层级)
107
+ */
108
+ matched: RouteConfig[];
109
+ /**
110
+ * hash 值(如 #section1)
111
+ */
112
+ hash: string;
113
+ }
114
+ /**
115
+ * Location 对象(用于导航)
116
+ */
117
+ export interface Location {
118
+ /**
119
+ * 目标路径
120
+ */
121
+ path?: string;
122
+ /**
123
+ * 查询参数
124
+ */
125
+ query?: Record<string, string>;
126
+ /**
127
+ * hash 值
128
+ */
129
+ hash?: string;
130
+ /**
131
+ * 路由名称
132
+ */
133
+ name?: string;
134
+ /**
135
+ * 路由参数
136
+ */
137
+ params?: Record<string, string>;
138
+ }
139
+ /**
140
+ * 导航守卫函数类型
141
+ */
142
+ export type NavigationGuard = (to: Route, from: Route, next: (path?: string | false) => void) => void;
143
+ /**
144
+ * 路由模式
145
+ */
146
+ export type RouterMode = 'hash' | 'history';
147
+ /**
148
+ * Router 配置选项
149
+ */
150
+ export interface RouterOptions {
151
+ /**
152
+ * 路由配置列表
153
+ */
154
+ routes: RouteConfig[];
155
+ /**
156
+ * 路由模式(默认 'hash')
157
+ */
158
+ mode?: RouterMode;
159
+ /**
160
+ * 基础路径(默认 '/')
161
+ */
162
+ base?: string;
163
+ /**
164
+ * 全局前置守卫
165
+ */
166
+ beforeEach?: NavigationGuard;
167
+ /**
168
+ * 全局后置钩子
169
+ */
170
+ afterEach?: (to: Route, from: Route) => void;
171
+ /**
172
+ * History 实例(可选,如果提供则使用传入的实例)
173
+ */
174
+ history?: import('./history').IHistory;
175
+ }
176
+ /**
177
+ * 路由组件类的构造函数类型
178
+ */
179
+ export interface RouteComponentClass {
180
+ new (props: RouteProps): RouteComponent;
181
+ }
182
+ /**
183
+ * 路由组件的 props 类型
184
+ */
185
+ export interface RouteProps {
186
+ /**
187
+ * Router 实例(可能是子路由)
188
+ */
189
+ router: Router;
190
+ }
191
+ /**
192
+ * 路由组件基类的抽象接口
193
+ */
194
+ export interface RouteComponent {
195
+ /**
196
+ * Router 实例
197
+ */
198
+ router: Router;
199
+ /**
200
+ * 当前匹配的路由配置
201
+ */
202
+ matched: RouteConfig | null;
203
+ /**
204
+ * 当前路由对象
205
+ */
206
+ route: Route;
207
+ /**
208
+ * 路由参数
209
+ */
210
+ params: Record<string, string>;
211
+ /**
212
+ * 查询参数
213
+ */
214
+ query: Record<string, string>;
215
+ /**
216
+ * 路由元信息
217
+ */
218
+ meta: RouteMeta;
219
+ /**
220
+ * 导航到指定路径(添加历史记录)
221
+ */
222
+ push(location: string | Location): void;
223
+ /**
224
+ * 替换当前路由(不添加历史记录)
225
+ */
226
+ replace(location: string | Location): void;
227
+ /**
228
+ * 返回上一页
229
+ */
230
+ back(): void;
231
+ /**
232
+ * 前进到下一页
233
+ */
234
+ forward(): void;
235
+ /**
236
+ * 更新查询参数(保留其他参数)
237
+ */
238
+ updateQuery(query: Record<string, string>): void;
239
+ /**
240
+ * 更新路由参数
241
+ */
242
+ updateParams(params: Record<string, string>): void;
243
+ /**
244
+ * 路由参数变化时的钩子
245
+ */
246
+ routeParamsChanged?(newParams: Record<string, string>, oldParams: Record<string, string>): void;
247
+ /**
248
+ * 查询参数变化时的钩子
249
+ */
250
+ routeQueryChanged?(newQuery: Record<string, string>, oldQuery: Record<string, string>): void;
251
+ /**
252
+ * 组件更新方法(由 Router 调用)
253
+ */
254
+ update(props: Partial<RouteProps>): void;
255
+ /**
256
+ * 渲染方法
257
+ */
258
+ render(): VNode;
259
+ }
260
+ /**
261
+ * RouterProvider 组件的 props
262
+ */
263
+ export interface RouterProviderProps {
264
+ /**
265
+ * 路由配置列表
266
+ */
267
+ routes: RouteConfig[];
268
+ /**
269
+ * 路由模式
270
+ */
271
+ mode?: RouterMode;
272
+ /**
273
+ * 基础路径
274
+ */
275
+ base?: string;
276
+ /**
277
+ * 全局前置守卫
278
+ */
279
+ beforeEach?: NavigationGuard;
280
+ /**
281
+ * 全局后置钩子
282
+ */
283
+ afterEach?: (to: Route, from: Route) => void;
284
+ /**
285
+ * 未匹配路由时的后备内容
286
+ */
287
+ fallback?: VNode;
288
+ }
289
+ /**
290
+ * RouterView 组件的 props
291
+ */
292
+ export interface RouterViewProps {
293
+ /**
294
+ * Router 实例
295
+ */
296
+ router: Router;
297
+ /**
298
+ * 未匹配路由时的后备内容
299
+ */
300
+ fallback?: VNode;
301
+ }
302
+ /**
303
+ * Link 组件的 props
304
+ */
305
+ export interface LinkProps {
306
+ /**
307
+ * 目标路径或 Location 对象
308
+ */
309
+ to: string | Location;
310
+ /**
311
+ * 是否使用 replace 模式(默认 false)
312
+ */
313
+ replace?: boolean;
314
+ /**
315
+ * CSS 类名
316
+ */
317
+ class?: string;
318
+ /**
319
+ * 激活时的 CSS 类名
320
+ */
321
+ activeClass?: string;
322
+ /**
323
+ * 精确匹配时的 CSS 类名
324
+ */
325
+ exactActiveClass?: string;
326
+ /**
327
+ * 其他 HTML 属性(如 class, style 等)
328
+ */
329
+ [key: string]: any;
330
+ }
331
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@fukict/router",
3
+ "version": "0.1.0",
4
+ "description": "Router for Fukict framework with nested routing and lazy loading",
5
+ "keywords": [
6
+ "fukict",
7
+ "router",
8
+ "routing",
9
+ "spa",
10
+ "single-page-application",
11
+ "navigation"
12
+ ],
13
+ "bugs": {
14
+ "url": "https://github.com/fukict/fukict/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/fukict/fukict.git",
19
+ "directory": "packages/router"
20
+ },
21
+ "license": "MIT",
22
+ "author": "Fukict Team",
23
+ "sideEffects": false,
24
+ "type": "module",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "browser": "./dist/index.js",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "main": "./dist/index.js",
33
+ "module": "./dist/index.js",
34
+ "types": "./dist/index.d.ts",
35
+ "files": [
36
+ "dist",
37
+ "README.md"
38
+ ],
39
+ "dependencies": {
40
+ "@fukict/basic": "0.1.0"
41
+ },
42
+ "devDependencies": {
43
+ "typescript": "^5.6.3"
44
+ },
45
+ "engines": {
46
+ "node": ">=16.0.0"
47
+ },
48
+ "scripts": {
49
+ "build": "tsx ../../scripts/build-package.ts --pkg-name router --no-watch",
50
+ "dev": "tsx ../../scripts/build-package.ts --pkg-name router --watch",
51
+ "lint": "tsc --noEmit",
52
+ "typecheck": "tsc --noEmit"
53
+ }
54
+ }