@manyducks.co/dolla 2.0.0-alpha.50 → 2.0.0-alpha.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +15 -11
  2. package/dist/core/context.d.ts +7 -3
  3. package/dist/core/env.d.ts +9 -0
  4. package/dist/core/index.d.ts +23 -0
  5. package/dist/core/logger.d.ts +34 -0
  6. package/dist/core/markup.d.ts +6 -11
  7. package/dist/core/mount.d.ts +10 -0
  8. package/dist/core/nodes/dynamic.d.ts +1 -1
  9. package/dist/core/nodes/fragment.d.ts +1 -1
  10. package/dist/core/nodes/outlet.d.ts +1 -1
  11. package/dist/core/nodes/repeat.d.ts +1 -1
  12. package/dist/core/nodes/view.d.ts +11 -6
  13. package/dist/core/signals.d.ts +43 -2
  14. package/dist/core/store.d.ts +10 -5
  15. package/dist/{fragment-DjTOSAcw.js → fragment-DSGTP-XE.js} +2 -2
  16. package/dist/{fragment-DjTOSAcw.js.map → fragment-DSGTP-XE.js.map} +1 -1
  17. package/dist/http.js +163 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/{translate → i18n}/index.d.ts +7 -6
  20. package/dist/i18n.js +318 -0
  21. package/dist/i18n.js.map +1 -0
  22. package/dist/index.js +63 -1190
  23. package/dist/index.js.map +1 -1
  24. package/dist/jsx-dev-runtime.js +2 -2
  25. package/dist/jsx-runtime.js +2 -2
  26. package/dist/logger-CSRDjb4e.js +623 -0
  27. package/dist/logger-CSRDjb4e.js.map +1 -0
  28. package/dist/router/index.d.ts +1 -144
  29. package/dist/router/router.d.ts +139 -0
  30. package/dist/router-BYOH-To5.js +482 -0
  31. package/dist/router-BYOH-To5.js.map +1 -0
  32. package/dist/router.js +8 -0
  33. package/dist/router.js.map +1 -0
  34. package/dist/typeChecking-EAVNeFyB.js +75 -0
  35. package/dist/typeChecking-EAVNeFyB.js.map +1 -0
  36. package/dist/types.d.ts +9 -1
  37. package/dist/view-CY19Cf0X.js +932 -0
  38. package/dist/view-CY19Cf0X.js.map +1 -0
  39. package/docs/markup.md +16 -0
  40. package/notes/stores.md +26 -0
  41. package/package.json +14 -2
  42. package/vite.config.js +4 -5
  43. package/dist/core/dolla.d.ts +0 -128
  44. package/dist/core/signals-api.d.ts +0 -42
  45. package/dist/index.d.ts +0 -26
  46. package/dist/markup-DZdmoqTk.js +0 -1501
  47. package/dist/markup-DZdmoqTk.js.map +0 -1
  48. /package/dist/core/{signals-api.test.d.ts → signals.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-CY19Cf0X.js","sources":["../src/core/context.ts","../src/core/symbols.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/fragment.ts","../src/core/nodes/html.ts","../src/core/nodes/outlet.ts","../src/core/nodes/portal.ts","../src/core/nodes/repeat.ts","../src/core/markup.ts","../src/core/store.ts","../src/core/nodes/view.ts"],"sourcesContent":["import type { View } from \"./nodes/view\";\nimport type { Source } from \"./signals\";\nimport type { Store, StoreFunction } from \"./store\";\n\n/*===========================*\\\n|| ElementContext ||\n\\*===========================*/\n\nexport interface ElementContext {\n /**\n * The root Dolla instance this element belongs to.\n */\n // root: Dolla;\n /**\n * Stores attached to this context.\n */\n stores: Map<StoreFunction<any, any>, Store<any, any>>;\n /**\n * The nearest view.\n */\n view?: View<any>;\n /**\n * A reference to the parent context.\n */\n parent?: ElementContext;\n /**\n * Whether to create DOM nodes in the SVG namespace. An `<svg>` element will set this to true and pass it down to children.\n */\n isSVG?: boolean;\n /**\n * The name of the nearest parent view.\n */\n // viewName?: string;\n /**\n * The context of the nearest parent view.\n */\n // viewContext?: ViewContext;\n /**\n * Current route layer of the nearest view.\n */\n route?: Source<View<{}> | undefined>;\n}\n\nexport interface ComponentContext {\n /**\n * A name for debugging purposes. Prepended to log messages.\n */\n name: string;\n}\n\n/**\n * A context capable of providing stores.\n */\nexport interface StoreProviderContext {\n /**\n * Attaches a new store to this context and returns it.\n */\n provide<Value>(store: StoreFunction<{}, Value>): Value;\n /**\n * Attaches a new store to this context and returns it.\n */\n provide<Value>(store: StoreFunction<undefined, Value>): Value;\n /**\n * Attaches a new store to this context and returns it.\n */\n provide<Options, Value>(store: StoreFunction<Options, Value>, options: Options): Value;\n}\n\nexport interface StoreConsumerContext {\n /**\n * Gets the closest instance of a store. Throws an error if the store isn't provided higher in the tree.\n */\n get<Value>(store: StoreFunction<any, Value>): Value;\n}\n\ntype StoreMap = Map<any, any>;\nexport const globalStores: StoreMap = new Map();\nexport const rootElementContext = {\n stores: globalStores,\n};\n","// Type symbols; these are used to quickly check if a value is the expected object.\nexport const IS_MARKUP = Symbol.for(\"DollaMarkup\");\nexport const IS_MARKUP_ELEMENT = Symbol.for(\"DollaMarkupElement\");\n// export const IS_VIEW_TEMPLATE = Symbol.for(\"DollaViewTemplate\");\nexport const IS_STORE = Symbol.for(\"DollaStore\");\n\nexport const IS_ROUTER = Symbol.for(\"DollaRouter\");\n","import type { MarkupElement } from \"../markup\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols\";\n\n/**\n * Wraps any plain DOM node in a MarkupElement interface.\n */\nexport class DOMNode implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode: Node;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor(node: Node) {\n this.domNode = node;\n }\n\n mount(parent: Node, after?: Node) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.domNode.parentNode && !parentIsUnmounting) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n }\n}\n","import { isArray, typeOf } from \"../../typeChecking.js\";\nimport type { Renderable } from \"../../types.js\";\nimport type { ElementContext } from \"../context.js\";\nimport { isMarkupElement, isRenderable, toMarkup, toMarkupElements, type MarkupElement } from \"../markup.js\";\nimport { effect, peek, Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\ninterface DynamicOptions {\n source: Signal<Renderable>;\n elementContext: ElementContext;\n}\n\n/**\n * Displays dynamic children without a parent element.\n * Renders a Reactive value via a render function.\n *\n * This is probably the most used element type aside from HTML.\n */\nexport class Dynamic implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n private children: MarkupElement[] = [];\n private elementContext: ElementContext;\n\n private source: Signal<Renderable>;\n private unsubscribe?: UnsubscribeFn;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor(options: DynamicOptions) {\n this.source = options.source;\n this.elementContext = options.elementContext;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n try {\n const content = this.source();\n\n if (!isRenderable(content)) {\n console.error(content);\n throw new TypeError(\n `Dynamic received invalid value to render. Got type: ${typeOf(content)}, value: ${content}`,\n );\n }\n\n peek(() => {\n this.update(isArray(content) ? content : [content]);\n });\n } catch (error) {\n const logger = this.elementContext.view!.logger;\n logger.error(error);\n logger.crash(error as Error);\n }\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.unsubscribe?.();\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.domNode.parentNode?.removeChild(this.domNode);\n }\n }\n\n cleanup(parentIsUnmounting: boolean) {\n for (const element of this.children) {\n element.unmount(parentIsUnmounting);\n }\n this.children = [];\n }\n\n update(children: Renderable[]) {\n this.cleanup(false);\n\n if (children == null || children.length === 0 || !this.isMounted) {\n return;\n }\n\n const newElements: MarkupElement[] = children.flatMap((c) => {\n if (isMarkupElement(c)) {\n return c as MarkupElement;\n } else {\n return toMarkupElements(this.elementContext, toMarkup(c));\n }\n });\n\n // console.log(\"$dynamic update\", newElements, children);\n\n for (const element of newElements) {\n const previous = this.children.at(-1)?.domNode || this.domNode;\n element.mount(this.domNode.parentNode!, previous);\n this.children.push(element);\n }\n\n // Move marker node to end.\n const parent = this.domNode.parentNode!;\n const lastChildNextSibling = this.children.at(-1)?.domNode?.nextSibling ?? null;\n if (\"moveBefore\" in parent) {\n (parent.moveBefore as any)(this.domNode, lastChildNextSibling);\n } else {\n parent.insertBefore(this.domNode, lastChildNextSibling);\n }\n }\n}\n","import { isFunction } from \"../../typeChecking.js\";\nimport { type MarkupElement } from \"../markup.js\";\nimport { effect, get, peek, type MaybeSignal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/**\n * Manages several MarkupElements as one.\n */\nexport class Fragment implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n isMounted = false;\n\n private source: MaybeSignal<MarkupElement[]>;\n private elements: MarkupElement[] = [];\n\n private unsubscribe?: UnsubscribeFn;\n\n constructor(source: MaybeSignal<MarkupElement[]>) {\n this.source = source;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n this.isMounted = true;\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n if (isFunction(this.source)) {\n this.unsubscribe = effect(() => {\n const value = get(this.source);\n peek(() => {\n this.update(value);\n });\n });\n } else {\n this.update(this.elements);\n }\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.isMounted = false;\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n for (const element of this.elements) {\n element.unmount(parentIsUnmounting);\n }\n this.elements = [];\n }\n\n private update(newElements: MarkupElement[]) {\n this.cleanup(false);\n\n if (newElements.length > 0) {\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n const previous = i > 0 ? this.elements[i - 1] : undefined;\n element.mount(this.domNode.parentElement!, previous?.domNode);\n this.elements.push(element);\n }\n\n this.domNode.parentNode?.insertBefore(this.domNode, this.elements.at(-1)?.domNode ?? null);\n }\n }\n}\n","import { isFunction, isObject, isString } from \"../../typeChecking.js\";\nimport { omit } from \"../../utils.js\";\nimport { type ElementContext } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkup, toMarkupElements, type Markup, type MarkupElement } from \"../markup.js\";\nimport { effect, get, peek, type MaybeSignal, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\ntype HTMLOptions = {\n elementContext: ElementContext;\n tag: string;\n props: Record<string, any>;\n children?: any[];\n};\n\nexport class HTML implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode;\n private props: Record<string, any>;\n private childMarkup: Markup[] = [];\n private children: MarkupElement[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n private elementContext;\n\n private logger;\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Source<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor({ tag, props, children, elementContext }: HTMLOptions) {\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n elementContext = {\n ...elementContext,\n isSVG: true,\n };\n }\n\n this.logger = elementContext.view!.logger;\n\n // Create node with the appropriate constructor.\n if (elementContext.isSVG) {\n this.domNode = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.domNode = document.createElement(tag);\n }\n\n if (getEnv() === \"development\" && peek(elementContext.view!.name)) {\n this.domNode.dataset.view = peek(elementContext.view!.name);\n }\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.domNode);\n } else {\n throw new Error(\"Expected ref to be a function. Got: \" + props.ref);\n }\n }\n\n this.props = {\n ...omit([\"ref\", \"class\", \"className\"], props),\n class: props.className ?? props.class,\n };\n\n if (children) {\n this.childMarkup = toMarkup(children);\n }\n\n // console.log(this.domNode, { children, childMarkup: this.childMarkup });\n\n this.elementContext = elementContext;\n }\n\n mount(parent: Node, after?: Node) {\n if (parent == null) {\n throw new Error(`HTML element requires a parent element as the first argument to connect. Got: ${parent}`);\n }\n\n if (!this.isMounted) {\n if (this.childMarkup.length > 0) {\n this.children = toMarkupElements(this.elementContext, this.childMarkup);\n }\n\n for (let i = 0; i < this.children.length; i++) {\n const child = this.children[i];\n const previous = i > 0 ? this.children[i - 1].domNode : undefined;\n child.mount(this.domNode, previous);\n }\n\n this.applyProps(this.domNode, this.props);\n if (this.props.style) this.applyStyles(this.domNode, this.props.style, this.unsubscribers);\n if (this.props.class) this.applyClasses(this.domNode, this.props.class, this.unsubscribers);\n }\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n setTimeout(() => {\n this.canClickAway = true;\n }, 0);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.isMounted) {\n if (!parentIsUnmounting) {\n this.domNode.parentNode?.removeChild(this.domNode);\n }\n\n for (const child of this.children) {\n child.unmount(true);\n }\n\n if (this.ref) {\n this.ref(undefined);\n }\n\n this.canClickAway = false;\n\n for (const unsubscribe of this.unsubscribers) {\n unsubscribe();\n }\n this.unsubscribers.length = 0;\n }\n }\n\n private attachProp<T>(value: MaybeSignal<T>, callback: (value: T) => void) {\n if (isFunction(value)) {\n this.unsubscribers.push(\n effect(() => {\n try {\n callback((value as Signal<T>)());\n } catch (error) {\n this.logger.error(error);\n this.logger.crash(error as Error);\n }\n }),\n );\n } else {\n callback(value);\n }\n }\n\n private applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n for (const key in props) {\n const value = props[key];\n\n // TODO: If key starts with 'attr:' it is applied with .setAttribute, if 'prop:' it is set directly on the element. If 'on:' it is applied with .addEventListener\n\n if (key === \"on:clickoutside\" || key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n (value as (e: Event) => void)(e);\n }\n };\n\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n\n this.unsubscribers.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (isFunction(value) && isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = value as (e: Event) => void;\n\n element.addEventListener(eventName, listener);\n\n this.unsubscribers.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (isFunction(value) && eventProps.includes(key)) {\n const _key = key.substring(2);\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n this.attachProp(value, (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n });\n } else if (!privateProps.includes(key)) {\n if (this.elementContext.isSVG) {\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n });\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(value, (current) => {\n (element as any)[key] = String(current);\n });\n break;\n\n case \"for\":\n this.attachProp(value, (current) => {\n (element as any).htmlFor = current;\n });\n break;\n\n case \"title\":\n this.attachProp(value, (current) => {\n if (current == null) {\n (element as any).removeAttribute(key);\n } else {\n (element as any).setAttribute(key, String(current));\n }\n });\n\n case \"checked\":\n this.attachProp(value, (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n });\n break;\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(value, (current) => {\n if (typeof current === \"string\") {\n (element as any)[key] = current;\n } else if (current) {\n (element as any)[key] = \"on\";\n } else {\n (element as any)[key] = \"off\";\n }\n });\n break;\n\n default: {\n if (key.startsWith(\"prop:\")) {\n const _key = key.substring(5);\n this.attachProp(value, (current) => {\n (element as any)[_key] = current;\n });\n } else if (key.startsWith(\"on:\")) {\n const _key = key.substring(3);\n let _prev: EventListener | undefined;\n if (isFunction(value)) {\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else {\n this.attachProp(value as MaybeSignal<EventListener>, (current) => {\n if (!current && _prev) {\n element.removeEventListener(_key, _prev);\n } else if (current != null) {\n if (_prev && _prev !== current) {\n element.removeEventListener(_key, _prev);\n }\n element.addEventListener(_key, current);\n }\n _prev = current;\n });\n }\n } else if (key.startsWith(\"attr:\")) {\n const _key = key.substring(5).toLowerCase();\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(_key, String(current));\n } else {\n element.removeAttribute(_key);\n }\n });\n } else {\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\n });\n }\n\n break;\n }\n }\n }\n }\n }\n }\n\n private applyStyles(element: HTMLElement | SVGElement, styles: unknown, unsubscribers: UnsubscribeFn[]) {\n const propUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(styles)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, get(styles), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.style.setProperty(name, String(get(value)), priority);\n } else {\n element.style.removeProperty(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of propUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n\n private applyClasses(element: HTMLElement | SVGElement, classes: unknown, unsubscribers: UnsubscribeFn[]) {\n const classUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(classes)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, get(classes), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of classUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n}\n\n/**\n * Parse classes into a single object. Classes can be passed as a string, an object with class keys can boolean values, or an array with a mix of both.\n */\nfunction getClassMap(classes: unknown) {\n let mapped: Record<string, boolean> = {};\n\n if (isString(classes)) {\n // Support multiple classes in one string like HTML.\n const names = classes.split(\" \");\n for (const name of names) {\n mapped[name] = true;\n }\n } else if (isObject(classes)) {\n Object.assign(mapped, classes);\n } else if (Array.isArray(classes)) {\n Array.from(classes)\n .filter(Boolean)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\n\n // Delete undefined keys. These are usually the result of a class that is not specified in the stylesheet and would have no effect on appearance.\n delete mapped[\"undefined\"];\n\n return mapped;\n}\n\n/**\n * Parse styles into a single object.\n */\nfunction getStyleMap(styles: unknown) {\n let mapped: Record<string, { value: unknown; priority?: string }> = {};\n\n if (isString(styles)) {\n const lines = styles.split(\";\").filter((line) => line.trim() !== \"\");\n for (const line of lines) {\n const [key, _value] = line.split(\":\");\n const entry: { value: unknown; priority?: string } = {\n value: _value,\n };\n if (_value.includes(\"!important\")) {\n entry.priority = \"important\";\n entry.value = _value.replace(\"!important\", \"\").trim();\n } else {\n entry.value = _value.trim();\n }\n mapped[camelToKebab(key.trim())] = entry;\n }\n }\n if (isObject(styles)) {\n for (const key in styles) {\n if (key.startsWith(\"--\")) {\n // Pass through variable names without processing.\n mapped[key] = { value: styles[key] };\n } else {\n mapped[camelToKebab(key)] = { value: styles[key] };\n }\n }\n } else if (Array.isArray(styles)) {\n Array.from(styles)\n .filter((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getStyleMap(item));\n });\n }\n\n return mapped;\n}\n\n/**\n * Converts a camelCase string to kebab-case.\n */\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? \"-\" : \"\") + $.toLowerCase());\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\"];\n\nconst eventProps = [\"onsubmit\", \"onclick\", \"ontransitionend\"];\n","import { type MarkupElement } from \"../markup.js\";\nimport { effect, peek, type Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { View } from \"./view.js\";\n\n/**\n * Renders the subroute of the nearest view.\n */\nexport class Outlet implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n isMounted = false;\n\n private view: Signal<View<{}> | undefined>;\n private mountedView?: View<{}>;\n\n private unsubscribe?: UnsubscribeFn;\n\n constructor(view: Signal<View<{}> | undefined>) {\n this.view = view;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n this.isMounted = true;\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n const view = this.view();\n peek(() => {\n this.update(view);\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.isMounted = false;\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n if (this.mountedView) {\n this.mountedView.unmount(parentIsUnmounting);\n }\n this.mountedView = undefined;\n }\n\n private update(view?: View<{}>) {\n this.cleanup(false);\n\n if (view) {\n view.mount(this.domNode.parentElement!, this.domNode);\n this.mountedView = view;\n }\n }\n}\n","import type { Renderable } from \"../../types.js\";\nimport type { ElementContext } from \"../context.js\";\nimport { toMarkupElements, groupElements, isMarkupElement, toMarkup, type MarkupElement } from \"../markup.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\ninterface PortalConfig {\n content: Renderable;\n parent: Node;\n elementContext: ElementContext;\n}\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n private config: PortalConfig;\n private element?: MarkupElement;\n\n get isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted;\n }\n\n constructor(config: PortalConfig) {\n this.config = config;\n }\n\n mount(_parent: Node, _after?: Node) {\n const { content, parent } = this.config;\n\n if (isMarkupElement(content)) {\n this.element = content;\n } else {\n this.element = groupElements(toMarkupElements(this.config.elementContext, toMarkup(content)));\n }\n\n this.element.mount(parent);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.element?.isMounted) {\n // Portals MUST unmount DOM nodes because they won't be removed by parents unmounting.\n this.element.unmount(false);\n }\n }\n}\n","import { deepEqual } from \"../../utils.js\";\nimport { type ElementContext } from \"../context.js\";\nimport { type MarkupElement } from \"../markup.js\";\nimport { $, effect, peek, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { View, type ViewContext, type ViewResult } from \"./view.js\";\n\n// ----- Types ----- //\n\ninterface RepeatOptions<T> {\n elementContext: ElementContext;\n items: Signal<T[]>;\n keyFn: (item: T, index: number) => string | number | symbol;\n renderFn: (item: Signal<T>, index: Signal<number>, ctx: ViewContext) => ViewResult;\n}\n\ntype ConnectedItem<T> = {\n key: any;\n item: Source<T>;\n index: Source<number>;\n element: MarkupElement;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n private items: Signal<T[]>;\n private unsubscribe: UnsubscribeFn | null = null;\n private connectedItems: ConnectedItem<T>[] = [];\n private elementContext;\n private renderFn: (this: ViewContext, value: Signal<T>, index: Signal<number>, context: ViewContext) => ViewResult;\n private keyFn: (value: T, index: number) => string | number | symbol;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor({ elementContext, items, renderFn, keyFn }: RepeatOptions<T>) {\n this.elementContext = elementContext;\n\n this.items = items;\n this.renderFn = renderFn;\n this.keyFn = keyFn;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = this.items();\n\n if (value == null) {\n value = [];\n console.log(\"repeat received empty value\", value, this);\n }\n\n peek(() => {\n this._update(Array.from(value));\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (!parentIsUnmounting && this.isMounted) {\n this.domNode.parentNode?.removeChild(this.domNode);\n }\n\n this._cleanup(parentIsUnmounting);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems) {\n item.element.unmount(parentIsUnmounting);\n }\n this.connectedItems = [];\n }\n\n private _update(value: T[]) {\n if (value.length === 0 || !this.isMounted) {\n return this._cleanup(false);\n }\n\n type UpdateItem = { key: string | number | symbol; value: T; index: number };\n\n const potentialItems: UpdateItem[] = [];\n let index = 0;\n\n for (const item of value) {\n potentialItems.push({\n key: this.keyFn(item, index),\n value: item,\n index: index++,\n });\n }\n\n const newItems: ConnectedItem<T>[] = [];\n\n // Remove views for items that no longer exist in the new list.\n for (const connected of this.connectedItems) {\n const potentialItem = potentialItems.find((p) => p.key === connected.key);\n\n if (!potentialItem) {\n connected.element.unmount(false);\n }\n }\n\n // Add new views and update state for existing ones.\n for (const potential of potentialItems) {\n const connected = this.connectedItems.find((item) => item.key === potential.key);\n\n if (connected) {\n connected.item(potential.value);\n connected.index(potential.index);\n newItems[potential.index] = connected;\n } else {\n // deepEqual avoids running update code again if the data is equivalent. In list updates this happens a lot.\n const item = $(potential.value, { equals: deepEqual });\n const index = $(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n item,\n index,\n element: new View(this.elementContext, RepeatItemView, {\n item: () => item(),\n index: () => index(),\n renderFn: this.renderFn,\n }),\n };\n }\n }\n\n // Reconnect to ensure order. Lifecycle hooks won't be run again if the view is already connected.\n // TODO: Use a smarter inline reordering method. This causes scrollbars to jump.\n for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.element.domNode ?? this.domNode;\n item.element.mount(this.domNode.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.element.domNode ?? this.domNode;\n this.domNode.parentNode?.insertBefore(this.domNode, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n item: Signal<any>;\n index: Signal<number>;\n renderFn: (item: Signal<any>, index: Signal<number>, context: ViewContext) => ViewResult;\n}\n\nfunction RepeatItemView(props: ListItemProps, context: ViewContext) {\n context.name = \"@RepeatItem\";\n return props.renderFn.call(context, props.item, props.index, context);\n}\n","import { isArray, isArrayOf, isFunction, isNumber, isString } from \"../typeChecking.js\";\nimport type { Mountable, Renderable } from \"../types.js\";\nimport { rootElementContext, type ElementContext } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { Fragment } from \"./nodes/fragment.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Outlet } from \"./nodes/outlet.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { Repeat } from \"./nodes/repeat.js\";\nimport { View, type ViewContext, type ViewFunction, type ViewResult } from \"./nodes/view.js\";\nimport { $, get, type MaybeSignal, type Signal } from \"./signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"./symbols.js\";\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupElement yet.\n */\nexport interface Markup {\n /**\n * In the case of a view, type will be the View function itself. It can also hold an identifier for special nodes like \"$cond\", \"$repeat\", etc.\n * DOM nodes can be created by name, such as HTML elements like \"div\", \"ul\" or \"span\", SVG elements like \"\"\n */\n type: string | ViewFunction<any>;\n /**\n * Data that will be passed to a new MarkupElement instance when it is constructed.\n */\n props?: Record<string, any>;\n /**\n *\n */\n children?: any[];\n}\n\n/**\n * A DOM node that has been constructed from a Markup object.\n */\nexport interface MarkupElement extends Mountable {\n readonly domNode?: Node;\n\n readonly isMounted: boolean;\n}\n\nexport function isMarkup(value: any): value is Markup {\n return value instanceof VNode;\n}\n\nexport function isMarkupElement(value: any): value is MarkupElement {\n return value?.[IS_MARKUP_ELEMENT] === true;\n}\n\nexport function toMarkup(renderables: Renderable | Renderable[]): Markup[] {\n if (!isArray(renderables)) {\n renderables = [renderables];\n }\n\n const results: Markup[] = [];\n\n for (const x of renderables) {\n if (x === null || x === undefined || x === false) {\n continue;\n }\n\n if (x instanceof Node) {\n results.push(markup(\"$node\", { value: x }));\n continue;\n }\n\n if (isMarkup(x)) {\n results.push(x);\n continue;\n }\n\n if (isFunction(x)) {\n results.push(markup(\"$dynamic\", { source: x }));\n continue;\n }\n\n if (isArray(x)) {\n results.push(...toMarkup(x));\n continue;\n }\n\n // fallback to displaying value as text\n results.push(markup(\"$text\", { value: x }));\n }\n\n return results;\n}\n\nexport function constructMarkup(markup: Markup | Markup[]): MarkupElement {\n return groupElements(toMarkupElements(rootElementContext, markup));\n}\n\nexport enum MarkupType {\n Text = \"$text\",\n Repeat = \"$repeat\",\n Dynamic = \"$dynamic\",\n Outlet = \"$outlet\",\n Fragment = \"$fragment\",\n Node = \"$node\",\n Portal = \"$portal\",\n}\n\nexport interface MarkupAttributes {\n [MarkupType.Text]: { value: any };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n keyFn: (value: any, index: number) => string | number | symbol;\n renderFn: (item: Signal<any>, index: Signal<number>, ctx: ViewContext) => ViewResult;\n };\n [MarkupType.Dynamic]: {\n source: Signal<Renderable>;\n };\n [MarkupType.Outlet]: {\n view: Signal<View<{}> | undefined>;\n };\n [MarkupType.Fragment]: {\n children: MaybeSignal<MarkupElement[]>;\n };\n [MarkupType.Node]: {\n value: Node;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Node;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function markup<T extends keyof MarkupAttributes>(\n type: T,\n attributes: MarkupAttributes[T],\n ...children: Renderable[]\n): Markup;\n\nexport function markup<I>(type: ViewFunction<I>, attributes?: I, ...children: any[]): Markup;\n\nexport function markup<P>(type: string | ViewFunction<P>, props?: P, ...children: any[]) {\n return new VNode(type, props as any, ...children);\n}\n\nclass VNode<P extends Record<any, any>> implements Markup {\n type;\n props;\n children;\n\n constructor(type: string | ViewFunction<P>, props?: P, ...children: Renderable[]) {\n this.type = type;\n this.props = props;\n this.children = children;\n }\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * Displays `thenContent` when `condition` is truthy and `elseContent` when falsy.\n */\nexport function when(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return markup(MarkupType.Dynamic, {\n source: $<Renderable>(() => {\n const value = get(condition);\n\n if (value && thenContent) {\n return thenContent;\n } else if (!value && elseContent) {\n return elseContent;\n }\n return null;\n }),\n });\n}\n\n/**\n * Inverted `when`. Displays `thenContent` when `condition` is falsy and `elseContent` when truthy.\n */\nexport function unless(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return when(condition, elseContent, thenContent);\n}\n\n/**\n * Calls `renderFn` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `keyFn` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(\n items: MaybeSignal<T[]>,\n keyFn: (value: T, index: number) => string | number | symbol,\n renderFn: (item: Signal<T>, index: Signal<number>, ctx: ViewContext) => ViewResult,\n): Markup {\n return markup(MarkupType.Repeat, { items: () => get(items), keyFn, renderFn });\n}\n\n/**\n * Renders `content` into a `parent` node anywhere in the page, rather than its usual position in the view.\n */\nexport function portal(parent: Node, content: Renderable): Markup {\n return markup(MarkupType.Portal, { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\n/**\n * Construct Markup metadata into a set of MarkupElements.\n */\nexport function toMarkupElements(elementContext: ElementContext, markup: Markup | Markup[]): MarkupElement[] {\n const items = isArray(markup) ? markup : [markup];\n\n return items.map((item) => {\n if (isFunction(item.type)) {\n return new View(elementContext, item.type as ViewFunction<any>, item.props, item.children);\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.Node: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Node];\n return new DOMNode(attrs.value);\n }\n case MarkupType.Text: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Text];\n return new DOMNode(document.createTextNode(String(attrs.value)));\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Repeat];\n return new Repeat({\n items: attrs.items,\n keyFn: attrs.keyFn,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Dynamic];\n return new Dynamic({\n source: attrs.source,\n elementContext,\n });\n }\n case MarkupType.Fragment: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Fragment];\n return new Fragment(attrs.children);\n }\n case MarkupType.Outlet: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Outlet];\n return new Outlet(attrs.view);\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Portal];\n return new Portal({\n content: attrs.content,\n parent: attrs.parent,\n elementContext,\n });\n }\n default:\n // Handle type as an HTML tag.\n return new HTML({\n tag: item.type,\n props: item.props ?? {},\n children: item.children,\n elementContext,\n });\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n });\n}\n\n/**\n * Combines one or more MarkupElements into a single MarkupElement.\n */\nexport function groupElements(elements: MarkupElement[]): MarkupElement {\n if (elements.length === 1) {\n return elements[0];\n }\n\n return new Fragment(elements);\n}\n\nexport function isRenderable(value: unknown): value is Renderable {\n return (\n value == null ||\n value === false ||\n isFunction(value) ||\n isString(value) ||\n isNumber(value) ||\n isMarkup(value) ||\n isArrayOf(isRenderable, value)\n );\n}\n","import { isFunction } from \"../typeChecking.js\";\nimport { getUniqueId } from \"../utils.js\";\nimport {\n rootElementContext,\n type ComponentContext,\n type ElementContext,\n type StoreConsumerContext,\n type StoreProviderContext,\n} from \"./context.js\";\nimport { createLogger, type Logger } from \"./logger.js\";\nimport { $, effect, peek, type EffectFn, type UnsubscribeFn } from \"./signals.js\";\nimport { IS_STORE } from \"./symbols.js\";\n\nexport type StoreFunction<Options, Value> = (this: StoreContext, options: Options, context: StoreContext) => Value;\n\nexport type StoreFactory<Options, Value> = Options extends undefined\n ? () => Store<Options, Value>\n : (options: Options) => Store<Options, Value>;\n\nexport interface StoreContext extends Omit<Logger, \"setName\">, ComponentContext, StoreConsumerContext {\n /**\n * True while this store is attached to a context that is currently mounted in the view tree.\n */\n readonly isMounted: boolean;\n\n /**\n * Registers a callback to run just after this store is mounted.\n */\n onMount(callback: () => void): void;\n\n /**\n * Registers a callback to run just after this store is unmounted.\n */\n onUnmount(callback: () => void): void;\n\n /**\n * Passes a getter function to `callback` that will track reactive states and return their current values.\n * Callback will be run each time a tracked state gets a new value.\n */\n effect(callback: EffectFn): UnsubscribeFn;\n}\n\ninterface Context<Options, Value> extends Omit<Logger, \"setName\"> {}\n\nclass Context<Options, Value> implements StoreContext, StoreConsumerContext {\n private store;\n\n constructor(store: Store<Options, Value>) {\n this.store = store;\n\n // Copy logger methods from logger.\n const descriptors = Object.getOwnPropertyDescriptors(this.store.logger);\n for (const key in descriptors) {\n if (key !== \"setName\") {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n }\n\n get isMounted() {\n return this.store.isMounted;\n }\n\n get name() {\n return peek(this.store.name) || this.store.id;\n }\n\n set name(value) {\n this.store.name(value);\n }\n\n get<Value>(store: StoreFunction<any, Value>): Value {\n if (isFunction(store)) {\n let context = this.store.elementContext;\n let instance: Store<any, Value> | undefined;\n while (true) {\n instance = context.stores.get(store);\n if (instance == null && context.parent != null) {\n context = context.parent;\n } else {\n break;\n }\n }\n if (instance == null) {\n throw new StoreError(`Store '${store.name}' is not provided on this context.`);\n } else {\n return instance.value;\n }\n } else {\n throw new StoreError(`Invalid store.`);\n }\n }\n\n onMount(callback: () => void): void {\n this.store.lifecycleListeners.mount.push(callback);\n }\n\n onUnmount(callback: () => void): void {\n this.store.lifecycleListeners.unmount.push(callback);\n }\n\n effect(callback: EffectFn) {\n const store = this.store;\n\n const fn = () => {\n try {\n // Return callback so cleanup function passes through\n return callback();\n } catch (error) {\n if (error instanceof Error) {\n this.crash(error);\n } else if (typeof error === \"string\") {\n this.crash(new Error(error));\n } else {\n this.error(error);\n this.crash(new Error(`Unknown error thrown in effect callback`));\n }\n }\n };\n\n if (store.isMounted) {\n // If called when the component is connected, we assume this code is in a lifecycle hook\n // where it will be triggered at some point again after the component is reconnected.\n const unsubscribe = effect(fn);\n store.lifecycleListeners.unmount.push(unsubscribe);\n return unsubscribe;\n } else {\n // This should only happen if called in the body of the component function.\n // This code is not always re-run between when a component is unmounted and remounted.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n store.lifecycleListeners.mount.push(() => {\n if (!disposed) {\n unsubscribe = effect(fn);\n store.lifecycleListeners.unmount.push(unsubscribe);\n }\n });\n return () => {\n if (unsubscribe != null) {\n disposed = true;\n unsubscribe();\n }\n };\n }\n }\n}\n\nexport class Store<Options, Value> {\n readonly fn;\n private _options;\n\n /**\n * Value is guaranteed to be set after `attach` is called.\n */\n value!: Value;\n\n isMounted = false;\n\n elementContext!: ElementContext;\n\n lifecycleListeners: {\n mount: (() => any)[];\n unmount: (() => any)[];\n } = { mount: [], unmount: [] };\n\n logger!: Logger;\n id = getUniqueId();\n name = $(\"\");\n\n constructor(fn: StoreFunction<Options, Value>, options: Options) {\n this.fn = fn;\n this.name(fn.name);\n this._options = options;\n }\n\n /**\n * Attaches this Store to the elementContext.\n * Returns false if there was already an instance attached, and true otherwise.\n */\n attach(elementContext: ElementContext): boolean {\n if (elementContext.stores.has(this.fn)) {\n return false;\n }\n this.elementContext = elementContext;\n this.logger = createLogger(this.name, { uid: this.id });\n const context = new Context(this);\n try {\n this.value = this.fn.call(context, this._options, context);\n } catch (error) {\n this.logger.crash(error as Error);\n throw error;\n }\n elementContext.stores.set(this.fn, this);\n return true;\n }\n\n handleMount() {\n this.isMounted = true;\n\n for (const listener of this.lifecycleListeners.mount) {\n listener();\n }\n this.lifecycleListeners.mount.length = 0;\n }\n\n handleUnmount() {\n this.isMounted = false;\n\n for (const listener of this.lifecycleListeners.unmount) {\n listener();\n }\n this.lifecycleListeners.unmount.length = 0;\n }\n}\n\nexport function isStore<Options, Value>(value: any): value is Store<Options, Value> {\n return value?.[IS_STORE] === true;\n}\n\nexport class StoreError extends Error {}\n\nexport type Stores = StoreProviderContext & StoreConsumerContext;\n\n/**\n * Global store registry.\n */\nexport const Stores: Stores = Object.freeze({\n provide(store: any, options?: any) {\n const instance = new Store(store, options!);\n const attached = instance.attach(rootElementContext);\n if (!attached) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n console.warn(`An instance of ${name} is already attached.`);\n return this.get(store);\n } else {\n return instance.value;\n }\n },\n get<T>(store: any): T {\n if (isFunction(store)) {\n const instance = rootElementContext.stores.get(store);\n if (instance == null) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n throw new StoreError(`No instance of ${name} is provided.`);\n } else {\n return instance.value;\n }\n } else {\n throw new StoreError(`Invalid store.`);\n }\n },\n});\n","import { isArray, isArrayOf, isFunction, isObject, typeOf } from \"../../typeChecking.js\";\nimport { Renderable } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport {\n globalStores,\n type ComponentContext,\n type ElementContext,\n type StoreConsumerContext,\n type StoreProviderContext,\n} from \"../context.js\";\nimport { createLogger, type Logger } from \"../logger.js\";\nimport {\n groupElements,\n isMarkup,\n markup,\n toMarkup,\n toMarkupElements,\n type Markup,\n type MarkupElement,\n} from \"../markup.js\";\nimport { $, effect, peek, type EffectFn, type Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { Store, StoreError, StoreFunction } from \"../store.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/*=====================================*\\\n|| Types ||\n\\*=====================================*/\n\n/**\n * Any valid value that a View can return.\n */\nexport type ViewResult = Node | Signal<any> | Markup | Markup[] | null;\n\nexport type ViewFunction<P> = (this: ViewContext, props: P, context: ViewContext) => ViewResult;\n\n/**\n * A view that has been constructed into DOM nodes.\n */\nexport interface ViewElement extends MarkupElement {\n setRouteView(view: ViewFunction<{}>): ViewElement;\n}\n\nexport interface ViewContext\n extends Omit<Logger, \"setName\">,\n ComponentContext,\n StoreProviderContext,\n StoreConsumerContext {\n /**\n * An ID unique to this view.\n */\n readonly uid: string;\n\n /**\n * True while this view is connected to the DOM.\n */\n readonly isMounted: boolean;\n\n /**\n * Registers a callback to run just before this view is mounted. DOM nodes are not yet attached to the page.\n */\n beforeMount(callback: () => void): void;\n\n /**\n * Registers a callback to run just after this view is mounted.\n */\n onMount(callback: () => void): void;\n\n /**\n * Registers a callback to run just before this view is unmounted. DOM nodes are still attached to the page.\n */\n beforeUnmount(callback: () => void): void;\n\n /**\n * Registers a callback to run just after this view is unmounted.\n */\n onUnmount(callback: () => void): void;\n\n /**\n * Passes a getter function to `callback` that will track reactive states and return their current values.\n * Callback will be run each time a tracked state gets a new value.\n */\n effect(callback: EffectFn): UnsubscribeFn;\n\n /**\n * Displays this view's subroutes if mounted as a router view.\n */\n outlet(): Markup;\n}\n\n/*=====================================*\\\n|| View Init ||\n\\*=====================================*/\n\n// Defines logger methods on context.\ninterface Context extends Omit<Logger, \"setName\"> {}\n\nclass Context implements ViewContext {\n private view;\n\n constructor(view: View<any>) {\n this.view = view;\n\n // Copy logger methods from logger.\n const descriptors = Object.getOwnPropertyDescriptors(this.view.logger);\n for (const key in descriptors) {\n if (key !== \"setName\") {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n }\n\n get uid() {\n return this.view.uniqueId;\n }\n\n get isMounted() {\n return this.view.isMounted;\n }\n\n get name() {\n return peek(this.view.name) || this.uid;\n }\n\n set name(value) {\n this.view.name(value);\n }\n\n provide<Value>(store: StoreFunction<any, Value>, options?: any): Value {\n const instance = new Store(store, options);\n const attached = instance.attach(this.view.elementContext);\n if (attached) {\n this.view.lifecycleListeners.mount.push(() => {\n instance.handleMount();\n });\n this.view.lifecycleListeners.unmount.push(() => {\n instance.handleUnmount();\n });\n return instance.value;\n } else {\n let name = store.name ? `'${store.name}'` : \"this store\";\n this.view.logger.warn(`An instance of ${name} was already attached to this context.`);\n return this.get(store);\n }\n }\n\n get<Value>(store: StoreFunction<any, Value>): Value {\n if (isFunction(store)) {\n let context = this.view.elementContext;\n let instance: Store<any, Value> | undefined;\n while (true) {\n instance = context.stores.get(store);\n if (instance == null && context.parent != null) {\n context = context.parent;\n } else {\n break;\n }\n }\n if (instance == null) {\n throw new StoreError(`Store '${store.name}' is not provided on this context.`);\n } else {\n return instance.value;\n }\n } else {\n throw new StoreError(`Invalid store.`);\n }\n }\n\n beforeMount(callback: () => void): void {\n this.view.lifecycleListeners.beforeMount.push(callback);\n }\n\n onMount(callback: () => void): void {\n this.view.lifecycleListeners.mount.push(callback);\n }\n\n beforeUnmount(callback: () => void): void {\n this.view.lifecycleListeners.beforeUnmount.push(callback);\n }\n\n onUnmount(callback: () => void): void {\n this.view.lifecycleListeners.unmount.push(callback);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n // Return callback so cleanup function passes through\n return callback();\n } catch (error) {\n this.error(error);\n if (error instanceof Error) {\n this.crash(error);\n } else if (typeof error === \"string\") {\n this.crash(new Error(error));\n } else {\n this.crash(new Error(`Unknown error thrown in effect callback`));\n }\n }\n };\n\n if (this.view.isMounted) {\n // If called when the component is connected, we assume this code is in a lifecycle hook\n // where it will be triggered at some point again after the component is reconnected.\n const unsubscribe = effect(fn);\n this.view.lifecycleListeners.unmount.push(unsubscribe);\n return unsubscribe;\n } else {\n // This should only happen if called in the body of the component function.\n // This code is not always re-run between when a component is unmounted and remounted.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n this.view.lifecycleListeners.mount.push(() => {\n if (!disposed) {\n unsubscribe = effect(fn);\n this.view.lifecycleListeners.unmount.push(unsubscribe);\n }\n });\n return () => {\n if (unsubscribe != null) {\n disposed = true;\n unsubscribe();\n }\n };\n }\n }\n\n outlet(): Markup {\n return markup(\"$outlet\", { view: this.view.elementContext.route! });\n // return createMarkup(\"$fragment\", { children: this.view.children });\n }\n}\n\nexport class View<P> implements ViewElement {\n [IS_MARKUP_ELEMENT] = true;\n\n uniqueId = getUniqueId();\n\n elementContext: ElementContext;\n logger;\n props;\n fn;\n\n element?: MarkupElement;\n\n name = $(\"\");\n context: Context;\n\n lifecycleListeners: {\n beforeMount: (() => any)[];\n mount: (() => any)[];\n beforeUnmount: (() => any)[];\n unmount: (() => any)[];\n } = { beforeMount: [], mount: [], beforeUnmount: [], unmount: [] };\n\n constructor(elementContext: ElementContext, fn: ViewFunction<P>, props: P, children?: Markup[]) {\n this.name(fn.name || \"🌇 anonymous view\");\n this.elementContext = {\n ...elementContext,\n parent: elementContext,\n view: this,\n stores: new Map(),\n route: $<View<{}>>(),\n };\n this.logger = createLogger(this.name, { uid: this.uniqueId });\n this.props = {\n ...props,\n children,\n };\n this.fn = fn;\n this.context = new Context(this);\n }\n\n /*===============================*\\\n || \"Public\" API ||\n \\*===============================*/\n\n get domNode() {\n return this.element?.domNode!;\n }\n\n isMounted = false;\n\n mount(parent: Node, after?: Node) {\n // Don't run lifecycle hooks or initialize if already connected.\n // Calling connect again can be used to re-order elements that are already connected to the DOM.\n const wasConnected = this.isMounted;\n\n if (!wasConnected) {\n this._initialize();\n for (const listener of this.lifecycleListeners.beforeMount) {\n listener();\n }\n }\n\n if (this.element) {\n this.element.mount(parent, after);\n }\n\n if (!wasConnected) {\n this.isMounted = true;\n\n requestAnimationFrame(() => {\n for (const listener of this.lifecycleListeners.mount) {\n listener();\n }\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n for (const listener of this.lifecycleListeners.beforeUnmount) {\n listener();\n }\n\n if (this.element) {\n // parentIsUnmounting is forwarded to the element because the view acts as a proxy for an element.\n this.element.unmount(parentIsUnmounting);\n }\n\n this.isMounted = false;\n\n for (const listener of this.lifecycleListeners.unmount) {\n listener();\n }\n\n this.lifecycleListeners.beforeMount.length = 0;\n this.lifecycleListeners.mount.length = 0;\n this.lifecycleListeners.beforeUnmount.length = 0;\n this.lifecycleListeners.unmount.length = 0;\n }\n\n setRouteView(fn: ViewFunction<{}>) {\n const node = new View(this.elementContext, fn, {});\n\n this.elementContext.route!(node);\n\n return node;\n }\n\n /*===============================*\\\n || Internal ||\n \\*===============================*/\n\n private _initialize() {\n const { context } = this;\n\n let result: ViewResult;\n try {\n result = this.fn.call(context, this.props, context);\n } catch (error) {\n if (error instanceof Error) {\n this.logger.crash(error);\n }\n throw error;\n }\n\n if (result === null) {\n // Do nothing.\n } else if (result instanceof Node) {\n this.element = groupElements(toMarkupElements(this.elementContext, markup(\"$node\", { value: result })));\n } else if (isFunction(result)) {\n this.element = groupElements(\n toMarkupElements(this.elementContext, markup(\"$dynamic\", { source: result as Signal<Renderable> })),\n );\n } else if (isMarkup(result) || isArrayOf<Markup>(isMarkup, result)) {\n this.element = groupElements(toMarkupElements(this.elementContext, result));\n } else {\n const error = new TypeError(\n `Expected '${\n this.fn.name\n }' function to return a DOM node, Markup element, Signal or null. Got: ${typeOf(result)}`,\n );\n this.logger.crash(error);\n }\n }\n}\n\nconst rootElementContext: ElementContext = {\n stores: globalStores,\n};\n\nexport function constructView<P>(view: ViewFunction<P>, props: P, children?: Renderable[]): ViewElement;\nexport function constructView(view: ViewFunction<{}>, children?: Renderable[]): ViewElement;\nexport function constructView<P>(\n context: ElementContext,\n view: ViewFunction<P>,\n props: P,\n children?: Renderable[],\n): ViewElement;\nexport function constructView(context: ElementContext, view: ViewFunction<{}>, children?: Renderable[]): ViewElement;\n\nexport function constructView(...args: any): ViewElement {\n if (isFunction(args[0])) {\n const view = args[0] as ViewFunction<any>;\n const props = isArray(args[1]) ? {} : args[1];\n const children = (isArray(args[2]) ? args[2] : isArray(args[1]) ? args[1] : []) as Renderable[];\n\n return new View(rootElementContext, view, props, toMarkup(children));\n } else if (isObject(args[0]) && isFunction(args[1])) {\n const context = args[0] as unknown as ElementContext;\n const view = args[1] as ViewFunction<any>;\n const props = isArray(args[2]) ? {} : args[2];\n const children = (isArray(args[3]) ? args[3] : isArray(args[2]) ? args[2] : []) as Renderable[];\n\n return new View(context, view, props, children ? toMarkup(children) : []);\n } else {\n throw new TypeError(\n \"Unexpected arguments; expected view, props and children, or context, view, props and children.\",\n );\n }\n}\n"],"names":["globalStores","rootElementContext","IS_MARKUP_ELEMENT","_a","DOMNode","node","__publicField","parent","after","parentIsUnmounting","Dynamic","options","effect","content","isRenderable","typeOf","peek","isArray","error","logger","_b","element","children","newElements","c","isMarkupElement","toMarkupElements","toMarkup","previous","lastChildNextSibling","_c","Fragment","source","isFunction","value","get","isCamelCaseEventName","key","HTML","tag","props","elementContext","getEnv","omit","i","child","unsubscribe","callback","listener","e","eventName","eventProps","_key","current","privateProps","_prev","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","name","priority","classes","classUnsubscribers","getClassMap","isString","names","isObject","item","lines","line","_value","entry","camelToKebab","$","ofs","Outlet","view","Portal","config","_parent","_after","groupElements","Repeat","items","renderFn","keyFn","potentialItems","index","newItems","connected","p","potential","deepEqual","View","RepeatItemView","lastItem","context","isMarkup","VNode","renderables","results","x","markup","constructMarkup","type","when","condition","thenContent","elseContent","unless","repeat","portal","attrs","elements","isNumber","isArrayOf","Context$1","store","descriptors","instance","StoreError","fn","disposed","Store","getUniqueId","createLogger","Context","Stores","_View","wasConnected","result","constructView","args"],"mappings":"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"}
package/docs/markup.md ADDED
@@ -0,0 +1,16 @@
1
+ # Markup
2
+
3
+ Dolla creates a tree of views that manage the DOM, updating attributes and recreating parts of the DOM as signal values change.
4
+
5
+ ```js
6
+ import { $, markup, render } from "@manyducks.co/dolla";
7
+
8
+ const count = $(0);
9
+ const labelMarkup = markup("span", {}, [count]);
10
+ // or in JSX:
11
+ const labelMarkup = <span>{count}</span>;
12
+
13
+ const rendered = render(labelMarkup);
14
+
15
+ rendered.mount(document.body);
16
+ ```
package/notes/stores.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  Ideas for updating the API.
4
4
 
5
+ ---
6
+
7
+ What about a global stores registry? Basically just a global object you can import and register stores on, then get them later. Global (not scoped to views). You can still use `provide` and `get` on view contexts in the same exact way if you want scoped stores.
8
+
9
+ This is a replacement for the current way of providing global stores on the Dolla object. The Dolla object is going away in future API versions.
10
+
11
+ ```ts
12
+ import { Stores, Views } from "@manyducks.co/dolla";
13
+
14
+ Stores.provide(SomeStore, {
15
+ /* options */
16
+ });
17
+
18
+ const some = Stores.get(SomeStore);
19
+
20
+ const SomeStore = Stores.define(() => {});
21
+
22
+ // Could also have views be defined this way.
23
+ const SomeView = Views.define<SomeProps>((props, ctx) => {});
24
+
25
+ // Register as a custom element.
26
+ Views.register("some-view", SomeView);
27
+ ```
28
+
29
+ ---
30
+
5
31
  ```js
6
32
  function CounterStore(initialCount = 0, ctx) {
7
33
  const [$value, setValue] = createState(initialCount);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manyducks.co/dolla",
3
- "version": "2.0.0-alpha.50",
3
+ "version": "2.0.0-alpha.52",
4
4
  "description": "Front-end components, routing and state management.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,19 @@
28
28
  "exports": {
29
29
  ".": {
30
30
  "import": "./dist/index.js",
31
- "types": "./index.d.ts"
31
+ "types": "./dist/core/index.d.ts"
32
+ },
33
+ "./router": {
34
+ "import": "./dist/router.js",
35
+ "types": "./dist/router/index.d.ts"
36
+ },
37
+ "./http": {
38
+ "import": "./dist/http.js",
39
+ "types": "./dist/http/index.d.ts"
40
+ },
41
+ "./i18n": {
42
+ "import": "./dist/i18n.js",
43
+ "types": "./dist/i18n/index.d.ts"
32
44
  },
33
45
  "./jsx-runtime": {
34
46
  "import": "./dist/jsx-runtime.js",
package/vite.config.js CHANGED
@@ -1,16 +1,17 @@
1
1
  import { resolve } from "node:path";
2
2
  import { defineConfig } from "vite";
3
- // import { externalizeDeps } from "vite-plugin-externalize-deps";
4
3
 
5
4
  export default defineConfig({
6
5
  build: {
7
6
  sourcemap: true,
8
7
  minify: true,
9
- // target: "esnext",
10
8
 
11
9
  lib: {
12
10
  entry: {
13
- index: resolve(__dirname, "src/index.ts"),
11
+ index: resolve(__dirname, "src/core/index.ts"),
12
+ http: resolve(__dirname, "src/http/index.ts"),
13
+ i18n: resolve(__dirname, "src/i18n/index.ts"),
14
+ router: resolve(__dirname, "src/router/index.ts"),
14
15
  "jsx-runtime": resolve(__dirname, "src/jsx-runtime.js"),
15
16
  "jsx-dev-runtime": resolve(__dirname, "src/jsx-dev-runtime.js"),
16
17
  },
@@ -18,6 +19,4 @@ export default defineConfig({
18
19
  formats: ["es"],
19
20
  },
20
21
  },
21
-
22
- // plugins: [externalizeDeps()],
23
22
  });
@@ -1,128 +0,0 @@
1
- import { HTTP } from "../http/index.js";
2
- import { type Router } from "../router/index.js";
3
- import { I18n } from "../translate/index.js";
4
- import type { StoreConsumerContext, StoreProviderContext } from "./context.js";
5
- import { type Markup, type MarkupElement } from "./markup.js";
6
- import { type ViewElement, type ViewFunction } from "./nodes/view.js";
7
- import { StoreFunction } from "./store.js";
8
- import { type CrashViewProps } from "./views/default-crash-view.js";
9
- export type Environment = "development" | "production";
10
- /**
11
- * Log type toggles. Each message category can be turned on or off or enabled only in a specific environment.
12
- */
13
- export type Loggles = {
14
- info: boolean | Environment;
15
- log: boolean | Environment;
16
- warn: boolean | Environment;
17
- error: boolean | Environment;
18
- };
19
- export interface Logger {
20
- info(...args: any[]): void;
21
- log(...args: any[]): void;
22
- warn(...args: any[]): void;
23
- error(...args: any[]): void;
24
- crash(error: Error): void;
25
- setName(name: string): Logger;
26
- }
27
- export interface LoggerErrorContext {
28
- error: Error;
29
- loggerName: string;
30
- uid?: string;
31
- }
32
- export type LoggerOptions = {
33
- /**
34
- * Console object to use for logging (mostly for testing). Uses window.console by default.
35
- */
36
- console?: any;
37
- /**
38
- * Unique ID to print with logs. Makes it easier to track down messages from specific view instances.
39
- */
40
- uid?: string;
41
- };
42
- export declare class Dolla implements StoreProviderContext, StoreConsumerContext {
43
- #private;
44
- readonly http: HTTP;
45
- readonly i18n: I18n;
46
- constructor();
47
- /**
48
- * True when the app is connected to a DOM node and displayed to the user.
49
- */
50
- get isMounted(): boolean;
51
- /**
52
- * Get the current environment that this app is running in.
53
- * Environment affects which log messages will print and how much debugging info is included in the DOM.
54
- */
55
- getEnv(): Environment;
56
- /**
57
- * Sets the environment that this app is running in.
58
- * Environment affects which log messages will print and how much debugging info is included in the DOM.
59
- */
60
- setEnv(value: Environment): void;
61
- /**
62
- * Sets the view that will be shown when the `crash` method is called on any logger.
63
- * When a crash is reported the app will be unmounted and replaced with this crash page.
64
- */
65
- setCrashView(view: ViewFunction<CrashViewProps>): void;
66
- /**
67
- * Returns the HTMLElement Dolla is mounted to. This will return undefined until Dolla.mount() is called.
68
- */
69
- getRootElement(): Element | undefined;
70
- /**
71
- * Returns the top level view Dolla is rendering inside the root element. This will return undefined until Dolla.mount() is called.
72
- */
73
- getRootView(): ViewElement | undefined;
74
- /**
75
- * Attaches a new store to this context.
76
- */
77
- provide<Value>(store: StoreFunction<{}, Value>): Value;
78
- /**
79
- * Attaches a new store to this context.
80
- */
81
- provide<Value>(store: StoreFunction<undefined, Value>): Value;
82
- /**
83
- * Attaches a new store to this context.
84
- */
85
- provide<Options, Value>(store: StoreFunction<Options, Value>, options: Options): Value;
86
- /**
87
- * Gets the nearest instance of a store. Throws an error if the store isn't provided higher in the tree.
88
- */
89
- get<Value>(store: StoreFunction<any, Value>): Value;
90
- mount(selector: string, router: Router): Promise<void>;
91
- mount(selector: string, view: ViewFunction<any>): Promise<void>;
92
- mount(element: Element, router: Router): Promise<void>;
93
- mount(element: Element, view: ViewFunction<any>): Promise<void>;
94
- unmount(): Promise<void>;
95
- /**
96
- * Registers a `callback` to run after `Dolla.mount` is called, before the app is mounted. If `callback` returns a Promise,
97
- * it will be awaited before mounting finishes. Use this to perform initial setup before the app is displayed to the user.
98
- */
99
- beforeMount(callback: () => void | Promise<void>): void;
100
- /**
101
- * Registers a `callback` to run after the app is mounted.
102
- */
103
- onMount(callback: () => void): void;
104
- /**
105
- * Registers a `callback` to run after `Dolla.unmount` is called, before the app is unmounted. If `callback` returns a Promise,
106
- * it will be awaited before unmounting finishes. Use this to perform cleanup.
107
- */
108
- beforeUnmount(callback: () => void | Promise<void>): void;
109
- /**
110
- * Registers a `callback` to run after the app is unmounted.
111
- */
112
- onUnmount(callback: () => void): void;
113
- /**
114
- * Update log type toggles. Values that are not passed will remain unchanged.
115
- */
116
- setLoggles(options: Partial<Loggles>): void;
117
- setLogFilter(filter: string | RegExp): void;
118
- createLogger(name: string, options?: LoggerOptions): Logger;
119
- /**
120
- *
121
- */
122
- constructView<P>(view: ViewFunction<P>, props: P, children?: Markup[]): ViewElement;
123
- /**
124
- *
125
- */
126
- constructMarkup(markup: Markup | Markup[]): MarkupElement;
127
- }
128
- export declare function getDefaultConsole(): Console | undefined;
@@ -1,42 +0,0 @@
1
- /**
2
- * A getter that returns the current value held within the signal.
3
- * If called inside a trackable scope this signal will be tracked as a dependency.
4
- */
5
- export interface Signal<T> {
6
- (): T;
7
- }
8
- /**
9
- * Extends Signal with the ability to pass a value or an updater function to change the Signal's value.
10
- */
11
- export interface Source<T> extends Signal<T> {
12
- (value: T): void;
13
- (updater: (value: T) => T): void;
14
- }
15
- export type MaybeSignal<T> = Signal<T> | T;
16
- export type EqualityFunction<T> = (current: T, next: T) => boolean;
17
- export interface SignalOptions<T> {
18
- /**
19
- * A function to compare the current and next values. Returning `true` means the value has changed.
20
- */
21
- equals?: EqualityFunction<T>;
22
- }
23
- export declare function isSource<T>(value: MaybeSignal<T>): value is Source<T>;
24
- export declare function peek<T>(value: MaybeSignal<T>): T;
25
- export declare function get<T>(value: MaybeSignal<T>): T;
26
- /**
27
- * Function to be invoked for the effect. Can return an optional cleanup function to be called between invocations.
28
- */
29
- export type EffectCallback = () => void | (() => void);
30
- export type UnsubscribeFunction = () => void;
31
- /**
32
- * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.
33
- * Reactives are tracked by accessing their `value` within the body of the function.
34
- *
35
- * NOTE: You must call the unsubscribe function to stop watching for changes.
36
- * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.
37
- */
38
- export declare function effect(fn: EffectCallback): UnsubscribeFunction;
39
- export declare function $<T>(compute: () => MaybeSignal<T>, options?: SignalOptions<T>): Signal<T>;
40
- export declare function $<T>(value: T, options?: SignalOptions<T>): Source<T>;
41
- export declare function $<T>(value: undefined, options?: SignalOptions<T>): Source<T | undefined>;
42
- export declare function $<T>(): Source<T | undefined>;
package/dist/index.d.ts DELETED
@@ -1,26 +0,0 @@
1
- export { $, effect, get, peek } from "./core/signals-api.js";
2
- export type { MaybeSignal, Signal, Source } from "./core/signals-api.js";
3
- export { deepEqual, shallowEqual, strictEqual } from "./utils.js";
4
- export { type StoreContext, type StoreFunction } from "./core/store.js";
5
- export { createRouter, type Router, type RouterOptions } from "./router/index.js";
6
- export { markup, portal, repeat, unless, when } from "./core/markup.js";
7
- export type { Markup, MarkupElement } from "./core/markup.js";
8
- import { Dolla } from "./core/dolla.js";
9
- declare const dolla: Dolla;
10
- export default dolla;
11
- export declare const t: (selector: string, options?: import("./translate/index.js").TOptions) => import("./core/signals-api.js").Signal<string>;
12
- export declare const i18n: import("./translate/index.js").I18n;
13
- export declare const http: import("./http/index.js").HTTP;
14
- export declare const createLogger: (name: string, options?: import("./core/dolla.js").LoggerOptions) => import("./core/dolla.js").Logger;
15
- export type { Dolla, Environment, Logger, LoggerErrorContext, LoggerOptions, Loggles } from "./core/dolla.js";
16
- export type { ViewContext, ViewElement, ViewFunction } from "./core/nodes/view.js";
17
- export type { CrashViewProps } from "./core/views/default-crash-view.js";
18
- export type { InputType, Renderable } from "./types.js";
19
- import type { IntrinsicElements as Elements } from "./types";
20
- declare global {
21
- namespace JSX {
22
- interface IntrinsicElements extends Elements {
23
- [tag: string]: any;
24
- }
25
- }
26
- }