@elurjs/ionic 2.0.7 → 2.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/CHANGELOG.md +15 -0
- package/dist/lib/IonRouterOutlet.d.ts +20 -0
- package/dist/lib/__tests__/devtools.test.d.ts +1 -0
- package/dist/lib/devtools.cjs +2 -0
- package/dist/lib/devtools.cjs.map +1 -0
- package/dist/lib/devtools.d.ts +54 -0
- package/dist/lib/devtools.js +46 -0
- package/dist/lib/devtools.js.map +1 -0
- package/dist/lib/elur-ionic.cjs +1 -1
- package/dist/lib/elur-ionic.cjs.map +1 -1
- package/dist/lib/elur-ionic.js +1 -1
- package/dist/lib/elur-ionic.js.map +1 -1
- package/dist/lib/navigation.cjs +1 -1
- package/dist/lib/navigation.cjs.map +1 -1
- package/dist/lib/navigation.d.ts +9 -9
- package/dist/lib/navigation.js +15 -3
- package/dist/lib/navigation.js.map +1 -1
- package/package.json +6 -1
package/dist/lib/navigation.js
CHANGED
|
@@ -42,6 +42,13 @@ var t = class {
|
|
|
42
42
|
let t = e ?? this._activeTabKey;
|
|
43
43
|
return [...this._stacks.get(t)?.entries ?? []];
|
|
44
44
|
}
|
|
45
|
+
_debugSnapshot() {
|
|
46
|
+
return Array.from(this._stacks.values()).map((e) => ({
|
|
47
|
+
prefix: e.prefix,
|
|
48
|
+
depth: e.entries.length,
|
|
49
|
+
entries: [...e.entries]
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
45
52
|
apply(e, t) {
|
|
46
53
|
let n = this.keyForPath(e), r = this._stacks.get(n);
|
|
47
54
|
if (n !== this._activeTabKey) return this._activeTabKey = n, r.entries[r.entries.length - 1] !== e && r.entries.push(e), "none";
|
|
@@ -68,7 +75,12 @@ var t = class {
|
|
|
68
75
|
_normalize(e) {
|
|
69
76
|
return !e || e === "/" ? "/" : e.endsWith("/") ? e.slice(0, -1) : e;
|
|
70
77
|
}
|
|
71
|
-
}, n =
|
|
78
|
+
}, n = Symbol.for("@elurjs/ionic/navigation");
|
|
79
|
+
function r(e) {
|
|
80
|
+
let t = globalThis, r = t[n];
|
|
81
|
+
r || (r = /* @__PURE__ */ new Set(), t[n] = r), r.add(e);
|
|
82
|
+
}
|
|
83
|
+
var i = class {
|
|
72
84
|
_stacks;
|
|
73
85
|
_beforeNavHooks = [];
|
|
74
86
|
_afterNavHooks = [];
|
|
@@ -79,7 +91,7 @@ var t = class {
|
|
|
79
91
|
_lastTabKey = null;
|
|
80
92
|
canGoBack;
|
|
81
93
|
constructor(n = {}) {
|
|
82
|
-
this._stacks = new t(n.tabs), this.canGoBack = e(!1);
|
|
94
|
+
this._stacks = new t(n.tabs), this.canGoBack = e(!1), r(this);
|
|
83
95
|
}
|
|
84
96
|
get stacks() {
|
|
85
97
|
return this._stacks;
|
|
@@ -188,6 +200,6 @@ var t = class {
|
|
|
188
200
|
}
|
|
189
201
|
};
|
|
190
202
|
//#endregion
|
|
191
|
-
export {
|
|
203
|
+
export { i as NavigationManager, t as StackManager };
|
|
192
204
|
|
|
193
205
|
//# sourceMappingURL=navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","names":[],"sources":["../../src/navigation.ts"],"sourcesContent":["/**\n * @elurjs/ionic / navigation.ts\n *\n * NavigationManager — a single coordination authority for Ionic navigation.\n *\n * The IonRouterOutlet handles DOM rendering, transitions, and cache. The\n * NavigationManager handles:\n * - Per-tab navigation stacks (extracted from the outlet)\n * - Navigation state tracking (isTransitioning, pending navigation)\n * - Navigation hooks (beforeNav, afterNav, onTabChange)\n * - Programmatic tab switching\n * - Route-pattern-based cache invalidation hooks\n * - Guard coordination (delegated to the core router when auto-bootstrapped)\n *\n * The outlet delegates navigation state to the manager, keeping a clean\n * separation: navigation logic lives here, rendering lives in the outlet.\n *\n * @example\n * ```ts\n * import { NavigationManager } from \"@elurjs/ionic\";\n *\n * const nav = new NavigationManager({ tabs: [\"/home\", \"/search\", \"/profile\"] });\n *\n * // Navigation hooks\n * nav.beforeNav((path, intent) => {\n * console.log(\"navigating to\", path);\n * // return false to cancel\n * });\n * nav.afterNav((path) => {\n * analytics.track(\"page_view\", { path });\n * });\n * nav.onTabChange((tab) => {\n * console.log(\"active tab:\", tab);\n * });\n *\n * // Programmatic tab switching\n * nav.switchTab(\"/search\");\n *\n * // The outlet uses the manager for stack/state:\n * const outlet = new IonRouterOutlet(routes, { navigation: nav });\n * ```\n */\n\nimport { signal, type Signal, type NavigationIntent, type NavigationDirection } from \"@elurjs/core\";\n\n// --- Types ---\n\n/** A function called before navigation completes. Return false to cancel. */\nexport type BeforeNavHook = (\n path: string,\n intent: NavigationIntent,\n) => boolean | void | Promise<boolean | void>;\n\n/** A function called after navigation completes. */\nexport type AfterNavHook = (\n path: string,\n direction: NavigationDirection,\n) => void;\n\n/** A function called when the active tab changes. */\nexport type TabChangeHook = (\n tab: string,\n previousTab: string | null,\n) => void;\n\n/** Options for NavigationManager construction. */\nexport interface NavigationManagerOptions {\n /** Tab prefixes for per-tab stack management. */\n tabs?: string[];\n}\n\n// --- Per-tab stack management (extracted from IonRouterOutlet) ---\n\ninterface TabStack {\n prefix: string;\n entries: string[];\n}\n\n/**\n * Manages per-tab navigation stacks. Each tab has its own back/forward\n * stack. When the user switches tabs, the stack for the new tab is\n * restored.\n */\nexport class StackManager {\n private _stacks = new Map<string, TabStack>();\n private _activeTabKey: string;\n private _tabPrefixes: string[];\n\n constructor(tabs: string[] | undefined) {\n this._stacks.set(\"\", { prefix: \"\", entries: [] });\n if (tabs?.length) {\n for (const prefix of tabs) {\n const norm = this._normalize(prefix);\n this._stacks.set(norm, { prefix: norm, entries: [] });\n }\n this._tabPrefixes = tabs.map((t) => this._normalize(t))\n .sort((a, b) => b.length - a.length);\n } else {\n this._tabPrefixes = [];\n }\n this._activeTabKey = \"\";\n }\n\n /** Get the tab key for a given path. */\n keyForPath(path: string): string {\n for (const prefix of this._tabPrefixes) {\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return prefix;\n }\n }\n return \"\";\n }\n\n /** Get the active tab key. */\n get activeTabKey(): string {\n return this._activeTabKey;\n }\n\n /** Get all registered tab prefixes. */\n get tabPrefixes(): readonly string[] {\n return this._tabPrefixes;\n }\n\n /** Get the current stack depth for a tab. */\n stackDepth(tabKey?: string): number {\n const key = tabKey ?? this._activeTabKey;\n return this._stacks.get(key)?.entries.length ?? 0;\n }\n\n /** Get the top of the stack for a tab. */\n stackTop(tabKey?: string): string | null {\n const key = tabKey ?? this._activeTabKey;\n const stack = this._stacks.get(key);\n if (!stack || stack.entries.length === 0) return null;\n return stack.entries[stack.entries.length - 1];\n }\n\n /** Get all entries in a tab's stack (copy). */\n stackEntries(tabKey?: string): string[] {\n const key = tabKey ?? this._activeTabKey;\n return [...(this._stacks.get(key)?.entries ?? [])];\n }\n\n /**\n * Apply a navigation to the stacks. Returns the effective direction.\n * This is the same logic that was in IonRouterOutlet._stacks.apply().\n */\n apply(path: string, intent: NavigationIntent): NavigationDirection {\n const targetKey = this.keyForPath(path);\n const stack = this._stacks.get(targetKey)!;\n\n if (targetKey !== this._activeTabKey) {\n this._activeTabKey = targetKey;\n const top = stack.entries[stack.entries.length - 1];\n if (top !== path) stack.entries.push(path);\n return \"none\";\n }\n\n if (intent.direction === \"back\") {\n while (stack.entries.length > 0\n && stack.entries[stack.entries.length - 1] !== path) {\n stack.entries.pop();\n }\n if (stack.entries.length === 0) stack.entries.push(path);\n return \"back\";\n }\n\n if (intent.action === \"replace\" || intent.direction === \"root\") {\n if (stack.entries.length === 0) stack.entries.push(path);\n else stack.entries[stack.entries.length - 1] = path;\n return intent.direction === \"forward\" ? \"forward\" : \"root\";\n }\n\n if (intent.action === \"initial\") {\n if (stack.entries.length === 0) stack.entries.push(path);\n return \"none\";\n }\n\n const top = stack.entries[stack.entries.length - 1];\n if (top !== path) stack.entries.push(path);\n return intent.direction;\n }\n\n /** Reset a specific tab's stack. */\n resetTab(tabKey: string): void {\n const stack = this._stacks.get(tabKey);\n if (stack) stack.entries = [];\n }\n\n /** Clear a specific tab's stack and return the paths that were in it. */\n clearTabStack(tabKey: string): string[] {\n const stack = this._stacks.get(tabKey);\n if (!stack) return [];\n const entries = [...stack.entries];\n stack.entries = [];\n return entries;\n }\n\n /** Reset all stacks. */\n resetAll(): void {\n for (const stack of this._stacks.values()) {\n stack.entries = [];\n }\n this._activeTabKey = \"\";\n }\n\n private _normalize(p: string): string {\n if (!p || p === \"/\") return \"/\";\n return p.endsWith(\"/\") ? p.slice(0, -1) : p;\n }\n}\n\n// --- NavigationManager ---\n\n/**\n * Single coordination authority for Ionic navigation.\n *\n * Wraps the per-tab stack manager and adds:\n * - Navigation hooks (beforeNav, afterNav, onTabChange)\n * - Transition state tracking (isTransitioning, pending)\n * - Programmatic tab switching\n * - Route-pattern-based cache invalidation hooks\n */\nexport class NavigationManager {\n private _stacks: StackManager;\n private _beforeNavHooks: BeforeNavHook[] = [];\n private _afterNavHooks: AfterNavHook[] = [];\n private _tabChangeHooks: TabChangeHook[] = [];\n private _cacheInvalidationHandlers = new Map<string, (params?: Record<string, string>) => void>();\n\n private _isTransitioning = false;\n private _pendingNav: { path: string; intent: NavigationIntent } | null = null;\n private _lastTabKey: string | null = null;\n\n /** Reactive signal: true when the active tab has a back stack. */\n readonly canGoBack: Signal<boolean>;\n\n constructor(options: NavigationManagerOptions = {}) {\n this._stacks = new StackManager(options.tabs);\n this.canGoBack = signal(false);\n }\n\n // --- Stack access ---\n\n get stacks(): StackManager {\n return this._stacks;\n }\n\n get activeTab(): string {\n return this._stacks.activeTabKey;\n }\n\n get tabPrefixes(): readonly string[] {\n return this._stacks.tabPrefixes;\n }\n\n stackDepth(tabKey?: string): number {\n return this._stacks.stackDepth(tabKey);\n }\n\n stackTop(tabKey?: string): string | null {\n return this._stacks.stackTop(tabKey);\n }\n\n stackEntries(tabKey?: string): string[] {\n return this._stacks.stackEntries(tabKey);\n }\n\n // --- Transition state ---\n\n get isTransitioning(): boolean {\n return this._isTransitioning;\n }\n\n get pendingNav(): { path: string; intent: NavigationIntent } | null {\n return this._pendingNav;\n }\n\n /** Called by the outlet when a transition starts. */\n beginTransition(): void {\n this._isTransitioning = true;\n }\n\n /** Called by the outlet when a transition ends. */\n endTransition(): void {\n this._isTransitioning = false;\n }\n\n /** Queue a pending navigation (called by the outlet when already transitioning). */\n setPendingNav(path: string, intent: NavigationIntent): void {\n this._pendingNav = { path, intent };\n }\n\n /** Clear pending navigation. */\n clearPendingNav(): void {\n this._pendingNav = null;\n }\n\n /** Consume and return the pending navigation, if any. */\n consumePendingNav(): { path: string; intent: NavigationIntent } | null {\n const pending = this._pendingNav;\n this._pendingNav = null;\n return pending;\n }\n\n // --- Navigation hooks ---\n\n /**\n * Register a hook called before navigation completes.\n * Return `false` to cancel the navigation.\n * Multiple hooks are called in registration order.\n */\n beforeNav(hook: BeforeNavHook): () => void {\n this._beforeNavHooks.push(hook);\n return () => {\n const i = this._beforeNavHooks.indexOf(hook);\n if (i >= 0) this._beforeNavHooks.splice(i, 1);\n };\n }\n\n /**\n * Register a hook called after navigation completes.\n */\n afterNav(hook: AfterNavHook): () => void {\n this._afterNavHooks.push(hook);\n return () => {\n const i = this._afterNavHooks.indexOf(hook);\n if (i >= 0) this._afterNavHooks.splice(i, 1);\n };\n }\n\n /**\n * Register a hook called when the active tab changes.\n */\n onTabChange(hook: TabChangeHook): () => void {\n this._tabChangeHooks.push(hook);\n return () => {\n const i = this._tabChangeHooks.indexOf(hook);\n if (i >= 0) this._tabChangeHooks.splice(i, 1);\n };\n }\n\n /**\n * Run beforeNav hooks. Returns true if all hooks allow navigation,\n * false if any hook cancelled.\n */\n async runBeforeNav(path: string, intent: NavigationIntent): Promise<boolean> {\n for (const hook of this._beforeNavHooks) {\n try {\n const result = await hook(path, intent);\n if (result === false) return false;\n } catch {\n // Hook error — don't block navigation\n }\n }\n return true;\n }\n\n /**\n * Run afterNav hooks. Called by the outlet after a transition completes.\n */\n runAfterNav(path: string, direction: NavigationDirection): void {\n for (const hook of this._afterNavHooks) {\n try {\n hook(path, direction);\n } catch { /* ignore */ }\n }\n }\n\n /**\n * Run tab change hooks if the tab actually changed.\n */\n runTabChangeIfNeeded(currentPath: string): void {\n const newTab = this._stacks.keyForPath(currentPath);\n if (newTab !== this._lastTabKey) {\n const prev = this._lastTabKey;\n this._lastTabKey = newTab;\n for (const hook of this._tabChangeHooks) {\n try {\n hook(newTab, prev);\n } catch { /* ignore */ }\n }\n }\n }\n\n /**\n * Update the reactive `canGoBack` signal based on the active tab's\n * stack depth. Called by the outlet after each transition.\n */\n updateCanGoBack(): void {\n this.canGoBack.value = this._stacks.stackDepth() > 1;\n }\n\n // --- Programmatic tab switching ---\n\n /**\n * Switch to a specific tab. Navigates to the tab's current stack top,\n * or the tab prefix if the stack is empty.\n *\n * @example\n * ```ts\n * nav.switchTab(\"/search\"); // switches to the search tab\n * ```\n */\n switchTab(tabPrefix: string): string | null {\n const normalized = this._stacks.keyForPath(tabPrefix);\n if (normalized === this._stacks.activeTabKey) return null;\n const top = this._stacks.stackTop(normalized);\n return top ?? tabPrefix;\n }\n\n // --- Cache invalidation by route pattern ---\n\n /**\n * Register a cache invalidation handler for a route pattern.\n * The outlet registers handlers for each route on construction.\n *\n * @example\n * ```ts\n * nav.registerInvalidationHandler(\"/user/:id\", (params) => {\n * // called when invalidateRoute(\"/user/:id\", { id: \"42\" }) is invoked\n * });\n * ```\n */\n registerInvalidationHandler(\n routePattern: string,\n handler: (params?: Record<string, string>) => void,\n ): () => void {\n this._cacheInvalidationHandlers.set(routePattern, handler);\n return () => {\n this._cacheInvalidationHandlers.delete(routePattern);\n };\n }\n\n /**\n * Invalidate cached pages for a specific route pattern + params.\n * If the route has dynamic segments, provide params to target a\n * specific instance. Omit params to invalidate all instances.\n *\n * @example\n * ```ts\n * nav.invalidateRoute(\"/user/:id\", { id: \"42\" }); // invalidate user 42\n * nav.invalidateRoute(\"/search\"); // invalidate all search instances\n * ```\n */\n invalidateRoute(\n routePattern: string,\n params?: Record<string, string>,\n ): void {\n const handler = this._cacheInvalidationHandlers.get(routePattern);\n if (handler) handler(params);\n }\n\n /**\n * Invalidate all cached pages matching a glob pattern.\n * Supports `*` as a wildcard suffix.\n *\n * @example\n * ```ts\n * nav.invalidatePattern(\"/admin/*\"); // invalidate all admin pages\n * nav.invalidatePattern(\"/*\"); // invalidate everything\n * ```\n */\n invalidatePattern(pattern: string): void {\n const isWildcard = pattern.endsWith(\"/*\");\n const prefix = isWildcard ? pattern.slice(0, -2) : pattern;\n\n for (const routePattern of this._cacheInvalidationHandlers.keys()) {\n if (isWildcard) {\n if (routePattern === prefix || routePattern.startsWith(prefix + \"/\") ||\n routePattern.startsWith(prefix + \":\")) {\n this._cacheInvalidationHandlers.get(routePattern)?.();\n }\n } else if (routePattern === pattern) {\n this._cacheInvalidationHandlers.get(routePattern)?.();\n }\n }\n }\n\n // --- Cleanup ---\n\n /** Reset all navigation state (stacks, hooks, pending). */\n dispose(): void {\n this._stacks.resetAll();\n this._beforeNavHooks = [];\n this._afterNavHooks = [];\n this._tabChangeHooks = [];\n this._cacheInvalidationHandlers.clear();\n this._pendingNav = null;\n this._isTransitioning = false;\n this._lastTabKey = null;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigation.js","names":[],"sources":["../../src/navigation.ts"],"sourcesContent":["/**\n * @elurjs/ionic / navigation.ts\n *\n * NavigationManager — a single coordination authority for Ionic navigation.\n *\n * The IonRouterOutlet handles DOM rendering, transitions, and cache. The\n * NavigationManager handles:\n * - Per-tab navigation stacks (extracted from the outlet)\n * - Navigation state tracking (isTransitioning, pending navigation)\n * - Navigation hooks (beforeNav, afterNav, onTabChange)\n * - Programmatic tab switching\n * - Route-pattern-based cache invalidation hooks\n * - Guard coordination (delegated to the core router when auto-bootstrapped)\n *\n * The outlet delegates navigation state to the manager, keeping a clean\n * separation: navigation logic lives here, rendering lives in the outlet.\n *\n * @example\n * ```ts\n * import { NavigationManager } from \"@elurjs/ionic\";\n *\n * const nav = new NavigationManager({ tabs: [\"/home\", \"/search\", \"/profile\"] });\n *\n * // Navigation hooks\n * nav.beforeNav((path, intent) => {\n * console.log(\"navigating to\", path);\n * // return false to cancel\n * });\n * nav.afterNav((path) => {\n * analytics.track(\"page_view\", { path });\n * });\n * nav.onTabChange((tab) => {\n * console.log(\"active tab:\", tab);\n * });\n *\n * // Programmatic tab switching\n * nav.switchTab(\"/search\");\n *\n * // The outlet uses the manager for stack/state:\n * const outlet = new IonRouterOutlet(routes, { navigation: nav });\n * ```\n */\n\nimport { signal, type Signal, type NavigationIntent, type NavigationDirection } from \"@elurjs/core\";\n\n// --- Types ---\n\n/** A function called before navigation completes. Return false to cancel. */\nexport type BeforeNavHook = (\n path: string,\n intent: NavigationIntent,\n) => boolean | void | Promise<boolean | void>;\n\n/** A function called after navigation completes. */\nexport type AfterNavHook = (\n path: string,\n direction: NavigationDirection,\n) => void;\n\n/** A function called when the active tab changes. */\nexport type TabChangeHook = (\n tab: string,\n previousTab: string | null,\n) => void;\n\n/** Options for NavigationManager construction. */\nexport interface NavigationManagerOptions {\n /** Tab prefixes for per-tab stack management. */\n tabs?: string[];\n}\n\n// --- Per-tab stack management (extracted from IonRouterOutlet) ---\n\ninterface TabStack {\n prefix: string;\n entries: string[];\n}\n\n/**\n * Manages per-tab navigation stacks. Each tab has its own back/forward\n * stack. When the user switches tabs, the stack for the new tab is\n * restored.\n */\nexport class StackManager {\n private _stacks = new Map<string, TabStack>();\n private _activeTabKey: string;\n private _tabPrefixes: string[];\n\n constructor(tabs: string[] | undefined) {\n this._stacks.set(\"\", { prefix: \"\", entries: [] });\n if (tabs?.length) {\n for (const prefix of tabs) {\n const norm = this._normalize(prefix);\n this._stacks.set(norm, { prefix: norm, entries: [] });\n }\n this._tabPrefixes = tabs.map((t) => this._normalize(t))\n .sort((a, b) => b.length - a.length);\n } else {\n this._tabPrefixes = [];\n }\n this._activeTabKey = \"\";\n }\n\n /** Get the tab key for a given path. */\n keyForPath(path: string): string {\n for (const prefix of this._tabPrefixes) {\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return prefix;\n }\n }\n return \"\";\n }\n\n /** Get the active tab key. */\n get activeTabKey(): string {\n return this._activeTabKey;\n }\n\n /** Get all registered tab prefixes. */\n get tabPrefixes(): readonly string[] {\n return this._tabPrefixes;\n }\n\n /** Get the current stack depth for a tab. */\n stackDepth(tabKey?: string): number {\n const key = tabKey ?? this._activeTabKey;\n return this._stacks.get(key)?.entries.length ?? 0;\n }\n\n /** Get the top of the stack for a tab. */\n stackTop(tabKey?: string): string | null {\n const key = tabKey ?? this._activeTabKey;\n const stack = this._stacks.get(key);\n if (!stack || stack.entries.length === 0) return null;\n return stack.entries[stack.entries.length - 1];\n }\n\n /** Get all entries in a tab's stack (copy). */\n stackEntries(tabKey?: string): string[] {\n const key = tabKey ?? this._activeTabKey;\n return [...(this._stacks.get(key)?.entries ?? [])];\n }\n\n /**\n * @internal — Debug snapshot of all tab stacks for\n * `@elurjs/ionic/devtools`. Plain data, computed on demand.\n */\n _debugSnapshot(): Array<{ prefix: string; depth: number; entries: string[] }> {\n return Array.from(this._stacks.values()).map((stack) => ({\n prefix: stack.prefix,\n depth: stack.entries.length,\n entries: [...stack.entries],\n }));\n }\n\n /**\n * Apply a navigation to the stacks. Returns the effective direction.\n * This is the same logic that was in IonRouterOutlet._stacks.apply().\n */\n apply(path: string, intent: NavigationIntent): NavigationDirection {\n const targetKey = this.keyForPath(path);\n const stack = this._stacks.get(targetKey)!;\n\n if (targetKey !== this._activeTabKey) {\n this._activeTabKey = targetKey;\n const top = stack.entries[stack.entries.length - 1];\n if (top !== path) stack.entries.push(path);\n return \"none\";\n }\n\n if (intent.direction === \"back\") {\n while (stack.entries.length > 0\n && stack.entries[stack.entries.length - 1] !== path) {\n stack.entries.pop();\n }\n if (stack.entries.length === 0) stack.entries.push(path);\n return \"back\";\n }\n\n if (intent.action === \"replace\" || intent.direction === \"root\") {\n if (stack.entries.length === 0) stack.entries.push(path);\n else stack.entries[stack.entries.length - 1] = path;\n return intent.direction === \"forward\" ? \"forward\" : \"root\";\n }\n\n if (intent.action === \"initial\") {\n if (stack.entries.length === 0) stack.entries.push(path);\n return \"none\";\n }\n\n const top = stack.entries[stack.entries.length - 1];\n if (top !== path) stack.entries.push(path);\n return intent.direction;\n }\n\n /** Reset a specific tab's stack. */\n resetTab(tabKey: string): void {\n const stack = this._stacks.get(tabKey);\n if (stack) stack.entries = [];\n }\n\n /** Clear a specific tab's stack and return the paths that were in it. */\n clearTabStack(tabKey: string): string[] {\n const stack = this._stacks.get(tabKey);\n if (!stack) return [];\n const entries = [...stack.entries];\n stack.entries = [];\n return entries;\n }\n\n /** Reset all stacks. */\n resetAll(): void {\n for (const stack of this._stacks.values()) {\n stack.entries = [];\n }\n this._activeTabKey = \"\";\n }\n\n private _normalize(p: string): string {\n if (!p || p === \"/\") return \"/\";\n return p.endsWith(\"/\") ? p.slice(0, -1) : p;\n }\n}\n\n// --- NavigationManager ---\n\n/**\n * Single coordination authority for Ionic navigation.\n *\n * Wraps the per-tab stack manager and adds:\n * - Navigation hooks (beforeNav, afterNav, onTabChange)\n * - Transition state tracking (isTransitioning, pending)\n * - Programmatic tab switching\n * - Route-pattern-based cache invalidation hooks\n */\n/**\n * @internal — Global registry of live NavigationManager instances for\n * devtools. Shared via `Symbol.for` so it survives module duplication.\n */\nconst _navigationRegistryKey = Symbol.for(\"@elurjs/ionic/navigation\");\n\nfunction _registerNavigationManager(instance: NavigationManager): void {\n const g = globalThis as Record<PropertyKey, unknown>;\n let set = g[_navigationRegistryKey] as Set<NavigationManager> | undefined;\n if (!set) {\n set = new Set();\n g[_navigationRegistryKey] = set;\n }\n set.add(instance);\n}\n\nexport class NavigationManager {\n private _stacks: StackManager;\n private _beforeNavHooks: BeforeNavHook[] = [];\n private _afterNavHooks: AfterNavHook[] = [];\n private _tabChangeHooks: TabChangeHook[] = [];\n private _cacheInvalidationHandlers = new Map<string, (params?: Record<string, string>) => void>();\n\n private _isTransitioning = false;\n private _pendingNav: { path: string; intent: NavigationIntent } | null = null;\n private _lastTabKey: string | null = null;\n\n /** Reactive signal: true when the active tab has a back stack. */\n readonly canGoBack: Signal<boolean>;\n\n constructor(options: NavigationManagerOptions = {}) {\n this._stacks = new StackManager(options.tabs);\n this.canGoBack = signal(false);\n _registerNavigationManager(this);\n }\n\n // --- Stack access ---\n\n get stacks(): StackManager {\n return this._stacks;\n }\n\n get activeTab(): string {\n return this._stacks.activeTabKey;\n }\n\n get tabPrefixes(): readonly string[] {\n return this._stacks.tabPrefixes;\n }\n\n stackDepth(tabKey?: string): number {\n return this._stacks.stackDepth(tabKey);\n }\n\n stackTop(tabKey?: string): string | null {\n return this._stacks.stackTop(tabKey);\n }\n\n stackEntries(tabKey?: string): string[] {\n return this._stacks.stackEntries(tabKey);\n }\n\n // --- Transition state ---\n\n get isTransitioning(): boolean {\n return this._isTransitioning;\n }\n\n get pendingNav(): { path: string; intent: NavigationIntent } | null {\n return this._pendingNav;\n }\n\n /** Called by the outlet when a transition starts. */\n beginTransition(): void {\n this._isTransitioning = true;\n }\n\n /** Called by the outlet when a transition ends. */\n endTransition(): void {\n this._isTransitioning = false;\n }\n\n /** Queue a pending navigation (called by the outlet when already transitioning). */\n setPendingNav(path: string, intent: NavigationIntent): void {\n this._pendingNav = { path, intent };\n }\n\n /** Clear pending navigation. */\n clearPendingNav(): void {\n this._pendingNav = null;\n }\n\n /** Consume and return the pending navigation, if any. */\n consumePendingNav(): { path: string; intent: NavigationIntent } | null {\n const pending = this._pendingNav;\n this._pendingNav = null;\n return pending;\n }\n\n // --- Navigation hooks ---\n\n /**\n * Register a hook called before navigation completes.\n * Return `false` to cancel the navigation.\n * Multiple hooks are called in registration order.\n */\n beforeNav(hook: BeforeNavHook): () => void {\n this._beforeNavHooks.push(hook);\n return () => {\n const i = this._beforeNavHooks.indexOf(hook);\n if (i >= 0) this._beforeNavHooks.splice(i, 1);\n };\n }\n\n /**\n * Register a hook called after navigation completes.\n */\n afterNav(hook: AfterNavHook): () => void {\n this._afterNavHooks.push(hook);\n return () => {\n const i = this._afterNavHooks.indexOf(hook);\n if (i >= 0) this._afterNavHooks.splice(i, 1);\n };\n }\n\n /**\n * Register a hook called when the active tab changes.\n */\n onTabChange(hook: TabChangeHook): () => void {\n this._tabChangeHooks.push(hook);\n return () => {\n const i = this._tabChangeHooks.indexOf(hook);\n if (i >= 0) this._tabChangeHooks.splice(i, 1);\n };\n }\n\n /**\n * Run beforeNav hooks. Returns true if all hooks allow navigation,\n * false if any hook cancelled.\n */\n async runBeforeNav(path: string, intent: NavigationIntent): Promise<boolean> {\n for (const hook of this._beforeNavHooks) {\n try {\n const result = await hook(path, intent);\n if (result === false) return false;\n } catch {\n // Hook error — don't block navigation\n }\n }\n return true;\n }\n\n /**\n * Run afterNav hooks. Called by the outlet after a transition completes.\n */\n runAfterNav(path: string, direction: NavigationDirection): void {\n for (const hook of this._afterNavHooks) {\n try {\n hook(path, direction);\n } catch { /* ignore */ }\n }\n }\n\n /**\n * Run tab change hooks if the tab actually changed.\n */\n runTabChangeIfNeeded(currentPath: string): void {\n const newTab = this._stacks.keyForPath(currentPath);\n if (newTab !== this._lastTabKey) {\n const prev = this._lastTabKey;\n this._lastTabKey = newTab;\n for (const hook of this._tabChangeHooks) {\n try {\n hook(newTab, prev);\n } catch { /* ignore */ }\n }\n }\n }\n\n /**\n * Update the reactive `canGoBack` signal based on the active tab's\n * stack depth. Called by the outlet after each transition.\n */\n updateCanGoBack(): void {\n this.canGoBack.value = this._stacks.stackDepth() > 1;\n }\n\n // --- Programmatic tab switching ---\n\n /**\n * Switch to a specific tab. Navigates to the tab's current stack top,\n * or the tab prefix if the stack is empty.\n *\n * @example\n * ```ts\n * nav.switchTab(\"/search\"); // switches to the search tab\n * ```\n */\n switchTab(tabPrefix: string): string | null {\n const normalized = this._stacks.keyForPath(tabPrefix);\n if (normalized === this._stacks.activeTabKey) return null;\n const top = this._stacks.stackTop(normalized);\n return top ?? tabPrefix;\n }\n\n // --- Cache invalidation by route pattern ---\n\n /**\n * Register a cache invalidation handler for a route pattern.\n * The outlet registers handlers for each route on construction.\n *\n * @example\n * ```ts\n * nav.registerInvalidationHandler(\"/user/:id\", (params) => {\n * // called when invalidateRoute(\"/user/:id\", { id: \"42\" }) is invoked\n * });\n * ```\n */\n registerInvalidationHandler(\n routePattern: string,\n handler: (params?: Record<string, string>) => void,\n ): () => void {\n this._cacheInvalidationHandlers.set(routePattern, handler);\n return () => {\n this._cacheInvalidationHandlers.delete(routePattern);\n };\n }\n\n /**\n * Invalidate cached pages for a specific route pattern + params.\n * If the route has dynamic segments, provide params to target a\n * specific instance. Omit params to invalidate all instances.\n *\n * @example\n * ```ts\n * nav.invalidateRoute(\"/user/:id\", { id: \"42\" }); // invalidate user 42\n * nav.invalidateRoute(\"/search\"); // invalidate all search instances\n * ```\n */\n invalidateRoute(\n routePattern: string,\n params?: Record<string, string>,\n ): void {\n const handler = this._cacheInvalidationHandlers.get(routePattern);\n if (handler) handler(params);\n }\n\n /**\n * Invalidate all cached pages matching a glob pattern.\n * Supports `*` as a wildcard suffix.\n *\n * @example\n * ```ts\n * nav.invalidatePattern(\"/admin/*\"); // invalidate all admin pages\n * nav.invalidatePattern(\"/*\"); // invalidate everything\n * ```\n */\n invalidatePattern(pattern: string): void {\n const isWildcard = pattern.endsWith(\"/*\");\n const prefix = isWildcard ? pattern.slice(0, -2) : pattern;\n\n for (const routePattern of this._cacheInvalidationHandlers.keys()) {\n if (isWildcard) {\n if (routePattern === prefix || routePattern.startsWith(prefix + \"/\") ||\n routePattern.startsWith(prefix + \":\")) {\n this._cacheInvalidationHandlers.get(routePattern)?.();\n }\n } else if (routePattern === pattern) {\n this._cacheInvalidationHandlers.get(routePattern)?.();\n }\n }\n }\n\n // --- Cleanup ---\n\n /** Reset all navigation state (stacks, hooks, pending). */\n dispose(): void {\n this._stacks.resetAll();\n this._beforeNavHooks = [];\n this._afterNavHooks = [];\n this._tabChangeHooks = [];\n this._cacheInvalidationHandlers.clear();\n this._pendingNav = null;\n this._isTransitioning = false;\n this._lastTabKey = null;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elurjs/ionic",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Ionic lifecycle & router bridge for Elur",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Deiver Vasquez",
|
|
@@ -51,6 +51,11 @@
|
|
|
51
51
|
"require": "./dist/lib/components/manifest.cjs",
|
|
52
52
|
"types": "./dist/lib/components/manifest.d.ts"
|
|
53
53
|
},
|
|
54
|
+
"./devtools": {
|
|
55
|
+
"import": "./dist/lib/devtools.js",
|
|
56
|
+
"require": "./dist/lib/devtools.cjs",
|
|
57
|
+
"types": "./dist/lib/devtools.d.ts"
|
|
58
|
+
},
|
|
54
59
|
"./components/*": {
|
|
55
60
|
"import": "./dist/lib/components/*.js",
|
|
56
61
|
"require": "./dist/lib/components/*.cjs",
|