@manyducks.co/dolla 2.0.0-alpha.52 → 2.0.0-alpha.53
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/dist/core/index.d.ts +1 -0
- package/dist/core/ref.d.ts +22 -0
- package/dist/{fragment-DSGTP-XE.js → fragment-DFnx8z2z.js} +2 -2
- package/dist/{fragment-DSGTP-XE.js.map → fragment-DFnx8z2z.js.map} +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.js +63 -49
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.js +2 -2
- package/dist/jsx-runtime.js +2 -2
- package/dist/{logger-CSRDjb4e.js → logger-CByUPmlz.js} +34 -33
- package/dist/{logger-CSRDjb4e.js.map → logger-CByUPmlz.js.map} +1 -1
- package/dist/{router-BYOH-To5.js → router-W2HPWbeI.js} +3 -3
- package/dist/{router-BYOH-To5.js.map → router-W2HPWbeI.js.map} +1 -1
- package/dist/router.js +1 -1
- package/dist/{view-CY19Cf0X.js → view-CAEIbcZt.js} +2 -2
- package/dist/{view-CY19Cf0X.js.map → view-CAEIbcZt.js.map} +1 -1
- package/docs/i18n.md +17 -12
- package/notes/effection-idea.md +34 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-CSRDjb4e.js","sources":["../node_modules/alien-signals/esm/index.mjs","../src/core/signals.ts","../src/utils.ts","../src/core/env.ts","../src/core/logger.ts"],"sourcesContent":["// src/system.ts\nvar SubscriberFlags = /* @__PURE__ */ ((SubscriberFlags2) => {\n SubscriberFlags2[SubscriberFlags2[\"Computed\"] = 1] = \"Computed\";\n SubscriberFlags2[SubscriberFlags2[\"Effect\"] = 2] = \"Effect\";\n SubscriberFlags2[SubscriberFlags2[\"Tracking\"] = 4] = \"Tracking\";\n SubscriberFlags2[SubscriberFlags2[\"Notified\"] = 8] = \"Notified\";\n SubscriberFlags2[SubscriberFlags2[\"Recursed\"] = 16] = \"Recursed\";\n SubscriberFlags2[SubscriberFlags2[\"Dirty\"] = 32] = \"Dirty\";\n SubscriberFlags2[SubscriberFlags2[\"PendingComputed\"] = 64] = \"PendingComputed\";\n SubscriberFlags2[SubscriberFlags2[\"PendingEffect\"] = 128] = \"PendingEffect\";\n SubscriberFlags2[SubscriberFlags2[\"Propagated\"] = 224] = \"Propagated\";\n return SubscriberFlags2;\n})(SubscriberFlags || {});\nfunction createReactiveSystem({\n updateComputed,\n notifyEffect: notifyEffect2\n}) {\n let queuedEffects;\n let queuedEffectsTail;\n return {\n /**\n * Links a given dependency and subscriber if they are not already linked.\n * \n * @param dep - The dependency to be linked.\n * @param sub - The subscriber that depends on this dependency.\n * @returns The newly created link object if the two are not already linked; otherwise `undefined`.\n */\n link(dep, sub) {\n const currentDep = sub.depsTail;\n if (currentDep !== void 0 && currentDep.dep === dep) {\n return;\n }\n const nextDep = currentDep !== void 0 ? currentDep.nextDep : sub.deps;\n if (nextDep !== void 0 && nextDep.dep === dep) {\n sub.depsTail = nextDep;\n return;\n }\n const depLastSub = dep.subsTail;\n if (depLastSub !== void 0 && depLastSub.sub === sub && isValidLink(depLastSub, sub)) {\n return;\n }\n return linkNewDep(dep, sub, nextDep, currentDep);\n },\n /**\n * Traverses and marks subscribers starting from the provided link.\n * \n * It sets flags (e.g., Dirty, PendingComputed, PendingEffect) on each subscriber\n * to indicate which ones require re-computation or effect processing. \n * This function should be called after a signal's value changes.\n * \n * @param link - The starting link from which propagation begins.\n */\n propagate(link2) {\n let targetFlag = 32 /* Dirty */;\n let subs = link2;\n let stack = 0;\n top: do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if (!(subFlags & (4 /* Tracking */ | 16 /* Recursed */ | 224 /* Propagated */)) && (sub.flags = subFlags | targetFlag | 8 /* Notified */, true) || subFlags & 16 /* Recursed */ && !(subFlags & 4 /* Tracking */) && (sub.flags = subFlags & ~16 /* Recursed */ | targetFlag | 8 /* Notified */, true) || !(subFlags & 224 /* Propagated */) && isValidLink(link2, sub) && (sub.flags = subFlags | 16 /* Recursed */ | targetFlag | 8 /* Notified */, sub.subs !== void 0)) {\n const subSubs = sub.subs;\n if (subSubs !== void 0) {\n if (subSubs.nextSub !== void 0) {\n subSubs.prevSub = subs;\n link2 = subs = subSubs;\n targetFlag = 64 /* PendingComputed */;\n ++stack;\n } else {\n link2 = subSubs;\n targetFlag = subFlags & 2 /* Effect */ ? 128 /* PendingEffect */ : 64 /* PendingComputed */;\n }\n continue;\n }\n if (subFlags & 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & (4 /* Tracking */ | targetFlag))) {\n sub.flags = subFlags | targetFlag | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & targetFlag) && subFlags & 224 /* Propagated */ && isValidLink(link2, sub)) {\n sub.flags = subFlags | targetFlag;\n }\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue;\n }\n while (stack) {\n --stack;\n const dep = subs.dep;\n const depSubs = dep.subs;\n subs = depSubs.prevSub;\n depSubs.prevSub = void 0;\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue top;\n }\n }\n break;\n } while (true);\n },\n /**\n * Prepares the given subscriber to track new dependencies.\n * \n * It resets the subscriber's internal pointers (e.g., depsTail) and\n * sets its flags to indicate it is now tracking dependency links.\n * \n * @param sub - The subscriber to start tracking.\n */\n startTracking(sub) {\n sub.depsTail = void 0;\n sub.flags = sub.flags & ~(8 /* Notified */ | 16 /* Recursed */ | 224 /* Propagated */) | 4 /* Tracking */;\n },\n /**\n * Concludes tracking of dependencies for the specified subscriber.\n * \n * It clears or unlinks any tracked dependency information, then\n * updates the subscriber's flags to indicate tracking is complete.\n * \n * @param sub - The subscriber whose tracking is ending.\n */\n endTracking(sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n const nextDep = depsTail.nextDep;\n if (nextDep !== void 0) {\n clearTracking(nextDep);\n depsTail.nextDep = void 0;\n }\n } else if (sub.deps !== void 0) {\n clearTracking(sub.deps);\n sub.deps = void 0;\n }\n sub.flags &= ~4 /* Tracking */;\n },\n /**\n * Updates the dirty flag for the given subscriber based on its dependencies.\n * \n * If the subscriber has any pending computeds, this function sets the Dirty flag\n * and returns `true`. Otherwise, it clears the PendingComputed flag and returns `false`.\n * \n * @param sub - The subscriber to update.\n * @param flags - The current flag set for this subscriber.\n * @returns `true` if the subscriber is marked as Dirty; otherwise `false`.\n */\n updateDirtyFlag(sub, flags) {\n if (checkDirty(sub.deps)) {\n sub.flags = flags | 32 /* Dirty */;\n return true;\n } else {\n sub.flags = flags & ~64 /* PendingComputed */;\n return false;\n }\n },\n /**\n * Updates the computed subscriber if necessary before its value is accessed.\n * \n * If the subscriber is marked Dirty or PendingComputed, this function runs\n * the provided updateComputed logic and triggers a shallowPropagate for any\n * downstream subscribers if an actual update occurs.\n * \n * @param computed - The computed subscriber to update.\n * @param flags - The current flag set for this subscriber.\n */\n processComputedUpdate(computed2, flags) {\n if (flags & 32 /* Dirty */ || (checkDirty(computed2.deps) ? true : (computed2.flags = flags & ~64 /* PendingComputed */, false))) {\n if (updateComputed(computed2)) {\n const subs = computed2.subs;\n if (subs !== void 0) {\n shallowPropagate(subs);\n }\n }\n }\n },\n /**\n * Ensures all pending internal effects for the given subscriber are processed.\n * \n * This should be called after an effect decides not to re-run itself but may still\n * have dependencies flagged with PendingEffect. If the subscriber is flagged with\n * PendingEffect, this function clears that flag and invokes `notifyEffect` on any\n * related dependencies marked as Effect and Propagated, processing pending effects.\n * \n * @param sub - The subscriber which may have pending effects.\n * @param flags - The current flags on the subscriber to check.\n */\n processPendingInnerEffects(sub, flags) {\n if (flags & 128 /* PendingEffect */) {\n sub.flags = flags & ~128 /* PendingEffect */;\n let link2 = sub.deps;\n do {\n const dep = link2.dep;\n if (\"flags\" in dep && dep.flags & 2 /* Effect */ && dep.flags & 224 /* Propagated */) {\n notifyEffect2(dep);\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n },\n /**\n * Processes queued effect notifications after a batch operation finishes.\n * \n * Iterates through all queued effects, calling notifyEffect on each.\n * If an effect remains partially handled, its flags are updated, and future\n * notifications may be triggered until fully handled.\n */\n processEffectNotifications() {\n while (queuedEffects !== void 0) {\n const effect2 = queuedEffects;\n const depsTail = effect2.depsTail;\n const queuedNext = depsTail.nextDep;\n if (queuedNext !== void 0) {\n depsTail.nextDep = void 0;\n queuedEffects = queuedNext.sub;\n } else {\n queuedEffects = void 0;\n queuedEffectsTail = void 0;\n }\n if (!notifyEffect2(effect2)) {\n effect2.flags &= ~8 /* Notified */;\n }\n }\n }\n };\n function linkNewDep(dep, sub, nextDep, depsTail) {\n const newLink = {\n dep,\n sub,\n nextDep,\n prevSub: void 0,\n nextSub: void 0\n };\n if (depsTail === void 0) {\n sub.deps = newLink;\n } else {\n depsTail.nextDep = newLink;\n }\n if (dep.subs === void 0) {\n dep.subs = newLink;\n } else {\n const oldTail = dep.subsTail;\n newLink.prevSub = oldTail;\n oldTail.nextSub = newLink;\n }\n sub.depsTail = newLink;\n dep.subsTail = newLink;\n return newLink;\n }\n function checkDirty(link2) {\n let stack = 0;\n let dirty;\n top: do {\n dirty = false;\n const dep = link2.dep;\n if (\"flags\" in dep) {\n const depFlags = dep.flags;\n if ((depFlags & (1 /* Computed */ | 32 /* Dirty */)) === (1 /* Computed */ | 32 /* Dirty */)) {\n if (updateComputed(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== void 0) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n } else if ((depFlags & (1 /* Computed */ | 64 /* PendingComputed */)) === (1 /* Computed */ | 64 /* PendingComputed */)) {\n const depSubs = dep.subs;\n if (depSubs.nextSub !== void 0) {\n depSubs.prevSub = link2;\n }\n link2 = dep.deps;\n ++stack;\n continue;\n }\n }\n if (!dirty && link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue;\n }\n if (stack) {\n let sub = link2.sub;\n do {\n --stack;\n const subSubs = sub.subs;\n if (dirty) {\n if (updateComputed(sub)) {\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n shallowPropagate(sub.subs);\n sub = link2.sub;\n } else {\n sub = subSubs.sub;\n }\n continue;\n }\n } else {\n sub.flags &= ~64 /* PendingComputed */;\n }\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n if (link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue top;\n }\n sub = link2.sub;\n } else {\n if ((link2 = subSubs.nextDep) !== void 0) {\n continue top;\n }\n sub = subSubs.sub;\n }\n dirty = false;\n } while (stack);\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link2) {\n do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if ((subFlags & (64 /* PendingComputed */ | 32 /* Dirty */)) === 64 /* PendingComputed */) {\n sub.flags = subFlags | 32 /* Dirty */ | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n }\n link2 = link2.nextSub;\n } while (link2 !== void 0);\n }\n function isValidLink(checkLink, sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n let link2 = sub.deps;\n do {\n if (link2 === checkLink) {\n return true;\n }\n if (link2 === depsTail) {\n break;\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n return false;\n }\n function clearTracking(link2) {\n do {\n const dep = link2.dep;\n const nextDep = link2.nextDep;\n const nextSub = link2.nextSub;\n const prevSub = link2.prevSub;\n if (nextSub !== void 0) {\n nextSub.prevSub = prevSub;\n } else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== void 0) {\n prevSub.nextSub = nextSub;\n } else {\n dep.subs = nextSub;\n }\n if (dep.subs === void 0 && \"deps\" in dep) {\n const depFlags = dep.flags;\n if (!(depFlags & 32 /* Dirty */)) {\n dep.flags = depFlags | 32 /* Dirty */;\n }\n const depDeps = dep.deps;\n if (depDeps !== void 0) {\n link2 = depDeps;\n dep.depsTail.nextDep = nextDep;\n dep.deps = void 0;\n dep.depsTail = void 0;\n continue;\n }\n }\n link2 = nextDep;\n } while (link2 !== void 0);\n }\n}\n\n// src/index.ts\nvar {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects\n} = createReactiveSystem({\n updateComputed(computed2) {\n const prevSub = activeSub;\n activeSub = computed2;\n startTracking(computed2);\n try {\n const oldValue = computed2.currentValue;\n const newValue = computed2.getter(oldValue);\n if (oldValue !== newValue) {\n computed2.currentValue = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(computed2);\n }\n },\n notifyEffect(e) {\n if (\"isScope\" in e) {\n return notifyEffectScope(e);\n } else {\n return notifyEffect(e);\n }\n }\n});\nvar pauseStack = [];\nvar batchDepth = 0;\nvar activeSub;\nvar activeScope;\nfunction startBatch() {\n ++batchDepth;\n}\nfunction endBatch() {\n if (!--batchDepth) {\n processEffectNotifications();\n }\n}\nfunction pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = void 0;\n}\nfunction resumeTracking() {\n activeSub = pauseStack.pop();\n}\nfunction signal(oldValue) {\n return signalGetterSetter.bind({\n currentValue: oldValue,\n subs: void 0,\n subsTail: void 0\n });\n}\nfunction computed(getter) {\n return computedGetter.bind({\n currentValue: void 0,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 1 /* Computed */ | 32 /* Dirty */,\n getter\n });\n}\nfunction effect(fn) {\n const e = {\n fn,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */\n };\n if (activeSub !== void 0) {\n link(e, activeSub);\n } else if (activeScope !== void 0) {\n link(e, activeScope);\n }\n runEffect(e);\n return effectStop.bind(e);\n}\nfunction effectScope(fn) {\n const e = {\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */,\n isScope: true\n };\n runEffectScope(e, fn);\n return effectStop.bind(e);\n}\nfunction runEffect(e) {\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n e.fn();\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n}\nfunction runEffectScope(e, fn) {\n const prevSub = activeScope;\n activeScope = e;\n startTracking(e);\n try {\n fn();\n } finally {\n activeScope = prevSub;\n endTracking(e);\n }\n}\nfunction notifyEffect(e) {\n const flags = e.flags;\n if (flags & 32 /* Dirty */ || flags & 64 /* PendingComputed */ && updateDirtyFlag(e, flags)) {\n runEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n}\nfunction notifyEffectScope(e) {\n const flags = e.flags;\n if (flags & 128 /* PendingEffect */) {\n processPendingInnerEffects(e, e.flags);\n return true;\n }\n return false;\n}\nfunction computedGetter() {\n const flags = this.flags;\n if (flags & (32 /* Dirty */ | 64 /* PendingComputed */)) {\n processComputedUpdate(this, flags);\n }\n if (activeSub !== void 0) {\n link(this, activeSub);\n } else if (activeScope !== void 0) {\n link(this, activeScope);\n }\n return this.currentValue;\n}\nfunction signalGetterSetter(...value) {\n if (value.length) {\n if (this.currentValue !== (this.currentValue = value[0])) {\n const subs = this.subs;\n if (subs !== void 0) {\n propagate(subs);\n if (!batchDepth) {\n processEffectNotifications();\n }\n }\n }\n } else {\n if (activeSub !== void 0) {\n link(this, activeSub);\n }\n return this.currentValue;\n }\n}\nfunction effectStop() {\n startTracking(this);\n endTracking(this);\n}\nexport {\n SubscriberFlags,\n computed,\n createReactiveSystem,\n effect,\n effectScope,\n endBatch,\n pauseTracking,\n resumeTracking,\n signal,\n startBatch\n};\n","import { createReactiveSystem, type Dependency, type Subscriber, SubscriberFlags } from \"alien-signals\";\nimport { isFunction } from \"../typeChecking\";\n\nexport interface Effect extends Subscriber, Dependency {\n /**\n * Effect function. Can return an optional cleanup callback to be invoked before the next fn() call.\n */\n fn(): (() => void) | void;\n\n cleanup?: () => void;\n}\n\nexport interface Computed<T = any> extends Value<T | undefined>, Subscriber {\n getter: (cachedValue?: T) => T;\n equals: EqualityFn<T>;\n}\n\nexport interface Value<T = any> extends Dependency {\n current: T;\n}\n\nexport const {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects,\n} = createReactiveSystem({\n updateComputed(c: Computed): boolean {\n const prevSub = activeSub;\n activeSub = c;\n startTracking(c);\n try {\n const oldValue = c.current;\n const newValue = c.getter(oldValue);\n if (!c.equals(oldValue, newValue)) {\n c.current = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(c);\n }\n },\n notifyEffect(e: Effect) {\n const flags = e.flags;\n if (flags & SubscriberFlags.Dirty || (flags & SubscriberFlags.PendingComputed && updateDirtyFlag(e, flags))) {\n queueEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n },\n});\n\n/*===================================*\\\n|| EFFECTS & TRACKING ||\n\\*===================================*/\n\nexport let activeSub: Subscriber | undefined;\n\nconst PENDING_EFFECTS: Effect[] = [];\n\nlet flushPending = false;\n\nfunction flushEffects(): void {\n if (!flushPending) {\n flushPending = true;\n\n queueMicrotask(() => {\n flushPending = false;\n for (let i = 0; i < PENDING_EFFECTS.length; i++) {\n const e = PENDING_EFFECTS[i];\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n if (e.cleanup) {\n pauseTracking();\n e.cleanup();\n resumeTracking();\n }\n e.cleanup = e.fn() ?? undefined;\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n }\n PENDING_EFFECTS.length = 0;\n });\n }\n}\n\nexport function queueEffect(e: Effect) {\n PENDING_EFFECTS.push(e);\n flushEffects();\n}\n\nexport function stopEffect(this: Effect): void {\n startTracking(this);\n endTracking(this);\n // Cancel it after it receives its current value.\n queueMicrotask(() => {\n PENDING_EFFECTS.splice(PENDING_EFFECTS.indexOf(this), 1);\n if (this.cleanup) {\n this.cleanup();\n }\n });\n}\n\nconst pauseStack: (Subscriber | undefined)[] = [];\n\nexport function pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = undefined;\n}\n\nexport function resumeTracking() {\n activeSub = pauseStack.pop();\n}\n\n/*===================================*\\\n|| API ||\n\\*===================================*/\n\n/* -------------- TYPES --------------- */\n\nconst SIGNAL = Symbol(\"SIGNAL\");\nconst SOURCE = Symbol(\"SOURCE\");\n\n/**\n * A getter that returns the current value held within the signal.\n * If called inside a trackable scope this signal will be tracked as a dependency.\n */\nexport interface Signal<T> {\n (): T;\n}\n\n/**\n * Extends Signal with the ability to pass a value or an updater function to change the Signal's value.\n */\nexport interface Source<T> extends Signal<T> {\n (value: T): void;\n (updater: (value: T) => T): void;\n}\n\nexport type MaybeSignal<T> = Signal<T> | T;\n\nexport type EqualityFn<T> = (current: T, next: T) => boolean;\nexport interface SignalOptions<T> {\n /**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\n equals?: EqualityFn<T>;\n}\n\n/* -------------- PUBLIC API --------------- */\n\nexport function isSource<T>(value: MaybeSignal<T>): value is Source<T> {\n return isFunction(value) && (value as any)._type === SOURCE;\n}\n\nexport function peek<T>(value: MaybeSignal<T>) {\n let result: T;\n pauseTracking();\n result = get(value);\n resumeTracking();\n return result;\n}\n\nexport function get<T>(value: MaybeSignal<T>) {\n if (isFunction(value)) {\n return (value as () => T)();\n } else {\n return value;\n }\n}\n\n/**\n * Function to be invoked for the effect. Can return an optional cleanup function to be called between invocations.\n */\nexport type EffectFn = () => void | (() => void);\n\nexport type UnsubscribeFn = () => void;\n\n/**\n * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.\n * Reactives are tracked by accessing their `value` within the body of the function.\n *\n * NOTE: You must call the unsubscribe function to stop watching for changes.\n * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.\n */\nexport function effect(fn: EffectFn): UnsubscribeFn {\n const e: Effect = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Effect,\n };\n if (activeSub !== undefined) {\n link(e, activeSub);\n }\n queueEffect(e);\n return stopEffect.bind(e);\n}\n\nexport function $<T>(compute: () => MaybeSignal<T>, options?: SignalOptions<T>): Signal<T>;\nexport function $<T>(value: T, options?: SignalOptions<T>): Source<T>;\nexport function $<T>(value: undefined, options?: SignalOptions<T>): Source<T | undefined>;\nexport function $<T>(): Source<T | undefined>;\n\nexport function $<T>(init?: (() => T) | T, options?: SignalOptions<T>) {\n if (isFunction(init)) {\n return _createSignal(init as () => T, options);\n } else if (init === undefined) {\n return _createSource<T | undefined>(undefined, options as SignalOptions<T | undefined>);\n } else {\n return _createSource(init, options);\n }\n}\n\n/* -------------- INTERNAL --------------- */\n\nfunction _createSource<T>(initialValue: T, options?: SignalOptions<T>): Source<T> {\n const value: Value<T> = {\n current: initialValue,\n subs: undefined,\n subsTail: undefined,\n };\n const equals = options?.equals ?? Object.is;\n const signal: Signal<any> = function () {\n if (arguments.length > 0) {\n let next = arguments[0] as T;\n\n if (typeof next === \"function\") {\n next = next(value.current);\n }\n\n if (!equals(value.current, next)) {\n value.current = next;\n const subs = value.subs;\n if (subs !== undefined) {\n propagate(subs);\n processEffectNotifications();\n }\n }\n } else {\n if (activeSub !== undefined) {\n link(value, activeSub);\n }\n return value.current;\n }\n };\n (signal as any)._type = SOURCE;\n\n return signal;\n}\n\nfunction _createSignal<T>(fn: (cachedValue?: T) => T, options?: SignalOptions<T>): Signal<T> {\n if (isFunction(fn) && (fn as any)._type === SIGNAL) {\n if ((fn as any)._type === SOURCE) {\n return (() => fn()) as Signal<T>;\n } else {\n return fn as Signal<T>;\n }\n }\n\n const computed: Computed<T> = {\n current: undefined,\n equals: options?.equals ?? Object.is,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Computed | SubscriberFlags.Dirty,\n getter: (cachedValue?: T) => {\n const returned = fn(cachedValue);\n\n // If a signal is returned, track it and return its value.\n return get(returned);\n },\n };\n const signal: Signal<T> = function () {\n if (arguments.length > 0) {\n throw new Error(\"Signals cannot be set as their values are derived from the sources they depend on.\");\n }\n if (activeSub !== undefined) {\n link(computed, activeSub);\n }\n const flags = computed.flags;\n if (flags & (SubscriberFlags.Dirty | SubscriberFlags.PendingComputed)) {\n processComputedUpdate(computed, flags);\n }\n return computed.current!;\n };\n (signal as any)._type = SIGNAL;\n\n return signal;\n}\n","import { isFunction, isObject, typeOf } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\n// Guarantee unique ID by incrementing a global counter.\nlet idCounter = 1;\nexport function getUniqueId(): string {\n idCounter = (idCounter % Number.MAX_SAFE_INTEGER) + 1;\n return idCounter.toString(36) + Date.now().toString(36);\n}\n\n/*=============================*\\\n|| Object Equality ||\n\\*=============================*/\n\n/**\n * Equality check that passes if both values are the same object.\n * This is the default equality check for states.\n */\nexport function strictEqual(a: any, b: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * Equality check that passes if both values are the same object, or if both are objects or arrays with equal keys and values.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n\n // Must be same type\n const t = typeOf(a);\n if (t !== typeOf(b)) {\n return false;\n }\n\n switch (t) {\n case \"object\":\n // Objects must have same number of keys with strict equal values\n let size = 0;\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n size++;\n }\n return Object.keys(b).length === size;\n case \"array\":\n // Arrays must be the same length with strict equal values\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n case \"map\":\n if (a.size !== b.size) return false;\n for (const key of a.keys()) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n case \"set\":\n if (isFunction(a.symmetricDifference)) {\n return a.symmetricDifference(b).size === 0;\n } else {\n for (const key of a.keys()) {\n if (a[key] !== b.get(key)) return false;\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Equality check that passes if two objects have equal values, even if they are not the same object.\n */\n// NOTE: This code is https://github.com/epoberezkin/fast-deep-equal licensed under MIT.\n// I imported it because I couldn't get the old school module to play nice with my modern ES code as an external dependency.\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n for (i of a.entries()) if (!deepEqual(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = (a as any).length;\n if (length != (b as any).length) return false;\n for (i = length; i-- !== 0; ) if ((a as any)[i] !== (b as any)[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n var key = keys[i];\n\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n}\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n}\n\n/*=============================*\\\n|| Misc Utils ||\n\\*=============================*/\n\n/**\n * Takes any string and returns an OKLCH color.\n */\nexport function okhash(value: string) {\n let hue = 0;\n for (let i = 0; i < value.length; i++) {\n hue = (hue + value.charCodeAt(i) * 10) % 360;\n }\n return `oklch(0.68 0.15 ${hue}deg)`;\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","export type Env = \"production\" | \"development\";\n\nlet env: Env = \"production\";\n\n/**\n * Gets the current environment value.\n */\nexport function getEnv(): Env {\n return env;\n}\n\n/**\n * Sets the environment value. Affects which log messages will print and how much debugging info is included in the DOM.\n */\nexport function setEnv(value: Env) {\n env = value;\n}\n","import { isString } from \"../typeChecking\";\nimport { createMatcher, noOp, okhash, type MatcherFunction } from \"../utils\";\nimport { getEnv, type Env } from \"./env\";\nimport { get, type MaybeSignal } from \"./signals\";\n\nexport interface LogLevels {\n info: boolean | Env;\n log: boolean | Env;\n warn: boolean | Env;\n error: boolean | Env;\n}\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): void;\n}\n\nexport interface LoggerOptions {\n /**\n * Unique ID to print with logs. Makes it easier to track down messages from specific view instances.\n */\n uid?: string;\n\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n}\n\nexport interface LoggerErrorContext {\n error: Error;\n loggerName: string;\n uid?: string;\n}\n\nlet levels: LogLevels = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n};\nlet match: MatcherFunction = createMatcher(\"*,-Dolla.*\");\nlet crashListeners: ((context: LoggerErrorContext) => void)[] = [];\n\nexport function onLoggerCrash(listener: (context: LoggerErrorContext) => void) {\n crashListeners.push(listener);\n\n return function cancel() {\n crashListeners.splice(crashListeners.indexOf(listener), 1);\n };\n}\n\nexport function createLogger(name: MaybeSignal<string>, options?: LoggerOptions): Logger {\n const _console = options?.console ?? _getDefaultConsole();\n\n const bind = (method: keyof LogLevels) => {\n if (levels[method] === false || (isString(levels[method]) && levels[method] !== getEnv()) || !match(get(name))) {\n return noOp;\n } else {\n let label = `%c${name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console[method].bind(\n _console,\n label,\n `color:${okhash(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n };\n\n return {\n get info() {\n return bind(\"info\");\n },\n get log() {\n return bind(\"log\");\n },\n get warn() {\n return bind(\"warn\");\n },\n get error() {\n return bind(\"error\");\n },\n crash(error: Error) {\n const ctx: LoggerErrorContext = {\n error,\n loggerName: get(name),\n uid: options?.uid,\n };\n\n for (const listener of crashListeners) {\n listener(ctx);\n }\n },\n };\n}\n\nexport function setLogFilter(filter: string | RegExp) {\n match = createMatcher(filter);\n}\n\nexport function setLogLevels(options: Partial<LogLevels>) {\n for (const key in options) {\n const value = options[key as keyof LogLevels];\n if (value) {\n levels[key as keyof LogLevels] = value;\n }\n }\n}\n\nfunction _getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n"],"names":["SubscriberFlags","SubscriberFlags2","createReactiveSystem","updateComputed","notifyEffect2","queuedEffects","queuedEffectsTail","dep","sub","currentDep","nextDep","depLastSub","isValidLink","linkNewDep","link2","targetFlag","subs","stack","top","subFlags","subSubs","depSubs","depsTail","clearTracking","flags","checkDirty","computed2","shallowPropagate","effect2","queuedNext","newLink","oldTail","dirty","depFlags","checkLink","nextSub","prevSub","depDeps","link","propagate","updateDirtyFlag","startTracking","endTracking","processEffectNotifications","processComputedUpdate","processPendingInnerEffects","oldValue","newValue","notifyEffectScope","notifyEffect","runEffect","c","activeSub","queueEffect","PENDING_EFFECTS","flushPending","flushEffects","i","e","pauseTracking","resumeTracking","stopEffect","pauseStack","SIGNAL","SOURCE","peek","value","result","get","isFunction","effect","fn","$","init","options","_createSignal","_createSource","initialValue","equals","signal","next","computed","cachedValue","returned","noOp","idCounter","getUniqueId","strictEqual","a","b","shallowEqual","t","typeOf","size","key","deepEqual","length","keys","omit","object","newObject","okhash","hue","createMatcher","pattern","matchers","parts","p","part","section","name","positive","negative","env","getEnv","setEnv","levels","match","crashListeners","onLoggerCrash","listener","createLogger","_console","_getDefaultConsole","bind","method","isString","label","error","ctx","setLogFilter","filter","setLogLevels"],"mappings":";AACA,IAAIA,IAAmC,kBAACC,OACtCA,EAAiBA,EAAiB,WAAc,CAAC,IAAI,YACrDA,EAAiBA,EAAiB,SAAY,CAAC,IAAI,UACnDA,EAAiBA,EAAiB,WAAc,CAAC,IAAI,YACrDA,EAAiBA,EAAiB,WAAc,CAAC,IAAI,YACrDA,EAAiBA,EAAiB,WAAc,EAAE,IAAI,YACtDA,EAAiBA,EAAiB,QAAW,EAAE,IAAI,SACnDA,EAAiBA,EAAiB,kBAAqB,EAAE,IAAI,mBAC7DA,EAAiBA,EAAiB,gBAAmB,GAAG,IAAI,iBAC5DA,EAAiBA,EAAiB,aAAgB,GAAG,IAAI,cAClDA,IACND,KAAmB,CAAA,CAAE;AACxB,SAASE,EAAqB;AAAA,EAC5B,gBAAAC;AAAA,EACA,cAAcC;AAChB,GAAG;AACD,MAAIC,GACAC;AACJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQL,KAAKC,GAAKC,GAAK;AACb,YAAMC,IAAaD,EAAI;AACvB,UAAIC,MAAe,UAAUA,EAAW,QAAQF;AAC9C;AAEF,YAAMG,IAAUD,MAAe,SAASA,EAAW,UAAUD,EAAI;AACjE,UAAIE,MAAY,UAAUA,EAAQ,QAAQH,GAAK;AAC7C,QAAAC,EAAI,WAAWE;AACf;AAAA,MACR;AACM,YAAMC,IAAaJ,EAAI;AACvB,UAAI,EAAAI,MAAe,UAAUA,EAAW,QAAQH,KAAOI,EAAYD,GAAYH,CAAG;AAGlF,eAAOK,EAAWN,GAAKC,GAAKE,GAASD,CAAU;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUD,UAAUK,GAAO;AACf,UAAIC,IAAa,IACbC,IAAOF,GACPG,IAAQ;AACZ,MAAAC,EAAK,IAAG;AACN,cAAMV,IAAMM,EAAM,KACZK,IAAWX,EAAI;AACrB,YAAI,EAAEW,IAAY,SAAkEX,EAAI,QAAQW,IAAWJ,IAAa,GAAkB,OAASI,IAAW,MAAqB,EAAEA,IAAW,OAAsBX,EAAI,QAAQW,IAAW,MAAqBJ,IAAa,GAAkB,OAAS,EAAEI,IAAW,QAAyBP,EAAYE,GAAON,CAAG,MAAMA,EAAI,QAAQW,IAAW,KAAoBJ,IAAa,GAAkBP,EAAI,SAAS,SAAS;AAC1c,gBAAMY,IAAUZ,EAAI;AACpB,cAAIY,MAAY,QAAQ;AACtB,YAAIA,EAAQ,YAAY,UACtBA,EAAQ,UAAUJ,GAClBF,IAAQE,IAAOI,GACfL,IAAa,IACb,EAAEE,MAEFH,IAAQM,GACRL,IAAaI,IAAW,IAAiB,MAA0B;AAErE;AAAA,UACZ;AACU,UAAIA,IAAW,MACTb,MAAsB,SACxBA,EAAkB,SAAS,UAAUE,EAAI,OAEzCH,IAAgBG,GAElBF,IAAoBE;AAAA,QAEvB,MAAM,CAAMW,KAAY,IAAmBJ,KAUjC,EAAEI,IAAWJ,MAAeI,IAAW,OAAwBP,EAAYE,GAAON,CAAG,MAC9FA,EAAI,QAAQW,IAAWJ,MAVvBP,EAAI,QAAQW,IAAWJ,IAAa,IAC/BI,IAAY,QAAwC,MACnDb,MAAsB,SACxBA,EAAkB,SAAS,UAAUE,EAAI,OAEzCH,IAAgBG,GAElBF,IAAoBE;AAKxB,aAAKM,IAAQE,EAAK,aAAa,QAAQ;AACrC,UAAAA,IAAOF,GACPC,IAAaE,IAAQ,KAA2B;AAChD;AAAA,QACV;AACQ,eAAOA,KAAO;AACZ,YAAEA;AAEF,gBAAMI,IADML,EAAK,IACG;AAGpB,cAFAA,IAAOK,EAAQ,SACfA,EAAQ,UAAU,SACbP,IAAQE,EAAK,aAAa,QAAQ;AACrC,YAAAA,IAAOF,GACPC,IAAaE,IAAQ,KAA2B;AAChD,qBAASC;AAAA,UACrB;AAAA,QACA;AACQ;AAAA,MACR,SAAe;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASD,cAAcV,GAAK;AACjB,MAAAA,EAAI,WAAW,QACfA,EAAI,QAAQA,EAAI,QAAQ,OAAiE;AAAA,IAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASD,YAAYA,GAAK;AACf,YAAMc,IAAWd,EAAI;AACrB,UAAIc,MAAa,QAAQ;AACvB,cAAMZ,IAAUY,EAAS;AACzB,QAAIZ,MAAY,WACda,EAAcb,CAAO,GACrBY,EAAS,UAAU;AAAA,MAE7B,MAAa,CAAId,EAAI,SAAS,WACtBe,EAAcf,EAAI,IAAI,GACtBA,EAAI,OAAO;AAEb,MAAAA,EAAI,SAAS;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWD,gBAAgBA,GAAKgB,GAAO;AAC1B,aAAIC,EAAWjB,EAAI,IAAI,KACrBA,EAAI,QAAQgB,IAAQ,IACb,OAEPhB,EAAI,QAAQgB,IAAQ,KACb;AAAA,IAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWD,sBAAsBE,GAAWF,GAAO;AACtC,WAAIA,IAAQ,OAAmBC,EAAWC,EAAU,IAAI,MAAYA,EAAU,QAAQF,IAAQ,KAA2B,SACnHrB,EAAeuB,CAAS,GAAG;AAC7B,cAAMV,IAAOU,EAAU;AACvB,QAAIV,MAAS,UACXW,EAAiBX,CAAI;AAAA,MAEjC;AAAA,IAEK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYD,2BAA2BR,GAAKgB,GAAO;AACrC,UAAIA,IAAQ,KAAyB;AACnC,QAAAhB,EAAI,QAAQgB,IAAQ;AACpB,YAAIV,IAAQN,EAAI;AAChB,WAAG;AACD,gBAAMD,IAAMO,EAAM;AAClB,UAAI,WAAWP,KAAOA,EAAI,QAAQ,KAAkBA,EAAI,QAAQ,OAC9DH,EAAcG,CAAG,GAEnBO,IAAQA,EAAM;AAAA,QACf,SAAQA,MAAU;AAAA,MAC3B;AAAA,IACK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQD,6BAA6B;AAC3B,aAAOT,MAAkB,UAAQ;AAC/B,cAAMuB,IAAUvB,GACViB,IAAWM,EAAQ,UACnBC,IAAaP,EAAS;AAC5B,QAAIO,MAAe,UACjBP,EAAS,UAAU,QACnBjB,IAAgBwB,EAAW,QAE3BxB,IAAgB,QAChBC,IAAoB,SAEjBF,EAAcwB,CAAO,MACxBA,EAAQ,SAAS;AAAA,MAE3B;AAAA,IACA;AAAA,EACG;AACD,WAASf,EAAWN,GAAKC,GAAKE,GAASY,GAAU;AAC/C,UAAMQ,IAAU;AAAA,MACd,KAAAvB;AAAA,MACA,KAAAC;AAAA,MACA,SAAAE;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACV;AAMD,QALIY,MAAa,SACfd,EAAI,OAAOsB,IAEXR,EAAS,UAAUQ,GAEjBvB,EAAI,SAAS;AACf,MAAAA,EAAI,OAAOuB;AAAA,SACN;AACL,YAAMC,IAAUxB,EAAI;AACpB,MAAAuB,EAAQ,UAAUC,GAClBA,EAAQ,UAAUD;AAAA,IACxB;AACI,WAAAtB,EAAI,WAAWsB,GACfvB,EAAI,WAAWuB,GACRA;AAAA,EACX;AACE,WAASL,EAAWX,GAAO;AACzB,QAAIG,IAAQ,GACRe;AACJ,IAAAd,EAAK,IAAG;AACN,MAAAc,IAAQ;AACR,YAAMzB,IAAMO,EAAM;AAClB,UAAI,WAAWP,GAAK;AAClB,cAAM0B,IAAW1B,EAAI;AACrB,aAAK0B,IAAY,QAAyC;AACxD,cAAI9B,EAAeI,CAAG,GAAG;AACvB,kBAAMS,IAAOT,EAAI;AACjB,YAAIS,EAAK,YAAY,UACnBW,EAAiBX,CAAI,GAEvBgB,IAAQ;AAAA,UACpB;AAAA,oBACoBC,IAAY,QAAmD,IAA8C;AACvH,gBAAMZ,IAAUd,EAAI;AACpB,UAAIc,EAAQ,YAAY,WACtBA,EAAQ,UAAUP,IAEpBA,IAAQP,EAAI,MACZ,EAAEU;AACF;AAAA,QACV;AAAA,MACA;AACM,UAAI,CAACe,KAASlB,EAAM,YAAY,QAAQ;AACtC,QAAAA,IAAQA,EAAM;AACd;AAAA,MACR;AACM,UAAIG,GAAO;AACT,YAAIT,IAAMM,EAAM;AAChB,WAAG;AACD,YAAEG;AACF,gBAAMG,IAAUZ,EAAI;AACpB,cAAIwB;AACF,gBAAI7B,EAAeK,CAAG,GAAG;AACvB,eAAKM,IAAQM,EAAQ,aAAa,UAChCA,EAAQ,UAAU,QAClBO,EAAiBnB,EAAI,IAAI,GACzBA,IAAMM,EAAM,OAEZN,IAAMY,EAAQ;AAEhB;AAAA,YACd;AAAA;AAEY,YAAAZ,EAAI,SAAS;AAEf,eAAKM,IAAQM,EAAQ,aAAa,QAAQ;AAExC,gBADAA,EAAQ,UAAU,QACdN,EAAM,YAAY,QAAQ;AAC5B,cAAAA,IAAQA,EAAM;AACd,uBAASI;AAAA,YACvB;AACY,YAAAV,IAAMM,EAAM;AAAA,UACxB,OAAiB;AACL,iBAAKA,IAAQM,EAAQ,aAAa;AAChC,uBAASF;AAEX,YAAAV,IAAMY,EAAQ;AAAA,UAC1B;AACU,UAAAY,IAAQ;AAAA,QAClB,SAAiBf;AAAA,MACjB;AACM,aAAOe;AAAA,IACb,SAAa;AAAA,EACb;AACE,WAASL,EAAiBb,GAAO;AAC/B,OAAG;AACD,YAAMN,IAAMM,EAAM,KACZK,IAAWX,EAAI;AACrB,OAAKW,IAAY,QAAgD,OAC/DX,EAAI,QAAQW,IAAW,KAAiB,IACnCA,IAAY,QAAwC,MACnDb,MAAsB,SACxBA,EAAkB,SAAS,UAAUE,EAAI,OAEzCH,IAAgBG,GAElBF,IAAoBE,KAGxBM,IAAQA,EAAM;AAAA,IACf,SAAQA,MAAU;AAAA,EACvB;AACE,WAASF,EAAYsB,GAAW1B,GAAK;AACnC,UAAMc,IAAWd,EAAI;AACrB,QAAIc,MAAa,QAAQ;AACvB,UAAIR,IAAQN,EAAI;AAChB,SAAG;AACD,YAAIM,MAAUoB;AACZ,iBAAO;AAET,YAAIpB,MAAUQ;AACZ;AAEF,QAAAR,IAAQA,EAAM;AAAA,MACf,SAAQA,MAAU;AAAA,IACzB;AACI,WAAO;AAAA,EACX;AACE,WAASS,EAAcT,GAAO;AAC5B,OAAG;AACD,YAAMP,IAAMO,EAAM,KACZJ,IAAUI,EAAM,SAChBqB,IAAUrB,EAAM,SAChBsB,IAAUtB,EAAM;AAWtB,UAVIqB,MAAY,SACdA,EAAQ,UAAUC,IAElB7B,EAAI,WAAW6B,GAEbA,MAAY,SACdA,EAAQ,UAAUD,IAElB5B,EAAI,OAAO4B,GAET5B,EAAI,SAAS,UAAU,UAAUA,GAAK;AACxC,cAAM0B,IAAW1B,EAAI;AACrB,QAAM0B,IAAW,OACf1B,EAAI,QAAQ0B,IAAW;AAEzB,cAAMI,IAAU9B,EAAI;AACpB,YAAI8B,MAAY,QAAQ;AACtB,UAAAvB,IAAQuB,GACR9B,EAAI,SAAS,UAAUG,GACvBH,EAAI,OAAO,QACXA,EAAI,WAAW;AACf;AAAA,QACV;AAAA,MACA;AACM,MAAAO,IAAQJ;AAAA,IACT,SAAQI,MAAU;AAAA,EACvB;AACA;AAGA,IAAI;AAAA,EACJ,MAAEwB;AAAAA,EACF,WAAEC;AAAAA,EACF,iBAAEC;AAAAA,EACF,eAAEC;AAAAA,EACF,aAAEC;AAAAA,EACF,4BAAEC;AAAAA,EACF,uBAAEC;AAAAA,EACAC,4BAAAA;AACF,IAAI3C,EAAqB;AAAA,EACvB,eAAewB,GAAW;AAGxBe,IAAAA,EAAcf,CAAS;AACvB,QAAI;AACF,YAAMoB,IAAWpB,EAAU,cACrBqB,IAAWrB,EAAU,OAAOoB,CAAQ;AAC1C,aAAIA,MAAaC,KACfrB,EAAU,eAAeqB,GAClB,MAEF;AAAA,IACb,UAAc;AAERL,MAAAA,EAAYhB,CAAS;AAAA,IAC3B;AAAA,EACG;AAAA,EACD,aAAa,GAAG;AACd,WAAI,aAAa,IACRsB,EAAkB,CAAC,IAEnBC,EAAa,CAAC;AAAA,EAE3B;AACA,CAAC;AAiED,SAASC,EAAU,GAAG;AAGpBT,EAAAA,EAAc,CAAC;AACf,MAAI;AACF,MAAE,GAAI;AAAA,EACV,UAAY;AAERC,IAAAA,EAAY,CAAC;AAAA,EACjB;AACA;AAYA,SAASO,EAAa,GAAG;AACvB,QAAMzB,IAAQ,EAAE;AAChB,SAAIA,IAAQ,MAAkBA,IAAQ,MAA4BgB,EAAgB,GAAGhB,CAAK,IACxF0B,EAAU,CAAC,IAEXL,EAA2B,GAAG,EAAE,KAAK,GAEhC;AACT;AACA,SAASG,EAAkB,GAAG;AAE5B,SADc,EAAE,QACJ,OACVH,EAA2B,GAAG,EAAE,KAAK,GAC9B,MAEF;AACT;AClgBa,MAAA;AAAA,EACX,MAAAP;AAAA,EACA,WAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,4BAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,4BAAAC;AACF,IAAI3C,EAAqB;AAAA,EACvB,eAAeiD,GAAsB;AACnC,UAAMf,IAAUgB;AACJ,IAAAA,IAAAD,GACZV,EAAcU,CAAC;AACX,QAAA;AACF,YAAML,IAAWK,EAAE,SACbJ,IAAWI,EAAE,OAAOL,CAAQ;AAClC,aAAKK,EAAE,OAAOL,GAAUC,CAAQ,IAIzB,MAHLI,EAAE,UAAUJ,GACL;AAAA,IAEF,UACP;AACY,MAAAK,IAAAhB,GACZM,EAAYS,CAAC;AAAA,IAAA;AAAA,EAEjB;AAAA,EACA,aAAa,GAAW;AACtB,UAAM3B,IAAQ,EAAE;AACZ,WAAAA,IAAQxB,EAAgB,SAAUwB,IAAQxB,EAAgB,mBAAmBwC,EAAgB,GAAGhB,CAAK,IACvG6B,EAAY,CAAC,IAEcR,GAAA,GAAG,EAAE,KAAK,GAEhC;AAAA,EAAA;AAEX,CAAC;AAMU,IAAAO;AAEX,MAAME,IAA4B,CAAC;AAEnC,IAAIC,IAAe;AAEnB,SAASC,KAAqB;AAC5B,EAAKD,MACYA,IAAA,IAEf,eAAe,MAAM;AACJ,IAAAA,IAAA;AACf,aAASE,IAAI,GAAGA,IAAIH,EAAgB,QAAQG,KAAK;AACzC,YAAAC,IAAIJ,EAAgBG,CAAC,GACrBrB,IAAUgB;AACJ,MAAAA,IAAAM,GACZjB,EAAciB,CAAC;AACX,UAAA;AACF,QAAIA,EAAE,YACUC,EAAA,GACdD,EAAE,QAAQ,GACKE,EAAA,IAEfF,EAAA,UAAUA,EAAE,GAAA,KAAQ;AAAA,MAAA,UACtB;AACY,QAAAN,IAAAhB,GACZM,EAAYgB,CAAC;AAAA,MAAA;AAAA,IACf;AAEF,IAAAJ,EAAgB,SAAS;AAAA,EAAA,CAC1B;AAEL;AAEO,SAASD,EAAY,GAAW;AACrC,EAAAC,EAAgB,KAAK,CAAC,GACTE,GAAA;AACf;AAEO,SAASK,KAA+B;AAC7C,EAAApB,EAAc,IAAI,GAClBC,EAAY,IAAI,GAEhB,eAAe,MAAM;AACnB,IAAAY,EAAgB,OAAOA,EAAgB,QAAQ,IAAI,GAAG,CAAC,GACnD,KAAK,WACP,KAAK,QAAQ;AAAA,EACf,CACD;AACH;AAEA,MAAMQ,IAAyC,CAAC;AAEzC,SAASH,IAAgB;AAC9B,EAAAG,EAAW,KAAKV,CAAS,GACbA,IAAA;AACd;AAEO,SAASQ,IAAiB;AAC/B,EAAAR,IAAYU,EAAW,IAAI;AAC7B;AAQA,MAAMC,IAAS,OAAO,QAAQ,GACxBC,IAAS,OAAO,QAAQ;AAkCvB,SAASC,GAAQC,GAAuB;AACzC,MAAAC;AACU,SAAAR,EAAA,GACdQ,IAASC,EAAIF,CAAK,GACHN,EAAA,GACRO;AACT;AAEO,SAASC,EAAOF,GAAuB;AACxC,SAAAG,EAAWH,CAAK,IACVA,EAAkB,IAEnBA;AAEX;AAgBO,SAASI,GAAOC,GAA6B;AAClD,QAAMb,IAAY;AAAA,IAChB,IAAAa;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAOvE,EAAgB;AAAA,EACzB;AACA,SAAIoD,MAAc,UAChBd,EAAKoB,GAAGN,CAAS,GAEnBC,EAAYK,CAAC,GACNG,GAAW,KAAKH,CAAC;AAC1B;AAOgB,SAAAc,GAAKC,GAAsBC,GAA4B;AACjE,SAAAL,EAAWI,CAAI,IACVE,GAAcF,GAAiBC,CAAO,IAEtCE,EADEH,MAAS,SACkB,SAEfA,GAF0BC,CAAuC;AAI1F;AAIA,SAASE,EAAiBC,GAAiBH,GAAuC;AAChF,QAAMR,IAAkB;AAAA,IACtB,SAASW;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,GACMC,KAASJ,KAAA,gBAAAA,EAAS,WAAU,OAAO,IACnCK,IAAsB,WAAY;AAClC,QAAA,UAAU,SAAS,GAAG;AACpB,UAAAC,IAAO,UAAU,CAAC;AAMtB,UAJI,OAAOA,KAAS,eACXA,IAAAA,EAAKd,EAAM,OAAO,IAGvB,CAACY,EAAOZ,EAAM,SAASc,CAAI,GAAG;AAChC,QAAAd,EAAM,UAAUc;AAChB,cAAMhE,IAAOkD,EAAM;AACnB,QAAIlD,MAAS,WACXuB,EAAUvB,CAAI,GACa2B,EAAA;AAAA,MAC7B;AAAA,IACF;AAEA,aAAIS,MAAc,UAChBd,EAAK4B,GAAOd,CAAS,GAEhBc,EAAM;AAAA,EAEjB;AACC,SAAAa,EAAe,QAAQf,GAEjBe;AACT;AAEA,SAASJ,GAAiBJ,GAA4BG,GAAuC;AAC3F,MAAIL,EAAWE,CAAE,KAAMA,EAAW,UAAUR;AACrC,WAAAQ,EAAW,UAAUP,IAChB,MAAMO,EAAG,IAEVA;AAIX,QAAMU,IAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,SAAQP,KAAA,gBAAAA,EAAS,WAAU,OAAO;AAAA,IAClC,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO1E,EAAgB,WAAWA,EAAgB;AAAA,IAClD,QAAQ,CAACkF,MAAoB;AACrB,YAAAC,IAAWZ,EAAGW,CAAW;AAG/B,aAAOd,EAAIe,CAAQ;AAAA,IAAA;AAAA,EAEvB,GACMJ,IAAoB,WAAY;AAChC,QAAA,UAAU,SAAS;AACf,YAAA,IAAI,MAAM,oFAAoF;AAEtG,IAAI3B,MAAc,UAChBd,EAAK2C,GAAU7B,CAAS;AAE1B,UAAM5B,IAAQyD,EAAS;AACvB,WAAIzD,KAASxB,EAAgB,QAAQA,EAAgB,oBACnD4C,EAAsBqC,GAAUzD,CAAK,GAEhCyD,EAAS;AAAA,EAClB;AACC,SAAAF,EAAe,QAAQhB,GAEjBgB;AACT;AC9SO,MAAMK,KAAO,MAAM;AAAC;AAG3B,IAAIC,IAAY;AACT,SAASC,KAAsB;AACvB,SAAAD,IAAAA,IAAY,OAAO,mBAAoB,GAC7CA,EAAU,SAAS,EAAE,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AACxD;AAUgB,SAAAE,GAAYC,GAAQC,GAAiB;AAC5C,SAAA,OAAO,GAAGD,GAAGC,CAAC;AACvB;AAKgB,SAAAC,GAAaF,GAAQC,GAAiB;AACpD,MAAI,OAAO,GAAGD,GAAGC,CAAC,EAAU,QAAA;AAGtB,QAAAE,IAAIC,EAAOJ,CAAC;AACd,MAAAG,MAAMC,EAAOH,CAAC;AACT,WAAA;AAGT,UAAQE,GAAG;AAAA,IACT,KAAK;AAEH,UAAIE,IAAO;AACX,iBAAWC,KAAON,GAAG;AACnB,YAAIA,EAAEM,CAAG,MAAML,EAAEK,CAAG,EAAU,QAAA;AAC9B,QAAAD;AAAA,MAAA;AAEF,aAAO,OAAO,KAAKJ,CAAC,EAAE,WAAWI;AAAA,IACnC,KAAK;AAEH,UAAIL,EAAE,WAAWC,EAAE,OAAe,QAAA;AAClC,eAAShC,IAAI,GAAGA,IAAI+B,EAAE,QAAQ/B;AAC5B,YAAI+B,EAAE/B,CAAC,MAAMgC,EAAEhC,CAAC,EAAU,QAAA;AAErB,aAAA;AAAA,IACT,KAAK;AACH,UAAI+B,EAAE,SAASC,EAAE,KAAa,QAAA;AACnB,iBAAAK,KAAON,EAAE;AAClB,YAAIA,EAAEM,CAAG,MAAML,EAAEK,CAAG,EAAU,QAAA;AAEzB,aAAA;AAAA,IACT,KAAK;AACC,UAAAzB,EAAWmB,EAAE,mBAAmB;AAClC,eAAOA,EAAE,oBAAoBC,CAAC,EAAE,SAAS;AAE9B,iBAAAK,KAAON,EAAE;AAClB,YAAIA,EAAEM,CAAG,MAAML,EAAE,IAAIK,CAAG,EAAU,QAAA;AAE7B,aAAA;AAAA,EACT;AAGG,SAAA;AACT;AAOgB,SAAAC,EAAUP,GAAQC,GAAiB;AAC7C,MAAAD,MAAMC,EAAU,QAAA;AAEpB,MAAID,KAAKC,KAAK,OAAOD,KAAK,YAAY,OAAOC,KAAK,UAAU;AAC1D,QAAID,EAAE,gBAAgBC,EAAE,YAAoB,QAAA;AAE5C,QAAIO,GAAQvC,GAAGwC;AACX,QAAA,MAAM,QAAQT,CAAC,GAAG;AAEhB,UADJQ,IAASR,EAAE,QACPQ,KAAUP,EAAE,OAAe,QAAA;AAC/B,WAAKhC,IAAIuC,GAAQvC,QAAQ,SAAS,CAACsC,EAAUP,EAAE/B,CAAC,GAAGgC,EAAEhC,CAAC,CAAC,EAAU,QAAA;AAC1D,aAAA;AAAA,IAAA;AAGL,QAAA+B,aAAa,OAAOC,aAAa,KAAK;AACxC,UAAID,EAAE,SAASC,EAAE,KAAa,QAAA;AAC9B,WAAKhC,KAAK+B,EAAE,QAAQ,EAAO,KAAA,CAACC,EAAE,IAAIhC,EAAE,CAAC,CAAC,EAAU,QAAA;AAChD,WAAKA,KAAK+B,EAAE,QAAW,EAAA,KAAI,CAACO,EAAUtC,EAAE,CAAC,GAAGgC,EAAE,IAAIhC,EAAE,CAAC,CAAC,CAAC,EAAU,QAAA;AAC1D,aAAA;AAAA,IAAA;AAGL,QAAA+B,aAAa,OAAOC,aAAa,KAAK;AACxC,UAAID,EAAE,SAASC,EAAE,KAAa,QAAA;AAC9B,WAAKhC,KAAK+B,EAAE,QAAQ,EAAO,KAAA,CAACC,EAAE,IAAIhC,EAAE,CAAC,CAAC,EAAU,QAAA;AACzC,aAAA;AAAA,IAAA;AAGT,QAAI,YAAY,OAAO+B,CAAC,KAAK,YAAY,OAAOC,CAAC,GAAG;AAE9C,UADJO,IAAUR,EAAU,QAChBQ,KAAWP,EAAU,OAAe,QAAA;AACnC,WAAAhC,IAAIuC,GAAQvC,QAAQ,IAAK,KAAK+B,EAAU/B,CAAC,MAAOgC,EAAUhC,CAAC,EAAU,QAAA;AACnE,aAAA;AAAA,IAAA;AAGL,QAAA+B,EAAE,gBAAgB,OAAe,QAAAA,EAAE,WAAWC,EAAE,UAAUD,EAAE,UAAUC,EAAE;AACxE,QAAAD,EAAE,YAAY,OAAO,UAAU,gBAAgBA,EAAE,QAAA,MAAcC,EAAE,QAAQ;AACzE,QAAAD,EAAE,aAAa,OAAO,UAAU,iBAAiBA,EAAE,SAAA,MAAeC,EAAE,SAAS;AAIjF,QAFOQ,IAAA,OAAO,KAAKT,CAAC,GACpBQ,IAASC,EAAK,QACVD,MAAW,OAAO,KAAKP,CAAC,EAAE,OAAe,QAAA;AAE7C,SAAKhC,IAAIuC,GAAQvC,QAAQ,SAAS,CAAC,OAAO,UAAU,eAAe,KAAKgC,GAAGQ,EAAKxC,CAAC,CAAC,EAAU,QAAA;AAEvF,SAAAA,IAAIuC,GAAQvC,QAAQ,KAAK;AACxB,UAAAqC,IAAMG,EAAKxC,CAAC;AAEZ,UAAA,CAACsC,EAAUP,EAAEM,CAAG,GAAGL,EAAEK,CAAG,CAAC,EAAU,QAAA;AAAA,IAAA;AAGlC,WAAA;AAAA,EAAA;AAIF,SAAAN,MAAMA,KAAKC,MAAMA;AAC1B;AAmCgB,SAAAS,GAAiCD,GAAmBE,GAA6B;AAC/F,QAAMC,IAA8B,CAAC;AAErC,aAAWN,KAAOK;AAChB,IAAKF,EAAK,SAASH,CAAG,MACVM,EAAAN,CAAG,IAAIK,EAAOL,CAAG;AAIxB,SAAAM;AACT;AASO,SAASC,GAAOnC,GAAe;AACpC,MAAIoC,IAAM;AACV,WAAS,IAAI,GAAG,IAAIpC,EAAM,QAAQ;AAChC,IAAAoC,KAAOA,IAAMpC,EAAM,WAAW,CAAC,IAAI,MAAM;AAE3C,SAAO,mBAAmBoC,CAAG;AAC/B;AASO,SAASC,EAAcC,GAA2C;AACvE,MAAIA,aAAmB;AACrB,WAAO,CAACtC,MAAkBsC,EAAQ,KAAKtC,CAAK;AAG9C,QAAMuC,IAA+D;AAAA,IACnE,UAAU,CAAC;AAAA,IACX,UAAU,CAAA;AAAA,EACZ,GAEMC,IAAQF,EACX,MAAM,GAAG,EACT,IAAI,CAACG,MAAMA,EAAE,KAAM,CAAA,EACnB,OAAO,CAACA,MAAMA,MAAM,EAAE;AAEzB,WAASC,KAAQF,GAAO;AACtB,QAAIG,IAAmC;AAEnC,IAAAD,EAAK,WAAW,GAAG,MACXC,IAAA,YACHD,IAAAA,EAAK,MAAM,CAAC,IAGjBA,MAAS,MACFH,EAAAI,CAAO,EAAE,KAAK,WAAY;AAC1B,aAAA;AAAA,IAAA,CACR,IACQD,EAAK,SAAS,GAAG,IAC1BH,EAASI,CAAO,EAAE,KAAK,SAAU3C,GAAO;AAC/B,aAAAA,EAAM,WAAW0C,EAAK,MAAM,GAAGA,EAAK,SAAS,CAAC,CAAC;AAAA,IAAA,CACvD,IAEDH,EAASI,CAAO,EAAE,KAAK,SAAU3C,GAAO;AACtC,aAAOA,MAAU0C;AAAA,IAAA,CAClB;AAAA,EACH;AAGF,SAAO,SAAUE,GAAc;AACvB,UAAA,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaP;AAQ3B,WALA,EAAAO,EAAS,KAAK,CAACzC,MAAOA,EAAGuC,CAAI,CAAC,KAK9BC,EAAS,SAAS,KAAK,CAACA,EAAS,KAAK,CAACxC,MAAOA,EAAGuC,CAAI,CAAC;AAAA,EAK5D;AACF;AC3PA,IAAIG,IAAW;AAKR,SAASC,KAAc;AACrB,SAAAD;AACT;AAKO,SAASE,GAAOjD,GAAY;AAC3B,EAAA+C,IAAA/C;AACR;ACsBA,IAAIkD,IAAoB;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT,GACIC,IAAyBd,EAAc,YAAY,GACnDe,IAA4D,CAAC;AAE1D,SAASC,GAAcC,GAAiD;AAC7E,SAAAF,EAAe,KAAKE,CAAQ,GAErB,WAAkB;AACvB,IAAAF,EAAe,OAAOA,EAAe,QAAQE,CAAQ,GAAG,CAAC;AAAA,EAC3D;AACF;AAEgB,SAAAC,GAAaX,GAA2BpC,GAAiC;AACjF,QAAAgD,KAAWhD,KAAA,gBAAAA,EAAS,YAAWiD,GAAmB,GAElDC,IAAO,CAACC,MAA4B;AACxC,QAAIT,EAAOS,CAAM,MAAM,MAAUC,EAASV,EAAOS,CAAM,CAAC,KAAKT,EAAOS,CAAM,MAAMX,QAAa,CAACG,EAAMjD,EAAI0C,CAAI,CAAC;AACpG,aAAA1B;AACF;AACD,UAAA2C,IAAQ,KAAKjB,CAAI;AACrB,aAAIpC,KAAA,QAAAA,EAAS,MACFqD,KAAA,cAAcrD,EAAQ,GAAG,QAEzBqD,KAAA,UAEJL,EAASG,CAAM,EAAE;AAAA,QACtBH;AAAA,QACAK;AAAA,QACA,SAAS1B,GAAO0B,CAAK,CAAC;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL,IAAI,OAAO;AACT,aAAOH,EAAK,MAAM;AAAA,IACpB;AAAA,IACA,IAAI,MAAM;AACR,aAAOA,EAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAI,OAAO;AACT,aAAOA,EAAK,MAAM;AAAA,IACpB;AAAA,IACA,IAAI,QAAQ;AACV,aAAOA,EAAK,OAAO;AAAA,IACrB;AAAA,IACA,MAAMI,GAAc;AAClB,YAAMC,IAA0B;AAAA,QAC9B,OAAAD;AAAA,QACA,YAAY5D,EAAI0C,CAAI;AAAA,QACpB,KAAKpC,KAAA,gBAAAA,EAAS;AAAA,MAChB;AAEA,iBAAW8C,KAAYF;AACrB,QAAAE,EAASS,CAAG;AAAA,IACd;AAAA,EAEJ;AACF;AAEO,SAASC,GAAaC,GAAyB;AACpD,EAAAd,IAAQd,EAAc4B,CAAM;AAC9B;AAEO,SAASC,GAAa1D,GAA6B;AACxD,aAAWoB,KAAOpB,GAAS;AACnB,UAAAR,IAAQQ,EAAQoB,CAAsB;AAC5C,IAAI5B,MACFkD,EAAOtB,CAAsB,IAAI5B;AAAA,EACnC;AAEJ;AAEA,SAASyD,KAAqB;AAC5B,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAEhB,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAElB;","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"logger-CByUPmlz.js","sources":["../node_modules/alien-signals/esm/index.mjs","../src/core/signals.ts","../src/utils.ts","../src/core/env.ts","../src/core/logger.ts"],"sourcesContent":["// src/system.ts\nvar SubscriberFlags = /* @__PURE__ */ ((SubscriberFlags2) => {\n SubscriberFlags2[SubscriberFlags2[\"Computed\"] = 1] = \"Computed\";\n SubscriberFlags2[SubscriberFlags2[\"Effect\"] = 2] = \"Effect\";\n SubscriberFlags2[SubscriberFlags2[\"Tracking\"] = 4] = \"Tracking\";\n SubscriberFlags2[SubscriberFlags2[\"Notified\"] = 8] = \"Notified\";\n SubscriberFlags2[SubscriberFlags2[\"Recursed\"] = 16] = \"Recursed\";\n SubscriberFlags2[SubscriberFlags2[\"Dirty\"] = 32] = \"Dirty\";\n SubscriberFlags2[SubscriberFlags2[\"PendingComputed\"] = 64] = \"PendingComputed\";\n SubscriberFlags2[SubscriberFlags2[\"PendingEffect\"] = 128] = \"PendingEffect\";\n SubscriberFlags2[SubscriberFlags2[\"Propagated\"] = 224] = \"Propagated\";\n return SubscriberFlags2;\n})(SubscriberFlags || {});\nfunction createReactiveSystem({\n updateComputed,\n notifyEffect: notifyEffect2\n}) {\n let queuedEffects;\n let queuedEffectsTail;\n return {\n /**\n * Links a given dependency and subscriber if they are not already linked.\n * \n * @param dep - The dependency to be linked.\n * @param sub - The subscriber that depends on this dependency.\n * @returns The newly created link object if the two are not already linked; otherwise `undefined`.\n */\n link(dep, sub) {\n const currentDep = sub.depsTail;\n if (currentDep !== void 0 && currentDep.dep === dep) {\n return;\n }\n const nextDep = currentDep !== void 0 ? currentDep.nextDep : sub.deps;\n if (nextDep !== void 0 && nextDep.dep === dep) {\n sub.depsTail = nextDep;\n return;\n }\n const depLastSub = dep.subsTail;\n if (depLastSub !== void 0 && depLastSub.sub === sub && isValidLink(depLastSub, sub)) {\n return;\n }\n return linkNewDep(dep, sub, nextDep, currentDep);\n },\n /**\n * Traverses and marks subscribers starting from the provided link.\n * \n * It sets flags (e.g., Dirty, PendingComputed, PendingEffect) on each subscriber\n * to indicate which ones require re-computation or effect processing. \n * This function should be called after a signal's value changes.\n * \n * @param link - The starting link from which propagation begins.\n */\n propagate(link2) {\n let targetFlag = 32 /* Dirty */;\n let subs = link2;\n let stack = 0;\n top: do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if (!(subFlags & (4 /* Tracking */ | 16 /* Recursed */ | 224 /* Propagated */)) && (sub.flags = subFlags | targetFlag | 8 /* Notified */, true) || subFlags & 16 /* Recursed */ && !(subFlags & 4 /* Tracking */) && (sub.flags = subFlags & ~16 /* Recursed */ | targetFlag | 8 /* Notified */, true) || !(subFlags & 224 /* Propagated */) && isValidLink(link2, sub) && (sub.flags = subFlags | 16 /* Recursed */ | targetFlag | 8 /* Notified */, sub.subs !== void 0)) {\n const subSubs = sub.subs;\n if (subSubs !== void 0) {\n if (subSubs.nextSub !== void 0) {\n subSubs.prevSub = subs;\n link2 = subs = subSubs;\n targetFlag = 64 /* PendingComputed */;\n ++stack;\n } else {\n link2 = subSubs;\n targetFlag = subFlags & 2 /* Effect */ ? 128 /* PendingEffect */ : 64 /* PendingComputed */;\n }\n continue;\n }\n if (subFlags & 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & (4 /* Tracking */ | targetFlag))) {\n sub.flags = subFlags | targetFlag | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & targetFlag) && subFlags & 224 /* Propagated */ && isValidLink(link2, sub)) {\n sub.flags = subFlags | targetFlag;\n }\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue;\n }\n while (stack) {\n --stack;\n const dep = subs.dep;\n const depSubs = dep.subs;\n subs = depSubs.prevSub;\n depSubs.prevSub = void 0;\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue top;\n }\n }\n break;\n } while (true);\n },\n /**\n * Prepares the given subscriber to track new dependencies.\n * \n * It resets the subscriber's internal pointers (e.g., depsTail) and\n * sets its flags to indicate it is now tracking dependency links.\n * \n * @param sub - The subscriber to start tracking.\n */\n startTracking(sub) {\n sub.depsTail = void 0;\n sub.flags = sub.flags & ~(8 /* Notified */ | 16 /* Recursed */ | 224 /* Propagated */) | 4 /* Tracking */;\n },\n /**\n * Concludes tracking of dependencies for the specified subscriber.\n * \n * It clears or unlinks any tracked dependency information, then\n * updates the subscriber's flags to indicate tracking is complete.\n * \n * @param sub - The subscriber whose tracking is ending.\n */\n endTracking(sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n const nextDep = depsTail.nextDep;\n if (nextDep !== void 0) {\n clearTracking(nextDep);\n depsTail.nextDep = void 0;\n }\n } else if (sub.deps !== void 0) {\n clearTracking(sub.deps);\n sub.deps = void 0;\n }\n sub.flags &= ~4 /* Tracking */;\n },\n /**\n * Updates the dirty flag for the given subscriber based on its dependencies.\n * \n * If the subscriber has any pending computeds, this function sets the Dirty flag\n * and returns `true`. Otherwise, it clears the PendingComputed flag and returns `false`.\n * \n * @param sub - The subscriber to update.\n * @param flags - The current flag set for this subscriber.\n * @returns `true` if the subscriber is marked as Dirty; otherwise `false`.\n */\n updateDirtyFlag(sub, flags) {\n if (checkDirty(sub.deps)) {\n sub.flags = flags | 32 /* Dirty */;\n return true;\n } else {\n sub.flags = flags & ~64 /* PendingComputed */;\n return false;\n }\n },\n /**\n * Updates the computed subscriber if necessary before its value is accessed.\n * \n * If the subscriber is marked Dirty or PendingComputed, this function runs\n * the provided updateComputed logic and triggers a shallowPropagate for any\n * downstream subscribers if an actual update occurs.\n * \n * @param computed - The computed subscriber to update.\n * @param flags - The current flag set for this subscriber.\n */\n processComputedUpdate(computed2, flags) {\n if (flags & 32 /* Dirty */ || (checkDirty(computed2.deps) ? true : (computed2.flags = flags & ~64 /* PendingComputed */, false))) {\n if (updateComputed(computed2)) {\n const subs = computed2.subs;\n if (subs !== void 0) {\n shallowPropagate(subs);\n }\n }\n }\n },\n /**\n * Ensures all pending internal effects for the given subscriber are processed.\n * \n * This should be called after an effect decides not to re-run itself but may still\n * have dependencies flagged with PendingEffect. If the subscriber is flagged with\n * PendingEffect, this function clears that flag and invokes `notifyEffect` on any\n * related dependencies marked as Effect and Propagated, processing pending effects.\n * \n * @param sub - The subscriber which may have pending effects.\n * @param flags - The current flags on the subscriber to check.\n */\n processPendingInnerEffects(sub, flags) {\n if (flags & 128 /* PendingEffect */) {\n sub.flags = flags & ~128 /* PendingEffect */;\n let link2 = sub.deps;\n do {\n const dep = link2.dep;\n if (\"flags\" in dep && dep.flags & 2 /* Effect */ && dep.flags & 224 /* Propagated */) {\n notifyEffect2(dep);\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n },\n /**\n * Processes queued effect notifications after a batch operation finishes.\n * \n * Iterates through all queued effects, calling notifyEffect on each.\n * If an effect remains partially handled, its flags are updated, and future\n * notifications may be triggered until fully handled.\n */\n processEffectNotifications() {\n while (queuedEffects !== void 0) {\n const effect2 = queuedEffects;\n const depsTail = effect2.depsTail;\n const queuedNext = depsTail.nextDep;\n if (queuedNext !== void 0) {\n depsTail.nextDep = void 0;\n queuedEffects = queuedNext.sub;\n } else {\n queuedEffects = void 0;\n queuedEffectsTail = void 0;\n }\n if (!notifyEffect2(effect2)) {\n effect2.flags &= ~8 /* Notified */;\n }\n }\n }\n };\n function linkNewDep(dep, sub, nextDep, depsTail) {\n const newLink = {\n dep,\n sub,\n nextDep,\n prevSub: void 0,\n nextSub: void 0\n };\n if (depsTail === void 0) {\n sub.deps = newLink;\n } else {\n depsTail.nextDep = newLink;\n }\n if (dep.subs === void 0) {\n dep.subs = newLink;\n } else {\n const oldTail = dep.subsTail;\n newLink.prevSub = oldTail;\n oldTail.nextSub = newLink;\n }\n sub.depsTail = newLink;\n dep.subsTail = newLink;\n return newLink;\n }\n function checkDirty(link2) {\n let stack = 0;\n let dirty;\n top: do {\n dirty = false;\n const dep = link2.dep;\n if (\"flags\" in dep) {\n const depFlags = dep.flags;\n if ((depFlags & (1 /* Computed */ | 32 /* Dirty */)) === (1 /* Computed */ | 32 /* Dirty */)) {\n if (updateComputed(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== void 0) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n } else if ((depFlags & (1 /* Computed */ | 64 /* PendingComputed */)) === (1 /* Computed */ | 64 /* PendingComputed */)) {\n const depSubs = dep.subs;\n if (depSubs.nextSub !== void 0) {\n depSubs.prevSub = link2;\n }\n link2 = dep.deps;\n ++stack;\n continue;\n }\n }\n if (!dirty && link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue;\n }\n if (stack) {\n let sub = link2.sub;\n do {\n --stack;\n const subSubs = sub.subs;\n if (dirty) {\n if (updateComputed(sub)) {\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n shallowPropagate(sub.subs);\n sub = link2.sub;\n } else {\n sub = subSubs.sub;\n }\n continue;\n }\n } else {\n sub.flags &= ~64 /* PendingComputed */;\n }\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n if (link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue top;\n }\n sub = link2.sub;\n } else {\n if ((link2 = subSubs.nextDep) !== void 0) {\n continue top;\n }\n sub = subSubs.sub;\n }\n dirty = false;\n } while (stack);\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link2) {\n do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if ((subFlags & (64 /* PendingComputed */ | 32 /* Dirty */)) === 64 /* PendingComputed */) {\n sub.flags = subFlags | 32 /* Dirty */ | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n }\n link2 = link2.nextSub;\n } while (link2 !== void 0);\n }\n function isValidLink(checkLink, sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n let link2 = sub.deps;\n do {\n if (link2 === checkLink) {\n return true;\n }\n if (link2 === depsTail) {\n break;\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n return false;\n }\n function clearTracking(link2) {\n do {\n const dep = link2.dep;\n const nextDep = link2.nextDep;\n const nextSub = link2.nextSub;\n const prevSub = link2.prevSub;\n if (nextSub !== void 0) {\n nextSub.prevSub = prevSub;\n } else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== void 0) {\n prevSub.nextSub = nextSub;\n } else {\n dep.subs = nextSub;\n }\n if (dep.subs === void 0 && \"deps\" in dep) {\n const depFlags = dep.flags;\n if (!(depFlags & 32 /* Dirty */)) {\n dep.flags = depFlags | 32 /* Dirty */;\n }\n const depDeps = dep.deps;\n if (depDeps !== void 0) {\n link2 = depDeps;\n dep.depsTail.nextDep = nextDep;\n dep.deps = void 0;\n dep.depsTail = void 0;\n continue;\n }\n }\n link2 = nextDep;\n } while (link2 !== void 0);\n }\n}\n\n// src/index.ts\nvar {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects\n} = createReactiveSystem({\n updateComputed(computed2) {\n const prevSub = activeSub;\n activeSub = computed2;\n startTracking(computed2);\n try {\n const oldValue = computed2.currentValue;\n const newValue = computed2.getter(oldValue);\n if (oldValue !== newValue) {\n computed2.currentValue = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(computed2);\n }\n },\n notifyEffect(e) {\n if (\"isScope\" in e) {\n return notifyEffectScope(e);\n } else {\n return notifyEffect(e);\n }\n }\n});\nvar pauseStack = [];\nvar batchDepth = 0;\nvar activeSub;\nvar activeScope;\nfunction startBatch() {\n ++batchDepth;\n}\nfunction endBatch() {\n if (!--batchDepth) {\n processEffectNotifications();\n }\n}\nfunction pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = void 0;\n}\nfunction resumeTracking() {\n activeSub = pauseStack.pop();\n}\nfunction signal(oldValue) {\n return signalGetterSetter.bind({\n currentValue: oldValue,\n subs: void 0,\n subsTail: void 0\n });\n}\nfunction computed(getter) {\n return computedGetter.bind({\n currentValue: void 0,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 1 /* Computed */ | 32 /* Dirty */,\n getter\n });\n}\nfunction effect(fn) {\n const e = {\n fn,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */\n };\n if (activeSub !== void 0) {\n link(e, activeSub);\n } else if (activeScope !== void 0) {\n link(e, activeScope);\n }\n runEffect(e);\n return effectStop.bind(e);\n}\nfunction effectScope(fn) {\n const e = {\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */,\n isScope: true\n };\n runEffectScope(e, fn);\n return effectStop.bind(e);\n}\nfunction runEffect(e) {\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n e.fn();\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n}\nfunction runEffectScope(e, fn) {\n const prevSub = activeScope;\n activeScope = e;\n startTracking(e);\n try {\n fn();\n } finally {\n activeScope = prevSub;\n endTracking(e);\n }\n}\nfunction notifyEffect(e) {\n const flags = e.flags;\n if (flags & 32 /* Dirty */ || flags & 64 /* PendingComputed */ && updateDirtyFlag(e, flags)) {\n runEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n}\nfunction notifyEffectScope(e) {\n const flags = e.flags;\n if (flags & 128 /* PendingEffect */) {\n processPendingInnerEffects(e, e.flags);\n return true;\n }\n return false;\n}\nfunction computedGetter() {\n const flags = this.flags;\n if (flags & (32 /* Dirty */ | 64 /* PendingComputed */)) {\n processComputedUpdate(this, flags);\n }\n if (activeSub !== void 0) {\n link(this, activeSub);\n } else if (activeScope !== void 0) {\n link(this, activeScope);\n }\n return this.currentValue;\n}\nfunction signalGetterSetter(...value) {\n if (value.length) {\n if (this.currentValue !== (this.currentValue = value[0])) {\n const subs = this.subs;\n if (subs !== void 0) {\n propagate(subs);\n if (!batchDepth) {\n processEffectNotifications();\n }\n }\n }\n } else {\n if (activeSub !== void 0) {\n link(this, activeSub);\n }\n return this.currentValue;\n }\n}\nfunction effectStop() {\n startTracking(this);\n endTracking(this);\n}\nexport {\n SubscriberFlags,\n computed,\n createReactiveSystem,\n effect,\n effectScope,\n endBatch,\n pauseTracking,\n resumeTracking,\n signal,\n startBatch\n};\n","import { createReactiveSystem, type Dependency, type Subscriber, SubscriberFlags } from \"alien-signals\";\nimport { isFunction } from \"../typeChecking\";\n\nexport interface Effect extends Subscriber, Dependency {\n /**\n * Effect function. Can return an optional cleanup callback to be invoked before the next fn() call.\n */\n fn(): (() => void) | void;\n\n cleanup?: () => void;\n}\n\nexport interface Computed<T = any> extends Value<T | undefined>, Subscriber {\n getter: (cachedValue?: T) => T;\n equals: EqualityFn<T>;\n}\n\nexport interface Value<T = any> extends Dependency {\n current: T;\n}\n\nexport const {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects,\n} = createReactiveSystem({\n updateComputed(c: Computed): boolean {\n const prevSub = activeSub;\n activeSub = c;\n startTracking(c);\n try {\n const oldValue = c.current;\n const newValue = c.getter(oldValue);\n if (!c.equals(oldValue, newValue)) {\n c.current = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(c);\n }\n },\n notifyEffect(e: Effect) {\n const flags = e.flags;\n if (flags & SubscriberFlags.Dirty || (flags & SubscriberFlags.PendingComputed && updateDirtyFlag(e, flags))) {\n queueEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n },\n});\n\n/*===================================*\\\n|| EFFECTS & TRACKING ||\n\\*===================================*/\n\nexport let activeSub: Subscriber | undefined;\n\nconst PENDING_EFFECTS: Effect[] = [];\n\nlet flushPending = false;\n\nfunction flushEffects(): void {\n if (!flushPending) {\n flushPending = true;\n\n queueMicrotask(() => {\n flushPending = false;\n for (let i = 0; i < PENDING_EFFECTS.length; i++) {\n const e = PENDING_EFFECTS[i];\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n if (e.cleanup) {\n pauseTracking();\n e.cleanup();\n resumeTracking();\n }\n e.cleanup = e.fn() ?? undefined;\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n }\n PENDING_EFFECTS.length = 0;\n });\n }\n}\n\nexport function queueEffect(e: Effect) {\n PENDING_EFFECTS.push(e);\n flushEffects();\n}\n\nexport function stopEffect(this: Effect): void {\n startTracking(this);\n endTracking(this);\n // Cancel it after it receives its current value.\n queueMicrotask(() => {\n PENDING_EFFECTS.splice(PENDING_EFFECTS.indexOf(this), 1);\n if (this.cleanup) {\n this.cleanup();\n }\n });\n}\n\nconst pauseStack: (Subscriber | undefined)[] = [];\n\nexport function pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = undefined;\n}\n\nexport function resumeTracking() {\n activeSub = pauseStack.pop();\n}\n\n/*===================================*\\\n|| API ||\n\\*===================================*/\n\n/* -------------- TYPES --------------- */\n\nconst SIGNAL = Symbol(\"SIGNAL\");\nconst SOURCE = Symbol(\"SOURCE\");\n\n/**\n * A getter that returns the current value held within the signal.\n * If called inside a trackable scope this signal will be tracked as a dependency.\n */\nexport interface Signal<T> {\n (): T;\n}\n\n/**\n * Extends Signal with the ability to pass a value or an updater function to change the Signal's value.\n */\nexport interface Source<T> extends Signal<T> {\n (value: T): void;\n (updater: (value: T) => T): void;\n}\n\nexport type MaybeSignal<T> = Signal<T> | T;\n\nexport type EqualityFn<T> = (current: T, next: T) => boolean;\nexport interface SignalOptions<T> {\n /**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\n equals?: EqualityFn<T>;\n}\n\n/* -------------- PUBLIC API --------------- */\n\nexport function isSource<T>(value: MaybeSignal<T>): value is Source<T> {\n return isFunction(value) && (value as any)._type === SOURCE;\n}\n\nexport function peek<T>(value: MaybeSignal<T>) {\n let result: T;\n pauseTracking();\n result = get(value);\n resumeTracking();\n return result;\n}\n\nexport function get<T>(value: MaybeSignal<T>) {\n if (isFunction(value)) {\n return (value as () => T)();\n } else {\n return value;\n }\n}\n\n/**\n * Function to be invoked for the effect. Can return an optional cleanup function to be called between invocations.\n */\nexport type EffectFn = () => void | (() => void);\n\nexport type UnsubscribeFn = () => void;\n\n/**\n * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.\n * Reactives are tracked by accessing their `value` within the body of the function.\n *\n * NOTE: You must call the unsubscribe function to stop watching for changes.\n * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.\n */\nexport function effect(fn: EffectFn): UnsubscribeFn {\n const e: Effect = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Effect,\n };\n if (activeSub !== undefined) {\n link(e, activeSub);\n }\n queueEffect(e);\n return stopEffect.bind(e);\n}\n\nexport function $<T>(compute: () => MaybeSignal<T>, options?: SignalOptions<T>): Signal<T>;\nexport function $<T>(value: T, options?: SignalOptions<T>): Source<T>;\nexport function $<T>(value: undefined, options?: SignalOptions<T>): Source<T | undefined>;\nexport function $<T>(): Source<T | undefined>;\n\nexport function $<T>(init?: (() => T) | T, options?: SignalOptions<T>) {\n if (isFunction(init)) {\n return _createSignal(init as () => T, options);\n } else if (init === undefined) {\n return _createSource<T | undefined>(undefined, options as SignalOptions<T | undefined>);\n } else {\n return _createSource(init, options);\n }\n}\n\n/* -------------- INTERNAL --------------- */\n\nfunction _createSource<T>(initialValue: T, options?: SignalOptions<T>): Source<T> {\n const value: Value<T> = {\n current: initialValue,\n subs: undefined,\n subsTail: undefined,\n };\n const equals = options?.equals ?? Object.is;\n const signal: Signal<any> = function () {\n if (arguments.length > 0) {\n let next = arguments[0] as T;\n\n if (typeof next === \"function\") {\n next = next(value.current);\n }\n\n if (!equals(value.current, next)) {\n value.current = next;\n const subs = value.subs;\n if (subs !== undefined) {\n propagate(subs);\n processEffectNotifications();\n }\n }\n } else {\n if (activeSub !== undefined) {\n link(value, activeSub);\n }\n return value.current;\n }\n };\n (signal as any)._type = SOURCE;\n\n return signal;\n}\n\nfunction _createSignal<T>(fn: (cachedValue?: T) => T, options?: SignalOptions<T>): Signal<T> {\n if (isFunction(fn) && (fn as any)._type === SIGNAL) {\n if ((fn as any)._type === SOURCE) {\n return (() => fn()) as Signal<T>;\n } else {\n return fn as Signal<T>;\n }\n }\n\n const computed: Computed<T> = {\n current: undefined,\n equals: options?.equals ?? Object.is,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Computed | SubscriberFlags.Dirty,\n getter: (cachedValue?: T) => {\n const returned = fn(cachedValue);\n\n // If a signal is returned, track it and return its value.\n return get(returned);\n },\n };\n const signal: Signal<T> = function () {\n if (arguments.length > 0) {\n throw new Error(\"Signals cannot be set as their values are derived from the sources they depend on.\");\n }\n if (activeSub !== undefined) {\n link(computed, activeSub);\n }\n const flags = computed.flags;\n if (flags & (SubscriberFlags.Dirty | SubscriberFlags.PendingComputed)) {\n processComputedUpdate(computed, flags);\n }\n return computed.current!;\n };\n (signal as any)._type = SIGNAL;\n\n return signal;\n}\n","import { isFunction, isObject, typeOf } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\n// Guarantee unique ID by incrementing a global counter.\nlet idCounter = 1;\nexport function getUniqueId(): string {\n idCounter = (idCounter % Number.MAX_SAFE_INTEGER) + 1;\n return idCounter.toString(36) + Date.now().toString(36);\n}\n\n/*=============================*\\\n|| Object Equality ||\n\\*=============================*/\n\n/**\n * Equality check that passes if both values are the same object.\n * This is the default equality check for states.\n */\nexport function strictEqual(a: any, b: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * Equality check that passes if both values are the same object, or if both are objects or arrays with equal keys and values.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n\n // Must be same type\n const t = typeOf(a);\n if (t !== typeOf(b)) {\n return false;\n }\n\n switch (t) {\n case \"object\":\n // Objects must have same number of keys with strict equal values\n let size = 0;\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n size++;\n }\n return Object.keys(b).length === size;\n case \"array\":\n // Arrays must be the same length with strict equal values\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n case \"map\":\n if (a.size !== b.size) return false;\n for (const key of a.keys()) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n case \"set\":\n if (isFunction(a.symmetricDifference)) {\n return a.symmetricDifference(b).size === 0;\n } else {\n for (const key of a.keys()) {\n if (a[key] !== b.get(key)) return false;\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Equality check that passes if two objects have equal values, even if they are not the same object.\n */\n// NOTE: This code is https://github.com/epoberezkin/fast-deep-equal licensed under MIT.\n// I imported it because I couldn't get the old school module to play nice with my modern ES code as an external dependency.\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n for (i of a.entries()) if (!deepEqual(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = (a as any).length;\n if (length != (b as any).length) return false;\n for (i = length; i-- !== 0; ) if ((a as any)[i] !== (b as any)[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n var key = keys[i];\n\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n}\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n}\n\n/*=============================*\\\n|| Misc Utils ||\n\\*=============================*/\n\n/**\n * Takes any string and returns an OKLCH color.\n */\nexport function okhash(value: string) {\n let hue = 0;\n for (let i = 0; i < value.length; i++) {\n hue = (hue + value.charCodeAt(i) * 10) % 360;\n }\n return `oklch(0.68 0.15 ${hue}deg)`;\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","export type Env = \"production\" | \"development\";\n\nlet env: Env = \"production\";\n\n/**\n * Gets the current environment value.\n */\nexport function getEnv(): Env {\n return env;\n}\n\n/**\n * Sets the environment value. Affects which log messages will print and how much debugging info is included in the DOM.\n */\nexport function setEnv(value: Env) {\n env = value;\n}\n","import { isString } from \"../typeChecking\";\nimport { createMatcher, noOp, okhash, type MatcherFunction } from \"../utils\";\nimport { getEnv, type Env } from \"./env\";\nimport { get, type MaybeSignal } from \"./signals\";\n\nexport interface LogLevels {\n info: boolean | Env;\n log: boolean | Env;\n warn: boolean | Env;\n error: boolean | Env;\n}\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): void;\n}\n\nexport interface LoggerOptions {\n /**\n * Unique ID to print with logs. Makes it easier to track down messages from specific view instances.\n */\n uid?: string;\n\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n}\n\nexport interface LoggerErrorContext {\n error: Error;\n loggerName: string;\n uid?: string;\n}\n\nlet levels: LogLevels = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n};\nlet match: MatcherFunction = createMatcher(\"*,-Dolla.*\");\nlet crashListeners: ((context: LoggerErrorContext) => void)[] = [];\n\nexport function onLoggerCrash(listener: (context: LoggerErrorContext) => void) {\n crashListeners.push(listener);\n\n return function cancel() {\n crashListeners.splice(crashListeners.indexOf(listener), 1);\n };\n}\n\nexport function createLogger(name: MaybeSignal<string>, options?: LoggerOptions): Logger {\n const _console = options?.console ?? _getDefaultConsole();\n\n const bind = (method: keyof LogLevels) => {\n let _name = get(name);\n if (levels[method] === false || (isString(levels[method]) && levels[method] !== getEnv()) || !match(_name)) {\n return noOp;\n } else {\n let label = `%c${_name}`;\n if (options?.uid) {\n label += ` %c[uid: %c${options.uid}%c]`;\n } else {\n label += `%c%c%c`;\n }\n return _console[method].bind(\n _console,\n label,\n `color:${okhash(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n };\n\n return {\n get info() {\n return bind(\"info\");\n },\n get log() {\n return bind(\"log\");\n },\n get warn() {\n return bind(\"warn\");\n },\n get error() {\n return bind(\"error\");\n },\n crash(error: Error) {\n const ctx: LoggerErrorContext = {\n error,\n loggerName: get(name),\n uid: options?.uid,\n };\n\n for (const listener of crashListeners) {\n listener(ctx);\n }\n },\n };\n}\n\nexport function setLogFilter(filter: string | RegExp) {\n match = createMatcher(filter);\n}\n\nexport function setLogLevels(options: Partial<LogLevels>) {\n for (const key in options) {\n const value = options[key as keyof LogLevels];\n if (value) {\n levels[key as keyof LogLevels] = value;\n }\n }\n}\n\nfunction _getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n"],"names":["SubscriberFlags","SubscriberFlags2","createReactiveSystem","updateComputed","notifyEffect2","queuedEffects","queuedEffectsTail","dep","sub","currentDep","nextDep","depLastSub","isValidLink","linkNewDep","link2","targetFlag","subs","stack","top","subFlags","subSubs","depSubs","depsTail","clearTracking","flags","checkDirty","computed2","shallowPropagate","effect2","queuedNext","newLink","oldTail","dirty","depFlags","checkLink","nextSub","prevSub","depDeps","link","propagate","updateDirtyFlag","startTracking","endTracking","processEffectNotifications","processComputedUpdate","processPendingInnerEffects","oldValue","newValue","notifyEffectScope","notifyEffect","runEffect","c","activeSub","queueEffect","PENDING_EFFECTS","flushPending","flushEffects","i","e","pauseTracking","resumeTracking","stopEffect","pauseStack","SIGNAL","SOURCE","peek","value","result","get","isFunction","effect","fn","$","init","options","_createSignal","_createSource","initialValue","equals","signal","next","computed","cachedValue","returned","noOp","idCounter","getUniqueId","strictEqual","a","b","shallowEqual","t","typeOf","size","key","deepEqual","length","keys","omit","object","newObject","okhash","hue","createMatcher","pattern","matchers","parts","p","part","section","name","positive","negative","env","getEnv","setEnv","levels","match","crashListeners","onLoggerCrash","listener","createLogger","_console","_getDefaultConsole","bind","method","_name","isString","label","error","ctx","setLogFilter","filter","setLogLevels"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -13,8 +13,8 @@ var C = (i, t, e, r) => ({
|
|
|
13
13
|
return l(i, t, r);
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
-
import { $ as P, f as tt, p as F, s as I } from "./logger-
|
|
17
|
-
import { c as et } from "./view-
|
|
16
|
+
import { $ as P, f as tt, p as F, s as I } from "./logger-CByUPmlz.js";
|
|
17
|
+
import { c as et } from "./view-CAEIbcZt.js";
|
|
18
18
|
import { d as rt, e as z, c as O, f as it, g as nt, b as st, i as j } from "./typeChecking-EAVNeFyB.js";
|
|
19
19
|
function V(i, t) {
|
|
20
20
|
return t.outlet();
|
|
@@ -479,4 +479,4 @@ export {
|
|
|
479
479
|
mt as U,
|
|
480
480
|
K as a
|
|
481
481
|
};
|
|
482
|
-
//# sourceMappingURL=router-
|
|
482
|
+
//# sourceMappingURL=router-W2HPWbeI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-BYOH-To5.js","sources":["../src/core/views/passthrough.ts","../src/router/router.utils.ts","../src/router/router.ts"],"sourcesContent":["import { type ViewContext } from \"../nodes/view.js\";\n\n/**\n * A utility view that simply displays a route.\n */\nexport function Passthrough(_: {}, ctx: ViewContext) {\n return ctx.outlet();\n}\n","import { assertString, assertArrayOf, isFunction } from \"../typeChecking.js\";\n\nexport type RouteMatch<T = Record<string, any>> = {\n /**\n * The path string that triggered this match.\n */\n path: string;\n\n /**\n * The pattern satisfied by `path`.\n */\n pattern: string;\n\n /**\n * Named params as parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params as parsed from `path`.\n */\n query: Record<string, string>;\n\n /**\n * Metadata registered to this route.\n */\n meta: T;\n};\n\nexport enum FragTypes {\n Literal = 1,\n Param = 2,\n Wildcard = 3,\n NumericParam = 4,\n}\n\nexport type RouteFragment = {\n name: string;\n type: FragTypes;\n value: string | number | null;\n};\n\nexport type ParsedRoute<T> = {\n pattern: string;\n fragments: RouteFragment[];\n meta: T;\n};\n\nexport type RouteMatchOptions<T> = {\n willMatch?: (route: ParsedRoute<T>) => boolean;\n};\n\n/**\n * Separates a URL path into multiple fragments.\n *\n * @param path - A path string (e.g. `\"/api/users/5\"`)\n * @returns an array of fragments (e.g. `[\"api\", \"users\", \"5\"]`)\n */\nexport function splitPath(path: string): string[] {\n assertString(path, \"Expected `path` to be a string. Got type: %t, value: %v\");\n\n return path\n .split(\"/\")\n .map((f) => f.trim())\n .filter((f) => f !== \"\");\n}\n\n/**\n * Joins multiple URL path fragments into a single string.\n *\n * @param parts - One or more URL fragments (e.g. `[\"api\", \"users\", 5]`)\n * @returns a joined path (e.g. `\"api/users/5\"`)\n */\nexport function joinPath(parts: { toString(): string }[]): string {\n assertArrayOf(\n (part) => isFunction(part?.toString),\n parts,\n \"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v\",\n );\n\n parts = parts.filter((x) => x).flatMap(String);\n\n let joined = parts.shift()?.toString();\n\n if (joined) {\n for (const part of parts.map((p) => p.toString())) {\n if (part.startsWith(\".\")) {\n // Resolve relative path against joined\n joined = resolvePath(joined, part);\n } else if (joined[joined.length - 1] !== \"/\") {\n if (part[0] !== \"/\") {\n joined += \"/\" + part;\n } else {\n joined += part;\n }\n } else {\n if (part[0] === \"/\") {\n joined += part.slice(1);\n } else {\n joined += part;\n }\n }\n }\n\n // Remove trailing slash (unless path is just '/')\n if (joined && joined !== \"/\" && joined.endsWith(\"/\")) {\n joined = joined.slice(0, joined.length - 1);\n }\n }\n\n return joined ?? \"\";\n}\n\nexport function resolvePath(base: string, part: string | null) {\n assertString(base, \"Expected `base` to be a string. Got type: %t, value: %v\");\n\n if (part == null) {\n part = base;\n base = \"\";\n }\n\n if (part.startsWith(\"/\")) {\n return part;\n }\n\n let resolved = base;\n\n while (true) {\n if (part.startsWith(\"..\")) {\n for (let i = resolved.length; i > 0; --i) {\n if (resolved[i] === \"/\" || i === 0) {\n resolved = resolved.slice(0, i);\n part = part.replace(/^\\.\\.\\/?/, \"\");\n break;\n }\n }\n } else if (part.startsWith(\".\")) {\n part = part.replace(/^\\.\\/?/, \"\");\n } else {\n break;\n }\n }\n\n return joinPath([resolved, part]);\n}\n\nexport function parseQueryParams(query: string): Record<string, string> {\n if (!query) return {};\n\n if (query.startsWith(\"?\")) {\n query = query.slice(1);\n }\n\n const entries = query\n .split(\"&\")\n .filter((x) => x.trim() !== \"\")\n .map((entry) =>\n entry\n .split(\"=\")\n .map((x) => x.trim())\n .slice(0, 2),\n );\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Returns the nearest match, or undefined if the path matches no route.\n *\n * @param url - Path to match against routes.\n * @param options - Options to customize how matching operates.\n */\nexport function matchRoutes<T>(\n routes: ParsedRoute<T>[],\n url: string,\n options: RouteMatchOptions<T> = {},\n): RouteMatch<T> | undefined {\n const [path, query] = url.split(\"?\");\n const parts = splitPath(path);\n\n routes: for (const route of routes) {\n const { fragments } = route;\n const hasWildcard = fragments[fragments.length - 1]?.type === FragTypes.Wildcard;\n\n if (!hasWildcard && fragments.length !== parts.length) {\n continue routes;\n }\n\n if (options.willMatch && !options.willMatch(route)) {\n continue routes;\n }\n\n const matched: RouteFragment[] = [];\n\n fragments: for (let i = 0; i < fragments.length; i++) {\n const part = parts[i];\n const frag = fragments[i];\n\n if (part == null && frag.type !== FragTypes.Wildcard) {\n continue routes;\n }\n\n switch (frag.type) {\n case FragTypes.Literal:\n if (frag.name.toLowerCase() === part.toLowerCase()) {\n matched.push(frag);\n break;\n } else {\n continue routes;\n }\n case FragTypes.Param:\n matched.push({ ...frag, value: part });\n break;\n case FragTypes.Wildcard:\n matched.push({ ...frag, value: parts.slice(i).join(\"/\") });\n break fragments;\n case FragTypes.NumericParam:\n if (!isNaN(Number(part))) {\n matched.push({ ...frag, value: part });\n break;\n } else {\n continue routes;\n }\n default:\n throw new Error(`Unknown fragment type: ${frag.type}`);\n }\n }\n\n const params: Record<string, string> = {};\n\n for (const frag of matched) {\n if (frag.type === FragTypes.Param) {\n params[frag.name] = decodeURIComponent(frag.value as string);\n }\n\n if (frag.type === FragTypes.NumericParam) {\n params[frag.name] = String(frag.value);\n }\n\n if (frag.type === FragTypes.Wildcard) {\n params.wildcard = \"/\" + decodeURIComponent(frag.value as string);\n }\n }\n\n return {\n path: \"/\" + matched.map((f) => f.value).join(\"/\"),\n pattern:\n \"/\" +\n fragments\n .map((f) => {\n if (f.type === FragTypes.Param) {\n return `{${f.name}}`;\n }\n\n if (f.type === FragTypes.NumericParam) {\n return `{#${f.name}}`;\n }\n\n return f.name;\n })\n .join(\"/\"),\n params,\n query: parseQueryParams(query),\n meta: route.meta,\n };\n }\n}\n\n/**\n * Sort routes descending by specificity. Guarantees that the most specific route matches first\n * no matter the order in which they were added.\n *\n * Routes without named params and routes with more fragments are weighted more heavily.\n */\nexport function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[] {\n const withoutParams = [];\n const withNumericParams = [];\n const withParams = [];\n const wildcard = [];\n\n for (const route of routes) {\n const { fragments } = route;\n\n if (fragments.some((f) => f.type === FragTypes.Wildcard)) {\n wildcard.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.NumericParam)) {\n withNumericParams.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.Param)) {\n withParams.push(route);\n } else {\n withoutParams.push(route);\n }\n }\n\n const bySizeDesc = (a: ParsedRoute<T>, b: ParsedRoute<T>) => {\n if (a.fragments.length > b.fragments.length) {\n return -1;\n } else {\n return 1;\n }\n };\n\n withoutParams.sort(bySizeDesc);\n withNumericParams.sort(bySizeDesc);\n withParams.sort(bySizeDesc);\n wildcard.sort(bySizeDesc);\n\n return [...withoutParams, ...withNumericParams, ...withParams, ...wildcard];\n}\n\n/**\n * Converts a route pattern into a set of matchable fragments.\n *\n * @param route - A route string (e.g. \"/api/users/{id}\")\n */\nexport function patternToFragments(pattern: string): RouteFragment[] {\n const parts = splitPath(pattern);\n const fragments = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === \"*\") {\n if (i !== parts.length - 1) {\n throw new Error(`Wildcard must be at the end of a pattern. Received: ${pattern}`);\n }\n fragments.push({\n type: FragTypes.Wildcard,\n name: \"*\",\n value: null,\n });\n } else if (part.at(0) === \"{\" && part.at(-1) === \"}\") {\n fragments.push({\n type: part[1] === \"#\" ? FragTypes.NumericParam : FragTypes.Param,\n name: part[1] === \"#\" ? part.slice(2, -1) : part.slice(1, -1),\n value: null,\n });\n } else {\n fragments.push({\n type: FragTypes.Literal,\n name: part,\n value: part,\n });\n }\n }\n\n return fragments;\n}\n\nconst safeExternalLink = /(noopener|noreferrer) (noopener|noreferrer)/;\nconst protocolLink = /^[\\w-_]+:/;\n\n/**\n * Intercepts links within the root node.\n *\n * This is adapted from https://github.com/choojs/nanohref/blob/master/index.js\n *\n * @param root - Element under which to intercept link clicks\n * @param callback - Function to call when a click event is intercepted\n * @param _window - (optional) Override for global window object\n */\nexport function catchLinks(root: Element, callback: (anchor: HTMLAnchorElement) => void, _window = window) {\n function traverse(node: HTMLElement | null): HTMLAnchorElement | null {\n if (!node || node === root) {\n return null;\n }\n\n if (node.localName !== \"a\" || (node as any).href === undefined) {\n return traverse(node.parentNode as HTMLElement | null);\n }\n\n return node as HTMLAnchorElement;\n }\n\n function handler(e: MouseEvent) {\n if ((e.button && e.button !== 0) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.defaultPrevented) {\n return;\n }\n\n const anchor = traverse(e.target as HTMLElement);\n\n if (!anchor) {\n return;\n }\n\n if (\n _window.location.protocol !== anchor.protocol ||\n _window.location.hostname !== anchor.hostname ||\n _window.location.port !== anchor.port ||\n anchor.hasAttribute(\"data-router-ignore\") ||\n anchor.hasAttribute(\"download\") ||\n (anchor.getAttribute(\"target\") === \"_blank\" && safeExternalLink.test(anchor.getAttribute(\"rel\")!)) ||\n protocolLink.test(anchor.getAttribute(\"href\")!)\n ) {\n return;\n }\n\n e.preventDefault();\n callback(anchor);\n }\n\n root.addEventListener(\"click\", handler as any);\n\n return function cancel() {\n root.removeEventListener(\"click\", handler as any);\n };\n}\n\n/**\n * Replace route pattern param placeholders with real matched values.\n */\nexport function replaceParams(path: string, params: Record<string, string | number>) {\n for (const key in params) {\n const value = params[key].toString();\n path = path.replace(`{${key}}`, value).replace(`{#${key}}`, value);\n }\n\n return path;\n}\n","import { createLogger, type Logger } from \"../core/logger.js\";\nimport { constructView, type ViewElement, type ViewFunction } from \"../core/nodes/view.js\";\nimport { $, peek, type UnsubscribeFn } from \"../core/signals.js\";\nimport { Passthrough } from \"../core/views/passthrough.js\";\nimport { assertObject, isArray, isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { Stringable } from \"../types.js\";\nimport { shallowEqual } from \"../utils.js\";\nimport {\n catchLinks,\n joinPath,\n matchRoutes,\n patternToFragments,\n replaceParams,\n resolvePath,\n sortRoutes,\n splitPath,\n type ParsedRoute,\n type RouteMatch,\n} from \"./router.utils.js\";\n\n// ----- Types ----- //\n\nexport interface RouteMatchContext {\n path: string;\n pattern: string;\n params: Record<string, string>;\n query: Record<string, string>;\n\n /**\n * Redirects the user to a different route instead of matching the current one.\n */\n redirect(path: string): void;\n\n /**\n * Triggers the next beforeMatch function, or mounts the route.\n */\n next(): void;\n}\n\nexport interface Route {\n /**\n * The path or path fragment to match.\n */\n path: string;\n\n /**\n * Path to redirect to when this route is matched, or a callback function that returns such path.\n */\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n\n /**\n * View to display when this route is matched.\n */\n view?: ViewFunction<any>;\n\n /**\n * Subroutes.\n */\n routes?: Route[];\n\n /**\n * Called after the match is identified but before it is acted on. Use this to set state, load data, etc.\n */\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n}\n\nexport interface RouteMeta {\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n pattern?: string;\n layers?: RouteLayer[];\n beforeMatch?: ((ctx: RouteMatchContext) => void | Promise<void>)[];\n}\n\nexport interface RouteConfig {\n pattern: string;\n meta: RouteMeta;\n}\n\nexport interface RouteLayer {\n id: number;\n view: ViewFunction<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n view: ViewElement;\n}\n\n/**\n * Object passed to redirect callbacks. Contains information useful for determining how to redirect.\n */\nexport interface RouteRedirectContext {\n /**\n * The path as it appears in the URL bar.\n */\n path: string;\n\n /**\n * The pattern that this path was matched with.\n */\n pattern: string;\n\n /**\n * Named route params parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params parsed from `path`.\n */\n query: Record<string, string>;\n}\n\n/**\n * A log for a single step in the route resolution process.\n */\ninterface JourneyStep {\n kind: \"match\" | \"redirect\" | \"miss\";\n message: string;\n}\n\nexport interface NavigateOptions {\n /**\n * Replace the current item in the history stack instead of adding a new one.\n * The back button will send the user to the page they visited before this. Defaults to false.\n */\n replace?: boolean;\n\n /**\n * Preserve existing query params (if any) when navigating. Defaults to false.\n * If true, all existing query params are preserved and merged with new ones.\n * If an array of strings is passed only those keys will be preserved, then merged with any new ones.\n */\n preserveQuery?: boolean | string[];\n}\n\nexport interface RouterOptions {\n routes: Route[];\n\n /**\n * When true, the router will construct routes like \"https://www.example.com/#/sub/route\" which work without any backend intervention.\n */\n hash?: boolean;\n}\n\n// ----- Code ----- //\n\nexport const MOUNT = Symbol();\nexport const UNMOUNT = Symbol();\nexport const ROOT_VIEW = Symbol();\n\nexport class Router {\n #logger?: Logger;\n\n #layerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #routes: ParsedRoute<RouteMeta>[] = [];\n\n #isMounted = false;\n\n [ROOT_VIEW] = constructView(Passthrough);\n\n /**\n * Use hash routing when true. Configured in router options.\n */\n #hash = false;\n\n // Callbacks that need to be called on unmount.\n #unsubscribers: UnsubscribeFn[] = [];\n\n /**\n * The current match object.\n */\n #match = $<RouteMatch>();\n\n /**\n * The currently matched route pattern, if any.\n */\n readonly $pattern = $(() => this.#match()?.pattern);\n\n /**\n * The current URL path.\n */\n readonly $path = $(() => this.#match()?.path ?? window.location.pathname);\n\n /**\n * The current named path params.\n */\n readonly $params = $(() => this.#match()?.params ?? {}, { equals: shallowEqual });\n\n /**\n * The current query params. Changes to this object will be reflected in the URL.\n */\n readonly $query = $(() => this.#match()?.query ?? {}, { equals: shallowEqual });\n\n constructor(options: RouterOptions) {\n assertObject(options, \"Options must be an object. Got: %t\");\n\n if (options.hash) {\n this.#hash = true;\n }\n\n // Add routes.\n this.#routes = sortRoutes(\n options.routes\n .flatMap((route) => this.#prepareRoute(route))\n .map((route) => ({\n pattern: route.pattern,\n meta: route.meta,\n fragments: patternToFragments(route.pattern),\n })),\n );\n\n assertValidRedirects(this.#routes);\n }\n\n async [MOUNT](parent: Element) {\n this.#logger = createLogger(\"Dolla.router\");\n\n // Listen for popstate events and update route accordingly.\n const onPopState = () => {\n this.#updateRoute(undefined, {});\n };\n window.addEventListener(\"popstate\", onPopState);\n this.#unsubscribers.push(() => window.removeEventListener(\"popstate\", onPopState));\n\n // Listen for clicks on <a> tags within the app.\n this.#unsubscribers.push(\n catchLinks(parent, (anchor) => {\n let href = anchor.getAttribute(\"href\")!;\n this.#logger!.info(\"intercepted click on <a> tag\", anchor);\n\n const preserve = anchor.getAttribute(\"data-router-preserve-query\");\n\n this.go(href, {\n preserveQuery: parsePreserveQueryAttribute(preserve),\n });\n }),\n );\n this.#logger.info(\"will intercept clicks on <a> tags within root element\", parent);\n\n this.#isMounted = true;\n\n // Setup initial route content.\n await this.#updateRoute(undefined, {});\n }\n\n async [UNMOUNT]() {\n for (const callback of this.#unsubscribers) {\n callback();\n }\n this.#unsubscribers = [];\n }\n\n /**\n * Navigate backward. Pass a number of steps to hit the back button that many times.\n */\n back(steps = 1) {\n window.history.go(-steps);\n }\n\n /**\n * Navigate forward. Pass a number of steps to hit the forward button that many times.\n */\n forward(steps = 1) {\n window.history.go(steps);\n }\n\n /**\n * Navigates to another route.\n *\n * @example\n * router.go(\"/login\"); // navigate to `/login`\n * router.go[\"/users\", 215], { replace: true }); // replace current history entry with `/users/215`\n */\n go(path: Stringable | Stringable[], options: NavigateOptions = {}) {\n let joined: string;\n\n if (Array.isArray(path)) {\n joined = joinPath(path);\n } else {\n joined = path.toString();\n }\n\n joined = resolvePath(window.location.pathname, joined);\n\n if (options.replace) {\n this.#replace(joined, options);\n } else {\n this.#push(joined, options);\n }\n }\n\n /**\n * Updates query params, keeping existing ones and applying new ones. Removes the query param if value is set to `null`.\n */\n updateQuery(values: Record<string, Stringable | null>) {\n const match = peek(this.#match)!;\n const query = { ...this.$query() };\n\n for (const key in values) {\n const value = values[key];\n if (value === null) {\n delete query[key];\n } else {\n query[key] = value.toString();\n }\n }\n\n let queryParts: string[] = [];\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n this.#match({ ...match, query });\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n #push(href: string, options: NavigateOptions) {\n this.#logger?.info(\"(push)\", href);\n\n window.history.pushState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #replace(href: string, options: NavigateOptions) {\n this.#logger?.info(\"(replace)\", href);\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #getCurrentURL(): URL {\n if (this.#hash) {\n return new URL(window.location.hash.slice(1), window.location.origin);\n } else {\n return new URL(window.location.pathname, window.location.origin);\n }\n }\n\n /**\n * Run when the location changes. Diffs and mounts new routes and updates\n * the $path, $route, $params and $query states accordingly.\n */\n async #updateRoute(href: string | undefined, options: NavigateOptions) {\n const logger = this.#logger;\n const rootView = this[ROOT_VIEW];\n const url = href ? new URL(href, window.location.origin) : this.#getCurrentURL();\n\n const { match, journey } = await this.#resolveRoute(url);\n\n for (const step of journey) {\n switch (step.kind) {\n case \"match\":\n logger?.info(`📍 ${step.message}`);\n break;\n case \"redirect\":\n logger?.info(`↩️ ${step.message}`);\n break;\n case \"miss\":\n logger?.info(`💀 ${step.message}`);\n break;\n default:\n break;\n }\n }\n\n if (match) {\n const oldPattern = peek(this.$pattern);\n\n // Merge query params.\n let query = match.query;\n let queryParts: string[] = [];\n\n if (options.preserveQuery === true) {\n query = Object.assign({}, this.$query(), match.query);\n } else if (isArray(options.preserveQuery)) {\n const preserved: Record<string, any> = {};\n const current = this.$query();\n for (const key in current) {\n if (options.preserveQuery.includes(key)) {\n preserved[key] = current[key];\n }\n }\n query = Object.assign({}, preserved, match.query);\n }\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n this.#match({ ...match, query });\n\n // Update the URL if matched path differs from navigator path.\n // This happens if route resolution involved redirects.\n if (rootView && (match.path !== location.pathname || location.search !== queryString)) {\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n if (rootView && match.pattern !== oldPattern) {\n this.#mountRoute(rootView, match);\n }\n } else {\n // Only crash if routing has been configured.\n if (this.#isMounted) {\n logger!.crash(new NoRouteError(`Failed to match route '${url.pathname}'`));\n }\n }\n\n return { match, journey };\n }\n\n /**\n * Takes a matched route and mounts it.\n */\n #mountRoute(rootView: ViewElement, match: RouteMatch<RouteMeta>) {\n const layers = match.meta.layers!;\n\n // Diff and update route layers.\n for (let i = 0; i < layers.length; i++) {\n const matchedLayer = layers[i];\n const activeLayer = this.#activeLayers[i];\n\n if (activeLayer?.id !== matchedLayer.id) {\n // Discard all previously active layers starting at this depth.\n this.#activeLayers = this.#activeLayers.slice(0, i);\n activeLayer?.view.unmount();\n\n const parentLayer = this.#activeLayers.at(-1);\n const parent = parentLayer?.view ?? rootView;\n\n const view = parent.setRouteView(matchedLayer.view);\n this.#activeLayers.push({ id: matchedLayer.id, view });\n }\n }\n }\n\n /**\n * Takes a URL and finds a match, following redirects.\n */\n async #resolveRoute(\n url: URL,\n journey: JourneyStep[] = [],\n ): Promise<{\n match: RouteMatch<RouteMeta> | null;\n journey: JourneyStep[];\n }> {\n return new Promise((resolve, reject) => {\n const match = matchRoutes(this.#routes, url.pathname);\n\n if (!match) {\n return resolve({\n match: null,\n journey: [...journey, { kind: \"miss\", message: `no match for '${url.pathname}'` }],\n });\n }\n\n let redirect = match.meta.redirect;\n\n const finalize = async () => {\n if (redirect != null) {\n let path: string;\n\n if (isString(redirect)) {\n path = replaceParams(redirect, match.params);\n } else if (isFunction(redirect)) {\n const redirectContext: RouteRedirectContext = {\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n };\n path = await redirect(redirectContext);\n if (!isString(path)) {\n return reject(new Error(`Redirect function must return a path to redirect to.`));\n }\n if (!path.startsWith(\"/\")) {\n // Not absolute. Resolve against matched path.\n path = resolvePath(match.path, path);\n }\n } else {\n return reject(new TypeError(`Redirect must either be a path string or a function.`));\n }\n\n resolve(\n this.#resolveRoute(new URL(path, window.location.origin), [\n ...journey,\n { kind: \"redirect\", message: `redirecting '${match.path}' -> '${path}'` },\n ]),\n );\n } else {\n resolve({ match, journey: [...journey, { kind: \"match\", message: `matched route '${match.path}'` }] });\n }\n };\n\n if (match.meta.beforeMatch?.length) {\n const callbacks = match.meta.beforeMatch;\n let i = -1;\n const next = () => {\n i++;\n if (i === callbacks.length) {\n // Mount route\n finalize();\n } else {\n // Next callback\n callbacks[i]({\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n\n // TODO: Allow setting context variables from here? Would apply to the context of the matched view.\n redirect: (path) => {\n redirect = path;\n finalize();\n },\n\n next,\n });\n }\n };\n\n next();\n\n // TODO: Show warning after timeout if next hasn't been called?\n } else {\n finalize();\n }\n });\n }\n\n /**\n * Parses a route definition object into a set of matchable routes.\n *\n * @param route - Route config object.\n * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.\n */\n #prepareRoute(route: Route, parents: Route[] = [], layers: RouteLayer[] = []) {\n if (!isObject(route) || !isString(route.path)) {\n throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${route}`);\n }\n\n if (route.redirect && route.routes) {\n throw new Error(`Route cannot have both a 'redirect' and nested 'routes'.`);\n } else if (route.redirect && route.view) {\n throw new Error(`Route cannot have both a 'redirect' and a 'view'.`);\n } else if (!route.view && !route.routes && !route.redirect) {\n throw new Error(`Route must have a 'view', a 'redirect', or a set of nested 'routes'.`);\n }\n\n let parts: string[] = [];\n\n for (const parent of parents) {\n parts.push(...splitPath(parent.path));\n }\n\n parts.push(...splitPath(route.path));\n\n // Remove trailing wildcard for joining with nested routes.\n if (parts[parts.length - 1] === \"*\") {\n parts.pop();\n }\n\n const routes: RouteConfig[] = [];\n\n if (route.redirect) {\n let redirect = route.redirect;\n\n if (isString(redirect)) {\n redirect = resolvePath(joinPath(parts), redirect);\n\n if (!redirect.startsWith(\"/\")) {\n redirect = \"/\" + redirect;\n }\n }\n\n routes.push({\n pattern: \"/\" + joinPath([...parts, ...splitPath(route.path)]),\n meta: {\n redirect,\n },\n });\n\n return routes;\n }\n\n let view: ViewFunction<any> = Passthrough;\n\n if (isFunction(route.view)) {\n view = route.view;\n } else if (route.view) {\n throw new TypeError(`Route '${route.path}' expected a view function or undefined. Got: ${route.view}`);\n }\n\n const layer: RouteLayer = { id: this.#layerId++, view };\n\n // Parse nested routes if they exist.\n if (route.routes) {\n for (const subroute of route.routes) {\n routes.push(...this.#prepareRoute(subroute, [...parents, route], [...layers, layer]));\n }\n } else {\n routes.push({\n pattern: parent ? joinPath([...parents.map((p) => p.path), route.path]) : route.path,\n meta: {\n pattern: route.path,\n layers: [...layers, layer],\n beforeMatch: parents\n .flatMap((parent) => parent.beforeMatch)\n .concat(route.beforeMatch)\n .filter((x) => x != null),\n },\n });\n }\n\n return routes;\n }\n}\n\nfunction assertValidRedirects(routes: ParsedRoute<RouteMeta>[]) {\n // Test redirects to make sure all possible redirect targets actually exist.\n for (const route of routes) {\n if (route.meta.redirect) {\n let redirectPath: string;\n\n if (isFunction(route.meta.redirect)) {\n // throw new Error(`Redirect functions are not yet supported.`);\n // Just allow, though it could fail later. Best not to call the function and cause potential side effects.\n } else if (isString(route.meta.redirect)) {\n redirectPath = route.meta.redirect;\n\n const match = matchRoutes(routes, redirectPath, {\n willMatch(r) {\n return r !== route;\n },\n });\n\n if (!match) {\n throw new Error(`Found a redirect to an undefined URL. From '${route.pattern}' to '${route.meta.redirect}'`);\n }\n } else {\n throw new TypeError(`Expected a string or redirect function. Got: ${route.meta.redirect}`);\n }\n }\n }\n}\n\n/**\n * Parses the data-router-preserve-query attribute from a link.\n */\nfunction parsePreserveQueryAttribute(value: null | string | boolean): boolean | string[] {\n if (value === null) {\n return false;\n } else if (value === true || value === false) {\n return value;\n } else if (typeof value === \"string\") {\n value = value.trim();\n if (value === \"\" || value === \"true\") {\n return true;\n } else if (value === \"false\") {\n return false;\n }\n\n return value\n .split(\",\")\n .map((k) => k.trim())\n .filter((k) => k.length > 0);\n } else {\n throw new Error(`Invalid type for data-router-preserve-query attribute: ${typeof value} (value: ${value})`);\n }\n}\n\nclass NoRouteError extends Error {}\n"],"names":["Passthrough","_","ctx","splitPath","path","assertString","f","joinPath","parts","assertArrayOf","part","isFunction","x","joined","_a","p","resolvePath","base","resolved","i","parseQueryParams","query","entries","entry","matchRoutes","routes","url","options","route","fragments","matched","frag","params","sortRoutes","withoutParams","withNumericParams","withParams","wildcard","bySizeDesc","a","b","patternToFragments","pattern","safeExternalLink","protocolLink","catchLinks","root","callback","_window","traverse","node","handler","e","anchor","replaceParams","key","value","MOUNT","UNMOUNT","ROOT_VIEW","Router","__privateAdd","_Router_instances","_logger","_layerId","_activeLayers","_routes","_isMounted","__publicField","constructView","_hash","_unsubscribers","_match","$","__privateGet","shallowEqual","assertObject","__privateSet","__privateMethod","prepareRoute_fn","assertValidRedirects","parent","createLogger","onPopState","updateRoute_fn","href","preserve","parsePreserveQueryAttribute","steps","replace_fn","push_fn","values","match","peek","queryParts","queryString","getCurrentURL_fn","logger","rootView","journey","resolveRoute_fn","step","oldPattern","isArray","preserved","current","mountRoute_fn","NoRouteError","layers","matchedLayer","activeLayer","parentLayer","view","resolve","reject","redirect","finalize","isString","redirectContext","callbacks","next","parents","isObject","layer","__privateWrapper","subroute","redirectPath","r","k"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router-W2HPWbeI.js","sources":["../src/core/views/passthrough.ts","../src/router/router.utils.ts","../src/router/router.ts"],"sourcesContent":["import { type ViewContext } from \"../nodes/view.js\";\n\n/**\n * A utility view that simply displays a route.\n */\nexport function Passthrough(_: {}, ctx: ViewContext) {\n return ctx.outlet();\n}\n","import { assertString, assertArrayOf, isFunction } from \"../typeChecking.js\";\n\nexport type RouteMatch<T = Record<string, any>> = {\n /**\n * The path string that triggered this match.\n */\n path: string;\n\n /**\n * The pattern satisfied by `path`.\n */\n pattern: string;\n\n /**\n * Named params as parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params as parsed from `path`.\n */\n query: Record<string, string>;\n\n /**\n * Metadata registered to this route.\n */\n meta: T;\n};\n\nexport enum FragTypes {\n Literal = 1,\n Param = 2,\n Wildcard = 3,\n NumericParam = 4,\n}\n\nexport type RouteFragment = {\n name: string;\n type: FragTypes;\n value: string | number | null;\n};\n\nexport type ParsedRoute<T> = {\n pattern: string;\n fragments: RouteFragment[];\n meta: T;\n};\n\nexport type RouteMatchOptions<T> = {\n willMatch?: (route: ParsedRoute<T>) => boolean;\n};\n\n/**\n * Separates a URL path into multiple fragments.\n *\n * @param path - A path string (e.g. `\"/api/users/5\"`)\n * @returns an array of fragments (e.g. `[\"api\", \"users\", \"5\"]`)\n */\nexport function splitPath(path: string): string[] {\n assertString(path, \"Expected `path` to be a string. Got type: %t, value: %v\");\n\n return path\n .split(\"/\")\n .map((f) => f.trim())\n .filter((f) => f !== \"\");\n}\n\n/**\n * Joins multiple URL path fragments into a single string.\n *\n * @param parts - One or more URL fragments (e.g. `[\"api\", \"users\", 5]`)\n * @returns a joined path (e.g. `\"api/users/5\"`)\n */\nexport function joinPath(parts: { toString(): string }[]): string {\n assertArrayOf(\n (part) => isFunction(part?.toString),\n parts,\n \"Expected `parts` to be an array of objects with a .toString() method. Got type: %t, value: %v\",\n );\n\n parts = parts.filter((x) => x).flatMap(String);\n\n let joined = parts.shift()?.toString();\n\n if (joined) {\n for (const part of parts.map((p) => p.toString())) {\n if (part.startsWith(\".\")) {\n // Resolve relative path against joined\n joined = resolvePath(joined, part);\n } else if (joined[joined.length - 1] !== \"/\") {\n if (part[0] !== \"/\") {\n joined += \"/\" + part;\n } else {\n joined += part;\n }\n } else {\n if (part[0] === \"/\") {\n joined += part.slice(1);\n } else {\n joined += part;\n }\n }\n }\n\n // Remove trailing slash (unless path is just '/')\n if (joined && joined !== \"/\" && joined.endsWith(\"/\")) {\n joined = joined.slice(0, joined.length - 1);\n }\n }\n\n return joined ?? \"\";\n}\n\nexport function resolvePath(base: string, part: string | null) {\n assertString(base, \"Expected `base` to be a string. Got type: %t, value: %v\");\n\n if (part == null) {\n part = base;\n base = \"\";\n }\n\n if (part.startsWith(\"/\")) {\n return part;\n }\n\n let resolved = base;\n\n while (true) {\n if (part.startsWith(\"..\")) {\n for (let i = resolved.length; i > 0; --i) {\n if (resolved[i] === \"/\" || i === 0) {\n resolved = resolved.slice(0, i);\n part = part.replace(/^\\.\\.\\/?/, \"\");\n break;\n }\n }\n } else if (part.startsWith(\".\")) {\n part = part.replace(/^\\.\\/?/, \"\");\n } else {\n break;\n }\n }\n\n return joinPath([resolved, part]);\n}\n\nexport function parseQueryParams(query: string): Record<string, string> {\n if (!query) return {};\n\n if (query.startsWith(\"?\")) {\n query = query.slice(1);\n }\n\n const entries = query\n .split(\"&\")\n .filter((x) => x.trim() !== \"\")\n .map((entry) =>\n entry\n .split(\"=\")\n .map((x) => x.trim())\n .slice(0, 2),\n );\n\n return Object.fromEntries(entries);\n}\n\n/**\n * Returns the nearest match, or undefined if the path matches no route.\n *\n * @param url - Path to match against routes.\n * @param options - Options to customize how matching operates.\n */\nexport function matchRoutes<T>(\n routes: ParsedRoute<T>[],\n url: string,\n options: RouteMatchOptions<T> = {},\n): RouteMatch<T> | undefined {\n const [path, query] = url.split(\"?\");\n const parts = splitPath(path);\n\n routes: for (const route of routes) {\n const { fragments } = route;\n const hasWildcard = fragments[fragments.length - 1]?.type === FragTypes.Wildcard;\n\n if (!hasWildcard && fragments.length !== parts.length) {\n continue routes;\n }\n\n if (options.willMatch && !options.willMatch(route)) {\n continue routes;\n }\n\n const matched: RouteFragment[] = [];\n\n fragments: for (let i = 0; i < fragments.length; i++) {\n const part = parts[i];\n const frag = fragments[i];\n\n if (part == null && frag.type !== FragTypes.Wildcard) {\n continue routes;\n }\n\n switch (frag.type) {\n case FragTypes.Literal:\n if (frag.name.toLowerCase() === part.toLowerCase()) {\n matched.push(frag);\n break;\n } else {\n continue routes;\n }\n case FragTypes.Param:\n matched.push({ ...frag, value: part });\n break;\n case FragTypes.Wildcard:\n matched.push({ ...frag, value: parts.slice(i).join(\"/\") });\n break fragments;\n case FragTypes.NumericParam:\n if (!isNaN(Number(part))) {\n matched.push({ ...frag, value: part });\n break;\n } else {\n continue routes;\n }\n default:\n throw new Error(`Unknown fragment type: ${frag.type}`);\n }\n }\n\n const params: Record<string, string> = {};\n\n for (const frag of matched) {\n if (frag.type === FragTypes.Param) {\n params[frag.name] = decodeURIComponent(frag.value as string);\n }\n\n if (frag.type === FragTypes.NumericParam) {\n params[frag.name] = String(frag.value);\n }\n\n if (frag.type === FragTypes.Wildcard) {\n params.wildcard = \"/\" + decodeURIComponent(frag.value as string);\n }\n }\n\n return {\n path: \"/\" + matched.map((f) => f.value).join(\"/\"),\n pattern:\n \"/\" +\n fragments\n .map((f) => {\n if (f.type === FragTypes.Param) {\n return `{${f.name}}`;\n }\n\n if (f.type === FragTypes.NumericParam) {\n return `{#${f.name}}`;\n }\n\n return f.name;\n })\n .join(\"/\"),\n params,\n query: parseQueryParams(query),\n meta: route.meta,\n };\n }\n}\n\n/**\n * Sort routes descending by specificity. Guarantees that the most specific route matches first\n * no matter the order in which they were added.\n *\n * Routes without named params and routes with more fragments are weighted more heavily.\n */\nexport function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[] {\n const withoutParams = [];\n const withNumericParams = [];\n const withParams = [];\n const wildcard = [];\n\n for (const route of routes) {\n const { fragments } = route;\n\n if (fragments.some((f) => f.type === FragTypes.Wildcard)) {\n wildcard.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.NumericParam)) {\n withNumericParams.push(route);\n } else if (fragments.some((f) => f.type === FragTypes.Param)) {\n withParams.push(route);\n } else {\n withoutParams.push(route);\n }\n }\n\n const bySizeDesc = (a: ParsedRoute<T>, b: ParsedRoute<T>) => {\n if (a.fragments.length > b.fragments.length) {\n return -1;\n } else {\n return 1;\n }\n };\n\n withoutParams.sort(bySizeDesc);\n withNumericParams.sort(bySizeDesc);\n withParams.sort(bySizeDesc);\n wildcard.sort(bySizeDesc);\n\n return [...withoutParams, ...withNumericParams, ...withParams, ...wildcard];\n}\n\n/**\n * Converts a route pattern into a set of matchable fragments.\n *\n * @param route - A route string (e.g. \"/api/users/{id}\")\n */\nexport function patternToFragments(pattern: string): RouteFragment[] {\n const parts = splitPath(pattern);\n const fragments = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === \"*\") {\n if (i !== parts.length - 1) {\n throw new Error(`Wildcard must be at the end of a pattern. Received: ${pattern}`);\n }\n fragments.push({\n type: FragTypes.Wildcard,\n name: \"*\",\n value: null,\n });\n } else if (part.at(0) === \"{\" && part.at(-1) === \"}\") {\n fragments.push({\n type: part[1] === \"#\" ? FragTypes.NumericParam : FragTypes.Param,\n name: part[1] === \"#\" ? part.slice(2, -1) : part.slice(1, -1),\n value: null,\n });\n } else {\n fragments.push({\n type: FragTypes.Literal,\n name: part,\n value: part,\n });\n }\n }\n\n return fragments;\n}\n\nconst safeExternalLink = /(noopener|noreferrer) (noopener|noreferrer)/;\nconst protocolLink = /^[\\w-_]+:/;\n\n/**\n * Intercepts links within the root node.\n *\n * This is adapted from https://github.com/choojs/nanohref/blob/master/index.js\n *\n * @param root - Element under which to intercept link clicks\n * @param callback - Function to call when a click event is intercepted\n * @param _window - (optional) Override for global window object\n */\nexport function catchLinks(root: Element, callback: (anchor: HTMLAnchorElement) => void, _window = window) {\n function traverse(node: HTMLElement | null): HTMLAnchorElement | null {\n if (!node || node === root) {\n return null;\n }\n\n if (node.localName !== \"a\" || (node as any).href === undefined) {\n return traverse(node.parentNode as HTMLElement | null);\n }\n\n return node as HTMLAnchorElement;\n }\n\n function handler(e: MouseEvent) {\n if ((e.button && e.button !== 0) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey || e.defaultPrevented) {\n return;\n }\n\n const anchor = traverse(e.target as HTMLElement);\n\n if (!anchor) {\n return;\n }\n\n if (\n _window.location.protocol !== anchor.protocol ||\n _window.location.hostname !== anchor.hostname ||\n _window.location.port !== anchor.port ||\n anchor.hasAttribute(\"data-router-ignore\") ||\n anchor.hasAttribute(\"download\") ||\n (anchor.getAttribute(\"target\") === \"_blank\" && safeExternalLink.test(anchor.getAttribute(\"rel\")!)) ||\n protocolLink.test(anchor.getAttribute(\"href\")!)\n ) {\n return;\n }\n\n e.preventDefault();\n callback(anchor);\n }\n\n root.addEventListener(\"click\", handler as any);\n\n return function cancel() {\n root.removeEventListener(\"click\", handler as any);\n };\n}\n\n/**\n * Replace route pattern param placeholders with real matched values.\n */\nexport function replaceParams(path: string, params: Record<string, string | number>) {\n for (const key in params) {\n const value = params[key].toString();\n path = path.replace(`{${key}}`, value).replace(`{#${key}}`, value);\n }\n\n return path;\n}\n","import { createLogger, type Logger } from \"../core/logger.js\";\nimport { constructView, type ViewElement, type ViewFunction } from \"../core/nodes/view.js\";\nimport { $, peek, type UnsubscribeFn } from \"../core/signals.js\";\nimport { Passthrough } from \"../core/views/passthrough.js\";\nimport { assertObject, isArray, isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { Stringable } from \"../types.js\";\nimport { shallowEqual } from \"../utils.js\";\nimport {\n catchLinks,\n joinPath,\n matchRoutes,\n patternToFragments,\n replaceParams,\n resolvePath,\n sortRoutes,\n splitPath,\n type ParsedRoute,\n type RouteMatch,\n} from \"./router.utils.js\";\n\n// ----- Types ----- //\n\nexport interface RouteMatchContext {\n path: string;\n pattern: string;\n params: Record<string, string>;\n query: Record<string, string>;\n\n /**\n * Redirects the user to a different route instead of matching the current one.\n */\n redirect(path: string): void;\n\n /**\n * Triggers the next beforeMatch function, or mounts the route.\n */\n next(): void;\n}\n\nexport interface Route {\n /**\n * The path or path fragment to match.\n */\n path: string;\n\n /**\n * Path to redirect to when this route is matched, or a callback function that returns such path.\n */\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n\n /**\n * View to display when this route is matched.\n */\n view?: ViewFunction<any>;\n\n /**\n * Subroutes.\n */\n routes?: Route[];\n\n /**\n * Called after the match is identified but before it is acted on. Use this to set state, load data, etc.\n */\n beforeMatch?: (ctx: RouteMatchContext) => void | Promise<void>;\n}\n\nexport interface RouteMeta {\n redirect?: string | ((ctx: RouteRedirectContext) => string) | ((ctx: RouteRedirectContext) => Promise<string>);\n pattern?: string;\n layers?: RouteLayer[];\n beforeMatch?: ((ctx: RouteMatchContext) => void | Promise<void>)[];\n}\n\nexport interface RouteConfig {\n pattern: string;\n meta: RouteMeta;\n}\n\nexport interface RouteLayer {\n id: number;\n view: ViewFunction<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n view: ViewElement;\n}\n\n/**\n * Object passed to redirect callbacks. Contains information useful for determining how to redirect.\n */\nexport interface RouteRedirectContext {\n /**\n * The path as it appears in the URL bar.\n */\n path: string;\n\n /**\n * The pattern that this path was matched with.\n */\n pattern: string;\n\n /**\n * Named route params parsed from `path`.\n */\n params: Record<string, string>;\n\n /**\n * Query params parsed from `path`.\n */\n query: Record<string, string>;\n}\n\n/**\n * A log for a single step in the route resolution process.\n */\ninterface JourneyStep {\n kind: \"match\" | \"redirect\" | \"miss\";\n message: string;\n}\n\nexport interface NavigateOptions {\n /**\n * Replace the current item in the history stack instead of adding a new one.\n * The back button will send the user to the page they visited before this. Defaults to false.\n */\n replace?: boolean;\n\n /**\n * Preserve existing query params (if any) when navigating. Defaults to false.\n * If true, all existing query params are preserved and merged with new ones.\n * If an array of strings is passed only those keys will be preserved, then merged with any new ones.\n */\n preserveQuery?: boolean | string[];\n}\n\nexport interface RouterOptions {\n routes: Route[];\n\n /**\n * When true, the router will construct routes like \"https://www.example.com/#/sub/route\" which work without any backend intervention.\n */\n hash?: boolean;\n}\n\n// ----- Code ----- //\n\nexport const MOUNT = Symbol();\nexport const UNMOUNT = Symbol();\nexport const ROOT_VIEW = Symbol();\n\nexport class Router {\n #logger?: Logger;\n\n #layerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #routes: ParsedRoute<RouteMeta>[] = [];\n\n #isMounted = false;\n\n [ROOT_VIEW] = constructView(Passthrough);\n\n /**\n * Use hash routing when true. Configured in router options.\n */\n #hash = false;\n\n // Callbacks that need to be called on unmount.\n #unsubscribers: UnsubscribeFn[] = [];\n\n /**\n * The current match object.\n */\n #match = $<RouteMatch>();\n\n /**\n * The currently matched route pattern, if any.\n */\n readonly $pattern = $(() => this.#match()?.pattern);\n\n /**\n * The current URL path.\n */\n readonly $path = $(() => this.#match()?.path ?? window.location.pathname);\n\n /**\n * The current named path params.\n */\n readonly $params = $(() => this.#match()?.params ?? {}, { equals: shallowEqual });\n\n /**\n * The current query params. Changes to this object will be reflected in the URL.\n */\n readonly $query = $(() => this.#match()?.query ?? {}, { equals: shallowEqual });\n\n constructor(options: RouterOptions) {\n assertObject(options, \"Options must be an object. Got: %t\");\n\n if (options.hash) {\n this.#hash = true;\n }\n\n // Add routes.\n this.#routes = sortRoutes(\n options.routes\n .flatMap((route) => this.#prepareRoute(route))\n .map((route) => ({\n pattern: route.pattern,\n meta: route.meta,\n fragments: patternToFragments(route.pattern),\n })),\n );\n\n assertValidRedirects(this.#routes);\n }\n\n async [MOUNT](parent: Element) {\n this.#logger = createLogger(\"Dolla.router\");\n\n // Listen for popstate events and update route accordingly.\n const onPopState = () => {\n this.#updateRoute(undefined, {});\n };\n window.addEventListener(\"popstate\", onPopState);\n this.#unsubscribers.push(() => window.removeEventListener(\"popstate\", onPopState));\n\n // Listen for clicks on <a> tags within the app.\n this.#unsubscribers.push(\n catchLinks(parent, (anchor) => {\n let href = anchor.getAttribute(\"href\")!;\n this.#logger!.info(\"intercepted click on <a> tag\", anchor);\n\n const preserve = anchor.getAttribute(\"data-router-preserve-query\");\n\n this.go(href, {\n preserveQuery: parsePreserveQueryAttribute(preserve),\n });\n }),\n );\n this.#logger.info(\"will intercept clicks on <a> tags within root element\", parent);\n\n this.#isMounted = true;\n\n // Setup initial route content.\n await this.#updateRoute(undefined, {});\n }\n\n async [UNMOUNT]() {\n for (const callback of this.#unsubscribers) {\n callback();\n }\n this.#unsubscribers = [];\n }\n\n /**\n * Navigate backward. Pass a number of steps to hit the back button that many times.\n */\n back(steps = 1) {\n window.history.go(-steps);\n }\n\n /**\n * Navigate forward. Pass a number of steps to hit the forward button that many times.\n */\n forward(steps = 1) {\n window.history.go(steps);\n }\n\n /**\n * Navigates to another route.\n *\n * @example\n * router.go(\"/login\"); // navigate to `/login`\n * router.go[\"/users\", 215], { replace: true }); // replace current history entry with `/users/215`\n */\n go(path: Stringable | Stringable[], options: NavigateOptions = {}) {\n let joined: string;\n\n if (Array.isArray(path)) {\n joined = joinPath(path);\n } else {\n joined = path.toString();\n }\n\n joined = resolvePath(window.location.pathname, joined);\n\n if (options.replace) {\n this.#replace(joined, options);\n } else {\n this.#push(joined, options);\n }\n }\n\n /**\n * Updates query params, keeping existing ones and applying new ones. Removes the query param if value is set to `null`.\n */\n updateQuery(values: Record<string, Stringable | null>) {\n const match = peek(this.#match)!;\n const query = { ...this.$query() };\n\n for (const key in values) {\n const value = values[key];\n if (value === null) {\n delete query[key];\n } else {\n query[key] = value.toString();\n }\n }\n\n let queryParts: string[] = [];\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n this.#match({ ...match, query });\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n #push(href: string, options: NavigateOptions) {\n this.#logger?.info(\"(push)\", href);\n\n window.history.pushState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #replace(href: string, options: NavigateOptions) {\n this.#logger?.info(\"(replace)\", href);\n\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + href : href);\n this.#updateRoute(href, options);\n }\n\n #getCurrentURL(): URL {\n if (this.#hash) {\n return new URL(window.location.hash.slice(1), window.location.origin);\n } else {\n return new URL(window.location.pathname, window.location.origin);\n }\n }\n\n /**\n * Run when the location changes. Diffs and mounts new routes and updates\n * the $path, $route, $params and $query states accordingly.\n */\n async #updateRoute(href: string | undefined, options: NavigateOptions) {\n const logger = this.#logger;\n const rootView = this[ROOT_VIEW];\n const url = href ? new URL(href, window.location.origin) : this.#getCurrentURL();\n\n const { match, journey } = await this.#resolveRoute(url);\n\n for (const step of journey) {\n switch (step.kind) {\n case \"match\":\n logger?.info(`📍 ${step.message}`);\n break;\n case \"redirect\":\n logger?.info(`↩️ ${step.message}`);\n break;\n case \"miss\":\n logger?.info(`💀 ${step.message}`);\n break;\n default:\n break;\n }\n }\n\n if (match) {\n const oldPattern = peek(this.$pattern);\n\n // Merge query params.\n let query = match.query;\n let queryParts: string[] = [];\n\n if (options.preserveQuery === true) {\n query = Object.assign({}, this.$query(), match.query);\n } else if (isArray(options.preserveQuery)) {\n const preserved: Record<string, any> = {};\n const current = this.$query();\n for (const key in current) {\n if (options.preserveQuery.includes(key)) {\n preserved[key] = current[key];\n }\n }\n query = Object.assign({}, preserved, match.query);\n }\n\n for (const key in query) {\n queryParts.push(`${key}=${query[key]}`);\n }\n const queryString = queryParts.length > 0 ? \"?\" + queryParts.join(\"&\") : \"\";\n\n this.#match({ ...match, query });\n\n // Update the URL if matched path differs from navigator path.\n // This happens if route resolution involved redirects.\n if (rootView && (match.path !== location.pathname || location.search !== queryString)) {\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n if (rootView && match.pattern !== oldPattern) {\n this.#mountRoute(rootView, match);\n }\n } else {\n // Only crash if routing has been configured.\n if (this.#isMounted) {\n logger!.crash(new NoRouteError(`Failed to match route '${url.pathname}'`));\n }\n }\n\n return { match, journey };\n }\n\n /**\n * Takes a matched route and mounts it.\n */\n #mountRoute(rootView: ViewElement, match: RouteMatch<RouteMeta>) {\n const layers = match.meta.layers!;\n\n // Diff and update route layers.\n for (let i = 0; i < layers.length; i++) {\n const matchedLayer = layers[i];\n const activeLayer = this.#activeLayers[i];\n\n if (activeLayer?.id !== matchedLayer.id) {\n // Discard all previously active layers starting at this depth.\n this.#activeLayers = this.#activeLayers.slice(0, i);\n activeLayer?.view.unmount();\n\n const parentLayer = this.#activeLayers.at(-1);\n const parent = parentLayer?.view ?? rootView;\n\n const view = parent.setRouteView(matchedLayer.view);\n this.#activeLayers.push({ id: matchedLayer.id, view });\n }\n }\n }\n\n /**\n * Takes a URL and finds a match, following redirects.\n */\n async #resolveRoute(\n url: URL,\n journey: JourneyStep[] = [],\n ): Promise<{\n match: RouteMatch<RouteMeta> | null;\n journey: JourneyStep[];\n }> {\n return new Promise((resolve, reject) => {\n const match = matchRoutes(this.#routes, url.pathname);\n\n if (!match) {\n return resolve({\n match: null,\n journey: [...journey, { kind: \"miss\", message: `no match for '${url.pathname}'` }],\n });\n }\n\n let redirect = match.meta.redirect;\n\n const finalize = async () => {\n if (redirect != null) {\n let path: string;\n\n if (isString(redirect)) {\n path = replaceParams(redirect, match.params);\n } else if (isFunction(redirect)) {\n const redirectContext: RouteRedirectContext = {\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n };\n path = await redirect(redirectContext);\n if (!isString(path)) {\n return reject(new Error(`Redirect function must return a path to redirect to.`));\n }\n if (!path.startsWith(\"/\")) {\n // Not absolute. Resolve against matched path.\n path = resolvePath(match.path, path);\n }\n } else {\n return reject(new TypeError(`Redirect must either be a path string or a function.`));\n }\n\n resolve(\n this.#resolveRoute(new URL(path, window.location.origin), [\n ...journey,\n { kind: \"redirect\", message: `redirecting '${match.path}' -> '${path}'` },\n ]),\n );\n } else {\n resolve({ match, journey: [...journey, { kind: \"match\", message: `matched route '${match.path}'` }] });\n }\n };\n\n if (match.meta.beforeMatch?.length) {\n const callbacks = match.meta.beforeMatch;\n let i = -1;\n const next = () => {\n i++;\n if (i === callbacks.length) {\n // Mount route\n finalize();\n } else {\n // Next callback\n callbacks[i]({\n path: match.path,\n pattern: match.pattern,\n params: match.params,\n query: match.query,\n\n // TODO: Allow setting context variables from here? Would apply to the context of the matched view.\n redirect: (path) => {\n redirect = path;\n finalize();\n },\n\n next,\n });\n }\n };\n\n next();\n\n // TODO: Show warning after timeout if next hasn't been called?\n } else {\n finalize();\n }\n });\n }\n\n /**\n * Parses a route definition object into a set of matchable routes.\n *\n * @param route - Route config object.\n * @param layers - Array of parent layers. Passed when this function calls itself on nested routes.\n */\n #prepareRoute(route: Route, parents: Route[] = [], layers: RouteLayer[] = []) {\n if (!isObject(route) || !isString(route.path)) {\n throw new TypeError(`Route configs must be objects with a 'path' string property. Got: ${route}`);\n }\n\n if (route.redirect && route.routes) {\n throw new Error(`Route cannot have both a 'redirect' and nested 'routes'.`);\n } else if (route.redirect && route.view) {\n throw new Error(`Route cannot have both a 'redirect' and a 'view'.`);\n } else if (!route.view && !route.routes && !route.redirect) {\n throw new Error(`Route must have a 'view', a 'redirect', or a set of nested 'routes'.`);\n }\n\n let parts: string[] = [];\n\n for (const parent of parents) {\n parts.push(...splitPath(parent.path));\n }\n\n parts.push(...splitPath(route.path));\n\n // Remove trailing wildcard for joining with nested routes.\n if (parts[parts.length - 1] === \"*\") {\n parts.pop();\n }\n\n const routes: RouteConfig[] = [];\n\n if (route.redirect) {\n let redirect = route.redirect;\n\n if (isString(redirect)) {\n redirect = resolvePath(joinPath(parts), redirect);\n\n if (!redirect.startsWith(\"/\")) {\n redirect = \"/\" + redirect;\n }\n }\n\n routes.push({\n pattern: \"/\" + joinPath([...parts, ...splitPath(route.path)]),\n meta: {\n redirect,\n },\n });\n\n return routes;\n }\n\n let view: ViewFunction<any> = Passthrough;\n\n if (isFunction(route.view)) {\n view = route.view;\n } else if (route.view) {\n throw new TypeError(`Route '${route.path}' expected a view function or undefined. Got: ${route.view}`);\n }\n\n const layer: RouteLayer = { id: this.#layerId++, view };\n\n // Parse nested routes if they exist.\n if (route.routes) {\n for (const subroute of route.routes) {\n routes.push(...this.#prepareRoute(subroute, [...parents, route], [...layers, layer]));\n }\n } else {\n routes.push({\n pattern: parent ? joinPath([...parents.map((p) => p.path), route.path]) : route.path,\n meta: {\n pattern: route.path,\n layers: [...layers, layer],\n beforeMatch: parents\n .flatMap((parent) => parent.beforeMatch)\n .concat(route.beforeMatch)\n .filter((x) => x != null),\n },\n });\n }\n\n return routes;\n }\n}\n\nfunction assertValidRedirects(routes: ParsedRoute<RouteMeta>[]) {\n // Test redirects to make sure all possible redirect targets actually exist.\n for (const route of routes) {\n if (route.meta.redirect) {\n let redirectPath: string;\n\n if (isFunction(route.meta.redirect)) {\n // throw new Error(`Redirect functions are not yet supported.`);\n // Just allow, though it could fail later. Best not to call the function and cause potential side effects.\n } else if (isString(route.meta.redirect)) {\n redirectPath = route.meta.redirect;\n\n const match = matchRoutes(routes, redirectPath, {\n willMatch(r) {\n return r !== route;\n },\n });\n\n if (!match) {\n throw new Error(`Found a redirect to an undefined URL. From '${route.pattern}' to '${route.meta.redirect}'`);\n }\n } else {\n throw new TypeError(`Expected a string or redirect function. Got: ${route.meta.redirect}`);\n }\n }\n }\n}\n\n/**\n * Parses the data-router-preserve-query attribute from a link.\n */\nfunction parsePreserveQueryAttribute(value: null | string | boolean): boolean | string[] {\n if (value === null) {\n return false;\n } else if (value === true || value === false) {\n return value;\n } else if (typeof value === \"string\") {\n value = value.trim();\n if (value === \"\" || value === \"true\") {\n return true;\n } else if (value === \"false\") {\n return false;\n }\n\n return value\n .split(\",\")\n .map((k) => k.trim())\n .filter((k) => k.length > 0);\n } else {\n throw new Error(`Invalid type for data-router-preserve-query attribute: ${typeof value} (value: ${value})`);\n }\n}\n\nclass NoRouteError extends Error {}\n"],"names":["Passthrough","_","ctx","splitPath","path","assertString","f","joinPath","parts","assertArrayOf","part","isFunction","x","joined","_a","p","resolvePath","base","resolved","i","parseQueryParams","query","entries","entry","matchRoutes","routes","url","options","route","fragments","matched","frag","params","sortRoutes","withoutParams","withNumericParams","withParams","wildcard","bySizeDesc","a","b","patternToFragments","pattern","safeExternalLink","protocolLink","catchLinks","root","callback","_window","traverse","node","handler","e","anchor","replaceParams","key","value","MOUNT","UNMOUNT","ROOT_VIEW","Router","__privateAdd","_Router_instances","_logger","_layerId","_activeLayers","_routes","_isMounted","__publicField","constructView","_hash","_unsubscribers","_match","$","__privateGet","shallowEqual","assertObject","__privateSet","__privateMethod","prepareRoute_fn","assertValidRedirects","parent","createLogger","onPopState","updateRoute_fn","href","preserve","parsePreserveQueryAttribute","steps","replace_fn","push_fn","values","match","peek","queryParts","queryString","getCurrentURL_fn","logger","rootView","journey","resolveRoute_fn","step","oldPattern","isArray","preserved","current","mountRoute_fn","NoRouteError","layers","matchedLayer","activeLayer","parentLayer","view","resolve","reject","redirect","finalize","isString","redirectContext","callbacks","next","parents","isObject","layer","__privateWrapper","subroute","redirectPath","r","k"],"mappings":"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"}
|
package/dist/router.js
CHANGED
|
@@ -2,7 +2,7 @@ var ee = Object.defineProperty;
|
|
|
2
2
|
var te = (n, e, t) => e in n ? ee(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t;
|
|
3
3
|
var r = (n, e, t) => te(n, typeof e != "symbol" ? e + "" : e, t);
|
|
4
4
|
import { t as G, g as f, c as h, i as C, b as $, h as se, j as D } from "./typeChecking-EAVNeFyB.js";
|
|
5
|
-
import { e as d, p as y, g as w, b as ne, j as ie, $ as N, d as oe, k as R, f as z } from "./logger-
|
|
5
|
+
import { e as d, p as y, g as w, b as ne, j as ie, $ as N, d as oe, k as R, f as z } from "./logger-CByUPmlz.js";
|
|
6
6
|
const W = /* @__PURE__ */ new Map(), S = {
|
|
7
7
|
stores: W
|
|
8
8
|
}, p = Symbol.for("DollaMarkupElement");
|
|
@@ -929,4 +929,4 @@ export {
|
|
|
929
929
|
xe as u,
|
|
930
930
|
pe as w
|
|
931
931
|
};
|
|
932
|
-
//# sourceMappingURL=view-
|
|
932
|
+
//# sourceMappingURL=view-CAEIbcZt.js.map
|