microtags 0.0.3 → 0.0.8

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../node_modules/alien-signals/esm/system.mjs", "../node_modules/alien-signals/esm/index.mjs", "../src/reactivity.ts", "../src/util.ts", "../src/context.ts", "../src/setup-context.ts", "../src/factory.ts", "../src/builders.ts"],
4
- "sourcesContent": ["export const ReactiveFlags = {\n None: 0,\n Mutable: 1,\n Watching: 2,\n RecursedCheck: 4,\n Recursed: 8,\n Dirty: 16,\n Pending: 32,\n};\nexport function createReactiveSystem({ update, notify, unwatched, }) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n };\n function link(dep, sub, version) {\n const prevDep = sub.depsTail;\n if (prevDep !== undefined && prevDep.dep === dep) {\n return;\n }\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps;\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version;\n sub.depsTail = nextDep;\n return;\n }\n const prevSub = dep.subsTail;\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n return;\n }\n const newLink = sub.depsTail\n = dep.subsTail\n = {\n version,\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, prevDep, nextDep, nextSub, prevSub } = link;\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, innerWrite) {\n let next = link.nextSub;\n let stack;\n top: do {\n const sub = link.sub;\n let flags = sub.flags;\n if (!(flags & (4 | 8 | 16 | 32))) {\n sub.flags = flags | 32;\n if (innerWrite) {\n sub.flags |= 8;\n }\n }\n else if (!(flags & (4 | 8))) {\n flags = 0;\n }\n else if (!(flags & 4)) {\n sub.flags = (flags & ~8) | 32;\n }\n else if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n sub.flags = flags | (8 | 32);\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 const nextSub = (link = subSubs).nextSub;\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\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 checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n const dep = link.dep;\n const flags = dep.flags;\n if (sub.flags & 16) {\n dirty = true;\n }\n else if ((flags & (1 | 16)) === (1 | 16)) {\n const subs = dep.subs;\n if (update(dep)) {\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n }\n else if ((flags & (1 | 32)) === (1 | 32)) {\n stack = { value: link, prev: stack };\n link = dep.deps;\n sub = dep;\n ++checkDepth;\n continue;\n }\n if (!dirty) {\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue;\n }\n }\n while (checkDepth--) {\n link = stack.value;\n stack = stack.prev;\n if (dirty) {\n const subs = sub.subs;\n if (update(sub)) {\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n sub = link.sub;\n continue;\n }\n dirty = false;\n }\n else {\n sub.flags &= ~32;\n }\n sub = link.sub;\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue top;\n }\n }\n return dirty && !!sub.flags;\n } while (true);\n }\n function shallowPropagate(link) {\n do {\n const sub = link.sub;\n const flags = sub.flags;\n if ((flags & (32 | 16)) === 32) {\n sub.flags = flags | 16;\n if ((flags & (2 | 4)) === 2) {\n notify(sub);\n }\n }\n } while ((link = link.nextSub) !== undefined);\n }\n function isValidLink(checkLink, sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDep;\n }\n return false;\n }\n}\n", "import { createReactiveSystem } from './system.mjs';\nconst HasChildEffect = 64;\nlet cycle = 0;\nlet runDepth = 0;\nlet batchDepth = 0;\nlet notifyIndex = 0;\nlet queuedLength = 0;\nlet activeSub;\nconst queued = [];\nconst { link, unlink, propagate, checkDirty, shallowPropagate, } = createReactiveSystem({\n update(node) {\n if ('getter' in node) {\n return updateComputed(node);\n }\n if ('currentValue' in node) {\n return updateSignal(node);\n }\n node.flags = 1;\n return true;\n },\n notify(effect) {\n let insertIndex = queuedLength;\n let firstInsertedIndex = insertIndex;\n do {\n queued[insertIndex++] = effect;\n effect.flags &= ~2;\n effect = effect.subs?.sub;\n if (effect === undefined || !(effect.flags & 2)) {\n break;\n }\n } while (true);\n queuedLength = insertIndex;\n while (firstInsertedIndex < --insertIndex) {\n const left = queued[firstInsertedIndex];\n queued[firstInsertedIndex++] = queued[insertIndex];\n queued[insertIndex] = left;\n }\n },\n unwatched(node) {\n if ('getter' in node) {\n if (node.depsTail !== undefined) {\n node.flags = 1 | 16;\n disposeAllDepsInReverse(node);\n }\n }\n else if ('currentValue' in node) {\n }\n else if ('fn' in node) {\n effectOper.call(node);\n }\n else {\n effectScopeOper.call(node);\n }\n },\n});\nexport function getActiveSub() {\n return activeSub;\n}\nexport function setActiveSub(sub) {\n const prevSub = activeSub;\n activeSub = sub;\n return prevSub;\n}\nexport function getBatchDepth() {\n return batchDepth;\n}\nexport function startBatch() {\n ++batchDepth;\n}\nexport function endBatch() {\n if (!--batchDepth) {\n flush();\n }\n}\nexport function isSignal(fn) {\n return fn.name === 'bound ' + signalOper.name;\n}\nexport function isComputed(fn) {\n return fn.name === 'bound ' + computedOper.name;\n}\nexport function isEffect(fn) {\n return fn.name === 'bound ' + effectOper.name;\n}\nexport function isEffectScope(fn) {\n return fn.name === 'bound ' + effectScopeOper.name;\n}\nexport function signal(initialValue) {\n return signalOper.bind({\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n });\n}\nexport function computed(getter) {\n return computedOper.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter: getter,\n });\n}\nexport function effect(fn) {\n const e = {\n fn,\n cleanup: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 2 | 4,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n prevSub.flags |= HasChildEffect;\n }\n try {\n ++runDepth;\n e.cleanup = e.fn();\n }\n finally {\n --runDepth;\n activeSub = prevSub;\n e.flags &= ~4;\n }\n return effectOper.bind(e);\n}\nexport function effectScope(fn) {\n const e = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n prevSub.flags |= HasChildEffect;\n }\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n }\n return effectScopeOper.bind(e);\n}\nexport function trigger(fn) {\n const sub = {\n deps: undefined,\n depsTail: undefined,\n flags: 2,\n };\n const prevSub = setActiveSub(sub);\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n sub.flags = 0;\n let link = sub.deps;\n while (link !== undefined) {\n const dep = link.dep;\n link = unlink(link, sub);\n const subs = dep.subs;\n if (subs !== undefined) {\n propagate(subs, !!runDepth);\n shallowPropagate(subs);\n }\n }\n if (!batchDepth) {\n flush();\n }\n }\n}\nfunction updateComputed(c) {\n if (c.flags & HasChildEffect) {\n let link = c.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n const dep = link.dep;\n if (!('getter' in dep) && !('currentValue' in dep)) {\n unlink(link, c);\n }\n link = prev;\n }\n }\n c.depsTail = undefined;\n c.flags = 1 | 4;\n const prevSub = setActiveSub(c);\n try {\n ++cycle;\n const oldValue = c.value;\n return oldValue !== (c.value = c.getter(oldValue));\n }\n finally {\n activeSub = prevSub;\n c.flags &= ~4;\n purgeDeps(c);\n }\n}\nfunction updateSignal(s) {\n s.flags = 1;\n return s.currentValue !== (s.currentValue = s.pendingValue);\n}\nfunction run(e) {\n const flags = e.flags;\n if (flags & 16\n || (flags & 32\n && checkDirty(e.deps, e))) {\n if (flags & HasChildEffect) {\n let link = e.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n const dep = link.dep;\n if (!('getter' in dep) && !('currentValue' in dep)) {\n unlink(link, e);\n }\n link = prev;\n }\n }\n if (e.cleanup) {\n runCleanup(e);\n if (!e.flags) {\n return;\n }\n }\n e.depsTail = undefined;\n e.flags = 2 | 4;\n const prevSub = setActiveSub(e);\n try {\n ++cycle;\n ++runDepth;\n e.cleanup = e.fn();\n }\n finally {\n --runDepth;\n activeSub = prevSub;\n e.flags &= ~4;\n purgeDeps(e);\n }\n }\n else if (e.deps !== undefined) {\n e.flags = 2 | (flags & HasChildEffect);\n }\n}\nfunction flush() {\n try {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n run(effect);\n }\n }\n finally {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n effect.flags |= 2 | 8;\n }\n notifyIndex = 0;\n queuedLength = 0;\n }\n}\nfunction computedOper() {\n const flags = this.flags;\n if (flags & 16\n || (flags & 32\n && (checkDirty(this.deps, this)\n || (this.flags = flags & ~32, false)))) {\n if (updateComputed(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n else if (!flags) {\n this.flags = 1 | 4;\n const prevSub = setActiveSub(this);\n try {\n this.value = this.getter();\n }\n finally {\n activeSub = prevSub;\n this.flags &= ~4;\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.value;\n}\nfunction signalOper(...value) {\n if (value.length) {\n if (this.pendingValue !== (this.pendingValue = value[0])) {\n this.flags = 1 | 16;\n const subs = this.subs;\n if (subs !== undefined) {\n propagate(subs, !!runDepth);\n if (!batchDepth) {\n flush();\n }\n }\n }\n }\n else {\n if (this.flags & 16) {\n if (updateSignal(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.currentValue;\n }\n}\nfunction runCleanup(e) {\n const cleanup = e.cleanup;\n e.cleanup = undefined;\n const prevSub = activeSub;\n activeSub = undefined;\n try {\n cleanup();\n }\n finally {\n activeSub = prevSub;\n }\n}\nfunction effectOper() {\n effectScopeOper.call(this);\n if (this.cleanup) {\n runCleanup(this);\n }\n}\nfunction effectScopeOper() {\n this.flags = 0;\n disposeAllDepsInReverse(this);\n const sub = this.subs;\n if (sub !== undefined) {\n unlink(sub);\n }\n}\nfunction disposeAllDepsInReverse(sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n unlink(link, sub);\n link = prev;\n }\n}\nfunction purgeDeps(sub) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n", "import {\n signal,\n effect,\n effectScope,\n setActiveSub,\n} from 'alien-signals'\nimport type { Signal } from './types.js'\n\n// Re-export alien-signals primitives under stable names for internal use.\nexport { signal, effect, effectScope }\n\n/**\n * Run fn without tracking any signals it reads.\n * Suspends the current subscriber via setActiveSub(undefined),\n * restoring it in a finally block so nested effects are unaffected.\n */\nexport function untracked<T> (fn:() => T):T {\n const prev = setActiveSub(undefined)\n try {\n return fn()\n } finally {\n setActiveSub(prev)\n }\n}\n\n/**\n * Read a signal's current value without subscribing.\n * Equivalent to untracked(() => sig()).\n */\nexport function peek<T> (sig:Signal<T>):T {\n return untracked(() => sig())\n}\n", "import type { Cleanup } from './types.js'\n\n/**\n * Coerce a raw attribute string to a number.\n * Returns NaN if the value cannot be parsed.\n */\nexport function coerceNumber (raw:string | null):number {\n return raw === null ? NaN : Number(raw)\n}\n\n/**\n * Coerce a raw attribute string to a string.\n * Converts null to empty string.\n */\nexport function coerceString (raw:string | null):string {\n return raw ?? ''\n}\n\n/**\n * Coerce a raw attribute string to a boolean.\n * Absence (null) is false; presence of any value (including '') is true.\n */\nexport function coerceBoolean (raw:string | null):boolean {\n return raw !== null\n}\n\n/**\n * Coerce a raw attribute string to a parsed JSON value.\n * Returns undefined if the value is null or cannot be parsed.\n */\nexport function coerceJson<T = unknown> (raw:string | null):T | undefined {\n if (raw === null) return undefined\n try {\n return JSON.parse(raw) as T\n } catch {\n return undefined\n }\n}\n\n/**\n * Run every cleanup in the list, ensuring all run even if some throw.\n * After all have run, re-throws the first error encountered.\n */\nexport function runCleanups (fns:Cleanup[]):void {\n let firstError:unknown\n let caught = false\n for (const fn of fns) {\n try {\n fn()\n } catch (err) {\n if (!caught) {\n firstError = err\n caught = true\n }\n }\n }\n if (caught) throw firstError\n}\n", "import { signal } from './reactivity.js'\nimport type { ContextToken, Signal } from './types.js'\n\n// Provider storage: element -> (contextId -> Signal)\nconst providerStorage = new WeakMap<Element, Map<symbol, Signal<unknown>>>()\n\n// Pending consumers waiting for a context by id\nconst pendingCallbacks = new Map<symbol, Set<() => void>>()\n\n/**\n * Create a new context token.\n * Each token uniquely identifies a type of shared context.\n */\nexport function createContext<T> ():ContextToken<T> {\n return { id: Symbol('microtag-context') }\n}\n\n/**\n * Provide a context value from an element to its descendants.\n * Returns a cleanup function that removes the provided value.\n */\nexport function provide<T> (\n element:Element,\n token:ContextToken<T>,\n value:T\n):() => void {\n let map = providerStorage.get(element)\n if (!map) {\n map = new Map()\n providerStorage.set(element, map)\n }\n\n const existing = map.get(token.id) as Signal<T> | undefined\n if (existing) {\n existing(value)\n } else {\n const sig = signal(value) as unknown as Signal<T>\n map.set(token.id, sig as Signal<unknown>)\n }\n\n notifyPending(token.id)\n\n return () => {\n const m = providerStorage.get(element)\n if (m) {\n m.delete(token.id)\n if (m.size === 0) providerStorage.delete(element)\n }\n }\n}\n\n/**\n * Walk up the DOM from element to find the nearest provider signal.\n * Returns the signal (not the value) so callers can subscribe to changes.\n */\nexport function resolveContextSignal<T> (\n element:Element,\n token:ContextToken<T>\n):Signal<T> | undefined {\n let current:Element | null = element.parentElement\n while (current) {\n const map = providerStorage.get(current)\n if (map && map.has(token.id)) {\n return map.get(token.id) as Signal<T>\n }\n current = current.parentElement\n }\n return undefined\n}\n\n/**\n * Register a callback to run when the given context becomes available.\n * Returns a cleanup function to unregister.\n */\nexport function onContextAvailable (\n id:symbol,\n callback:() => void\n):() => void {\n let set = pendingCallbacks.get(id)\n if (!set) {\n set = new Set()\n pendingCallbacks.set(id, set)\n }\n set.add(callback)\n return () => { pendingCallbacks.get(id)?.delete(callback) }\n}\n\nfunction notifyPending (id:symbol):void {\n const set = pendingCallbacks.get(id)\n if (set) {\n for (const cb of set) cb()\n }\n}\n", "import { effect, peek } from './reactivity.js'\nimport { resolveContextSignal } from './context.js'\nimport type {\n SetupContext,\n Cleanup,\n Signal,\n PropsSignals,\n PropDef,\n ContextToken,\n} from './types.js'\n\n/**\n * Build the ctx object passed to a component's setup() callback.\n * The cleanups array is mutated in place so factory.ts can drain it\n * on disconnect without copying.\n */\nexport function makeSetupContext<\n Props extends Record<string, PropDef> = Record<string, PropDef>,\n> (\n host:HTMLElement,\n props:PropsSignals<Props>,\n refs:Record<string, Element | Element[]>,\n contexts:Record<string, unknown>,\n cleanups:Cleanup[]\n):SetupContext<Props, any, any> {\n return {\n host,\n props,\n refs,\n contexts,\n\n peek,\n\n on (target, type, handler, options?) {\n target.addEventListener(\n type as string,\n handler as EventListener,\n options\n )\n cleanups.push(() => {\n target.removeEventListener(\n type as string,\n handler as EventListener,\n options\n )\n })\n },\n\n effect (fn) {\n const dispose = effect(fn)\n cleanups.push(dispose)\n },\n\n bind (source, control, opts) {\n const input = control instanceof HTMLInputElement ?\n control :\n undefined\n let prop = 'value'\n let autoEvent = 'change'\n if (input?.type === 'checkbox') {\n prop = 'checked'\n } else if (input?.type === 'number' ||\n input?.type === 'range') {\n prop = 'valueAsNumber'\n autoEvent = 'input'\n } else if (input || control instanceof HTMLTextAreaElement) {\n autoEvent = 'input'\n }\n\n const boundProp = opts?.prop ?? prop\n const event = opts ? opts.event : autoEvent\n const el = control as unknown as Record<string, unknown>\n\n if (event) {\n const handler = () => {\n const writable = source as Signal<unknown>\n writable(el[boundProp])\n }\n control.addEventListener(event, handler)\n cleanups.push(() => {\n control.removeEventListener(event, handler)\n })\n }\n\n const dispose = effect(() => {\n el[boundProp] = source()\n })\n cleanups.push(dispose)\n },\n\n onCleanup (fn) {\n cleanups.push(fn)\n },\n\n consume<T> (token:ContextToken<T>):T | undefined {\n const sig = resolveContextSignal(host, token)\n return sig ? sig() : undefined\n },\n }\n}\n", "import { signal } from './reactivity.js'\nimport { runCleanups } from './util.js'\nimport { makeSetupContext } from './setup-context.js'\nimport {\n resolveContextSignal,\n onContextAvailable,\n} from './context.js'\nimport type {\n PropsSignals,\n Signal,\n SetupContext,\n Cleanup,\n Coercer,\n ContextToken,\n RefDef,\n} from './types.js'\n\n/**\n * Map of prop name to coercer function.\n * The factory accepts coercers exclusively; Standard Schema support is\n * layered on top in the withProps builder (US-005).\n */\nexport type FactoryProps = Record<string, Coercer<unknown>>\n\n/**\n * The class to extend for custom elements. In the browser this is the\n * real HTMLElement; in Node (e.g. reading `.TAG` for SSR) it falls back\n * to an empty stub so the class can be defined without a DOM. The stub\n * is never instantiated or registered outside the browser.\n */\nconst HTMLElementBase = typeof HTMLElement !== 'undefined' ?\n HTMLElement :\n (class {} as unknown as typeof HTMLElement)\n\n/** Configuration passed to factory(). */\nexport interface FactoryConfig<Props extends FactoryProps = FactoryProps> {\n /** Coercer for each observed attribute / prop. */\n props:Props\n /** Attribute names to pass to observedAttributes. */\n observedAttrNames:string[]\n /** Ref definitions keyed by name. */\n refs?:Record<string, RefDef>\n /** Context tokens keyed by name. */\n contexts?:Record<string, ContextToken<unknown>>\n /** Setup callback receiving the component context. */\n setup:(ctx:SetupContext<Props, any, any>) => void\n}\n\n/**\n * Collect resolved DOM refs from within a host element.\n * Throws if any single-ref element is missing.\n */\nfunction collectRefs (\n host:HTMLElement,\n defs:Record<string, RefDef>\n):Record<string, Element | Element[]> {\n const result:Record<string, Element | Element[]> = {}\n const missing:string[] = []\n for (const [key, def] of Object.entries(defs)) {\n const sel = def.selector ?? `[data-ref=\"${key}\"]`\n if (def._microtag === 'ref:all') {\n result[key] = Array.from(host.querySelectorAll(sel))\n } else {\n const el = host.querySelector(sel)\n if (!el) {\n missing.push(key)\n } else {\n result[key] = el\n }\n }\n }\n if (missing.length > 0) {\n throw new Error(\n `${host.tagName}: missing refs: ${missing.join(', ')}`\n )\n }\n return result\n}\n\n/**\n * Create an HTMLElement subclass with the microtags lifecycle.\n * The returned class has no Shadow DOM, tracks its own prop signals,\n * and runs setup() on connect / cleanups on disconnect.\n */\nexport function factory<Props extends FactoryProps = FactoryProps> (\n config:FactoryConfig<Props>\n):typeof HTMLElement {\n const {\n props: propDefs,\n observedAttrNames,\n setup,\n refs: refDefs = {},\n contexts: ctxDefs = {},\n } = config\n\n class MicrotagElement extends HTMLElementBase {\n static get observedAttributes () { return observedAttrNames }\n\n _props:Record<string, Signal<unknown>> = {}\n _cleanups:Cleanup[] = []\n\n constructor () {\n super()\n for (const [name, coercer] of Object.entries(propDefs)) {\n this._props[name] = signal(coercer(null))\n }\n }\n\n connectedCallback () {\n // Start a fresh cleanup scope for each connection cycle.\n this._cleanups = []\n\n // Hydrate prop signals from attributes; preserve any\n // programmatically-set value when the attribute is absent.\n for (const [name, coercer] of Object.entries(propDefs)) {\n const attrVal = this.getAttribute(name)\n if (attrVal !== null) {\n (this._props[name] as Signal<unknown>)(coercer(attrVal))\n }\n }\n\n const cleanups = this._cleanups\n const props = this._props as PropsSignals<Props>\n\n // Reactive Proxy: reading a key inside a ctx.effect creates\n // a subscription to the provider's alien-signals signal.\n const contexts = new Proxy({} as Record<string, unknown>, {\n get: (_target, key) => {\n if (typeof key !== 'string') return undefined\n const token = ctxDefs[key]\n if (!token) return undefined\n const sig = resolveContextSignal(this, token)\n return sig ? sig() : undefined\n },\n has: (_target, key) => {\n if (typeof key !== 'string') return false\n return key in ctxDefs\n },\n })\n\n let setupRan = false\n // Tracks pending-context cancel functions so they are\n // removed from the global registry when setup runs or\n // when the element disconnects.\n const cancelCallbacks:(() => void)[] = []\n\n const tryRunSetup = ():void => {\n if (setupRan) return\n for (const token of Object.values(ctxDefs)) {\n if (!resolveContextSignal(this, token)) return\n }\n setupRan = true\n for (const cancel of cancelCallbacks) cancel()\n cancelCallbacks.length = 0\n\n const refs = collectRefs(this, refDefs)\n const ctx = makeSetupContext(\n this, props, refs, contexts, cleanups\n )\n setup(ctx)\n }\n\n // Deferred variant: skip if element was disconnected before\n // the context became available.\n const tryRunSetupIfConnected = ():void => {\n if (!this.isConnected) return\n tryRunSetup()\n }\n\n // Register pending listeners for any missing contexts.\n for (const token of Object.values(ctxDefs)) {\n if (!resolveContextSignal(this, token)) {\n const cancel = onContextAvailable(\n token.id, tryRunSetupIfConnected\n )\n cancelCallbacks.push(cancel)\n // Also cancel on disconnect so we don't leak.\n cleanups.push(cancel)\n }\n }\n\n tryRunSetup()\n }\n\n attributeChangedCallback (\n name:string,\n _old:string | null,\n next:string | null\n ) {\n const coercer = propDefs[name]\n if (coercer !== undefined && this._props[name] !== undefined) {\n (this._props[name] as Signal<unknown>)(coercer(next))\n }\n }\n\n disconnectedCallback () {\n // Snapshot and clear BEFORE running so re-entrant calls are safe\n // and the array is always empty after this returns (or throws).\n const fns = this._cleanups\n this._cleanups = []\n runCleanups(fns)\n }\n }\n\n return MicrotagElement\n}\n", "import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n PropDef,\n PropertyOnlyProp,\n SetupContext,\n Coercer,\n RefDef,\n SingleRefDef,\n MultipleRefDef,\n RefsMap,\n ContextToken,\n ContextsMap,\n} from './types.js'\nimport {\n coerceNumber,\n coerceString,\n coerceBoolean,\n coerceJson,\n} from './util.js'\nimport { factory } from './factory.js'\n\nfunction isPropOnly (def:unknown):def is PropertyOnlyProp<unknown> {\n return (\n typeof def === 'object' &&\n def !== null &&\n '_microtag' in def &&\n (def as { _microtag: unknown })._microtag === 'prop'\n )\n}\n\nfunction isStandardSchema (def:unknown):def is StandardSchemaV1 {\n return (\n typeof def === 'object' &&\n def !== null &&\n '~standard' in def\n )\n}\n\nfunction normalizePropDef (\n name:string,\n def:PropDef<unknown>\n):Coercer<unknown> {\n if (isPropOnly(def)) {\n return (_raw:string | null) => def.initial\n }\n if (isStandardSchema(def)) {\n const schema = def as StandardSchemaV1\n return (raw:string | null):unknown => {\n const result = schema['~standard'].validate(raw)\n if (result instanceof Promise) {\n throw new TypeError(\n `withProps: async schemas are not supported (prop \"${name}\")`\n )\n }\n if (result.issues) return undefined\n return result.value\n }\n }\n return def as Coercer<unknown>\n}\n\n/** The DSL object passed to the withProps callback. */\nexport type PropDSL = {\n number():Coercer<number>\n string():Coercer<string>\n boolean():Coercer<boolean>\n json<T>():Coercer<T | undefined>\n schema<T>(validator:StandardSchemaV1<unknown, T>):StandardSchemaV1<unknown, T>\n prop<T>(initial:T):PropertyOnlyProp<T>\n}\n\nexport const propDSL:PropDSL = {\n number: () => coerceNumber,\n string: () => coerceString,\n boolean: () => coerceBoolean,\n json: <T>() => coerceJson as Coercer<T | undefined>,\n schema: <T>(v:StandardSchemaV1<unknown, T>) => v,\n prop: <T>(initial:T):PropertyOnlyProp<T> => (\n { _microtag: 'prop', initial }\n ),\n}\n\n/**\n * DSL object passed to the withRefs callback.\n * Call `r.one()` for a single element or `r.all()` for multiple. Pass a\n * CSS selector to query by it, or omit it to match `[data-ref=\"<key>\"]`.\n *\n * Element typing:\n * - `r.one()` defaults to `HTMLElement`.\n * - `r.one<T>()` sets the type and keeps the `[data-ref]` selector.\n * - `r.one('button')` infers the type from the tag AND queries by that\n * tag, exactly like `document.querySelector('button')`.\n */\nexport type RefsDSL = {\n one<K extends keyof HTMLElementTagNameMap>(\n selector:K\n ):SingleRefDef<HTMLElementTagNameMap[K]>\n one<T extends HTMLElement = HTMLElement>(selector?:string):SingleRefDef<T>\n\n all<K extends keyof HTMLElementTagNameMap>(\n selector:K\n ):MultipleRefDef<HTMLElementTagNameMap[K]>\n all<T extends HTMLElement = HTMLElement>(selector?:string):MultipleRefDef<T>\n}\n\nexport const refsDSL:RefsDSL = {\n one: ((selector?:string):SingleRefDef => (\n { _microtag: 'ref:one', selector }\n )) as RefsDSL['one'],\n all: ((selector?:string):MultipleRefDef => (\n { _microtag: 'ref:all', selector }\n )) as RefsDSL['all'],\n}\n\n/**\n * DSL object passed to the withContexts callback.\n * Currently a no-op placeholder; the user references imported\n * context tokens directly in the returned record.\n */\nexport type ContextDSL = Record<never, never>\nconst contextDSL:ContextDSL = {}\n\n/**\n * Maps each declared ref key to its own name as a string literal. Exposed\n * as the static `refs` on a registered element so server-rendered templates\n * can fill in `data-ref` values without hardcoding the names, e.g.\n * `data-ref=\"${myCounter.refs.dec}\"`.\n */\nexport type RefNames<RefDefs extends Record<string, RefDef>> = {\n readonly [K in keyof RefDefs]:K & string\n}\n\n/**\n * A registered custom element class that also exposes, as static members,\n * the tag name it was registered under (`TAG`) and the names of its\n * declared refs (`refs`).\n */\nexport type MicrotagElementClass<\n RefDefs extends Record<string, RefDef> = Record<never, never>\n> = typeof HTMLElement & {\n /** The custom element tag name, e.g. 'my-counter'. */\n readonly TAG:string\n /**\n * The declared ref names, each mapping to its own `data-ref` string.\n * Lets server-rendered markup reference refs by key instead of a magic\n * string: `myCounter.refs.dec`.\n */\n readonly refs:RefNames<RefDefs>\n}\n\n/**\n * Fluent builder that accumulates props/refs/contexts config\n * before registering a custom element via `.setup()`.\n */\nexport class ComponentBuilder<\n Props extends Record<string, PropDef> = Record<never, never>,\n RefDefs extends Record<string, RefDef> = Record<never, never>,\n CtxDefs extends Record<string, ContextToken<unknown>> =\n Record<never, never>,\n> {\n private readonly _coercers:Record<string, Coercer<unknown>>\n private readonly _observed:string[]\n private readonly _refDefs:Record<string, RefDef>\n private readonly _ctxDefs:Record<string, ContextToken<unknown>>\n\n constructor (\n readonly tagName:string,\n coercers:Record<string, Coercer<unknown>> = {},\n observed:string[] = [],\n refDefs:Record<string, RefDef> = {},\n ctxDefs:Record<string, ContextToken<unknown>> = {}\n ) {\n this._coercers = coercers\n this._observed = observed\n this._refDefs = refDefs\n this._ctxDefs = ctxDefs\n }\n\n /**\n * The custom element tag name, e.g. 'my-counter'. Available at every\n * point in the fluent chain since each builder method returns a new\n * builder carrying the same tag name.\n */\n get TAG ():string {\n return this.tagName\n }\n\n withProps<P extends Record<string, PropDef>> (\n fn:(p:PropDSL) => P\n ):ComponentBuilder<P, RefDefs, CtxDefs> {\n const defs = fn(propDSL)\n const coercers:Record<string, Coercer<unknown>> = {}\n const observed:string[] = []\n\n for (const [name, def] of Object.entries(defs)) {\n coercers[name] = normalizePropDef(name, def as PropDef<unknown>)\n if (!isPropOnly(def)) {\n observed.push(name)\n }\n }\n\n return new ComponentBuilder<P, RefDefs, CtxDefs>(\n this.tagName, coercers, observed, this._refDefs, this._ctxDefs\n )\n }\n\n withRefs<R extends Record<string, RefDef>> (\n fn:(r:RefsDSL) => R\n ):ComponentBuilder<Props, R, CtxDefs> {\n const defs = fn(refsDSL)\n return new ComponentBuilder<Props, R, CtxDefs>(\n this.tagName,\n this._coercers,\n this._observed,\n defs,\n this._ctxDefs\n )\n }\n\n withContexts<C extends Record<string, ContextToken<unknown>>> (\n fn:(c:ContextDSL) => C\n ):ComponentBuilder<Props, RefDefs, C> {\n const defs = fn(contextDSL)\n return new ComponentBuilder<Props, RefDefs, C>(\n this.tagName,\n this._coercers,\n this._observed,\n this._refDefs,\n defs\n )\n }\n\n setup (\n fn:(ctx:SetupContext<\n Props,\n RefsMap<RefDefs>,\n ContextsMap<CtxDefs>\n >) => void\n ):MicrotagElementClass<RefDefs> {\n const El = factory({\n props: this._coercers,\n observedAttrNames: this._observed,\n refs: this._refDefs,\n contexts: this._ctxDefs,\n setup: fn as any,\n })\n Object.defineProperty(El, 'TAG', {\n value: this.tagName,\n enumerable: true,\n })\n\n // Expose each ref key as its own `data-ref` name so server-rendered\n // markup can reference refs by key instead of a hardcoded string.\n const refNames:Record<string, string> = {}\n for (const key of Object.keys(this._refDefs)) {\n refNames[key] = key\n }\n Object.defineProperty(El, 'refs', {\n value: Object.freeze(refNames),\n enumerable: true,\n })\n\n if (typeof customElements !== 'undefined') {\n customElements.define(this.tagName, El)\n }\n return El as MicrotagElementClass<RefDefs>\n }\n}\n\n/** Create a new component builder for the given tag name. */\nexport function define (tagName:string):ComponentBuilder {\n return new ComponentBuilder(tagName)\n}\n"],
5
- "mappings": "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",
6
- "names": ["createReactiveSystem", "update", "notify", "unwatched", "link", "unlink", "propagate", "checkDirty", "shallowPropagate", "dep", "sub", "version", "prevDep", "nextDep", "prevSub", "newLink", "nextSub", "innerWrite", "next", "stack", "top", "flags", "isValidLink", "subSubs", "checkDepth", "dirty", "subs", "checkLink", "__name", "HasChildEffect", "cycle", "runDepth", "batchDepth", "notifyIndex", "queuedLength", "activeSub", "queued", "link", "unlink", "propagate", "checkDirty", "shallowPropagate", "createReactiveSystem", "node", "updateComputed", "updateSignal", "effect", "insertIndex", "firstInsertedIndex", "left", "disposeAllDepsInReverse", "effectOper", "effectScopeOper", "setActiveSub", "sub", "prevSub", "activeSub", "__name", "signal", "initialValue", "signalOper", "__name", "effect", "fn", "e", "prevSub", "setActiveSub", "link", "HasChildEffect", "runDepth", "activeSub", "effectOper", "__name", "updateComputed", "c", "HasChildEffect", "link", "prev", "dep", "unlink", "prevSub", "setActiveSub", "cycle", "oldValue", "activeSub", "purgeDeps", "__name", "updateSignal", "s", "run", "flags", "checkDirty", "runCleanup", "runDepth", "flush", "notifyIndex", "queuedLength", "effect", "queued", "signalOper", "value", "subs", "propagate", "runDepth", "batchDepth", "flush", "updateSignal", "shallowPropagate", "sub", "activeSub", "link", "cycle", "__name", "runCleanup", "cleanup", "prevSub", "effectOper", "effectScopeOper", "disposeAllDepsInReverse", "unlink", "prev", "purgeDeps", "depsTail", "dep", "untracked", "fn", "prev", "setActiveSub", "__name", "peek", "sig", "coerceNumber", "raw", "__name", "coerceString", "coerceBoolean", "coerceJson", "runCleanups", "fns", "firstError", "caught", "fn", "err", "providerStorage", "pendingCallbacks", "resolveContextSignal", "element", "token", "current", "map", "providerStorage", "__name", "onContextAvailable", "id", "callback", "set", "pendingCallbacks", "makeSetupContext", "host", "props", "refs", "contexts", "cleanups", "peek", "target", "type", "handler", "options", "fn", "dispose", "effect", "source", "control", "opts", "input", "prop", "autoEvent", "boundProp", "event", "el", "__name", "token", "sig", "resolveContextSignal", "HTMLElementBase", "collectRefs", "host", "defs", "result", "missing", "key", "def", "sel", "el", "__name", "factory", "config", "propDefs", "observedAttrNames", "setup", "refDefs", "ctxDefs", "MicrotagElement", "name", "coercer", "signal", "attrVal", "cleanups", "props", "contexts", "_target", "token", "sig", "resolveContextSignal", "setupRan", "cancelCallbacks", "tryRunSetup", "cancel", "refs", "ctx", "makeSetupContext", "tryRunSetupIfConnected", "onContextAvailable", "_old", "next", "fns", "runCleanups", "isPropOnly", "def", "__name", "isStandardSchema", "normalizePropDef", "name", "_raw", "schema", "raw", "result", "propDSL", "coerceNumber", "coerceString", "coerceBoolean", "coerceJson", "v", "initial", "refsDSL", "selector", "contextDSL", "ComponentBuilder", "_ComponentBuilder", "tagName", "coercers", "observed", "refDefs", "ctxDefs", "fn", "defs", "El", "factory", "refNames", "key", "define"]
4
+ "sourcesContent": ["export const ReactiveFlags = {\n None: 0,\n Mutable: 1,\n Watching: 2,\n RecursedCheck: 4,\n Recursed: 8,\n Dirty: 16,\n Pending: 32,\n};\nexport function createReactiveSystem({ update, notify, unwatched, }) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n };\n function link(dep, sub, version) {\n const prevDep = sub.depsTail;\n if (prevDep !== undefined && prevDep.dep === dep) {\n return;\n }\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps;\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version;\n sub.depsTail = nextDep;\n return;\n }\n const prevSub = dep.subsTail;\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n return;\n }\n const newLink = sub.depsTail\n = dep.subsTail\n = {\n version,\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, prevDep, nextDep, nextSub, prevSub } = link;\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, innerWrite) {\n let next = link.nextSub;\n let stack;\n top: do {\n const sub = link.sub;\n let flags = sub.flags;\n if (!(flags & (4 | 8 | 16 | 32))) {\n sub.flags = flags | 32;\n if (innerWrite) {\n sub.flags |= 8;\n }\n }\n else if (!(flags & (4 | 8))) {\n flags = 0;\n }\n else if (!(flags & 4)) {\n sub.flags = (flags & ~8) | 32;\n }\n else if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n sub.flags = flags | (8 | 32);\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 const nextSub = (link = subSubs).nextSub;\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\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 checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n const dep = link.dep;\n const flags = dep.flags;\n if (sub.flags & 16) {\n dirty = true;\n }\n else if ((flags & (1 | 16)) === (1 | 16)) {\n const subs = dep.subs;\n if (update(dep)) {\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n }\n else if ((flags & (1 | 32)) === (1 | 32)) {\n stack = { value: link, prev: stack };\n link = dep.deps;\n sub = dep;\n ++checkDepth;\n continue;\n }\n if (!dirty) {\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue;\n }\n }\n while (checkDepth--) {\n link = stack.value;\n stack = stack.prev;\n if (dirty) {\n const subs = sub.subs;\n if (update(sub)) {\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n sub = link.sub;\n continue;\n }\n dirty = false;\n }\n else {\n sub.flags &= ~32;\n }\n sub = link.sub;\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue top;\n }\n }\n return dirty && !!sub.flags;\n } while (true);\n }\n function shallowPropagate(link) {\n do {\n const sub = link.sub;\n const flags = sub.flags;\n if ((flags & (32 | 16)) === 32) {\n sub.flags = flags | 16;\n if ((flags & (2 | 4)) === 2) {\n notify(sub);\n }\n }\n } while ((link = link.nextSub) !== undefined);\n }\n function isValidLink(checkLink, sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDep;\n }\n return false;\n }\n}\n", "import { createReactiveSystem } from './system.mjs';\nconst HasChildEffect = 64;\nlet cycle = 0;\nlet runDepth = 0;\nlet batchDepth = 0;\nlet notifyIndex = 0;\nlet queuedLength = 0;\nlet activeSub;\nconst queued = [];\nconst { link, unlink, propagate, checkDirty, shallowPropagate, } = createReactiveSystem({\n update(node) {\n if ('getter' in node) {\n return updateComputed(node);\n }\n if ('currentValue' in node) {\n return updateSignal(node);\n }\n node.flags = 1;\n return true;\n },\n notify(effect) {\n let insertIndex = queuedLength;\n let firstInsertedIndex = insertIndex;\n do {\n queued[insertIndex++] = effect;\n effect.flags &= ~2;\n effect = effect.subs?.sub;\n if (effect === undefined || !(effect.flags & 2)) {\n break;\n }\n } while (true);\n queuedLength = insertIndex;\n while (firstInsertedIndex < --insertIndex) {\n const left = queued[firstInsertedIndex];\n queued[firstInsertedIndex++] = queued[insertIndex];\n queued[insertIndex] = left;\n }\n },\n unwatched(node) {\n if ('getter' in node) {\n if (node.depsTail !== undefined) {\n node.flags = 1 | 16;\n disposeAllDepsInReverse(node);\n }\n }\n else if ('currentValue' in node) {\n }\n else if ('fn' in node) {\n effectOper.call(node);\n }\n else {\n effectScopeOper.call(node);\n }\n },\n});\nexport function getActiveSub() {\n return activeSub;\n}\nexport function setActiveSub(sub) {\n const prevSub = activeSub;\n activeSub = sub;\n return prevSub;\n}\nexport function getBatchDepth() {\n return batchDepth;\n}\nexport function startBatch() {\n ++batchDepth;\n}\nexport function endBatch() {\n if (!--batchDepth) {\n flush();\n }\n}\nexport function isSignal(fn) {\n return fn.name === 'bound ' + signalOper.name;\n}\nexport function isComputed(fn) {\n return fn.name === 'bound ' + computedOper.name;\n}\nexport function isEffect(fn) {\n return fn.name === 'bound ' + effectOper.name;\n}\nexport function isEffectScope(fn) {\n return fn.name === 'bound ' + effectScopeOper.name;\n}\nexport function signal(initialValue) {\n return signalOper.bind({\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n });\n}\nexport function computed(getter) {\n return computedOper.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter: getter,\n });\n}\nexport function effect(fn) {\n const e = {\n fn,\n cleanup: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 2 | 4,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n prevSub.flags |= HasChildEffect;\n }\n try {\n ++runDepth;\n e.cleanup = e.fn();\n }\n finally {\n --runDepth;\n activeSub = prevSub;\n e.flags &= ~4;\n }\n return effectOper.bind(e);\n}\nexport function effectScope(fn) {\n const e = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n prevSub.flags |= HasChildEffect;\n }\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n }\n return effectScopeOper.bind(e);\n}\nexport function trigger(fn) {\n const sub = {\n deps: undefined,\n depsTail: undefined,\n flags: 2,\n };\n const prevSub = setActiveSub(sub);\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n sub.flags = 0;\n let link = sub.deps;\n while (link !== undefined) {\n const dep = link.dep;\n link = unlink(link, sub);\n const subs = dep.subs;\n if (subs !== undefined) {\n propagate(subs, !!runDepth);\n shallowPropagate(subs);\n }\n }\n if (!batchDepth) {\n flush();\n }\n }\n}\nfunction updateComputed(c) {\n if (c.flags & HasChildEffect) {\n let link = c.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n const dep = link.dep;\n if (!('getter' in dep) && !('currentValue' in dep)) {\n unlink(link, c);\n }\n link = prev;\n }\n }\n c.depsTail = undefined;\n c.flags = 1 | 4;\n const prevSub = setActiveSub(c);\n try {\n ++cycle;\n const oldValue = c.value;\n return oldValue !== (c.value = c.getter(oldValue));\n }\n finally {\n activeSub = prevSub;\n c.flags &= ~4;\n purgeDeps(c);\n }\n}\nfunction updateSignal(s) {\n s.flags = 1;\n return s.currentValue !== (s.currentValue = s.pendingValue);\n}\nfunction run(e) {\n const flags = e.flags;\n if (flags & 16\n || (flags & 32\n && checkDirty(e.deps, e))) {\n if (flags & HasChildEffect) {\n let link = e.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n const dep = link.dep;\n if (!('getter' in dep) && !('currentValue' in dep)) {\n unlink(link, e);\n }\n link = prev;\n }\n }\n if (e.cleanup) {\n runCleanup(e);\n if (!e.flags) {\n return;\n }\n }\n e.depsTail = undefined;\n e.flags = 2 | 4;\n const prevSub = setActiveSub(e);\n try {\n ++cycle;\n ++runDepth;\n e.cleanup = e.fn();\n }\n finally {\n --runDepth;\n activeSub = prevSub;\n e.flags &= ~4;\n purgeDeps(e);\n }\n }\n else if (e.deps !== undefined) {\n e.flags = 2 | (flags & HasChildEffect);\n }\n}\nfunction flush() {\n try {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n run(effect);\n }\n }\n finally {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n effect.flags |= 2 | 8;\n }\n notifyIndex = 0;\n queuedLength = 0;\n }\n}\nfunction computedOper() {\n const flags = this.flags;\n if (flags & 16\n || (flags & 32\n && (checkDirty(this.deps, this)\n || (this.flags = flags & ~32, false)))) {\n if (updateComputed(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n else if (!flags) {\n this.flags = 1 | 4;\n const prevSub = setActiveSub(this);\n try {\n this.value = this.getter();\n }\n finally {\n activeSub = prevSub;\n this.flags &= ~4;\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.value;\n}\nfunction signalOper(...value) {\n if (value.length) {\n if (this.pendingValue !== (this.pendingValue = value[0])) {\n this.flags = 1 | 16;\n const subs = this.subs;\n if (subs !== undefined) {\n propagate(subs, !!runDepth);\n if (!batchDepth) {\n flush();\n }\n }\n }\n }\n else {\n if (this.flags & 16) {\n if (updateSignal(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.currentValue;\n }\n}\nfunction runCleanup(e) {\n const cleanup = e.cleanup;\n e.cleanup = undefined;\n const prevSub = activeSub;\n activeSub = undefined;\n try {\n cleanup();\n }\n finally {\n activeSub = prevSub;\n }\n}\nfunction effectOper() {\n effectScopeOper.call(this);\n if (this.cleanup) {\n runCleanup(this);\n }\n}\nfunction effectScopeOper() {\n this.flags = 0;\n disposeAllDepsInReverse(this);\n const sub = this.subs;\n if (sub !== undefined) {\n unlink(sub);\n }\n}\nfunction disposeAllDepsInReverse(sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n const prev = link.prevDep;\n unlink(link, sub);\n link = prev;\n }\n}\nfunction purgeDeps(sub) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n", "import {\n signal,\n effect,\n effectScope,\n setActiveSub,\n} from 'alien-signals'\nimport type { Signal } from './types.js'\n\n// Re-export alien-signals primitives under stable names for internal use.\nexport { signal, effect, effectScope }\n\n/**\n * Run fn without tracking any signals it reads.\n * Suspends the current subscriber via setActiveSub(undefined),\n * restoring it in a finally block so nested effects are unaffected.\n */\nexport function untracked<T> (fn:() => T):T {\n const prev = setActiveSub(undefined)\n try {\n return fn()\n } finally {\n setActiveSub(prev)\n }\n}\n\n/**\n * Read a signal's current value without subscribing.\n * Equivalent to untracked(() => sig()).\n */\nexport function peek<T> (sig:Signal<T>):T {\n return untracked(() => sig())\n}\n", "/**\n * Coerce a raw attribute string to a number.\n * Returns NaN if the value cannot be parsed.\n */\nexport function coerceNumber (raw:string | null):number {\n return raw === null ? NaN : Number(raw)\n}\n\n/**\n * Coerce a raw attribute string to a string.\n * Converts null to empty string.\n */\nexport function coerceString (raw:string | null):string {\n return raw ?? ''\n}\n\n/**\n * Coerce a raw attribute string to a boolean.\n * Absence (null) is false; presence of any value (including '') is true.\n */\nexport function coerceBoolean (raw:string | null):boolean {\n return raw !== null\n}\n\n/**\n * Coerce a raw attribute string to a parsed JSON value.\n * Returns undefined if the value is null or cannot be parsed.\n */\nexport function coerceJson<T = unknown> (raw:string | null):T | undefined {\n if (raw === null) return undefined\n try {\n return JSON.parse(raw) as T\n } catch {\n return undefined\n }\n}\n\n/**\n * Run every cleanup in the list, ensuring all run even if some throw.\n * After all have run, re-throws the first error encountered.\n */\nexport function runCleanups (fns:(() => void)[]):void {\n let firstError:unknown\n let caught = false\n for (const fn of fns) {\n try {\n fn()\n } catch (err) {\n if (!caught) {\n firstError = err\n caught = true\n }\n }\n }\n if (caught) throw firstError\n}\n\nexport type Attrs = Record<string, undefined|null|string|number|boolean|(string|number)[]>\n\n/**\n * Transform an object into an HTML attributes string. The object should be\n * like `{ attributeName: value }`.\n *\n * @param {Attrs} attrs An object for the attributes.\n * @returns {string} A string suitable for use as HTML attributes.\n */\nexport function toAttributes (attrs:Attrs):string {\n return Object.keys(attrs).reduce((acc, k) => {\n const value = attrs[k]\n if (!value) return acc\n\n if (typeof value === 'boolean') {\n if (value) return (acc + ` ${k}`).trim()\n return acc\n }\n\n if (Array.isArray(value)) {\n return (acc + ` ${k}=\"${value.join(' ')}\"`)\n }\n\n return (acc + ` ${k}=\"${value}\"`).trim()\n }, '')\n}\n", "import { signal } from './reactivity.js'\nimport type { ContextToken, Signal } from './types.js'\n\n// Provider storage: element -> (contextId -> Signal)\nconst providerStorage = new WeakMap<Element, Map<symbol, Signal<unknown>>>()\n\n// Pending consumers waiting for a context by id\nconst pendingCallbacks = new Map<symbol, Set<() => void>>()\n\n/**\n * Create a new context token.\n * Each token uniquely identifies a type of shared context.\n */\nexport function createContext<T> ():ContextToken<T> {\n return { id: Symbol('microtag-context') }\n}\n\n/**\n * Provide a context value from an element to its descendants.\n * Returns a cleanup function that removes the provided value.\n */\nexport function provide<T> (\n element:Element,\n token:ContextToken<T>,\n value:T\n):() => void {\n let map = providerStorage.get(element)\n if (!map) {\n map = new Map()\n providerStorage.set(element, map)\n }\n\n const existing = map.get(token.id) as Signal<T> | undefined\n if (existing) {\n existing(value)\n } else {\n const sig = signal(value) as unknown as Signal<T>\n map.set(token.id, sig as Signal<unknown>)\n }\n\n notifyPending(token.id)\n\n return () => {\n const m = providerStorage.get(element)\n if (m) {\n m.delete(token.id)\n if (m.size === 0) providerStorage.delete(element)\n }\n }\n}\n\n/**\n * Walk up the DOM from element to find the nearest provider signal.\n * Returns the signal (not the value) so callers can subscribe to changes.\n */\nexport function resolveContextSignal<T> (\n element:Element,\n token:ContextToken<T>\n):Signal<T> | undefined {\n let current:Element | null = element.parentElement\n while (current) {\n const map = providerStorage.get(current)\n if (map && map.has(token.id)) {\n return map.get(token.id) as Signal<T>\n }\n current = current.parentElement\n }\n return undefined\n}\n\n/**\n * Register a callback to run when the given context becomes available.\n * Returns a cleanup function to unregister.\n */\nexport function onContextAvailable (\n id:symbol,\n callback:() => void\n):() => void {\n let set = pendingCallbacks.get(id)\n if (!set) {\n set = new Set()\n pendingCallbacks.set(id, set)\n }\n set.add(callback)\n return () => { pendingCallbacks.get(id)?.delete(callback) }\n}\n\nfunction notifyPending (id:symbol):void {\n const set = pendingCallbacks.get(id)\n if (set) {\n for (const cb of set) cb()\n }\n}\n", "import { effect, peek } from './reactivity.js'\nimport { resolveContextSignal } from './context.js'\nimport type {\n SetupContext,\n Signal,\n PropsSignals,\n PropDef,\n ContextToken,\n} from './types.js'\n\n/**\n * Build the ctx object passed to a component's setup() callback.\n * The cleanups array is mutated in place so factory.ts can drain it\n * on disconnect without copying.\n */\nexport function makeSetupContext<\n Props extends Record<string, PropDef> = Record<string, PropDef>,\n> (\n host:HTMLElement,\n props:PropsSignals<Props>,\n refs:Record<string, Element | Element[]>,\n contexts:Record<string, unknown>,\n cleanups:(() => void)[]\n):SetupContext<Props, any, any> {\n return {\n host,\n props,\n refs,\n contexts,\n\n peek,\n\n on (target, type, handler, options?) {\n target.addEventListener(\n type as string,\n handler as EventListener,\n options\n )\n cleanups.push(() => {\n target.removeEventListener(\n type as string,\n handler as EventListener,\n options\n )\n })\n },\n\n emit (\n nameOrEvent:Event | string,\n detail?:unknown,\n options?:Omit<CustomEventInit, 'detail'>\n ):boolean {\n const event = nameOrEvent instanceof Event ?\n nameOrEvent :\n new CustomEvent(nameOrEvent, {\n bubbles: true,\n ...options,\n detail,\n })\n return host.dispatchEvent(event)\n },\n\n effect (fn) {\n const dispose = effect(fn)\n cleanups.push(dispose)\n },\n\n bind (source, control, opts) {\n const input = control instanceof HTMLInputElement ?\n control :\n undefined\n let prop = 'value'\n let autoEvent = 'change'\n if (input?.type === 'checkbox') {\n prop = 'checked'\n } else if (input?.type === 'number' ||\n input?.type === 'range') {\n prop = 'valueAsNumber'\n autoEvent = 'input'\n } else if (input || control instanceof HTMLTextAreaElement) {\n autoEvent = 'input'\n }\n\n const boundProp = opts?.prop ?? prop\n const event = opts ? opts.event : autoEvent\n const el = control as unknown as Record<string, unknown>\n\n if (event) {\n const handler = () => {\n const writable = source as Signal<unknown>\n writable(el[boundProp])\n }\n control.addEventListener(event, handler)\n cleanups.push(() => {\n control.removeEventListener(event, handler)\n })\n }\n\n const dispose = effect(() => {\n el[boundProp] = source()\n })\n cleanups.push(dispose)\n },\n\n onCleanup (fn) {\n cleanups.push(fn)\n },\n\n consume<T> (token:ContextToken<T>):T | undefined {\n const sig = resolveContextSignal(host, token)\n return sig ? sig() : undefined\n },\n }\n}\n", "import { signal } from './reactivity.js'\nimport { runCleanups } from './util.js'\nimport { makeSetupContext } from './setup-context.js'\nimport {\n resolveContextSignal,\n onContextAvailable,\n} from './context.js'\nimport type {\n PropsSignals,\n Signal,\n SetupContext,\n Coercer,\n ContextToken,\n RefDef,\n} from './types.js'\n\n/**\n * Map of prop name to coercer function.\n * The factory accepts coercers exclusively; Standard Schema support is\n * layered on top in the withProps builder (US-005).\n */\nexport type FactoryProps = Record<string, Coercer<unknown>>\n\n/**\n * The class to extend for custom elements. In the browser this is the\n * real HTMLElement; in Node (e.g. reading `.TAG` for SSR) it falls back\n * to an empty stub so the class can be defined without a DOM. The stub\n * is never instantiated or registered outside the browser.\n */\nconst HTMLElementBase = typeof HTMLElement !== 'undefined' ?\n HTMLElement :\n (class {} as unknown as typeof HTMLElement)\n\n/** Configuration passed to factory(). */\nexport interface FactoryConfig<Props extends FactoryProps = FactoryProps> {\n /** Coercer for each observed attribute / prop. */\n props:Props\n /** Attribute names to pass to observedAttributes. */\n observedAttrNames:string[]\n /** Ref definitions keyed by name. */\n refs?:Record<string, RefDef>\n /** Context tokens keyed by name. */\n contexts?:Record<string, ContextToken<unknown>>\n /** Setup callback receiving the component context. */\n setup:(ctx:SetupContext<Props, any, any>) => void\n}\n\n/**\n * Collect resolved DOM refs from within a host element.\n * Throws if any single-ref element is missing.\n */\nfunction collectRefs (\n host:HTMLElement,\n defs:Record<string, RefDef>\n):Record<string, Element | Element[]> {\n const result:Record<string, Element | Element[]> = {}\n const missing:string[] = []\n for (const [key, def] of Object.entries(defs)) {\n const sel = def.selector ?? `[data-ref=\"${key}\"]`\n if (def._microtag === 'ref:all') {\n result[key] = Array.from(host.querySelectorAll(sel))\n } else {\n const el = host.querySelector(sel)\n if (!el) {\n missing.push(key)\n } else {\n result[key] = el\n }\n }\n }\n if (missing.length > 0) {\n throw new Error(\n `${host.tagName}: missing refs: ${missing.join(', ')}`\n )\n }\n return result\n}\n\n/**\n * Create an HTMLElement subclass with the microtags lifecycle.\n * The returned class has no Shadow DOM, tracks its own prop signals,\n * and runs setup() on connect / cleanups on disconnect.\n */\nexport function factory<Props extends FactoryProps = FactoryProps> (\n config:FactoryConfig<Props>\n):typeof HTMLElement {\n const {\n props: propDefs,\n observedAttrNames,\n setup,\n refs: refDefs = {},\n contexts: ctxDefs = {},\n } = config\n\n class MicrotagElement extends HTMLElementBase {\n static get observedAttributes () { return observedAttrNames }\n\n _props:Record<string, Signal<unknown>> = {}\n _cleanups:(() => void)[] = []\n\n constructor () {\n super()\n for (const [name, coercer] of Object.entries(propDefs)) {\n this._props[name] = signal(coercer(null))\n }\n }\n\n connectedCallback () {\n // Start a fresh cleanup scope for each connection cycle.\n this._cleanups = []\n\n // Hydrate prop signals from attributes; preserve any\n // programmatically-set value when the attribute is absent.\n for (const [name, coercer] of Object.entries(propDefs)) {\n const attrVal = this.getAttribute(name)\n if (attrVal !== null) {\n (this._props[name] as Signal<unknown>)(coercer(attrVal))\n }\n }\n\n const cleanups = this._cleanups\n const props = this._props as PropsSignals<Props>\n\n // Reactive Proxy: reading a key inside a ctx.effect creates\n // a subscription to the provider's alien-signals signal.\n const contexts = new Proxy({} as Record<string, unknown>, {\n get: (_target, key) => {\n if (typeof key !== 'string') return undefined\n const token = ctxDefs[key]\n if (!token) return undefined\n const sig = resolveContextSignal(this, token)\n return sig ? sig() : undefined\n },\n has: (_target, key) => {\n if (typeof key !== 'string') return false\n return key in ctxDefs\n },\n })\n\n let setupRan = false\n // Tracks pending-context cancel functions so they are\n // removed from the global registry when setup runs or\n // when the element disconnects.\n const cancelCallbacks:(() => void)[] = []\n\n const tryRunSetup = ():void => {\n if (setupRan) return\n for (const token of Object.values(ctxDefs)) {\n if (!resolveContextSignal(this, token)) return\n }\n setupRan = true\n for (const cancel of cancelCallbacks) cancel()\n cancelCallbacks.length = 0\n\n const refs = collectRefs(this, refDefs)\n const ctx = makeSetupContext(\n this, props, refs, contexts, cleanups\n )\n setup(ctx)\n }\n\n // Deferred variant: skip if element was disconnected before\n // the context became available.\n const tryRunSetupIfConnected = ():void => {\n if (!this.isConnected) return\n tryRunSetup()\n }\n\n // Register pending listeners for any missing contexts.\n for (const token of Object.values(ctxDefs)) {\n if (!resolveContextSignal(this, token)) {\n const cancel = onContextAvailable(\n token.id, tryRunSetupIfConnected\n )\n cancelCallbacks.push(cancel)\n // Also cancel on disconnect so we don't leak.\n cleanups.push(cancel)\n }\n }\n\n tryRunSetup()\n }\n\n attributeChangedCallback (\n name:string,\n _old:string | null,\n next:string | null\n ) {\n const coercer = propDefs[name]\n if (coercer !== undefined && this._props[name] !== undefined) {\n (this._props[name] as Signal<unknown>)(coercer(next))\n }\n }\n\n disconnectedCallback () {\n // Snapshot and clear BEFORE running so re-entrant calls are safe\n // and the array is always empty after this returns (or throws).\n const fns = this._cleanups\n this._cleanups = []\n runCleanups(fns)\n }\n }\n\n return MicrotagElement\n}\n", "import type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n PropDef,\n PropertyOnlyProp,\n SetupContext,\n Coercer,\n RefDef,\n SingleRefDef,\n MultipleRefDef,\n RefsMap,\n ContextToken,\n ContextsMap,\n} from './types.js'\nimport {\n coerceNumber,\n coerceString,\n coerceBoolean,\n coerceJson,\n} from './util.js'\nimport { factory } from './factory.js'\n\nfunction isPropOnly (def:unknown):def is PropertyOnlyProp<unknown> {\n return (\n typeof def === 'object' &&\n def !== null &&\n '_microtag' in def &&\n (def as { _microtag: unknown })._microtag === 'prop'\n )\n}\n\nfunction isStandardSchema (def:unknown):def is StandardSchemaV1 {\n return (\n typeof def === 'object' &&\n def !== null &&\n '~standard' in def\n )\n}\n\nfunction normalizePropDef (\n name:string,\n def:PropDef<unknown>\n):Coercer<unknown> {\n if (isPropOnly(def)) {\n return (_raw:string | null) => def.initial\n }\n if (isStandardSchema(def)) {\n const schema = def as StandardSchemaV1\n return (raw:string | null):unknown => {\n const result = schema['~standard'].validate(raw)\n if (result instanceof Promise) {\n throw new TypeError(\n `withProps: async schemas are not supported (prop \"${name}\")`\n )\n }\n if (result.issues) return undefined\n return result.value\n }\n }\n return def as Coercer<unknown>\n}\n\n/** The DSL object passed to the withProps callback. */\nexport type PropDSL = {\n number():Coercer<number>\n string():Coercer<string>\n boolean():Coercer<boolean>\n json<T>():Coercer<T | undefined>\n schema<T>(validator:StandardSchemaV1<unknown, T>):StandardSchemaV1<unknown, T>\n prop<T>(initial:T):PropertyOnlyProp<T>\n}\n\nexport const propDSL:PropDSL = {\n number: () => coerceNumber,\n string: () => coerceString,\n boolean: () => coerceBoolean,\n json: <T>() => coerceJson as Coercer<T | undefined>,\n schema: <T>(v:StandardSchemaV1<unknown, T>) => v,\n prop: <T>(initial:T):PropertyOnlyProp<T> => (\n { _microtag: 'prop', initial }\n ),\n}\n\n/**\n * DSL object passed to the withRefs callback.\n * Call `r.one()` for a single element or `r.all()` for multiple. Pass a\n * CSS selector to query by it, or omit it to match `[data-ref=\"<key>\"]`.\n *\n * Element typing:\n * - `r.one()` defaults to `HTMLElement`.\n * - `r.one<T>()` sets the type and keeps the `[data-ref]` selector.\n * - `r.one('button')` infers the type from the tag AND queries by that\n * tag, exactly like `document.querySelector('button')`.\n */\nexport type RefsDSL = {\n one<K extends keyof HTMLElementTagNameMap>(\n selector:K\n ):SingleRefDef<HTMLElementTagNameMap[K]>\n one<T extends HTMLElement = HTMLElement>(selector?:string):SingleRefDef<T>\n\n all<K extends keyof HTMLElementTagNameMap>(\n selector:K\n ):MultipleRefDef<HTMLElementTagNameMap[K]>\n all<T extends HTMLElement = HTMLElement>(selector?:string):MultipleRefDef<T>\n}\n\nexport const refsDSL:RefsDSL = {\n one: ((selector?:string):SingleRefDef => (\n { _microtag: 'ref:one', selector }\n )) as RefsDSL['one'],\n all: ((selector?:string):MultipleRefDef => (\n { _microtag: 'ref:all', selector }\n )) as RefsDSL['all'],\n}\n\n/**\n * DSL object passed to the withContexts callback.\n * Currently a no-op placeholder; the user references imported\n * context tokens directly in the returned record.\n */\nexport type ContextDSL = Record<never, never>\nconst contextDSL:ContextDSL = {}\n\n/**\n * Maps each declared ref key to its own name as a string literal. Exposed\n * as the static `refs` on a registered element so server-rendered templates\n * can fill in `data-ref` values without hardcoding the names, e.g.\n * `data-ref=\"${myCounter.refs.dec}\"`.\n */\nexport type RefNames<RefDefs extends Record<string, RefDef>> = {\n readonly [K in keyof RefDefs]:K & string\n}\n\n/**\n * A registered custom element class that also exposes, as static members,\n * the tag name it was registered under (`TAG`) and the names of its\n * declared refs (`refs`).\n */\nexport type MicrotagElementClass<\n RefDefs extends Record<string, RefDef> = Record<never, never>\n> = typeof HTMLElement & {\n /** The custom element tag name, e.g. 'my-counter'. */\n readonly TAG:string\n /**\n * The declared ref names, each mapping to its own `data-ref` string.\n * Lets server-rendered markup reference refs by key instead of a magic\n * string: `myCounter.refs.dec`.\n */\n readonly refs:RefNames<RefDefs>\n}\n\n/**\n * Fluent builder that accumulates props/refs/contexts config\n * before registering a custom element via `.setup()`.\n */\nexport class ComponentBuilder<\n Props extends Record<string, PropDef> = Record<never, never>,\n RefDefs extends Record<string, RefDef> = Record<never, never>,\n CtxDefs extends Record<string, ContextToken<unknown>> =\n Record<never, never>,\n> {\n private readonly _coercers:Record<string, Coercer<unknown>>\n private readonly _observed:string[]\n private readonly _refDefs:Record<string, RefDef>\n private readonly _ctxDefs:Record<string, ContextToken<unknown>>\n\n constructor (\n readonly tagName:string,\n coercers:Record<string, Coercer<unknown>> = {},\n observed:string[] = [],\n refDefs:Record<string, RefDef> = {},\n ctxDefs:Record<string, ContextToken<unknown>> = {}\n ) {\n this._coercers = coercers\n this._observed = observed\n this._refDefs = refDefs\n this._ctxDefs = ctxDefs\n }\n\n /**\n * The custom element tag name, e.g. 'my-counter'. Available at every\n * point in the fluent chain since each builder method returns a new\n * builder carrying the same tag name.\n */\n get TAG ():string {\n return this.tagName\n }\n\n withProps<P extends Record<string, PropDef>> (\n fn:(p:PropDSL) => P\n ):ComponentBuilder<P, RefDefs, CtxDefs> {\n const defs = fn(propDSL)\n const coercers:Record<string, Coercer<unknown>> = {}\n const observed:string[] = []\n\n for (const [name, def] of Object.entries(defs)) {\n coercers[name] = normalizePropDef(name, def as PropDef<unknown>)\n if (!isPropOnly(def)) {\n observed.push(name)\n }\n }\n\n return new ComponentBuilder<P, RefDefs, CtxDefs>(\n this.tagName, coercers, observed, this._refDefs, this._ctxDefs\n )\n }\n\n withRefs<R extends Record<string, RefDef>> (\n fn:(r:RefsDSL) => R\n ):ComponentBuilder<Props, R, CtxDefs> {\n const defs = fn(refsDSL)\n return new ComponentBuilder<Props, R, CtxDefs>(\n this.tagName,\n this._coercers,\n this._observed,\n defs,\n this._ctxDefs\n )\n }\n\n withContexts<C extends Record<string, ContextToken<unknown>>> (\n fn:(c:ContextDSL) => C\n ):ComponentBuilder<Props, RefDefs, C> {\n const defs = fn(contextDSL)\n return new ComponentBuilder<Props, RefDefs, C>(\n this.tagName,\n this._coercers,\n this._observed,\n this._refDefs,\n defs\n )\n }\n\n setup (\n fn:(ctx:SetupContext<\n Props,\n RefsMap<RefDefs>,\n ContextsMap<CtxDefs>\n >) => void\n ):MicrotagElementClass<RefDefs> {\n const El = factory({\n props: this._coercers,\n observedAttrNames: this._observed,\n refs: this._refDefs,\n contexts: this._ctxDefs,\n setup: fn as any,\n })\n Object.defineProperty(El, 'TAG', {\n value: this.tagName,\n enumerable: true,\n })\n\n // Expose each ref key as its own `data-ref` name so server-rendered\n // markup can reference refs by key instead of a hardcoded string.\n const refNames:Record<string, string> = {}\n for (const key of Object.keys(this._refDefs)) {\n refNames[key] = key\n }\n Object.defineProperty(El, 'refs', {\n value: Object.freeze(refNames),\n enumerable: true,\n })\n\n if (typeof customElements !== 'undefined') {\n customElements.define(this.tagName, El)\n }\n return El as MicrotagElementClass<RefDefs>\n }\n}\n\n/** Create a new component builder for the given tag name. */\nexport function define (tagName:string):ComponentBuilder {\n return new ComponentBuilder(tagName)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createReactiveSystem", "update", "notify", "unwatched", "link", "unlink", "propagate", "checkDirty", "shallowPropagate", "dep", "sub", "version", "prevDep", "nextDep", "prevSub", "newLink", "nextSub", "innerWrite", "next", "stack", "top", "flags", "isValidLink", "subSubs", "checkDepth", "dirty", "subs", "checkLink", "__name", "HasChildEffect", "cycle", "runDepth", "batchDepth", "notifyIndex", "queuedLength", "activeSub", "queued", "link", "unlink", "propagate", "checkDirty", "shallowPropagate", "createReactiveSystem", "node", "updateComputed", "updateSignal", "effect", "insertIndex", "firstInsertedIndex", "left", "disposeAllDepsInReverse", "effectOper", "effectScopeOper", "setActiveSub", "sub", "prevSub", "activeSub", "__name", "signal", "initialValue", "signalOper", "__name", "effect", "fn", "e", "prevSub", "setActiveSub", "link", "HasChildEffect", "runDepth", "activeSub", "effectOper", "__name", "updateComputed", "c", "HasChildEffect", "link", "prev", "dep", "unlink", "prevSub", "setActiveSub", "cycle", "oldValue", "activeSub", "purgeDeps", "__name", "updateSignal", "s", "run", "flags", "checkDirty", "runCleanup", "runDepth", "flush", "notifyIndex", "queuedLength", "effect", "queued", "signalOper", "value", "subs", "propagate", "runDepth", "batchDepth", "flush", "updateSignal", "shallowPropagate", "sub", "activeSub", "link", "cycle", "__name", "runCleanup", "cleanup", "prevSub", "effectOper", "effectScopeOper", "disposeAllDepsInReverse", "unlink", "prev", "purgeDeps", "depsTail", "dep", "untracked", "fn", "prev", "setActiveSub", "__name", "peek", "sig", "coerceNumber", "raw", "__name", "coerceString", "coerceBoolean", "coerceJson", "runCleanups", "fns", "firstError", "caught", "fn", "err", "providerStorage", "pendingCallbacks", "resolveContextSignal", "element", "token", "current", "map", "providerStorage", "__name", "onContextAvailable", "id", "callback", "set", "pendingCallbacks", "makeSetupContext", "host", "props", "refs", "contexts", "cleanups", "peek", "target", "type", "handler", "options", "nameOrEvent", "detail", "event", "fn", "dispose", "effect", "source", "control", "opts", "input", "prop", "autoEvent", "boundProp", "el", "__name", "token", "sig", "resolveContextSignal", "HTMLElementBase", "collectRefs", "host", "defs", "result", "missing", "key", "def", "sel", "el", "__name", "factory", "config", "propDefs", "observedAttrNames", "setup", "refDefs", "ctxDefs", "MicrotagElement", "name", "coercer", "signal", "attrVal", "cleanups", "props", "contexts", "_target", "token", "sig", "resolveContextSignal", "setupRan", "cancelCallbacks", "tryRunSetup", "cancel", "refs", "ctx", "makeSetupContext", "tryRunSetupIfConnected", "onContextAvailable", "_old", "next", "fns", "runCleanups", "isPropOnly", "def", "__name", "isStandardSchema", "normalizePropDef", "name", "_raw", "schema", "raw", "result", "propDSL", "coerceNumber", "coerceString", "coerceBoolean", "coerceJson", "v", "initial", "refsDSL", "selector", "contextDSL", "ComponentBuilder", "_ComponentBuilder", "tagName", "coercers", "observed", "refDefs", "ctxDefs", "fn", "defs", "El", "factory", "refNames", "key", "define"]
7
7
  }
package/dist/meta.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "format": "esm"
18
18
  },
19
19
  "src/util.ts": {
20
- "bytes": 1451,
20
+ "bytes": 2210,
21
21
  "imports": [
22
22
  {
23
23
  "path": "<runtime>",
@@ -44,7 +44,7 @@
44
44
  "format": "esm"
45
45
  },
46
46
  "src/setup-context.ts": {
47
- "bytes": 2877,
47
+ "bytes": 3331,
48
48
  "imports": [
49
49
  {
50
50
  "path": "src/reactivity.ts",
@@ -65,7 +65,7 @@
65
65
  "format": "esm"
66
66
  },
67
67
  "src/factory.ts": {
68
- "bytes": 7090,
68
+ "bytes": 7082,
69
69
  "imports": [
70
70
  {
71
71
  "path": "src/reactivity.ts",
@@ -133,7 +133,7 @@
133
133
  "format": "esm"
134
134
  },
135
135
  "src/render.ts": {
136
- "bytes": 2601,
136
+ "bytes": 2457,
137
137
  "imports": [
138
138
  {
139
139
  "path": "<runtime>",
@@ -149,7 +149,7 @@
149
149
  "imports": [],
150
150
  "exports": [],
151
151
  "inputs": {},
152
- "bytes": 25428
152
+ "bytes": 26056
153
153
  },
154
154
  "dist/index.js": {
155
155
  "imports": [
@@ -158,7 +158,7 @@
158
158
  "kind": "import-statement"
159
159
  },
160
160
  {
161
- "path": "dist/chunk-E7ZGOHL3.js",
161
+ "path": "dist/chunk-P4QHFKTJ.js",
162
162
  "kind": "import-statement"
163
163
  },
164
164
  {
@@ -177,7 +177,7 @@
177
177
  "bytesInOutput": 0
178
178
  },
179
179
  "src/setup-context.ts": {
180
- "bytesInOutput": 1747
180
+ "bytesInOutput": 1999
181
181
  },
182
182
  "src/factory.ts": {
183
183
  "bytesInOutput": 3594
@@ -186,13 +186,13 @@
186
186
  "bytesInOutput": 3646
187
187
  }
188
188
  },
189
- "bytes": 9416
189
+ "bytes": 9668
190
190
  },
191
191
  "dist/render.js.map": {
192
192
  "imports": [],
193
193
  "exports": [],
194
194
  "inputs": {},
195
- "bytes": 4204
195
+ "bytes": 4056
196
196
  },
197
197
  "dist/render.js": {
198
198
  "imports": [
@@ -287,7 +287,7 @@
287
287
  "dist/util.js": {
288
288
  "imports": [
289
289
  {
290
- "path": "dist/chunk-E7ZGOHL3.js",
290
+ "path": "dist/chunk-P4QHFKTJ.js",
291
291
  "kind": "import-statement"
292
292
  },
293
293
  {
@@ -300,19 +300,20 @@
300
300
  "coerceJson",
301
301
  "coerceNumber",
302
302
  "coerceString",
303
- "runCleanups"
303
+ "runCleanups",
304
+ "toAttributes"
304
305
  ],
305
306
  "entryPoint": "src/util.ts",
306
307
  "inputs": {},
307
- "bytes": 268
308
+ "bytes": 300
308
309
  },
309
- "dist/chunk-E7ZGOHL3.js.map": {
310
+ "dist/chunk-P4QHFKTJ.js.map": {
310
311
  "imports": [],
311
312
  "exports": [],
312
313
  "inputs": {},
313
- "bytes": 2135
314
+ "bytes": 3311
314
315
  },
315
- "dist/chunk-E7ZGOHL3.js": {
316
+ "dist/chunk-P4QHFKTJ.js": {
316
317
  "imports": [
317
318
  {
318
319
  "path": "dist/chunk-7QVYU63E.js",
@@ -324,14 +325,15 @@
324
325
  "coerceJson",
325
326
  "coerceNumber",
326
327
  "coerceString",
327
- "runCleanups"
328
+ "runCleanups",
329
+ "toAttributes"
328
330
  ],
329
331
  "inputs": {
330
332
  "src/util.ts": {
331
- "bytesInOutput": 759
333
+ "bytesInOutput": 1188
332
334
  }
333
335
  },
334
- "bytes": 956
336
+ "bytes": 1401
335
337
  },
336
338
  "dist/chunk-7QVYU63E.js.map": {
337
339
  "imports": [],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/render.ts"],
4
- "sourcesContent": ["export type RenderListOptions<T, E extends Element = Element> = {\n data:readonly T[];\n key:(item:T, index:number) => string | number;\n update:(el:E, item:T) => void;\n}\n\nexport type RenderOptions<T, E extends Element = Element> = {\n data?:T;\n update?:(el:E, item:T) => void;\n}\n\nconst elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:RenderListOptions<T, E>\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:RenderOptions<T, E>\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,IAAM,cAAc,oBAAI,QAA0B;AAClD,IAAM,cAAc,oBAAI,QAAkC;AAEnD,SAAS,WACZ,WACA,UACA,SACG;AACH,QAAM,EAAE,MAAM,KAAK,QAAQ,OAAO,IAAI;AACtC,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,OAAW,eAAc,IAAI,KAAK,KAAU;AAAA,EAC5D;AAEA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAEzC,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AACzC,YAAM,OAAO;AACb,kBAAY,OAAO,KAAK;AACxB,kBAAY,OAAO,KAAK;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,OAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,cAAc,IAAI,GAAG;AAE9B,QAAI,CAAC,IAAI;AACL,WAAM,SAAS,QAAQ,UAAU,IAAI,EAChC;AACL,kBAAY,IAAI,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,YAAY,IAAI,EAAE,MAAM,MAAM;AAC9B,aAAO,IAAI,IAAI;AACf,kBAAY,IAAI,IAAI,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,OACb,KAAK,qBACL,UAAU;AAEd,QAAI,OAAO,UAAU;AACjB,UAAI,KAAM,MAAK,MAAM,EAAE;AAAA,UAClB,WAAU,QAAQ,EAAE;AAAA,IAC7B;AAEA,WAAO;AAAA,EACX;AACJ;AApDgB;AAsDhB,IAAI,cAAc;AAClB,IAAM,SAAS,oBAAI,QAAqC;AAEjD,SAAS,OACZ,WACA,UACA,SACG;AACH,aAAiB,WAAW,UAAU;AAAA,IAClC,MAAM;AAAA,MACF,YAAY,UAAa,UAAU,UAC/B,QAAQ,OACR,CAAC;AAAA,IACT;AAAA,IACA,KAAK,6BAAM;AACP,UAAI,KAAK,OAAO,IAAI,QAAQ;AAC5B,UAAI,OAAO,QAAW;AAClB,aAAK;AACL,eAAO,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,GAPK;AAAA,IAQL,QAAQ,SAAS,WAAW,MAAM;AAAA,IAAC;AAAA,EACvC,CAAC;AACL;AArBgB;",
4
+ "sourcesContent": ["const elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:{\n data:readonly T[];\n key:(item:T, index:number) => string|number;\n update:(el:E, item:T) => void;\n }\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:{\n data?:T;\n update?:(el:E, item:T) => void;\n }\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,cAAc,oBAAI,QAA0B;AAClD,IAAM,cAAc,oBAAI,QAAkC;AAEnD,SAAS,WACZ,WACA,UACA,SAKG;AACH,QAAM,EAAE,MAAM,KAAK,QAAQ,OAAO,IAAI;AACtC,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,OAAW,eAAc,IAAI,KAAK,KAAU;AAAA,EAC5D;AAEA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAEzC,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AACzC,YAAM,OAAO;AACb,kBAAY,OAAO,KAAK;AACxB,kBAAY,OAAO,KAAK;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,OAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,cAAc,IAAI,GAAG;AAE9B,QAAI,CAAC,IAAI;AACL,WAAM,SAAS,QAAQ,UAAU,IAAI,EAChC;AACL,kBAAY,IAAI,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,YAAY,IAAI,EAAE,MAAM,MAAM;AAC9B,aAAO,IAAI,IAAI;AACf,kBAAY,IAAI,IAAI,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,OACb,KAAK,qBACL,UAAU;AAEd,QAAI,OAAO,UAAU;AACjB,UAAI,KAAM,MAAK,MAAM,EAAE;AAAA,UAClB,WAAU,QAAQ,EAAE;AAAA,IAC7B;AAEA,WAAO;AAAA,EACX;AACJ;AAxDgB;AA0DhB,IAAI,cAAc;AAClB,IAAM,SAAS,oBAAI,QAAqC;AAEjD,SAAS,OACZ,WACA,UACA,SAIG;AACH,aAAiB,WAAW,UAAU;AAAA,IAClC,MAAM;AAAA,MACF,YAAY,UAAa,UAAU,UAC/B,QAAQ,OACR,CAAC;AAAA,IACT;AAAA,IACA,KAAK,6BAAM;AACP,UAAI,KAAK,OAAO,IAAI,QAAQ;AAC5B,UAAI,OAAO,QAAW;AAClB,aAAK;AACL,eAAO,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,GAPK;AAAA,IAQL,QAAQ,SAAS,WAAW,MAAM;AAAA,IAAC;AAAA,EACvC,CAAC;AACL;AAxBgB;",
6
6
  "names": []
7
7
  }
package/dist/render.d.ts CHANGED
@@ -1,12 +1,10 @@
1
- export type RenderListOptions<T, E extends Element = Element> = {
1
+ export declare function renderList<T, E extends Element = Element>(container: Element, template: HTMLTemplateElement, options: {
2
2
  data: readonly T[];
3
3
  key: (item: T, index: number) => string | number;
4
4
  update: (el: E, item: T) => void;
5
- };
6
- export type RenderOptions<T, E extends Element = Element> = {
5
+ }): void;
6
+ export declare function render<T, E extends Element = Element>(container: Element, template: HTMLTemplateElement, options?: {
7
7
  data?: T;
8
8
  update?: (el: E, item: T) => void;
9
- };
10
- export declare function renderList<T, E extends Element = Element>(container: Element, template: HTMLTemplateElement, options: RenderListOptions<T, E>): void;
11
- export declare function render<T, E extends Element = Element>(container: Element, template: HTMLTemplateElement, options?: RenderOptions<T, E>): void;
9
+ }): void;
12
10
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI;IAC5D,IAAI,EAAC,SAAS,CAAC,EAAE,CAAC;IAClB,GAAG,EAAC,CAAC,IAAI,EAAC,CAAC,EAAE,KAAK,EAAC,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAC9C,MAAM,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC,KAAK,IAAI,CAAC;CACjC,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI;IACxD,IAAI,CAAC,EAAC,CAAC,CAAC;IACR,MAAM,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC,KAAK,IAAI,CAAC;CAClC,CAAA;AAKD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EACrD,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAC,mBAAmB,EAC5B,OAAO,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GACjC,IAAI,CAgDL;AAKD,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EACjD,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAC,mBAAmB,EAC5B,OAAO,CAAC,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAC9B,IAAI,CAiBL"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EACrD,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAC,mBAAmB,EAC5B,OAAO,EAAC;IACJ,IAAI,EAAC,SAAS,CAAC,EAAE,CAAC;IAClB,GAAG,EAAC,CAAC,IAAI,EAAC,CAAC,EAAE,KAAK,EAAC,MAAM,KAAK,MAAM,GAAC,MAAM,CAAC;IAC5C,MAAM,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC,KAAK,IAAI,CAAC;CACjC,GACH,IAAI,CAgDL;AAKD,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EACjD,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAC,mBAAmB,EAC5B,OAAO,CAAC,EAAC;IACL,IAAI,CAAC,EAAC,CAAC,CAAC;IACR,MAAM,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC,KAAK,IAAI,CAAC;CAClC,GACH,IAAI,CAiBL"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/render.ts"],
4
- "sourcesContent": ["export type RenderListOptions<T, E extends Element = Element> = {\n data:readonly T[];\n key:(item:T, index:number) => string | number;\n update:(el:E, item:T) => void;\n}\n\nexport type RenderOptions<T, E extends Element = Element> = {\n data?:T;\n update?:(el:E, item:T) => void;\n}\n\nconst elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:RenderListOptions<T, E>\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:RenderOptions<T, E>\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
- "mappings": ";;;;;AAWA,IAAM,cAAc,oBAAI,QAA0B;AAClD,IAAM,cAAc,oBAAI,QAAkC;AAEnD,SAAS,WACZ,WACA,UACA,SACG;AACH,QAAM,EAAE,MAAM,KAAK,QAAQ,OAAO,IAAI;AACtC,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,OAAW,eAAc,IAAI,KAAK,KAAU;AAAA,EAC5D;AAEA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAEzC,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AACzC,YAAM,OAAO;AACb,kBAAY,OAAO,KAAK;AACxB,kBAAY,OAAO,KAAK;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,OAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,cAAc,IAAI,GAAG;AAE9B,QAAI,CAAC,IAAI;AACL,WAAM,SAAS,QAAQ,UAAU,IAAI,EAChC;AACL,kBAAY,IAAI,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,YAAY,IAAI,EAAE,MAAM,MAAM;AAC9B,aAAO,IAAI,IAAI;AACf,kBAAY,IAAI,IAAI,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,OACb,KAAK,qBACL,UAAU;AAEd,QAAI,OAAO,UAAU;AACjB,UAAI,KAAM,MAAK,MAAM,EAAE;AAAA,UAClB,WAAU,QAAQ,EAAE;AAAA,IAC7B;AAEA,WAAO;AAAA,EACX;AACJ;AApDgB;AAsDhB,IAAI,cAAc;AAClB,IAAM,SAAS,oBAAI,QAAqC;AAEjD,SAAS,OACZ,WACA,UACA,SACG;AACH,aAAiB,WAAW,UAAU;AAAA,IAClC,MAAM;AAAA,MACF,YAAY,UAAa,UAAU,UAC/B,QAAQ,OACR,CAAC;AAAA,IACT;AAAA,IACA,KAAK,6BAAM;AACP,UAAI,KAAK,OAAO,IAAI,QAAQ;AAC5B,UAAI,OAAO,QAAW;AAClB,aAAK;AACL,eAAO,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,GAPK;AAAA,IAQL,QAAQ,SAAS,WAAW,MAAM;AAAA,IAAC;AAAA,EACvC,CAAC;AACL;AArBgB;",
4
+ "sourcesContent": ["const elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:{\n data:readonly T[];\n key:(item:T, index:number) => string|number;\n update:(el:E, item:T) => void;\n }\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:{\n data?:T;\n update?:(el:E, item:T) => void;\n }\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
+ "mappings": ";;;;;AAAA,IAAM,cAAc,oBAAI,QAA0B;AAClD,IAAM,cAAc,oBAAI,QAAkC;AAEnD,SAAS,WACZ,WACA,UACA,SAKG;AACH,QAAM,EAAE,MAAM,KAAK,QAAQ,OAAO,IAAI;AACtC,QAAM,gBAAgB,oBAAI,IAAwB;AAElD,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,OAAW,eAAc,IAAI,KAAK,KAAU;AAAA,EAC5D;AAEA,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAEzC,aAAW,SAAS,MAAM,KAAK,UAAU,QAAQ,GAAG;AAChD,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AACzC,YAAM,OAAO;AACb,kBAAY,OAAO,KAAK;AACxB,kBAAY,OAAO,KAAK;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,OAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,KAAK,cAAc,IAAI,GAAG;AAE9B,QAAI,CAAC,IAAI;AACL,WAAM,SAAS,QAAQ,UAAU,IAAI,EAChC;AACL,kBAAY,IAAI,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,YAAY,IAAI,EAAE,MAAM,MAAM;AAC9B,aAAO,IAAI,IAAI;AACf,kBAAY,IAAI,IAAI,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,OACb,KAAK,qBACL,UAAU;AAEd,QAAI,OAAO,UAAU;AACjB,UAAI,KAAM,MAAK,MAAM,EAAE;AAAA,UAClB,WAAU,QAAQ,EAAE;AAAA,IAC7B;AAEA,WAAO;AAAA,EACX;AACJ;AAxDgB;AA0DhB,IAAI,cAAc;AAClB,IAAM,SAAS,oBAAI,QAAqC;AAEjD,SAAS,OACZ,WACA,UACA,SAIG;AACH,aAAiB,WAAW,UAAU;AAAA,IAClC,MAAM;AAAA,MACF,YAAY,UAAa,UAAU,UAC/B,QAAQ,OACR,CAAC;AAAA,IACT;AAAA,IACA,KAAK,6BAAM;AACP,UAAI,KAAK,OAAO,IAAI,QAAQ;AAC5B,UAAI,OAAO,QAAW;AAClB,aAAK;AACL,eAAO,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,GAPK;AAAA,IAQL,QAAQ,SAAS,WAAW,MAAM;AAAA,IAAC;AAAA,EACvC,CAAC;AACL;AAxBgB;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var g=Object.defineProperty;var a=(d,i)=>g(d,"name",{value:i,configurable:!0});var o=new WeakMap,m=new WeakMap;function x(d,i,s){let{data:l,key:E,update:T}=s,p=new Map;for(let e of Array.from(d.children)){let t=m.get(e);t!==void 0&&p.set(t,e)}let c=new Set(l.map(E));for(let e of Array.from(d.children)){let t=m.get(e);(t===void 0||!c.has(t))&&(e.remove(),m.delete(e),o.delete(e))}let r=null;for(let e=0;e<l.length;e++){let t=l[e],f=E(t,e),n=p.get(f);n||(n=i.content.cloneNode(!0).firstElementChild,m.set(n,f)),o.get(n)!==t&&(T(n,t),o.set(n,t));let y=r?r.nextElementSibling:d.firstElementChild;n!==y&&(r?r.after(n):d.prepend(n)),r=n}}a(x,"renderList");var k=0,u=new WeakMap;function M(d,i,s){x(d,i,{data:[s!==void 0&&"data"in s?s.data:{}],key:a(()=>{let l=u.get(i);return l===void 0&&(l=k++,u.set(i,l)),l},"key"),update:s?.update??(()=>{})})}a(M,"render");export{M as render,x as renderList};
1
+ var g=Object.defineProperty;var s=(l,a)=>g(l,"name",{value:a,configurable:!0});var o=new WeakMap,m=new WeakMap;function k(l,a,i){let{data:d,key:E,update:p}=i,f=new Map;for(let e of Array.from(l.children)){let t=m.get(e);t!==void 0&&f.set(t,e)}let T=new Set(d.map(E));for(let e of Array.from(l.children)){let t=m.get(e);(t===void 0||!T.has(t))&&(e.remove(),m.delete(e),o.delete(e))}let r=null;for(let e=0;e<d.length;e++){let t=d[e],u=E(t,e),n=f.get(u);n||(n=a.content.cloneNode(!0).firstElementChild,m.set(n,u)),o.get(n)!==t&&(p(n,t),o.set(n,t));let y=r?r.nextElementSibling:l.firstElementChild;n!==y&&(r?r.after(n):l.prepend(n)),r=n}}s(k,"renderList");var h=0,c=new WeakMap;function M(l,a,i){k(l,a,{data:[i!==void 0&&"data"in i?i.data:{}],key:s(()=>{let d=c.get(a);return d===void 0&&(d=h++,c.set(a,d)),d},"key"),update:i?.update??(()=>{})})}s(M,"render");export{M as render,k as renderList};
2
2
  //# sourceMappingURL=render.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/render.ts"],
4
- "sourcesContent": ["export type RenderListOptions<T, E extends Element = Element> = {\n data:readonly T[];\n key:(item:T, index:number) => string | number;\n update:(el:E, item:T) => void;\n}\n\nexport type RenderOptions<T, E extends Element = Element> = {\n data?:T;\n update?:(el:E, item:T) => void;\n}\n\nconst elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:RenderListOptions<T, E>\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:RenderOptions<T, E>\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
- "mappings": "+EAWA,IAAMA,EAAc,IAAI,QAClBC,EAAc,IAAI,QAEjB,SAASC,EACZC,EACAC,EACAC,EACG,CACH,GAAM,CAAE,KAAAC,EAAM,IAAKC,EAAQ,OAAAC,CAAO,EAAIH,EAChCI,EAAgB,IAAI,IAE1B,QAAWC,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,EAC7BC,IAAQ,QAAWF,EAAc,IAAIE,EAAKD,CAAU,CAC5D,CAEA,IAAME,EAAW,IAAI,IAAIN,EAAK,IAAIC,CAAM,CAAC,EAEzC,QAAWG,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,GAC7BC,IAAQ,QAAa,CAACC,EAAS,IAAID,CAAG,KACtCD,EAAM,OAAO,EACbT,EAAY,OAAOS,CAAK,EACxBV,EAAY,OAAOU,CAAK,EAEhC,CAEA,IAAIG,EAAgB,KACpB,QAASC,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAK,CAClC,IAAMC,EAAOT,EAAKQ,CAAC,EACbH,EAAMJ,EAAOQ,EAAMD,CAAC,EACtBE,EAAKP,EAAc,IAAIE,CAAG,EAEzBK,IACDA,EAAMZ,EAAS,QAAQ,UAAU,EAAI,EAChC,kBACLH,EAAY,IAAIe,EAAIL,CAAG,GAGvBX,EAAY,IAAIgB,CAAE,IAAMD,IACxBP,EAAOQ,EAAID,CAAI,EACff,EAAY,IAAIgB,EAAID,CAAI,GAG5B,IAAME,EAAWJ,EACbA,EAAK,mBACLV,EAAU,kBAEVa,IAAOC,IACHJ,EAAMA,EAAK,MAAMG,CAAE,EAClBb,EAAU,QAAQa,CAAE,GAG7BH,EAAOG,CACX,CACJ,CApDgBE,EAAAhB,EAAA,cAsDhB,IAAIiB,EAAc,EACZC,EAAS,IAAI,QAEZ,SAASC,EACZlB,EACAC,EACAC,EACG,CACHH,EAAiBC,EAAWC,EAAU,CAClC,KAAM,CACFC,IAAY,QAAa,SAAUA,EAC/BA,EAAQ,KACR,CAAC,CACT,EACA,IAAKa,EAAA,IAAM,CACP,IAAII,EAAKF,EAAO,IAAIhB,CAAQ,EAC5B,OAAIkB,IAAO,SACPA,EAAKH,IACLC,EAAO,IAAIhB,EAAUkB,CAAE,GAEpBA,CACX,EAPK,OAQL,OAAQjB,GAAS,SAAW,IAAM,CAAC,EACvC,CAAC,CACL,CArBgBa,EAAAG,EAAA",
4
+ "sourcesContent": ["const elementData = new WeakMap<Element, unknown>()\nconst elementKeys = new WeakMap<Element, string | number>()\n\nexport function renderList<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options:{\n data:readonly T[];\n key:(item:T, index:number) => string|number;\n update:(el:E, item:T) => void;\n }\n):void {\n const { data, key: getKey, update } = options\n const existingByKey = new Map<string | number, E>()\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key !== undefined) existingByKey.set(key, child as E)\n }\n\n const dataKeys = new Set(data.map(getKey))\n\n for (const child of Array.from(container.children)) {\n const key = elementKeys.get(child)\n if (key === undefined || !dataKeys.has(key)) {\n child.remove()\n elementKeys.delete(child)\n elementData.delete(child)\n }\n }\n\n let prev:E | null = null\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n const key = getKey(item, i)\n let el = existingByKey.get(key)\n\n if (!el) {\n el = (template.content.cloneNode(true) as Element)\n .firstElementChild as E\n elementKeys.set(el, key)\n }\n\n if (elementData.get(el) !== item) {\n update(el, item)\n elementData.set(el, item)\n }\n\n const expected = prev ?\n prev.nextElementSibling :\n container.firstElementChild\n\n if (el !== expected) {\n if (prev) prev.after(el)\n else container.prepend(el)\n }\n\n prev = el\n }\n}\n\nlet _tplCounter = 0\nconst tplIds = new WeakMap<HTMLTemplateElement, number>()\n\nexport function render<T, E extends Element = Element> (\n container:Element,\n template:HTMLTemplateElement,\n options?:{\n data?:T;\n update?:(el:E, item:T) => void;\n }\n):void {\n renderList<T, E>(container, template, {\n data: [\n options !== undefined && 'data' in options ?\n options.data as T :\n {} as T\n ],\n key: () => {\n let id = tplIds.get(template)\n if (id === undefined) {\n id = _tplCounter++\n tplIds.set(template, id)\n }\n return id\n },\n update: options?.update ?? (() => {}),\n })\n}\n"],
5
+ "mappings": "+EAAA,IAAMA,EAAc,IAAI,QAClBC,EAAc,IAAI,QAEjB,SAASC,EACZC,EACAC,EACAC,EAKG,CACH,GAAM,CAAE,KAAAC,EAAM,IAAKC,EAAQ,OAAAC,CAAO,EAAIH,EAChCI,EAAgB,IAAI,IAE1B,QAAWC,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,EAC7BC,IAAQ,QAAWF,EAAc,IAAIE,EAAKD,CAAU,CAC5D,CAEA,IAAME,EAAW,IAAI,IAAIN,EAAK,IAAIC,CAAM,CAAC,EAEzC,QAAWG,KAAS,MAAM,KAAKP,EAAU,QAAQ,EAAG,CAChD,IAAMQ,EAAMV,EAAY,IAAIS,CAAK,GAC7BC,IAAQ,QAAa,CAACC,EAAS,IAAID,CAAG,KACtCD,EAAM,OAAO,EACbT,EAAY,OAAOS,CAAK,EACxBV,EAAY,OAAOU,CAAK,EAEhC,CAEA,IAAIG,EAAgB,KACpB,QAASC,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAK,CAClC,IAAMC,EAAOT,EAAKQ,CAAC,EACbH,EAAMJ,EAAOQ,EAAMD,CAAC,EACtBE,EAAKP,EAAc,IAAIE,CAAG,EAEzBK,IACDA,EAAMZ,EAAS,QAAQ,UAAU,EAAI,EAChC,kBACLH,EAAY,IAAIe,EAAIL,CAAG,GAGvBX,EAAY,IAAIgB,CAAE,IAAMD,IACxBP,EAAOQ,EAAID,CAAI,EACff,EAAY,IAAIgB,EAAID,CAAI,GAG5B,IAAME,EAAWJ,EACbA,EAAK,mBACLV,EAAU,kBAEVa,IAAOC,IACHJ,EAAMA,EAAK,MAAMG,CAAE,EAClBb,EAAU,QAAQa,CAAE,GAG7BH,EAAOG,CACX,CACJ,CAxDgBE,EAAAhB,EAAA,cA0DhB,IAAIiB,EAAc,EACZC,EAAS,IAAI,QAEZ,SAASC,EACZlB,EACAC,EACAC,EAIG,CACHH,EAAiBC,EAAWC,EAAU,CAClC,KAAM,CACFC,IAAY,QAAa,SAAUA,EAC/BA,EAAQ,KACR,CAAC,CACT,EACA,IAAKa,EAAA,IAAM,CACP,IAAII,EAAKF,EAAO,IAAIhB,CAAQ,EAC5B,OAAIkB,IAAO,SACPA,EAAKH,IACLC,EAAO,IAAIhB,EAAUkB,CAAE,GAEpBA,CACX,EAPK,OAQL,OAAQjB,GAAS,SAAW,IAAM,CAAC,EACvC,CAAC,CACL,CAxBgBa,EAAAG,EAAA",
6
6
  "names": ["elementData", "elementKeys", "renderList", "container", "template", "options", "data", "getKey", "update", "existingByKey", "child", "key", "dataKeys", "prev", "i", "item", "el", "expected", "__name", "_tplCounter", "tplIds", "render", "id"]
7
7
  }
@@ -1,8 +1,8 @@
1
- import type { SetupContext, Cleanup, PropsSignals, PropDef } from './types.js';
1
+ import type { SetupContext, PropsSignals, PropDef } from './types.js';
2
2
  /**
3
3
  * Build the ctx object passed to a component's setup() callback.
4
4
  * The cleanups array is mutated in place so factory.ts can drain it
5
5
  * on disconnect without copying.
6
6
  */
7
- export declare function makeSetupContext<Props extends Record<string, PropDef> = Record<string, PropDef>>(host: HTMLElement, props: PropsSignals<Props>, refs: Record<string, Element | Element[]>, contexts: Record<string, unknown>, cleanups: Cleanup[]): SetupContext<Props, any, any>;
7
+ export declare function makeSetupContext<Props extends Record<string, PropDef> = Record<string, PropDef>>(host: HTMLElement, props: PropsSignals<Props>, refs: Record<string, Element | Element[]>, contexts: Record<string, unknown>, cleanups: (() => void)[]): SetupContext<Props, any, any>;
8
8
  //# sourceMappingURL=setup-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-context.d.ts","sourceRoot":"","sources":["../src/setup-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,YAAY,EACZ,OAAO,EAEP,YAAY,EACZ,OAAO,EAEV,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/D,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,YAAY,CAAC,KAAK,CAAC,EACzB,IAAI,EAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,EACxC,QAAQ,EAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAC,OAAO,EAAE,GACpB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CA2E9B"}
1
+ {"version":3,"file":"setup-context.d.ts","sourceRoot":"","sources":["../src/setup-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,YAAY,EAEZ,YAAY,EACZ,OAAO,EAEV,MAAM,YAAY,CAAA;AAEnB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/D,IAAI,EAAC,WAAW,EAChB,KAAK,EAAC,YAAY,CAAC,KAAK,CAAC,EACzB,IAAI,EAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,EACxC,QAAQ,EAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAC,CAAC,MAAM,IAAI,CAAC,EAAE,GACzB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CA0F9B"}
package/dist/types.d.ts CHANGED
@@ -77,8 +77,6 @@ export interface MultipleRefDef<T extends HTMLElement = HTMLElement> extends Ref
77
77
  export type RefsMap<Defs extends Record<string, RefDef>> = {
78
78
  [K in keyof Defs]: Defs[K] extends MultipleRefDef<infer T> ? T[] : Defs[K] extends SingleRefDef<infer T> ? T : never;
79
79
  };
80
- /** A teardown function registered via ctx.onCleanup or ctx.on. */
81
- export type Cleanup = () => void;
82
80
  /** Options for ctx.bind. Omit `event` for a one-way binding. */
83
81
  export type BindOptions = {
84
82
  prop?: string;
@@ -106,11 +104,20 @@ export interface SetupContext<Props extends Record<string, PropDef> = Record<str
106
104
  /** Add a DOM event listener that is auto-removed on disconnect. */
107
105
  on<K extends keyof HTMLElementEventMap>(target: EventTarget, type: K, handler: (event: HTMLElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
108
106
  on(target: EventTarget, type: string, handler: EventListener, options?: boolean | AddEventListenerOptions): void;
107
+ /**
108
+ * Dispatch an event from the host. Pass a pre-built `Event` to
109
+ * dispatch it as-is, or a name (plus optional `detail` and
110
+ * `CustomEventInit` options) to construct and dispatch a
111
+ * bubbling `CustomEvent`. Returns `dispatchEvent`'s result:
112
+ * `false` when a cancelable event had `preventDefault()` called.
113
+ */
114
+ emit(event: Event): boolean;
115
+ emit<D>(name: string, detail?: D, options?: Omit<CustomEventInit<D>, 'detail'>): boolean;
109
116
  /**
110
117
  * Run an alien-signals effect that auto-tracks the signals it reads.
111
118
  * The effect is auto-disposed on disconnect.
112
119
  */
113
- effect(fn: () => void | Cleanup): void;
120
+ effect(fn: () => void | (() => void)): void;
114
121
  /**
115
122
  * Bind a signal to a DOM element. The signal is the source of
116
123
  * truth: the element property is set from the signal on bind and
@@ -126,7 +133,7 @@ export interface SetupContext<Props extends Record<string, PropDef> = Record<str
126
133
  */
127
134
  bind<T>(signal: Signal<T>, element: Element, options?: BindOptions): void;
128
135
  /** Register custom teardown to run on disconnect. */
129
- onCleanup(fn: Cleanup): void;
136
+ onCleanup(fn: () => void): void;
130
137
  /** Read an optional context value. */
131
138
  consume<T>(token: ContextToken<T>): T | undefined;
132
139
  }