@manyducks.co/dolla 2.0.0-alpha.35 → 2.0.0-alpha.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -12
- package/dist/core/context.d.ts +1 -52
- package/dist/core/dolla.d.ts +4 -4
- package/dist/core/nodes/dynamic.d.ts +5 -5
- package/dist/core/nodes/html.d.ts +11 -15
- package/dist/core/nodes/list.d.ts +9 -15
- package/dist/core/nodes/outlet.d.ts +6 -6
- package/dist/core/nodes/portal.d.ts +2 -2
- package/dist/core/nodes/view.d.ts +17 -34
- package/dist/core/ref.d.ts +0 -17
- package/dist/core/signals.d.ts +0 -3
- package/dist/core/store.d.ts +10 -16
- package/dist/core/symbols.d.ts +0 -1
- package/dist/http/index.d.ts +0 -1
- package/dist/index.js +1237 -898
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.js +20 -14
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.js +27 -16
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/markup-Px0heVon.js +1465 -0
- package/dist/markup-Px0heVon.js.map +1 -0
- package/dist/typeChecking.d.ts +0 -96
- package/dist/typeChecking.test.d.ts +1 -0
- package/dist/types.d.ts +0 -1
- package/dist/utils.d.ts +4 -1
- package/docs/views.md +0 -86
- package/notes/context-routes.md +56 -0
- package/notes/elimination.md +33 -0
- package/package.json +3 -4
- package/vite.config.js +5 -3
- package/dist/core/_batch.d.ts +0 -21
- package/dist/markup-BWJWLvDF.js +0 -1634
- package/dist/markup-BWJWLvDF.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup-Px0heVon.js","sources":["../src/typeChecking.ts","../src/core/signals.ts","../src/utils.ts","../src/core/symbols.ts","../src/core/views/passthrough.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/html.ts","../src/core/store.ts","../src/core/nodes/view.ts","../src/core/nodes/list.ts","../src/core/nodes/outlet.ts","../src/core/nodes/portal.ts","../src/core/markup.ts"],"sourcesContent":["type TypeNames =\n // These values can be returned by `typeof`.\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\"\n // These values are more specific ones that the `typeOf` function can return.\n | \"null\"\n | \"array\"\n | \"class\"\n | \"promise\"\n | \"map\"\n | \"set\"\n | \"NaN\";\n\n/**\n * Extends `typeof` operator with more specific and useful type distinctions.\n */\nexport function typeOf(value: any): TypeNames {\n const type = typeof value;\n switch (type) {\n case \"undefined\":\n return type;\n case \"number\":\n if (isNaN(value as any)) return \"NaN\";\n return type;\n case \"function\":\n if (/^\\s*class\\s+/.test(value.toString())) return \"class\";\n return type;\n case \"object\":\n if (value === null) return \"null\";\n if (value instanceof Promise) return \"promise\";\n if (value instanceof Map) return \"map\";\n if (value instanceof Set) return \"set\";\n if (Array.isArray(value)) return \"array\";\n return type;\n default:\n return type;\n }\n}\n\n/**\n * Throws a TypeError unless `condition` is truthy.\n *\n * @param condition - Value whose truthiness is in question.\n * @param errorMessage - Optional message for the thrown TypeError.\n */\nexport function assert(condition: any, errorMessage?: string): void {\n if (!condition) {\n throw new TypeError(\n formatError(condition, errorMessage || \"Failed assertion. Value is not truthy. Got type: %t, value: %v\"),\n );\n }\n}\n\n/**\n * Returns true if `value` is an array.\n */\nexport function isArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value);\n}\n\n/**\n * Throws an error if `value` is not an array.\n */\nexport function assertArray(value: unknown, errorMessage?: string): value is Array<unknown> {\n if (isArray(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage || \"Expected array. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true when `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n */\n\nexport function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[] {\n return isArray(value) && value.every((item) => check(item));\n}\n\n/**\n * Throws a TypeError unless `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n * @param errorMessage - A custom error message.\n */\nexport function assertArrayOf<T>(\n check: (item: unknown) => boolean,\n value: unknown,\n errorMessage?: string,\n): value is T[] {\n if (isArrayOf(check, value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an array of valid items. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Throws a TypeError unless `value` is a string.\n */\nexport function assertString(value: unknown, errorMessage?: string): value is string {\n if (isString(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a string. Got type: %t, value: %v\"));\n}\n\n// TODO: More specific validation for common types of strings? Email address, URL, UUID, etc?\n\n/**\n * Returns true if `value` is a function (but not a class).\n */\nexport function isFunction<T = (...args: unknown[]) => unknown>(value: unknown): value is T {\n return typeOf(value) === \"function\";\n}\n\n/**\n * Throws a TypeError unless `value` is a function.\n */\nexport function assertFunction<T = (...args: unknown[]) => unknown>(value: unknown, errorMessage?: string): value is T {\n if (isFunction(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a function. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a number.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !isNaN(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a number.\n */\nexport function assertNumber(value: unknown, errorMessage?: string): value is number {\n if (isNumber(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a number. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function isInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Returns `true` if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n */\nexport function isInstanceOf<T extends Function>(constructor: T, value: unknown): value is T;\n\nexport function isInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n\n const test = (value: unknown): value is T => {\n return value instanceof constructor;\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns a function that takes a `value` and throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n * @param errorMessage - A custom error message for when the assertion fails.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;\n\nexport function assertInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n const errorMessage = isString(args[2])\n ? args[2]\n : `Expected instance of ${constructor.name}. Got type: %t, value: %v`;\n\n const test = (value: unknown): value is T => {\n if (value instanceof constructor) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns true if `value` is a plain JavaScript object.\n */\nexport function isObject(value: unknown): value is Record<string | number | symbol, unknown> {\n return value != null && typeof value === \"object\" && !isArray(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a plain JavaScript object.\n */\nexport function assertObject(value: unknown, errorMessage?: string): value is object {\n if (isObject(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an object. Got type: %t, value: %v\"));\n}\n\n/**\n * Replaces `%t` and `%v` placeholders in a message with real values.\n */\nfunction formatError(value: unknown, message: string) {\n const typeName = typeOf(value);\n\n // TODO: Pretty format value as string based on type.\n const valueString = value?.toString?.() || String(value);\n\n return message.replaceAll(\"%t\", typeName).replaceAll(\"%v\", valueString);\n}\n","import { createReactiveSystem, type Dependency, type Subscriber, SubscriberFlags } from \"alien-signals\";\nimport { assertInstanceOf, isFunction } from \"../typeChecking\";\n\nexport interface Effect extends Subscriber, Dependency {\n fn(): void;\n}\n\nexport interface Computed<T = any> extends Signal<T | undefined>, Subscriber {\n getter: (cachedValue?: T) => T;\n equals: EqualityFunction<T>;\n}\n\nexport interface Signal<T = any> extends Dependency {\n currentValue: T;\n}\n\n/**\n * A readable reactive state object.\n */\nexport interface Reactive<T> {\n /**\n * The current value.\n */\n readonly value: T;\n}\n\nconst IS_REACTIVE = Symbol.for(\"DollaReactive\");\nconst DEPENDENCY = Symbol(\"dependency\");\n\nexport type MaybeReactive<T> = Reactive<T> | T;\nexport type UnsubscribeFunction = () => void;\n\nconst {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects,\n} = createReactiveSystem({\n updateComputed(computed: Computed): boolean {\n const prevSub = activeSub;\n activeSub = computed;\n startTracking(computed);\n try {\n const oldValue = computed.currentValue;\n const newValue = computed.getter(oldValue);\n if (!computed.equals(oldValue, newValue)) {\n computed.currentValue = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(computed);\n }\n },\n notifyEffect(e: Effect) {\n const flags = e.flags;\n if (flags & SubscriberFlags.Dirty || (flags & SubscriberFlags.PendingComputed && updateDirtyFlag(e, flags))) {\n queueEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n },\n});\n\n/*===================================*\\\n|| EFFECTS & TRACKING ||\n\\*===================================*/\n\nlet activeSub: Subscriber | undefined;\n\nconst PENDING_EFFECTS: Effect[] = [];\n\nlet flushPending = false;\n\nfunction flushEffects(): void {\n if (!flushPending) {\n flushPending = true;\n\n queueMicrotask(() => {\n flushPending = false;\n for (let i = 0; i < PENDING_EFFECTS.length; i++) {\n const e = PENDING_EFFECTS[i];\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n e.fn();\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n }\n PENDING_EFFECTS.length = 0;\n });\n }\n}\n\nfunction queueEffect(e: Effect) {\n PENDING_EFFECTS.push(e);\n flushEffects();\n}\n\nfunction stopEffect(this: Effect): void {\n startTracking(this);\n endTracking(this);\n // Cancel it after it receives its current value.\n queueMicrotask(() => {\n PENDING_EFFECTS.splice(PENDING_EFFECTS.indexOf(this), 1);\n });\n}\n\n/*===================================*\\\n|| Types & Core Classes ||\n\\*===================================*/\n\n/**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\nexport type EqualityFunction<T> = (current: T, next: T) => boolean;\n\nexport interface ReactiveOptions<T> {\n /**\n * A label for debugging purposes.\n */\n name?: string;\n\n /**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\n equals?: EqualityFunction<T>;\n}\n\nexport class Atom<T> implements Reactive<T> {\n #signal;\n #equals;\n\n name?: string;\n\n constructor(signal: Signal<T>, options?: ReactiveOptions<T>) {\n this.#signal = signal;\n this.#equals = options?.equals ?? Object.is;\n\n if (options?.name) {\n this.name = options.name;\n }\n\n Object.defineProperty(this, DEPENDENCY, {\n value: signal,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n\n get value(): T {\n return this.#signal.currentValue;\n }\n\n set value(next: T) {\n if (!this.#equals(this.#signal.currentValue, next)) {\n this.#signal.currentValue = next;\n const subs = this.#signal.subs;\n if (subs !== undefined) {\n propagate(subs);\n processEffectNotifications();\n }\n }\n }\n}\n\nclass Composed<T> implements Reactive<T> {\n private computed;\n\n constructor(computed: Computed<T>) {\n this.computed = computed;\n\n Object.defineProperty(this, DEPENDENCY, {\n value: computed,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n\n get value(): T {\n const computed = this.computed;\n const flags = computed.flags;\n if (flags & (SubscriberFlags.Dirty | SubscriberFlags.PendingComputed)) {\n processComputedUpdate(computed, flags);\n }\n return computed.currentValue!;\n }\n}\n\n/*===================================*\\\n|| Public API Functions ||\n\\*===================================*/\n\n/**\n * Determines if a value is reactive.\n */\nexport function isReactive<T>(value: any): value is Reactive<T> {\n return value != null && (value as any)[DEPENDENCY] != null;\n}\n\n/**\n * Creates a simple reactive container that stores a value.\n * Atom values can be read and updated with the `value` property\n *\n * @example\n * const count = atom(1);\n * count.value++;\n * count.value; // 2\n */\nexport function atom<T>(): Atom<T | undefined>;\n\n/**\n * Creates a simple reactive container that stores a value.\n * Atom values can be read and updated with the `value` property.\n *\n * @example\n * const count = atom(1);\n * count.value++;\n * count.value; // 2\n */\nexport function atom<T>(value: T, options?: ReactiveOptions<T>): Atom<T>;\n\n/**\n * Creates a simple reactive container that stores a value.\n * Atom values can be read and updated with the `value` property.\n *\n * @example\n * const count = atom(1);\n * count.value++;\n * count.value; // 2\n */\nexport function atom<T>(value?: T, options?: ReactiveOptions<T>): Atom<T | undefined>;\n\nexport function atom<T>(value?: T, options?: ReactiveOptions<T>) {\n return new Atom({ currentValue: value as T, subs: undefined, subsTail: undefined }, options);\n}\n\ntype ComposeCallback<T> = (previousValue?: T) => MaybeReactive<T>;\n\n/**\n * Creates a reactive container that derives its value from other reactive values that it tracks.\n *\n * @example\n * const count = atom(1);\n * const doubled = compose(() => get(count) * 2);\n */\nexport function compose<T>(fn: ComposeCallback<T>, options?: ReactiveOptions<T>): Reactive<T> {\n return new Composed<T>({\n currentValue: undefined,\n equals: options?.equals ?? Object.is,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Computed | SubscriberFlags.Dirty,\n getter: (cachedValue?: unknown) => {\n let returned = fn(cachedValue as T | undefined);\n\n // If a reactive is returned, track it and return its value.\n returned = get(returned);\n\n // if (activeSub !== undefined) {\n // if (activeSub.depsTail === undefined) {\n // const name = options?.name ?? fn.name;\n // console.warn(\n // `Compose function${name ? \" '\" + name + \"'\" : \"\"} has no tracked dependencies and will never update.`,\n // fn,\n // );\n // }\n // }\n\n return returned;\n },\n });\n}\n\n/**\n * Takes a new value to set, or a callback that receives the current value and returns a new value to set.\n */\ntype Setter<T> = (next: T | ((current: T) => T)) => void;\n\nexport function set<T>(atom: Atom<T>): Setter<T>;\nexport function set<T>(atom: Atom<T>, next: T | ((current: T) => T)): void;\n\nexport function set<T>(atom: Atom<T>, next?: T | ((current: T) => T)) {\n if (isFunction<(current: T) => T>(next)) {\n atom.value = next(atom.value);\n } else if (arguments.length > 1) {\n atom.value = next as T;\n } else {\n return (next: T | ((current: T) => T)) => set(atom, next);\n }\n}\n\n/**\n * Returns the current value from a reactive _and track it_ if called in a `compose` or `effect` scope.\n * If a non-reactive value is passed it will just be returned untracked.\n *\n * @example\n * const count = atom(1);\n * const value = get(count); // 1\n *\n * const value = get(5); // 5\n */\nexport function get<T>(value: MaybeReactive<T>): T {\n if (isReactive(value)) {\n if (activeSub !== undefined) {\n const dep = (value as any)[DEPENDENCY] as Dependency;\n link(dep, activeSub);\n }\n return value.value;\n } else {\n return value;\n }\n}\n\n/**\n * Returns the current value from a reactive (without tracking).\n * If a non-reactive value is passed it will be returned.\n *\n * @example\n * ctx.effect(() => {\n * const doubled = get(count) * 2; // `count` will be tracked\n *\n * const doubled = peek(count) * 2; // `count` will NOT be tracked\n * });\n */\nexport function peek<T>(value: MaybeReactive<T>): T {\n if (isReactive(value)) {\n return value.value;\n } else {\n return value;\n }\n}\n\nexport type EffectCallback = () => void;\n\n/**\n * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.\n * Reactives are tracked by accessing their `value` within the body of the function.\n *\n * NOTE: You must call the unsubscribe function to stop watching for changes.\n * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.\n */\nexport function effect(fn: EffectCallback): UnsubscribeFunction {\n const e: Effect = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Effect,\n };\n if (activeSub !== undefined) {\n link(e, activeSub);\n }\n queueEffect(e);\n return stopEffect.bind(e);\n}\n","import { isFunction, isObject, typeOf } from \"./typeChecking.js\";\nimport _deepEqual from \"fast-deep-equal/es6\";\n\nexport const noOp = () => {};\n\n// Guarantee unique ID by incrementing a global counter.\nlet idCounter = 1;\nexport function getUniqueId(): string {\n idCounter = (idCounter % Number.MAX_SAFE_INTEGER) + 1;\n return idCounter.toString(36) + Date.now().toString(36);\n}\n\n/*=============================*\\\n|| Object Equality ||\n\\*=============================*/\n\n/**\n * Equality check that passes if both values are the same object.\n * This is the default equality check for states.\n */\nexport function strictEqual(a: any, b: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * Equality check that passes if both values are the same object, or if both are objects or arrays with equal keys and values.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n\n // Must be same type\n const t = typeOf(a);\n if (t !== typeOf(b)) {\n return false;\n }\n\n switch (t) {\n case \"object\":\n // Objects must have same number of keys with strict equal values\n let size = 0;\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n size++;\n }\n return Object.keys(b).length === size;\n case \"array\":\n // Arrays must be the same length with strict equal values\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n case \"map\":\n if (a.size !== b.size) return false;\n for (const key of a.keys()) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n case \"set\":\n if (isFunction(a.symmetricDifference)) {\n return a.symmetricDifference(b).size === 0;\n } else {\n for (const key of a.keys()) {\n if (a[key] !== b.get(key)) return false;\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Equality check that passes if two objects have equal values, even if they are not the same object.\n */\nexport const deepEqual = _deepEqual;\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const process = (object: Record<any, any>) => {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n };\n\n if (object == null) {\n return process;\n }\n\n return process(object);\n}\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes any string and returns an OKLCH color.\n */\nexport function okhash(value: string) {\n let hue = 0;\n for (let i = 0; i < value.length; i++) {\n hue = (hue + value.charCodeAt(i) * 10) % 360;\n }\n return `oklch(0.68 0.15 ${hue}deg)`;\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","// 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 ViewContext } from \"../nodes/view.js\";\n\n/**\n * A utility view that simply displays its children.\n */\nexport function Passthrough(_: {}, ctx: ViewContext) {\n return ctx.outlet();\n}\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 node: Node;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor(node: Node) {\n this.node = node;\n }\n\n mount(parent: Node, after?: Node) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.node.parentNode && !parentIsUnmounting) {\n this.node.parentNode.removeChild(this.node);\n }\n }\n}\n","import { isArray, typeOf } from \"../../typeChecking.js\";\nimport type { Renderable } from \"../../types.js\";\nimport type { ElementContext } from \"../context.js\";\nimport { constructMarkup, isMarkupElement, isRenderable, toMarkup, type MarkupElement } from \"../markup.js\";\nimport { effect, get, type Reactive, type UnsubscribeFunction } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\ninterface DynamicOptions {\n source: Reactive<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 */\nexport class Dynamic implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n node = document.createTextNode(\"\");\n private children: MarkupElement[] = [];\n private elementContext: ElementContext;\n\n private source: Reactive<Renderable>;\n private unsubscribe?: UnsubscribeFunction;\n\n get isMounted() {\n return this.node.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.node, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n const content = get(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 this.update(isArray(content) ? content : [content]);\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.unsubscribe?.();\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.node.parentNode?.removeChild(this.node);\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 constructMarkup(this.elementContext, toMarkup(c));\n }\n });\n\n for (const element of newElements) {\n const previous = this.children.at(-1)?.node || this.node;\n element.mount(this.node.parentNode!, previous);\n this.children.push(element);\n }\n\n // Move marker node to end.\n const parent = this.node.parentNode!;\n const lastChildNextSibling = this.children.at(-1)?.node?.nextSibling ?? null;\n parent.insertBefore(this.node, lastChildNextSibling);\n }\n}\n","import { isFunction, isObject, isString } from \"../../typeChecking.js\";\nimport { getUniqueId, omit } from \"../../utils.js\";\nimport { type ElementContext } from \"../context.js\";\nimport { constructMarkup, type Markup, type MarkupElement } from \"../markup.js\";\nimport { type Ref } from \"../ref.js\";\nimport { effect, get, isReactive, type MaybeReactive, type UnsubscribeFunction } 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?: Markup[];\n};\n\nexport class HTML implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n node;\n private props: Record<string, any>;\n private childMarkup: Markup[] = [];\n private children: MarkupElement[] = [];\n private unsubscribers: UnsubscribeFunction[] = [];\n private elementContext;\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Ref<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n get isMounted() {\n return this.node.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 // Create node with the appropriate constructor.\n if (elementContext.isSVG) {\n this.node = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.node = document.createElement(tag);\n }\n\n if (elementContext.root.getEnv() === \"development\" && elementContext.viewName) {\n this.node.dataset.view = elementContext.viewName;\n }\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.node);\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 = children;\n }\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 = constructMarkup(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].node : undefined;\n child.mount(this.node, previous);\n }\n\n this.applyProps(this.node, this.props);\n if (this.props.style) this.applyStyles(this.node, this.props.style, this.unsubscribers);\n if (this.props.class) this.applyClasses(this.node, this.props.class, this.unsubscribers);\n }\n\n parent.insertBefore(this.node, 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.node.parentNode?.removeChild(this.node);\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: MaybeReactive<T>, callback: (value: T) => void) {\n if (isReactive(value)) {\n this.unsubscribers.push(effect(() => callback(get(value))));\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 if (key === \"attributes\") {\n const values = value as Record<string, any>;\n // Set attributes directly without mapping props\n for (const name in values) {\n this.attachProp(values[name], (current) => {\n if (current == null) {\n (element as any).removeAttribute(name);\n } else {\n (element as any).setAttribute(name, String(current));\n }\n });\n }\n } else if (key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n if (isReactive<(e: Event) => void>(value)) {\n value.value(e);\n } else {\n (value as (e: Event) => void)(e);\n }\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 (isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = isReactive<(e: Event) => void>(value)\n ? (e: Event) => value.value(e)\n : (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 (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 \"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 // Attribute-aliased props\n case \"exportParts\":\n case \"part\":\n case \"translate\":\n case \"type\":\n case \"title\": {\n const _key = key.toLowerCase();\n this.attachProp(value, (current) => {\n if (current == undefined) {\n element.removeAttribute(_key);\n } else {\n element.setAttribute(_key, String(current));\n }\n });\n break;\n }\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(value, (current) => {\n if (typeof current === \"string\") {\n (element as any).autocomplete = current;\n } else if (current) {\n (element as any).autocomplete = \"on\";\n } else {\n (element as any).autocomplete = \"off\";\n }\n });\n break;\n\n default: {\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\n });\n break;\n }\n }\n }\n }\n }\n }\n\n private applyStyles(element: HTMLElement | SVGElement, styles: unknown, unsubscribers: UnsubscribeFunction[]) {\n const propUnsubscribers: UnsubscribeFunction[] = [];\n\n if (isReactive(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 (isReactive(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.style.setProperty(name, String(value.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: UnsubscribeFunction[]) {\n const classUnsubscribers: UnsubscribeFunction[] = [];\n\n if (isReactive(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 (isReactive(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","import type { StoreConsumerContext, ComponentContext, ElementContext } from \"./context.js\";\nimport type { Logger } from \"./dolla.js\";\nimport { IS_STORE } from \"./symbols.js\";\nimport { isFunction } from \"../typeChecking.js\";\nimport { effect, EffectCallback, UnsubscribeFunction } from \"./signals.js\";\nimport { getUniqueId } from \"../utils.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: EffectCallback): UnsubscribeFunction;\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 this.store.name || this.store.id;\n }\n\n set name(value) {\n this.store.name = value;\n this.store.logger.setName(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: EffectCallback) {\n const store = this.store;\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(callback);\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: UnsubscribeFunction | undefined;\n let disposed = false;\n store.lifecycleListeners.mount.push(() => {\n if (!disposed) {\n unsubscribe = effect(callback);\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 = elementContext.root.createLogger(this.name);\n // this._emitter.on(\"error\", (error, eventName, ...args) => {\n // this._logger.error({ error, eventName, args });\n // this._logger.crash(error as Error);\n // });\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","import { isArrayOf, isFunction, typeOf } from \"../../typeChecking.js\";\nimport { Renderable } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport type { ComponentContext, ElementContext, StoreConsumerContext, StoreProviderContext } from \"../context.js\";\nimport type { Logger } from \"../dolla.js\";\nimport { constructMarkup, createMarkup, groupElements, isMarkup, type Markup, type MarkupElement } from \"../markup.js\";\nimport { atom, effect, isReactive, type EffectCallback, type Reactive, type UnsubscribeFunction } 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 | Reactive<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 /**\n * Take a ViewFunction and render it as a child of this view.\n */\n setChildView(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: EffectCallback): UnsubscribeFunction;\n\n /**\n * Returns a Markup element that displays this view's children.\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 this.view.elementContext.viewName || this.uid;\n }\n\n set name(value) {\n this.view.elementContext.viewName = value;\n this.view.logger.setName(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: EffectCallback) {\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(callback);\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: UnsubscribeFunction | undefined;\n let disposed = false;\n this.view.lifecycleListeners.mount.push(() => {\n if (!disposed) {\n unsubscribe = effect(callback);\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 createMarkup(\"$outlet\", { 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 childMarkup;\n\n children = atom<MarkupElement[]>([]);\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.elementContext = {\n ...elementContext,\n parent: elementContext,\n viewName: fn.name,\n stores: new Map(),\n };\n this.logger = elementContext.root.createLogger(fn.name || \"🌇 anonymous view\", { uid: this.uniqueId });\n this.props = props;\n this.fn = fn;\n\n this.childMarkup = children;\n }\n\n /*===============================*\\\n || \"Public\" API ||\n \\*===============================*/\n\n get node() {\n return this.element?.node!;\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 // TODO: Figure out why rAF is needed for updates to DOM nodes to work in onMount callbacks.\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 setChildView(fn: ViewFunction<{}>) {\n this.childMarkup = [];\n const node = new View(this.elementContext, fn, {});\n this.children.value = [node];\n return node;\n }\n\n /*===============================*\\\n || Internal ||\n \\*===============================*/\n\n private _initialize() {\n const context = new Context(this);\n\n let result: ViewResult;\n try {\n result = this.fn.call(context, this.props, context);\n\n if (this.childMarkup.length) {\n this.children.value = constructMarkup(this.elementContext, this.childMarkup);\n }\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(constructMarkup(this.elementContext, createMarkup(\"$node\", { value: result })));\n } else if (isReactive(result)) {\n this.element = groupElements(\n constructMarkup(this.elementContext, createMarkup(\"$dynamic\", { source: result as Reactive<Renderable> })),\n );\n } else if (isMarkup(result) || isArrayOf<Markup>(isMarkup, result)) {\n this.element = groupElements(constructMarkup(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, Readable or null. Got: ${typeOf(result)}`,\n );\n this.logger.crash(error);\n }\n }\n}\n","import { type ElementContext } from \"../context.js\";\nimport { type MarkupElement } from \"../markup.js\";\nimport { type Atom, atom, compose, effect, get, peek, type Reactive, type UnsubscribeFunction } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { View, type ViewContext, type ViewResult } from \"./view.js\";\n\n// ----- Types ----- //\n\ninterface ListOptions<T> {\n elementContext: ElementContext;\n items: Reactive<T[]>;\n keyFn: (item: T, index: number) => string | number | symbol;\n renderFn: (item: Reactive<T>, index: Reactive<number>, ctx: ViewContext) => ViewResult;\n}\n\ntype ConnectedItem<T> = {\n key: any;\n item: Atom<T>;\n index: Atom<number>;\n element: MarkupElement;\n};\n\n// ----- Code ----- //\n\nexport class List<T> implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n node = document.createTextNode(\"\");\n private items: Reactive<T[]>;\n private unsubscribe: UnsubscribeFunction | null = null;\n private connectedItems: ConnectedItem<T>[] = [];\n private elementContext;\n private renderFn: (\n this: ViewContext,\n value: Reactive<T>,\n index: Reactive<number>,\n context: ViewContext,\n ) => ViewResult;\n private keyFn: (value: T, index: number) => string | number | symbol;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ elementContext, items, renderFn, keyFn }: ListOptions<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.node, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = get(this.items);\n\n if (value == null) {\n value = [];\n console.log(\"list received empty value\", value, this);\n }\n\n this._update(Array.from(value));\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.node.parentNode?.removeChild(this.node);\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.value = potential.value;\n connected.index.value = potential.index;\n newItems[potential.index] = connected;\n } else {\n const item = atom(potential.value);\n const index = atom(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n item,\n index,\n element: new View(this.elementContext, ListItemView, {\n item: compose(() => item.value),\n 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.node ?? this.node;\n item.element.mount(this.node.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.element.node ?? this.node;\n this.node.parentNode?.insertBefore(this.node, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n item: Reactive<any>;\n index: Reactive<number>;\n renderFn: (item: Reactive<any>, index: Reactive<number>, context: ViewContext) => ViewResult;\n}\n\nfunction ListItemView(props: ListItemProps, context: ViewContext) {\n context.name = \"@ListItem\";\n return props.renderFn.call(context, props.item, props.index, context);\n}\n","import { type MarkupElement } from \"../markup.js\";\nimport { isReactive, get, effect, type MaybeReactive, type UnsubscribeFunction, peek } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/**\n * Manages several MarkupElements as one.\n */\nexport class Outlet implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n node = document.createTextNode(\"\");\n isMounted = false;\n\n private source: MaybeReactive<MarkupElement[]>;\n private elements: MarkupElement[] = [];\n\n private unsubscribe?: UnsubscribeFunction;\n\n constructor(source: MaybeReactive<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.node, after?.nextSibling ?? null);\n\n if (isReactive<MarkupElement[]>(this.source)) {\n this.unsubscribe = effect(() => {\n this.update(get(this.source));\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.node.parentElement!, previous?.node);\n this.elements.push(element);\n }\n\n this.node.parentNode?.insertBefore(this.node, this.elements.at(-1)?.node ?? null);\n }\n }\n}\n","import type { Renderable } from \"../../types.js\";\nimport type { ElementContext } from \"../context.js\";\nimport { constructMarkup, 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(constructMarkup(this.config.elementContext, toMarkup(content)));\n }\n\n this.element.mount(parent);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.element?.isMounted) {\n this.element.unmount(parentIsUnmounting);\n }\n }\n}\n","import htm from \"htm/mini\";\n\nimport { isArray, isArrayOf, isFunction, isNumber, isString, typeOf } from \"../typeChecking.js\";\nimport type { Renderable } from \"../types.js\";\nimport type { ElementContext } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { List } from \"./nodes/list.js\";\nimport { Outlet } from \"./nodes/outlet.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { View, type ViewContext, type ViewFunction, type ViewResult } from \"./nodes/view.js\";\nimport { compose, get, isReactive, MaybeReactive, type Reactive } from \"./signals.js\";\nimport { IS_MARKUP, 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?: Markup[];\n}\n\n/**\n * A DOM node that has been constructed from a Markup object.\n */\nexport interface MarkupElement {\n readonly node?: Node;\n\n readonly isMounted: boolean;\n\n mount(parent: Node, after?: Node): void;\n\n /**\n * Disconnect from the DOM and clean up. If parentIsUnmounting, DOM operations are skipped.\n * parentIsUnmounting is set for all children by HTML nodes when they unmount.\n */\n unmount(parentIsUnmounting?: boolean): void;\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 return renderables\n .flat(Infinity)\n .filter((x) => x !== null && x !== undefined && x !== false)\n .map((x) => {\n if (isMarkup(x)) {\n return x;\n }\n\n if (x instanceof Node) {\n return createMarkup(\"$node\", { value: x });\n }\n\n if (isReactive<Renderable>(x)) {\n return createMarkup(\"$dynamic\", { source: x });\n }\n\n // fallback to displaying value as text\n return createMarkup(\"$text\", { value: x });\n });\n}\n\nexport interface MarkupAttributes {\n $text: { value: any };\n $list: {\n items: Reactive<any[]>;\n keyFn: (value: any, index: number) => string | number | symbol;\n renderFn: (item: Reactive<any>, index: Reactive<number>, ctx: ViewContext) => ViewResult;\n };\n $dynamic: {\n source: Reactive<Renderable>;\n };\n $outlet: {\n children: MaybeReactive<MarkupElement[]>;\n };\n $node: {\n value: Node;\n };\n $portal: {\n content: Renderable;\n parent: Node;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function createMarkup<T extends keyof MarkupAttributes>(\n type: T,\n attributes: MarkupAttributes[T],\n ...children: Renderable[]\n): Markup;\n\nexport function createMarkup<I>(type: ViewFunction<I>, attributes?: I, ...children: Renderable[]): Markup;\n\nexport function createMarkup<P>(type: string | ViewFunction<P>, props?: P, ...children: Renderable[]) {\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 = toMarkup(children);\n }\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * Generate markup with HTML in a tagged template literal.\n */\nexport const html = htm.bind(createMarkup);\n\n/**\n * Displays content conditionally. When `condition` holds a truthy value, `thenContent` is displayed; when `condition` holds a falsy value, `elseContent` is displayed.\n */\nexport function cond(condition: MaybeReactive<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return createMarkup(\"$dynamic\", {\n source: compose<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 * 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 list<T>(\n items: MaybeReactive<T[]>,\n keyFn: (value: T, index: number) => string | number | symbol,\n renderFn: (item: Reactive<T>, index: Reactive<number>, ctx: ViewContext) => ViewResult,\n): Markup {\n return createMarkup(\"$list\", { items: compose(() => 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 createMarkup(\"$portal\", { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\n/**\n * Construct Markup metadata into a set of MarkupElements.\n */\nexport function constructMarkup(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 \"$node\": {\n const attrs = item.props! as MarkupAttributes[\"$node\"];\n return new DOMNode(attrs.value);\n }\n case \"$text\": {\n const attrs = item.props! as MarkupAttributes[\"$text\"];\n return new DOMNode(document.createTextNode(String(attrs.value)));\n }\n case \"$list\": {\n const attrs = item.props! as MarkupAttributes[\"$list\"];\n return new List({\n items: attrs.items,\n keyFn: attrs.keyFn,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case \"$dynamic\": {\n const attrs = item.props! as MarkupAttributes[\"$dynamic\"];\n return new Dynamic({\n source: attrs.source,\n elementContext,\n });\n }\n case \"$outlet\": {\n const attrs = item.props! as MarkupAttributes[\"$outlet\"];\n return new Outlet(attrs.children);\n }\n case \"$portal\": {\n const attrs = item.props! as MarkupAttributes[\"$portal\"];\n return new Portal({\n content: attrs.content,\n parent: attrs.parent,\n elementContext,\n });\n }\n default:\n if (item.type.startsWith(\"$\")) {\n throw new Error(`Unknown markup type: ${item.type}`);\n }\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 Outlet(elements);\n}\n\nexport function isRenderable(value: unknown): value is Renderable {\n return (\n value == null ||\n value === false ||\n isString(value) ||\n isNumber(value) ||\n isMarkup(value) ||\n isReactive(value) ||\n isArrayOf(isRenderable, value)\n );\n}\n"],"names":["atom","next","object","Context","index"],"mappings":"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"}
|
package/dist/typeChecking.d.ts
CHANGED
|
@@ -18,12 +18,6 @@ export declare function isArray(value: unknown): value is Array<unknown>;
|
|
|
18
18
|
* Throws an error if `value` is not an array.
|
|
19
19
|
*/
|
|
20
20
|
export declare function assertArray(value: unknown, errorMessage?: string): value is Array<unknown>;
|
|
21
|
-
/**
|
|
22
|
-
* Returns a function that takes a `value` and ensures that it is an array for which `check` returns true for every item.
|
|
23
|
-
*
|
|
24
|
-
* @param check - Function to check items against.
|
|
25
|
-
*/
|
|
26
|
-
export declare function isArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];
|
|
27
21
|
/**
|
|
28
22
|
* Returns true when `value` is an array and `check` returns true for every item.
|
|
29
23
|
*
|
|
@@ -31,12 +25,6 @@ export declare function isArrayOf<T>(check: (item: unknown) => boolean): (value:
|
|
|
31
25
|
* @param value - A possible array.
|
|
32
26
|
*/
|
|
33
27
|
export declare function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[];
|
|
34
|
-
/**
|
|
35
|
-
* Returns a function that takes a `value` and throws a TypeError unless it is an array for which `check` returns true for every item.
|
|
36
|
-
*
|
|
37
|
-
* @param check - Function to check items against.
|
|
38
|
-
*/
|
|
39
|
-
export declare function assertArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];
|
|
40
28
|
/**
|
|
41
29
|
* Throws a TypeError unless `value` is an array and `check` returns true for every item.
|
|
42
30
|
*
|
|
@@ -45,14 +33,6 @@ export declare function assertArrayOf<T>(check: (item: unknown) => boolean): (va
|
|
|
45
33
|
* @param errorMessage - A custom error message.
|
|
46
34
|
*/
|
|
47
35
|
export declare function assertArrayOf<T>(check: (item: unknown) => boolean, value: unknown, errorMessage?: string): value is T[];
|
|
48
|
-
/**
|
|
49
|
-
* Returns true if `value` is equal to `true` or `false`.
|
|
50
|
-
*/
|
|
51
|
-
export declare function isBoolean(value: unknown): value is boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Throws a TypeError unless `value` is equal to `true` or `false`.
|
|
54
|
-
*/
|
|
55
|
-
export declare function assertBoolean(value: unknown, errorMessage?: string): value is boolean;
|
|
56
36
|
/**
|
|
57
37
|
* Returns true if `value` is a string.
|
|
58
38
|
*/
|
|
@@ -77,34 +57,6 @@ export declare function isNumber(value: unknown): value is number;
|
|
|
77
57
|
* Throws a TypeError unless `value` is a number.
|
|
78
58
|
*/
|
|
79
59
|
export declare function assertNumber(value: unknown, errorMessage?: string): value is number;
|
|
80
|
-
/**
|
|
81
|
-
* Returns true if `value` implements the Promise protocol.
|
|
82
|
-
* This matches true instances of Promise as well as any object that
|
|
83
|
-
* implements `next`, `catch` and `finally` methods.
|
|
84
|
-
*
|
|
85
|
-
* To strictly match instances of Promise, use `isInstanceOf(Promise)`.
|
|
86
|
-
*/
|
|
87
|
-
export declare function isPromise<T = unknown>(value: unknown): value is Promise<T>;
|
|
88
|
-
/**
|
|
89
|
-
* Throws a TypeError unless `value` implements the Promise protocol.
|
|
90
|
-
* This matches true instances of Promise as well as any object that
|
|
91
|
-
* implements `next`, `catch` and `finally` methods.
|
|
92
|
-
*
|
|
93
|
-
* To strictly allow only instances of Promise, use `Type.assertInstanceOf(Promise)`.
|
|
94
|
-
*/
|
|
95
|
-
export declare function assertPromise<T = unknown>(value: unknown, errorMessage?: string): value is Promise<T>;
|
|
96
|
-
/**
|
|
97
|
-
* Returns true if `value` is a class.
|
|
98
|
-
*/
|
|
99
|
-
export declare function isClass(value: unknown): value is {
|
|
100
|
-
new (): unknown;
|
|
101
|
-
};
|
|
102
|
-
/**
|
|
103
|
-
* Throws a TypeError unless `value` is a class.
|
|
104
|
-
*/
|
|
105
|
-
export declare function assertClass(value: unknown, errorMessage?: string): value is {
|
|
106
|
-
new (): unknown;
|
|
107
|
-
};
|
|
108
60
|
/**
|
|
109
61
|
* Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.
|
|
110
62
|
*
|
|
@@ -132,30 +84,6 @@ export declare function assertInstanceOf<T extends Function>(constructor: T): (v
|
|
|
132
84
|
* @param errorMessage - A custom error message for when the assertion fails.
|
|
133
85
|
*/
|
|
134
86
|
export declare function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;
|
|
135
|
-
/**
|
|
136
|
-
* Returns true if `value` is a Map.
|
|
137
|
-
*/
|
|
138
|
-
export declare function isMap<K = unknown, V = unknown>(value: any): value is Map<K, V>;
|
|
139
|
-
/**
|
|
140
|
-
* Throws a TypeError unless `value` is a Map.
|
|
141
|
-
*/
|
|
142
|
-
export declare function assertMap<K = unknown, V = unknown>(value: any, errorMessage?: string): value is Map<K, V>;
|
|
143
|
-
/**
|
|
144
|
-
* Returns true if `value` is a Set.
|
|
145
|
-
*/
|
|
146
|
-
export declare function isSet<T = unknown>(value: any): value is Set<T>;
|
|
147
|
-
/**
|
|
148
|
-
* Throws a TypeError if `value` is not a Set.
|
|
149
|
-
*/
|
|
150
|
-
export declare function assertSet<T = unknown>(value: any, errorMessage?: string): value is Set<T>;
|
|
151
|
-
/**
|
|
152
|
-
* Returns true if `value` implements the Iterable protocol.
|
|
153
|
-
*/
|
|
154
|
-
export declare function isIterable<T>(value: any): value is Iterable<T>;
|
|
155
|
-
/**
|
|
156
|
-
* Throws a TypeError unless `value` implements the Iterable protocol.
|
|
157
|
-
*/
|
|
158
|
-
export declare function assertIterable<T>(value: any, errorMessage?: string): value is Iterable<T>;
|
|
159
87
|
/**
|
|
160
88
|
* Returns true if `value` is a plain JavaScript object.
|
|
161
89
|
*/
|
|
@@ -164,28 +92,4 @@ export declare function isObject(value: unknown): value is Record<string | numbe
|
|
|
164
92
|
* Throws a TypeError unless `value` is a plain JavaScript object.
|
|
165
93
|
*/
|
|
166
94
|
export declare function assertObject(value: unknown, errorMessage?: string): value is object;
|
|
167
|
-
/**
|
|
168
|
-
* Returns true if `value` is equal to `null`.
|
|
169
|
-
*/
|
|
170
|
-
export declare function isNull(value: unknown): value is null;
|
|
171
|
-
/**
|
|
172
|
-
* Throws a TypeError unless `value` is equal to `null`.
|
|
173
|
-
*/
|
|
174
|
-
export declare function assertNull(value: unknown, errorMessage?: string): value is null;
|
|
175
|
-
/**
|
|
176
|
-
* Returns true if `value` is equal to `undefined`.
|
|
177
|
-
*/
|
|
178
|
-
export declare function isUndefined(value: unknown): value is undefined;
|
|
179
|
-
/**
|
|
180
|
-
* Throws a TypeError unless `value` is equal to `undefined`.
|
|
181
|
-
*/
|
|
182
|
-
export declare function assertUndefined(value: unknown, errorMessage?: string): value is undefined;
|
|
183
|
-
/**
|
|
184
|
-
* Returns true if `value` is equal to `null` or `undefined`.
|
|
185
|
-
*/
|
|
186
|
-
export declare function isEmpty(value: unknown): value is void;
|
|
187
|
-
/**
|
|
188
|
-
* Throws a TypeError unless `value` is equal to `null` or `undefined`.
|
|
189
|
-
*/
|
|
190
|
-
export declare function assertEmpty(value: unknown, errorMessage?: string): value is void;
|
|
191
95
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/types.d.ts
CHANGED
|
@@ -30,7 +30,6 @@ export interface ElementProps {
|
|
|
30
30
|
/**
|
|
31
31
|
* Object of event listeners.
|
|
32
32
|
*/
|
|
33
|
-
eventListeners?: OptionalProperty<Record<string, EventHandler<Event>>>;
|
|
34
33
|
/**
|
|
35
34
|
* CSS classes to be applied to this element. In addition to the standard space-separated list of class names,
|
|
36
35
|
* this property also supports a class map object with class names as keys and booleans as values.
|
package/dist/utils.d.ts
CHANGED
|
@@ -26,7 +26,10 @@ export declare function merge(one: unknown, two: unknown): any;
|
|
|
26
26
|
* @param object - An object to clone without the omitted keys.
|
|
27
27
|
*/
|
|
28
28
|
export declare function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any>;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Takes any string and returns an OKLCH color.
|
|
31
|
+
*/
|
|
32
|
+
export declare function okhash(value: string): string;
|
|
30
33
|
export type MatcherFunction = (value: string) => boolean;
|
|
31
34
|
/**
|
|
32
35
|
* Parses a filter string into a matcher function.
|
package/docs/views.md
CHANGED
|
@@ -199,92 +199,6 @@ function ExampleView(props, ctx) {
|
|
|
199
199
|
}
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
-
### Context Variables
|
|
203
|
-
|
|
204
|
-
> TODO: Write about context state (`.get` and `.set`)
|
|
205
|
-
|
|
206
|
-
### Context Events
|
|
207
|
-
|
|
208
|
-
Events can be emitted from views and [stores](./stores.md) using `ctx.emit(eventName, data)`. Context events will bubble up the view tree just like native browser events bubble up the DOM tree.
|
|
209
|
-
|
|
210
|
-
```js
|
|
211
|
-
ctx.on("eventName", (event) => {
|
|
212
|
-
event.type; // "eventName"
|
|
213
|
-
event.detail; // the value that was passed when the event was emitted (or undefined if none)
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
ctx.once("eventName", (event) => {
|
|
217
|
-
// Receive only once and then stop listening.
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// Remove a listener by reference.
|
|
221
|
-
// Listener must be the same exact function that was passed to `on` or `once`.
|
|
222
|
-
ctx.off("eventName", listener);
|
|
223
|
-
|
|
224
|
-
// Emit an event.
|
|
225
|
-
ctx.emit("eventName", { value: "This object will be exposed as event.detail" });
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Bubbling
|
|
229
|
-
|
|
230
|
-
Events bubble up through the view tree unless `stopPropagation` is called by a listener. In the following example we have a view listening for events that are emitted from a child of a child.
|
|
231
|
-
|
|
232
|
-
```js
|
|
233
|
-
function ParentView(props, ctx) {
|
|
234
|
-
// Listen for greetings that bubble up.
|
|
235
|
-
ctx.on("greeting", (event) => {
|
|
236
|
-
const { name, message } = event.detail;
|
|
237
|
-
|
|
238
|
-
ctx.log(`${name} says "${message}"!`);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
return (
|
|
242
|
-
<div>
|
|
243
|
-
<ChildView />
|
|
244
|
-
</div>
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function ChildView(props, ctx) {
|
|
249
|
-
ctx.on("greeting", (event, { name, message }) => {
|
|
250
|
-
// Let's perform some censorship.
|
|
251
|
-
// If an event is stopped it not bubble any further and ParentView won't see it.
|
|
252
|
-
if (containsForbiddenKnowledge(message)) {
|
|
253
|
-
event.stop();
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
return (
|
|
258
|
-
<div>
|
|
259
|
-
<ChildOfChildView />
|
|
260
|
-
</div>
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function ChildOfChildView(props, ctx) {
|
|
265
|
-
return (
|
|
266
|
-
<form
|
|
267
|
-
onSubmit={(e) => {
|
|
268
|
-
// This is a browser event handler.
|
|
269
|
-
// Browser events can't be listened for with `this.on`, but we can emit context events from here that can be.
|
|
270
|
-
e.preventDefault();
|
|
271
|
-
|
|
272
|
-
// Pluck the values from the form.
|
|
273
|
-
const name = e.currentTarget.name.value;
|
|
274
|
-
const message = e.currentTarget.message.value;
|
|
275
|
-
|
|
276
|
-
// Emit!
|
|
277
|
-
ctx.emit("greeting", { name, message });
|
|
278
|
-
}}
|
|
279
|
-
>
|
|
280
|
-
<input type="text" name="name" placeholder="Your Name" />
|
|
281
|
-
<input type="text" name="message" placeholder="Your Message" />
|
|
282
|
-
<button type="submit">Submit</button>
|
|
283
|
-
</form>
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
202
|
---
|
|
289
203
|
|
|
290
204
|
End.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Context routing
|
|
2
|
+
|
|
3
|
+
I had an idea to integrate routing back into views instead of having a separate router. I originally had it work this way but I wasn't good enough to pull it off then.
|
|
4
|
+
|
|
5
|
+
Here's how it might look:
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
function Example(props, ctx) {
|
|
9
|
+
return <div>
|
|
10
|
+
<header>
|
|
11
|
+
<h1>Some kind of layout.</h1>
|
|
12
|
+
</header>
|
|
13
|
+
<main>
|
|
14
|
+
{ctx.router([
|
|
15
|
+
// Route path is relative to parent routes.
|
|
16
|
+
// Nested route definitions are a thing of the past.
|
|
17
|
+
// View could define its own routes.
|
|
18
|
+
{ path: "something/*", view: SomethingView }
|
|
19
|
+
])}
|
|
20
|
+
</main>
|
|
21
|
+
<div>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
html`
|
|
25
|
+
<${Router}>
|
|
26
|
+
<${Route} path="something/*">
|
|
27
|
+
This child content isn't materialized until the route matches.
|
|
28
|
+
<${SomethingView} />
|
|
29
|
+
<//>
|
|
30
|
+
<//>
|
|
31
|
+
`
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This removes the need to import and define the whole app at the top level. You can also add routes as you need them when prototyping.
|
|
35
|
+
|
|
36
|
+
Route matching would be done by forwarding the wildcard portion of a match to child routers. Routers would be stored on the element context.
|
|
37
|
+
|
|
38
|
+
Where would route info be stored then? It would have to be on the context as well.
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
// Merged data from all parent segments.
|
|
42
|
+
ctx.route.params;
|
|
43
|
+
ctx.route.query;
|
|
44
|
+
ctx.route.path;
|
|
45
|
+
ctx.route.pattern;
|
|
46
|
+
|
|
47
|
+
ctx.go("/some/path");
|
|
48
|
+
ctx.back();
|
|
49
|
+
ctx.forward();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Thoughts
|
|
53
|
+
|
|
54
|
+
- Would eliminate the need for `ctx.outlet()`. Can pass children directly via `children` prop now.
|
|
55
|
+
- Would eliminate the need for `ViewElement` and `setChildView` method because a top level router no longer needs to call it.
|
|
56
|
+
- Couldn't do the current routing strategy to combining all routes into one flat list at the top level.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# What can we remove?
|
|
2
|
+
|
|
3
|
+
I still want to get this library with all its features down below 15kb. It's currently at 17.8kb. That said, I don't want to strip out things that are actually useful. The mission of this library is to be batteries-included, which implies some extra weight.
|
|
4
|
+
|
|
5
|
+
What can be removed without compromising the basics?
|
|
6
|
+
|
|
7
|
+
## Events?
|
|
8
|
+
|
|
9
|
+
> 1st ELIMINATED. We're at 16.77kb now.
|
|
10
|
+
|
|
11
|
+
If we have the ability to get contexts and call methods on them, isn't that just a better version of events?
|
|
12
|
+
|
|
13
|
+
## Logger / Built-in Crash View
|
|
14
|
+
|
|
15
|
+
> REDUCED! Removed simple-color-hash in favor of custom OKLCH hash and we're down to 15.9kb.
|
|
16
|
+
|
|
17
|
+
Logger could be a different package. Crashes could be handled by a crash handler you attach.
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
Dolla.onCrash((error) => {
|
|
21
|
+
// Do what you will with this error.
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## HTTP Client?
|
|
26
|
+
|
|
27
|
+
Do we really need this? It's kind of a nice wrapper but the only thing I use the middleware for is to add auth headers for API calls, and it's trivial to write a function around `fetch` that does that. No need for the complexity of middleware.
|
|
28
|
+
|
|
29
|
+
Not really. Fetch is hella basic. I just tried to write my own trivial wrapper around fetch and it took a little too much thought. I don't want to do that for every project. Adding middleware to authenticate feels trivial with `http`.
|
|
30
|
+
|
|
31
|
+
## Markup?
|
|
32
|
+
|
|
33
|
+
Can JSX and `html` return DOM nodes directly? Not really, because views need to be mounted and unmounted like DOM nodes but they don't have the same API. Although I could define a minimal DOM-compatible API so that DOM nodes could directly work.
|