@manyducks.co/dolla 2.0.0-alpha.6 → 2.0.0-alpha.61
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 +86 -591
- package/dist/core/context.d.ts +142 -0
- package/dist/core/env.d.ts +3 -0
- package/dist/core/index.d.ts +21 -0
- package/dist/core/logger.d.ts +42 -0
- package/dist/core/logger.test.d.ts +0 -0
- package/dist/core/markup.d.ts +104 -0
- package/dist/core/markup.test.d.ts +0 -0
- package/dist/core/mount.d.ts +15 -0
- package/dist/core/mount.test.d.ts +0 -0
- package/dist/core/nodes/_markup.d.ts +36 -0
- package/dist/core/nodes/dom.d.ts +13 -0
- package/dist/core/nodes/dynamic.d.ts +22 -0
- package/dist/core/nodes/element.d.ts +25 -0
- package/dist/core/nodes/portal.d.ts +18 -0
- package/dist/core/nodes/repeat.d.ts +27 -0
- package/dist/core/nodes/view.d.ts +25 -0
- package/dist/core/ref.d.ts +18 -0
- package/dist/core/ref.test.d.ts +1 -0
- package/dist/core/signals.d.ts +58 -0
- package/dist/core/signals.test.d.ts +1 -0
- package/dist/{views → core/views}/default-crash-view.d.ts +11 -4
- package/dist/core/views/fragment.d.ts +7 -0
- package/dist/fragment-BahD_BJA.js +7 -0
- package/dist/fragment-BahD_BJA.js.map +1 -0
- package/dist/hooks/index.d.ts +64 -0
- package/dist/hooks/index.test.d.ts +1 -0
- package/dist/hooks.js +69 -0
- package/dist/hooks.js.map +1 -0
- package/dist/{modules/http.d.ts → http/index.d.ts} +3 -5
- package/dist/http.js +163 -0
- package/dist/http.js.map +1 -0
- package/dist/i18n/index.d.ts +134 -0
- package/dist/i18n.js +318 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.js +98 -1388
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.d.ts +3 -2
- package/dist/jsx-dev-runtime.js +5 -12
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +4 -3
- package/dist/jsx-runtime.js +9 -15
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/logger-Bl496yfY.js +91 -0
- package/dist/logger-Bl496yfY.js.map +1 -0
- package/dist/markup-CX27GJ1M.js +1030 -0
- package/dist/markup-CX27GJ1M.js.map +1 -0
- package/dist/ref-BD79iqlg.js +15 -0
- package/dist/ref-BD79iqlg.js.map +1 -0
- package/dist/router/index.d.ts +2 -0
- package/dist/router/router.d.ts +160 -0
- package/dist/{routing.d.ts → router/router.utils.d.ts} +17 -3
- package/dist/router/router.utils.test.d.ts +1 -0
- package/dist/router-CjCkk4dA.js +543 -0
- package/dist/router-CjCkk4dA.js.map +1 -0
- package/dist/router.js +8 -0
- package/dist/router.js.map +1 -0
- package/dist/signals-gCwiIe5X.js +450 -0
- package/dist/signals-gCwiIe5X.js.map +1 -0
- package/dist/typeChecking-CbltMOUt.js +71 -0
- package/dist/typeChecking-CbltMOUt.js.map +1 -0
- package/dist/typeChecking.d.ts +2 -98
- package/dist/typeChecking.test.d.ts +1 -0
- package/dist/types.d.ts +98 -25
- package/dist/utils.d.ts +20 -3
- package/docs/hooks.md +211 -0
- package/docs/http.md +29 -0
- package/docs/i18n.md +43 -0
- package/docs/index.md +10 -0
- package/docs/markup.md +16 -0
- package/docs/mixins.md +32 -0
- package/docs/ref.md +93 -0
- package/docs/router.md +80 -0
- package/docs/setup.md +31 -0
- package/docs/signals.md +166 -0
- package/docs/state.md +141 -0
- package/docs/stores.md +62 -0
- package/docs/views.md +208 -0
- package/examples/webcomponent/index.html +14 -0
- package/examples/webcomponent/main.js +165 -0
- package/index.d.ts +2 -2
- package/notes/TODO.md +6 -0
- package/notes/atomic.md +452 -0
- package/notes/context-routes.md +61 -0
- package/notes/custom-nodes.md +17 -0
- package/notes/effection-idea.md +34 -0
- package/notes/elimination.md +33 -0
- package/notes/mixins.md +22 -0
- package/notes/molecule.md +35 -0
- package/notes/observable.md +180 -0
- package/notes/readme-scratch.md +45 -7
- package/notes/route-middleware.md +42 -0
- package/notes/scratch.md +353 -6
- package/notes/splitting.md +5 -0
- package/notes/stores.md +79 -0
- package/package.json +31 -12
- package/vite.config.js +6 -11
- package/build.js +0 -34
- package/dist/index.d.ts +0 -21
- package/dist/markup.d.ts +0 -100
- package/dist/modules/dolla.d.ts +0 -111
- package/dist/modules/language.d.ts +0 -41
- package/dist/modules/render.d.ts +0 -17
- package/dist/modules/router.d.ts +0 -152
- package/dist/nodes/cond.d.ts +0 -26
- package/dist/nodes/html.d.ts +0 -31
- package/dist/nodes/observer.d.ts +0 -29
- package/dist/nodes/outlet.d.ts +0 -22
- package/dist/nodes/portal.d.ts +0 -19
- package/dist/nodes/repeat.d.ts +0 -34
- package/dist/nodes/text.d.ts +0 -19
- package/dist/passthrough-CW8Ezjg-.js +0 -1244
- package/dist/passthrough-CW8Ezjg-.js.map +0 -1
- package/dist/state.d.ts +0 -101
- package/dist/view.d.ts +0 -50
- package/dist/views/passthrough.d.ts +0 -5
- package/tests/state.test.js +0 -135
- /package/dist/{routing.test.d.ts → core/context.test.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough-CW8Ezjg-.js","sources":["../node_modules/simple-color-hash/lib/index.js","../src/typeChecking.ts","../src/utils.ts","../src/state.ts","../node_modules/htm/mini/index.module.js","../src/nodes/cond.ts","../node_modules/nanoid/url-alphabet/index.js","../node_modules/nanoid/index.browser.js","../src/nodes/html.ts","../src/nodes/observer.ts","../src/nodes/outlet.ts","../src/nodes/portal.ts","../src/view.ts","../src/nodes/repeat.ts","../src/nodes/text.ts","../src/markup.ts","../src/views/passthrough.ts"],"sourcesContent":["\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:!0});var _slicedToArray=function(){function a(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!(b&&c.length===b));d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h[\"return\"]&&h[\"return\"]()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),rgbToHex=function(a){return a.reduce(function(a,b){return 16>b?a+\"0\"+b.toString(16):a+b.toString(16)},\"#\")},hslToRgb=function(a,b,c){var d=.5>c?c*(1+b):c+b-c*b,e=2*c-d,f=function(a,b,c){var d=Math.round,e=0>c?c+1:1<c?c-1:c;return e=e<1/6?a+6*(b-a)*e:e<1/2?b:e<2/3?a+6*(b-a)*(2/3-e):a,d(255*e)},g=f(e,d,a+1/3),h=f(e,d,a),i=f(e,d,a-1/3);return[g,h,i]},hslGeneration=function(a,b,c,d){var e=a%1007/1007,f=function(a,b,c){return a*(c-b)+b},g=f(e,b.min,b.max),h=f(e,c.min,c.max),i=f(e,d.max,d.min);// 1007 is a prime\nreturn[g,h,i]},standardHashFunction=function(a){return a.split(\"\").reduce(function(a,b,c){return a*b.charCodeAt(0)*c+1},1)},generateColorHash=function(a){var b=a.str,c=a.hue,d=c===void 0?{min:0,max:360}:c,e=a.sat,f=e===void 0?{min:.35,max:.65}:e,g=a.light,h=g===void 0?{min:.3,max:.7}:g,i=a.hashFunction,j=i===void 0?standardHashFunction:i,k=a.scheme,l=k===void 0?\"hex\":k,m=hslGeneration(j(b),d,f,h),n=_slicedToArray(m,3),o=n[0],p=n[1],q=n[2],r=hslToRgb(o/360,p,q),s=rgbToHex(r);if(\"hsl\"===l)return[o,p,q];return\"rgb\"===l?r:s};/**\n *\n * @param {Array} RGBArray\n *//**\n *\n * @param {number} H Hue\n * @param {number} S Saturation\n * @param {number} L Lightness\n *//**\n *\n * @param {string} hash generated hash\n * @param {number} hue Hue\n * @param {number} sat Saturation\n * @param {number} light Lightness\n *//**\n *\n * @param {string} str string to hash\n *//**\n *\n * @param {Object} {\n * str: String to be hashed,\n * hue: { min, max } values (in deg)\n * sat: { min, max } values (0 to 1)\n * light: { min, max } values (0 to 1),\n * hashFunction: Custom hash function,\n * scheme: return scheme\n * }\n */exports.default=generateColorHash,module.exports=exports.default;","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 `Type.of` can return.\n | \"null\"\n | \"array\"\n | \"class\"\n | \"promise\"\n | \"NaN\";\n\n/**\n * Represents an object that can be called with `new` to produce a T.\n */\ntype Factory<T> = { new (): T };\n\n/**\n * Extends `typeof` operator with more specific and useful type distinctions.\n */\nexport function typeOf(value: unknown): TypeNames {\n if (value === undefined) {\n return \"undefined\";\n }\n\n if (value === null) {\n return \"null\";\n }\n\n const type = typeof value;\n\n switch (type) {\n case \"number\":\n if (isNaN(value as any)) {\n return \"NaN\";\n }\n return \"number\";\n case \"function\":\n if (isClass(value)) {\n return \"class\";\n }\n\n return type;\n case \"object\":\n if (isArray(value)) {\n return \"array\";\n }\n\n if (isPromise(value)) {\n return \"promise\";\n }\n\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 a function that takes a `value` and ensures that it is an array for which `check` returns true for every item.\n *\n * @param check - Function to check items against.\n */\nexport function isArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];\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 */\nexport function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[];\n\nexport function isArrayOf<T>(...args: unknown[]) {\n const check = args[0] as (item: unknown) => boolean;\n\n const test = (value: unknown): value is T[] => {\n return isArray(value) && value.every((item) => check(item));\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 it is an array for which `check` returns true for every item.\n *\n * @param check - Function to check items against.\n */\nexport function assertArrayOf<T>(check: (item: unknown) => boolean): (value: unknown) => value is T[];\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\nexport function assertArrayOf<T>(...args: unknown[]) {\n const check = args[0] as (item: unknown) => boolean;\n const message = isString(args[2]) ? args[2] : \"Expected an array of valid items. Got type: %t, value: %v\";\n\n const test = (value: unknown): value is T[] => {\n if (isArray(value) && value.every((item) => check(item))) {\n return true;\n }\n\n throw new TypeError(formatError(value, message));\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 equal to `true` or `false`.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return value === true || value === false;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `true` or `false`.\n */\nexport function assertBoolean(value: unknown, errorMessage?: string): value is boolean {\n if (isBoolean(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a boolean. 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\" && !isClass(value);\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 true if `value` implements the Promise protocol.\n * This matches true instances of Promise as well as any object that\n * implements `next`, `catch` and `finally` methods.\n *\n * To strictly match instances of Promise, use `isInstanceOf(Promise)`.\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n if (value == null) return false;\n\n const obj = value as any;\n\n return obj instanceof Promise || (isFunction(obj.then) && isFunction(obj.catch) && isFunction(obj.finally));\n}\n\n/**\n * Throws a TypeError unless `value` implements the Promise protocol.\n * This matches true instances of Promise as well as any object that\n * implements `next`, `catch` and `finally` methods.\n *\n * To strictly allow only instances of Promise, use `Type.assertInstanceOf(Promise)`.\n */\nexport function assertPromise<T = unknown>(value: unknown, errorMessage?: string): value is Promise<T> {\n if (isPromise(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a promise. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a class.\n */\nexport function isClass(value: unknown): value is { new (): unknown } {\n return typeof value === \"function\" && /^\\s*class\\s+/.test(value.toString());\n}\n\n/**\n * Throws a TypeError unless `value` is a class.\n */\nexport function assertClass(value: unknown, errorMessage?: string): value is { new (): unknown } {\n if (isClass(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a class. 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 Map.\n */\nexport function isMap<K = unknown, V = unknown>(value: any): value is Map<K, V> {\n return value instanceof Map;\n}\n\n/**\n * Throws a TypeError unless `value` is a Map.\n */\nexport function assertMap<K = unknown, V = unknown>(value: any, errorMessage?: string): value is Map<K, V> {\n if (isMap(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a Map. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a Set.\n */\nexport function isSet<T = unknown>(value: any): value is Set<T> {\n return value instanceof Set;\n}\n\n/**\n * Throws a TypeError if `value` is not a Set.\n */\nexport function assertSet<T = unknown>(value: any, errorMessage?: string): value is Set<T> {\n if (isSet(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a Set. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` implements the Iterable protocol.\n */\nexport function isIterable<T>(value: any): value is Iterable<T> {\n if (value == null) {\n return false;\n }\n\n // Must have a [Symbol.iterator] function that returns an iterator.\n if (!isFunction(value[Symbol.iterator])) {\n return false;\n }\n\n const iterator = value[Symbol.iterator]();\n\n // Iterator must implement the iterator protocol.\n if (!isFunction(iterator.next)) {\n return false;\n }\n\n // We have to assume next() returns the correct object.\n // We can't call it to make sure because we don't want to cause side effects.\n return true;\n}\n\n/**\n * Throws a TypeError unless `value` implements the Iterable protocol.\n */\nexport function assertIterable<T>(value: any, errorMessage?: string): value is Iterable<T> {\n if (isIterable(value)) {\n return true;\n }\n\n throw new TypeError(\n formatError(\n value,\n errorMessage ?? \"Expected an object that implements the iterable protocol. Got type: %t, value: %v\"\n )\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 * Returns true if `value` is equal to `null`.\n */\nexport function isNull(value: unknown): value is null {\n return value === null;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `null`.\n */\nexport function assertNull(value: unknown, errorMessage?: string): value is null {\n if (value === null) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected null. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is equal to `undefined`.\n */\nexport function isUndefined(value: unknown): value is undefined {\n return value === undefined;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `undefined`.\n */\nexport function assertUndefined(value: unknown, errorMessage?: string): value is undefined {\n if (value === undefined) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected undefined. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is equal to `null` or `undefined`.\n */\nexport function isEmpty(value: unknown): value is void {\n return value === null || value === undefined;\n}\n\n/**\n * Throws a TypeError unless `value` is equal to `null` or `undefined`.\n */\nexport function assertEmpty(value: unknown, errorMessage?: string): value is void {\n if (value == null) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected null or undefined. 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 colorHash from \"simple-color-hash\";\nimport { isState } from \"./state.js\";\nimport { isObject } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\nfunction isPlainObject<T = { [name: string]: any }>(value: any): value is T {\n return (\n value != null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.getPrototypeOf({})\n );\n}\n\nexport function deepEqual(one: any, two: any) {\n if (one === two) {\n return true;\n }\n\n if (isState(one) || isState(two)) {\n return false;\n }\n\n if (isPlainObject(one) && isPlainObject(two)) {\n const keysOne = Object.keys(one);\n const keysTwo = Object.keys(two);\n\n if (keysOne.length !== keysTwo.length) {\n return false;\n }\n\n for (const key in one) {\n if (!deepEqual(one[key], two[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (Array.isArray(one) && Array.isArray(two)) {\n if (one.length !== two.length) {\n return false;\n }\n\n for (const index in one) {\n if (!deepEqual(one[index], two[index])) {\n return false;\n }\n }\n\n return true;\n }\n\n return one === two;\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\nexport function getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n\nexport function colorFromString(value: string) {\n return colorHash({\n str: value,\n sat: { min: 0.35, max: 0.55 },\n light: { min: 0.6, max: 0.6 },\n });\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","import { deepEqual, noOp } from \"./utils\";\n\n/*==============================*\\\n|| Types ||\n\\*==============================*/\n\n/**\n * Stops the observer that created it when called.\n */\nexport type StopFunction = () => void;\n\ntype Unwrapped<T> = T extends State<infer V> ? V : T;\n\n/**\n * Extracts value types from an array of states.\n */\nexport type StateValues<T extends MaybeState<any>[]> = {\n [K in keyof T]: Unwrapped<T[K]>;\n};\n\nexport interface CreateStateOptions<T> {\n /**\n * Determines if the `next` value is equal to the `current` value.\n * If this function returns true, watchers will be notified of changes. If it returns false, watchers will not be notified.\n * By default equality is defined as deep equality.\n *\n * @param next - The new value being set.\n * @param current - The current value being replaced.\n */\n equality?: (next: T, current: T) => boolean;\n}\n\nexport interface WatchOptions<T> {\n /**\n * If true the watch callback will be called for the first time on the next change.\n * By default the callback is called immediately with the state's current value.\n */\n lazy?: boolean;\n}\n\nexport interface State<T> {\n /**\n * Returns the current value.\n */\n get(): T;\n\n /**\n * Watch this state's value with a `callback` function.\n * The `callback` is only called if the value is not equal to the current value.\n *\n * > NOTE: If watching a state inside a view, use the `.watch` method on the `ViewContext`. That method will automatically\n * clean up all watchers when the view is disconnected. Watchers created here must be cleaned up manually.\n */\n watch(callback: (value: T) => void, options?: WatchOptions<T>): StopFunction;\n}\n\n/** A new value for a state, or a callback that receives the current value and returns a new one. */\nexport type SetAction<I, O = I> = O | ((current: I) => O);\n\n/** Callback that updates the value of a state. */\nexport type Setter<I, O = I> = (value: SetAction<I, O>) => void;\n\nexport type MaybeState<T> = State<T> | T;\n\n/**\n * A state and setter in one. Useful for passing states that are intended to be updated by subviews.\n */\nexport interface SettableState<I, O = I> extends State<I> {\n /**\n * Updates the state's value.\n */\n set(next: O): void;\n\n /**\n * Takes a callback that recieves the state's current value and returns a new one.\n */\n set(callback: (current: I) => O): void;\n}\n\n/*==============================*\\\n|| Utils ||\n\\*==============================*/\n\nexport function isState<T>(value: any): value is State<T> {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n\n if (typeof value[\"get\"] !== \"function\") {\n return false;\n }\n\n if (typeof value[\"watch\"] !== \"function\") {\n return false;\n }\n\n return true;\n}\n\nexport function isSettableState<T>(value: any): value is SettableState<T> {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n\n if (typeof value[\"set\"] !== \"function\") {\n return false;\n }\n\n if (typeof value[\"get\"] !== \"function\") {\n return false;\n }\n\n if (typeof value[\"watch\"] !== \"function\") {\n return false;\n }\n\n return true;\n}\n\n/**\n * Retrieves a plain value from a variable that may be a state.\n */\nexport function valueOf<T>(value: MaybeState<T>): T {\n if (isState(value)) {\n return value.get();\n } else {\n return value;\n }\n}\n\n/**\n * Ensures a variable that may be a state or plain value is a state.\n */\nexport function toState<T>(value: MaybeState<T>): State<T> {\n if (isSettableState<T>(value)) {\n return {\n get: value.get,\n watch: value.watch,\n };\n } else if (isState<T>(value)) {\n return value;\n } else {\n return {\n get() {\n return value;\n },\n watch(callback, options = {}) {\n if (!options?.lazy) {\n callback(value);\n }\n return noOp;\n },\n };\n }\n}\n\n/*==============================*\\\n|| State ||\n\\*==============================*/\n\n/**\n * Creates a SettableState.\n */\nexport function createSettableState<T>(initialValue: T, options?: CreateStateOptions<T>): SettableState<T>;\n\n/**\n * Creates a SettableState.\n */\nexport function createSettableState<T>(\n initialValue?: T,\n options?: CreateStateOptions<T | undefined>,\n): SettableState<T | undefined>;\n\nexport function createSettableState<T>(initialValue?: T, options?: CreateStateOptions<T>) {\n const [$value, setValue] = createState<any>(initialValue, options);\n return {\n get: $value.get,\n watch: $value.watch,\n set: setValue,\n };\n}\n\n/**\n * Join a state and its setter into a single SettableState object.\n */\nexport function toSettableState<I, O = I>($state: State<I>, setter: Setter<I, O>): SettableState<I, O> {\n return {\n get: $state.get,\n watch: $state.watch,\n set: setter,\n };\n}\n\n/**\n * Creates a Setter with custom logic provided by `callback`.\n */\nexport function createSetter<I, O = I>($state: State<I>, callback: (next: O, current: I) => void): Setter<I, O> {\n return function setValue(nextOrCallback) {\n const current = $state.get();\n let next: O;\n\n if (typeof nextOrCallback === \"function\") {\n next = (nextOrCallback as (current: I) => O)(current);\n } else {\n next = nextOrCallback;\n }\n\n callback(next, current);\n };\n}\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(initialValue: T, options?: CreateStateOptions<T>): [State<T>, Setter<T>];\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(\n initialValue?: T,\n options?: CreateStateOptions<T | undefined>,\n): [State<T | undefined>, Setter<T | undefined>];\n\n/**\n * Creates a state and setter.\n */\nexport function createState<T>(initialValue: T, options?: CreateStateOptions<T>): [State<T>, Setter<T>] {\n let currentValue = initialValue;\n let watchers: ((value: T) => void)[] = [];\n\n function notify() {\n for (const watcher of watchers) {\n watcher(currentValue);\n }\n }\n\n function equal(next: T, current: T): boolean {\n if (options?.equality) {\n return options.equality(next, current);\n } else {\n return deepEqual(next, current);\n }\n }\n\n const $value: State<T> = {\n get() {\n return valueOf(currentValue);\n },\n watch(callback, options) {\n // Add callback to watchers array to receive future values.\n watchers.push(callback);\n\n // Call immediately with current value unless lazy.\n if (!options?.lazy) {\n callback($value.get());\n }\n\n // Return a function to remove callback from watchers array.\n return function stop() {\n watchers.splice(watchers.indexOf(callback), 1);\n };\n },\n };\n\n function setValue(action: SetAction<T>) {\n let value: T;\n if (typeof action === \"function\") {\n value = (action as (next: T) => T)(currentValue);\n } else {\n value = action as T;\n }\n if (!equal(value, currentValue)) {\n currentValue = value;\n notify();\n }\n }\n\n return [$value, setValue];\n}\n\n/*==============================*\\\n|| Derived States ||\n\\*==============================*/\n\nexport interface DeriveOptions {\n equality?: (next: unknown, current: unknown) => boolean;\n}\n\nconst EMPTY = Symbol(\"EMPTY\");\n\nexport function derive<Inputs extends MaybeState<any>[], T>(\n states: [...Inputs],\n fn: (...currentValues: StateValues<Inputs>) => T | State<T>,\n options?: DeriveOptions,\n): State<T> {\n // Wrap any plain values in a static state.\n states = states.map(toState) as [...Inputs];\n\n let previousSourceValues = new Array(states.length).fill(EMPTY, 0, states.length) as StateValues<Inputs>;\n let currentValue: T | State<T>;\n\n /**\n * Watcher callbacks for the derived value.\n */\n let watchers: ((value: T) => void)[] = [];\n\n /**\n * True when sources are being watched.\n */\n let watching = false;\n\n /**\n * Stop functions from watched sources.\n */\n let stoppers: StopFunction[] = [];\n\n /**\n * Stop function for currentValue (used when currentValue is itself a state).\n */\n let stopWatchingCurrentValue: StopFunction | undefined;\n\n let rawCurrentValue: T;\n\n function notify(value = getCurrentValue()) {\n for (const watcher of watchers) {\n watcher(value);\n }\n }\n\n function equal(next: unknown, current: unknown): boolean {\n if (options?.equality) {\n return options.equality(next, current);\n } else {\n return deepEqual(next, current);\n }\n }\n\n function update() {\n const sourceValues = states.map((s) => s.get()) as StateValues<Inputs>;\n\n for (let i = 0; i < states.length; i++) {\n if (!equal(sourceValues[i], previousSourceValues[i])) {\n // Run derive function only if absolutely necessary.\n setCurrentValue(fn(...sourceValues));\n previousSourceValues = sourceValues;\n break;\n }\n }\n }\n\n function getCurrentValue() {\n // Current value will always be up to date when watching sources.\n if (!watching) {\n update();\n }\n rawCurrentValue = valueOf(currentValue);\n return rawCurrentValue;\n }\n\n function setCurrentValue(value: T | State<T>) {\n // If they're the same we don't need to do anything.\n if (value === currentValue) {\n return;\n }\n\n // Stop watching current value if it was a state.\n if (stopWatchingCurrentValue) {\n stopWatchingCurrentValue();\n stopWatchingCurrentValue = undefined;\n }\n\n currentValue = value;\n rawCurrentValue = valueOf(value);\n\n if (isState(value)) {\n if (watching) {\n stopWatchingCurrentValue = value.watch((current) => {\n // TODO: Can we handle infinite nested states?\n const raw = valueOf(current);\n if (!equal(raw, rawCurrentValue)) {\n rawCurrentValue = raw;\n notify(raw);\n }\n });\n }\n }\n }\n\n function startWatchingSources() {\n let startingSourceValues = [...previousSourceValues];\n\n for (let i = 0; i < states.length; i++) {\n const state = states[i] as State<any>;\n stoppers.push(\n state.watch((next) => {\n const previous = previousSourceValues[i];\n previousSourceValues[i] = next;\n\n if (watching && !equal(next, previous)) {\n setCurrentValue(fn(...previousSourceValues));\n notify(valueOf(currentValue));\n }\n }),\n );\n }\n\n watching = true;\n\n // Derive and notify watchers if values have changed since last derivation.\n for (let i = 0; i < states.length; i++) {\n if (!equal(previousSourceValues[i], startingSourceValues[i])) {\n setCurrentValue(fn(...previousSourceValues));\n notify(valueOf(currentValue));\n break;\n }\n }\n }\n\n function stopWatchingSources() {\n for (const stop of stoppers) {\n stop();\n }\n stoppers = [];\n\n // Stop watching current value if it was a state.\n if (stopWatchingCurrentValue) {\n stopWatchingCurrentValue();\n stopWatchingCurrentValue = undefined;\n }\n\n watching = false;\n }\n\n const $value: State<T> = {\n get() {\n return getCurrentValue();\n },\n watch(callback: (value: T) => void, options?: WatchOptions<T>) {\n if (!watching) {\n startWatchingSources();\n }\n\n watchers.push(callback);\n\n if (!options?.lazy) {\n callback(getCurrentValue());\n }\n\n return function stop() {\n watchers.splice(watchers.indexOf(callback), 1);\n\n if (watching && watchers.length === 0) {\n stopWatchingSources();\n }\n };\n },\n };\n\n return $value;\n}\n\nexport function watch<I extends MaybeState<any>[]>(\n states: [...I],\n fn: (...currentValues: StateValues<I>) => void,\n): StopFunction {\n if (states.length === 0) {\n throw new TypeError(`Expected at least one state.`);\n }\n\n if (states.some((s) => !isState(s))) {\n throw new TypeError(`All values must be states`);\n }\n\n states = states.map(toState) as [...I];\n\n if (states.length > 1) {\n return derive(states, fn).watch(() => null);\n } else {\n return states[0].watch(fn);\n }\n}\n","export default function(n){for(var l,e,s=arguments,t=1,r=\"\",u=\"\",a=[0],c=function(n){1===t&&(n||(r=r.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?a.push(n?s[n]:r):3===t&&(n||r)?(a[1]=n?s[n]:r,t=2):2===t&&\"...\"===r&&n?a[2]=Object.assign(a[2]||{},s[n]):2===t&&r&&!n?(a[2]=a[2]||{})[r]=!0:t>=5&&(5===t?((a[2]=a[2]||{})[e]=n?r?r+s[n]:s[n]:r,t=6):(n||r)&&(a[2][e]+=n?r+s[n]:r)),r=\"\"},h=0;h<n.length;h++){h&&(1===t&&c(),c(h));for(var i=0;i<n[h].length;i++)l=n[h][i],1===t?\"<\"===l?(c(),a=[a,\"\",null],t=3):r+=l:4===t?\"--\"===r&&\">\"===l?(t=1,r=\"\"):r=l+r[0]:u?l===u?u=\"\":r+=l:'\"'===l||\"'\"===l?u=l:\">\"===l?(c(),t=1):t&&(\"=\"===l?(t=5,e=r,r=\"\"):\"/\"===l&&(t<5||\">\"===n[h][i+1])?(c(),3===t&&(a=a[0]),t=a,(a=a[0]).push(this.apply(null,t.slice(1))),t=0):\" \"===l||\"\\t\"===l||\"\\n\"===l||\"\\r\"===l?(c(),t=2):r+=l),3===t&&\"!--\"===r&&(t=4,a=a[0])}return c(),a.length>2?a.slice(1):a[1]}\n","import { constructMarkup, toMarkup, type MarkupNode, type ElementContext, type Markup } from \"../markup.js\";\nimport { type State, type StopFunction } from \"../state.js\";\nimport { type Renderable } from \"../types.js\";\n\nexport interface ConditionalConfig {\n $predicate: State<any>;\n thenContent?: Renderable;\n elseContent?: Renderable;\n elementContext: ElementContext;\n}\n\nexport class Conditional implements MarkupNode {\n node: Node;\n endNode: Node;\n $predicate: State<any>;\n stopCallback?: StopFunction;\n thenContent?: Markup[];\n elseContent?: Markup[];\n connectedContent: MarkupNode[] = [];\n elementContext: ElementContext;\n\n initialUpdateHappened = false;\n previousValue?: any;\n\n constructor(config: ConditionalConfig) {\n this.$predicate = config.$predicate;\n this.thenContent = config.thenContent ? toMarkup(config.thenContent) : undefined;\n this.elseContent = config.elseContent ? toMarkup(config.elseContent) : undefined;\n this.elementContext = config.elementContext;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Conditional\");\n this.endNode = document.createComment(\"/Conditional\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n mount(parent: Node, after?: Node | undefined): void {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n if (this.elementContext.root.getEnv() === \"development\") {\n parent.insertBefore(this.endNode, this.node.nextSibling);\n }\n\n this.stopCallback = this.$predicate.watch((value) => {\n // Only update if value changed between truthy and falsy.\n if (!this.initialUpdateHappened || (value && !this.previousValue) || (!value && this.previousValue)) {\n this.update(value);\n this.initialUpdateHappened = true;\n this.previousValue = value;\n }\n });\n }\n }\n\n unmount(): void {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n for (const handle of this.connectedContent) {\n handle.unmount();\n }\n this.connectedContent = [];\n\n if (this.isMounted) {\n this.node.parentNode?.removeChild(this.node);\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n }\n\n update(value: any) {\n for (const handle of this.connectedContent) {\n handle.unmount();\n }\n this.connectedContent = [];\n\n if (this.node.parentNode == null) {\n return;\n }\n\n if (value && this.thenContent) {\n this.connectedContent = constructMarkup(this.elementContext, this.thenContent);\n } else if (!value && this.elseContent) {\n this.connectedContent = constructMarkup(this.elementContext, this.elseContent);\n }\n\n for (let i = 0; i < this.connectedContent.length; i++) {\n const handle = this.connectedContent[i];\n const previous = this.connectedContent[i - 1]?.node ?? this.node;\n handle.mount(this.node.parentNode, previous);\n }\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Conditional (${value ? \"truthy\" : \"falsy\"})`;\n }\n }\n}\n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import { nanoid } from \"nanoid\";\nimport { isRef, constructMarkup, type MarkupNode, type ElementContext, type Markup, type Ref } from \"../markup.js\";\nimport { isSettableState, isState, SettableState, type State, type StopFunction } from \"../state.js\";\nimport { isFunction, isNumber, isObject, isString } from \"../typeChecking.js\";\nimport { omit } from \"../utils.js\";\n\n//const eventHandlerProps = Object.values(eventPropsToEventNames).map((event) => \"on\" + event);\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 MarkupNode {\n node;\n props: Record<string, any>;\n children: MarkupNode[];\n stopCallbacks: StopFunction[] = [];\n elementContext;\n uniqueId = nanoid();\n\n // Track the ref so we can nullify it on unmount.\n ref?: Ref<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n canClickAway = false;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ tag, props, children, elementContext }: HTMLOptions) {\n elementContext = { ...elementContext };\n\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n elementContext.isSVG = true;\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 // Add unique ID to attributes for debugging purposes.\n if (elementContext.root.getEnv() === \"development\") {\n this.node.dataset.uniqueId = this.uniqueId;\n }\n\n // Store ref if present. Refs are set on mount.\n if (props.ref) {\n if (isRef(props.ref)) {\n this.ref = props.ref;\n } else {\n throw new Error(\"Expected ref to be a Ref object. Got: \" + props.ref);\n }\n }\n\n this.props = {\n ...omit([\"ref\", \"class\", \"className\"], props),\n class: props.className ?? props.class,\n };\n this.children = children ? constructMarkup(elementContext, children) : [];\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 for (const child of this.children) {\n child.mount(this.node);\n }\n\n this.applyProps(this.node, this.props);\n if (this.props.style) this.applyStyles(this.node, this.props.style, this.stopCallbacks);\n if (this.props.class) this.applyClasses(this.node, this.props.class, this.stopCallbacks);\n }\n\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n if (this.ref) {\n this.ref.node = this.node;\n }\n\n setTimeout(() => {\n this.canClickAway = true;\n }, 0);\n }\n\n unmount() {\n if (this.isMounted) {\n for (const child of this.children) {\n child.unmount();\n }\n\n if (this.ref) {\n this.ref.node = undefined;\n }\n\n this.node.parentNode?.removeChild(this.node);\n\n this.canClickAway = false;\n\n for (const stop of this.stopCallbacks) {\n stop();\n }\n this.stopCallbacks = [];\n }\n }\n\n getUpdateKey(type: string, value: string | number) {\n return `${this.uniqueId}:${type}:${value}`;\n }\n\n applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n const attachProp = <T>(value: State<T> | T, callback: (value: T) => void, updateKey: string) => {\n if (isState(value)) {\n this.stopCallbacks.push(\n value.watch((current) => {\n this.elementContext.root.render.update(() => {\n callback(current);\n }, updateKey);\n }),\n );\n } else {\n this.elementContext.root.render.update(() => {\n callback(value);\n }, updateKey);\n }\n };\n\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 attachProp(\n values[name],\n (current) => {\n if (current == null) {\n (element as any).removeAttribute(name);\n } else {\n (element as any).setAttribute(name, String(current));\n }\n },\n this.getUpdateKey(\"attr\", name),\n );\n }\n } else if (key === \"eventListeners\") {\n const values = value as Record<string, any>;\n\n for (const name in values) {\n const listener: (e: Event) => void = isState<(e: Event) => void>(value)\n ? (e: Event) => value.get()(e)\n : (value as (e: Event) => void);\n\n element.addEventListener(name, listener);\n\n this.stopCallbacks.push(() => {\n element.removeEventListener(name, listener);\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 (isState<(e: Event) => void>(value)) {\n value.get()(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.stopCallbacks.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (key === \"$$value\") {\n // Two-way binding for input values.\n if (!isSettableState(value)) {\n throw new TypeError(`$$value attribute must be a settable state. Got: ${value}`);\n }\n\n // Read value from state.\n attachProp(\n value,\n (current) => {\n (element as HTMLInputElement).value = String(current);\n },\n this.getUpdateKey(\"attr\", \"value\"),\n );\n\n // Propagate value to state.\n const listener: EventListener = (e) => {\n // Attempt to cast value back to the same type stored in the state.\n const updated = toTypeOf(value.get(), (e.currentTarget as HTMLInputElement).value);\n (value as SettableState<any>).set(updated);\n };\n\n element.addEventListener(\"input\", listener);\n\n this.stopCallbacks.push(() => {\n element.removeEventListener(\"input\", listener);\n });\n } else if (isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = isState<(e: Event) => void>(value)\n ? (e: Event) => value.get()(e)\n : (value as (e: Event) => void);\n\n element.addEventListener(eventName, listener);\n\n this.stopCallbacks.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 attachProp(\n value,\n (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n },\n this.getUpdateKey(\"attr\", key),\n );\n } else if (!privateProps.includes(key)) {\n if (this.elementContext.isSVG) {\n attachProp(\n value,\n (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n },\n this.getUpdateKey(\"attr\", key),\n );\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n attachProp(\n value,\n (current) => {\n (element as any)[key] = String(current);\n },\n this.getUpdateKey(\"prop\", key),\n );\n break;\n\n case \"for\":\n attachProp(\n value,\n (current) => {\n (element as any).htmlFor = current;\n },\n this.getUpdateKey(\"prop\", \"htmlFor\"),\n );\n break;\n\n case \"checked\":\n attachProp(\n value,\n (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n },\n this.getUpdateKey(\"prop\", \"checked\"),\n );\n break;\n\n // Attribute-aliased props\n case \"exportParts\":\n case \"part\":\n case \"translate\":\n case \"title\": {\n const _key = key.toLowerCase();\n attachProp(\n value,\n (current) => {\n if (current == undefined) {\n element.removeAttribute(_key);\n } else {\n element.setAttribute(_key, String(current));\n }\n },\n this.getUpdateKey(\"attr\", _key),\n );\n break;\n }\n\n case \"autocomplete\":\n case \"autocapitalize\":\n attachProp(\n value,\n (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 this.getUpdateKey(\"prop\", key),\n );\n break;\n\n default: {\n attachProp(\n value,\n (current) => {\n (element as any)[key] = current;\n },\n this.getUpdateKey(\"prop\", key),\n );\n break;\n }\n }\n }\n }\n }\n }\n\n applyStyles(element: HTMLElement | SVGElement, styles: unknown, stopCallbacks: StopFunction[]) {\n const propStopCallbacks: StopFunction[] = [];\n\n if (isState(styles)) {\n let unapply: () => void;\n\n const stop = styles.watch((current) => {\n this.elementContext.root.render.update(\n () => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, current, stopCallbacks);\n },\n this.getUpdateKey(\"styles\", \"*\"),\n );\n });\n\n stopCallbacks.push(stop);\n propStopCallbacks.push(stop);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isState(value)) {\n const stop = value.watch((current) => {\n this.elementContext.root.render.update(() => {\n if (current) {\n element.style.setProperty(name, String(current), priority);\n } else {\n element.style.removeProperty(name);\n }\n }); // NOTE: Not keyed; all update callbacks must run to apply all properties.\n });\n\n stopCallbacks.push(stop);\n propStopCallbacks.push(stop);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const stop of propStopCallbacks) {\n stop();\n stopCallbacks.splice(stopCallbacks.indexOf(stop), 1);\n }\n };\n }\n\n applyClasses(element: HTMLElement | SVGElement, classes: unknown, stopCallbacks: StopFunction[]) {\n const classStopCallbacks: StopFunction[] = [];\n\n if (isState(classes)) {\n let unapply: () => void;\n\n const stop = classes.watch((current) => {\n this.elementContext.root.render.update(\n () => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, current, stopCallbacks);\n },\n this.getUpdateKey(\"attr\", \"class\"),\n );\n });\n\n stopCallbacks.push(stop);\n classStopCallbacks.push(stop);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isState(value)) {\n const stop = value.watch((current) => {\n this.elementContext.root.render.update(() => {\n if (current) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n }); // NOTE: Not keyed; all update callbacks must run to apply all classes.\n });\n\n stopCallbacks.push(stop);\n classStopCallbacks.push(stop);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const stop of classStopCallbacks) {\n stop();\n stopCallbacks.splice(stopCallbacks.indexOf(stop), 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((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\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/**\n * Attempts to convert `source` to the same type as `target`.\n * Returns `source` as-is if conversion is not possible.\n */\nfunction toTypeOf<T>(target: T, source: unknown): T | unknown {\n const type = typeof target;\n\n if (type === \"string\") {\n return String(source);\n }\n\n if (type === \"number\") {\n return Number(source);\n }\n\n if (type === \"boolean\") {\n return Boolean(source);\n }\n\n return source;\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\"];\n","import {\n constructMarkup,\n isMarkup,\n isNode,\n isRenderable,\n mergeNodes,\n toMarkup,\n type ElementContext,\n type MarkupNode,\n} from \"../markup.js\";\nimport { watch, type State, type StopFunction } from \"../state.js\";\nimport { typeOf } from \"../typeChecking.js\";\nimport type { Renderable } from \"../types.js\";\n\ninterface ObserverOptions {\n elementContext: ElementContext;\n states: State<any>[];\n renderFn: (...values: any) => Renderable;\n}\n\n/**\n * Displays dynamic children without a parent element.\n */\nexport class Observer implements MarkupNode {\n node: Node;\n endNode: Node;\n connectedViews: MarkupNode[] = [];\n renderFn: (...values: any) => Renderable;\n elementContext;\n observerControls;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ states, renderFn, elementContext }: ObserverOptions) {\n this.elementContext = elementContext;\n this.renderFn = renderFn;\n\n this.node = document.createComment(\"Observer\");\n this.endNode = document.createComment(\"/Observer\");\n\n let _stop: StopFunction | undefined;\n\n this.observerControls = {\n start: () => {\n if (_stop != null) return;\n\n _stop = watch(states, (...values) => {\n const rendered = this.renderFn(...values);\n\n if (!isRenderable(rendered)) {\n console.error(rendered);\n throw new TypeError(\n `Observer received invalid value to render. Got type: ${typeOf(rendered)}, value: ${rendered}`,\n );\n }\n\n if (Array.isArray(rendered)) {\n this.update(...rendered);\n } else {\n this.update(rendered);\n }\n });\n },\n stop: () => {\n if (_stop == null) return;\n\n _stop();\n _stop = undefined;\n },\n };\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n this.observerControls.start();\n }\n }\n\n unmount() {\n this.observerControls.stop();\n\n if (this.isMounted) {\n this.cleanup();\n this.node.parentNode?.removeChild(this.node);\n }\n }\n\n cleanup() {\n while (this.connectedViews.length > 0) {\n this.connectedViews.pop()?.unmount();\n }\n }\n\n update(...children: Renderable[]) {\n this.cleanup();\n\n if (children == null || !this.isMounted) {\n return;\n }\n\n const nodes: MarkupNode[] = children.map((c) => {\n if (isNode(c)) {\n return c;\n } else if (isMarkup(c)) {\n return mergeNodes(constructMarkup(this.elementContext, c));\n } else {\n return mergeNodes(constructMarkup(this.elementContext, toMarkup(c)));\n }\n });\n\n for (const node of nodes) {\n const previous = this.connectedViews.at(-1)?.node || this.node;\n\n node.mount(this.node.parentNode!, previous);\n\n this.connectedViews.push(node);\n }\n\n // Move marker comment node to after last sibling in dev mode.\n if (this.elementContext.root.getEnv() === \"development\") {\n const lastNode = this.connectedViews.at(-1)?.node;\n if (this.endNode.previousSibling !== lastNode) {\n this.node.parentNode!.insertBefore(this.endNode, lastNode?.nextSibling ?? null);\n }\n }\n }\n}\n","import { type MarkupNode, type ElementContext } from \"../markup.js\";\nimport { type State, type StopFunction } from \"../state.js\";\n\nexport interface OutletConfig {\n $children: State<MarkupNode[]>;\n elementContext: ElementContext;\n}\n\n/**\n * Manages an array of DOMHandles.\n */\nexport class Outlet implements MarkupNode {\n node: Node;\n endNode: Node;\n $children: State<MarkupNode[]>;\n stopCallback?: StopFunction;\n connectedChildren: MarkupNode[] = [];\n elementContext: ElementContext;\n\n constructor(config: OutletConfig) {\n this.$children = config.$children;\n this.elementContext = config.elementContext;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Outlet\");\n this.endNode = document.createComment(\"/Outlet\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n get isMounted() {\n return this.node?.parentNode != null;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n this.stopCallback = this.$children.watch((children) => {\n this.update(children);\n });\n }\n }\n\n unmount() {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n if (this.isMounted) {\n for (const child of this.connectedChildren) {\n child.unmount();\n }\n this.connectedChildren = [];\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n }\n\n update(newChildren: MarkupNode[]) {\n for (const child of this.connectedChildren) {\n child.unmount();\n }\n\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i];\n const previous = i > 0 ? newChildren[i] : undefined;\n child.mount(this.node.parentElement!, previous?.node);\n }\n\n this.connectedChildren = newChildren;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Outlet (${newChildren.length} ${newChildren.length === 1 ? \"child\" : \"children\"})`;\n this.node.parentElement?.insertBefore(\n this.endNode,\n this.connectedChildren[this.connectedChildren.length - 1]?.node?.nextSibling ?? null,\n );\n }\n }\n}\n","import {\n mergeNodes,\n isNode,\n isMarkup,\n constructMarkup,\n toMarkup,\n type MarkupNode,\n type ElementContext,\n} from \"../markup.js\";\nimport { type Renderable } from \"../types.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 MarkupNode {\n config: PortalConfig;\n handle?: MarkupNode;\n\n get isMounted() {\n if (!this.handle) {\n return false;\n }\n return this.handle.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 (isNode(content)) {\n this.handle = content;\n } else if (isMarkup(content)) {\n this.handle = mergeNodes(constructMarkup(this.config.elementContext, content));\n } else {\n this.handle = mergeNodes(constructMarkup(this.config.elementContext, toMarkup(content)));\n }\n\n this.handle.mount(parent);\n }\n\n unmount() {\n if (this.handle?.isMounted) {\n this.handle.unmount();\n }\n }\n}\n","import { nanoid } from \"nanoid\";\nimport {\n type MarkupNode,\n type ElementContext,\n mergeNodes,\n isMarkup,\n createMarkup,\n type Markup,\n constructMarkup,\n} from \"./markup.js\";\nimport type { Logger } from \"./modules/dolla.js\";\nimport { createState, isState, type MaybeState, State, type StateValues, type StopFunction, watch } from \"./state.js\";\nimport { isArrayOf, typeOf } from \"./typeChecking.js\";\n\n/*=====================================*\\\n|| Types ||\n\\*=====================================*/\n\n/**\n * Any valid value that a View can return.\n */\nexport type ViewResult = Node | State<any> | Markup | Markup[] | null;\n\nexport type ViewFunction<P> = (props: P, context: ViewContext) => ViewResult;\n\n/**\n * A view that has been constructed into DOM nodes.\n */\nexport interface ViewNode extends MarkupNode {\n setChildren(children: MarkupNode[]): void;\n}\n\nexport interface ViewContext extends Logger {\n /**\n * A string ID unique to this view.\n */\n readonly uid: string;\n\n /**\n * Sets the name of the view's built in logger.\n */\n setName(name: string): void;\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 * Watch a set of states. The callback is called when any of the states receive a new value.\n * Watchers will be automatically stopped when this view is unmounted.\n */\n watch<T extends MaybeState<any>[]>(states: [...T], callback: (...values: StateValues<T>) => void): StopFunction;\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\nexport function constructView<P>(\n elementContext: ElementContext,\n view: ViewFunction<P>,\n props: P,\n children: Markup[] = [],\n): ViewNode {\n elementContext = { ...elementContext };\n const [$children, setChildren] = createState<MarkupNode[]>(constructMarkup(elementContext, children));\n\n let isMounted = false;\n\n // Lifecycle and observers\n const stopObserverCallbacks: (() => void)[] = [];\n const beforeMountCallbacks: (() => void | Promise<void>)[] = [];\n const onMountCallbacks: (() => any)[] = [];\n const beforeUnmountCallbacks: (() => void | Promise<void>)[] = [];\n const onUnmountCallbacks: (() => any)[] = [];\n\n const uniqueId = nanoid();\n\n const [$name, setName] = createState(view.name);\n const logger = elementContext.root.createLogger($name, { uid: uniqueId });\n\n const ctx: Pick<ViewContext, Exclude<keyof ViewContext, keyof Logger>> = {\n get uid() {\n return uniqueId;\n },\n\n setName(name) {\n setName(name);\n },\n\n beforeMount(callback) {\n beforeMountCallbacks.push(callback);\n },\n\n onMount(callback) {\n onMountCallbacks.push(callback);\n },\n\n beforeUnmount(callback) {\n beforeUnmountCallbacks.push(callback);\n },\n\n onUnmount(callback) {\n onUnmountCallbacks.push(callback);\n },\n\n watch(states, callback) {\n if (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 stop = watch(states, callback);\n stopObserverCallbacks.push(stop);\n return stop;\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 stop: StopFunction | undefined;\n let isStopped = false;\n onMountCallbacks.push(() => {\n if (!isStopped) {\n stop = watch(states, callback);\n stopObserverCallbacks.push(stop);\n }\n });\n return function stop() {\n if (stop != null) {\n isStopped = true;\n stop();\n }\n };\n }\n },\n\n outlet() {\n return createMarkup(\"$outlet\", { $children });\n },\n };\n\n Object.assign(ctx, logger);\n\n let rendered: MarkupNode | undefined;\n\n function initialize() {\n let result: unknown;\n\n try {\n result = view(props, ctx as ViewContext);\n } catch (error) {\n if (error instanceof Error) {\n logger.crash(error);\n }\n throw error;\n }\n\n if (result instanceof Promise) {\n throw new TypeError(`View function cannot return a Promise.`);\n }\n\n if (result === null) {\n // Do nothing.\n } else if (result instanceof Node) {\n rendered = mergeNodes(constructMarkup(elementContext, createMarkup(\"$node\", { value: result })));\n } else if (isMarkup(result) || isArrayOf<Markup>(isMarkup, result)) {\n rendered = mergeNodes(constructMarkup(elementContext, result));\n } else if (isState(result)) {\n rendered = mergeNodes(\n constructMarkup(elementContext, createMarkup(\"$observer\", { states: [result], renderFn: (x) => x })),\n );\n } else {\n const error = new TypeError(\n `Expected '${\n view.name\n }' function to return a DOM node, Markup element, Readable or null. Got: ${typeOf(result)}`,\n );\n logger.crash(error);\n }\n }\n\n return {\n get node() {\n return rendered?.node!;\n },\n\n get isMounted() {\n return isMounted;\n },\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 = isMounted;\n\n if (!wasConnected) {\n initialize();\n while (beforeMountCallbacks.length > 0) {\n const callback = beforeMountCallbacks.shift()!;\n callback();\n }\n }\n\n if (rendered) {\n rendered.mount(parent, after);\n }\n\n if (!wasConnected) {\n isMounted = true;\n\n requestAnimationFrame(() => {\n while (onMountCallbacks.length > 0) {\n const callback = onMountCallbacks.shift()!;\n callback();\n }\n });\n }\n },\n\n unmount() {\n while (beforeUnmountCallbacks.length > 0) {\n const callback = beforeUnmountCallbacks.shift()!;\n callback();\n }\n\n if (rendered) {\n rendered.unmount();\n }\n\n isMounted = false;\n\n while (onUnmountCallbacks.length > 0) {\n const callback = onUnmountCallbacks.shift()!;\n callback();\n }\n\n while (stopObserverCallbacks.length > 0) {\n const callback = stopObserverCallbacks.shift()!;\n callback();\n }\n },\n\n setChildren(children) {\n setChildren(children);\n },\n };\n}\n","import { type MarkupNode, type ElementContext } from \"../markup.js\";\nimport { createState, type State, type Setter, type StopFunction } from \"../state.js\";\nimport { constructView, type ViewContext, type ViewResult } from \"../view.js\";\n\n// ----- Types ----- //\n\ninterface RepeatOptions<T> {\n elementContext: ElementContext;\n $items: State<T[]>;\n keyFn: (value: T, index: number) => string | number | symbol;\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult;\n}\n\ntype ConnectedItem<T> = {\n key: any;\n $value: State<T>;\n setValue: Setter<T>;\n $index: State<number>;\n setIndex: Setter<number>;\n handle: MarkupNode;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupNode {\n node: Node;\n endNode: Node;\n $items: State<T[]>;\n stopCallback?: StopFunction;\n connectedItems: ConnectedItem<T>[] = [];\n elementContext;\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult;\n 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 }: RepeatOptions<T>) {\n this.elementContext = elementContext;\n\n this.$items = $items;\n this.renderFn = renderFn;\n this.keyFn = keyFn;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node = document.createComment(\"Repeat\");\n this.endNode = document.createComment(\"/Repeat\");\n } else {\n this.node = document.createTextNode(\"\");\n this.endNode = document.createTextNode(\"\");\n }\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n\n this.stopCallback = this.$items.watch((value) => {\n this._update(Array.from(value));\n });\n }\n }\n\n unmount() {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n if (this.isMounted) {\n this.node.parentNode?.removeChild(this.node);\n this.endNode.parentNode?.removeChild(this.endNode);\n }\n\n this._cleanup();\n }\n\n _cleanup() {\n for (const item of this.connectedItems) {\n item.handle.unmount();\n }\n this.connectedItems = [];\n }\n\n _update(value: T[]) {\n if (value.length === 0 || !this.isMounted) {\n return this._cleanup();\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.handle.unmount();\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.setValue(potential.value);\n connected.setIndex(potential.index);\n newItems[potential.index] = connected;\n } else {\n const [$value, setValue] = createState<T>(potential.value);\n const [$index, setIndex] = createState(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n $value,\n setValue,\n $index,\n setIndex,\n handle: constructView(this.elementContext, RepeatItemView, {\n $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 for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.handle.node ?? this.node;\n item.handle.mount(this.node.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n if (this.elementContext.root.getEnv() === \"development\") {\n this.node.textContent = `Repeat (${newItems.length} item${newItems.length === 1 ? \"\" : \"s\"})`;\n\n const lastItem = newItems.at(-1)?.handle.node ?? this.node;\n this.node.parentNode?.insertBefore(this.endNode, lastItem.nextSibling);\n }\n }\n}\n\ninterface RepeatItemProps {\n $value: State<any>;\n $index: State<number>;\n renderFn: ($value: State<any>, $index: State<number>, ctx: ViewContext) => ViewResult;\n}\n\nfunction RepeatItemView({ $value, $index, renderFn }: RepeatItemProps, ctx: ViewContext) {\n return renderFn($value, $index, ctx);\n}\n","import { type MarkupNode } from \"../markup.js\";\nimport { isState, type MaybeState, type StopFunction } from \"../state.js\";\n\ninterface Stringable {\n toString(): string;\n}\n\ninterface TextOptions {\n value: MaybeState<Stringable>;\n}\n\nexport class Text implements MarkupNode {\n node = document.createTextNode(\"\");\n value: MaybeState<Stringable> = \"\";\n stopCallback?: StopFunction;\n\n get isMounted() {\n return this.node.parentNode != null;\n }\n\n constructor({ value }: TextOptions) {\n this.value = value;\n }\n\n async mount(parent: Node, after: Node | null = null) {\n if (!this.isMounted) {\n if (isState<Stringable>(this.value)) {\n this.stopCallback = this.value.watch((value) => {\n this.update(value);\n });\n } else {\n this.update(this.value);\n }\n }\n\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n }\n\n async unmount() {\n if (this.isMounted) {\n if (this.stopCallback) {\n this.stopCallback();\n this.stopCallback = undefined;\n }\n\n this.node.parentNode!.removeChild(this.node);\n }\n }\n\n update(value?: Stringable) {\n if (value != null) {\n this.node.textContent = value.toString();\n } else {\n this.node.textContent = \"\";\n }\n }\n}\n","import htm from \"htm/mini\";\n\nimport type { Dolla } from \"./modules/dolla.js\";\nimport { Conditional } from \"./nodes/cond.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Observer } from \"./nodes/observer.js\";\nimport { Outlet } from \"./nodes/outlet.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { Repeat } from \"./nodes/repeat.js\";\nimport { Text } from \"./nodes/text.js\";\nimport { MaybeState, createState, isSettableState, isState, toState, type State } from \"./state.js\";\nimport { isArray, isArrayOf, isFunction, isNumber, isObject, isString } from \"./typeChecking.js\";\nimport type { Renderable, Stringable } from \"./types.js\";\nimport { constructView, type ViewFunction, type ViewContext, type ViewResult } from \"./view.js\";\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 /**\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\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\nconst MARKUP = Symbol(\"Markup\");\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupNode yet.\n */\nexport interface Markup {\n type: string | ViewFunction<any>;\n props?: Record<string, any>;\n children?: Markup[];\n}\n\n/**\n * A DOM node that has been constructed from a Markup object.\n */\nexport interface MarkupNode {\n readonly node?: Node;\n\n readonly isMounted: boolean;\n\n mount(parent: Node, after?: Node): void;\n\n unmount(): void;\n}\n\nexport function isMarkup(value: unknown): value is Markup {\n return isObject(value) && value[MARKUP] === true;\n}\n\nexport function isNode(value: unknown): value is MarkupNode {\n return isObject(value) && isFunction(value.connect) && isFunction(value.disconnect);\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 (x instanceof Node) {\n return createMarkup(\"$node\", { value: x });\n }\n\n if (x instanceof DOMNode) {\n return createMarkup(\"$node\", { value: x.node });\n }\n\n if (isMarkup(x)) {\n return x;\n }\n\n if (isString(x) || isNumber(x)) {\n return createMarkup(\"$text\", { value: x });\n }\n\n if (isState(x)) {\n return createMarkup(\"$observer\", {\n states: [x],\n renderFn: (x) => x,\n });\n }\n\n console.error(x);\n throw new TypeError(`Unexpected child type. Got: ${x}`);\n });\n}\n\nexport interface MarkupAttributes {\n $text: { value: MaybeState<Stringable> };\n $cond: { $predicate: State<any>; thenContent?: Renderable; elseContent?: Renderable };\n $repeat: {\n $items: State<any[]>;\n keyFn: (value: any, index: number) => string | number | symbol;\n renderFn: ($item: State<any>, $index: State<number>, c: ViewContext) => ViewResult;\n };\n $observer: {\n states: State<any>[];\n renderFn: (...items: any) => Renderable;\n };\n $outlet: {\n $children: State<MarkupNode[]>;\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 if (props != null) {\n _assertPropTypes(props as Record<string, any>);\n }\n\n return {\n [MARKUP]: true,\n type,\n props,\n children: toMarkup(children),\n };\n}\n\n/**\n * Throws an error if expectations based on naming conventions aren't met.\n */\nfunction _assertPropTypes(props: Record<string, any>) {\n if (props.ref) {\n if (!isRef(props.ref)) {\n console.warn(props.ref);\n throw new TypeError(`Prop 'ref' must be a Ref object. Got: ${props.ref}`);\n }\n }\n\n for (const key in props) {\n if (key.startsWith(\"$$\") && props[key] !== undefined) {\n if (!isSettableState(props[key])) {\n throw new TypeError(`Prop '${key}' is named as a SettableState but value is not. Got: ${props[key]}`);\n }\n } else if (key.startsWith(\"$\") && props[key] !== undefined) {\n if (!isState(props[key])) {\n throw new TypeError(`Prop '${key}' is named as a State but value is not. Got: ${props[key]}`);\n }\n }\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 `predicate` holds a truthy value, `thenContent` is displayed; when `predicate` holds a falsy value, `elseContent` is displayed.\n */\nexport function cond(predicate: MaybeState<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n const $predicate = toState(predicate);\n\n return createMarkup(\"$cond\", {\n $predicate,\n thenContent,\n elseContent,\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 repeat<T>(\n items: MaybeState<T[]>,\n keyFn: (value: T, index: number) => string | number | symbol,\n renderFn: ($value: State<T>, $index: State<number>, ctx: ViewContext) => ViewResult,\n): Markup {\n const $items = toState(items);\n\n return createMarkup(\"$repeat\", { $items, keyFn, renderFn });\n}\n\n/**\n * Render `content` into a `parent` node anywhere in the page, rather than at its position in the view.\n */\nexport function portal(parent: Node, content: Renderable) {\n return createMarkup(\"$portal\", { parent, content });\n}\n\n/*===========================*\\\n|| Ref ||\n\\*===========================*/\n\n/**\n * A special kind of State exclusively for storing references to DOM nodes.\n */\nexport function createRef<T extends Node>(): Ref<T> {\n const [$node, setNode] = createState<T>();\n\n return {\n get: $node.get,\n watch: $node.watch,\n\n get node() {\n return $node.get();\n },\n set node(node) {\n setNode(node);\n },\n };\n}\n\nexport function isRef<T extends Node>(value: any): value is Ref<T> {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n\n if (!value.hasOwnProperty(\"node\")) {\n return false;\n }\n\n return true;\n}\n\nexport interface Ref<T extends Node> extends State<T | undefined> {\n node: T | undefined;\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\n/**\n * Wraps any plain DOM node in a MarkupNode interface.\n */\nclass DOMNode implements MarkupNode {\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 async mount(parent: Node, after?: Node) {\n parent.insertBefore(this.node, after?.nextSibling ?? null);\n }\n\n async unmount() {\n if (this.node.parentNode) {\n this.node.parentNode.removeChild(this.node);\n }\n }\n}\n\n/**\n * Construct Markup metadata into a set of MarkupNodes.\n */\nexport function constructMarkup(elementContext: ElementContext, markup: Markup | Markup[]): MarkupNode[] {\n const items = isArray(markup) ? markup : [markup];\n\n return items.map((item) => {\n if (isFunction(item.type)) {\n return constructView(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 Text({\n value: attrs.value,\n });\n }\n case \"$cond\": {\n const attrs = item.props! as MarkupAttributes[\"$cond\"];\n return new Conditional({\n $predicate: attrs.$predicate,\n thenContent: attrs.thenContent,\n elseContent: attrs.elseContent,\n elementContext,\n });\n }\n case \"$repeat\": {\n const attrs = item.props! as MarkupAttributes[\"$repeat\"];\n return new Repeat({\n $items: attrs.$items,\n keyFn: attrs.keyFn,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case \"$observer\": {\n const attrs = item.props! as MarkupAttributes[\"$observer\"];\n return new Observer({\n states: attrs.states,\n renderFn: attrs.renderFn,\n elementContext,\n });\n }\n case \"$outlet\": {\n const attrs = item.props! as MarkupAttributes[\"$outlet\"];\n return new Outlet({\n $children: attrs.$children,\n elementContext,\n });\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 MarkupNodes into a single MarkupNode.\n */\nexport function mergeNodes(nodes: MarkupNode[]): MarkupNode {\n if (nodes.length === 1) {\n return nodes[0];\n }\n\n const node = document.createComment(\"Fragment\");\n\n let isConnected = false;\n\n return {\n get node() {\n return node;\n },\n get isMounted() {\n return isConnected;\n },\n mount(parent: Node, after?: Node) {\n parent.insertBefore(node, after ? after : null);\n\n for (const handle of nodes) {\n const previous = nodes[nodes.length - 1]?.node ?? node;\n handle.mount(parent, previous);\n }\n\n isConnected = true;\n },\n unmount() {\n if (isConnected) {\n for (const handle of nodes) {\n handle.unmount();\n }\n\n node.remove();\n }\n\n isConnected = false;\n },\n };\n}\n\nexport function isRenderable(value: unknown): value is Renderable {\n return (\n value == null ||\n value === false ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n isMarkup(value) ||\n isState(value) ||\n isArrayOf(isRenderable, value)\n );\n}\n","import { type ViewContext } from \"../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"],"names":["exports","_slicedToArray","a","b","c","d","e","f","g","h","rgbToHex","hslToRgb","i","hslGeneration","standardHashFunction","generateColorHash","j","k","m","n","o","p","q","r","s","module","typeOf","value","type","isClass","isArray","isPromise","isArrayOf","args","check","test","item","assertArrayOf","message","isString","formatError","assertString","errorMessage","isFunction","isNumber","obj","assertInstanceOf","constructor","isObject","typeName","valueString","_a","noOp","isPlainObject","deepEqual","one","two","isState","keysOne","keysTwo","key","index","omit","keys","object","process","newObject","getDefaultConsole","colorFromString","colorHash","createMatcher","pattern","matchers","parts","part","section","name","positive","negative","fn","isSettableState","valueOf","toState","callback","options","createSettableState","initialValue","$value","setValue","createState","toSettableState","$state","setter","createSetter","nextOrCallback","current","next","currentValue","watchers","notify","watcher","equal","action","EMPTY","derive","states","previousSourceValues","watching","stoppers","stopWatchingCurrentValue","rawCurrentValue","getCurrentValue","update","sourceValues","setCurrentValue","raw","startWatchingSources","startingSourceValues","state","previous","stopWatchingSources","stop","watch","htm","l","t","u","Conditional","config","__publicField","toMarkup","parent","after","handle","_b","constructMarkup","urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","isCamelCaseEventName","HTML","tag","props","children","elementContext","isRef","child","element","attachProp","updateKey","values","listener","updated","toTypeOf","eventName","privateProps","_key","styles","stopCallbacks","propStopCallbacks","unapply","mapped","getStyleMap","priority","classes","classStopCallbacks","getClassMap","names","lines","line","_value","entry","camelToKebab","$","ofs","target","source","Observer","renderFn","_stop","rendered","isRenderable","nodes","isNode","isMarkup","mergeNodes","node","lastNode","Outlet","newChildren","_c","Portal","_parent","_after","content","constructView","view","$children","setChildren","isMounted","stopObserverCallbacks","beforeMountCallbacks","onMountCallbacks","beforeUnmountCallbacks","onUnmountCallbacks","uniqueId","$name","setName","logger","ctx","isStopped","createMarkup","initialize","result","error","x","wasConnected","Repeat","$items","keyFn","potentialItems","newItems","connected","potential","$index","setIndex","RepeatItemView","lastItem","Text","MARKUP","renderables","DOMNode","_assertPropTypes","html","cond","predicate","thenContent","elseContent","$predicate","repeat","items","portal","createRef","$node","setNode","markup","attrs","isConnected","Passthrough","_"],"mappings":"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","x_google_ignoreList":[0,4,6,7]}
|
package/dist/state.d.ts
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stops the observer that created it when called.
|
|
3
|
-
*/
|
|
4
|
-
export type StopFunction = () => void;
|
|
5
|
-
type Unwrapped<T> = T extends State<infer V> ? V : T;
|
|
6
|
-
/**
|
|
7
|
-
* Extracts value types from an array of states.
|
|
8
|
-
*/
|
|
9
|
-
export type StateValues<T extends MaybeState<any>[]> = {
|
|
10
|
-
[K in keyof T]: Unwrapped<T[K]>;
|
|
11
|
-
};
|
|
12
|
-
export interface CreateStateOptions<T> {
|
|
13
|
-
/**
|
|
14
|
-
* Determines if the `next` value is equal to the `current` value.
|
|
15
|
-
* If this function returns true, watchers will be notified of changes. If it returns false, watchers will not be notified.
|
|
16
|
-
* By default equality is defined as deep equality.
|
|
17
|
-
*
|
|
18
|
-
* @param next - The new value being set.
|
|
19
|
-
* @param current - The current value being replaced.
|
|
20
|
-
*/
|
|
21
|
-
equality?: (next: T, current: T) => boolean;
|
|
22
|
-
}
|
|
23
|
-
export interface WatchOptions<T> {
|
|
24
|
-
/**
|
|
25
|
-
* If true the watch callback will be called for the first time on the next change.
|
|
26
|
-
* By default the callback is called immediately with the state's current value.
|
|
27
|
-
*/
|
|
28
|
-
lazy?: boolean;
|
|
29
|
-
}
|
|
30
|
-
export interface State<T> {
|
|
31
|
-
/**
|
|
32
|
-
* Returns the current value.
|
|
33
|
-
*/
|
|
34
|
-
get(): T;
|
|
35
|
-
/**
|
|
36
|
-
* Watch this state's value with a `callback` function.
|
|
37
|
-
* The `callback` is only called if the value is not equal to the current value.
|
|
38
|
-
*
|
|
39
|
-
* > NOTE: If watching a state inside a view, use the `.watch` method on the `ViewContext`. That method will automatically
|
|
40
|
-
* clean up all watchers when the view is disconnected. Watchers created here must be cleaned up manually.
|
|
41
|
-
*/
|
|
42
|
-
watch(callback: (value: T) => void, options?: WatchOptions<T>): StopFunction;
|
|
43
|
-
}
|
|
44
|
-
/** A new value for a state, or a callback that receives the current value and returns a new one. */
|
|
45
|
-
export type SetAction<I, O = I> = O | ((current: I) => O);
|
|
46
|
-
/** Callback that updates the value of a state. */
|
|
47
|
-
export type Setter<I, O = I> = (value: SetAction<I, O>) => void;
|
|
48
|
-
export type MaybeState<T> = State<T> | T;
|
|
49
|
-
/**
|
|
50
|
-
* A state and setter in one. Useful for passing states that are intended to be updated by subviews.
|
|
51
|
-
*/
|
|
52
|
-
export interface SettableState<I, O = I> extends State<I> {
|
|
53
|
-
/**
|
|
54
|
-
* Updates the state's value.
|
|
55
|
-
*/
|
|
56
|
-
set(next: O): void;
|
|
57
|
-
/**
|
|
58
|
-
* Takes a callback that recieves the state's current value and returns a new one.
|
|
59
|
-
*/
|
|
60
|
-
set(callback: (current: I) => O): void;
|
|
61
|
-
}
|
|
62
|
-
export declare function isState<T>(value: any): value is State<T>;
|
|
63
|
-
export declare function isSettableState<T>(value: any): value is SettableState<T>;
|
|
64
|
-
/**
|
|
65
|
-
* Retrieves a plain value from a variable that may be a state.
|
|
66
|
-
*/
|
|
67
|
-
export declare function valueOf<T>(value: MaybeState<T>): T;
|
|
68
|
-
/**
|
|
69
|
-
* Ensures a variable that may be a state or plain value is a state.
|
|
70
|
-
*/
|
|
71
|
-
export declare function toState<T>(value: MaybeState<T>): State<T>;
|
|
72
|
-
/**
|
|
73
|
-
* Creates a SettableState.
|
|
74
|
-
*/
|
|
75
|
-
export declare function createSettableState<T>(initialValue: T, options?: CreateStateOptions<T>): SettableState<T>;
|
|
76
|
-
/**
|
|
77
|
-
* Creates a SettableState.
|
|
78
|
-
*/
|
|
79
|
-
export declare function createSettableState<T>(initialValue?: T, options?: CreateStateOptions<T | undefined>): SettableState<T | undefined>;
|
|
80
|
-
/**
|
|
81
|
-
* Join a state and its setter into a single SettableState object.
|
|
82
|
-
*/
|
|
83
|
-
export declare function toSettableState<I, O = I>($state: State<I>, setter: Setter<I, O>): SettableState<I, O>;
|
|
84
|
-
/**
|
|
85
|
-
* Creates a Setter with custom logic provided by `callback`.
|
|
86
|
-
*/
|
|
87
|
-
export declare function createSetter<I, O = I>($state: State<I>, callback: (next: O, current: I) => void): Setter<I, O>;
|
|
88
|
-
/**
|
|
89
|
-
* Creates a state and setter.
|
|
90
|
-
*/
|
|
91
|
-
export declare function createState<T>(initialValue: T, options?: CreateStateOptions<T>): [State<T>, Setter<T>];
|
|
92
|
-
/**
|
|
93
|
-
* Creates a state and setter.
|
|
94
|
-
*/
|
|
95
|
-
export declare function createState<T>(initialValue?: T, options?: CreateStateOptions<T | undefined>): [State<T | undefined>, Setter<T | undefined>];
|
|
96
|
-
export interface DeriveOptions {
|
|
97
|
-
equality?: (next: unknown, current: unknown) => boolean;
|
|
98
|
-
}
|
|
99
|
-
export declare function derive<Inputs extends MaybeState<any>[], T>(states: [...Inputs], fn: (...currentValues: StateValues<Inputs>) => T | State<T>, options?: DeriveOptions): State<T>;
|
|
100
|
-
export declare function watch<I extends MaybeState<any>[]>(states: [...I], fn: (...currentValues: StateValues<I>) => void): StopFunction;
|
|
101
|
-
export {};
|
package/dist/view.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { type MarkupNode, type ElementContext, type Markup } from "./markup.js";
|
|
2
|
-
import type { Logger } from "./modules/dolla.js";
|
|
3
|
-
import { type MaybeState, State, type StateValues, type StopFunction } from "./state.js";
|
|
4
|
-
/**
|
|
5
|
-
* Any valid value that a View can return.
|
|
6
|
-
*/
|
|
7
|
-
export type ViewResult = Node | State<any> | Markup | Markup[] | null;
|
|
8
|
-
export type ViewFunction<P> = (props: P, context: ViewContext) => ViewResult;
|
|
9
|
-
/**
|
|
10
|
-
* A view that has been constructed into DOM nodes.
|
|
11
|
-
*/
|
|
12
|
-
export interface ViewNode extends MarkupNode {
|
|
13
|
-
setChildren(children: MarkupNode[]): void;
|
|
14
|
-
}
|
|
15
|
-
export interface ViewContext extends Logger {
|
|
16
|
-
/**
|
|
17
|
-
* A string ID unique to this view.
|
|
18
|
-
*/
|
|
19
|
-
readonly uid: string;
|
|
20
|
-
/**
|
|
21
|
-
* Sets the name of the view's built in logger.
|
|
22
|
-
*/
|
|
23
|
-
setName(name: string): void;
|
|
24
|
-
/**
|
|
25
|
-
* Registers a callback to run just before this view is mounted. DOM nodes are not yet attached to the page.
|
|
26
|
-
*/
|
|
27
|
-
beforeMount(callback: () => void): void;
|
|
28
|
-
/**
|
|
29
|
-
* Registers a callback to run just after this view is mounted.
|
|
30
|
-
*/
|
|
31
|
-
onMount(callback: () => void): void;
|
|
32
|
-
/**
|
|
33
|
-
* Registers a callback to run just before this view is unmounted. DOM nodes are still attached to the page.
|
|
34
|
-
*/
|
|
35
|
-
beforeUnmount(callback: () => void): void;
|
|
36
|
-
/**
|
|
37
|
-
* Registers a callback to run just after this view is unmounted.
|
|
38
|
-
*/
|
|
39
|
-
onUnmount(callback: () => void): void;
|
|
40
|
-
/**
|
|
41
|
-
* Watch a set of states. The callback is called when any of the states receive a new value.
|
|
42
|
-
* Watchers will be automatically stopped when this view is unmounted.
|
|
43
|
-
*/
|
|
44
|
-
watch<T extends MaybeState<any>[]>(states: [...T], callback: (...values: StateValues<T>) => void): StopFunction;
|
|
45
|
-
/**
|
|
46
|
-
* Returns a Markup element that displays this view's children.
|
|
47
|
-
*/
|
|
48
|
-
outlet(): Markup;
|
|
49
|
-
}
|
|
50
|
-
export declare function constructView<P>(elementContext: ElementContext, view: ViewFunction<P>, props: P, children?: Markup[]): ViewNode;
|
package/tests/state.test.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
|
-
import assert from "node:assert";
|
|
3
|
-
|
|
4
|
-
import { createState, derive } from "../dist/index.js";
|
|
5
|
-
|
|
6
|
-
test("signal", (t) => {
|
|
7
|
-
const [$count, setCount] = createState(5);
|
|
8
|
-
|
|
9
|
-
const defaultWatcher = t.mock.fn();
|
|
10
|
-
const stopDefault = $count.watch(defaultWatcher);
|
|
11
|
-
|
|
12
|
-
const lazyWatcher = t.mock.fn();
|
|
13
|
-
const stopLazy = $count.watch(lazyWatcher, { lazy: true });
|
|
14
|
-
|
|
15
|
-
assert.equal(defaultWatcher.mock.callCount(), 1, "watcher is called immediately by default");
|
|
16
|
-
assert.equal(lazyWatcher.mock.callCount(), 0, "lazy watcher is not called immediately");
|
|
17
|
-
|
|
18
|
-
assert.equal($count.get(), 5, "get returns the initial value");
|
|
19
|
-
|
|
20
|
-
setCount(12);
|
|
21
|
-
|
|
22
|
-
assert.equal($count.get(), 12, "setter updates the signal value");
|
|
23
|
-
|
|
24
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher is called");
|
|
25
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher is called");
|
|
26
|
-
|
|
27
|
-
assert.deepStrictEqual(defaultWatcher.mock.calls[1].arguments, [12], "default watcher is called with new value");
|
|
28
|
-
assert.deepStrictEqual(lazyWatcher.mock.calls[0].arguments, [12], "lazy watcher is called with new value");
|
|
29
|
-
|
|
30
|
-
setCount(12);
|
|
31
|
-
|
|
32
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher was not called with same value");
|
|
33
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher was not called with same value");
|
|
34
|
-
|
|
35
|
-
stopDefault();
|
|
36
|
-
stopLazy();
|
|
37
|
-
|
|
38
|
-
setCount(51);
|
|
39
|
-
|
|
40
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher has not been called again");
|
|
41
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher has not been called again");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("derive", (t) => {
|
|
45
|
-
const [$one, setOne] = createState(5);
|
|
46
|
-
const [$two, setTwo] = createState(20);
|
|
47
|
-
|
|
48
|
-
const deriveSum = t.mock.fn((one, two) => one + two);
|
|
49
|
-
const deriveProduct = t.mock.fn((one, two) => one * two);
|
|
50
|
-
|
|
51
|
-
const $sum = derive([$one, $two], deriveSum);
|
|
52
|
-
const $product = derive([$one, $two], deriveProduct);
|
|
53
|
-
|
|
54
|
-
assert.equal($sum.get(), 25, "sum is calculated correctly");
|
|
55
|
-
assert.equal($product.get(), 100, "product is calculated correctly");
|
|
56
|
-
|
|
57
|
-
assert.equal(deriveSum.mock.callCount(), 1, "derive function has only been called once");
|
|
58
|
-
|
|
59
|
-
$sum.get();
|
|
60
|
-
$sum.get();
|
|
61
|
-
$sum.get();
|
|
62
|
-
|
|
63
|
-
assert.equal(deriveSum.mock.callCount(), 1, "derive function still only called once as dependencies haven't changed");
|
|
64
|
-
|
|
65
|
-
const defaultWatcher = t.mock.fn();
|
|
66
|
-
const stopDefault = $sum.watch(defaultWatcher);
|
|
67
|
-
|
|
68
|
-
const lazyWatcher = t.mock.fn();
|
|
69
|
-
const stopLazy = $product.watch(lazyWatcher, { lazy: true });
|
|
70
|
-
|
|
71
|
-
assert.equal(defaultWatcher.mock.callCount(), 1, "default watcher has been called");
|
|
72
|
-
assert.equal(lazyWatcher.mock.callCount(), 0, "lazy watcher has not been called yet");
|
|
73
|
-
|
|
74
|
-
assert.deepStrictEqual(defaultWatcher.mock.calls[0].arguments, [25], "default watcher was called with initial value");
|
|
75
|
-
|
|
76
|
-
setOne(6);
|
|
77
|
-
|
|
78
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher has been called");
|
|
79
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher has been called");
|
|
80
|
-
|
|
81
|
-
assert.deepStrictEqual(defaultWatcher.mock.calls[1].arguments, [26], "default watcher was called with new value");
|
|
82
|
-
assert.deepStrictEqual(lazyWatcher.mock.calls[0].arguments, [120], "lazy watcher was called with new value");
|
|
83
|
-
|
|
84
|
-
setTwo(20);
|
|
85
|
-
|
|
86
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher was not called with same value");
|
|
87
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher was not called with same value");
|
|
88
|
-
|
|
89
|
-
stopDefault();
|
|
90
|
-
stopLazy();
|
|
91
|
-
|
|
92
|
-
setOne(4);
|
|
93
|
-
|
|
94
|
-
assert.equal(defaultWatcher.mock.callCount(), 2, "default watcher was not called after stop");
|
|
95
|
-
assert.equal(lazyWatcher.mock.callCount(), 1, "lazy watcher was not called after stop");
|
|
96
|
-
|
|
97
|
-
assert.equal($sum.get(), 24, "sum is derived correctly");
|
|
98
|
-
assert.equal($product.get(), 80, "product is derived correctly");
|
|
99
|
-
|
|
100
|
-
assert.equal(deriveSum.mock.callCount(), 3, "sum has only been derived three times");
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("derive nested signals", (t) => {
|
|
104
|
-
const [$value, setValue] = createState(5);
|
|
105
|
-
|
|
106
|
-
const [$object, setObject] = createState({
|
|
107
|
-
href: derive([$value], (value) => `/projects/${value}/test`),
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// o.href here is itself a derived value
|
|
111
|
-
const $href = derive([$object], (o) => o.href);
|
|
112
|
-
|
|
113
|
-
const watcher = t.mock.fn();
|
|
114
|
-
const stop = $href.watch(watcher);
|
|
115
|
-
|
|
116
|
-
assert.equal(watcher.mock.callCount(), 1);
|
|
117
|
-
assert.deepStrictEqual(watcher.mock.calls[0].arguments, ["/projects/5/test"]);
|
|
118
|
-
|
|
119
|
-
// Update value which href depends on.
|
|
120
|
-
setValue(12);
|
|
121
|
-
|
|
122
|
-
assert.equal(watcher.mock.callCount(), 2);
|
|
123
|
-
assert.deepStrictEqual(watcher.mock.calls[1].arguments, ["/projects/12/test"]);
|
|
124
|
-
|
|
125
|
-
// Now set the original object and replace the derived href.
|
|
126
|
-
// See that watcher still receives the latest value.
|
|
127
|
-
setObject({
|
|
128
|
-
href: derive([$value], (value) => `/projects/${value}/changed`),
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
assert.equal(watcher.mock.callCount(), 3);
|
|
132
|
-
assert.deepStrictEqual(watcher.mock.calls[2].arguments, ["/projects/12/changed"]);
|
|
133
|
-
|
|
134
|
-
stop();
|
|
135
|
-
});
|
|
File without changes
|