@manyducks.co/dolla 2.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -284
- package/dist/context-B5blupD2.js +363 -0
- package/dist/context-B5blupD2.js.map +1 -0
- package/dist/core/context.d.ts +29 -144
- package/dist/core/debug.d.ts +19 -0
- package/dist/core/index.d.ts +15 -16
- package/dist/core/markup/helpers.d.ts +34 -0
- package/dist/core/markup/html.d.ts +3 -0
- package/dist/core/{nodes → markup/nodes}/dom.d.ts +5 -4
- package/dist/core/markup/nodes/dynamic.d.ts +16 -0
- package/dist/core/markup/nodes/element.d.ts +14 -0
- package/dist/core/markup/nodes/portal.d.ts +15 -0
- package/dist/core/markup/nodes/repeat.d.ts +21 -0
- package/dist/core/markup/nodes/view.d.ts +17 -0
- package/dist/core/markup/scheduler.d.ts +1 -0
- package/dist/core/markup/types.d.ts +62 -0
- package/dist/core/markup/utils.d.ts +22 -0
- package/dist/core/ref.d.ts +6 -12
- package/dist/core/root.d.ts +36 -0
- package/dist/core/signals.d.ts +46 -76
- package/dist/core/symbols.d.ts +2 -0
- package/dist/core-JHktdqjt.js +242 -0
- package/dist/core-JHktdqjt.js.map +1 -0
- package/dist/http/index.d.ts +21 -33
- package/dist/http.js +89 -149
- package/dist/http.js.map +1 -1
- package/dist/index.js +4 -174
- package/dist/jsx-dev-runtime.d.ts +4 -3
- package/dist/jsx-dev-runtime.js +12 -9
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +5 -4
- package/dist/jsx-runtime.js +17 -12
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/router/index.d.ts +4 -3
- package/dist/router/router.d.ts +19 -162
- package/dist/router/store.d.ts +12 -0
- package/dist/router/types.d.ts +152 -0
- package/dist/router/utils.d.ts +99 -0
- package/dist/router/utils.test.d.ts +1 -0
- package/dist/router.js +428 -5
- package/dist/router.js.map +1 -1
- package/dist/signals-CMJPGr_M.js +354 -0
- package/dist/signals-CMJPGr_M.js.map +1 -0
- package/dist/translate/index.d.ts +82 -0
- package/dist/translate.js +125 -0
- package/dist/translate.js.map +1 -0
- package/dist/types.d.ts +21 -39
- package/dist/utils.d.ts +41 -29
- package/dist/utils.test.d.ts +1 -0
- package/dist/virtual/index.d.ts +1 -0
- package/dist/virtual/list.d.ts +53 -0
- package/package.json +19 -16
- package/dist/core/app.d.ts +0 -24
- package/dist/core/env.d.ts +0 -3
- package/dist/core/hooks.d.ts +0 -70
- package/dist/core/logger.d.ts +0 -42
- package/dist/core/logger.test.d.ts +0 -0
- package/dist/core/markup.d.ts +0 -82
- package/dist/core/markup.test.d.ts +0 -0
- package/dist/core/nodes/_markup.d.ts +0 -36
- package/dist/core/nodes/dynamic.d.ts +0 -22
- package/dist/core/nodes/element.d.ts +0 -27
- package/dist/core/nodes/portal.d.ts +0 -18
- package/dist/core/nodes/repeat.d.ts +0 -27
- package/dist/core/nodes/view.d.ts +0 -25
- package/dist/core/views/default-crash-view.d.ts +0 -25
- package/dist/core/views/for.d.ts +0 -21
- package/dist/core/views/fragment.d.ts +0 -7
- package/dist/core/views/portal.d.ts +0 -16
- package/dist/core/views/show.d.ts +0 -25
- package/dist/fragment-BahD_BJA.js +0 -7
- package/dist/fragment-BahD_BJA.js.map +0 -1
- package/dist/i18n/index.d.ts +0 -134
- package/dist/i18n.js +0 -309
- package/dist/i18n.js.map +0 -1
- package/dist/index-DRJlxs-Q.js +0 -535
- package/dist/index-DRJlxs-Q.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger-Aqi9m1CF.js +0 -565
- package/dist/logger-Aqi9m1CF.js.map +0 -1
- package/dist/markup-8jNhoqDe.js +0 -1089
- package/dist/markup-8jNhoqDe.js.map +0 -1
- package/dist/router/hooks.d.ts +0 -2
- package/dist/router/router.utils.d.ts +0 -93
- package/dist/typeChecking-5kmX0ulW.js +0 -65
- package/dist/typeChecking-5kmX0ulW.js.map +0 -1
- package/dist/typeChecking.d.ts +0 -95
- package/docs/buildless.md +0 -132
- package/docs/components.md +0 -238
- package/docs/hooks.md +0 -356
- package/docs/http.md +0 -178
- package/docs/i18n.md +0 -220
- package/docs/index.md +0 -10
- package/docs/markup.md +0 -136
- package/docs/mixins.md +0 -176
- package/docs/ref.md +0 -77
- package/docs/router.md +0 -281
- package/docs/setup.md +0 -137
- package/docs/signals.md +0 -262
- package/docs/stores.md +0 -113
- package/docs/views.md +0 -356
- package/notes/atomic.md +0 -452
- package/notes/elimination.md +0 -33
- package/notes/observable.md +0 -180
- package/notes/scratch.md +0 -565
- package/notes/splitting.md +0 -5
- package/notes/views.md +0 -195
- package/vite.config.js +0 -22
- /package/dist/core/{hooks.test.d.ts → markup/html.test.d.ts} +0 -0
- /package/dist/core/{ref.test.d.ts → markup/utils.test.d.ts} +0 -0
- /package/dist/router/{router.utils.test.d.ts → matcher.test.d.ts} +0 -0
- /package/dist/{typeChecking.test.d.ts → router/router.test.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markup-8jNhoqDe.js","sources":["../src/core/context.ts","../src/core/nodes/_markup.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/ref.ts","../src/core/nodes/view.ts","../src/core/nodes/element.ts","../src/core/nodes/portal.ts","../src/core/hooks.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 {\n effect,\n type EffectFn,\n get,\n type MaybeSignal,\n setCurrentContext,\n type UnsubscribeFn,\n untracked,\n} from \"./signals\";\n\nexport enum LifecycleEvent {\n WILL_MOUNT = \"willMount\",\n DID_MOUNT = \"didMount\",\n WILL_UNMOUNT = \"willUnmount\",\n DID_UNMOUNT = \"didUnmount\",\n DISPOSE = \"dispose\",\n}\n\nexport type LifecycleEventName = \"willMount\" | \"didMount\" | \"willUnmount\" | \"didUnmount\" | \"dispose\";\n\ntype LifecycleListener = () => void;\n\nenum LifecycleState {\n Unmounted = 0,\n WillMount = 1,\n DidMount = 2,\n WillUnmount = 3,\n DidUnmount = 4,\n Disposed = 5,\n}\n\nconst NAME = Symbol(\"name\");\nconst LIFECYCLE = Symbol(\"lifecycle\");\nconst PARENT = Symbol(\"parent\");\nconst STORES = Symbol(\"stores\");\nconst STATE = Symbol(\"state\");\n\n/**\n * Manages lifecycle events for a Context.\n */\nclass ContextLifecycle {\n private context;\n\n state = LifecycleState.Unmounted;\n listeners = new Map<LifecycleEvent, Set<LifecycleListener>>();\n bound?: Set<Context>;\n\n constructor(context: Context) {\n this.context = context;\n }\n\n /**\n * Listen for a certain event to be emitted. Listeners are called when the event results in a state change.\n */\n on<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (!listeners) {\n this.listeners.set(event, new Set([listener]));\n } else {\n listeners.add(listener);\n }\n }\n\n /**\n * Stop a particular listener from being called when an event is emitted.\n */\n off<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /**\n * Advance the lifecycle state machine.\n */\n emit<E extends LifecycleEvent>(event: E) {\n switch (event) {\n case LifecycleEvent.WILL_MOUNT: {\n if (this.state < LifecycleState.WillMount) {\n this.state = LifecycleState.WillMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_MOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_MOUNT: {\n if (this.state >= LifecycleState.WillMount && this.state < LifecycleState.DidMount) {\n this.state = LifecycleState.DidMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.WILL_UNMOUNT: {\n if (this.state >= LifecycleState.DidMount && this.state < LifecycleState.WillUnmount) {\n this.notify(event);\n this.state = LifecycleState.WillUnmount;\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_UNMOUNT: {\n 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 } else {\n this.context.crash(new Error(`Tried to DID_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DISPOSE: {\n if (this.state === LifecycleState.Unmounted) {\n this.notify(event);\n this.listeners.clear();\n this.bound = undefined;\n this.context[STATE] = undefined;\n this.context[STORES] = undefined;\n this.state = LifecycleState.Disposed;\n } else {\n this.context.crash(new Error(`Tried to DISPOSE context at state ${this.state}`));\n }\n break;\n }\n }\n }\n\n /**\n * Bind `context` to this lifecycle; when any event is emitted here it will be emitted for `context` as well.\n */\n bind(context: Context) {\n if (!this.bound) {\n this.bound = new Set([context]);\n } else {\n this.bound.add(context);\n }\n }\n\n /**\n * Call all the event's listeners and re-emit to bound contexts.\n */\n private notify<E extends LifecycleEvent>(event: E) {\n // Call listener functions.\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n // Emit to bound contexts.\n if (this.bound) {\n for (const context of this.bound) {\n context[LIFECYCLE].emit(event);\n }\n }\n }\n}\n\nexport interface ContextGetStateOptions<T> {\n fallback?: T;\n\n /**\n * Only check this context; skip parent contexts.\n */\n immediate?: boolean;\n}\n\nexport interface ContextGetStateOptionsWithFallbackValue<T> extends ContextGetStateOptions<T> {\n fallback: T;\n}\n\nexport interface ContextGetStateMapOptions {\n /**\n * Only include state from this context; skip parent contexts.\n */\n immediate?: boolean;\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(this);\n [PARENT]?: Context;\n [STORES]?: Map<Store<any, any>, any>;\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 createChildOf(parent: Context, name: MaybeSignal<string>, options?: LinkedContextOptions): Context {\n const context = new Context(name, options);\n context[PARENT] = parent;\n if (options?.bindLifecycleToParent) parent[LIFECYCLE].bind(context);\n return context;\n }\n\n /**\n * Emit a lifecycle event to `context`.\n */\n static emit(context: Context, event: LifecycleEvent) {\n context[LIFECYCLE].emit(event);\n }\n\n constructor(name: MaybeSignal<string>, options?: ContextOptions) {\n this.#name = name;\n this[NAME] = untracked(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 untracked(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] = untracked(name); // Try to store name as a readable string for debugging purposes.\n }\n\n /**\n * Creates an instance of a store and attaches it to this context.\n */\n provideStore<T>(store: Store<any, T>, options?: any): this {\n if (this[STORES]?.get(store)) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n throw this.crash(new Error(`An instance of ${name} was already added on this context.`));\n }\n\n const context = Context.createChildOf(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 prevCtx = setCurrentContext(context);\n const result = store(options);\n setCurrentContext(prevCtx);\n this[STORES].set(store, result);\n } catch (error) {\n throw this.crash(error as Error);\n }\n\n return this;\n }\n\n /**\n * Retrieves the nearest instance of `store`. If this context doesn't have it, the parent context is checked. This process continues until either:\n * 1. An instance of the store is found and returned.\n * 2. No instance is found and an error is thrown.\n */\n useStore<T>(store: Store<any, T>): T {\n if (!isFunction(store)) {\n throw new Error(`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 Error(`Store '${store.name}' is not provided by this context.`));\n }\n return result as T;\n }\n\n /**\n * Registers a `listener` to be called at a specific transition point during this context's lifecycle.\n *\n * Prefer `useMount` and `useUnmount` hooks for general usage.\n */\n onLifecycleTransition(event: LifecycleEventName, listener: LifecycleListener) {\n this[LIFECYCLE].on(event as LifecycleEvent, listener);\n return () => this[LIFECYCLE].off(event as LifecycleEvent, listener);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n return callback(); // Return callback so cleanup function passes through to effect handler\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 `options.fallback` if none is set.\n */\n getState<T>(key: any, options: ContextGetStateOptionsWithFallbackValue<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, options?: ContextGetStateOptions<T>): T;\n\n getState<T>(key: any, options?: ContextGetStateOptions<T>): T {\n const immediate = options?.immediate ?? false;\n let context: Context = this;\n let value: any;\n while (true) {\n value = context[STATE]?.get(key);\n if (value === undefined && !immediate && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n if (value === undefined) {\n if (options != null && Object.hasOwn(options, \"fallback\")) {\n return options.fallback!;\n } else {\n throw new Error(`Expected a value for '${String(key)}' but got undefined.`);\n }\n }\n return value;\n }\n\n /**\n * Returns a Map containing all state values available to this context.\n *\n * Pass `options.immediate` to only include state stored on this context.\n * By default all state stored on parent contexts is also included.\n */\n getStateMap(options?: ContextGetStateMapOptions): Map<any, any> {\n let context: Context = this;\n const immediate = options?.immediate ?? false;\n const entries: [any, any][] = [];\n while (true) {\n if (context[STATE]) {\n entries.push(...context[STATE].entries());\n }\n if (!immediate && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n return new Map(entries.reverse());\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(...args: any[]) {\n if (!this[STATE]) {\n this[STATE] = new Map();\n }\n if (args.length === 2) {\n this[STATE].set(args[0], args[1]);\n } else if (typeOf(args[0]) === \"array\") {\n for (const [key, value] of args[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","/**\n * A node that can be mounted by the Markup layout engine. Can be extended to create new custom node types.\n *\n * A `MarkupNode` instance can be passed anywhere a `Renderable` is required.\n */\nexport abstract class MarkupNode {\n /**\n * Returns a single DOM node to represent this MarkupNode's position in the DOM.\n * Usually the parent element, but it can be an empty Text node used as a marker.\n *\n * It only needs to be defined while the node is mounted, so it can be created in the `mount` function.\n */\n getRoot(): Node | undefined {\n throw new Error(\"getRoot method is not implemented\");\n }\n\n /**\n * Returns true while this node is mounted.\n */\n isMounted(): boolean {\n throw new Error(\"isMounted method is not implemented\");\n }\n\n /**\n * Mount this node to a `parent` element.\n * If passed, this node will be mounted as the next sibling of `after`.\n */\n mount(parent: Element, after?: Node): void {\n throw new Error(\"mount method is not implemented\");\n }\n\n /**\n * Unmount this MarkupNode from its parent element.\n *\n * The `skipDOM` option can be passed as an optimization when unmounting a parent node.\n * A value of `true` indicates that no DOM operations need to happen because the parent is already being unmounted.\n *\n * @param skipDOM - No DOM updates will be performed when true. Lifecycle methods will be called regardless.\n */\n unmount(skipDOM?: boolean): void {\n throw new Error(\"unmount method is not implemented\");\n }\n\n /**\n * Moves a node without unmounting and remounting (if the browser supports Element.moveBefore).\n */\n move(parent: Element, after?: Node): void {\n throw new Error(\"move method is not implemented\");\n }\n}\n","import { MarkupNode } from \"./_markup\";\n\n/**\n * A lightweight MarkupNode wrapper for a plain DOM node.\n */\nexport class DOMNode extends MarkupNode {\n private root: Node;\n\n constructor(node: Node) {\n super();\n this.root = node;\n }\n\n override getRoot() {\n return this.root;\n }\n\n override isMounted() {\n return this.root.parentNode != null;\n }\n\n override mount(parent: Element, after?: Node) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n }\n\n override unmount(skipDOM = false) {\n if (!skipDOM && this.root.parentNode) {\n this.root.parentNode.removeChild(this.root);\n }\n }\n\n override move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent && this.root instanceof Element) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n}\n","import { moveBefore, toArray } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport { toMarkupNodes } from \"../markup.js\";\nimport { effect, type Signal, type UnsubscribeFn, untracked } from \"../signals.js\";\nimport { MarkupNode } from \"./_markup.js\";\n\n/**\n * Renders any kind of content; markup, signals, DOM nodes, etc.\n * If it can be rendered by Dolla then Dynamic will do it.\n */\nexport class DynamicNode extends MarkupNode {\n private root = document.createTextNode(\"\");\n\n private children: MarkupNode[] = [];\n private context: Context;\n\n private $slot: Signal<any>;\n private unsubscribe?: UnsubscribeFn;\n\n constructor(context: Context, $slot: Signal<any>) {\n super();\n this.context = context;\n this.$slot = $slot;\n }\n\n override getRoot() {\n return this.root;\n }\n\n override isMounted() {\n return this.root.parentElement != null;\n }\n\n override 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 untracked(() => {\n this.update(toArray(content));\n });\n } catch (error) {\n this.context.crash(error as Error);\n }\n });\n }\n }\n\n override unmount(skipDOM = false) {\n this.unsubscribe?.();\n\n if (this.isMounted()) {\n moveBefore(this.root.parentElement!, this.root, this.children[0]?.getRoot() ?? null);\n this.root.parentNode?.removeChild(this.root);\n this.cleanup(skipDOM);\n }\n }\n\n override move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n for (let i = 0; i < this.children.length; i++) {\n this.children[i].move(parent, this.children[i - 1]?.getRoot() ?? this.root);\n }\n (parent as any).moveBefore(this.root, this.children.at(-1)?.getRoot()?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private cleanup(skipDOM: boolean) {\n for (const element of this.children) {\n if (element.isMounted()) element.unmount(skipDOM);\n }\n this.children.length = 0;\n }\n\n private update(content: any[]) {\n this.cleanup(false);\n\n if (content.length === 0 || !this.isMounted()) return;\n\n const nodes = toMarkupNodes(this.context, content);\n\n for (const node of nodes) {\n const previous = this.children.at(-1)?.getRoot() || this.root;\n node.mount(this.root.parentElement!, previous);\n this.children.push(node);\n }\n\n // Move marker after children\n const parent = this.root.parentElement!;\n const lastChildNextSibling = this.children.at(-1)?.getRoot()?.nextSibling ?? null;\n moveBefore(parent, this.root, lastChildNextSibling);\n }\n}\n","export const EMPTY_REF = Symbol(\"Ref.EMPTY\");\n\n/**\n * A hybrid getter/setter function that stores the last value it was called with.\n * Guarantees a value is held at runtime by throwing an error if no value is set.\n */\nexport interface Ref<T> {\n /**\n * Returns the currently stored value of the ref, or throws an error if no value has been set.\n */\n (): T;\n\n /**\n * Stores a new value to the ref and returns that value.\n */\n (value: T): T;\n}\n\n/**\n * Creates a Ref.\n */\nexport function ref<T>(value?: T): Ref<T>;\n\nexport function ref<T>(...value: [T]): Ref<T> {\n return _ref.bind({ current: value.length ? value[0] : EMPTY_REF }) as Ref<T>;\n}\n\n/*==================================*\\\n|| Implementation ||\n\\*==================================*/\n\ninterface RefValue<T> {\n current: T | typeof EMPTY_REF;\n}\n\nfunction _ref<T>(this: RefValue<T>, ...value: [T]): T {\n if (value.length) {\n this.current = value[0];\n } else {\n if (this.current === EMPTY_REF) {\n throw new Error(\"Ref getter was called, but ref has no value! Be sure to set your refs before accessing them.\");\n }\n }\n return this.current;\n}\n","import type { View } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport { Context, LifecycleEvent } from \"../context.js\";\nimport { render } from \"../markup.js\";\nimport { setCurrentContext } from \"../signals.js\";\nimport { MarkupNode } from \"./_markup.js\";\n\nexport const VIEW = Symbol(\"ViewNode\");\n\n/**\n * Renders a View.\n */\nexport class ViewNode<P> extends MarkupNode {\n readonly id = getUniqueId();\n readonly props;\n readonly context: Context;\n readonly view;\n\n node?: MarkupNode;\n\n /**\n * @param context - Parent contenxt to link to.\n * @param view - View function to mount.\n * @param props - Props to pass to view function.\n */\n constructor(context: Context, view: View<P>, props: P) {\n super();\n this.context = Context.createChildOf(context, view.name ?? \"anonymous view\", {\n logger: {\n tag: this.id,\n tagName: \"uid\",\n },\n });\n this.context.setState(VIEW, this);\n this.props = props;\n this.view = view;\n }\n\n getRoot() {\n return this.node?.getRoot();\n }\n\n isMounted() {\n return this.context.isMounted;\n }\n\n mount(parent: Element, 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 wasMounted = this.isMounted();\n\n // TODO: Look into own state and find route controller.\n // If preload function exists, pass the route controller to it.\n // If no preload function exists, just call .next() on the route.\n // Preload function is added by useRoutePreload hook.\n\n // One problem is mounting and unmounting is entirely synchronous, but we need async and suspense.\n // While a view is in suspense, the nearest suspense boundary shows fallback content.\n // Routes are a suspense boundary of a sort where they don't unmount the previous view until the next leaves suspense.\n\n if (!wasMounted) {\n const { context, props, view } = this;\n try {\n const prevCtx = setCurrentContext(context);\n const result = view(props);\n setCurrentContext(prevCtx);\n if (result != null && result !== false) {\n this.node = render(result, context);\n }\n } catch (error) {\n if (error instanceof Error) {\n context.crash(error);\n }\n throw error;\n }\n\n Context.emit(this.context, LifecycleEvent.WILL_MOUNT);\n }\n\n if (this.node) {\n this.node.mount(parent, after);\n }\n\n if (!wasMounted) Context.emit(this.context, LifecycleEvent.DID_MOUNT);\n }\n\n unmount(skipDOM = false) {\n Context.emit(this.context, LifecycleEvent.WILL_UNMOUNT);\n\n if (this.node) {\n this.node.unmount(skipDOM);\n }\n\n Context.emit(this.context, LifecycleEvent.DID_UNMOUNT);\n Context.emit(this.context, LifecycleEvent.DISPOSE);\n }\n\n move(parent: Element, after?: Node) {\n this.node?.move(parent, after);\n }\n}\n","import { isFunction, isNumber, isObject, isString } from \"../../typeChecking.js\";\nimport { getIntegerId, omit, toArray, toCamelCase } from \"../../utils.js\";\nimport { Context, LifecycleEvent } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkupNodes } from \"../markup.js\";\nimport { EMPTY_REF, Ref } from \"../ref.js\";\nimport { effect, get, setCurrentContext, type MaybeSignal, type Signal, type UnsubscribeFn } from \"../signals.js\";\n\nimport { MarkupNode } from \"./_markup.js\";\nimport { VIEW, ViewNode } from \"./view.js\";\n\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\nconst IS_SVG = Symbol(\"HTML.isSVG\");\n\n// Properties in this list will not be processed by applyProps because they are already handled elsewhere.\nconst ignoredProps = [\"class\", \"className\", \"ref\", \"mixin\", \"children\"];\n\n/**\n * Renders an HTML or SVG element.\n */\nexport class ElementNode extends MarkupNode {\n private root: HTMLElement | SVGElement;\n\n private id = getIntegerId();\n\n readonly tag;\n readonly props: Record<string, any>;\n\n private context: Context;\n private childNodes: MarkupNode[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Ref<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n constructor(context: Context, tag: string, props: Record<string, any>) {\n super();\n\n this.tag = tag;\n this.props = props;\n this.context = Context.createChildOf(context, getLoggerName.bind(this));\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, { fallback: 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<ViewNode<any> | null>(VIEW, { fallback: 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\n override getRoot() {\n return this.root;\n }\n\n override isMounted() {\n return this.context.isMounted;\n }\n\n override mount(parent: Node, after?: Node) {\n const wasMounted = this.isMounted();\n\n if (!wasMounted) {\n const { props } = this;\n\n if (props.mixin) {\n for (const mixin of toArray(props.mixin)) {\n const context = Context.createChildOf(this.context, getLoggerName.bind(this), {\n bindLifecycleToParent: true,\n logger: { tagName: mixin.name === \"mixin\" ? undefined : \"mixin\", tag: mixin.name },\n });\n const prevCtx = setCurrentContext(context);\n mixin(this.root, context);\n setCurrentContext(prevCtx);\n }\n }\n\n Context.emit(this.context, LifecycleEvent.WILL_MOUNT);\n\n const classes = props.className ?? props.class;\n\n this.applyProps(this.root, props);\n if (props.style) this.applyStyles(this.root, props.style, this.unsubscribers);\n if (classes) this.applyClasses(this.root, classes, this.unsubscribers);\n\n if (props.children) {\n this.childNodes = toMarkupNodes(this.context, props.children);\n }\n }\n\n if (!wasMounted) {\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].getRoot() : undefined;\n child.mount(this.root!, previous);\n }\n }\n\n if (this.root.parentNode === parent && \"moveBefore\" in parent) {\n (parent as any).moveBefore(this.root!, after?.nextSibling ?? null);\n } else {\n parent.insertBefore(this.root!, after?.nextSibling ?? null);\n }\n\n this.canClickAway = true;\n\n if (!wasMounted) Context.emit(this.context, LifecycleEvent.DID_MOUNT);\n }\n\n override unmount(skipDOM = false) {\n Context.emit(this.context, LifecycleEvent.WILL_UNMOUNT);\n\n if (!skipDOM) {\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 Context.emit(this.context, LifecycleEvent.DID_UNMOUNT);\n Context.emit(this.context, LifecycleEvent.DISPOSE);\n\n // Free ref after all lifecycle hooks have completed.\n queueMicrotask(() => {\n if (this.ref) {\n this.ref(EMPTY_REF);\n }\n });\n }\n\n override move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root!, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private attachProp<T>(value: MaybeSignal<T>, callback: (value: T) => void, key?: string) {\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 getKey(name: string) {\n return this.id + \":\" + name;\n }\n\n private applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n for (const key in omit(ignoredProps, props)) {\n const value = props[key];\n\n if (key === \"on:clickoutside\" || key === \"onClickOutside\" || key === \"onclickoutside\") {\n // Synthetic onclickoutside event.\n\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 // Capture is set to avoid intermediate elements cancelling this event before it gets to the window.\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n this.unsubscribers.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (key.startsWith(\"prop:\")) {\n // Keys starting with `prop:` are set as props.\n\n const _key = key.substring(5);\n this.attachProp(\n value,\n (current) => {\n (element as any)[_key] = current;\n },\n this.getKey(_key),\n );\n } else if (key.startsWith(\"on:\")) {\n // Keys starting with `on:` are treated as event listeners.\n\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(\n value as MaybeSignal<EventListener>,\n (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 this.getKey(_key),\n );\n }\n } else if (key.startsWith(\"attr:\")) {\n // Keys starting with `attr:` are set as attributes.\n\n const _key = key.substring(5).toLowerCase();\n this.attachProp(\n value,\n (current) => {\n if (current != null) {\n element.setAttribute(_key, String(current));\n } else {\n element.removeAttribute(_key);\n }\n },\n this.getKey(_key),\n );\n } else if (isFunction(value) && isCamelCaseEventName(key)) {\n // camelCase event names are applied with addEventListener.\n\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 this.unsubscribers.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (key.startsWith(\"on\") && isFunction(value) && knownEventNames.includes(key.substring(2))) {\n // Event handler properties (element.onsomething = function () {})\n\n (element as any)[key] = value;\n this.unsubscribers.push(() => {\n (element as any)[key] = undefined;\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n\n this.attachProp(\n value,\n (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n },\n this.getKey(key),\n );\n } else if (this.context.getState(IS_SVG, { fallback: false })) {\n // SVG gets everything set as an attribute.\n\n // TODO: This isn't exactly right. SVGElement supports props as well.\n this.attachProp(\n value,\n (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n },\n this.getKey(key),\n );\n } else {\n // Special handling for other props on a case by case basis.\n\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(\n value,\n (current) => {\n (element as any)[key] = String(current);\n },\n this.getKey(key),\n );\n break;\n\n case \"for\":\n this.attachProp(\n value,\n (current) => {\n (element as any).htmlFor = current;\n },\n this.getKey(key),\n );\n break;\n\n case \"innerHTML\":\n this.attachProp(\n value,\n (current) => {\n (element as any).innerHTML = current;\n },\n this.getKey(key),\n );\n break;\n\n case \"title\":\n this.attachProp(\n value,\n (current) => {\n if (current == null) {\n (element as any).removeAttribute(key);\n } else {\n (element as any).setAttribute(key, String(current));\n }\n },\n this.getKey(key),\n );\n\n case \"checked\":\n this.attachProp(\n value,\n (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 this.getKey(key),\n );\n break;\n\n case \"dataset\":\n let applied: Record<string, string> = {};\n this.attachProp(\n value,\n (_next) => {\n if (isObject(_next)) {\n // Convert keys to camelCase and make sure values are strings.\n const next: Record<string, string> = {};\n for (const _key in _next) {\n next[toCamelCase(_key)] = String(_next[_key]);\n }\n\n for (const key in applied) {\n // Key removed.\n if (!Object.hasOwn(next, key)) {\n delete element.dataset[key];\n delete applied[key];\n }\n }\n\n for (const key in next) {\n // Value changed (or not set).\n if (applied[key] !== next[key]) {\n element.dataset[key] = next[key];\n applied[key] = next[key];\n }\n }\n } else {\n for (const key in applied) {\n delete element.dataset[key];\n }\n }\n },\n this.getKey(key),\n );\n break;\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(\n value,\n (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 this.getKey(key),\n );\n break;\n\n default: {\n // Fall back to setting as a property.\n this.attachProp(\n value,\n (current) => {\n (element as any)[key] = current;\n },\n this.getKey(key),\n );\n break;\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\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(asPixelsIfNumber(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(asPixelsIfNumber(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(this: ElementNode) {\n const root = this.getRoot();\n if (root == null) return this.tag;\n let name = this.getRoot().tagName.toLowerCase();\n if (root.id) {\n name += `#${root.id}`;\n }\n if (root.classList.length > 0) {\n for (const className of 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\nfunction asPixelsIfNumber(value: any): string {\n if (isNumber(value)) {\n return `${value}px`;\n } else {\n return value;\n }\n}\n\n// A list of all known event names. These will be handled as event listeners.\nconst knownEventNames = [\n // Element\n \"animationcancel\",\n \"animationend\",\n \"animationiteration\",\n \"animationstart\",\n \"auxclick\",\n \"beforeinput\",\n \"beforematch\",\n \"beforexrselect\",\n \"blur\",\n \"click\",\n \"compositionend\",\n \"compositionstart\",\n \"compositionupdate\",\n \"contentvisibilityautostatechange\",\n \"contextmenu\",\n \"copy\",\n \"cut\",\n \"dblclick\",\n \"focus\",\n \"focusin\",\n \"focusout\",\n \"fullscreenchange\",\n \"fullscreenerror\",\n \"gotpointercapture\",\n \"input\",\n \"keydown\",\n \"keyup\",\n \"lostpointercapture\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"paste\",\n \"pointercancel\",\n \"pointerdown\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerrawupdate\",\n \"pointerup\",\n \"scroll\",\n \"scrollend\",\n \"scrollsnapchange\",\n \"scrollsnapchanging\",\n \"securitypolicyviolation\",\n \"touchcancel\",\n \"touchend\",\n \"touchmove\",\n \"touchstart\",\n \"transitioncancel\",\n \"transitionend\",\n \"transitionrun\",\n \"transitionstart\",\n \"webkitmouseforcechanged\",\n \"webkitmouseforcedown\",\n \"webkitmouseforceup\",\n \"webkimouseforcewillbegin\",\n \"wheel\",\n\n // HTMLElement\n \"beforetoggle\",\n \"change\",\n \"command\",\n \"drag\",\n \"dragend\",\n \"dragenter\",\n \"dragleave\",\n \"dragover\",\n \"dragstart\",\n \"drop\",\n \"error\",\n \"load\",\n \"toggle\",\n\n // HTMLInputElement\n \"cancel\",\n \"invalid\",\n \"search\",\n \"select\",\n \"selectionchange\",\n\n // HTMLFormElement\n \"formdata\",\n \"reset\",\n \"submit\",\n];\n","import type { Renderable } from \"../../types.js\";\nimport { Context } from \"../context.js\";\nimport { render } from \"../markup.js\";\nimport { MarkupNode } from \"./_markup.js\";\n\n/**\n * Renders content into a specified parent node.\n */\nexport class PortalNode extends MarkupNode {\n private context;\n private value;\n private parent;\n\n private node?: MarkupNode;\n\n constructor(context: Context, value: Renderable, parent: Element) {\n super();\n this.context = context;\n this.value = value;\n this.parent = parent;\n }\n\n override getRoot() {\n return this.node?.getRoot();\n }\n\n override isMounted() {\n if (!this.node) {\n return false;\n }\n return this.node.isMounted();\n }\n\n override mount(_parent: Element, _after?: Node) {\n const node = render(this.value, this.context);\n this.node = node;\n node.mount(this.parent);\n }\n\n override unmount(skipDOM = false) {\n if (this.node?.isMounted()) {\n // Portals must unmount DOM nodes because they won't be removed by parents unmounting.\n this.node.unmount(false);\n }\n }\n\n override move(_parent: Element, _after?: Node) {\n // Moving does not apply to portals.\n }\n}\n","import { type Context, ref, type Ref, type Store } from \"../core\";\nimport {\n type EffectFn,\n get,\n getCurrentContext,\n type MaybeSignal,\n memo,\n type Setter,\n signal,\n type Signal,\n type SignalOptions,\n untracked,\n} from \"../core/signals\";\n\n/**\n * Returns the Context object of the `View`, `Store` or `Mixin` this hook is called in.\n *\n * @param name - If passed, the context will be renamed. Context takes the name of the component function by default.\n */\nexport function useContext(name?: MaybeSignal<string>): Context {\n const context = getCurrentContext();\n if (!context) {\n throw new Error(`No context found; hooks can only be called in the body of a View, Store or Mixin.`);\n }\n if (name != null) {\n context.setName(name);\n }\n return context;\n}\n\n/**\n * Returns the nearest instance of a Store provided to this context.\n */\nexport function useStore<T>(store: Store<any, T>): T {\n return useContext().useStore(store);\n}\n\n/**\n * Adds a store to this context and returns the store instance.\n */\nexport function useStoreProvider<T, O>(store: Store<O, T>, options?: O): T {\n return useContext().provideStore(store, options).useStore(store);\n}\n\n/**\n * Schedules `callback` to run just after the component is mounted.\n * If `callback` returns a function, that function will run when the context is unmounted.\n */\nexport function useMount(callback: () => void | (() => void)): void {\n const context = useContext();\n context.onLifecycleTransition(\"didMount\", () => {\n const result = callback();\n if (result) context.onLifecycleTransition(\"didUnmount\", result);\n });\n}\n\n/**\n * Schedules `callback` to run when the context is unmounted.\n */\nexport function useUnmount(callback: () => void): void {\n useContext().onLifecycleTransition(\"didUnmount\", callback);\n}\n\n/**\n * Creates a new read-only Signal. Returns bound Getter and Setter functions.\n *\n * @example\n * const [$count, setCount] = useSignal(5);\n * $count(); // 5\n * setCount(6);\n * setCount((current) => current + 1);\n * $count(); // 7\n */\nexport function useSignal<T>(value: T, options?: SignalOptions<T>): [Signal<T>, Setter<T>];\nexport function useSignal<T>(\n value: undefined,\n options: SignalOptions<T>,\n): [Signal<T | undefined>, Setter<T | undefined>];\nexport function useSignal<T>(): [Signal<T | undefined>, Setter<T | undefined>];\nexport function useSignal<T>(value?: T, options?: SignalOptions<T>): [Signal<T>, Setter<T>] {\n useContext(); // Ensure we're called within a context.\n return signal(value as T, options);\n}\n\nexport function useMemo<T>(\n compute: (current?: T) => MaybeSignal<T>,\n deps?: Signal<any>[],\n options?: SignalOptions<T>,\n): Signal<T> {\n useContext(); // Ensure we're called within a context.\n return memo(compute, { ...options, deps });\n}\n\n/**\n * Takes the current state and a dispatched action. Returns a new state based on the action.\n * Typically the body of this function will be a large switch statement.\n */\nexport type Reducer<State, Action> = (state: State, action: Action) => State;\n\n/**\n * Dispatches an action to this reducer, causing the state to update.\n */\nexport type Dispatcher<Action> = (action: Action) => void;\n\n/**\n *\n */\nexport function useReducer<State, Action>(\n reducer: Reducer<State, Action>,\n initialState: State,\n): [Signal<State>, Dispatcher<Action>] {\n const [$state, setState] = useSignal(initialState);\n const dispatch = (action: Action) => {\n setState((current) => reducer(current, action));\n };\n return [$state, dispatch];\n}\n\n/**\n * Creates an effect bound to the current context.\n * The `fn` is called when the component is mounted, then again each time the dependencies are updated until the component is unmounted.\n */\nexport function useEffect(fn: EffectFn, deps?: Signal<any>[]): void {\n const context = useContext();\n if (deps) {\n context.effect(() => {\n for (const dep of deps) get(dep);\n return untracked(fn);\n });\n } else {\n context.effect(fn);\n }\n}\n\n/**\n * A hybrid Ref which is both a function ref and a React-style object ref with a `current` property.\n * Both the `current` property and the function syntax access the same value.\n */\nexport interface HybridRef<T> extends Ref<T> {\n current: T;\n}\n\n/**\n * Creates a Ref. Useful for getting references to DOM nodes.\n *\n * @deprecated use ref()\n */\nexport function useRef<T>(initialValue?: T): HybridRef<T>;\n\nexport function useRef<T>(...value: [T]): HybridRef<T> {\n useContext(); // assert that we're in a valid context\n const valueRef = ref(...value);\n Object.defineProperty(valueRef, \"current\", { get: valueRef, set: valueRef });\n return valueRef as HybridRef<T>;\n}\n","import type { Renderable } from \"../../types.js\";\nimport { deepEqual } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport { useContext } from \"../hooks.js\";\nimport { batch, effect, untracked, writable, type Signal, type UnsubscribeFn, type Writable } from \"../signals.js\";\nimport { MarkupNode } from \"./_markup.js\";\nimport { ViewNode } from \"./view.js\";\n\n// ----- Types ----- //\n\nexport type Key = any;\n\nexport type KeyFn<T> = (item: T, index: number) => Key;\nexport type RenderFn<T> = (item: Signal<T>, index: Signal<number>) => Renderable;\n\ntype ConnectedItem<T> = {\n key: Key;\n item: Writable<T>;\n index: Writable<number>;\n node: MarkupNode;\n};\n\n// ----- Code ----- //\n\n/**\n * Renders a list of items.\n */\nexport class RepeatNode<T> extends MarkupNode {\n private 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: Map<Key, ConnectedItem<T>> = new Map();\n\n constructor(context: Context, items: Signal<T[]>, key: KeyFn<T>, render: RenderFn<T>) {\n super();\n this.context = context;\n\n this.items = items;\n this.key = key;\n this.render = render;\n }\n\n override getRoot() {\n return this.root;\n }\n\n override isMounted() {\n return this.root.parentElement != null;\n }\n\n override mount(parent: Element, 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 untracked(() => {\n this._update(Array.from(value));\n });\n });\n }\n }\n\n override unmount(skipDOM = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (!skipDOM && this.isMounted()) {\n this.root.parentNode?.removeChild(this.root);\n }\n\n this._cleanup(true);\n }\n\n override move(parent: Element, after?: Node) {\n // TODO: Implement move\n return this.mount(parent, after);\n }\n\n private _cleanup(skipDOM: boolean) {\n for (const item of this.connectedItems.values()) {\n item.node.unmount(skipDOM);\n }\n this.connectedItems.clear();\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: Key; value: T; index: number };\n\n const potentialItems = new Map<Key, UpdateItem>();\n let index = 0;\n\n for (const item of value) {\n const key = this.key(item, index);\n potentialItems.set(key, {\n key,\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.values()) {\n if (!potentialItems.has(connected.key) && connected.node.isMounted()) {\n connected.node.unmount(false);\n }\n }\n\n batch(() => {\n // Add new views and update state for existing ones.\n for (const potential of potentialItems.values()) {\n const connected = this.connectedItems.get(potential.key);\n\n if (connected && connected.node.isMounted()) {\n connected.item.set(potential.value);\n connected.index.set(potential.index);\n\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 = writable(potential.value, { equals: deepEqual });\n const index = writable(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n item,\n index,\n node: new ViewNode(this.context, RepeatItemView, {\n item: () => item(),\n index: () => index(),\n render: this.render,\n }),\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.getRoot() ?? this.root;\n\n const connected = this.connectedItems.get(item.key);\n if (connected && connected.node.isMounted()) {\n item.node.move(this.root.parentElement!, previous);\n } else {\n item.node.mount(this.root.parentElement!, previous);\n }\n }\n\n this.connectedItems.clear();\n for (const item of newItems) {\n this.connectedItems.set(item.key, item);\n }\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.node.getRoot() ?? 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 render: (item: Signal<any>, index: Signal<number>) => Renderable;\n}\nconst contextName = \"dolla.RepeatItemView\";\nfunction RepeatItemView(props: ListItemProps) {\n useContext(contextName); // Set the context name.\n return props.render(props.item, props.index);\n}\n","import { isFunction, isString } from \"../typeChecking.js\";\nimport type { IntrinsicElements, Renderable, View } from \"../types.js\";\nimport { Context } from \"./context.js\";\nimport { MarkupNode } from \"./nodes/_markup.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { DynamicNode } from \"./nodes/dynamic.js\";\nimport { ElementNode } from \"./nodes/element.js\";\nimport { PortalNode } from \"./nodes/portal.js\";\nimport { KeyFn, RenderFn, RepeatNode } from \"./nodes/repeat.js\";\nimport { ViewNode } from \"./nodes/view.js\";\nimport { get, type MaybeSignal, memo, type Signal } from \"./signals.js\";\n\nexport { MarkupNode };\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\ntype PropsOf<V extends string | View<any>> = V extends View<infer U> ? U : any;\n\n/**\n * `Markup` is a set of metadata that will be constructed into a `MarkupNode`.\n */\nexport class Markup<Type extends string | View<any> = string | View<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 * Includes a `children` prop if children were passed.\n */\n props;\n\n constructor(type: Type, props: PropsOf<Type>) {\n this.type = type;\n this.props = props;\n }\n}\n\nexport enum MarkupType {\n DOM = \"$dom\",\n Dynamic = \"$dynamic\",\n Portal = \"$portal\",\n Repeat = \"$repeat\",\n}\n\nexport interface MarkupNodeProps {\n [MarkupType.DOM]: {\n value: Node;\n };\n [MarkupType.Dynamic]: {\n source: Signal<any>;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Element;\n };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n key: KeyFn<any>;\n render: RenderFn<any>;\n };\n}\n\nexport interface MarkupCustomElementProps {\n /**\n * Custom element tagName pattern (must include a hyphen).\n */\n [tag: `${string}-${string}`]: Record<string, any>;\n}\n\n/**\n * Creates a `Markup` element that defines an HTML element.\n */\nexport function createMarkup<T extends keyof IntrinsicElements>(\n tag: T,\n attrs: IntrinsicElements[T] & { children?: Renderable },\n): Markup;\n\n/**\n * Creates a `Markup` element that defines an HTML custom element.\n */\nexport function createMarkup<T extends keyof MarkupCustomElementProps>(\n type: T,\n props: MarkupCustomElementProps[T],\n): Markup;\n\n/**\n * Creates a `Markup` element that defines a `MarkupNode`.\n */\nexport function createMarkup<T extends keyof MarkupNodeProps>(type: T, props: MarkupNodeProps[T]): Markup;\n\n/**\n * Creates a `Markup` element that defines a view.\n */\nexport function createMarkup<P extends {}>(type: View<P>, props?: P): Markup;\n\n/**\n * Creates a `Markup` element that defines a view.\n */\nexport function createMarkup<P>(type: View<P>, props: P): Markup;\n\nexport function createMarkup(type: string | View<any>, props?: any) {\n return new Markup(type, props ?? {});\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\n/**\n * Takes any `Renderable` value and returns a `MarkupNode` that will display it.\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 DynamicNode(context, () => nodes);\n}\n\n/**\n * Convert basically anything into a set of `MarkupNode`s.\n */\nexport function toMarkupNodes(context: Context, ...content: any[]): MarkupNode[] {\n const items = content.flat(Infinity);\n const nodes: 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 nodes.push(new DOMNode(item));\n continue;\n }\n\n if (item instanceof Markup) {\n if (isFunction(item.type)) {\n nodes.push(new ViewNode(context, item.type as View<any>, item.props));\n continue;\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.DOM: {\n const attrs = item.props! as MarkupNodeProps[MarkupType.DOM];\n nodes.push(new DOMNode(attrs.value));\n continue;\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupNodeProps[MarkupType.Dynamic];\n nodes.push(new DynamicNode(context, attrs.source));\n continue;\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupNodeProps[MarkupType.Portal];\n nodes.push(new PortalNode(context, attrs.content, attrs.parent));\n continue;\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupNodeProps[MarkupType.Repeat];\n nodes.push(new RepeatNode(context, attrs.items, attrs.key, attrs.render));\n continue;\n }\n default:\n // Assume `type` is an HTML/SVG tag.\n nodes.push(new ElementNode(context, item.type, item.props));\n continue;\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n }\n\n if (item instanceof MarkupNode) {\n nodes.push(item);\n continue;\n }\n\n if (isFunction(item)) {\n nodes.push(new DynamicNode(context, item));\n continue;\n }\n\n // fallback to displaying value as text\n nodes.push(new DOMNode(document.createTextNode(String(item))));\n }\n\n return nodes;\n}\n"],"names":["LifecycleEvent","NAME","LIFECYCLE","PARENT","STORES","STATE","ContextLifecycle","context","event","listener","listeners","Context","#name","state","parent","name","options","untracked","logger","createLogger","get","descriptors","key","store","getUniqueId","prevCtx","setCurrentContext","result","error","isFunction","callback","fn","unsubscribe","effect","disposed","immediate","value","entries","args","typeOf","createContext","MarkupNode","after","skipDOM","DOMNode","node","DynamicNode","$slot","content","toArray","moveBefore","i","element","nodes","toMarkupNodes","previous","lastChildNextSibling","EMPTY_REF","ref","_ref","VIEW","ViewNode","view","props","wasMounted","render","isCamelCaseEventName","IS_SVG","ignoredProps","ElementNode","getIntegerId","tag","getLoggerName","getEnv","mixin","classes","child","omit","e","_key","current","_prev","eventName","knownEventNames","applied","_next","isObject","next","toCamelCase","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","priority","asPixelsIfNumber","classUnsubscribers","getClassMap","isString","names","item","lines","line","_value","entry","camelToKebab","root","className","$","ofs","isNumber","PortalNode","_parent","_after","useContext","getCurrentContext","useStore","useStoreProvider","useMount","useUnmount","useSignal","signal","useMemo","compute","deps","memo","useReducer","reducer","initialState","$state","setState","action","useEffect","dep","useRef","valueRef","RepeatNode","items","potentialItems","index","newItems","connected","batch","potential","writable","deepEqual","RepeatItemView","lastItem","contextName","Markup","type","MarkupType","createMarkup","attrs"],"mappings":"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"}
|
package/dist/router/hooks.d.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export type RouteMatch<T = Record<string, any>> = {
|
|
2
|
-
/**
|
|
3
|
-
* The path string that triggered this match.
|
|
4
|
-
*/
|
|
5
|
-
path: string;
|
|
6
|
-
/**
|
|
7
|
-
* The pattern satisfied by `path`.
|
|
8
|
-
*/
|
|
9
|
-
pattern: string;
|
|
10
|
-
/**
|
|
11
|
-
* Named params as parsed from `path`.
|
|
12
|
-
*/
|
|
13
|
-
params: Record<string, string>;
|
|
14
|
-
/**
|
|
15
|
-
* Query params as parsed from `path`.
|
|
16
|
-
*/
|
|
17
|
-
query: Record<string, string>;
|
|
18
|
-
/**
|
|
19
|
-
* Metadata registered to this route.
|
|
20
|
-
*/
|
|
21
|
-
meta: T;
|
|
22
|
-
};
|
|
23
|
-
export declare enum FragTypes {
|
|
24
|
-
Literal = 1,
|
|
25
|
-
Param = 2,
|
|
26
|
-
Wildcard = 3,
|
|
27
|
-
NumericParam = 4
|
|
28
|
-
}
|
|
29
|
-
export type RouteFragment = {
|
|
30
|
-
name: string;
|
|
31
|
-
type: FragTypes;
|
|
32
|
-
value: string | number | null;
|
|
33
|
-
};
|
|
34
|
-
export type ParsedRoute<T> = {
|
|
35
|
-
pattern: string;
|
|
36
|
-
fragments: RouteFragment[];
|
|
37
|
-
meta: T;
|
|
38
|
-
};
|
|
39
|
-
export type RouteMatchOptions<T> = {
|
|
40
|
-
willMatch?: (route: ParsedRoute<T>) => boolean;
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Separates a URL path into multiple fragments.
|
|
44
|
-
*
|
|
45
|
-
* @param path - A path string (e.g. `"/api/users/5"`)
|
|
46
|
-
* @returns an array of fragments (e.g. `["api", "users", "5"]`)
|
|
47
|
-
*/
|
|
48
|
-
export declare function splitPath(path: string): string[];
|
|
49
|
-
/**
|
|
50
|
-
* Joins multiple URL path fragments into a single string.
|
|
51
|
-
*
|
|
52
|
-
* @param parts - One or more URL fragments (e.g. `["api", "users", 5]`)
|
|
53
|
-
* @returns a joined path (e.g. `"api/users/5"`)
|
|
54
|
-
*/
|
|
55
|
-
export declare function joinPath(parts: {
|
|
56
|
-
toString(): string;
|
|
57
|
-
}[]): string;
|
|
58
|
-
export declare function resolvePath(base: string, part: string | null): string;
|
|
59
|
-
export declare function parseQueryParams(query: string): Record<string, string>;
|
|
60
|
-
/**
|
|
61
|
-
* Returns the nearest match, or undefined if the path matches no route.
|
|
62
|
-
*
|
|
63
|
-
* @param url - Path to match against routes.
|
|
64
|
-
* @param options - Options to customize how matching operates.
|
|
65
|
-
*/
|
|
66
|
-
export declare function matchRoutes<T>(routes: ParsedRoute<T>[], url: string, options?: RouteMatchOptions<T>): RouteMatch<T> | undefined;
|
|
67
|
-
/**
|
|
68
|
-
* Sort routes descending by specificity. Guarantees that the most specific route matches first
|
|
69
|
-
* no matter the order in which they were added.
|
|
70
|
-
*
|
|
71
|
-
* Routes without named params and routes with more fragments are weighted more heavily.
|
|
72
|
-
*/
|
|
73
|
-
export declare function sortRoutes<T>(routes: ParsedRoute<T>[]): ParsedRoute<T>[];
|
|
74
|
-
/**
|
|
75
|
-
* Converts a route pattern into a set of matchable fragments.
|
|
76
|
-
*
|
|
77
|
-
* @param route - A route string (e.g. "/api/users/{id}")
|
|
78
|
-
*/
|
|
79
|
-
export declare function patternToFragments(pattern: string): RouteFragment[];
|
|
80
|
-
/**
|
|
81
|
-
* Intercepts links within the root node.
|
|
82
|
-
*
|
|
83
|
-
* This is adapted from https://github.com/choojs/nanohref/blob/master/index.js
|
|
84
|
-
*
|
|
85
|
-
* @param root - Element under which to intercept link clicks
|
|
86
|
-
* @param callback - Function to call when a click event is intercepted
|
|
87
|
-
* @param _window - (optional) Override for global window object
|
|
88
|
-
*/
|
|
89
|
-
export declare function catchLinks(root: Element, callback: (anchor: HTMLAnchorElement) => void, _window?: Window & typeof globalThis): () => void;
|
|
90
|
-
/**
|
|
91
|
-
* Replace route pattern param placeholders with real matched values.
|
|
92
|
-
*/
|
|
93
|
-
export declare function replaceParams(path: string, params: Record<string, string | number>): string;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
function i(r) {
|
|
2
|
-
const t = typeof r;
|
|
3
|
-
switch (t) {
|
|
4
|
-
case "undefined":
|
|
5
|
-
return t;
|
|
6
|
-
case "number":
|
|
7
|
-
return isNaN(r) ? "NaN" : t;
|
|
8
|
-
case "function":
|
|
9
|
-
return /^\s*class\s+/.test(r.toString()) ? "class" : t;
|
|
10
|
-
case "object":
|
|
11
|
-
return r === null ? "null" : r instanceof Promise ? "promise" : r instanceof Map ? "map" : r instanceof Set ? "set" : Array.isArray(r) ? "array" : t;
|
|
12
|
-
default:
|
|
13
|
-
return t;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function s(r) {
|
|
17
|
-
return Array.isArray(r);
|
|
18
|
-
}
|
|
19
|
-
function f(r, t) {
|
|
20
|
-
return s(t) && t.every((n) => r(n));
|
|
21
|
-
}
|
|
22
|
-
function a(r, t, n) {
|
|
23
|
-
if (f(r, t))
|
|
24
|
-
return !0;
|
|
25
|
-
throw new TypeError(e(t, n));
|
|
26
|
-
}
|
|
27
|
-
function c(r) {
|
|
28
|
-
return typeof r == "string";
|
|
29
|
-
}
|
|
30
|
-
function y(r, t) {
|
|
31
|
-
if (c(r))
|
|
32
|
-
return !0;
|
|
33
|
-
throw new TypeError(e(r, t ?? "Expected a string. Got type: %t, value: %v"));
|
|
34
|
-
}
|
|
35
|
-
function p(r) {
|
|
36
|
-
return i(r) === "function";
|
|
37
|
-
}
|
|
38
|
-
function g(r) {
|
|
39
|
-
return typeof r == "number" && !isNaN(r);
|
|
40
|
-
}
|
|
41
|
-
function u(r) {
|
|
42
|
-
return r != null && typeof r == "object" && !s(r);
|
|
43
|
-
}
|
|
44
|
-
function A(r, t) {
|
|
45
|
-
if (u(r))
|
|
46
|
-
return !0;
|
|
47
|
-
throw new TypeError(e(r, t));
|
|
48
|
-
}
|
|
49
|
-
function e(r, t) {
|
|
50
|
-
const n = i(r), o = r?.toString?.() || String(r);
|
|
51
|
-
return t.replaceAll("%t", n).replaceAll("%v", o);
|
|
52
|
-
}
|
|
53
|
-
export {
|
|
54
|
-
u as a,
|
|
55
|
-
p as b,
|
|
56
|
-
a as c,
|
|
57
|
-
y as d,
|
|
58
|
-
A as e,
|
|
59
|
-
s as f,
|
|
60
|
-
f as g,
|
|
61
|
-
g as h,
|
|
62
|
-
c as i,
|
|
63
|
-
i as t
|
|
64
|
-
};
|
|
65
|
-
//# sourceMappingURL=typeChecking-5kmX0ulW.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeChecking-5kmX0ulW.js","sources":["../src/typeChecking.ts"],"sourcesContent":["type TypeNames =\n // These values can be returned by `typeof`.\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\"\n // These values are more specific ones that the `typeOf` function can return.\n | \"null\"\n | \"array\"\n | \"class\"\n | \"promise\"\n | \"map\"\n | \"set\"\n | \"NaN\";\n\n/**\n * Extends `typeof` operator with more specific and useful type distinctions.\n */\nexport function typeOf(value: any): TypeNames {\n const type = typeof value;\n switch (type) {\n case \"undefined\":\n return type;\n case \"number\":\n if (isNaN(value as any)) return \"NaN\";\n return type;\n case \"function\":\n if (/^\\s*class\\s+/.test(value.toString())) return \"class\";\n return type;\n case \"object\":\n if (value === null) return \"null\";\n if (value instanceof Promise) return \"promise\";\n if (value instanceof Map) return \"map\";\n if (value instanceof Set) return \"set\";\n if (Array.isArray(value)) return \"array\";\n return type;\n default:\n return type;\n }\n}\n\n/**\n * Throws a TypeError unless `condition` is truthy.\n *\n * @param condition - Value whose truthiness is in question.\n * @param errorMessage - Optional message for the thrown TypeError.\n */\nexport function assert(condition: any, errorMessage?: string): void {\n if (!condition) {\n throw new TypeError(\n formatError(condition, errorMessage || \"Failed assertion. Value is not truthy. Got type: %t, value: %v\"),\n );\n }\n}\n\n/**\n * Returns true if `value` is an array.\n */\nexport function isArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value);\n}\n\n/**\n * Throws an error if `value` is not an array.\n */\nexport function assertArray(value: unknown, errorMessage?: string): value is Array<unknown> {\n if (isArray(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage || \"Expected array. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true when `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n */\n\nexport function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[] {\n return isArray(value) && value.every((item) => check(item));\n}\n\n/**\n * Throws a TypeError unless `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n * @param errorMessage - A custom error message.\n */\nexport function assertArrayOf<T>(\n check: (item: unknown) => boolean,\n value: unknown,\n errorMessage?: string,\n): value is T[] {\n if (isArrayOf(check, value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an array of valid items. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Throws a TypeError unless `value` is a string.\n */\nexport function assertString(value: unknown, errorMessage?: string): value is string {\n if (isString(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a string. Got type: %t, value: %v\"));\n}\n\n// TODO: More specific validation for common types of strings? Email address, URL, UUID, etc?\n\n/**\n * Returns true if `value` is a function (but not a class).\n */\nexport function isFunction<T = (...args: unknown[]) => unknown>(value: unknown): value is T {\n return typeOf(value) === \"function\";\n}\n\n/**\n * Throws a TypeError unless `value` is a function.\n */\nexport function assertFunction<T = (...args: unknown[]) => unknown>(value: unknown, errorMessage?: string): value is T {\n if (isFunction(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a function. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a number.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !isNaN(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a number.\n */\nexport function assertNumber(value: unknown, errorMessage?: string): value is number {\n if (isNumber(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a number. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function isInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Returns `true` if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n */\nexport function isInstanceOf<T extends Function>(constructor: T, value: unknown): value is T;\n\nexport function isInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n\n const test = (value: unknown): value is T => {\n return value instanceof constructor;\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns a function that takes a `value` and throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n * @param errorMessage - A custom error message for when the assertion fails.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;\n\nexport function assertInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n const errorMessage = isString(args[2])\n ? args[2]\n : `Expected instance of ${constructor.name}. Got type: %t, value: %v`;\n\n const test = (value: unknown): value is T => {\n if (value instanceof constructor) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns true if `value` is a plain JavaScript object.\n */\nexport function isObject(value: unknown): value is Record<string | number | symbol, unknown> {\n return value != null && typeof value === \"object\" && !isArray(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a plain JavaScript object.\n */\nexport function assertObject(value: unknown, errorMessage?: string): value is object {\n if (isObject(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an object. Got type: %t, value: %v\"));\n}\n\n/**\n * Replaces `%t` and `%v` placeholders in a message with real values.\n */\nfunction formatError(value: unknown, message: string) {\n const typeName = typeOf(value);\n\n // TODO: Pretty format value as string based on type.\n const valueString = value?.toString?.() || String(value);\n\n return message.replaceAll(\"%t\", typeName).replaceAll(\"%v\", valueString);\n}\n"],"names":["typeOf","value","type","isArray","isArrayOf","check","item","assertArrayOf","errorMessage","formatError","isString","assertString","isFunction","isNumber","isObject","assertObject","message","typeName","valueString"],"mappings":"AAsBO,SAASA,EAAOC,GAAuB;AAC5C,QAAMC,IAAO,OAAOD;AACpB,UAAQC,GAAA;AAAA,IACN,KAAK;AACH,aAAOA;AAAA,IACT,KAAK;AACH,aAAI,MAAMD,CAAY,IAAU,QACzBC;AAAA,IACT,KAAK;AACH,aAAI,eAAe,KAAKD,EAAM,SAAA,CAAU,IAAU,UAC3CC;AAAA,IACT,KAAK;AACH,aAAID,MAAU,OAAa,SACvBA,aAAiB,UAAgB,YACjCA,aAAiB,MAAY,QAC7BA,aAAiB,MAAY,QAC7B,MAAM,QAAQA,CAAK,IAAU,UAC1BC;AAAA,IACT;AACE,aAAOA;AAAA,EAAA;AAEb;AAmBO,SAASC,EAAQF,GAAyC;AAC/D,SAAO,MAAM,QAAQA,CAAK;AAC5B;AAoBO,SAASG,EAAaC,GAAmCJ,GAA8B;AAC5F,SAAOE,EAAQF,CAAK,KAAKA,EAAM,MAAM,CAACK,MAASD,EAAMC,CAAI,CAAC;AAC5D;AASO,SAASC,EACdF,GACAJ,GACAO,GACc;AACd,MAAIJ,EAAUC,GAAOJ,CAAK;AACxB,WAAO;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,CAA2E,CAAC;AACrH;AAKO,SAASE,EAAST,GAAiC;AACxD,SAAO,OAAOA,KAAU;AAC1B;AAKO,SAASU,EAAaV,GAAgBO,GAAwC;AACnF,MAAIE,EAAST,CAAK;AAChB,WAAO;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,KAAgB,4CAA4C,CAAC;AACtG;AAOO,SAASI,EAAgDX,GAA4B;AAC1F,SAAOD,EAAOC,CAAK,MAAM;AAC3B;AAgBO,SAASY,EAASZ,GAAiC;AACxD,SAAO,OAAOA,KAAU,YAAY,CAAC,MAAMA,CAAK;AAClD;AAkFO,SAASa,EAASb,GAAoE;AAC3F,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAACE,EAAQF,CAAK;AACrE;AAKO,SAASc,EAAad,GAAgBO,GAAwC;AACnF,MAAIM,EAASb,CAAK;AAChB,WAAO;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,CAA6D,CAAC;AACvG;AAKA,SAASC,EAAYR,GAAgBe,GAAiB;AACpD,QAAMC,IAAWjB,EAAOC,CAAK,GAGvBiB,IAAcjB,GAAO,WAAA,KAAgB,OAAOA,CAAK;AAEvD,SAAOe,EAAQ,WAAW,MAAMC,CAAQ,EAAE,WAAW,MAAMC,CAAW;AACxE;"}
|
package/dist/typeChecking.d.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
type TypeNames = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "null" | "array" | "class" | "promise" | "map" | "set" | "NaN";
|
|
2
|
-
/**
|
|
3
|
-
* Extends `typeof` operator with more specific and useful type distinctions.
|
|
4
|
-
*/
|
|
5
|
-
export declare function typeOf(value: any): TypeNames;
|
|
6
|
-
/**
|
|
7
|
-
* Throws a TypeError unless `condition` is truthy.
|
|
8
|
-
*
|
|
9
|
-
* @param condition - Value whose truthiness is in question.
|
|
10
|
-
* @param errorMessage - Optional message for the thrown TypeError.
|
|
11
|
-
*/
|
|
12
|
-
export declare function assert(condition: any, errorMessage?: string): void;
|
|
13
|
-
/**
|
|
14
|
-
* Returns true if `value` is an array.
|
|
15
|
-
*/
|
|
16
|
-
export declare function isArray(value: unknown): value is Array<unknown>;
|
|
17
|
-
/**
|
|
18
|
-
* Throws an error if `value` is not an array.
|
|
19
|
-
*/
|
|
20
|
-
export declare function assertArray(value: unknown, errorMessage?: string): value is Array<unknown>;
|
|
21
|
-
/**
|
|
22
|
-
* Returns true when `value` is an array and `check` returns true for every item.
|
|
23
|
-
*
|
|
24
|
-
* @param check - Function to check items against.
|
|
25
|
-
* @param value - A possible array.
|
|
26
|
-
*/
|
|
27
|
-
export declare function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[];
|
|
28
|
-
/**
|
|
29
|
-
* Throws a TypeError unless `value` is an array and `check` returns true for every item.
|
|
30
|
-
*
|
|
31
|
-
* @param check - Function to check items against.
|
|
32
|
-
* @param value - A possible array.
|
|
33
|
-
* @param errorMessage - A custom error message.
|
|
34
|
-
*/
|
|
35
|
-
export declare function assertArrayOf<T>(check: (item: unknown) => boolean, value: unknown, errorMessage?: string): value is T[];
|
|
36
|
-
/**
|
|
37
|
-
* Returns true if `value` is a string.
|
|
38
|
-
*/
|
|
39
|
-
export declare function isString(value: unknown): value is string;
|
|
40
|
-
/**
|
|
41
|
-
* Throws a TypeError unless `value` is a string.
|
|
42
|
-
*/
|
|
43
|
-
export declare function assertString(value: unknown, errorMessage?: string): value is string;
|
|
44
|
-
/**
|
|
45
|
-
* Returns true if `value` is a function (but not a class).
|
|
46
|
-
*/
|
|
47
|
-
export declare function isFunction<T = (...args: unknown[]) => unknown>(value: unknown): value is T;
|
|
48
|
-
/**
|
|
49
|
-
* Throws a TypeError unless `value` is a function.
|
|
50
|
-
*/
|
|
51
|
-
export declare function assertFunction<T = (...args: unknown[]) => unknown>(value: unknown, errorMessage?: string): value is T;
|
|
52
|
-
/**
|
|
53
|
-
* Returns true if `value` is a number.
|
|
54
|
-
*/
|
|
55
|
-
export declare function isNumber(value: unknown): value is number;
|
|
56
|
-
/**
|
|
57
|
-
* Throws a TypeError unless `value` is a number.
|
|
58
|
-
*/
|
|
59
|
-
export declare function assertNumber(value: unknown, errorMessage?: string): value is number;
|
|
60
|
-
/**
|
|
61
|
-
* Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.
|
|
62
|
-
*
|
|
63
|
-
* @param constructor - The constructor a value must be an instance of to match.
|
|
64
|
-
*/
|
|
65
|
-
export declare function isInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;
|
|
66
|
-
/**
|
|
67
|
-
* Returns `true` if `value` is an instance of `constructor`.
|
|
68
|
-
*
|
|
69
|
-
* @param constructor - The constructor `value` must be an instance of.
|
|
70
|
-
* @param value - A value that may be an instance of `constructor`.
|
|
71
|
-
*/
|
|
72
|
-
export declare function isInstanceOf<T extends Function>(constructor: T, value: unknown): value is T;
|
|
73
|
-
/**
|
|
74
|
-
* Returns a function that takes a `value` and throws a TypeError unless `value` is an instance of `constructor`.
|
|
75
|
-
*
|
|
76
|
-
* @param constructor - The constructor a value must be an instance of to match.
|
|
77
|
-
*/
|
|
78
|
-
export declare function assertInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;
|
|
79
|
-
/**
|
|
80
|
-
* Throws a TypeError unless `value` is an instance of `constructor`.
|
|
81
|
-
*
|
|
82
|
-
* @param constructor - The constructor `value` must be an instance of.
|
|
83
|
-
* @param value - A value that may be an instance of `constructor`.
|
|
84
|
-
* @param errorMessage - A custom error message for when the assertion fails.
|
|
85
|
-
*/
|
|
86
|
-
export declare function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;
|
|
87
|
-
/**
|
|
88
|
-
* Returns true if `value` is a plain JavaScript object.
|
|
89
|
-
*/
|
|
90
|
-
export declare function isObject(value: unknown): value is Record<string | number | symbol, unknown>;
|
|
91
|
-
/**
|
|
92
|
-
* Throws a TypeError unless `value` is a plain JavaScript object.
|
|
93
|
-
*/
|
|
94
|
-
export declare function assertObject(value: unknown, errorMessage?: string): value is object;
|
|
95
|
-
export {};
|
package/docs/buildless.md
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
# Going Buildless: The No-Stress Setup
|
|
2
|
-
|
|
3
|
-
Aight, so we've been talking about setting up Dolla with Vite, which is sick for real projects. But what if you just wanna vibe? What if you wanna throw together a quick demo on CodePen, or just mess around in a single HTML file without all the setup drama?
|
|
4
|
-
|
|
5
|
-
Bet. You can totally run Dolla **buildless**. No npm, no Vite, no `tsconfig.json`. Just you, a browser, and an HTML file.
|
|
6
|
-
|
|
7
|
-
The magic that makes this happen is a tiny library called [HTM (Hyperscript Tagged Markup)](https://github.com/developit/htm). It's basically JSX, but for the browser. It lets you write your UI using tagged template literals, which look a little weird at first but are actually super intuitive.
|
|
8
|
-
|
|
9
|
-
## The Setup: One HTML File to Rule Them All
|
|
10
|
-
|
|
11
|
-
Fr, this is all you need. Just create an `index.html` file and paste this in.
|
|
12
|
-
|
|
13
|
-
```html
|
|
14
|
-
<!doctype html>
|
|
15
|
-
<html lang="en">
|
|
16
|
-
<head>
|
|
17
|
-
<meta charset="UTF-8" />
|
|
18
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
19
|
-
<title>Dolla Buildless Demo</title>
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
<!-- Your app will go here! -->
|
|
23
|
-
<div id="app"></div>
|
|
24
|
-
|
|
25
|
-
<!-- This is the magic part -->
|
|
26
|
-
<script type="module">
|
|
27
|
-
// 1. Import what you need from a CDN
|
|
28
|
-
import { createApp, useSignal, createMarkup } from "https://esm.sh/@manyducks.co/dolla";
|
|
29
|
-
import htm from "https://esm.sh/htm";
|
|
30
|
-
|
|
31
|
-
// 2. Tell HTM to use Dolla's markup function
|
|
32
|
-
const html = htm.bind(createMarkup);
|
|
33
|
-
|
|
34
|
-
// 3. Write your component using the `html` tag
|
|
35
|
-
function App() {
|
|
36
|
-
const [$count, setCount] = useSignal(0);
|
|
37
|
-
|
|
38
|
-
return html`
|
|
39
|
-
<div>
|
|
40
|
-
<h1>Count: ${$count}</h1>
|
|
41
|
-
<button onClick=${() => setCount((c) => c + 1)}>Click Me!</button>
|
|
42
|
-
</div>
|
|
43
|
-
`;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 4. Mount your app into the #app element
|
|
47
|
-
createApp(App).mount("#app");
|
|
48
|
-
</script>
|
|
49
|
-
</body>
|
|
50
|
-
</html>
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Just save that file and open it in your browser. That's it. You have a fully reactive Dolla app running. No terminal, no `npm install`.
|
|
54
|
-
|
|
55
|
-
## How it Works: The `html` Tag
|
|
56
|
-
|
|
57
|
-
Let's break down the key part. This line:
|
|
58
|
-
|
|
59
|
-
```js
|
|
60
|
-
const html = htm.bind(createMarkup);
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
...is the secret sauce. It creates a special "tag" for your template literals. Whenever you write `html\`...\``, HTM intercepts it and, instead of making a normal string, it uses Dolla's `createMarkup\` function to turn it into the same Markup Nodes that JSX would create.
|
|
64
|
-
|
|
65
|
-
So, this JSX:
|
|
66
|
-
|
|
67
|
-
```jsx
|
|
68
|
-
<div class="greeting">Hello, {$name}</div>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Becomes this with HTM:
|
|
72
|
-
|
|
73
|
-
```js
|
|
74
|
-
html`<div class="greeting">Hello, ${$name}</div>`;
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
It's basically the same thing, just with a slightly different syntax. You use `${...}` to embed any JavaScript expression, whether it's a signal, a string, or an event handler.
|
|
78
|
-
|
|
79
|
-
## A More Complex Example
|
|
80
|
-
|
|
81
|
-
Let's see how our usual `Counter` example looks with HTM. It's almost identical.
|
|
82
|
-
|
|
83
|
-
```html
|
|
84
|
-
<script type="module">
|
|
85
|
-
import { createApp, useSignal, useEffect, Show, createMarkup } from "https://esm.sh/@manyducks.co/dolla";
|
|
86
|
-
import htm from "https://esm.sh/htm";
|
|
87
|
-
|
|
88
|
-
const html = htm.bind(createMarkup);
|
|
89
|
-
|
|
90
|
-
function Counter() {
|
|
91
|
-
const [$count, setCount] = useSignal(0);
|
|
92
|
-
|
|
93
|
-
useEffect(() => {
|
|
94
|
-
console.log("The count is now:", $count());
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
return html`
|
|
98
|
-
<div>
|
|
99
|
-
<p>Count: ${$count}</p>
|
|
100
|
-
<button onClick=${() => setCount((c) => c + 1)}>+1</button>
|
|
101
|
-
|
|
102
|
-
{/* You can even use other components inside! */}
|
|
103
|
-
<${Show} when=${() => $count() > 5}>
|
|
104
|
-
<p>It's over 5!</p>
|
|
105
|
-
<//>
|
|
106
|
-
</div>
|
|
107
|
-
`;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
createApp(Counter).mount("#app");
|
|
111
|
-
</script>
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
The only weird part is using other components. You have to use the `${...}` syntax for the component itself, like `<${Show} ...>`. It's a little quirky, but you get used to it.
|
|
115
|
-
|
|
116
|
-
## So, Why Bother?
|
|
117
|
-
|
|
118
|
-
Going buildless is the main character for a few situations:
|
|
119
|
-
|
|
120
|
-
- **Quick Prototypes & Demos:** You can spin up a reactive demo in seconds. Perfect for CodePen, Glitch, or just a file on your desktop.
|
|
121
|
-
- **Learning:** It's a sick way to learn Dolla without getting bogged down in build tool configuration.
|
|
122
|
-
- **Embedding in Existing Sites:** Got a simple static site and just want to add a little island of reactivity? This is perfect.
|
|
123
|
-
|
|
124
|
-
For a huge, complex production app, you'll probably still want a build step with Vite for stuff like code splitting, bundling, and all that optimization. But for getting started or for smaller projects, going buildless is a total power move.
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
End.
|
|
129
|
-
|
|
130
|
-
- [🗂️ Docs](./index.md)
|
|
131
|
-
- [🏠 README](../README.md)
|
|
132
|
-
- [🦆 That's a lot of ducks.](https://www.manyducks.co)
|