@tooee/router 0.1.8

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 (66) hide show
  1. package/dist/action-types.d.ts +11 -0
  2. package/dist/action-types.d.ts.map +1 -0
  3. package/dist/action-types.js +2 -0
  4. package/dist/action-types.js.map +1 -0
  5. package/dist/command-scope.d.ts +2 -0
  6. package/dist/command-scope.d.ts.map +1 -0
  7. package/dist/command-scope.js +14 -0
  8. package/dist/command-scope.js.map +1 -0
  9. package/dist/context.d.ts +14 -0
  10. package/dist/context.d.ts.map +1 -0
  11. package/dist/context.js +29 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/create-route.d.ts +3 -0
  14. package/dist/create-route.d.ts.map +1 -0
  15. package/dist/create-route.js +4 -0
  16. package/dist/create-route.js.map +1 -0
  17. package/dist/create-router.d.ts +3 -0
  18. package/dist/create-router.d.ts.map +1 -0
  19. package/dist/create-router.js +79 -0
  20. package/dist/create-router.js.map +1 -0
  21. package/dist/focus.d.ts +10 -0
  22. package/dist/focus.d.ts.map +1 -0
  23. package/dist/focus.js +21 -0
  24. package/dist/focus.js.map +1 -0
  25. package/dist/hooks.d.ts +19 -0
  26. package/dist/hooks.d.ts.map +1 -0
  27. package/dist/hooks.js +59 -0
  28. package/dist/hooks.js.map +1 -0
  29. package/dist/index.d.ts +13 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +10 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/loader.d.ts +7 -0
  34. package/dist/loader.d.ts.map +1 -0
  35. package/dist/loader.js +11 -0
  36. package/dist/loader.js.map +1 -0
  37. package/dist/outlet.d.ts +7 -0
  38. package/dist/outlet.d.ts.map +1 -0
  39. package/dist/outlet.js +78 -0
  40. package/dist/outlet.js.map +1 -0
  41. package/dist/stack.d.ts +3 -0
  42. package/dist/stack.d.ts.map +1 -0
  43. package/dist/stack.js +27 -0
  44. package/dist/stack.js.map +1 -0
  45. package/dist/state-cache.d.ts +8 -0
  46. package/dist/state-cache.d.ts.map +1 -0
  47. package/dist/state-cache.js +16 -0
  48. package/dist/state-cache.js.map +1 -0
  49. package/dist/types.d.ts +57 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +52 -0
  54. package/src/action-types.ts +12 -0
  55. package/src/command-scope.tsx +15 -0
  56. package/src/context.tsx +60 -0
  57. package/src/create-route.ts +7 -0
  58. package/src/create-router.ts +91 -0
  59. package/src/focus.tsx +23 -0
  60. package/src/hooks.ts +85 -0
  61. package/src/index.ts +33 -0
  62. package/src/loader.tsx +20 -0
  63. package/src/outlet.tsx +118 -0
  64. package/src/stack.ts +27 -0
  65. package/src/state-cache.ts +19 -0
  66. package/src/types.ts +46 -0
@@ -0,0 +1,11 @@
1
+ export interface NavigateResult {
2
+ type: "navigate";
3
+ route: string;
4
+ params?: Record<string, unknown>;
5
+ mode?: "push" | "replace";
6
+ }
7
+ export interface BackResult {
8
+ type: "back";
9
+ }
10
+ export type ActionNavigationResult = NavigateResult | BackResult;
11
+ //# sourceMappingURL=action-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-types.d.ts","sourceRoot":"","sources":["../src/action-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=action-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-types.js","sourceRoot":"","sources":["../src/action-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function useRouterCommands(): void;
2
+ //# sourceMappingURL=command-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-scope.d.ts","sourceRoot":"","sources":["../src/command-scope.tsx"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,SAWhC"}
@@ -0,0 +1,14 @@
1
+ import { useCommand } from "@tooee/commands";
2
+ import { useRouter } from "./hooks.js";
3
+ export function useRouterCommands() {
4
+ const router = useRouter();
5
+ useCommand({
6
+ id: "router.back",
7
+ title: "Go back",
8
+ hotkey: "backspace",
9
+ modes: ["cursor"],
10
+ when: () => router.canGoBack(),
11
+ handler: () => router.pop(),
12
+ });
13
+ }
14
+ //# sourceMappingURL=command-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-scope.js","sourceRoot":"","sources":["../src/command-scope.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,UAAU,CAAC;QACT,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;QAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;KAC5B,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ import type { RouterInstance, StackEntry } from "./types.js";
3
+ export declare const StackEntryIndexContext: import("react").Context<number>;
4
+ export interface RouterProviderProps {
5
+ router: RouterInstance;
6
+ initialRoute?: string;
7
+ initialParams?: Record<string, unknown>;
8
+ children: ReactNode;
9
+ }
10
+ export declare function RouterProvider({ router, initialRoute, initialParams, children, }: RouterProviderProps): ReactNode;
11
+ export declare function useRouterInstance(): RouterInstance;
12
+ export declare function useRouterStack(): readonly StackEntry[];
13
+ export declare function useStackEntryIndex(): number;
14
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAM5D,eAAO,MAAM,sBAAsB,iCAA2B,CAAA;AAI9D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,aAAa,EACb,QAAQ,GACT,EAAE,mBAAmB,aAmBrB;AAID,wBAAgB,iBAAiB,IAAI,cAAc,CAIlD;AAED,wBAAgB,cAAc,IAAI,SAAS,UAAU,EAAE,CAEtD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useSyncExternalStore } from "react";
3
+ // Contexts
4
+ const RouterInstanceContext = createContext(null);
5
+ const RouterStackContext = createContext([]);
6
+ export const StackEntryIndexContext = createContext(0);
7
+ export function RouterProvider({ router, initialRoute, initialParams, children, }) {
8
+ useEffect(() => {
9
+ if (initialRoute && router.currentRoute.routeId !== initialRoute) {
10
+ router.reset(initialRoute, initialParams);
11
+ }
12
+ }, []); // only on mount
13
+ const stack = useSyncExternalStore(router.subscribe, () => router.stack);
14
+ return (_jsx(RouterInstanceContext, { value: router, children: _jsx(RouterStackContext, { value: stack, children: children }) }));
15
+ }
16
+ // Internal hooks
17
+ export function useRouterInstance() {
18
+ const ctx = useContext(RouterInstanceContext);
19
+ if (!ctx)
20
+ throw new Error("useRouterInstance must be used within RouterProvider");
21
+ return ctx;
22
+ }
23
+ export function useRouterStack() {
24
+ return useContext(RouterStackContext);
25
+ }
26
+ export function useStackEntryIndex() {
27
+ return useContext(StackEntryIndexContext);
28
+ }
29
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAIlF,WAAW;AAEX,MAAM,qBAAqB,GAAG,aAAa,CAAwB,IAAI,CAAC,CAAA;AACxE,MAAM,kBAAkB,GAAG,aAAa,CAAwB,EAAE,CAAC,CAAA;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAS,CAAC,CAAC,CAAA;AAW9D,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,aAAa,EACb,QAAQ,GACY;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,gBAAgB;IAEvB,MAAM,KAAK,GAAG,oBAAoB,CAChC,MAAM,CAAC,SAAS,EAChB,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CACnB,CAAA;IAED,OAAO,CACL,KAAC,qBAAqB,IAAC,KAAK,EAAE,MAAM,YAClC,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,YAC7B,QAAQ,GACU,GACC,CACzB,CAAA;AACH,CAAC;AAED,iBAAiB;AAEjB,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAA;IAC7C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACjF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,CAAC,sBAAsB,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RouteDefinition } from "./types.js";
2
+ export declare function createRoute<TParams = Record<string, unknown>>(options: RouteDefinition<TParams>): RouteDefinition<TParams>;
3
+ //# sourceMappingURL=create-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-route.d.ts","sourceRoot":"","sources":["../src/create-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,wBAAgB,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,GAChC,eAAe,CAAC,OAAO,CAAC,CAE1B"}
@@ -0,0 +1,4 @@
1
+ export function createRoute(options) {
2
+ return options;
3
+ }
4
+ //# sourceMappingURL=create-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-route.js","sourceRoot":"","sources":["../src/create-route.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CACzB,OAAiC;IAEjC,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RouterOptions, RouterInstance } from "./types.js";
2
+ export declare function createRouter(options: RouterOptions): RouterInstance;
3
+ //# sourceMappingURL=create-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-router.d.ts","sourceRoot":"","sources":["../src/create-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAIf,MAAM,YAAY,CAAA;AAInB,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAgFnE"}
@@ -0,0 +1,79 @@
1
+ import { stackReducer } from "./stack.js";
2
+ import { StateCache } from "./state-cache.js";
3
+ export function createRouter(options) {
4
+ const routeMap = new Map();
5
+ for (const route of options.routes) {
6
+ routeMap.set(route.id, route);
7
+ }
8
+ if (!routeMap.has(options.defaultRoute)) {
9
+ throw new Error(`Default route "${options.defaultRoute}" not found in routes`);
10
+ }
11
+ let state = {
12
+ stack: [
13
+ {
14
+ routeId: options.defaultRoute,
15
+ params: options.initialParams ?? {},
16
+ },
17
+ ],
18
+ };
19
+ const listeners = new Set();
20
+ const stateCache = new StateCache();
21
+ function dispatch(action) {
22
+ if (action.type !== "pop" && !routeMap.has(action.routeId)) {
23
+ throw new Error(`Route "${action.routeId}" not found`);
24
+ }
25
+ const prev = state;
26
+ const next = stackReducer(state, action);
27
+ if (next !== state) {
28
+ if (action.type === "pop" && prev.stack.length > 1) {
29
+ const poppedIndex = prev.stack.length - 1;
30
+ const poppedEntry = prev.stack[poppedIndex];
31
+ stateCache.clear(`${poppedIndex}:${poppedEntry.routeId}`);
32
+ }
33
+ else if (action.type === "reset") {
34
+ stateCache.clearAll();
35
+ }
36
+ state = next;
37
+ for (const listener of listeners) {
38
+ listener();
39
+ }
40
+ }
41
+ }
42
+ const instance = {
43
+ push(routeId, params) {
44
+ dispatch({ type: "push", routeId, params });
45
+ },
46
+ pop() {
47
+ dispatch({ type: "pop" });
48
+ },
49
+ replace(routeId, params) {
50
+ dispatch({ type: "replace", routeId, params });
51
+ },
52
+ reset(routeId, params) {
53
+ dispatch({ type: "reset", routeId, params });
54
+ },
55
+ canGoBack() {
56
+ return state.stack.length > 1;
57
+ },
58
+ get currentRoute() {
59
+ return state.stack[state.stack.length - 1];
60
+ },
61
+ get stack() {
62
+ return state.stack;
63
+ },
64
+ get stateCache() {
65
+ return stateCache;
66
+ },
67
+ subscribe(listener) {
68
+ listeners.add(listener);
69
+ return () => {
70
+ listeners.delete(listener);
71
+ };
72
+ },
73
+ getRouteDefinition(routeId) {
74
+ return routeMap.get(routeId);
75
+ },
76
+ };
77
+ return instance;
78
+ }
79
+ //# sourceMappingURL=create-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-router.js","sourceRoot":"","sources":["../src/create-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function ScreenFocusProvider({ active, children }: {
3
+ active: boolean;
4
+ children: ReactNode;
5
+ }): ReactNode;
6
+ export declare function useScreenFocus(): {
7
+ isFocused: boolean;
8
+ };
9
+ export declare function useScreenEffect(effect: () => void | (() => void)): void;
10
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../src/focus.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,aAGjG;AAED,wBAAgB,cAAc;;EAE7B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,QAQhE"}
package/dist/focus.js ADDED
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useRef } from "react";
3
+ const ScreenFocusContext = createContext({ isFocused: false });
4
+ export function ScreenFocusProvider({ active, children }) {
5
+ const value = useMemo(() => ({ isFocused: active }), [active]);
6
+ return _jsx(ScreenFocusContext, { value: value, children: children });
7
+ }
8
+ export function useScreenFocus() {
9
+ return useContext(ScreenFocusContext);
10
+ }
11
+ export function useScreenEffect(effect) {
12
+ const { isFocused } = useScreenFocus();
13
+ const effectRef = useRef(effect);
14
+ effectRef.current = effect;
15
+ useEffect(() => {
16
+ if (!isFocused)
17
+ return;
18
+ return effectRef.current();
19
+ }, [isFocused]);
20
+ }
21
+ //# sourceMappingURL=focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.js","sourceRoot":"","sources":["../src/focus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAG7E,MAAM,kBAAkB,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;AAE9D,MAAM,UAAU,mBAAmB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAA4C;IAChG,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9D,OAAO,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAsB,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiC;IAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAA;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,OAAO,SAAS,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { RouterInstance, StackEntry } from "./types.js";
2
+ import type { ActionNavigationResult } from "./action-types.js";
3
+ export declare function useNavigate(): {
4
+ push: (routeId: string, params?: Record<string, unknown>) => void;
5
+ pop: () => void;
6
+ replace: (routeId: string, params?: Record<string, unknown>) => void;
7
+ reset: (routeId: string, params?: Record<string, unknown>) => void;
8
+ };
9
+ export declare function useParams<T = Record<string, unknown>>(): T;
10
+ export declare function useRouteData<T = unknown>(): T | undefined;
11
+ export declare function useCurrentRoute(): StackEntry;
12
+ export declare function useCanGoBack(): boolean;
13
+ export declare function useRouter(): RouterInstance;
14
+ export declare function useActionResultHandler(): (result: ActionNavigationResult) => void;
15
+ export declare function useScreenState<T>(): {
16
+ savedState: T | undefined;
17
+ saveState: (state: T) => void;
18
+ };
19
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAI/D,wBAAgB,WAAW;oBAIX,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;uBAKxC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBAIxC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAIvD;AAED,wBAAgB,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAI1D;AAED,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,SAAS,CAEzD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAG5C;AAED,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED,wBAAgB,SAAS,IAAI,cAAc,CAE1C;AAED,wBAAgB,sBAAsB,aAGzB,sBAAsB,UAalC;AAED,wBAAgB,cAAc,CAAC,CAAC,KAAK;IACnC,UAAU,EAAE,CAAC,GAAG,SAAS,CAAA;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;CAC9B,CAcA"}
package/dist/hooks.js ADDED
@@ -0,0 +1,59 @@
1
+ import { useCallback } from "react";
2
+ import { useRouterInstance, useRouterStack, useStackEntryIndex } from "./context.js";
3
+ import { useRouteDataContext } from "./loader.js";
4
+ export function useNavigate() {
5
+ const router = useRouterInstance();
6
+ return {
7
+ push: useCallback((routeId, params) => router.push(routeId, params), [router]),
8
+ pop: useCallback(() => router.pop(), [router]),
9
+ replace: useCallback((routeId, params) => router.replace(routeId, params), [router]),
10
+ reset: useCallback((routeId, params) => router.reset(routeId, params), [router]),
11
+ };
12
+ }
13
+ export function useParams() {
14
+ const stack = useRouterStack();
15
+ const entry = stack[stack.length - 1];
16
+ return (entry?.params ?? {});
17
+ }
18
+ export function useRouteData() {
19
+ return useRouteDataContext();
20
+ }
21
+ export function useCurrentRoute() {
22
+ const stack = useRouterStack();
23
+ return stack[stack.length - 1];
24
+ }
25
+ export function useCanGoBack() {
26
+ const stack = useRouterStack();
27
+ return stack.length > 1;
28
+ }
29
+ export function useRouter() {
30
+ return useRouterInstance();
31
+ }
32
+ export function useActionResultHandler() {
33
+ const router = useRouterInstance();
34
+ return useCallback((result) => {
35
+ if (result.type === "navigate") {
36
+ if (result.mode === "replace") {
37
+ router.replace(result.route, result.params);
38
+ }
39
+ else {
40
+ router.push(result.route, result.params);
41
+ }
42
+ }
43
+ else if (result.type === "back") {
44
+ router.pop();
45
+ }
46
+ }, [router]);
47
+ }
48
+ export function useScreenState() {
49
+ const router = useRouterInstance();
50
+ const stackIndex = useStackEntryIndex();
51
+ const stack = useRouterStack();
52
+ const entry = stack[stackIndex];
53
+ const key = `${stackIndex}:${entry.routeId}`;
54
+ return {
55
+ savedState: router.stateCache.restore(key),
56
+ saveState: useCallback((state) => router.stateCache.save(key, state), [router.stateCache, key]),
57
+ };
58
+ }
59
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type { RouteDefinition, StackEntry, RouterState, RouterAction, RouterOptions, RouterInstance, } from "./types.js";
2
+ export { createRoute } from "./create-route.js";
3
+ export { createRouter } from "./create-router.js";
4
+ export { stackReducer } from "./stack.js";
5
+ export { RouterProvider } from "./context.js";
6
+ export type { RouterProviderProps } from "./context.js";
7
+ export { Outlet, getRouteChain } from "./outlet.js";
8
+ export { useNavigate, useParams, useRouteData, useCurrentRoute, useCanGoBack, useRouter, useScreenState, useActionResultHandler, } from "./hooks.js";
9
+ export type { NavigateResult, BackResult, ActionNavigationResult, } from "./action-types.js";
10
+ export { ScreenFocusProvider, useScreenFocus, useScreenEffect } from "./focus.js";
11
+ export { StateCache } from "./state-cache.js";
12
+ export { useRouterCommands } from "./command-scope.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,cAAc,EACd,UAAU,EACV,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { createRoute } from "./create-route.js";
2
+ export { createRouter } from "./create-router.js";
3
+ export { stackReducer } from "./stack.js";
4
+ export { RouterProvider } from "./context.js";
5
+ export { Outlet, getRouteChain } from "./outlet.js";
6
+ export { useNavigate, useParams, useRouteData, useCurrentRoute, useCanGoBack, useRouter, useScreenState, useActionResultHandler, } from "./hooks.js";
7
+ export { ScreenFocusProvider, useScreenFocus, useScreenEffect } from "./focus.js";
8
+ export { StateCache } from "./state-cache.js";
9
+ export { useRouterCommands } from "./command-scope.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAA;AAMnB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function RouteDataProvider({ data, children, }: {
3
+ data: unknown;
4
+ children: ReactNode;
5
+ }): ReactNode;
6
+ export declare function useRouteDataContext<T = unknown>(): T | undefined;
7
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,SAAS,CAAA;CACpB,aAEA;AAED,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,SAAS,CAEhE"}
package/dist/loader.js ADDED
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ // Context for route loader data
4
+ const RouteDataContext = createContext(undefined);
5
+ export function RouteDataProvider({ data, children, }) {
6
+ return _jsx(RouteDataContext, { value: data, children: children });
7
+ }
8
+ export function useRouteDataContext() {
9
+ return useContext(RouteDataContext);
10
+ }
11
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAGjD,gCAAgC;AAEhC,MAAM,gBAAgB,GAAG,aAAa,CAAU,SAAS,CAAC,CAAA;AAE1D,MAAM,UAAU,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,GAIT;IACC,OAAO,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,YAAG,QAAQ,GAAoB,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,gBAAgB,CAAkB,CAAA;AACtD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from "react";
2
+ import type { RouteDefinition } from "./types.js";
3
+ export declare function getRouteChain(routeMap: {
4
+ get(id: string): RouteDefinition | undefined;
5
+ }, routeId: string): RouteDefinition[];
6
+ export declare function Outlet(): ReactNode;
7
+ //# sourceMappingURL=outlet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlet.d.ts","sourceRoot":"","sources":["../src/outlet.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAA;AAW7D,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAA;CAAE,EAC1D,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CAQnB;AAqDD,wBAAgB,MAAM,cAwCrB"}
package/dist/outlet.js ADDED
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { createContext, createElement, useContext, useEffect, useState } from "react";
3
+ import { useRouterInstance, useRouterStack, StackEntryIndexContext } from "./context.js";
4
+ import { ScreenFocusProvider } from "./focus.js";
5
+ import { RouteDataProvider } from "./loader.js";
6
+ // Depth tracking context
7
+ const OutletDepthContext = createContext(0);
8
+ // Helper: walk parent chain and return [root, ..., leaf]
9
+ export function getRouteChain(routeMap, routeId) {
10
+ const chain = [];
11
+ let current = routeMap.get(routeId);
12
+ while (current) {
13
+ chain.unshift(current);
14
+ current = current.parent;
15
+ }
16
+ return chain;
17
+ }
18
+ // RouteRenderer: handles loader lifecycle for a route
19
+ function RouteRenderer({ entry, routeDef, children, }) {
20
+ const [data, setData] = useState(undefined);
21
+ const [loading, setLoading] = useState(!!routeDef.loader);
22
+ const [error, setError] = useState(null);
23
+ useEffect(() => {
24
+ if (!routeDef.loader)
25
+ return;
26
+ let cancelled = false;
27
+ setLoading(true);
28
+ setError(null);
29
+ routeDef
30
+ .loader({ params: entry.params })
31
+ .then((result) => {
32
+ if (!cancelled) {
33
+ setData(result);
34
+ setLoading(false);
35
+ }
36
+ })
37
+ .catch((err) => {
38
+ if (!cancelled) {
39
+ setError(err instanceof Error ? err : new Error(String(err)));
40
+ setLoading(false);
41
+ }
42
+ });
43
+ return () => { cancelled = true; };
44
+ }, [entry, routeDef.loader]);
45
+ if (error && routeDef.errorComponent) {
46
+ return createElement(routeDef.errorComponent, { error });
47
+ }
48
+ if (error) {
49
+ return null;
50
+ }
51
+ if (loading) {
52
+ return routeDef.pendingComponent ? createElement(routeDef.pendingComponent) : null;
53
+ }
54
+ return _jsx(RouteDataProvider, { data: data, children: children });
55
+ }
56
+ // Outlet component
57
+ export function Outlet() {
58
+ const router = useRouterInstance();
59
+ const stack = useRouterStack();
60
+ const depth = useContext(OutletDepthContext);
61
+ const topEntry = stack[stack.length - 1];
62
+ if (!topEntry)
63
+ return null;
64
+ const routeDef = router.getRouteDefinition(topEntry.routeId);
65
+ if (!routeDef)
66
+ return null;
67
+ const chain = getRouteChain({ get: (id) => router.getRouteDefinition(id) }, topEntry.routeId);
68
+ const routeAtDepth = chain[depth];
69
+ if (!routeAtDepth)
70
+ return null;
71
+ const isTopOfStack = depth === chain.length - 1;
72
+ const content = (_jsx(StackEntryIndexContext, { value: stack.length - 1, children: _jsx(OutletDepthContext, { value: depth + 1, children: _jsx(ScreenFocusProvider, { active: isTopOfStack, children: createElement(routeAtDepth.component) }) }) }));
73
+ if (routeAtDepth.loader) {
74
+ return (_jsx(RouteRenderer, { entry: topEntry, routeDef: routeAtDepth, children: content }));
75
+ }
76
+ return content;
77
+ }
78
+ //# sourceMappingURL=outlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlet.js","sourceRoot":"","sources":["../src/outlet.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouterState, RouterAction } from "./types.js";
2
+ export declare function stackReducer(state: RouterState, action: RouterAction): RouterState;
3
+ //# sourceMappingURL=stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAwBlF"}
package/dist/stack.js ADDED
@@ -0,0 +1,27 @@
1
+ export function stackReducer(state, action) {
2
+ switch (action.type) {
3
+ case "push":
4
+ return {
5
+ stack: [
6
+ ...state.stack,
7
+ { routeId: action.routeId, params: action.params ?? {} },
8
+ ],
9
+ };
10
+ case "pop":
11
+ if (state.stack.length <= 1)
12
+ return state;
13
+ return { stack: state.stack.slice(0, -1) };
14
+ case "replace":
15
+ return {
16
+ stack: [
17
+ ...state.stack.slice(0, -1),
18
+ { routeId: action.routeId, params: action.params ?? {} },
19
+ ],
20
+ };
21
+ case "reset":
22
+ return {
23
+ stack: [{ routeId: action.routeId, params: action.params ?? {} }],
24
+ };
25
+ }
26
+ }
27
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAkB,EAAE,MAAoB;IACnE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE;oBACL,GAAG,KAAK,CAAC,KAAK;oBACd,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE;iBACzD;aACF,CAAA;QACH,KAAK,KAAK;YACR,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAA;YACzC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5C,KAAK,SAAS;YACZ,OAAO;gBACL,KAAK,EAAE;oBACL,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3B,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE;iBACzD;aACF,CAAA;QACH,KAAK,OAAO;YACV,OAAO;gBACL,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;aAClE,CAAA;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class StateCache {
2
+ private cache;
3
+ save(key: string, state: unknown): void;
4
+ restore<T>(key: string): T | undefined;
5
+ clear(key: string): void;
6
+ clearAll(): void;
7
+ }
8
+ //# sourceMappingURL=state-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-cache.d.ts","sourceRoot":"","sources":["../src/state-cache.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA6B;IAE1C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIvC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAItC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,QAAQ,IAAI,IAAI;CAGjB"}
@@ -0,0 +1,16 @@
1
+ export class StateCache {
2
+ cache = new Map();
3
+ save(key, state) {
4
+ this.cache.set(key, state);
5
+ }
6
+ restore(key) {
7
+ return this.cache.get(key);
8
+ }
9
+ clear(key) {
10
+ this.cache.delete(key);
11
+ }
12
+ clearAll() {
13
+ this.cache.clear();
14
+ }
15
+ }
16
+ //# sourceMappingURL=state-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-cache.js","sourceRoot":"","sources":["../src/state-cache.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;IACb,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAA;IAE1C,IAAI,CAAC,GAAW,EAAE,KAAc;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO,CAAI,GAAW;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAkB,CAAA;IAC7C,CAAC;IAED,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;CACF"}