@manyducks.co/dolla 2.0.0-alpha.56 → 2.0.0-alpha.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +5 -2
  2. package/bun.lock +207 -0
  3. package/dist/core/app.d.ts +17 -0
  4. package/dist/core/context.d.ts +71 -19
  5. package/dist/core/index.d.ts +2 -2
  6. package/dist/core/logger.d.ts +2 -2
  7. package/dist/core/markup.d.ts +14 -13
  8. package/dist/core/mount.d.ts +2 -2
  9. package/dist/core/nodes/dom.d.ts +3 -2
  10. package/dist/core/nodes/dynamic.d.ts +2 -1
  11. package/dist/core/nodes/html.d.ts +7 -5
  12. package/dist/core/nodes/portal.d.ts +4 -3
  13. package/dist/core/nodes/repeat.d.ts +5 -3
  14. package/dist/core/nodes/view.d.ts +6 -8
  15. package/dist/core/signals.d.ts +3 -23
  16. package/dist/core/views/default-crash-view.d.ts +12 -1
  17. package/dist/i18n.js +1 -1
  18. package/dist/index.js +85 -87
  19. package/dist/index.js.map +1 -1
  20. package/dist/jsx-dev-runtime.d.ts +2 -1
  21. package/dist/jsx-dev-runtime.js +4 -11
  22. package/dist/jsx-dev-runtime.js.map +1 -1
  23. package/dist/jsx-runtime.d.ts +3 -2
  24. package/dist/jsx-runtime.js +7 -13
  25. package/dist/jsx-runtime.js.map +1 -1
  26. package/dist/logger-C2AJnlaL.js +516 -0
  27. package/dist/logger-C2AJnlaL.js.map +1 -0
  28. package/dist/markup-BJx8Fwl2.js +1019 -0
  29. package/dist/markup-BJx8Fwl2.js.map +1 -0
  30. package/dist/{router-D43DV_bv.js → router-vfGbWwl9.js} +77 -76
  31. package/dist/router-vfGbWwl9.js.map +1 -0
  32. package/dist/router.js +1 -1
  33. package/dist/types.d.ts +35 -9
  34. package/docs/markup.md +4 -4
  35. package/package.json +2 -2
  36. package/dist/logger-sSxIw5od.js +0 -626
  37. package/dist/logger-sSxIw5od.js.map +0 -1
  38. package/dist/markup-DS7yYBga.js +0 -844
  39. package/dist/markup-DS7yYBga.js.map +0 -1
  40. package/dist/router-D43DV_bv.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"markup-DS7yYBga.js","sources":["../src/core/context.ts","../src/core/symbols.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/view.ts","../src/core/nodes/html.ts","../src/core/nodes/portal.ts","../src/core/nodes/repeat.ts","../src/core/markup.ts"],"sourcesContent":["import { isFunction, typeOf } from \"../typeChecking\";\nimport type { Store } from \"../types\";\nimport { getUniqueId } from \"../utils\";\nimport { createLogger, type Logger, type LoggerOptions } from \"./logger\";\nimport { effect, type EffectFn, get, type MaybeSignal, peek, type UnsubscribeFn } from \"./signals\";\n\ntype StoreMap = Map<Store<any, any>, any>;\n\nexport enum LifecycleEvent {\n WILL_MOUNT,\n DID_MOUNT,\n WILL_UNMOUNT,\n DID_UNMOUNT,\n}\n\n// type LifecycleEvent = \"willMount\" | \"didMount\" | \"willUnmount\" | \"didUnmount\";\n\ntype LifecycleListener = () => void;\ntype LifecycleListeners = {\n [LifecycleEvent.WILL_MOUNT]?: LifecycleListener[];\n [LifecycleEvent.DID_MOUNT]?: LifecycleListener[];\n [LifecycleEvent.WILL_UNMOUNT]?: LifecycleListener[];\n [LifecycleEvent.DID_UNMOUNT]?: LifecycleListener[];\n};\n\nenum LifecycleState {\n Unmounted = 0,\n WillMount = 1,\n WillMountByDependent = 2,\n DidMount = 3,\n DidMountByDependent = 4,\n WillUnmount = 5,\n WillUnmountByDependent = 6,\n DidUnmount = 7,\n}\n\n/**\n * Manages lifecycle events for a Context.\n */\nclass ContextLifecycle {\n state = LifecycleState.Unmounted;\n dependents = 0;\n\n #listeners: LifecycleListeners = {};\n\n on<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [listener];\n } else if (this.#listeners[event].indexOf(listener) === -1) {\n this.#listeners[event].push(listener);\n }\n }\n\n off<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n if (this.#listeners[event]) {\n this.#listeners[event].splice(this.#listeners[event].indexOf(listener), 1);\n\n if (this.#listeners[event].length === 0) {\n delete this.#listeners[event];\n }\n }\n }\n\n notify<E extends LifecycleEvent>(event: E) {\n if (this.#listeners[event]) {\n for (const listener of this.#listeners[event]) {\n listener();\n }\n }\n }\n\n emit<E extends LifecycleEvent>(event: E, dependent = false) {\n switch (event) {\n case LifecycleEvent.WILL_MOUNT: {\n if (dependent) this.dependents++;\n\n if (this.state < LifecycleState.WillMount) {\n this.state = dependent ? LifecycleState.WillMountByDependent : LifecycleState.WillMount;\n this.notify(event);\n }\n break;\n }\n case LifecycleEvent.DID_MOUNT: {\n if (this.state >= LifecycleState.WillMount && this.state < LifecycleState.DidMount) {\n this.state += 2;\n this.notify(event);\n }\n break;\n }\n case LifecycleEvent.WILL_UNMOUNT: {\n if (dependent) {\n this.dependents--;\n if (!this.dependents) {\n this.emit(LifecycleEvent.WILL_UNMOUNT);\n }\n } else if (this.state >= LifecycleState.DidMount && this.state < LifecycleState.WillUnmount) {\n this.notify(event);\n this.state += 2;\n }\n break;\n }\n case LifecycleEvent.DID_UNMOUNT: {\n if (dependent) {\n if (!this.dependents && this.state === LifecycleState.WillUnmountByDependent) {\n this.emit(LifecycleEvent.DID_UNMOUNT);\n }\n } else if (this.state >= LifecycleState.WillUnmount && this.state < LifecycleState.DidUnmount) {\n // Loop back to .Unmounted\n this.state = LifecycleState.DidUnmount % LifecycleState.DidUnmount;\n this.notify(event);\n }\n break;\n }\n }\n }\n\n dispose() {\n this.emit(LifecycleEvent.WILL_UNMOUNT);\n this.emit(LifecycleEvent.DID_UNMOUNT);\n this.#listeners = {};\n }\n}\n\nexport interface ContextOptions {\n logger?: LoggerOptions;\n}\n\nexport interface LinkedContextOptions extends ContextOptions {\n bindLifecycleToParent?: boolean;\n}\n\nexport interface Context extends Logger {}\n\nexport class Context implements Logger {\n #name: MaybeSignal<string>;\n\n _name: string;\n _lifecycle = new ContextLifecycle();\n _parent?: Context;\n _stores?: StoreMap;\n _state?: Map<any, any>;\n\n get isMounted() {\n const { state } = this._lifecycle;\n return state >= LifecycleState.DidMount && state < LifecycleState.DidUnmount;\n }\n\n /**\n * Returns a new Context with this one as its parent.\n */\n static linked(parent: Context, name: MaybeSignal<string>, options?: LinkedContextOptions): Context {\n const context = new Context(name, options);\n context._parent = parent;\n\n if (options?.bindLifecycleToParent) {\n parent._lifecycle.on(LifecycleEvent.WILL_MOUNT, () => {\n context._lifecycle.emit(LifecycleEvent.WILL_MOUNT);\n });\n parent._lifecycle.on(LifecycleEvent.DID_MOUNT, () => {\n context._lifecycle.emit(LifecycleEvent.DID_MOUNT);\n });\n parent._lifecycle.on(LifecycleEvent.WILL_UNMOUNT, () => {\n context._lifecycle.emit(LifecycleEvent.WILL_UNMOUNT);\n });\n parent._lifecycle.on(LifecycleEvent.DID_UNMOUNT, () => {\n context._lifecycle.emit(LifecycleEvent.DID_UNMOUNT);\n });\n } else {\n context._lifecycle.on(LifecycleEvent.WILL_MOUNT, () => {\n parent._lifecycle.emit(LifecycleEvent.WILL_MOUNT, true);\n });\n context._lifecycle.on(LifecycleEvent.DID_MOUNT, () => {\n parent._lifecycle.emit(LifecycleEvent.DID_MOUNT, true);\n });\n context._lifecycle.on(LifecycleEvent.WILL_UNMOUNT, () => {\n parent._lifecycle.emit(LifecycleEvent.WILL_UNMOUNT, true);\n });\n context._lifecycle.on(LifecycleEvent.DID_UNMOUNT, () => {\n parent._lifecycle.emit(LifecycleEvent.DID_UNMOUNT, true);\n });\n }\n return context;\n }\n\n static emit(event: LifecycleEvent, context: Context) {\n context._lifecycle.emit(event);\n }\n\n constructor(name: MaybeSignal<string>, options?: ContextOptions) {\n this.#name = name;\n this._name = peek(name);\n\n // Add logger methods.\n const logger = createLogger(() => get(this.#name), options?.logger);\n const descriptors = Object.getOwnPropertyDescriptors(logger);\n for (const key in descriptors) {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n\n /**\n * Returns the current name of this context.\n */\n getName(): string {\n return peek(this.#name);\n }\n\n /**\n * Sets a new name for this context.\n */\n setName(name: MaybeSignal<string>) {\n this.#name = name;\n this._name = peek(name); // Try to store name as a readable string for debugging purposes.\n }\n\n addStore<T>(store: Store<any, T>, options?: any): this {\n if (this._stores?.get(store)) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n this.warn(`An instance of ${name} was already added on this context.`);\n return this;\n }\n\n const context = Context.linked(this, store.name, {\n bindLifecycleToParent: true,\n logger: { tag: getUniqueId(), tagName: \"uid\" },\n });\n try {\n if (!this._stores) this._stores = new Map();\n const result = store.call(context, options, context);\n this._stores.set(store, result);\n } catch (error) {\n throw this.crash(error as Error);\n }\n\n return this;\n }\n\n getStore<T>(store: Store<any, T>): T {\n if (!isFunction(store)) {\n throw new StoreError(`Invalid store.`);\n }\n let context: Context = this;\n let result: unknown;\n while (true) {\n result = context._stores?.get(store);\n if (result == null && context._parent != null) {\n context = context._parent;\n } else {\n break;\n }\n }\n if (result == null) {\n throw this.crash(new StoreError(`Store '${store.name}' is not provided by this context.`));\n }\n return result as T;\n }\n\n /**\n * Schedule a callback function to run just before this context is mounted.\n */\n beforeMount(listener: LifecycleListener) {\n this._lifecycle.on(LifecycleEvent.WILL_MOUNT, listener);\n return () => this._lifecycle.off(LifecycleEvent.WILL_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is mounted.\n */\n onMount(listener: LifecycleListener) {\n this._lifecycle.on(LifecycleEvent.DID_MOUNT, listener);\n return () => this._lifecycle.off(LifecycleEvent.DID_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run just before this context is unmounted.\n */\n beforeUnmount(listener: LifecycleListener) {\n this._lifecycle.on(LifecycleEvent.WILL_UNMOUNT, listener);\n return () => this._lifecycle.off(LifecycleEvent.WILL_UNMOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is unmounted.\n */\n onUnmount(listener: LifecycleListener) {\n this._lifecycle.on(LifecycleEvent.DID_UNMOUNT, listener);\n return () => this._lifecycle.off(LifecycleEvent.DID_UNMOUNT, listener);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n // Return callback so cleanup function passes through\n return callback();\n } catch (error) {\n this.error(error);\n if (error instanceof Error) {\n this.crash(error);\n } else if (typeof error === \"string\") {\n this.crash(new Error(error));\n } else {\n this.crash(new Error(`Unknown error thrown in effect callback`));\n }\n }\n };\n\n if (this._lifecycle.state >= LifecycleState.WillMount) {\n // This code is probably in a lifecycle hook; run the effect immediately and trigger unsubscribe when context unmounts.\n const unsubscribe = effect(fn);\n this._lifecycle.on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n return unsubscribe;\n } else {\n // Prime the effect to run when the context is mounted and unsubscribe when unmounted, unless unsubscribed before `willMount`.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n this._lifecycle.on(LifecycleEvent.WILL_MOUNT, () => {\n if (!disposed) {\n unsubscribe = effect(fn);\n this._lifecycle.on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n }\n });\n return () => {\n if (unsubscribe != null) {\n disposed = true;\n unsubscribe();\n }\n };\n }\n }\n\n /**\n * Gets the value stored at `key`, or returns the `defaultValue` if none is set.\n */\n getState<T>(key: any, defaultValue: T): T;\n\n /**\n * Gets the value stored at `key`, or throws an error if none is set.\n */\n getState<T>(key: any): T;\n\n /**\n * Returns a Map containing all state values available to this context.\n */\n getState(): Map<any, any>;\n\n getState<T>(key?: any, defaultValue?: T): T | Map<any, any> {\n if (arguments.length > 0) {\n // Get value by key\n let context: Context = this;\n let value: any;\n while (true) {\n value = context._state?.get(key);\n if (value === undefined && context._parent != null) {\n context = context._parent;\n } else {\n break;\n }\n }\n if (value === undefined) {\n if (arguments.length > 1) {\n return defaultValue!;\n } else {\n throw new Error(`Expected a value for '${String(key)}' but got undefined.`);\n }\n }\n return value;\n } else {\n // Get merged values\n let context: Context = this;\n const entries: [any, any][] = [];\n while (true) {\n if (context._state) {\n entries.push(...context._state.entries());\n }\n if (context._parent != null) {\n context = context._parent;\n } else {\n break;\n }\n }\n return new Map(entries.reverse());\n }\n }\n\n /**\n * Stores `value` at `key` in this context's state.\n */\n setState<T>(key: any, value: T): void;\n\n /**\n * For each tuple in `entries`, stores `value` at `key` in this context's state.\n */\n setState(entries: [key: any, value: any][]): void;\n\n setState() {\n if (!this._state) {\n this._state = new Map();\n }\n if (arguments.length === 2) {\n this._state.set(arguments[0], arguments[1]);\n } else if (typeOf(arguments[0]) === \"array\") {\n for (const [key, value] of arguments[0]) {\n if (value === undefined) {\n this._state.delete(key);\n } else {\n this._state.set(key, value);\n }\n }\n } else {\n throw new Error(`Invalid arguments.`);\n }\n\n return this;\n }\n}\n\nexport function createContext(name: MaybeSignal<string>, options?: ContextOptions) {\n return new Context(name, options);\n}\n\nexport class StoreError extends Error {}\n","// Type symbols; these are used to quickly check if a value is the expected object.\nexport const IS_MARKUP = Symbol.for(\"dollaMarkup\");\nexport const IS_MARKUP_NODE = Symbol.for(\"dollaMarkupNode\");\n","import type { MarkupNode } from \"../markup\";\nimport { IS_MARKUP_NODE } from \"../symbols\";\n\n/**\n * Wraps any plain DOM node in a MarkupNode interface.\n */\nexport class DOMNode implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root: Node;\n\n get isMounted() {\n return this.root.parentNode != null;\n }\n\n constructor(node: Node) {\n this.root = node;\n }\n\n mount(parent: Node, after?: Node) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.root.parentNode && !parentIsUnmounting) {\n this.root.parentNode.removeChild(this.root);\n }\n }\n}\n","import { isArray } from \"../../typeChecking.js\";\nimport type { Context } from \"../context.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, peek, Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Displays dynamic children without a parent element.\n * Renders a Reactive value via a render function.\n *\n * This is probably the most used element type aside from HTML.\n */\nexport class Dynamic implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private children: MarkupNode[] = [];\n private context: Context;\n\n private $slot: Signal<any>;\n private unsubscribe?: UnsubscribeFn;\n\n get isMounted() {\n return this.root.parentNode != null;\n }\n\n constructor(context: Context, $slot: Signal<any>) {\n this.context = context;\n this.$slot = $slot;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n try {\n const content = this.$slot();\n peek(() => {\n this.update(isArray(content) ? content : [content]);\n });\n } catch (error) {\n this.context.error(error);\n this.context.crash(error as Error);\n }\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.unsubscribe?.();\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.root.parentNode?.removeChild(this.root);\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n for (const element of this.children) {\n element.unmount(parentIsUnmounting);\n }\n this.children = [];\n }\n\n private update(content: any[]) {\n this.cleanup(false);\n\n if (content.length === 0 || !this.isMounted) return;\n\n const elements = toMarkupNodes(this.context, content);\n\n for (const element of elements) {\n const previous = this.children.at(-1)?.root || this.root;\n element.mount(this.root.parentNode!, previous);\n this.children.push(element);\n }\n\n this.moveMarker();\n }\n\n /**\n * Move marker node to end of children.\n */\n private moveMarker() {\n const parent = this.root.parentNode!;\n const lastChildNextSibling = this.children.at(-1)?.root?.nextSibling ?? null;\n if (\"moveBefore\" in parent) {\n (parent.moveBefore as any)(this.root, lastChildNextSibling);\n } else {\n parent.insertBefore(this.root, lastChildNextSibling);\n }\n }\n}\n","import { isFunction } from \"../../typeChecking.js\";\nimport type { View } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport { Context, LifecycleEvent } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { DOMNode } from \"./dom.js\";\nimport { Dynamic } from \"./dynamic.js\";\n\nexport const VIEW = Symbol(\"View\");\n\nexport class ViewInstance<P> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n uniqueId = getUniqueId();\n context: Context;\n props;\n fn;\n\n node?: MarkupNode;\n\n constructor(context: Context, fn: View<P>, props: P, children?: any[]) {\n this.context = Context.linked(context, fn.name ?? \"anonymous view\", {\n logger: {\n tag: this.uniqueId,\n tagName: \"uid\",\n },\n });\n this.context.setState(VIEW, this);\n this.props = { ...props, children };\n this.fn = fn;\n }\n\n /*===============================*\\\n || \"Public\" API ||\n \\*===============================*/\n\n get root() {\n return this.node?.root!;\n }\n\n get isMounted() {\n return this.context.isMounted;\n }\n\n mount(parent: Node, after?: Node) {\n // Don't run lifecycle hooks or initialize if already connected.\n // Calling connect again can be used to re-order elements that are already connected to the DOM.\n const wasConnected = this.isMounted;\n\n if (!wasConnected) {\n this._initialize();\n Context.emit(LifecycleEvent.WILL_MOUNT, this.context);\n }\n\n if (this.node) {\n this.node.mount(parent, after);\n }\n\n if (!wasConnected) {\n // Do it in a rAF so onMounted callbacks can access rendered DOM nodes.\n // requestAnimationFrame(() => {\n Context.emit(LifecycleEvent.DID_MOUNT, this.context);\n // });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n Context.emit(LifecycleEvent.WILL_UNMOUNT, this.context);\n\n if (this.node) {\n this.node.unmount(parentIsUnmounting);\n }\n\n Context.emit(LifecycleEvent.DID_UNMOUNT, this.context);\n }\n\n /*===============================*\\\n || Internal ||\n \\*===============================*/\n\n private _initialize() {\n const { context, props, fn } = this;\n\n let result: any;\n try {\n result = fn.call(context, props, context);\n } catch (error) {\n if (error instanceof Error) {\n context.crash(error);\n }\n throw error;\n }\n\n if (result == null) {\n // Do nothing.\n } else if (result instanceof Node) {\n this.node = new DOMNode(result);\n } else if (isFunction(result)) {\n this.node = new Dynamic(context, result);\n } else {\n this.node = render(result, context);\n }\n }\n}\n","import { isArray, isFunction, isObject, isString } from \"../../typeChecking.js\";\nimport { omit } from \"../../utils.js\";\nimport { Context, LifecycleEvent } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, get, type MaybeSignal, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { VIEW, ViewInstance } from \"./view.js\";\n\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\nexport type Mixin<E extends Element = Element> = (element: E, context: Context) => void;\n\nconst IS_SVG = Symbol(\"HTML.isSVG\");\n\nexport class HTML implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root;\n\n private context: Context;\n private props: Record<string, any>;\n private children?: any[];\n private childNodes: MarkupNode[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Source<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n get isMounted() {\n return this.root.parentNode != null;\n }\n\n constructor(context: Context, tag: string, props: Record<string, any>, children?: any[]) {\n this.context = Context.linked(context, tag);\n\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n this.context.setState(IS_SVG, true);\n }\n\n // Create node with the appropriate constructor.\n if (this.context.getState(IS_SVG, false)) {\n this.root = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.root = document.createElement(tag);\n }\n\n // Add view name as a data attribute in development mode for better debugging.\n if (getEnv() === \"development\") {\n const view = this.context.getState<ViewInstance<unknown> | null>(VIEW, null);\n if (view) {\n this.root.dataset.view = view.context.getName();\n }\n }\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.root);\n } else {\n throw new Error(\"Expected ref to be a function. Got: \" + props.ref);\n }\n }\n\n if (props.mixin) {\n const mixins = isArray(props.mixin) ? props.mixin : [props.mixin];\n for (const fn of mixins) {\n fn(\n this.root,\n Context.linked(this.context, () => getLoggerName(this), {\n bindLifecycleToParent: true,\n logger: { tagName: fn.name === \"mixin\" ? undefined : \"mixin\", tag: fn.name },\n }),\n );\n }\n }\n\n this.props = {\n ...omit([\"ref\", \"class\", \"className\", \"mixin\"], props),\n class: props.className ?? props.class,\n };\n this.children = children;\n }\n\n mount(parent: Node, after?: Node) {\n if (parent == null) {\n throw new Error(`HTML element requires a parent element as the first argument to connect. Got: ${parent}`);\n }\n\n const wasMounted = this.isMounted;\n\n if (!wasMounted) {\n Context.emit(LifecycleEvent.WILL_MOUNT, this.context);\n\n if (this.children && this.children.length > 0) {\n this.childNodes = toMarkupNodes(this.context, this.children);\n }\n\n for (let i = 0; i < this.childNodes.length; i++) {\n const child = this.childNodes[i];\n const previous = i > 0 ? this.childNodes[i - 1].root : undefined;\n child.mount(this.root, previous);\n }\n\n this.applyProps(this.root, this.props);\n if (this.props.style) this.applyStyles(this.root, this.props.style, this.unsubscribers);\n if (this.props.class) this.applyClasses(this.root, this.props.class, this.unsubscribers);\n }\n\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n queueMicrotask(() => {\n this.canClickAway = true;\n\n if (!wasMounted) Context.emit(LifecycleEvent.DID_MOUNT, this.context);\n });\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.isMounted) {\n Context.emit(LifecycleEvent.WILL_UNMOUNT, this.context);\n\n if (!parentIsUnmounting) {\n this.root.parentNode?.removeChild(this.root);\n }\n\n for (const child of this.childNodes) {\n child.unmount(true);\n }\n\n this.canClickAway = false;\n\n for (const unsubscribe of this.unsubscribers) {\n unsubscribe();\n }\n this.unsubscribers.length = 0;\n\n if (this.ref) {\n this.ref(undefined);\n }\n\n Context.emit(LifecycleEvent.DID_UNMOUNT, this.context);\n }\n }\n\n private attachProp<T>(value: MaybeSignal<T>, callback: (value: T) => void) {\n if (isFunction(value)) {\n this.unsubscribers.push(\n effect(() => {\n try {\n callback((value as Signal<T>)());\n } catch (error) {\n this.context.error(error);\n this.context.crash(error as Error);\n }\n }),\n );\n } else {\n callback(value);\n }\n }\n\n private applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n for (const key in props) {\n const value = props[key];\n\n // TODO: If key starts with 'attr:' it is applied with .setAttribute, if 'prop:' it is set directly on the element. If 'on:' it is applied with .addEventListener\n\n if (key === \"on:clickoutside\" || key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n (value as (e: Event) => void)(e);\n }\n };\n\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n\n this.unsubscribers.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (isFunction(value) && isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = value as (e: Event) => void;\n\n element.addEventListener(eventName, listener);\n\n this.unsubscribers.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (isFunction(value) && eventProps.includes(key)) {\n const _key = key.substring(2);\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n this.attachProp(value, (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n });\n } else if (!privateProps.includes(key)) {\n if (this.context.getState(IS_SVG, false)) {\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n });\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(value, (current) => {\n (element as any)[key] = String(current);\n });\n break;\n\n case \"for\":\n this.attachProp(value, (current) => {\n (element as any).htmlFor = current;\n });\n break;\n\n case \"title\":\n this.attachProp(value, (current) => {\n if (current == null) {\n (element as any).removeAttribute(key);\n } else {\n (element as any).setAttribute(key, String(current));\n }\n });\n\n case \"checked\":\n this.attachProp(value, (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n });\n break;\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(value, (current) => {\n if (typeof current === \"string\") {\n (element as any)[key] = current;\n } else if (current) {\n (element as any)[key] = \"on\";\n } else {\n (element as any)[key] = \"off\";\n }\n });\n break;\n\n default: {\n if (key.startsWith(\"prop:\")) {\n const _key = key.substring(5);\n this.attachProp(value, (current) => {\n (element as any)[_key] = current;\n });\n } else if (key.startsWith(\"on:\")) {\n const _key = key.substring(3);\n let _prev: EventListener | undefined;\n if (isFunction(value)) {\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else {\n this.attachProp(value as MaybeSignal<EventListener>, (current) => {\n if (!current && _prev) {\n element.removeEventListener(_key, _prev);\n } else if (current != null) {\n if (_prev && _prev !== current) {\n element.removeEventListener(_key, _prev);\n }\n element.addEventListener(_key, current);\n }\n _prev = current;\n });\n }\n } else if (key.startsWith(\"attr:\")) {\n const _key = key.substring(5).toLowerCase();\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(_key, String(current));\n } else {\n element.removeAttribute(_key);\n }\n });\n } else {\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\n });\n }\n\n break;\n }\n }\n }\n }\n }\n }\n\n private applyStyles(element: HTMLElement | SVGElement, styles: unknown, unsubscribers: UnsubscribeFn[]) {\n const propUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(styles)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, get(styles), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.style.setProperty(name, String(get(value)), priority);\n } else {\n element.style.removeProperty(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of propUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n\n private applyClasses(element: HTMLElement | SVGElement, classes: unknown, unsubscribers: UnsubscribeFn[]) {\n const classUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(classes)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, get(classes), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of classUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n}\n\n/**\n * Parse classes into a single object. Classes can be passed as a string, an object with class keys can boolean values, or an array with a mix of both.\n */\nfunction getClassMap(classes: unknown) {\n let mapped: Record<string, boolean> = {};\n\n if (isString(classes)) {\n // Support multiple classes in one string like HTML.\n const names = classes.split(\" \");\n for (const name of names) {\n mapped[name] = true;\n }\n } else if (isObject(classes)) {\n Object.assign(mapped, classes);\n } else if (Array.isArray(classes)) {\n Array.from(classes)\n .filter(Boolean)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\n\n // Delete undefined keys. These are usually the result of a class that is not specified in the stylesheet and would have no effect on appearance.\n delete mapped[\"undefined\"];\n\n return mapped;\n}\n\n/**\n * Parse styles into a single object.\n */\nfunction getStyleMap(styles: unknown) {\n let mapped: Record<string, { value: unknown; priority?: string }> = {};\n\n if (isString(styles)) {\n const lines = styles.split(\";\").filter((line) => line.trim() !== \"\");\n for (const line of lines) {\n const [key, _value] = line.split(\":\");\n const entry: { value: unknown; priority?: string } = {\n value: _value,\n };\n if (_value.includes(\"!important\")) {\n entry.priority = \"important\";\n entry.value = _value.replace(\"!important\", \"\").trim();\n } else {\n entry.value = _value.trim();\n }\n mapped[camelToKebab(key.trim())] = entry;\n }\n }\n if (isObject(styles)) {\n for (const key in styles) {\n if (key.startsWith(\"--\")) {\n // Pass through variable names without processing.\n mapped[key] = { value: styles[key] };\n } else {\n mapped[camelToKebab(key)] = { value: styles[key] };\n }\n }\n } else if (Array.isArray(styles)) {\n Array.from(styles)\n .filter((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getStyleMap(item));\n });\n }\n\n return mapped;\n}\n\nfunction getLoggerName(html: HTML) {\n let name = html.root.tagName.toLowerCase();\n if (html.root.id) {\n name += `#${html.root.id}`;\n }\n if (html.root.classList.length > 0) {\n for (const className of html.root.classList.values()) {\n name += `.${className}`;\n }\n }\n return name;\n}\n\n/**\n * Converts a camelCase string to kebab-case.\n */\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? \"-\" : \"\") + $.toLowerCase());\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\", \"mixin\"];\n\nconst eventProps = [\"onsubmit\", \"onclick\", \"ontransitionend\"];\n","import type { Renderable } from \"../../types.js\";\nimport { Context } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n private context;\n private content;\n private parent;\n\n private element?: MarkupNode;\n\n get isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted;\n }\n\n constructor(context: Context, content: Renderable, parent: Node) {\n this.context = context;\n this.content = content;\n this.parent = parent;\n }\n\n mount(_parent: Node, _after?: Node) {\n this.element = render(this.content, this.context);\n this.element.mount(this.parent);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.element?.isMounted) {\n // Portals MUST unmount DOM nodes because they won't be removed by parents unmounting.\n this.element.unmount(false);\n }\n }\n}\n","import type { Renderable } from \"../../types.js\";\nimport { deepEqual } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport type { MarkupNode } from \"../markup.js\";\nimport { $, effect, peek, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { ViewInstance } from \"./view.js\";\n\n// ----- Types ----- //\n\nexport type KeyFn<T> = (item: T, index: number) => string | number | symbol;\nexport type RenderFn<T> = (item: Signal<T>, index: Signal<number>, ctx: Context) => Renderable;\n\ntype ConnectedItem<T> = {\n key: any;\n item: Source<T>;\n index: Source<number>;\n node: MarkupNode;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private context;\n\n private items: Signal<T[]>;\n private key: KeyFn<T>;\n private render: RenderFn<T>;\n\n private unsubscribe: UnsubscribeFn | null = null;\n private connectedItems: ConnectedItem<T>[] = [];\n\n get isMounted() {\n return this.root.parentNode != null;\n }\n\n constructor(context: Context, items: Signal<T[]>, key: KeyFn<T>, render: RenderFn<T>) {\n this.context = context;\n\n this.items = items;\n this.key = key;\n this.render = render;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = this.items();\n\n if (value == null) {\n value = [];\n this.context.warn(\"repeat() received empty value for items\", value);\n }\n\n peek(() => {\n this._update(Array.from(value));\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (!parentIsUnmounting && this.isMounted) {\n this.root.parentNode?.removeChild(this.root);\n }\n\n this._cleanup(parentIsUnmounting);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems) {\n item.node.unmount(parentIsUnmounting);\n }\n this.connectedItems = [];\n }\n\n private _update(value: T[]) {\n if (value.length === 0 || !this.isMounted) {\n return this._cleanup(false);\n }\n\n type UpdateItem = { key: string | number | symbol; value: T; index: number };\n\n const potentialItems: UpdateItem[] = [];\n let index = 0;\n\n for (const item of value) {\n potentialItems.push({\n key: this.key(item, index),\n value: item,\n index: index++,\n });\n }\n\n const newItems: ConnectedItem<T>[] = [];\n\n // Remove views for items that no longer exist in the new list.\n for (const connected of this.connectedItems) {\n const potentialItem = potentialItems.find((p) => p.key === connected.key);\n\n if (!potentialItem) {\n connected.node.unmount(false);\n }\n }\n\n // Add new views and update state for existing ones.\n for (const potential of potentialItems) {\n const connected = this.connectedItems.find((item) => item.key === potential.key);\n\n if (connected) {\n connected.item(potential.value);\n connected.index(potential.index);\n newItems[potential.index] = connected;\n } else {\n // deepEqual avoids running update code again if the data is equivalent. In list updates this happens a lot.\n const item = $(potential.value, { equals: deepEqual });\n const index = $(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n item,\n index,\n node: new ViewInstance(this.context, RepeatItemView, {\n item: () => item(),\n index: () => index(),\n renderFn: this.render,\n }),\n };\n }\n }\n\n // Reconnect to ensure order. Lifecycle hooks won't be run again if the view is already connected.\n // TODO: Use a smarter inline reordering method. This causes scrollbars to jump.\n for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.node.root ?? this.root;\n item.node.mount(this.root.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.node.root ?? this.root;\n this.root.parentNode?.insertBefore(this.root, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n item: Signal<any>;\n index: Signal<number>;\n renderFn: (item: Signal<any>, index: Signal<number>, context: Context) => Renderable;\n}\n\nfunction RepeatItemView(props: ListItemProps, context: Context) {\n context.setName(\"@RepeatItem\");\n return props.renderFn.call(context, props.item, props.index, context);\n}\n","import { isFunction, isString } from \"../typeChecking.js\";\nimport type { Renderable, View } from \"../types.js\";\nimport { Context } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { KeyFn, RenderFn, Repeat } from \"./nodes/repeat.js\";\nimport { ViewInstance } from \"./nodes/view.js\";\nimport { $, get, type MaybeSignal, type Signal } from \"./signals.js\";\nimport { IS_MARKUP_NODE } from \"./symbols.js\";\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupElement yet.\n */\nexport class Markup<P extends Record<any, any> = Record<any, any>> {\n /**\n * In the case of a view, type will be the View function itself. It can also hold an identifier for special nodes like \"$cond\", \"$repeat\", etc.\n * DOM nodes can be created by name, such as HTML elements like \"div\", \"ul\" or \"span\", SVG elements like \"\"\n */\n type;\n\n /**\n * Data that will be passed to a new MarkupNode instance when it is constructed.\n */\n props;\n\n /**\n *\n */\n children;\n\n constructor(type: string | View<P>, props?: P, ...children: Renderable[]) {\n this.type = type;\n this.props = props;\n this.children = children;\n }\n}\n\n/**\n * A mountable node that has been constructed from Markup metadata.\n */\nexport interface MarkupNode {\n /**\n *\n */\n readonly root?: Node;\n\n /**\n *\n */\n readonly isMounted: boolean;\n\n /**\n *\n */\n mount(parent: Node, after?: Node): void;\n\n /**\n *\n */\n unmount(parentIsUnmounting?: boolean): void;\n}\n\nexport function isMarkupNode(value: any): value is MarkupNode {\n return value?.[IS_MARKUP_NODE] === true;\n}\n\nexport enum MarkupType {\n Text = \"$text\",\n Repeat = \"$repeat\",\n Dynamic = \"$dynamic\",\n DOM = \"$dom\",\n Portal = \"$portal\",\n}\n\nexport interface MarkupProps {\n [MarkupType.Text]: { value: any };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n key: KeyFn<any>;\n render: RenderFn<any>;\n };\n [MarkupType.Dynamic]: {\n source: Signal<any>;\n };\n [MarkupType.DOM]: {\n value: Node;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Node;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function m<T extends keyof MarkupProps>(type: T, props: MarkupProps[T], ...children: Renderable[]): Markup;\n\nexport function m<P extends {}>(type: View<P>, props?: P, ...children: Renderable[]): Markup;\nexport function m<P>(type: View<P>, props: P, ...children: any[]): Markup;\n\nexport function m<P>(type: string | View<P>, props?: P, ...children: any[]) {\n return new Markup(type, props as any, ...children);\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * If `condition` is truthy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function when(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return m(MarkupType.Dynamic, {\n source: $<Renderable>(() => {\n const value = get(condition);\n\n if (value && thenContent) {\n return thenContent;\n } else if (!value && elseContent) {\n return elseContent;\n }\n return null;\n }),\n });\n}\n\n/**\n * Inverted `when`. If `condition` is falsy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function unless(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return when(condition, elseContent, thenContent);\n}\n\n/**\n * Calls `render` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `key` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(items: MaybeSignal<T[]>, key: KeyFn<T>, render: RenderFn<T>): Markup {\n return m(MarkupType.Repeat, { items: () => get(items), key, render });\n}\n\n/**\n * Renders `content` into a `parent` node anywhere in the page, rather than its usual position in the view.\n */\nexport function portal(parent: Node, content: Renderable): Markup {\n return m(MarkupType.Portal, { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\nexport function render(content: Renderable, context = new Context(\"$\")): MarkupNode {\n const nodes = toMarkupNodes(context, [content]);\n if (nodes.length === 1) {\n return nodes[0];\n }\n return new Dynamic(context, () => nodes);\n}\n\n/**\n * Convert basically anything into a set of MarkupElements.\n */\nexport function toMarkupNodes(context: Context, ...content: any[]): MarkupNode[] {\n const items = content.flat(Infinity);\n const elements: MarkupNode[] = [];\n\n for (const item of items) {\n if (item === null || item === undefined || item === false) {\n continue;\n }\n\n if (item instanceof Node) {\n elements.push(new DOMNode(item));\n continue;\n }\n\n if (item instanceof Markup) {\n if (isFunction(item.type)) {\n elements.push(new ViewInstance(context, item.type as View<any>, item.props, item.children));\n continue;\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.DOM: {\n const attrs = item.props! as MarkupProps[MarkupType.DOM];\n elements.push(new DOMNode(attrs.value));\n continue;\n }\n case MarkupType.Text: {\n const attrs = item.props! as MarkupProps[MarkupType.Text];\n elements.push(new DOMNode(document.createTextNode(String(attrs.value))));\n continue;\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupProps[MarkupType.Repeat];\n elements.push(new Repeat(context, attrs.items, attrs.key, attrs.render));\n continue;\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupProps[MarkupType.Dynamic];\n elements.push(new Dynamic(context, attrs.source));\n continue;\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupProps[MarkupType.Portal];\n elements.push(new Portal(context, attrs.content, attrs.parent));\n continue;\n }\n default:\n // Handle type as an HTML tag.\n elements.push(new HTML(context, item.type, item.props ?? {}, item.children));\n continue;\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n }\n\n if (isMarkupNode(item)) {\n elements.push(item);\n continue;\n }\n\n if (isFunction(item)) {\n elements.push(new Dynamic(context, item));\n continue;\n }\n\n // fallback to displaying value as text\n elements.push(new DOMNode(document.createTextNode(String(item))));\n }\n\n return elements;\n}\n"],"names":["LifecycleEvent","LifecycleEvent2","ContextLifecycle","__publicField","__privateAdd","_listeners","event","listener","__privateGet","dependent","__privateSet","_Context","name","options","_name","peek","logger","createLogger","get","descriptors","key","state","parent","context","store","_a","getUniqueId","result","error","isFunction","StoreError","callback","fn","unsubscribe","effect","disposed","defaultValue","value","entries","typeOf","Context","createContext","IS_MARKUP_NODE","DOMNode","node","after","parentIsUnmounting","Dynamic","$slot","content","isArray","_b","element","elements","toMarkupNodes","previous","lastChildNextSibling","VIEW","ViewInstance","props","children","wasConnected","render","isCamelCaseEventName","IS_SVG","HTML","tag","getEnv","view","mixins","getLoggerName","omit","wasMounted","child","e","eventName","eventProps","_key","current","privateProps","_prev","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","priority","classes","classUnsubscribers","getClassMap","isString","names","isObject","item","lines","line","_value","entry","camelToKebab","html","className","$","ofs","Portal","_parent","_after","Repeat","items","potentialItems","index","newItems","connected","p","potential","deepEqual","RepeatItemView","i","lastItem","_c","Markup","type","isMarkupNode","m","when","condition","thenContent","elseContent","unless","repeat","portal","nodes","attrs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"router-D43DV_bv.js","sources":["../src/router/router.utils.ts","../src/router/router.ts"],"sourcesContent":["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 { Context } from \"../core/context.js\";\nimport { createLogger } from \"../core/logger.js\";\nimport { m, type MarkupNode } from \"../core/markup.js\";\nimport { Dynamic } from \"../core/nodes/dynamic.js\";\nimport { ViewInstance } from \"../core/nodes/view.js\";\nimport { $, peek, Source, type UnsubscribeFn } from \"../core/signals.js\";\nimport { assertObject, isArray, isFunction, isObject, isString } from \"../typeChecking.js\";\nimport type { View } 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 type Stringable = { toString(): string };\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?: View<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: View<{}>;\n}\n\n/**\n * An active route layer whose markup has been initialized into a view.\n */\ninterface ActiveLayer {\n id: number;\n element: MarkupNode;\n context: Context;\n $slot: Source<MarkupNode | undefined>;\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 = createLogger(\"dolla.router\");\n\n #layerId = 0;\n #activeLayers: ActiveLayer[] = [];\n #routes: ParsedRoute<RouteMeta>[] = [];\n\n #isMounted = false;\n\n #rootLayer!: ActiveLayer;\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.\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, context: Context): Promise<MarkupNode> {\n const $slot = $<MarkupNode>();\n this.#rootLayer = {\n id: -1,\n element: new Dynamic(context, $slot),\n context,\n $slot,\n };\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 return this.#rootLayer.element;\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 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 (match.path !== location.pathname || location.search !== queryString) {\n window.history.replaceState(null, \"\", this.#hash ? \"/#\" + match.path + queryString : match.path + queryString);\n }\n\n if (match.pattern !== oldPattern) {\n this.#mountRoute(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(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?.element.unmount();\n\n const parentLayer = this.#activeLayers.at(-1) ?? this.#rootLayer;\n\n const $slot = $<MarkupNode>();\n const element = new ViewInstance(parentLayer.context, matchedLayer.view, {}, [\n m(\"$dynamic\", { source: $slot }),\n ]);\n\n parentLayer.$slot(element);\n this.#activeLayers.push({\n id: matchedLayer.id,\n element,\n context: element.context,\n $slot,\n });\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: View<any> = (props: any) => props.children;\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":["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","b","patternToFragments","pattern","safeExternalLink","protocolLink","catchLinks","root","callback","_window","traverse","node","handler","e","anchor","replaceParams","key","value","MOUNT","UNMOUNT","Router","__privateAdd","_Router_instances","_logger","createLogger","_layerId","_activeLayers","_routes","_isMounted","_rootLayer","_hash","_unsubscribers","_match","$","__publicField","__privateGet","shallowEqual","assertObject","__privateSet","__privateMethod","prepareRoute_fn","assertValidRedirects","parent","context","$slot","Dynamic","onPopState","updateRoute_fn","href","preserve","parsePreserveQueryAttribute","steps","replace_fn","push_fn","values","match","peek","queryParts","queryString","getCurrentURL_fn","logger","journey","resolveRoute_fn","step","oldPattern","isArray","preserved","current","mountRoute_fn","NoRouteError","layers","matchedLayer","activeLayer","parentLayer","element","ViewInstance","m","resolve","reject","redirect","finalize","isString","redirectContext","callbacks","next","parents","isObject","view","props","layer","__privateWrapper","subroute","redirectPath","r","k"],"mappings":"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"}