@wavelengthusaf/client-router 0.0.1 → 0.0.3

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 (168) hide show
  1. package/dist/elements/RouteElement.d.ts +11 -0
  2. package/dist/elements/RouteElement.d.ts.map +1 -0
  3. package/dist/elements/RouteElement.js +44 -0
  4. package/dist/elements/RouteElement.js.map +1 -0
  5. package/dist/elements/RouterElement.d.ts +12 -0
  6. package/dist/elements/RouterElement.d.ts.map +1 -0
  7. package/dist/elements/RouterElement.js +70 -0
  8. package/dist/elements/RouterElement.js.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +5 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/models/CompiledRoute.d.ts +7 -0
  14. package/dist/models/CompiledRoute.d.ts.map +1 -0
  15. package/dist/models/CompiledRoute.js +2 -0
  16. package/dist/models/CompiledRoute.js.map +1 -0
  17. package/dist/models/MatchedRoute.d.ts +7 -0
  18. package/dist/models/MatchedRoute.d.ts.map +1 -0
  19. package/dist/models/MatchedRoute.js +2 -0
  20. package/dist/models/MatchedRoute.js.map +1 -0
  21. package/dist/models/RouteComponent.d.ts +6 -0
  22. package/dist/models/RouteComponent.d.ts.map +1 -0
  23. package/dist/models/RouteComponent.js +2 -0
  24. package/dist/models/RouteComponent.js.map +1 -0
  25. package/dist/models/RouteContext.d.ts +7 -0
  26. package/dist/models/RouteContext.d.ts.map +1 -0
  27. package/dist/models/RouteContext.js +2 -0
  28. package/dist/models/RouteContext.js.map +1 -0
  29. package/dist/models/RouteDefinition.d.ts +6 -0
  30. package/dist/models/RouteDefinition.d.ts.map +1 -0
  31. package/dist/models/RouteDefinition.js +2 -0
  32. package/dist/models/RouteDefinition.js.map +1 -0
  33. package/dist/models/RouteGuard.d.ts +3 -0
  34. package/dist/models/RouteGuard.d.ts.map +1 -0
  35. package/dist/models/RouteGuard.js +2 -0
  36. package/dist/models/RouteGuard.js.map +1 -0
  37. package/dist/models/RouteParams.d.ts +4 -0
  38. package/dist/models/RouteParams.d.ts.map +1 -0
  39. package/dist/models/RouteParams.js +2 -0
  40. package/dist/models/RouteParams.js.map +1 -0
  41. package/dist/models/index.d.ts +9 -0
  42. package/dist/models/index.d.ts.map +1 -0
  43. package/dist/models/index.js +2 -0
  44. package/dist/models/index.js.map +1 -0
  45. package/dist/router/Router.d.ts +20 -0
  46. package/dist/router/Router.d.ts.map +1 -0
  47. package/dist/router/Router.js +158 -0
  48. package/dist/router/Router.js.map +1 -0
  49. package/dist/utils/compileRoute.d.ts +3 -0
  50. package/dist/utils/compileRoute.d.ts.map +1 -0
  51. package/dist/utils/compileRoute.js +30 -0
  52. package/dist/utils/compileRoute.js.map +1 -0
  53. package/dist/utils/index.d.ts +4 -0
  54. package/dist/utils/index.d.ts.map +1 -0
  55. package/dist/utils/index.js +4 -0
  56. package/dist/utils/index.js.map +1 -0
  57. package/dist/utils/matchRoute.d.ts +3 -0
  58. package/dist/utils/matchRoute.d.ts.map +1 -0
  59. package/dist/utils/matchRoute.js +25 -0
  60. package/dist/utils/matchRoute.js.map +1 -0
  61. package/package.json +7 -1
  62. package/.gitlab-ci.yml +0 -84
  63. package/.husky/pre-commit +0 -38
  64. package/.storybook/main.ts +0 -16
  65. package/.storybook/manager.ts +0 -7
  66. package/.storybook/preview.ts +0 -23
  67. package/.storybook/theme.ts +0 -30
  68. package/.storybook/vitest.setup.ts +0 -7
  69. package/dist/elements/__tests__/RouteElement.test.d.ts +0 -0
  70. package/dist/elements/__tests__/RouteElement.test.d.ts.map +0 -0
  71. package/dist/elements/__tests__/RouteElement.test.js +0 -77
  72. package/dist/elements/__tests__/RouteElement.test.js.map +0 -0
  73. package/dist/elements/__tests__/RouterElement.test.d.ts +0 -0
  74. package/dist/elements/__tests__/RouterElement.test.d.ts.map +0 -0
  75. package/dist/elements/__tests__/RouterElement.test.js +0 -0
  76. package/dist/elements/__tests__/RouterElement.test.js.map +0 -0
  77. package/dist/prettier.config.d.ts +0 -0
  78. package/dist/prettier.config.d.ts.map +0 -0
  79. package/dist/router/__tests__/Router.test.d.ts +0 -0
  80. package/dist/router/__tests__/Router.test.d.ts.map +0 -0
  81. package/dist/router/__tests__/Router.test.js +0 -0
  82. package/dist/router/__tests__/Router.test.js.map +0 -0
  83. package/dist/src/elements/RouteElement.d.ts +0 -0
  84. package/dist/src/elements/RouteElement.d.ts.map +0 -0
  85. package/dist/src/elements/RouterElement.d.ts +0 -0
  86. package/dist/src/elements/RouterElement.d.ts.map +0 -0
  87. package/dist/src/elements/__tests__/RouteElement.test.d.ts +0 -0
  88. package/dist/src/elements/__tests__/RouteElement.test.d.ts.map +0 -0
  89. package/dist/src/elements/__tests__/RouterElement.test.d.ts +0 -0
  90. package/dist/src/elements/__tests__/RouterElement.test.d.ts.map +0 -0
  91. package/dist/src/index.d.ts +0 -0
  92. package/dist/src/index.d.ts.map +0 -0
  93. package/dist/src/models/CompiledRoute.d.ts +0 -0
  94. package/dist/src/models/CompiledRoute.d.ts.map +0 -0
  95. package/dist/src/models/MatchedRoute.d.ts +0 -0
  96. package/dist/src/models/MatchedRoute.d.ts.map +0 -0
  97. package/dist/src/models/RouteComponent.d.ts +0 -0
  98. package/dist/src/models/RouteComponent.d.ts.map +0 -0
  99. package/dist/src/models/RouteContext.d.ts +0 -0
  100. package/dist/src/models/RouteContext.d.ts.map +0 -0
  101. package/dist/src/models/RouteDefinition.d.ts +0 -0
  102. package/dist/src/models/RouteDefinition.d.ts.map +0 -0
  103. package/dist/src/models/RouteGuard.d.ts +0 -0
  104. package/dist/src/models/RouteGuard.d.ts.map +0 -0
  105. package/dist/src/models/RouteParams.d.ts +0 -0
  106. package/dist/src/models/RouteParams.d.ts.map +0 -0
  107. package/dist/src/models/index.d.ts +0 -0
  108. package/dist/src/models/index.d.ts.map +0 -0
  109. package/dist/src/router/Router.d.ts +0 -0
  110. package/dist/src/router/Router.d.ts.map +0 -0
  111. package/dist/src/router/__tests__/Router.test.d.ts +0 -0
  112. package/dist/src/router/__tests__/Router.test.d.ts.map +0 -0
  113. package/dist/src/stories/RouterElement.stories.d.ts +0 -0
  114. package/dist/src/stories/RouterElement.stories.d.ts.map +0 -0
  115. package/dist/src/stories/RouterElement.stories.test.d.ts +0 -0
  116. package/dist/src/stories/RouterElement.stories.test.d.ts.map +0 -0
  117. package/dist/src/utils/__tests__/compileRoute.test.d.ts +0 -0
  118. package/dist/src/utils/__tests__/compileRoute.test.d.ts.map +0 -0
  119. package/dist/src/utils/__tests__/matchRoute.test.d.ts +0 -0
  120. package/dist/src/utils/__tests__/matchRoute.test.d.ts.map +0 -0
  121. package/dist/src/utils/compileRoute.d.ts +0 -0
  122. package/dist/src/utils/compileRoute.d.ts.map +0 -0
  123. package/dist/src/utils/index.d.ts +0 -0
  124. package/dist/src/utils/index.d.ts.map +0 -0
  125. package/dist/src/utils/matchRoute.d.ts +0 -0
  126. package/dist/src/utils/matchRoute.d.ts.map +0 -0
  127. package/dist/stories/RouterElement.stories.d.ts +0 -0
  128. package/dist/stories/RouterElement.stories.d.ts.map +0 -0
  129. package/dist/stories/RouterElement.stories.js +0 -0
  130. package/dist/stories/RouterElement.stories.js.map +0 -0
  131. package/dist/utils/__tests__/compileRoute.test.d.ts +0 -0
  132. package/dist/utils/__tests__/compileRoute.test.d.ts.map +0 -0
  133. package/dist/utils/__tests__/compileRoute.test.js +0 -0
  134. package/dist/utils/__tests__/compileRoute.test.js.map +0 -0
  135. package/dist/utils/__tests__/matchRoute.test.d.ts +0 -0
  136. package/dist/utils/__tests__/matchRoute.test.d.ts.map +0 -0
  137. package/dist/utils/__tests__/matchRoute.test.js +0 -0
  138. package/dist/utils/__tests__/matchRoute.test.js.map +0 -0
  139. package/eslint.config.mjs +0 -89
  140. package/index.ts +0 -15
  141. package/prettier.config.ts +0 -30
  142. package/src/elements/RouteElement.ts +0 -67
  143. package/src/elements/RouterElement.ts +0 -97
  144. package/src/elements/__tests__/RouteElement.test.ts +0 -89
  145. package/src/elements/__tests__/RouterElement.test.ts +0 -253
  146. package/src/index.ts +0 -15
  147. package/src/models/CompiledRoute.ts +0 -7
  148. package/src/models/MatchedRoute.ts +0 -7
  149. package/src/models/RouteComponent.ts +0 -6
  150. package/src/models/RouteContext.ts +0 -7
  151. package/src/models/RouteDefinition.ts +0 -6
  152. package/src/models/RouteGuard.ts +0 -6
  153. package/src/models/RouteParams.ts +0 -3
  154. package/src/models/index.ts +0 -17
  155. package/src/router/Router.ts +0 -225
  156. package/src/router/__tests__/Router.test.ts +0 -464
  157. package/src/stories/RouterElement.stories.test.ts +0 -310
  158. package/src/stories/RouterElement.stories.ts +0 -208
  159. package/src/utils/__tests__/compileRoute.test.ts +0 -97
  160. package/src/utils/__tests__/matchRoute.test.ts +0 -180
  161. package/src/utils/compileRoute.ts +0 -37
  162. package/src/utils/index.ts +0 -4
  163. package/src/utils/matchRoute.ts +0 -37
  164. package/tsconfig.build.json +0 -20
  165. package/tsconfig.json +0 -55
  166. package/vitest.config.ts +0 -34
  167. package/vitest.setup.ts +0 -3
  168. package/vitest.shims.d.ts +0 -1
@@ -0,0 +1,11 @@
1
+ import type { RouteDefinition } from '../models/index.js';
2
+ export interface RouteElementEnv {
3
+ document?: Document;
4
+ }
5
+ export declare class RouteElement extends HTMLElement {
6
+ static readonly tag = "wavelength-route";
7
+ get path(): string;
8
+ get componentTag(): string;
9
+ toDefinition(env?: RouteElementEnv): RouteDefinition | null;
10
+ }
11
+ //# sourceMappingURL=RouteElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteElement.d.ts","sourceRoot":"","sources":["../../src/elements/RouteElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,YAAa,SAAQ,WAAW;IAC3C,gBAAuB,GAAG,sBAAsB;IAEhD,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAEM,YAAY,CAAC,GAAG,GAAE,eAAoB,GAAG,eAAe,GAAG,IAAI;CAyCvE"}
@@ -0,0 +1,44 @@
1
+ export class RouteElement extends HTMLElement {
2
+ static tag = 'wavelength-route';
3
+ get path() {
4
+ return this.getAttribute('path') ?? '*';
5
+ }
6
+ get componentTag() {
7
+ return this.getAttribute('component') ?? '';
8
+ }
9
+ toDefinition(env = {}) {
10
+ const tag = this.componentTag;
11
+ const doc = env.document;
12
+ if (!tag) {
13
+ console.warn(`[route] Missing 'component' attribute on path="${this.path}"`);
14
+ return null;
15
+ }
16
+ if (!doc) {
17
+ return {
18
+ path: this.path,
19
+ routeComponent: {
20
+ mount() { },
21
+ unmount() { },
22
+ },
23
+ };
24
+ }
25
+ const routeComponent = {
26
+ mount: (container, routeContext) => {
27
+ const element = doc.createElement(tag);
28
+ element.routeContext = routeContext;
29
+ container.appendChild(element);
30
+ },
31
+ unmount: () => {
32
+ // optional: future cleanup hook
33
+ },
34
+ };
35
+ return {
36
+ path: this.path,
37
+ routeComponent,
38
+ };
39
+ }
40
+ }
41
+ if (!customElements.get(RouteElement.tag)) {
42
+ customElements.define(RouteElement.tag, RouteElement);
43
+ }
44
+ //# sourceMappingURL=RouteElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteElement.js","sourceRoot":"","sources":["../../src/elements/RouteElement.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,YAAa,SAAQ,WAAW;IACpC,MAAM,CAAU,GAAG,GAAG,kBAAkB,CAAC;IAEhD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAC1C,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAEM,YAAY,CAAC,MAAuB,EAAE;QAC3C,MAAM,GAAG,GAAW,IAAI,CAAC,YAAY,CAAC;QACtC,MAAM,GAAG,GAAyB,GAAG,CAAC,QAAQ,CAAC;QAE/C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CACR,kDAAkD,IAAI,CAAC,IAAI,GAAG,CACjE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,cAAc,EAAE;oBACd,KAAK,KAAI,CAAC;oBACV,OAAO,KAAI,CAAC;iBACb;aACF,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAmB;YACrC,KAAK,EAAE,CAAC,SAAsB,EAAE,YAA0B,EAAE,EAAE;gBAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAEpC,CAAC;gBAEF,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;gBAEpC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,gCAAgC;YAClC,CAAC;SACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc;SACf,CAAC;IACJ,CAAC;;AAGH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare class RouterElement extends HTMLElement {
2
+ #private;
3
+ static readonly tag = "wavelength-router";
4
+ static get observedAttributes(): string[];
5
+ connectedCallback(): void;
6
+ disconnectedCallback(): void;
7
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
+ navigate(path: string): void;
9
+ replace(path: string): void;
10
+ back(): void;
11
+ }
12
+ //# sourceMappingURL=RouterElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterElement.d.ts","sourceRoot":"","sources":["../../src/elements/RouterElement.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAc,SAAQ,WAAW;;IAC5C,gBAAuB,GAAG,uBAAuB;IAIjD,WAAkB,kBAAkB,IAAI,MAAM,EAAE,CAE/C;IAEM,iBAAiB,IAAI,IAAI;IAIzB,oBAAoB,IAAI,IAAI;IAI5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAK9F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,IAAI,IAAI;CA0DpB"}
@@ -0,0 +1,70 @@
1
+ import { Router } from '../router/Router.js';
2
+ export class RouterElement extends HTMLElement {
3
+ static tag = 'wavelength-router';
4
+ #router;
5
+ static get observedAttributes() {
6
+ return ['hash-mode', 'guard'];
7
+ }
8
+ connectedCallback() {
9
+ this.#bootstrap();
10
+ }
11
+ disconnectedCallback() {
12
+ this.#teardown();
13
+ }
14
+ attributeChangedCallback(name, oldValue, newValue) {
15
+ if (!this.isConnected || oldValue === newValue)
16
+ return;
17
+ this.#bootstrap();
18
+ }
19
+ navigate(path) {
20
+ this.#router?.navigate(path);
21
+ }
22
+ replace(path) {
23
+ this.#router?.replace(path);
24
+ }
25
+ back() {
26
+ this.#router?.back();
27
+ }
28
+ #bootstrap() {
29
+ this.#teardown();
30
+ const routes = this.#collectRoutes();
31
+ if (routes.length === 0) {
32
+ console.warn('[wavelength-router] No <wavelength-route> children found.');
33
+ return;
34
+ }
35
+ const guard = this.#resolveGuard();
36
+ this.#router = new Router(routes, {
37
+ outlet: this,
38
+ hashMode: this.hasAttribute('hash-mode'),
39
+ ...(guard ? { beforeEach: guard } : {}),
40
+ }, {
41
+ window: window,
42
+ document: document,
43
+ });
44
+ this.#router.start();
45
+ }
46
+ #teardown() {
47
+ this.#router?.destroy();
48
+ }
49
+ #collectRoutes() {
50
+ const routeElements = Array.from(this.querySelectorAll('wavelength-route'));
51
+ return routeElements
52
+ .map((routeElement) => routeElement.toDefinition({ document }))
53
+ .filter((routeDefinition) => routeDefinition !== null);
54
+ }
55
+ #resolveGuard() {
56
+ const guardName = this.getAttribute('guard');
57
+ if (!guardName)
58
+ return undefined;
59
+ const fn = window[guardName];
60
+ if (typeof fn !== 'function') {
61
+ console.warn(`[wavelength-router] Guard "${guardName}" not found on window.`);
62
+ return undefined;
63
+ }
64
+ return fn;
65
+ }
66
+ }
67
+ if (!customElements.get(RouterElement.tag)) {
68
+ customElements.define(RouterElement.tag, RouterElement);
69
+ }
70
+ //# sourceMappingURL=RouterElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterElement.js","sourceRoot":"","sources":["../../src/elements/RouterElement.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -0,0 +1,6 @@
1
+ export { Router } from './router/Router.js';
2
+ export { RouterElement } from './elements/RouterElement.js';
3
+ export { RouteElement } from './elements/RouteElement.js';
4
+ export type { RouteComponent, RouteContext, RouteDefinition, RouteGuard, RouteParams, CompiledRoute, MatchedRoute, } from './models/index.ts';
5
+ export { compileRoute, matchRoute } from './utils/index.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -0,0 +1,5 @@
1
+ export { Router } from './router/Router.js';
2
+ export { RouterElement } from './elements/RouterElement.js';
3
+ export { RouteElement } from './elements/RouteElement.js';
4
+ export { compileRoute, matchRoute } from './utils/index.js';
5
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAY1D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RouteDefinition } from './RouteDefinition.js';
2
+ export interface CompiledRoute {
3
+ routeDefinition: RouteDefinition;
4
+ pattern: RegExp;
5
+ paramNames: string[];
6
+ }
7
+ //# sourceMappingURL=CompiledRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompiledRoute.d.ts","sourceRoot":"","sources":["../../src/models/CompiledRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CompiledRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompiledRoute.js","sourceRoot":"","sources":["../../src/models/CompiledRoute.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { RouteDefinition } from './RouteDefinition.js';
2
+ import type { RouteParams } from './RouteParams.js';
3
+ export interface MatchedRoute {
4
+ routeDefinition: RouteDefinition;
5
+ routeParams: RouteParams;
6
+ }
7
+ //# sourceMappingURL=MatchedRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatchedRoute.d.ts","sourceRoot":"","sources":["../../src/models/MatchedRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MatchedRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatchedRoute.js","sourceRoot":"","sources":["../../src/models/MatchedRoute.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { RouteContext } from './RouteContext.js';
2
+ export interface RouteComponent {
3
+ mount(container: HTMLElement, context: RouteContext): void;
4
+ unmount?(): void;
5
+ }
6
+ //# sourceMappingURL=RouteComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteComponent.d.ts","sourceRoot":"","sources":["../../src/models/RouteComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3D,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteComponent.js","sourceRoot":"","sources":["../../src/models/RouteComponent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { RouteParams } from './RouteParams.js';
2
+ export interface RouteContext {
3
+ path: string;
4
+ routeParams: RouteParams;
5
+ query: URLSearchParams;
6
+ }
7
+ //# sourceMappingURL=RouteContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteContext.d.ts","sourceRoot":"","sources":["../../src/models/RouteContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteContext.js","sourceRoot":"","sources":["../../src/models/RouteContext.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { RouteComponent } from './RouteComponent.js';
2
+ export interface RouteDefinition {
3
+ path: string;
4
+ routeComponent: RouteComponent;
5
+ }
6
+ //# sourceMappingURL=RouteDefinition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteDefinition.d.ts","sourceRoot":"","sources":["../../src/models/RouteDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;CAChC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteDefinition.js","sourceRoot":"","sources":["../../src/models/RouteDefinition.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from './RouteContext.js';
2
+ export type RouteGuard = (to: RouteContext, next: (redirect?: string) => void) => void;
3
+ //# sourceMappingURL=RouteGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteGuard.d.ts","sourceRoot":"","sources":["../../src/models/RouteGuard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,CACvB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,KAC9B,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteGuard.js","sourceRoot":"","sources":["../../src/models/RouteGuard.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface RouteParams {
2
+ [key: string]: string;
3
+ }
4
+ //# sourceMappingURL=RouteParams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteParams.d.ts","sourceRoot":"","sources":["../../src/models/RouteParams.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteParams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteParams.js","sourceRoot":"","sources":["../../src/models/RouteParams.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { CompiledRoute } from './CompiledRoute.js';
2
+ import type { MatchedRoute } from './MatchedRoute.js';
3
+ import type { RouteComponent } from './RouteComponent.js';
4
+ import type { RouteContext } from './RouteContext.js';
5
+ import type { RouteDefinition } from './RouteDefinition.js';
6
+ import type { RouteGuard } from './RouteGuard.js';
7
+ import type { RouteParams } from './RouteParams.js';
8
+ export type { CompiledRoute, MatchedRoute, RouteComponent, RouteContext, RouteDefinition, RouteGuard, RouteParams, };
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,GACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { RouteDefinition, RouteGuard } from '../models/index.js';
2
+ export interface RouterEnv {
3
+ window?: Window;
4
+ document?: Document;
5
+ }
6
+ export interface RouterOptions {
7
+ outlet?: HTMLElement;
8
+ hashMode?: boolean;
9
+ beforeEach?: RouteGuard;
10
+ }
11
+ export declare class Router {
12
+ #private;
13
+ constructor(routeDefinitions: RouteDefinition[], routerOptions?: RouterOptions, env?: RouterEnv);
14
+ start(): void;
15
+ destroy(): void;
16
+ navigate(path: string): void;
17
+ replace(path: string): void;
18
+ back(): void;
19
+ }
20
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../src/router/Router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,eAAe,EACf,UAAU,EACX,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,qBAAa,MAAM;;gBAYf,gBAAgB,EAAE,eAAe,EAAE,EACnC,aAAa,GAAE,aAAkB,EACjC,GAAG,GAAE,SAAc;IAoBd,KAAK,IAAI,IAAI;IAab,OAAO,IAAI,IAAI;IAUf,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY5B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY3B,IAAI,IAAI,IAAI;CA0HpB"}
@@ -0,0 +1,158 @@
1
+ import { compileRoute, matchRoute } from '../utils/index.js';
2
+ export class Router {
3
+ #compiledRoutes;
4
+ #hashMode;
5
+ #outlet;
6
+ #beforeEach;
7
+ #currentComponent;
8
+ #window;
9
+ #document;
10
+ #isStarted = false;
11
+ constructor(routeDefinitions, routerOptions = {}, env = {}) {
12
+ this.#compiledRoutes = routeDefinitions.map(compileRoute);
13
+ this.#hashMode = routerOptions.hashMode ?? false;
14
+ if (routerOptions.beforeEach !== undefined) {
15
+ this.#beforeEach = routerOptions.beforeEach;
16
+ }
17
+ if (env.window !== undefined) {
18
+ this.#window = env.window;
19
+ }
20
+ if (env.document !== undefined) {
21
+ this.#document = env.document;
22
+ }
23
+ this.#outlet = routerOptions.outlet ?? this.#document?.body ?? undefined;
24
+ }
25
+ start() {
26
+ if (!this.#window?.addEventListener || !this.#document?.addEventListener) {
27
+ throw new Error('[Router] Invalid environment: missing DOM APIs');
28
+ }
29
+ if (this.#isStarted)
30
+ return;
31
+ this.#bindEvents();
32
+ this.#resolve();
33
+ this.#isStarted = true;
34
+ }
35
+ destroy() {
36
+ if (!this.#window || !this.#document)
37
+ return;
38
+ this.#window.removeEventListener('popstate', this.#handlePopState);
39
+ this.#document.removeEventListener('click', this.#handleClick);
40
+ this.#currentComponent?.unmount?.();
41
+ this.#isStarted = false;
42
+ }
43
+ navigate(path) {
44
+ if (!this.#window)
45
+ return;
46
+ if (this.#hashMode) {
47
+ this.#window.location.hash = path;
48
+ }
49
+ else {
50
+ this.#window.history.pushState(null, '', path);
51
+ }
52
+ this.#resolve();
53
+ }
54
+ replace(path) {
55
+ if (!this.#window)
56
+ return;
57
+ if (this.#hashMode) {
58
+ this.#window.location.replace('#' + path);
59
+ }
60
+ else {
61
+ this.#window.history.replaceState(null, '', path);
62
+ }
63
+ this.#resolve();
64
+ }
65
+ back() {
66
+ this.#window?.history.back();
67
+ }
68
+ #bindEvents() {
69
+ this.#window.addEventListener('popstate', this.#handlePopState);
70
+ this.#document.addEventListener('click', this.#handleClick);
71
+ }
72
+ #handlePopState = () => {
73
+ this.#resolve();
74
+ };
75
+ #handleClick = (event) => {
76
+ const target = event.target;
77
+ const anchor = target?.closest?.('a');
78
+ if (!anchor)
79
+ return;
80
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
81
+ return;
82
+ if (anchor.target === '_blank')
83
+ return;
84
+ const href = anchor.getAttribute('href');
85
+ if (!href)
86
+ return;
87
+ if (href.startsWith('http') ||
88
+ href.startsWith('//') ||
89
+ href.startsWith('mailto:') ||
90
+ href.startsWith('tel:')) {
91
+ return;
92
+ }
93
+ event.preventDefault();
94
+ this.navigate(href);
95
+ };
96
+ #currentPath() {
97
+ if (!this.#window)
98
+ return '/';
99
+ if (this.#hashMode) {
100
+ const hash = this.#window.location.hash.slice(1);
101
+ return hash || '/';
102
+ }
103
+ return this.#window.location.pathname || '/';
104
+ }
105
+ #currentQuery() {
106
+ if (!this.#window)
107
+ return new URLSearchParams();
108
+ if (this.#hashMode) {
109
+ const hash = this.#window.location.hash;
110
+ const queryIndex = hash.indexOf('?');
111
+ if (queryIndex >= 0) {
112
+ return new URLSearchParams(hash.slice(queryIndex));
113
+ }
114
+ return new URLSearchParams();
115
+ }
116
+ return new URLSearchParams(this.#window.location.search);
117
+ }
118
+ #mount(routeComponent, routeContext) {
119
+ if (!this.#outlet)
120
+ return;
121
+ this.#currentComponent?.unmount?.();
122
+ this.#outlet.replaceChildren();
123
+ routeComponent.mount(this.#outlet, routeContext);
124
+ this.#currentComponent = routeComponent;
125
+ }
126
+ #resolve() {
127
+ const pathname = this.#currentPath();
128
+ const query = this.#currentQuery();
129
+ const match = matchRoute(this.#compiledRoutes, pathname);
130
+ if (!match) {
131
+ console.warn(`[Router] No route matched: ${pathname}`);
132
+ return;
133
+ }
134
+ const context = {
135
+ path: pathname,
136
+ routeParams: match.routeParams,
137
+ query,
138
+ };
139
+ if (!this.#beforeEach) {
140
+ this.#mount(match.routeDefinition.routeComponent, context);
141
+ return;
142
+ }
143
+ let redirected = false;
144
+ const next = (redirect) => {
145
+ if (redirected)
146
+ return;
147
+ redirected = true;
148
+ if (redirect && redirect !== context.path) {
149
+ this.navigate(redirect);
150
+ }
151
+ else {
152
+ this.#mount(match.routeDefinition.routeComponent, context);
153
+ }
154
+ };
155
+ this.#beforeEach(context, next);
156
+ }
157
+ }
158
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CompiledRoute, RouteDefinition } from '../models/index.ts';
2
+ export declare function compileRoute(routeDefinition: RouteDefinition): CompiledRoute;
3
+ //# sourceMappingURL=compileRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileRoute.d.ts","sourceRoot":"","sources":["../../src/utils/compileRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMzE,wBAAgB,YAAY,CAAC,eAAe,EAAE,eAAe,GAAG,aAAa,CA8B5E"}
@@ -0,0 +1,30 @@
1
+ function escapeRegex(str) {
2
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3
+ }
4
+ export function compileRoute(routeDefinition) {
5
+ const paramNames = [];
6
+ if (routeDefinition.path === '*') {
7
+ return {
8
+ routeDefinition,
9
+ pattern: /^.*$/,
10
+ paramNames,
11
+ };
12
+ }
13
+ const pattern = routeDefinition.path
14
+ .split('/')
15
+ .map((segment) => {
16
+ const match = /^:([a-zA-Z_]\w*)$/.exec(segment);
17
+ if (match) {
18
+ paramNames.push(match[1]);
19
+ return '([^/]+)';
20
+ }
21
+ return escapeRegex(segment);
22
+ })
23
+ .join('\\/');
24
+ return {
25
+ routeDefinition,
26
+ pattern: new RegExp(`^${pattern}$`),
27
+ paramNames,
28
+ };
29
+ }
30
+ //# sourceMappingURL=compileRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileRoute.js","sourceRoot":"","sources":["../../src/utils/compileRoute.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,eAAgC;IAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,eAAe,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO;YACL,eAAe;YACf,OAAO,EAAE,MAAM;YACf,UAAU;SACX,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI;SAC/B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjB,OAAO;QACL,eAAe;QACf,OAAO,EAAE,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC;QACnC,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { compileRoute } from './compileRoute.js';
2
+ import { matchRoute } from './matchRoute.js';
3
+ export { compileRoute, matchRoute };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { compileRoute } from './compileRoute.js';
2
+ import { matchRoute } from './matchRoute.js';
3
+ export { compileRoute, matchRoute };
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CompiledRoute, MatchedRoute } from '../models/index.ts';
2
+ export declare function matchRoute(compiledRoutes: CompiledRoute[], pathname: string): MatchedRoute | null;
3
+ //# sourceMappingURL=matchRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchRoute.d.ts","sourceRoot":"","sources":["../../src/utils/matchRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAEb,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,UAAU,CACtB,cAAc,EAAE,aAAa,EAAE,EAC/B,QAAQ,EAAE,MAAM,GACjB,YAAY,GAAG,IAAI,CA2BrB"}