@manyducks.co/dolla 2.0.0-alpha.62 → 2.0.0-alpha.63

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals-DbDmN2gr.js","sources":["../node_modules/alien-signals/esm/system.mjs","../src/utils.ts","../src/core/env.ts","../src/core/signals.ts"],"sourcesContent":["export var ReactiveFlags;\n(function (ReactiveFlags) {\n ReactiveFlags[ReactiveFlags[\"None\"] = 0] = \"None\";\n ReactiveFlags[ReactiveFlags[\"Mutable\"] = 1] = \"Mutable\";\n ReactiveFlags[ReactiveFlags[\"Watching\"] = 2] = \"Watching\";\n ReactiveFlags[ReactiveFlags[\"RecursedCheck\"] = 4] = \"RecursedCheck\";\n ReactiveFlags[ReactiveFlags[\"Recursed\"] = 8] = \"Recursed\";\n ReactiveFlags[ReactiveFlags[\"Dirty\"] = 16] = \"Dirty\";\n ReactiveFlags[ReactiveFlags[\"Pending\"] = 32] = \"Pending\";\n})(ReactiveFlags || (ReactiveFlags = {}));\nexport function createReactiveSystem({ update, notify, unwatched, }) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n endTracking,\n startTracking,\n shallowPropagate,\n };\n function link(dep, sub) {\n const prevDep = sub.depsTail;\n if (prevDep !== undefined && prevDep.dep === dep) {\n return;\n }\n let nextDep = undefined;\n const recursedCheck = sub.flags & 4;\n if (recursedCheck) {\n nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps;\n if (nextDep !== undefined && nextDep.dep === dep) {\n sub.depsTail = nextDep;\n return;\n }\n }\n const prevSub = dep.subsTail;\n if (prevSub !== undefined\n && prevSub.sub === sub\n && (!recursedCheck || isValidLink(prevSub, sub))) {\n return;\n }\n const newLink = sub.depsTail\n = dep.subsTail\n = {\n dep,\n sub,\n prevDep,\n nextDep,\n prevSub,\n nextSub: undefined,\n };\n if (nextDep !== undefined) {\n nextDep.prevDep = newLink;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = newLink;\n }\n else {\n sub.deps = newLink;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = newLink;\n }\n else {\n dep.subs = newLink;\n }\n }\n function unlink(link, sub = link.sub) {\n const dep = link.dep;\n const prevDep = link.prevDep;\n const nextDep = link.nextDep;\n const nextSub = link.nextSub;\n const prevSub = link.prevSub;\n if (nextDep !== undefined) {\n nextDep.prevDep = prevDep;\n }\n else {\n sub.depsTail = prevDep;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = nextDep;\n }\n else {\n sub.deps = nextDep;\n }\n if (nextSub !== undefined) {\n nextSub.prevSub = prevSub;\n }\n else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = nextSub;\n }\n else if ((dep.subs = nextSub) === undefined) {\n unwatched(dep);\n }\n return nextDep;\n }\n function propagate(link) {\n let next = link.nextSub;\n let stack;\n top: do {\n const sub = link.sub;\n let flags = sub.flags;\n if (flags & 3) {\n if (!(flags & 60)) {\n sub.flags = flags | 32;\n }\n else if (!(flags & 12)) {\n flags = 0;\n }\n else if (!(flags & 4)) {\n sub.flags = (flags & ~8) | 32;\n }\n else if (!(flags & 48) && isValidLink(link, sub)) {\n sub.flags = flags | 40;\n flags &= 1;\n }\n else {\n flags = 0;\n }\n if (flags & 2) {\n notify(sub);\n }\n if (flags & 1) {\n const subSubs = sub.subs;\n if (subSubs !== undefined) {\n link = subSubs;\n if (subSubs.nextSub !== undefined) {\n stack = { value: next, prev: stack };\n next = link.nextSub;\n }\n continue;\n }\n }\n }\n if ((link = next) !== undefined) {\n next = link.nextSub;\n continue;\n }\n while (stack !== undefined) {\n link = stack.value;\n stack = stack.prev;\n if (link !== undefined) {\n next = link.nextSub;\n continue top;\n }\n }\n break;\n } while (true);\n }\n function startTracking(sub) {\n sub.depsTail = undefined;\n sub.flags = (sub.flags & ~56) | 4;\n }\n function endTracking(sub) {\n const depsTail = sub.depsTail;\n let toRemove = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (toRemove !== undefined) {\n toRemove = unlink(toRemove, sub);\n }\n sub.flags &= ~4;\n }\n function checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n top: do {\n const dep = link.dep;\n const depFlags = dep.flags;\n let dirty = false;\n if (sub.flags & 16) {\n dirty = true;\n }\n else if ((depFlags & 17) === 17) {\n if (update(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n }\n else if ((depFlags & 33) === 33) {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack };\n }\n link = dep.deps;\n sub = dep;\n ++checkDepth;\n continue;\n }\n if (!dirty && link.nextDep !== undefined) {\n link = link.nextDep;\n continue;\n }\n while (checkDepth) {\n --checkDepth;\n const firstSub = sub.subs;\n const hasMultipleSubs = firstSub.nextSub !== undefined;\n if (hasMultipleSubs) {\n link = stack.value;\n stack = stack.prev;\n }\n else {\n link = firstSub;\n }\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub);\n }\n sub = link.sub;\n continue;\n }\n }\n else {\n sub.flags &= ~32;\n }\n sub = link.sub;\n if (link.nextDep !== undefined) {\n link = link.nextDep;\n continue top;\n }\n dirty = false;\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link) {\n do {\n const sub = link.sub;\n const nextSub = link.nextSub;\n const subFlags = sub.flags;\n if ((subFlags & 48) === 32) {\n sub.flags = subFlags | 16;\n if (subFlags & 2) {\n notify(sub);\n }\n }\n link = nextSub;\n } while (link !== undefined);\n }\n function isValidLink(checkLink, sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== undefined) {\n let link = sub.deps;\n do {\n if (link === checkLink) {\n return true;\n }\n if (link === depsTail) {\n break;\n }\n link = link.nextDep;\n } while (link !== undefined);\n }\n return false;\n }\n}\n","import { isFunction, isObject, typeOf } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\n// Guarantee unique ID by incrementing a global counter.\nlet idCounter = 1;\nexport function getUniqueId(): string {\n idCounter = (idCounter % Number.MAX_SAFE_INTEGER) + 1;\n return idCounter.toString(36) + Date.now().toString(36);\n}\n\n/*=============================*\\\n|| Object Equality ||\n\\*=============================*/\n\n/**\n * Equality check that passes if both values are the same object.\n * This is the default equality check for states.\n */\nexport function strictEqual(a: any, b: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * Equality check that passes if both values are the same object, or if both are objects or arrays with equal keys and values.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n\n // Must be same type\n const t = typeOf(a);\n if (t !== typeOf(b)) {\n return false;\n }\n\n switch (t) {\n case \"object\":\n // Objects must have same number of keys with strict equal values\n let size = 0;\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n size++;\n }\n return Object.keys(b).length === size;\n case \"array\":\n // Arrays must be the same length with strict equal values\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n case \"map\":\n if (a.size !== b.size) return false;\n for (const key of a.keys()) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n case \"set\":\n if (isFunction(a.symmetricDifference)) {\n return a.symmetricDifference(b).size === 0;\n } else {\n for (const key of a.keys()) {\n if (a[key] !== b.get(key)) return false;\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Equality check that passes if two objects have equal values, even if they are not the same object.\n */\n// NOTE: This code is https://github.com/epoberezkin/fast-deep-equal licensed under MIT.\n// I imported it because I couldn't get the old school module to play nice with my modern ES code as an external dependency.\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n for (i of a.entries()) if (!deepEqual(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = (a as any).length;\n if (length != (b as any).length) return false;\n for (i = length; i-- !== 0; ) if ((a as any)[i] !== (b as any)[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n var key = keys[i];\n\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n}\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n}\n\n/*=============================*\\\n|| Misc Utils ||\n\\*=============================*/\n\nexport function toArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n } else {\n return [value];\n }\n}\n\nexport function toCamelCase(s: string) {\n return s.replace(/-./g, (x) => x[1].toUpperCase());\n}\n\n/**\n * Takes any string and returns an OKLCH color.\n */\nexport function okhash(value: string) {\n let hue = 0;\n for (let i = 0; i < value.length; i++) {\n hue = (hue + value.charCodeAt(i) * 10) % 360;\n }\n return `oklch(0.68 0.15 ${hue}deg)`;\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","import type { Env } from \"../types\";\n\nlet currentEnv = \"production\";\n\nexport function getEnv() {\n return currentEnv;\n}\n\nexport function setEnv(value: Env) {\n currentEnv = value;\n}\n","import type { ReactiveFlags, ReactiveNode } from \"alien-signals\";\nimport { createReactiveSystem } from \"alien-signals/system\";\nimport { isFunction } from \"../typeChecking\";\nimport { strictEqual } from \"../utils\";\nimport { Context } from \"./context\";\nimport { getEnv } from \"./env\";\n\nconst enum EffectFlags {\n Queued = 1 << 6,\n}\n\ninterface EffectScope extends ReactiveNode {}\n\ninterface Effect extends ReactiveNode {\n fn(): void | (() => void);\n cleanup?: () => void;\n}\n\ninterface ComputedGetterState<T> {\n value?: T;\n}\n\ninterface Computed<T = any> extends ReactiveNode {\n value: T | undefined;\n getter: (this: ComputedGetterState<T>) => T;\n equals: EqualityFn<T>;\n}\n\ninterface Value<T = any> extends ReactiveNode {\n previousValue: T;\n value: T;\n equals: EqualityFn<T>;\n}\n\nconst queuedEffects: (Effect | EffectScope | undefined)[] = [];\nconst { link, unlink, propagate, checkDirty, endTracking, startTracking, shallowPropagate } = createReactiveSystem({\n update(signal: Value | Computed): boolean {\n if (\"getter\" in signal) {\n return updateComputed(signal);\n } else {\n return updateSignal(signal, signal.value);\n }\n },\n notify,\n unwatched(node: Value | Computed | Effect | EffectScope) {\n if (\"getter\" in node) {\n let toRemove = node.deps;\n if (toRemove !== undefined) {\n node.flags = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n do {\n toRemove = unlink(toRemove, node);\n } while (toRemove !== undefined);\n }\n } else if (!(\"previousValue\" in node)) {\n _effect.call(node);\n }\n },\n});\n\nlet batchDepth = 0;\n\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub: ReactiveNode | undefined;\nlet activeScope: EffectScope | undefined;\nlet activeContext: Context | undefined;\n\nfunction getCurrentSub(): ReactiveNode | undefined {\n return activeSub;\n}\n\nfunction setCurrentSub(sub: ReactiveNode | undefined) {\n const prevSub = activeSub;\n activeSub = sub;\n return prevSub;\n}\n\nexport function getCurrentContext(): Context | undefined {\n return activeContext;\n}\n\nexport function setCurrentContext(context: Context | undefined) {\n const prevContext = activeContext;\n activeContext = context;\n return prevContext;\n}\n\n// function getCurrentScope(): EffectScope | undefined {\n// return activeScope;\n// }\n\n// function setCurrentScope(scope: EffectScope | undefined) {\n// const prevScope = activeScope;\n// activeScope = scope;\n// return prevScope;\n// }\n\n// export function effectScope(fn: () => void): () => void {\n// const e: EffectScope = {\n// deps: undefined,\n// depsTail: undefined,\n// subs: undefined,\n// subsTail: undefined,\n// flags: 0 satisfies ReactiveFlags.None,\n// };\n// if (activeScope !== undefined) {\n// link(e, activeScope);\n// }\n// const prevSub = setCurrentSub(undefined);\n// const prevScope = setCurrentScope(e);\n// try {\n// fn();\n// } finally {\n// setCurrentScope(prevScope);\n// setCurrentSub(prevSub);\n// }\n// return effectOper.bind(e);\n// }\n\nfunction updateComputed(c: Computed): boolean {\n const prevSub = setCurrentSub(c);\n startTracking(c);\n try {\n const oldValue = c.value;\n const state: ComputedGetterState<any> = { value: c.value };\n // return oldValue !== (c.value = c.getter.call(state));\n return !c.equals(oldValue, (c.value = c.getter.call(state)));\n } finally {\n setCurrentSub(prevSub);\n endTracking(c);\n }\n}\n\nfunction updateSignal(s: Value, value: any): boolean {\n s.flags = 1 satisfies ReactiveFlags.Mutable;\n // return s.previousValue !== (s.previousValue = value);\n return !s.equals(s.previousValue, (s.previousValue = value));\n}\n\nfunction notify(e: Effect | EffectScope) {\n const flags = e.flags;\n if (!(flags & EffectFlags.Queued)) {\n e.flags = flags | EffectFlags.Queued;\n const subs = e.subs;\n if (subs !== undefined) {\n notify(subs.sub as Effect | EffectScope);\n } else {\n queuedEffects[queuedEffectsLength++] = e;\n }\n }\n}\n\nfunction run(e: Effect | EffectScope, flags: ReactiveFlags): void {\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps!, e))\n ) {\n const prev = setCurrentSub(e);\n startTracking(e);\n try {\n if (\"cleanup\" in e && e.cleanup !== undefined) {\n e.cleanup();\n }\n const result = (e as Effect).fn();\n if (\"cleanup\" in e && isFunction(result)) {\n e.cleanup = result;\n }\n } finally {\n setCurrentSub(prev);\n endTracking(e);\n }\n return;\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n e.flags = flags & ~(32 satisfies ReactiveFlags.Pending);\n }\n let link = e.deps;\n while (link !== undefined) {\n const dep = link.dep;\n const depFlags = dep.flags;\n if (depFlags & EffectFlags.Queued) {\n run(dep, (dep.flags = depFlags & ~EffectFlags.Queued));\n }\n link = link.nextDep;\n }\n}\n\nfunction flush(): void {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!;\n queuedEffects[notifyIndex++] = undefined;\n run(effect, (effect.flags &= ~EffectFlags.Queued));\n }\n notifyIndex = 0;\n queuedEffectsLength = 0;\n}\n\nfunction _computed<T>(this: Computed<T>): T {\n const flags = this.flags;\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(this.deps!, this))\n ) {\n if (updateComputed(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n this.flags = flags & ~(32 satisfies ReactiveFlags.Pending);\n }\n if (activeSub !== undefined) {\n link(this, activeSub);\n } else if (activeScope !== undefined) {\n link(this, activeScope);\n }\n return this.value!;\n}\n\nfunction _getter<T>(this: Value<T>): T {\n const value = this.value;\n if (this.flags & (16 satisfies ReactiveFlags.Dirty)) {\n if (updateSignal(this, value)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n if (activeSub !== undefined) {\n link(this, activeSub);\n }\n return value;\n}\n\nfunction _setter<T>(this: Value<T>, value: T | ((current: T) => T)): void {\n let next = isFunction(value) ? (get(value(this.value)) as T) : (value as T);\n if (!this.equals(this.value, next)) {\n this.value = next;\n this.flags = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty;\n const subs = this.subs;\n if (subs !== undefined) {\n propagate(subs);\n if (!batchDepth) {\n flush();\n }\n }\n }\n}\n\nfunction _effect(this: Effect | EffectScope): void {\n let dep = this.deps;\n while (dep !== undefined) {\n dep = unlink(dep, this);\n }\n const sub = this.subs;\n if (sub !== undefined) {\n unlink(sub);\n }\n this.flags = 0 satisfies ReactiveFlags.None;\n\n if (\"cleanup\" in this && this.cleanup != null) {\n this.cleanup();\n }\n}\n\n/*===================================*\\\n|| API ||\n\\*===================================*/\n\n/* -------------- TYPES --------------- */\n\n/**\n * A function that returns the current value of a signal.\n * Automatically tracked as a dependency when called within a tracking scope (such as `memo` or `effect` functions).\n */\nexport interface Signal<T> {\n (): T;\n}\n\n/**\n * A function that sets the value of the signal.\n */\nexport interface Setter<T> {\n (value: T): void;\n (update: (current: T) => T): void;\n}\n\n/**\n * A getter and setter in a single object. Callable like a getter, but includes a `set` method for updating the signal's value.\n */\nexport interface Writable<T> extends Signal<T> {\n set: Setter<T>;\n}\n\n/**\n * Utility type for a value that may be a getter or a plain value.\n * This value can be unwrapped to a plain value with `get` or `untracked` (depending on whether you're in a tracking context and need to track it).\n */\nexport type MaybeSignal<T> = Signal<T> | T;\n\nexport type EqualityFn<T> = (current: T, next: T) => boolean;\n\nexport interface SignalOptions<T> {\n /**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\n equals?: EqualityFn<T>;\n}\n\n/* -------------- PUBLIC API --------------- */\n\nexport function $<T>(compute: (previousValue?: T) => MaybeSignal<T>, options?: MemoOptions<T>): Signal<T>;\n\nexport function $<T>(): Writable<T | undefined>;\nexport function $<T>(value: undefined, options: SignalOptions<T | undefined>): Writable<T | undefined>;\nexport function $<T>(value: T, options?: SignalOptions<T>): Writable<T>;\n\nexport function $<T>(...args: any) {\n if (isFunction(args[0])) {\n return memo(args[0], args[1]);\n } else {\n return writable(args[0], args[1]);\n }\n}\n\nexport function writable<T>(): Writable<T | undefined>;\nexport function writable<T>(value: undefined, options: SignalOptions<T | undefined>): Writable<T | undefined>;\nexport function writable<T>(value: T, options?: SignalOptions<T>): Writable<T>;\n\nexport function writable<T>(value?: T, options?: SignalOptions<T>): Writable<T> {\n const v: Value<unknown> = {\n previousValue: value as T,\n value: value as T,\n equals: (options?.equals as EqualityFn<unknown>) ?? strictEqual,\n subs: undefined,\n subsTail: undefined,\n flags: 1 satisfies ReactiveFlags.Mutable,\n };\n const fn = _getter.bind(v) as Writable<T>;\n fn.set = _setter.bind(v);\n return fn;\n}\n\nexport interface MemoOptions<T> extends SignalOptions<T> {\n /**\n * An array of signals this `memo` depends on. If this is passed, calls to signals within `fn` will NOT be tracked.\n * Instead the `deps` array will be tracked and `fn` will re-run when any value in `deps` changes.\n */\n deps?: Signal<any>[];\n}\n\n/**\n * Creates a derived Signal that recomputes its value only when its dependencies change.\n * Dependencies are tracked when called inside `fn` by default,\n * but can be overridden by passing a `deps` array in the options object.\n */\nexport function memo<T>(fn: (previousValue?: T) => MaybeSignal<T>, options?: MemoOptions<T>): Signal<T> {\n return _computed.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n getter: function (this: ComputedGetterState<any>) {\n if (options?.deps) {\n for (let dep of options.deps) get(dep);\n return get(untracked(() => fn(this.value)));\n }\n return get(fn(this.value));\n },\n equals: (options?.equals as EqualityFn<unknown>) ?? strictEqual,\n }) as () => T;\n}\n\n/**\n * Suspends effects during `fn`. Effects for all updated Signal values are called at the end of the batch.\n */\nexport function batch(fn: () => void): void {\n ++batchDepth;\n fn();\n if (!--batchDepth) flush();\n}\n\n/**\n * Call a Signal function without tracking its value.\n */\nexport function untracked<T>(value: MaybeSignal<T>): T {\n if (isFunction(value)) {\n let result: T;\n const pausedSub = setCurrentSub(undefined);\n result = value();\n setCurrentSub(pausedSub);\n return result;\n } else {\n return value;\n }\n}\n\n/**\n * Unwraps the plain value from a Signal. If the value is not a Signal it is returned as-is.\n */\nexport function get<T>(value: MaybeSignal<T>): T {\n if (isFunction(value)) {\n return (value as () => T)();\n } else {\n return value;\n }\n}\n\n/**\n * Function to be invoked for the effect. Can return an optional cleanup function to be called between invocations.\n */\nexport type EffectFn = () => void | (() => void);\n\nexport type UnsubscribeFn = () => void;\n\nexport const INTERNAL_EFFECT = Symbol(\"INTERNAL_EFFECT\");\n\nexport interface EffectOptions {\n /**\n * An array of signals this effect depends on. If this is passed, calls to signals within `fn` will NOT be tracked.\n * Instead the `deps` array will be tracked and `fn` will re-run when any value in `deps` changes.\n */\n deps?: Signal<any>[];\n\n /**\n * For internal use.\n */\n _type?: symbol;\n}\n\n/**\n * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.\n * Reactives are tracked by accessing their `value` within the body of the function.\n *\n * NOTE: You must call the unsubscribe function to stop watching for changes.\n * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.\n */\nexport function effect(fn: EffectFn, options?: EffectOptions): UnsubscribeFn {\n const internal = options?._type === INTERNAL_EFFECT;\n\n // Automatically bind to active context if called within one.\n if (!internal && activeContext) {\n return activeContext.effect(fn);\n }\n\n // Warn about memory leaks in dev mode.\n if (!internal && getEnv() === \"development\") {\n console.warn(\n `This effect is not bound to a scope. You must call the unsubscribe function when done to avoid memory leaks.`,\n );\n }\n\n const e: Effect = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 2 satisfies ReactiveFlags.Watching,\n };\n if (activeSub !== undefined) {\n link(e, activeSub);\n } else if (activeScope !== undefined) {\n link(e, activeScope);\n }\n const prev = setCurrentSub(e);\n try {\n e.cleanup?.();\n const result = e.fn();\n e.cleanup = isFunction(result) ? result : undefined;\n } finally {\n setCurrentSub(prev);\n }\n return _effect.bind(e);\n}\n"],"names":["ReactiveFlags","createReactiveSystem","update","notify","unwatched","link","unlink","propagate","checkDirty","endTracking","startTracking","shallowPropagate","dep","sub","prevDep","nextDep","recursedCheck","prevSub","isValidLink","newLink","nextSub","next","stack","top","flags","subSubs","depsTail","toRemove","checkDepth","depFlags","dirty","subs","firstSub","hasMultipleSubs","subFlags","checkLink","noOp","idCounter","getUniqueId","strictEqual","a","b","shallowEqual","t","typeOf","size","key","i","isFunction","deepEqual","length","keys","omit","object","newObject","toArray","value","toCamelCase","s","x","okhash","hue","createMatcher","pattern","matchers","parts","p","part","section","name","positive","negative","fn","currentEnv","getEnv","setEnv","queuedEffects","signal","updateComputed","updateSignal","node","_effect","batchDepth","notifyIndex","queuedEffectsLength","activeSub","activeContext","setCurrentSub","getCurrentContext","setCurrentContext","context","prevContext","c","oldValue","state","run","prev","result","flush","effect","_computed","_getter","_setter","get","$","args","memo","writable","options","v","untracked","batch","pausedSub","INTERNAL_EFFECT","internal","e","_a"],"mappings":"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","x_google_ignoreList":[0]}
package/docs/signals.md CHANGED
@@ -6,33 +6,35 @@ Dolla sets out to solve the challenge of keeping your UI in sync with your data.
6
6
 
7
7
  [Solid](https://www.solidjs.com) and similar frameworks make use of [signals](https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob), which are containers for data that will change over time. Signal values are accessed through special getter functions that can be called inside of a "scope" to track their values. When the value of a tracked signal changes, any computations that happened in scopes that depend on those signals are re-run. In an app like this, all of your DOM updates are performed with pinpoint accuracy without diffing as signal values change.
8
8
 
9
- The Signals API in Dolla has just four functions:
9
+ The Signals API consists of these functions:
10
10
 
11
- - `$` to create a new Source or derived Signal.
12
- - `get` to unwrap a possible Signal value.
13
- - `peek` to unwrap a possible Signal value without tracking it.
11
+ - `state`
12
+ - `memo`
14
13
  - `effect` to run side effects when tracked signals change.
14
+ - `get` to unwrap a possible signal value.
15
+ - `untracked` to unwrap a possible signal value without tracking it.
16
+
15
17
 
16
18
  ### Basic State API
17
19
 
18
20
  ```js
19
- import { $ } from "@manyducks.co/dolla";
21
+ import { state } from "@manyducks.co/dolla";
20
22
 
21
- const count = $(72);
23
+ const [$count, setCount] = state(72);
22
24
 
23
25
  // Get the current value.
24
- count(): // 72
26
+ $count(): // 72
25
27
 
26
28
  // Set a new value.
27
- count(300);
29
+ setCount(300);
28
30
 
29
31
  // The State now reflects the latest value.
30
- count(); // 300
32
+ $count(); // 300
31
33
 
32
34
  // Data can also be updated by passing an update function.
33
35
  // This function takes the current state and returns the next.
34
- count((value) => value + 1);
35
- count(); // 301
36
+ setCount((value) => value + 1);
37
+ $count(); // 301
36
38
  ```
37
39
 
38
40
  ### Deriving States from other States
@@ -40,13 +42,13 @@ count(); // 301
40
42
  #### Example 1: Doubled
41
43
 
42
44
  ```js
43
- import { $ } from "@manyducks.co/dolla";
45
+ import { state, memo } from "@manyducks.co/dolla";
44
46
 
45
47
  // Passing a value to $() results in a Source...
46
- const count = $(1);
48
+ const [$count, setCount] = state(1);
47
49
 
48
50
  // ...while passing a function results in a Signal with a derived value.
49
- const doubled = $(() => count() * 2);
51
+ const doubled = memo(() => $count() * 2);
50
52
 
51
53
  count(10);
52
54
  doubled(); // 20
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manyducks.co/dolla",
3
- "version": "2.0.0-alpha.62",
3
+ "version": "2.0.0-alpha.63",
4
4
  "description": "Front-end components, routing and state management.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/core/index.d.ts",
@@ -56,7 +56,8 @@
56
56
  }
57
57
  },
58
58
  "dependencies": {
59
- "alien-signals": "^2.0.5"
59
+ "alien-signals": "^2.0.5",
60
+ "prosemirror-markdown": "^1.13.2"
60
61
  },
61
62
  "devDependencies": {
62
63
  "@types/node": "^22.12.0",
@@ -1,91 +0,0 @@
1
- import { b as i } from "./typeChecking-CbltMOUt.js";
2
- import { g as w, u as m, j as o, n as b, k as v } from "./signals-gCwiIe5X.js";
3
- let s = "production";
4
- function h() {
5
- return s;
6
- }
7
- function k(r) {
8
- s = r;
9
- }
10
- let g = {
11
- info: "development",
12
- log: "development",
13
- warn: "development",
14
- error: !0
15
- }, d = o("*,-dolla.*"), f = [], u = !1;
16
- function x(r) {
17
- return f.push(r), function() {
18
- f.splice(f.indexOf(r), 1);
19
- };
20
- }
21
- function y(r, e) {
22
- const t = (e == null ? void 0 : e.console) ?? L(), l = (a) => {
23
- let c = m(r);
24
- if (g[a] === !1 || i(g[a]) && g[a] !== h() || !d(c))
25
- return b;
26
- {
27
- let n = `%c${c}`;
28
- return e != null && e.tag ? e.tagName ? n += ` %c[${e.tagName}: %c${e.tag}%c]` : n += ` %c[%c${e.tag}%c]` : n += "%c%c%c", t[a].bind(
29
- t,
30
- n,
31
- `color:${v(n)};font-weight:bold`,
32
- "color:#777",
33
- "color:#aaa",
34
- "color:#777"
35
- );
36
- }
37
- };
38
- return {
39
- get info() {
40
- return l("info");
41
- },
42
- get log() {
43
- return l("log");
44
- },
45
- get warn() {
46
- return l("warn");
47
- },
48
- get error() {
49
- return l("error");
50
- },
51
- crash(a) {
52
- if (!u) {
53
- u = !0;
54
- const c = {
55
- error: a,
56
- loggerName: w(r),
57
- tag: e == null ? void 0 : e.tag,
58
- tagName: e == null ? void 0 : e.tagName
59
- };
60
- for (const n of f)
61
- n(c);
62
- throw a;
63
- }
64
- return a;
65
- }
66
- };
67
- }
68
- function C(r) {
69
- d = o(r);
70
- }
71
- function E(r) {
72
- for (const e in r) {
73
- const t = r[e];
74
- t && (g[e] = t);
75
- }
76
- }
77
- function L() {
78
- if (typeof window < "u" && window.console)
79
- return window.console;
80
- if (typeof global < "u" && global.console)
81
- return global.console;
82
- }
83
- export {
84
- C as a,
85
- E as b,
86
- y as c,
87
- h as g,
88
- x as o,
89
- k as s
90
- };
91
- //# sourceMappingURL=logger-Bl496yfY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger-Bl496yfY.js","sources":["../src/core/env.ts","../src/core/logger.ts"],"sourcesContent":["import type { Env } from \"../types\";\n\nlet currentEnv = \"production\";\n\nexport function getEnv() {\n return currentEnv;\n}\n\nexport function setEnv(value: Env) {\n currentEnv = value;\n}\n","import { isString } from \"../typeChecking.js\";\nimport type { Env } from \"../types.js\";\nimport { createMatcher, noOp, okhash, type MatcherFunction } from \"../utils.js\";\nimport { getEnv } from \"./env.js\";\nimport { get, untracked, type MaybeSignal } from \"./signals.js\";\n\nexport interface LogLevels {\n info: boolean | Env;\n log: boolean | Env;\n warn: boolean | Env;\n error: boolean | Env;\n}\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): Error;\n}\n\nexport interface LoggerOptions {\n /**\n * Tag value to print with logs.\n */\n tag?: string;\n\n /**\n * Label for tag value. Will be printed without a label if not specified.\n */\n tagName?: string;\n\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n}\n\nexport interface LoggerCrashProps {\n error: Error;\n loggerName: string;\n tag?: string;\n tagName?: string;\n}\n\nlet levels: LogLevels = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n};\nlet match: MatcherFunction = createMatcher(\"*,-dolla.*\");\nlet crashListeners: ((context: LoggerCrashProps) => void)[] = [];\nlet isCrashed = false;\n\n/**\n * Listen for logged crashes.\n */\nexport function onLoggerCrash(listener: (context: LoggerCrashProps) => void) {\n crashListeners.push(listener);\n\n return function cancel() {\n crashListeners.splice(crashListeners.indexOf(listener), 1);\n };\n}\n\nexport function createLogger(name: MaybeSignal<string>, options?: LoggerOptions): Logger {\n const _console = options?.console ?? _getDefaultConsole();\n\n const bind = (method: keyof LogLevels) => {\n let _name = untracked(name);\n if (levels[method] === false || (isString(levels[method]) && levels[method] !== getEnv()) || !match(_name)) {\n return noOp;\n } else {\n let label = `%c${_name}`;\n if (options?.tag) {\n if (options.tagName) {\n label += ` %c[${options.tagName}: %c${options.tag}%c]`;\n } else {\n label += ` %c[%c${options.tag}%c]`;\n }\n } else {\n label += `%c%c%c`;\n }\n return _console[method].bind(\n _console,\n label,\n `color:${okhash(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n };\n\n return {\n get info() {\n return bind(\"info\");\n },\n get log() {\n return bind(\"log\");\n },\n get warn() {\n return bind(\"warn\");\n },\n get error() {\n return bind(\"error\");\n },\n crash(error: Error) {\n if (!isCrashed) {\n isCrashed = true;\n const ctx: LoggerCrashProps = {\n error,\n loggerName: get(name),\n tag: options?.tag,\n tagName: options?.tagName,\n };\n\n for (const listener of crashListeners) {\n listener(ctx);\n }\n\n throw error;\n }\n\n return error;\n },\n };\n}\n\nexport function setLogFilter(filter: string | RegExp) {\n match = createMatcher(filter);\n}\n\nexport function setLogLevels(options: Partial<LogLevels>) {\n for (const key in options) {\n const value = options[key as keyof LogLevels];\n if (value) {\n levels[key as keyof LogLevels] = value;\n }\n }\n}\n\nfunction _getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n"],"names":["currentEnv","getEnv","setEnv","value","levels","match","createMatcher","crashListeners","isCrashed","onLoggerCrash","listener","createLogger","name","options","_console","_getDefaultConsole","bind","method","_name","untracked","isString","noOp","label","okhash","error","ctx","get","setLogFilter","filter","setLogLevels","key"],"mappings":";;AAEA,IAAIA,IAAa;AAEV,SAASC,IAAS;AAChB,SAAAD;AACT;AAEO,SAASE,EAAOC,GAAY;AACpB,EAAAH,IAAAG;AACf;ACmCA,IAAIC,IAAoB;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT,GACIC,IAAyBC,EAAc,YAAY,GACnDC,IAA0D,CAAC,GAC3DC,IAAY;AAKT,SAASC,EAAcC,GAA+C;AAC3E,SAAAH,EAAe,KAAKG,CAAQ,GAErB,WAAkB;AACvB,IAAAH,EAAe,OAAOA,EAAe,QAAQG,CAAQ,GAAG,CAAC;AAAA,EAC3D;AACF;AAEgB,SAAAC,EAAaC,GAA2BC,GAAiC;AACjF,QAAAC,KAAWD,KAAA,gBAAAA,EAAS,YAAWE,EAAmB,GAElDC,IAAO,CAACC,MAA4B;AACpC,QAAAC,IAAQC,EAAUP,CAAI;AAC1B,QAAIR,EAAOa,CAAM,MAAM,MAAUG,EAAShB,EAAOa,CAAM,CAAC,KAAKb,EAAOa,CAAM,MAAMhB,OAAa,CAACI,EAAMa,CAAK;AAChG,aAAAG;AACF;AACD,UAAAC,IAAQ,KAAKJ,CAAK;AACtB,aAAIL,KAAA,QAAAA,EAAS,MACPA,EAAQ,UACVS,KAAS,OAAOT,EAAQ,OAAO,OAAOA,EAAQ,GAAG,QAExCS,KAAA,SAAST,EAAQ,GAAG,QAGtBS,KAAA,UAEJR,EAASG,CAAM,EAAE;AAAA,QACtBH;AAAA,QACAQ;AAAA,QACA,SAASC,EAAOD,CAAK,CAAC;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEO,SAAA;AAAA,IACL,IAAI,OAAO;AACT,aAAON,EAAK,MAAM;AAAA,IACpB;AAAA,IACA,IAAI,MAAM;AACR,aAAOA,EAAK,KAAK;AAAA,IACnB;AAAA,IACA,IAAI,OAAO;AACT,aAAOA,EAAK,MAAM;AAAA,IACpB;AAAA,IACA,IAAI,QAAQ;AACV,aAAOA,EAAK,OAAO;AAAA,IACrB;AAAA,IACA,MAAMQ,GAAc;AAClB,UAAI,CAAChB,GAAW;AACF,QAAAA,IAAA;AACZ,cAAMiB,IAAwB;AAAA,UAC5B,OAAAD;AAAA,UACA,YAAYE,EAAId,CAAI;AAAA,UACpB,KAAKC,KAAA,gBAAAA,EAAS;AAAA,UACd,SAASA,KAAA,gBAAAA,EAAS;AAAA,QACpB;AAEA,mBAAWH,KAAYH;AACrB,UAAAG,EAASe,CAAG;AAGR,cAAAD;AAAA,MAAA;AAGD,aAAAA;AAAA,IAAA;AAAA,EAEX;AACF;AAEO,SAASG,EAAaC,GAAyB;AACpD,EAAAvB,IAAQC,EAAcsB,CAAM;AAC9B;AAEO,SAASC,EAAahB,GAA6B;AACxD,aAAWiB,KAAOjB,GAAS;AACnB,UAAAV,IAAQU,EAAQiB,CAAsB;AAC5C,IAAI3B,MACFC,EAAO0B,CAAsB,IAAI3B;AAAA,EACnC;AAEJ;AAEA,SAASY,IAAqB;AAC5B,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAEhB,MAAI,OAAO,SAAW,OAAe,OAAO;AAC1C,WAAO,OAAO;AAElB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"markup-UzKSsawX.js","sources":["../src/core/context.ts","../src/core/nodes/_markup.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/view.ts","../src/core/nodes/element.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 {\n effect,\n type EffectFn,\n get,\n type MaybeSignal,\n untracked,\n type UnsubscribeFn,\n setCurrentContext,\n} from \"./signals\";\n\nexport enum LifecycleEvent {\n WILL_MOUNT,\n DID_MOUNT,\n WILL_UNMOUNT,\n DID_UNMOUNT,\n DISPOSE,\n}\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 linked(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 /**\n * Traverses _parent contexts until arriving at one that doesn't have a parent itself.\n * Returns null if this context is the parent.\n */\n static getRoot(context: Context) {\n // This is like the programming version of \"Buffalo buffalo buffalo...\"\n let parent = context[PARENT];\n while (parent?.[PARENT]) {\n parent = parent[PARENT];\n }\n return parent ?? null;\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 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 throw this.crash(new Error(`An instance of ${name} was already added on this context.`));\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 prevCtx = setCurrentContext(context);\n const result = store.call(context, options, context);\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 getStore<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 * 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(); // 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 { toArray } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport { toMarkupNodes } from \"../markup.js\";\nimport { effect, untracked, type Signal, type UnsubscribeFn } 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 this.cleanup(skipDOM);\n this.root.parentNode?.removeChild(this.root);\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 if (\"moveBefore\" in parent) {\n (parent as any).moveBefore(this.root, lastChildNextSibling);\n } else {\n parent.insertBefore(this.root, lastChildNextSibling);\n }\n }\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 { MarkupNode } from \"./_markup.js\";\nimport { setCurrentContext } from \"../signals.js\";\n\nexport const VIEW = Symbol(\"ViewNode\");\n\n/**\n * Renders a View.\n */\nexport class ViewNode<P> extends MarkupNode {\n uniqueId = getUniqueId();\n context: Context;\n props;\n 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.linked(context, view.name ?? \"anonymous view\", {\n logger: {\n tag: this.uniqueId,\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.node?.isMounted() ?? false;\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 if (!wasMounted) {\n const { context, props, view } = this;\n try {\n const prevCtx = setCurrentContext(context);\n const result = view.call(context, props, context);\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, isObject, isString } from \"../../typeChecking.js\";\nimport { omit, toArray, toCamelCase } from \"../../utils.js\";\nimport { Context, LifecycleEvent } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkupNodes } from \"../markup.js\";\nimport {\n effect,\n get,\n setCurrentContext,\n type MaybeSignal,\n type Signal,\n type Source,\n type UnsubscribeFn,\n} 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 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?: 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 constructor(context: Context, tag: string, props: Record<string, any>) {\n super();\n\n this.tag = tag;\n this.props = props;\n this.context = Context.linked(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.mixin) {\n for (const mixin of toArray(props.mixin)) {\n const context = Context.linked(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 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.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.children) {\n this.childNodes = toMarkupNodes(this.context, props.children);\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 Context.emit(this.context, LifecycleEvent.WILL_MOUNT);\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].getRoot() : undefined;\n child.mount(this.root!, previous);\n }\n }\n\n parent.insertBefore(this.root!, after?.nextSibling ?? null);\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 if (this.ref) {\n this.ref(undefined);\n }\n\n Context.emit(this.context, LifecycleEvent.DID_UNMOUNT);\n Context.emit(this.context, LifecycleEvent.DISPOSE);\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) {\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 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(value, (current) => {\n (element as any)[_key] = current;\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(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 // Keys starting with `attr:` are set as attributes.\n\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 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(value, (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\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(value, (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\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(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 \"innerHTML\":\n this.attachProp(value, (current) => {\n (element as any).innerHTML = 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 \"dataset\":\n let applied: Record<string, string> = {};\n this.attachProp(value, (_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 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 // Fall back to setting as a property.\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\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 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(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\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 { Renderable } from \"../../types.js\";\nimport { deepEqual } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport { $, batch, effect, untracked, type Signal, type Source, type UnsubscribeFn } 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>, ctx: Context) => Renderable;\n\ntype ConnectedItem<T> = {\n key: Key;\n $item: Source<T>;\n $index: Source<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(skipDOM);\n }\n\n override move(parent: Element, after?: Node) {\n // TODO: Implement move\n return this.mount(parent, after);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems.values()) {\n item.node.unmount(parentIsUnmounting);\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(potential.value);\n connected.$index(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 = $(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 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>, context: Context) => Renderable;\n}\nconst contextName = \"dolla.RepeatItemView\";\nfunction RepeatItemView(props: ListItemProps, context: Context) {\n context.setName(contextName);\n return props.render.call(context, props.$item, props.$index, context);\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, type Signal } from \"./signals.js\";\n\nexport { MarkupNode };\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * `Markup` is a set of metadata that will be constructed into a `MarkupNode`.\n */\nexport class Markup<P = 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: string | View<P>, props?: P) {\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 m<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 m<T extends keyof MarkupCustomElementProps>(type: T, props: MarkupCustomElementProps[T]): Markup;\n\n/**\n * Creates a `Markup` element that defines a `MarkupNode`.\n */\nexport function m<T extends keyof MarkupNodeProps>(type: T, props: MarkupNodeProps[T]): Markup;\n\n/**\n * Creates a `Markup` element that defines a view.\n */\nexport function m<P extends {}>(type: View<P>, props?: P): Markup;\n\n/**\n * Creates a `Markup` element that defines a view.\n */\nexport function m<P>(type: View<P>, props: P): Markup;\n\nexport function m(type: string | View<any>, props?: any) {\n return new Markup(type, props ?? {});\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: Element, content: Renderable): Markup {\n return m(MarkupType.Portal, { parent, content });\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","LifecycleEvent2","NAME","LIFECYCLE","PARENT","STORES","STATE","ContextLifecycle","context","__publicField","event","listener","listeners","_e","_d","_c","_b","_a","_Context","name","options","__privateAdd","_name","__privateSet","untracked","logger","createLogger","get","__privateGet","descriptors","key","state","parent","store","getUniqueId","prevCtx","setCurrentContext","result","error","isFunction","callback","fn","unsubscribe","effect","disposed","immediate","value","entries","args","typeOf","Context","createContext","MarkupNode","after","skipDOM","DOMNode","node","DynamicNode","$slot","content","toArray","i","element","nodes","toMarkupNodes","previous","lastChildNextSibling","VIEW","ViewNode","view","props","wasMounted","render","isCamelCaseEventName","IS_SVG","ignoredProps","ElementNode","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","classUnsubscribers","getClassMap","isString","names","item","lines","line","_value","entry","camelToKebab","root","className","$","ofs","PortalNode","_parent","_after","RepeatNode","items","parentIsUnmounting","potentialItems","index","newItems","connected","batch","potential","$item","deepEqual","$index","RepeatItemView","lastItem","contextName","Markup","type","MarkupType","m","when","condition","thenContent","elseContent","unless","repeat","portal","attrs"],"mappings":"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"}