@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.
- package/LICENSE +21 -0
- package/dist/Link.d.ts +38 -0
- package/dist/Link.d.ts.map +1 -0
- package/dist/Link.js +138 -0
- package/dist/Link.js.map +1 -0
- package/dist/RouteComponent.d.ts +85 -0
- package/dist/RouteComponent.d.ts.map +1 -0
- package/dist/RouteComponent.js +153 -0
- package/dist/RouteComponent.js.map +1 -0
- package/dist/Router.d.ts +128 -0
- package/dist/Router.d.ts.map +1 -0
- package/dist/Router.js +417 -0
- package/dist/Router.js.map +1 -0
- package/dist/RouterProvider.d.ts +41 -0
- package/dist/RouterProvider.d.ts.map +1 -0
- package/dist/RouterProvider.js +104 -0
- package/dist/RouterProvider.js.map +1 -0
- package/dist/RouterView.d.ts +27 -0
- package/dist/RouterView.d.ts.map +1 -0
- package/dist/RouterView.js +66 -0
- package/dist/RouterView.js.map +1 -0
- package/dist/history/base.d.ts +45 -0
- package/dist/history/base.d.ts.map +1 -0
- package/dist/history/base.js +47 -0
- package/dist/history/base.js.map +1 -0
- package/dist/history/browser.d.ts +17 -0
- package/dist/history/browser.d.ts.map +1 -0
- package/dist/history/browser.js +76 -0
- package/dist/history/browser.js.map +1 -0
- package/dist/history/hash.d.ts +14 -0
- package/dist/history/hash.d.ts.map +1 -0
- package/dist/history/hash.js +51 -0
- package/dist/history/hash.js.map +1 -0
- package/dist/history/index.d.ts +12 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +16 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/types.d.ts +34 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/matcher.d.ts +59 -0
- package/dist/matcher.d.ts.map +1 -0
- package/dist/matcher.js +213 -0
- package/dist/matcher.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +14 -0
- package/dist/metadata.js.map +1 -0
- package/dist/types.d.ts +331 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { HistoryListener, IHistory } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* History 基类(抽象公共逻辑)
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class BaseHistory implements IHistory {
|
|
6
|
+
protected listeners: Set<HistoryListener>;
|
|
7
|
+
protected isListening: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 获取当前路径(由子类实现)
|
|
10
|
+
*/
|
|
11
|
+
abstract getCurrentPath(): string;
|
|
12
|
+
/**
|
|
13
|
+
* 导航到指定路径(添加历史记录)(由子类实现)
|
|
14
|
+
*/
|
|
15
|
+
abstract push(path: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* 替换当前路径(不添加历史记录)(由子类实现)
|
|
18
|
+
*/
|
|
19
|
+
abstract replace(path: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* 返回上一页
|
|
22
|
+
*/
|
|
23
|
+
back(): void;
|
|
24
|
+
/**
|
|
25
|
+
* 前进到下一页
|
|
26
|
+
*/
|
|
27
|
+
forward(): void;
|
|
28
|
+
/**
|
|
29
|
+
* 监听路径变化
|
|
30
|
+
*/
|
|
31
|
+
listen(listener: HistoryListener): () => void;
|
|
32
|
+
/**
|
|
33
|
+
* 启动事件监听(由子类实现)
|
|
34
|
+
*/
|
|
35
|
+
protected abstract startListening(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 停止事件监听(由子类实现)
|
|
38
|
+
*/
|
|
39
|
+
protected abstract stopListening(): void;
|
|
40
|
+
/**
|
|
41
|
+
* 通知所有监听器
|
|
42
|
+
*/
|
|
43
|
+
protected notifyListeners(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzD;;GAEG;AACH,8BAAsB,WAAY,YAAW,QAAQ;IACnD,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,eAAe,CAAC,CAAa;IACtD,SAAS,CAAC,WAAW,EAAE,OAAO,CAAS;IAEvC;;OAEG;IACH,QAAQ,CAAC,cAAc,IAAI,MAAM;IAEjC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEpC;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAmB7C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI;IAEzC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI;IAExC;;OAEG;IACH,SAAS,CAAC,eAAe,IAAI,IAAI;CAOlC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History 基类(抽象公共逻辑)
|
|
3
|
+
*/
|
|
4
|
+
export class BaseHistory {
|
|
5
|
+
listeners = new Set();
|
|
6
|
+
isListening = false;
|
|
7
|
+
/**
|
|
8
|
+
* 返回上一页
|
|
9
|
+
*/
|
|
10
|
+
back() {
|
|
11
|
+
window.history.back();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 前进到下一页
|
|
15
|
+
*/
|
|
16
|
+
forward() {
|
|
17
|
+
window.history.forward();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 监听路径变化
|
|
21
|
+
*/
|
|
22
|
+
listen(listener) {
|
|
23
|
+
this.listeners.add(listener);
|
|
24
|
+
// 首次监听时启动事件监听
|
|
25
|
+
if (!this.isListening) {
|
|
26
|
+
this.startListening();
|
|
27
|
+
}
|
|
28
|
+
// 返回取消监听函数
|
|
29
|
+
return () => {
|
|
30
|
+
this.listeners.delete(listener);
|
|
31
|
+
// 如果没有监听器了,停止事件监听
|
|
32
|
+
if (this.listeners.size === 0) {
|
|
33
|
+
this.stopListening();
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 通知所有监听器
|
|
39
|
+
*/
|
|
40
|
+
notifyListeners() {
|
|
41
|
+
const path = this.getCurrentPath();
|
|
42
|
+
for (const listener of this.listeners) {
|
|
43
|
+
listener(path);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAgB,WAAW;IACrB,SAAS,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC5C,WAAW,GAAY,KAAK,CAAC;IAiBvC;;OAEG;IACH,IAAI;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAyB;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,WAAW;QACX,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEhC,kBAAkB;YAClB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAYD;;OAEG;IACO,eAAe;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseHistory } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* History 模式的 History 管理器
|
|
4
|
+
*/
|
|
5
|
+
export declare class BrowserHistory extends BaseHistory {
|
|
6
|
+
private base;
|
|
7
|
+
constructor(base?: string);
|
|
8
|
+
private normalizeBase;
|
|
9
|
+
getCurrentPath(): string;
|
|
10
|
+
push(path: string): void;
|
|
11
|
+
replace(path: string): void;
|
|
12
|
+
protected startListening(): void;
|
|
13
|
+
protected stopListening(): void;
|
|
14
|
+
private handlePopState;
|
|
15
|
+
private getFullPath;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/history/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC;;GAEG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAY;IAK9B,OAAO,CAAC,aAAa;IAarB,cAAc,IAAI,MAAM;IA0BxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3B,SAAS,CAAC,cAAc,IAAI,IAAI;IAKhC,SAAS,CAAC,aAAa,IAAI,IAAI;IAK/B,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,WAAW;CAapB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { BaseHistory } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* History 模式的 History 管理器
|
|
4
|
+
*/
|
|
5
|
+
export class BrowserHistory extends BaseHistory {
|
|
6
|
+
base;
|
|
7
|
+
constructor(base = '/') {
|
|
8
|
+
super();
|
|
9
|
+
this.base = this.normalizeBase(base);
|
|
10
|
+
}
|
|
11
|
+
normalizeBase(base) {
|
|
12
|
+
// 确保 base 以 / 开头但不以 / 结尾(除非是根路径)
|
|
13
|
+
if (!base.startsWith('/')) {
|
|
14
|
+
base = '/' + base;
|
|
15
|
+
}
|
|
16
|
+
if (base.length > 1 && base.endsWith('/')) {
|
|
17
|
+
base = base.slice(0, -1);
|
|
18
|
+
}
|
|
19
|
+
return base;
|
|
20
|
+
}
|
|
21
|
+
getCurrentPath() {
|
|
22
|
+
// 获取完整路径(pathname + search + hash)
|
|
23
|
+
let path = window.location.pathname;
|
|
24
|
+
// 移除 base 前缀
|
|
25
|
+
if (this.base !== '/' && path.startsWith(this.base)) {
|
|
26
|
+
path = path.slice(this.base.length);
|
|
27
|
+
}
|
|
28
|
+
// 确保以 / 开头
|
|
29
|
+
if (!path.startsWith('/')) {
|
|
30
|
+
path = '/' + path;
|
|
31
|
+
}
|
|
32
|
+
// 添加 search 和 hash
|
|
33
|
+
if (window.location.search) {
|
|
34
|
+
path += window.location.search;
|
|
35
|
+
}
|
|
36
|
+
if (window.location.hash) {
|
|
37
|
+
path += window.location.hash;
|
|
38
|
+
}
|
|
39
|
+
return path;
|
|
40
|
+
}
|
|
41
|
+
push(path) {
|
|
42
|
+
const fullPath = this.getFullPath(path);
|
|
43
|
+
window.history.pushState(null, '', fullPath);
|
|
44
|
+
// 手动触发监听器
|
|
45
|
+
this.notifyListeners();
|
|
46
|
+
}
|
|
47
|
+
replace(path) {
|
|
48
|
+
const fullPath = this.getFullPath(path);
|
|
49
|
+
window.history.replaceState(null, '', fullPath);
|
|
50
|
+
// 手动触发监听器
|
|
51
|
+
this.notifyListeners();
|
|
52
|
+
}
|
|
53
|
+
startListening() {
|
|
54
|
+
window.addEventListener('popstate', this.handlePopState);
|
|
55
|
+
this.isListening = true;
|
|
56
|
+
}
|
|
57
|
+
stopListening() {
|
|
58
|
+
window.removeEventListener('popstate', this.handlePopState);
|
|
59
|
+
this.isListening = false;
|
|
60
|
+
}
|
|
61
|
+
handlePopState = () => {
|
|
62
|
+
this.notifyListeners();
|
|
63
|
+
};
|
|
64
|
+
getFullPath(path) {
|
|
65
|
+
// 确保路径以 / 开头
|
|
66
|
+
if (!path.startsWith('/')) {
|
|
67
|
+
path = '/' + path;
|
|
68
|
+
}
|
|
69
|
+
// 添加 base 前缀
|
|
70
|
+
if (this.base !== '/') {
|
|
71
|
+
path = this.base + path;
|
|
72
|
+
}
|
|
73
|
+
return path;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/history/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseHistory } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Hash 模式的 History 管理器
|
|
4
|
+
*/
|
|
5
|
+
export declare class HashHistory extends BaseHistory {
|
|
6
|
+
constructor();
|
|
7
|
+
getCurrentPath(): string;
|
|
8
|
+
push(path: string): void;
|
|
9
|
+
replace(path: string): void;
|
|
10
|
+
protected startListening(): void;
|
|
11
|
+
protected stopListening(): void;
|
|
12
|
+
private handleHashChange;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/history/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;;IAS1C,cAAc,IAAI,MAAM;IAMxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAcxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAa3B,SAAS,CAAC,cAAc,IAAI,IAAI;IAKhC,SAAS,CAAC,aAAa,IAAI,IAAI;IAK/B,OAAO,CAAC,gBAAgB,CAEtB;CACH"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BaseHistory } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Hash 模式的 History 管理器
|
|
4
|
+
*/
|
|
5
|
+
export class HashHistory extends BaseHistory {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
// 确保初始有 hash
|
|
9
|
+
if (!window.location.hash) {
|
|
10
|
+
window.location.hash = '#/';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
getCurrentPath() {
|
|
14
|
+
// 获取 hash 部分(去掉 #)
|
|
15
|
+
const hash = window.location.hash.slice(1);
|
|
16
|
+
return hash || '/';
|
|
17
|
+
}
|
|
18
|
+
push(path) {
|
|
19
|
+
if (!path.startsWith('/')) {
|
|
20
|
+
path = '/' + path;
|
|
21
|
+
}
|
|
22
|
+
window.location.hash = path;
|
|
23
|
+
// 手动触发监听器(因为 Link 调用了 e.preventDefault())
|
|
24
|
+
// window.location.hash 的赋值会触发 hashchange 事件
|
|
25
|
+
// 但为了确保在所有情况下都能正常工作,这里也手动通知
|
|
26
|
+
// hashchange 事件会再次触发,但 notifyListeners 是幂等的,不会有问题
|
|
27
|
+
this.notifyListeners();
|
|
28
|
+
}
|
|
29
|
+
replace(path) {
|
|
30
|
+
if (!path.startsWith('/')) {
|
|
31
|
+
path = '/' + path;
|
|
32
|
+
}
|
|
33
|
+
const url = new URL(window.location.href);
|
|
34
|
+
url.hash = path;
|
|
35
|
+
window.history.replaceState(null, '', url.toString());
|
|
36
|
+
// 手动触发监听器
|
|
37
|
+
this.notifyListeners();
|
|
38
|
+
}
|
|
39
|
+
startListening() {
|
|
40
|
+
window.addEventListener('hashchange', this.handleHashChange);
|
|
41
|
+
this.isListening = true;
|
|
42
|
+
}
|
|
43
|
+
stopListening() {
|
|
44
|
+
window.removeEventListener('hashchange', this.handleHashChange);
|
|
45
|
+
this.isListening = false;
|
|
46
|
+
}
|
|
47
|
+
handleHashChange = () => {
|
|
48
|
+
this.notifyListeners();
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/history/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C;QACE,KAAK,EAAE,CAAC;QACR,aAAa;QACb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,cAAc;QACZ,mBAAmB;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QAE5B,0CAA0C;QAC1C,4CAA4C;QAC5C,4BAA4B;QAC5B,kDAAkD;QAClD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEtD,UAAU;QACV,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAES,cAAc;QACtB,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAES,aAAa;QACrB,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEO,gBAAgB,GAAG,GAAS,EAAE;QACpC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;CACH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RouterMode } from '../types';
|
|
2
|
+
import { BaseHistory } from './base';
|
|
3
|
+
import { BrowserHistory } from './browser';
|
|
4
|
+
import { HashHistory } from './hash';
|
|
5
|
+
import type { HistoryListener, IHistory } from './types';
|
|
6
|
+
export { BaseHistory, HashHistory, BrowserHistory };
|
|
7
|
+
export type { HistoryListener, IHistory };
|
|
8
|
+
/**
|
|
9
|
+
* 创建 History 管理器
|
|
10
|
+
*/
|
|
11
|
+
export declare function createHistory(mode?: RouterMode, base?: string): IHistory;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAEpD,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;AAE1C;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,GAAE,UAAmB,EACzB,IAAI,CAAC,EAAE,MAAM,GACZ,QAAQ,CAMV"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseHistory } from './base';
|
|
2
|
+
import { BrowserHistory } from './browser';
|
|
3
|
+
import { HashHistory } from './hash';
|
|
4
|
+
export { BaseHistory, HashHistory, BrowserHistory };
|
|
5
|
+
/**
|
|
6
|
+
* 创建 History 管理器
|
|
7
|
+
*/
|
|
8
|
+
export function createHistory(mode = 'hash', base) {
|
|
9
|
+
if (mode === 'history') {
|
|
10
|
+
return new BrowserHistory(base);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return new HashHistory();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAIpD;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAmB,MAAM,EACzB,IAAa;IAEb,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History 监听器类型
|
|
3
|
+
*/
|
|
4
|
+
export type HistoryListener = (path: string) => void;
|
|
5
|
+
/**
|
|
6
|
+
* History 管理器接口
|
|
7
|
+
*/
|
|
8
|
+
export interface IHistory {
|
|
9
|
+
/**
|
|
10
|
+
* 获取当前路径
|
|
11
|
+
*/
|
|
12
|
+
getCurrentPath(): string;
|
|
13
|
+
/**
|
|
14
|
+
* 导航到指定路径(添加历史记录)
|
|
15
|
+
*/
|
|
16
|
+
push(path: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* 替换当前路径(不添加历史记录)
|
|
19
|
+
*/
|
|
20
|
+
replace(path: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* 返回上一页
|
|
23
|
+
*/
|
|
24
|
+
back(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 前进到下一页
|
|
27
|
+
*/
|
|
28
|
+
forward(): void;
|
|
29
|
+
/**
|
|
30
|
+
* 监听路径变化
|
|
31
|
+
*/
|
|
32
|
+
listen(listener: HistoryListener): () => void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/history/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC;IAEzB;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/history/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/router
|
|
3
|
+
*
|
|
4
|
+
* Router for Fukict framework with nested routing and lazy loading
|
|
5
|
+
*/
|
|
6
|
+
export type { RouteConfig, Route, RouteMatch, RouteMeta, Location, NavigationGuard, RouterMode, RouterOptions, RouteComponentClass, RouteProps, RouterProviderProps, RouterViewProps, LinkProps, } from './types';
|
|
7
|
+
export { Router } from './Router';
|
|
8
|
+
export { RouteComponent } from './RouteComponent';
|
|
9
|
+
export { RouterProvider } from './RouterProvider';
|
|
10
|
+
export { RouterView } from './RouterView';
|
|
11
|
+
export { Link } from './Link';
|
|
12
|
+
export { RouteMatcher } from './matcher';
|
|
13
|
+
export { createHistory, HashHistory, BrowserHistory } from './history';
|
|
14
|
+
export type { IHistory, HistoryListener } from './history';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,SAAS,EACT,QAAQ,EACR,eAAe,EACf,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/router
|
|
3
|
+
*
|
|
4
|
+
* Router for Fukict framework with nested routing and lazy loading
|
|
5
|
+
*/
|
|
6
|
+
// 导出核心类
|
|
7
|
+
export { Router } from './Router';
|
|
8
|
+
export { RouteComponent } from './RouteComponent';
|
|
9
|
+
// 导出组件
|
|
10
|
+
export { RouterProvider } from './RouterProvider';
|
|
11
|
+
export { RouterView } from './RouterView';
|
|
12
|
+
export { Link } from './Link';
|
|
13
|
+
// 导出工具类(可选)
|
|
14
|
+
export { RouteMatcher } from './matcher';
|
|
15
|
+
export { createHistory, HashHistory, BrowserHistory } from './history';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO;AACP,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { RouteConfig, RouteMatch } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 路由匹配器
|
|
4
|
+
*/
|
|
5
|
+
export declare class RouteMatcher {
|
|
6
|
+
/**
|
|
7
|
+
* 编译后的路由列表
|
|
8
|
+
*/
|
|
9
|
+
private compiledRoutes;
|
|
10
|
+
/**
|
|
11
|
+
* 原始路由配置(保留用于构建匹配链)
|
|
12
|
+
*/
|
|
13
|
+
private routes;
|
|
14
|
+
/**
|
|
15
|
+
* 构造函数
|
|
16
|
+
* @param routes 路由配置列表
|
|
17
|
+
* @param parentPath 父路径(用于嵌套路由)
|
|
18
|
+
*/
|
|
19
|
+
constructor(routes: RouteConfig[], parentPath?: string);
|
|
20
|
+
/**
|
|
21
|
+
* 编译路由配置
|
|
22
|
+
*/
|
|
23
|
+
private compile;
|
|
24
|
+
/**
|
|
25
|
+
* 编译单个路由配置
|
|
26
|
+
*/
|
|
27
|
+
private compileRoute;
|
|
28
|
+
/**
|
|
29
|
+
* 构建路由匹配的正则表达式
|
|
30
|
+
*/
|
|
31
|
+
private buildRegex;
|
|
32
|
+
/**
|
|
33
|
+
* 转义正则表达式特殊字符
|
|
34
|
+
*/
|
|
35
|
+
private escapeRegex;
|
|
36
|
+
/**
|
|
37
|
+
* 规范化路径
|
|
38
|
+
*/
|
|
39
|
+
private normalizePath;
|
|
40
|
+
/**
|
|
41
|
+
* 匹配路径
|
|
42
|
+
* @param path 要匹配的路径
|
|
43
|
+
* @returns 匹配结果列表(从顶层到当前层级)
|
|
44
|
+
*/
|
|
45
|
+
match(path: string): RouteMatch[] | null;
|
|
46
|
+
/**
|
|
47
|
+
* 构建匹配链(从顶层到当前层级)
|
|
48
|
+
*/
|
|
49
|
+
private buildMatchChain;
|
|
50
|
+
/**
|
|
51
|
+
* 根据路由名称查找路由配置
|
|
52
|
+
*/
|
|
53
|
+
findByName(name: string): RouteConfig | null;
|
|
54
|
+
/**
|
|
55
|
+
* 生成路径(根据路由配置和参数)
|
|
56
|
+
*/
|
|
57
|
+
buildPath(config: RouteConfig, params?: Record<string, string>): string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAoDvD;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,OAAO,CAAC,cAAc,CAAuB;IAE7C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAgB;IAE9B;;;;OAIG;gBACS,MAAM,EAAE,WAAW,EAAE,EAAE,UAAU,GAAE,MAAW;IAK1D;;OAEG;IACH,OAAO,CAAC,OAAO;IAef;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAgClB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,IAAI;IA0BxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAoDvB;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAS5C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM;CAU5E"}
|