@manyducks.co/dolla 2.0.0-alpha.54 → 2.0.0-alpha.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -12
- package/dist/core/context.d.ts +81 -42
- package/dist/core/env.d.ts +2 -8
- package/dist/core/index.d.ts +7 -9
- package/dist/core/logger.d.ts +3 -3
- package/dist/core/markup.d.ts +44 -43
- package/dist/core/mount.d.ts +11 -6
- package/dist/core/nodes/dom.d.ts +6 -6
- package/dist/core/nodes/dynamic.d.ts +15 -17
- package/dist/core/nodes/html.d.ts +11 -23
- package/dist/core/nodes/portal.d.ts +9 -13
- package/dist/core/nodes/repeat.d.ts +13 -18
- package/dist/core/nodes/view.d.ts +14 -95
- package/dist/core/ref.d.ts +2 -6
- package/dist/core/symbols.d.ts +1 -3
- package/dist/core/views/default-crash-view.d.ts +1 -1
- package/dist/core/views/fragment.d.ts +1 -2
- package/dist/fragment-BahD_BJA.js +7 -0
- package/dist/fragment-BahD_BJA.js.map +1 -0
- package/dist/http.js +1 -1
- package/dist/i18n.js +14 -14
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +50 -64
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.d.ts +1 -1
- package/dist/jsx-dev-runtime.js +8 -8
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +2 -2
- package/dist/jsx-runtime.js +9 -9
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/{logger-CBfhf3fA.js → logger-sSxIw5od.js} +143 -142
- package/dist/logger-sSxIw5od.js.map +1 -0
- package/dist/markup-DS7yYBga.js +844 -0
- package/dist/markup-DS7yYBga.js.map +1 -0
- package/dist/router/index.d.ts +1 -1
- package/dist/router/router.d.ts +10 -7
- package/dist/router-D43DV_bv.js +489 -0
- package/dist/router-D43DV_bv.js.map +1 -0
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/dist/{typeChecking-EAVNeFyB.js → typeChecking-BJ-ymQ2F.js} +7 -12
- package/dist/{typeChecking-EAVNeFyB.js.map → typeChecking-BJ-ymQ2F.js.map} +1 -1
- package/dist/types.d.ts +13 -14
- package/docs/mixins.md +1 -1
- package/docs/ref.md +93 -0
- package/notes/scratch.md +24 -0
- package/package.json +2 -2
- package/dist/core/mixin.d.ts +0 -62
- package/dist/core/nodes/fragment.d.ts +0 -19
- package/dist/core/nodes/outlet.d.ts +0 -20
- package/dist/core/store.d.ts +0 -57
- package/dist/core/views/passthrough.d.ts +0 -5
- package/dist/fragment-CmWsN-4Y.js +0 -8
- package/dist/fragment-CmWsN-4Y.js.map +0 -1
- package/dist/logger-CBfhf3fA.js.map +0 -1
- package/dist/router-BoJac1lD.js +0 -482
- package/dist/router-BoJac1lD.js.map +0 -1
- package/dist/view-BKpHFpWG.js +0 -1044
- package/dist/view-BKpHFpWG.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeChecking-
|
|
1
|
+
{"version":3,"file":"typeChecking-BJ-ymQ2F.js","sources":["../src/typeChecking.ts"],"sourcesContent":["type TypeNames =\n // These values can be returned by `typeof`.\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"symbol\"\n | \"undefined\"\n | \"object\"\n | \"function\"\n // These values are more specific ones that the `typeOf` function can return.\n | \"null\"\n | \"array\"\n | \"class\"\n | \"promise\"\n | \"map\"\n | \"set\"\n | \"NaN\";\n\n/**\n * Extends `typeof` operator with more specific and useful type distinctions.\n */\nexport function typeOf(value: any): TypeNames {\n const type = typeof value;\n switch (type) {\n case \"undefined\":\n return type;\n case \"number\":\n if (isNaN(value as any)) return \"NaN\";\n return type;\n case \"function\":\n if (/^\\s*class\\s+/.test(value.toString())) return \"class\";\n return type;\n case \"object\":\n if (value === null) return \"null\";\n if (value instanceof Promise) return \"promise\";\n if (value instanceof Map) return \"map\";\n if (value instanceof Set) return \"set\";\n if (Array.isArray(value)) return \"array\";\n return type;\n default:\n return type;\n }\n}\n\n/**\n * Throws a TypeError unless `condition` is truthy.\n *\n * @param condition - Value whose truthiness is in question.\n * @param errorMessage - Optional message for the thrown TypeError.\n */\nexport function assert(condition: any, errorMessage?: string): void {\n if (!condition) {\n throw new TypeError(\n formatError(condition, errorMessage || \"Failed assertion. Value is not truthy. Got type: %t, value: %v\"),\n );\n }\n}\n\n/**\n * Returns true if `value` is an array.\n */\nexport function isArray(value: unknown): value is Array<unknown> {\n return Array.isArray(value);\n}\n\n/**\n * Throws an error if `value` is not an array.\n */\nexport function assertArray(value: unknown, errorMessage?: string): value is Array<unknown> {\n if (isArray(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage || \"Expected array. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true when `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n */\n\nexport function isArrayOf<T>(check: (item: unknown) => boolean, value: unknown): value is T[] {\n return isArray(value) && value.every((item) => check(item));\n}\n\n/**\n * Throws a TypeError unless `value` is an array and `check` returns true for every item.\n *\n * @param check - Function to check items against.\n * @param value - A possible array.\n * @param errorMessage - A custom error message.\n */\nexport function assertArrayOf<T>(\n check: (item: unknown) => boolean,\n value: unknown,\n errorMessage?: string,\n): value is T[] {\n if (isArrayOf(check, value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an array of valid items. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a string.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Throws a TypeError unless `value` is a string.\n */\nexport function assertString(value: unknown, errorMessage?: string): value is string {\n if (isString(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a string. Got type: %t, value: %v\"));\n}\n\n// TODO: More specific validation for common types of strings? Email address, URL, UUID, etc?\n\n/**\n * Returns true if `value` is a function (but not a class).\n */\nexport function isFunction<T = (...args: unknown[]) => unknown>(value: unknown): value is T {\n return typeOf(value) === \"function\";\n}\n\n/**\n * Throws a TypeError unless `value` is a function.\n */\nexport function assertFunction<T = (...args: unknown[]) => unknown>(value: unknown, errorMessage?: string): value is T {\n if (isFunction(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a function. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns true if `value` is a number.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === \"number\" && !isNaN(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a number.\n */\nexport function assertNumber(value: unknown, errorMessage?: string): value is number {\n if (isNumber(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected a number. Got type: %t, value: %v\"));\n}\n\n/**\n * Returns a function that takes a `value` and returns true if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function isInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Returns `true` if `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n */\nexport function isInstanceOf<T extends Function>(constructor: T, value: unknown): value is T;\n\nexport function isInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n\n const test = (value: unknown): value is T => {\n return value instanceof constructor;\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns a function that takes a `value` and throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor a value must be an instance of to match.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T): (value: unknown) => value is T;\n\n/**\n * Throws a TypeError unless `value` is an instance of `constructor`.\n *\n * @param constructor - The constructor `value` must be an instance of.\n * @param value - A value that may be an instance of `constructor`.\n * @param errorMessage - A custom error message for when the assertion fails.\n */\nexport function assertInstanceOf<T extends Function>(constructor: T, value: unknown, errorMessage?: string): value is T;\n\nexport function assertInstanceOf<T extends Function>(...args: unknown[]) {\n const constructor = args[0] as T;\n const errorMessage = isString(args[2])\n ? args[2]\n : `Expected instance of ${constructor.name}. Got type: %t, value: %v`;\n\n const test = (value: unknown): value is T => {\n if (value instanceof constructor) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage));\n };\n\n if (args.length < 2) {\n return test;\n } else {\n return test(args[1]);\n }\n}\n\n/**\n * Returns true if `value` is a plain JavaScript object.\n */\nexport function isObject(value: unknown): value is Record<string | number | symbol, unknown> {\n return value != null && typeof value === \"object\" && !isArray(value);\n}\n\n/**\n * Throws a TypeError unless `value` is a plain JavaScript object.\n */\nexport function assertObject(value: unknown, errorMessage?: string): value is object {\n if (isObject(value)) {\n return true;\n }\n\n throw new TypeError(formatError(value, errorMessage ?? \"Expected an object. Got type: %t, value: %v\"));\n}\n\n/**\n * Replaces `%t` and `%v` placeholders in a message with real values.\n */\nfunction formatError(value: unknown, message: string) {\n const typeName = typeOf(value);\n\n // TODO: Pretty format value as string based on type.\n const valueString = value?.toString?.() || String(value);\n\n return message.replaceAll(\"%t\", typeName).replaceAll(\"%v\", valueString);\n}\n"],"names":["typeOf","value","type","isArray","isArrayOf","check","item","assertArrayOf","errorMessage","formatError","isString","assertString","isFunction","assertInstanceOf","args","constructor","test","isObject","assertObject","message","_a","typeName","valueString"],"mappings":"AAsBO,SAASA,EAAOC,GAAuB;AAC5C,QAAMC,IAAO,OAAOD;AACpB,UAAQC,GAAM;AAAA,IACZ,KAAK;AACI,aAAAA;AAAA,IACT,KAAK;AACC,aAAA,MAAMD,CAAY,IAAU,QACzBC;AAAA,IACT,KAAK;AACH,aAAI,eAAe,KAAKD,EAAM,SAAU,CAAA,IAAU,UAC3CC;AAAA,IACT,KAAK;AACC,aAAAD,MAAU,OAAa,SACvBA,aAAiB,UAAgB,YACjCA,aAAiB,MAAY,QAC7BA,aAAiB,MAAY,QAC7B,MAAM,QAAQA,CAAK,IAAU,UAC1BC;AAAA,IACT;AACS,aAAAA;AAAA,EAAA;AAEb;AAmBO,SAASC,EAAQF,GAAyC;AACxD,SAAA,MAAM,QAAQA,CAAK;AAC5B;AAoBgB,SAAAG,EAAaC,GAAmCJ,GAA8B;AACrF,SAAAE,EAAQF,CAAK,KAAKA,EAAM,MAAM,CAACK,MAASD,EAAMC,CAAI,CAAC;AAC5D;AASgB,SAAAC,EACdF,GACAJ,GACAO,GACc;AACV,MAAAJ,EAAUC,GAAOJ,CAAK;AACjB,WAAA;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,CAA2E,CAAC;AACrH;AAKO,SAASE,EAAST,GAAiC;AACxD,SAAO,OAAOA,KAAU;AAC1B;AAKgB,SAAAU,EAAaV,GAAgBO,GAAwC;AAC/E,MAAAE,EAAST,CAAK;AACT,WAAA;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,KAAgB,4CAA4C,CAAC;AACtG;AAOO,SAASI,EAAgDX,GAA4B;AACnF,SAAAD,EAAOC,CAAK,MAAM;AAC3B;AA4EO,SAASY,KAAwCC,GAAiB;AACjE,QAAAC,IAAcD,EAAK,CAAC,GACpBN,IAAeE,EAASI,EAAK,CAAC,CAAC,IACjCA,EAAK,CAAC,IACN,wBAAwBC,EAAY,IAAI,6BAEtCC,IAAO,CAACf,MAA+B;AAC3C,QAAIA,aAAiBc;AACZ,aAAA;AAGT,UAAM,IAAI,UAAUN,EAAYR,GAAOO,CAAY,CAAC;AAAA,EACtD;AAEI,SAAAM,EAAK,SAAS,IACTE,IAEAA,EAAKF,EAAK,CAAC,CAAC;AAEvB;AAKO,SAASG,EAAShB,GAAoE;AAC3F,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAACE,EAAQF,CAAK;AACrE;AAKgB,SAAAiB,EAAajB,GAAgBO,GAAwC;AAC/E,MAAAS,EAAShB,CAAK;AACT,WAAA;AAGT,QAAM,IAAI,UAAUQ,EAAYR,GAAOO,CAA6D,CAAC;AACvG;AAKA,SAASC,EAAYR,GAAgBkB,GAAiB;AApO/C,MAAAC;AAqOC,QAAAC,IAAWrB,EAAOC,CAAK,GAGvBqB,MAAcF,IAAAnB,KAAA,gBAAAA,EAAO,aAAP,gBAAAmB,EAAA,KAAAnB,OAAuB,OAAOA,CAAK;AAEvD,SAAOkB,EAAQ,WAAW,MAAME,CAAQ,EAAE,WAAW,MAAMC,CAAW;AACxE;"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import type * as CSS from "csstype";
|
|
2
|
-
import type { Markup } from "./core/markup.js";
|
|
2
|
+
import type { Markup, MarkupNode } from "./core/markup.js";
|
|
3
3
|
import { Signal } from "./core/signals.js";
|
|
4
|
-
import { Mixin } from "./core/
|
|
4
|
+
import { Mixin } from "./core/nodes/html.js";
|
|
5
|
+
import type { Context } from "./core/context.js";
|
|
6
|
+
export type Env = "production" | "development";
|
|
5
7
|
/**
|
|
6
8
|
* Represents everything that can be handled as a DOM node.
|
|
7
9
|
* These are all the items considered valid to pass as children to any element.
|
|
8
10
|
*/
|
|
9
|
-
export type Renderable = string | number | Markup | false | null | undefined | Signal<any> | (string | number | Markup | false | null | undefined | Signal<any>)[];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export type Stringable = {
|
|
19
|
-
toString(): string;
|
|
20
|
-
};
|
|
11
|
+
export type Renderable = string | number | Node | Markup | MarkupNode | false | null | undefined | Signal<any> | (string | number | Node | Markup | MarkupNode | false | null | undefined | Signal<any>)[];
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
export type View<P> = (this: Context, props: P, context: Context) => Renderable;
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
export type Store<Options, Value> = (this: Context, options: Options, context: Context) => Value;
|
|
21
20
|
type MaybeSignal<T> = T | Signal<T> | Signal<T | undefined>;
|
|
22
21
|
type OptionalProperty<T> = MaybeSignal<T>;
|
|
23
22
|
type RequiredProperty<T> = T | Signal<T>;
|
package/docs/mixins.md
CHANGED
|
@@ -20,7 +20,7 @@ const logMe: Mixin = (element, ctx) => {
|
|
|
20
20
|
<h1 mixin={logMe}>Title</h1>;
|
|
21
21
|
|
|
22
22
|
// Or an array of mixins
|
|
23
|
-
<p mixin={[logMe
|
|
23
|
+
<p mixin={[logMe, anotherMixin, yetAnotherMixin]}>Text goes here...</p>;
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
---
|
package/docs/ref.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Ref
|
|
2
|
+
|
|
3
|
+
Refs are functions that serve as a getter and setter for a stored value. Calling a ref with no arguments will return its stored value, or throw an error if no value has yet been stored. Calling a ref with a single argument will store a new value.
|
|
4
|
+
|
|
5
|
+
This signature is very similar to that of a `Source` signal, with the differences being their error throwing behavior while empty and that refs are _not_ trackable in a signal context.
|
|
6
|
+
|
|
7
|
+
## Pattern #1: Referencing DOM nodes
|
|
8
|
+
|
|
9
|
+
The main pattern for refs is as a DOM node reference. Markup elements take a `ref` attribute to which they will pass their DOM node when they are mounted.
|
|
10
|
+
|
|
11
|
+
Once you have this reference you can manipulate the node outside the usual declarative template workflow.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { ref } from "@manyducks.co/dolla";
|
|
15
|
+
|
|
16
|
+
function ExampleView() {
|
|
17
|
+
const element = ref<HTMLElement>();
|
|
18
|
+
|
|
19
|
+
ctx.onMount(() => {
|
|
20
|
+
element().innerText = "GOODBYE THERE";
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return <div ref={element}>HELLO THERE</div>;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Pattern #2: Controlling a child view from a parent view
|
|
28
|
+
|
|
29
|
+
Another useful pattern is to pass an API object from a child view to the parent, allowing the parent to call methods to control the child view in an imperative way.
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { ref } from "@manyducks.co/dolla";
|
|
33
|
+
|
|
34
|
+
// First we'll define the view to be controlled.
|
|
35
|
+
|
|
36
|
+
interface CounterViewControls {
|
|
37
|
+
increment(): void;
|
|
38
|
+
decrement(): void;
|
|
39
|
+
reset(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface CounterViewProps {
|
|
43
|
+
controls: Ref<CounterViewControls>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function CounterView({ controls }: CounterViewProps) {
|
|
47
|
+
const $count = $(count);
|
|
48
|
+
|
|
49
|
+
// Passing a `controls` object to the ref whose methods reference internal state.
|
|
50
|
+
controls({
|
|
51
|
+
increment() {
|
|
52
|
+
$count((current) => current + 1);
|
|
53
|
+
},
|
|
54
|
+
decrement() {
|
|
55
|
+
$count((current) => current - 1);
|
|
56
|
+
},
|
|
57
|
+
reset() {
|
|
58
|
+
$count(0);
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return <span>Count: {$count}</span>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Then we'll use it in the parent:
|
|
66
|
+
|
|
67
|
+
function ParentView() {
|
|
68
|
+
// Create a Ref to store the controls object.
|
|
69
|
+
const controls = ref<CounterViewControls>();
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<section>
|
|
73
|
+
<h1>Counter</h1>
|
|
74
|
+
|
|
75
|
+
{/* CounterView will set the controls object */}
|
|
76
|
+
<CounterView controls={controls} />
|
|
77
|
+
|
|
78
|
+
{/* Our buttons will call the methods on the controls object causing state changes within CounterView */}
|
|
79
|
+
<button onClick={() => controls.increment()}>+1</button>
|
|
80
|
+
<button onClick={() => controls.decrement()}>-1</button>
|
|
81
|
+
<button onClick={() => controls.reset()}>=0</button>
|
|
82
|
+
</section>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
End.
|
|
90
|
+
|
|
91
|
+
- [🗂️ Docs](./index.md)
|
|
92
|
+
- [🏠 README](../README.md)
|
|
93
|
+
- [🦆 That's a lot of ducks.](https://www.manyducks.co)
|
package/notes/scratch.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Scratch Note
|
|
2
2
|
|
|
3
|
+
Library needs to be easier to render standalone elements. Idea to replace constructView and a lot of the store management weirdness with a `createContext` function and a `render` function that takes markup and a context.
|
|
4
|
+
|
|
5
|
+
The context is basically a refactor of the old ElementContext and serves the same purpose.
|
|
6
|
+
|
|
7
|
+
```jsx
|
|
8
|
+
import { m, render, createContext } from "@manyducks.co/dolla";
|
|
9
|
+
|
|
10
|
+
const context = createContext();
|
|
11
|
+
context.addStore(SomeStore);
|
|
12
|
+
|
|
13
|
+
function ExampleView(props, ctx) {
|
|
14
|
+
// Views now access the Context directly.
|
|
15
|
+
const store = ctx.getStore(SomeStore);
|
|
16
|
+
|
|
17
|
+
return <h1>Hello World</h1>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const element = render(ExampleView, context);
|
|
21
|
+
|
|
22
|
+
element.mount(document.body);
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
3
27
|
Idea: Monomorphic app context. Replaces StoreContext, ViewContext, etc.
|
|
4
28
|
|
|
5
29
|
Routes are baked into the app once again, but
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manyducks.co/dolla",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.56",
|
|
4
4
|
"description": "Front-end components, routing and state management.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
6
|
+
"types": "dist/core/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"repository": {
|
package/dist/core/mixin.d.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { StoreConsumerContext } from "./context";
|
|
2
|
-
import { type Logger } from "./logger";
|
|
3
|
-
import type { HTML } from "./nodes/html";
|
|
4
|
-
import { type EffectFn, type UnsubscribeFn } from "./signals";
|
|
5
|
-
import { StoreFunction } from "./store";
|
|
6
|
-
export interface MixinContext extends Logger, StoreConsumerContext {
|
|
7
|
-
/**
|
|
8
|
-
* An ID unique to this element.
|
|
9
|
-
*/
|
|
10
|
-
readonly uid: string;
|
|
11
|
-
/**
|
|
12
|
-
* True while this element is connected to the DOM.
|
|
13
|
-
*/
|
|
14
|
-
readonly isMounted: boolean;
|
|
15
|
-
/**
|
|
16
|
-
* Registers a callback to run just before this element is mounted. DOM nodes are not yet attached to the page.
|
|
17
|
-
*/
|
|
18
|
-
beforeMount(callback: () => void): void;
|
|
19
|
-
/**
|
|
20
|
-
* Registers a callback to run just after this element is mounted.
|
|
21
|
-
*/
|
|
22
|
-
onMount(callback: () => void): void;
|
|
23
|
-
/**
|
|
24
|
-
* Registers a callback to run just before this element is unmounted. DOM nodes are still attached to the page.
|
|
25
|
-
*/
|
|
26
|
-
beforeUnmount(callback: () => void): void;
|
|
27
|
-
/**
|
|
28
|
-
* Registers a callback to run just after this element is unmounted.
|
|
29
|
-
*/
|
|
30
|
-
onUnmount(callback: () => void): void;
|
|
31
|
-
/**
|
|
32
|
-
* Passes a getter function to `callback` that will track reactive states and return their current values.
|
|
33
|
-
* Callback will be run each time a tracked state gets a new value.
|
|
34
|
-
*/
|
|
35
|
-
effect(callback: EffectFn): UnsubscribeFn;
|
|
36
|
-
}
|
|
37
|
-
export type Mixin<E extends Element = Element> = (element: E, context: MixinContext) => void;
|
|
38
|
-
interface Context extends Logger {
|
|
39
|
-
}
|
|
40
|
-
declare class Context implements MixinContext {
|
|
41
|
-
private html;
|
|
42
|
-
private controller;
|
|
43
|
-
constructor(html: HTML, controller: MixinController);
|
|
44
|
-
readonly uid: string;
|
|
45
|
-
get isMounted(): boolean;
|
|
46
|
-
get<Value>(store: StoreFunction<any, Value>): Value;
|
|
47
|
-
beforeMount(callback: () => void): void;
|
|
48
|
-
onMount(callback: () => void): void;
|
|
49
|
-
beforeUnmount(callback: () => void): void;
|
|
50
|
-
onUnmount(callback: () => void): void;
|
|
51
|
-
effect(callback: EffectFn): UnsubscribeFn;
|
|
52
|
-
}
|
|
53
|
-
export declare class MixinController {
|
|
54
|
-
context: Context;
|
|
55
|
-
lifecycleListeners: Record<string, (() => void)[]>;
|
|
56
|
-
constructor(html: HTML, mixins: Mixin[]);
|
|
57
|
-
beforeMount(): void;
|
|
58
|
-
onMount(): void;
|
|
59
|
-
beforeUnmount(): void;
|
|
60
|
-
onUnmount(): void;
|
|
61
|
-
}
|
|
62
|
-
export {};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type MarkupElement } from "../markup.js";
|
|
2
|
-
import { type MaybeSignal } from "../signals.js";
|
|
3
|
-
import { IS_MARKUP_ELEMENT } from "../symbols.js";
|
|
4
|
-
/**
|
|
5
|
-
* Manages several MarkupElements as one.
|
|
6
|
-
*/
|
|
7
|
-
export declare class Fragment implements MarkupElement {
|
|
8
|
-
[IS_MARKUP_ELEMENT]: boolean;
|
|
9
|
-
domNode: Text;
|
|
10
|
-
isMounted: boolean;
|
|
11
|
-
private source;
|
|
12
|
-
private elements;
|
|
13
|
-
private unsubscribe?;
|
|
14
|
-
constructor(source: MaybeSignal<MarkupElement[]>);
|
|
15
|
-
mount(parent: Node, after?: Node | undefined): void;
|
|
16
|
-
unmount(parentIsUnmounting?: boolean): void;
|
|
17
|
-
private cleanup;
|
|
18
|
-
private update;
|
|
19
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type MarkupElement } from "../markup.js";
|
|
2
|
-
import { type Signal } from "../signals.js";
|
|
3
|
-
import { IS_MARKUP_ELEMENT } from "../symbols.js";
|
|
4
|
-
import { View } from "./view.js";
|
|
5
|
-
/**
|
|
6
|
-
* Renders the subroute of the nearest view.
|
|
7
|
-
*/
|
|
8
|
-
export declare class Outlet implements MarkupElement {
|
|
9
|
-
[IS_MARKUP_ELEMENT]: boolean;
|
|
10
|
-
domNode: Text;
|
|
11
|
-
isMounted: boolean;
|
|
12
|
-
private view;
|
|
13
|
-
private mountedView?;
|
|
14
|
-
private unsubscribe?;
|
|
15
|
-
constructor(view: Signal<View<{}> | undefined>);
|
|
16
|
-
mount(parent: Node, after?: Node | undefined): void;
|
|
17
|
-
unmount(parentIsUnmounting?: boolean): void;
|
|
18
|
-
private cleanup;
|
|
19
|
-
private update;
|
|
20
|
-
}
|
package/dist/core/store.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { type ComponentContext, type ElementContext, type StoreConsumerContext, type StoreProviderContext } from "./context.js";
|
|
2
|
-
import { type Logger } from "./logger.js";
|
|
3
|
-
import { type EffectFn, type UnsubscribeFn } from "./signals.js";
|
|
4
|
-
export type StoreFunction<Options, Value> = (this: StoreContext, options: Options, context: StoreContext) => Value;
|
|
5
|
-
export type StoreFactory<Options, Value> = Options extends undefined ? () => Store<Options, Value> : (options: Options) => Store<Options, Value>;
|
|
6
|
-
export interface StoreContext extends Omit<Logger, "setName">, ComponentContext, StoreConsumerContext {
|
|
7
|
-
/**
|
|
8
|
-
* True while this store is attached to a context that is currently mounted in the view tree.
|
|
9
|
-
*/
|
|
10
|
-
readonly isMounted: boolean;
|
|
11
|
-
/**
|
|
12
|
-
* Registers a callback to run just after this store is mounted.
|
|
13
|
-
*/
|
|
14
|
-
onMount(callback: () => void): void;
|
|
15
|
-
/**
|
|
16
|
-
* Registers a callback to run just after this store is unmounted.
|
|
17
|
-
*/
|
|
18
|
-
onUnmount(callback: () => void): void;
|
|
19
|
-
/**
|
|
20
|
-
* Passes a getter function to `callback` that will track reactive states and return their current values.
|
|
21
|
-
* Callback will be run each time a tracked state gets a new value.
|
|
22
|
-
*/
|
|
23
|
-
effect(callback: EffectFn): UnsubscribeFn;
|
|
24
|
-
}
|
|
25
|
-
export declare class Store<Options, Value> {
|
|
26
|
-
readonly fn: StoreFunction<Options, Value>;
|
|
27
|
-
private _options;
|
|
28
|
-
/**
|
|
29
|
-
* Value is guaranteed to be set after `attach` is called.
|
|
30
|
-
*/
|
|
31
|
-
value: Value;
|
|
32
|
-
isMounted: boolean;
|
|
33
|
-
elementContext: ElementContext;
|
|
34
|
-
lifecycleListeners: {
|
|
35
|
-
mount: (() => any)[];
|
|
36
|
-
unmount: (() => any)[];
|
|
37
|
-
};
|
|
38
|
-
logger: Logger;
|
|
39
|
-
id: string;
|
|
40
|
-
name: import("./signals.js").Source<string>;
|
|
41
|
-
constructor(fn: StoreFunction<Options, Value>, options: Options);
|
|
42
|
-
/**
|
|
43
|
-
* Attaches this Store to the elementContext.
|
|
44
|
-
* Returns false if there was already an instance attached, and true otherwise.
|
|
45
|
-
*/
|
|
46
|
-
attach(elementContext: ElementContext): boolean;
|
|
47
|
-
handleMount(): void;
|
|
48
|
-
handleUnmount(): void;
|
|
49
|
-
}
|
|
50
|
-
export declare function isStore<Options, Value>(value: any): value is Store<Options, Value>;
|
|
51
|
-
export declare class StoreError extends Error {
|
|
52
|
-
}
|
|
53
|
-
export type Stores = StoreProviderContext & StoreConsumerContext;
|
|
54
|
-
/**
|
|
55
|
-
* Global store registry.
|
|
56
|
-
*/
|
|
57
|
-
export declare const Stores: Stores;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fragment-CmWsN-4Y.js","sources":["../src/core/views/fragment.ts"],"sourcesContent":["import type { Renderable } from \"../../types.js\";\nimport { markup } from \"../markup.js\";\nimport { type ViewContext } from \"../nodes/view.js\";\n\n/**\n * A utility view that displays its children.\n */\nexport function Fragment(props: { children?: Renderable }, ctx: ViewContext) {\n return markup(\"$dynamic\", { source: () => props.children });\n}\n"],"names":["Fragment","props","ctx","markup"],"mappings":";AAOgB,SAAAA,EAASC,GAAkCC,GAAkB;AAC3E,SAAOC,EAAO,YAAY,EAAE,QAAQ,MAAMF,EAAM,UAAU;AAC5D;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-CBfhf3fA.js","sources":["../node_modules/alien-signals/esm/index.mjs","../src/core/signals.ts","../src/utils.ts","../src/core/env.ts","../src/core/logger.ts"],"sourcesContent":["// src/system.ts\nvar SubscriberFlags = /* @__PURE__ */ ((SubscriberFlags2) => {\n SubscriberFlags2[SubscriberFlags2[\"Computed\"] = 1] = \"Computed\";\n SubscriberFlags2[SubscriberFlags2[\"Effect\"] = 2] = \"Effect\";\n SubscriberFlags2[SubscriberFlags2[\"Tracking\"] = 4] = \"Tracking\";\n SubscriberFlags2[SubscriberFlags2[\"Notified\"] = 8] = \"Notified\";\n SubscriberFlags2[SubscriberFlags2[\"Recursed\"] = 16] = \"Recursed\";\n SubscriberFlags2[SubscriberFlags2[\"Dirty\"] = 32] = \"Dirty\";\n SubscriberFlags2[SubscriberFlags2[\"PendingComputed\"] = 64] = \"PendingComputed\";\n SubscriberFlags2[SubscriberFlags2[\"PendingEffect\"] = 128] = \"PendingEffect\";\n SubscriberFlags2[SubscriberFlags2[\"Propagated\"] = 224] = \"Propagated\";\n return SubscriberFlags2;\n})(SubscriberFlags || {});\nfunction createReactiveSystem({\n updateComputed,\n notifyEffect: notifyEffect2\n}) {\n let queuedEffects;\n let queuedEffectsTail;\n return {\n /**\n * Links a given dependency and subscriber if they are not already linked.\n * \n * @param dep - The dependency to be linked.\n * @param sub - The subscriber that depends on this dependency.\n * @returns The newly created link object if the two are not already linked; otherwise `undefined`.\n */\n link(dep, sub) {\n const currentDep = sub.depsTail;\n if (currentDep !== void 0 && currentDep.dep === dep) {\n return;\n }\n const nextDep = currentDep !== void 0 ? currentDep.nextDep : sub.deps;\n if (nextDep !== void 0 && nextDep.dep === dep) {\n sub.depsTail = nextDep;\n return;\n }\n const depLastSub = dep.subsTail;\n if (depLastSub !== void 0 && depLastSub.sub === sub && isValidLink(depLastSub, sub)) {\n return;\n }\n return linkNewDep(dep, sub, nextDep, currentDep);\n },\n /**\n * Traverses and marks subscribers starting from the provided link.\n * \n * It sets flags (e.g., Dirty, PendingComputed, PendingEffect) on each subscriber\n * to indicate which ones require re-computation or effect processing. \n * This function should be called after a signal's value changes.\n * \n * @param link - The starting link from which propagation begins.\n */\n propagate(link2) {\n let targetFlag = 32 /* Dirty */;\n let subs = link2;\n let stack = 0;\n top: do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if (!(subFlags & (4 /* Tracking */ | 16 /* Recursed */ | 224 /* Propagated */)) && (sub.flags = subFlags | targetFlag | 8 /* Notified */, true) || subFlags & 16 /* Recursed */ && !(subFlags & 4 /* Tracking */) && (sub.flags = subFlags & ~16 /* Recursed */ | targetFlag | 8 /* Notified */, true) || !(subFlags & 224 /* Propagated */) && isValidLink(link2, sub) && (sub.flags = subFlags | 16 /* Recursed */ | targetFlag | 8 /* Notified */, sub.subs !== void 0)) {\n const subSubs = sub.subs;\n if (subSubs !== void 0) {\n if (subSubs.nextSub !== void 0) {\n subSubs.prevSub = subs;\n link2 = subs = subSubs;\n targetFlag = 64 /* PendingComputed */;\n ++stack;\n } else {\n link2 = subSubs;\n targetFlag = subFlags & 2 /* Effect */ ? 128 /* PendingEffect */ : 64 /* PendingComputed */;\n }\n continue;\n }\n if (subFlags & 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & (4 /* Tracking */ | targetFlag))) {\n sub.flags = subFlags | targetFlag | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n } else if (!(subFlags & targetFlag) && subFlags & 224 /* Propagated */ && isValidLink(link2, sub)) {\n sub.flags = subFlags | targetFlag;\n }\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue;\n }\n while (stack) {\n --stack;\n const dep = subs.dep;\n const depSubs = dep.subs;\n subs = depSubs.prevSub;\n depSubs.prevSub = void 0;\n if ((link2 = subs.nextSub) !== void 0) {\n subs = link2;\n targetFlag = stack ? 64 /* PendingComputed */ : 32 /* Dirty */;\n continue top;\n }\n }\n break;\n } while (true);\n },\n /**\n * Prepares the given subscriber to track new dependencies.\n * \n * It resets the subscriber's internal pointers (e.g., depsTail) and\n * sets its flags to indicate it is now tracking dependency links.\n * \n * @param sub - The subscriber to start tracking.\n */\n startTracking(sub) {\n sub.depsTail = void 0;\n sub.flags = sub.flags & ~(8 /* Notified */ | 16 /* Recursed */ | 224 /* Propagated */) | 4 /* Tracking */;\n },\n /**\n * Concludes tracking of dependencies for the specified subscriber.\n * \n * It clears or unlinks any tracked dependency information, then\n * updates the subscriber's flags to indicate tracking is complete.\n * \n * @param sub - The subscriber whose tracking is ending.\n */\n endTracking(sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n const nextDep = depsTail.nextDep;\n if (nextDep !== void 0) {\n clearTracking(nextDep);\n depsTail.nextDep = void 0;\n }\n } else if (sub.deps !== void 0) {\n clearTracking(sub.deps);\n sub.deps = void 0;\n }\n sub.flags &= ~4 /* Tracking */;\n },\n /**\n * Updates the dirty flag for the given subscriber based on its dependencies.\n * \n * If the subscriber has any pending computeds, this function sets the Dirty flag\n * and returns `true`. Otherwise, it clears the PendingComputed flag and returns `false`.\n * \n * @param sub - The subscriber to update.\n * @param flags - The current flag set for this subscriber.\n * @returns `true` if the subscriber is marked as Dirty; otherwise `false`.\n */\n updateDirtyFlag(sub, flags) {\n if (checkDirty(sub.deps)) {\n sub.flags = flags | 32 /* Dirty */;\n return true;\n } else {\n sub.flags = flags & ~64 /* PendingComputed */;\n return false;\n }\n },\n /**\n * Updates the computed subscriber if necessary before its value is accessed.\n * \n * If the subscriber is marked Dirty or PendingComputed, this function runs\n * the provided updateComputed logic and triggers a shallowPropagate for any\n * downstream subscribers if an actual update occurs.\n * \n * @param computed - The computed subscriber to update.\n * @param flags - The current flag set for this subscriber.\n */\n processComputedUpdate(computed2, flags) {\n if (flags & 32 /* Dirty */ || (checkDirty(computed2.deps) ? true : (computed2.flags = flags & ~64 /* PendingComputed */, false))) {\n if (updateComputed(computed2)) {\n const subs = computed2.subs;\n if (subs !== void 0) {\n shallowPropagate(subs);\n }\n }\n }\n },\n /**\n * Ensures all pending internal effects for the given subscriber are processed.\n * \n * This should be called after an effect decides not to re-run itself but may still\n * have dependencies flagged with PendingEffect. If the subscriber is flagged with\n * PendingEffect, this function clears that flag and invokes `notifyEffect` on any\n * related dependencies marked as Effect and Propagated, processing pending effects.\n * \n * @param sub - The subscriber which may have pending effects.\n * @param flags - The current flags on the subscriber to check.\n */\n processPendingInnerEffects(sub, flags) {\n if (flags & 128 /* PendingEffect */) {\n sub.flags = flags & ~128 /* PendingEffect */;\n let link2 = sub.deps;\n do {\n const dep = link2.dep;\n if (\"flags\" in dep && dep.flags & 2 /* Effect */ && dep.flags & 224 /* Propagated */) {\n notifyEffect2(dep);\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n },\n /**\n * Processes queued effect notifications after a batch operation finishes.\n * \n * Iterates through all queued effects, calling notifyEffect on each.\n * If an effect remains partially handled, its flags are updated, and future\n * notifications may be triggered until fully handled.\n */\n processEffectNotifications() {\n while (queuedEffects !== void 0) {\n const effect2 = queuedEffects;\n const depsTail = effect2.depsTail;\n const queuedNext = depsTail.nextDep;\n if (queuedNext !== void 0) {\n depsTail.nextDep = void 0;\n queuedEffects = queuedNext.sub;\n } else {\n queuedEffects = void 0;\n queuedEffectsTail = void 0;\n }\n if (!notifyEffect2(effect2)) {\n effect2.flags &= ~8 /* Notified */;\n }\n }\n }\n };\n function linkNewDep(dep, sub, nextDep, depsTail) {\n const newLink = {\n dep,\n sub,\n nextDep,\n prevSub: void 0,\n nextSub: void 0\n };\n if (depsTail === void 0) {\n sub.deps = newLink;\n } else {\n depsTail.nextDep = newLink;\n }\n if (dep.subs === void 0) {\n dep.subs = newLink;\n } else {\n const oldTail = dep.subsTail;\n newLink.prevSub = oldTail;\n oldTail.nextSub = newLink;\n }\n sub.depsTail = newLink;\n dep.subsTail = newLink;\n return newLink;\n }\n function checkDirty(link2) {\n let stack = 0;\n let dirty;\n top: do {\n dirty = false;\n const dep = link2.dep;\n if (\"flags\" in dep) {\n const depFlags = dep.flags;\n if ((depFlags & (1 /* Computed */ | 32 /* Dirty */)) === (1 /* Computed */ | 32 /* Dirty */)) {\n if (updateComputed(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== void 0) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n } else if ((depFlags & (1 /* Computed */ | 64 /* PendingComputed */)) === (1 /* Computed */ | 64 /* PendingComputed */)) {\n const depSubs = dep.subs;\n if (depSubs.nextSub !== void 0) {\n depSubs.prevSub = link2;\n }\n link2 = dep.deps;\n ++stack;\n continue;\n }\n }\n if (!dirty && link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue;\n }\n if (stack) {\n let sub = link2.sub;\n do {\n --stack;\n const subSubs = sub.subs;\n if (dirty) {\n if (updateComputed(sub)) {\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n shallowPropagate(sub.subs);\n sub = link2.sub;\n } else {\n sub = subSubs.sub;\n }\n continue;\n }\n } else {\n sub.flags &= ~64 /* PendingComputed */;\n }\n if ((link2 = subSubs.prevSub) !== void 0) {\n subSubs.prevSub = void 0;\n if (link2.nextDep !== void 0) {\n link2 = link2.nextDep;\n continue top;\n }\n sub = link2.sub;\n } else {\n if ((link2 = subSubs.nextDep) !== void 0) {\n continue top;\n }\n sub = subSubs.sub;\n }\n dirty = false;\n } while (stack);\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link2) {\n do {\n const sub = link2.sub;\n const subFlags = sub.flags;\n if ((subFlags & (64 /* PendingComputed */ | 32 /* Dirty */)) === 64 /* PendingComputed */) {\n sub.flags = subFlags | 32 /* Dirty */ | 8 /* Notified */;\n if ((subFlags & (2 /* Effect */ | 8 /* Notified */)) === 2 /* Effect */) {\n if (queuedEffectsTail !== void 0) {\n queuedEffectsTail.depsTail.nextDep = sub.deps;\n } else {\n queuedEffects = sub;\n }\n queuedEffectsTail = sub;\n }\n }\n link2 = link2.nextSub;\n } while (link2 !== void 0);\n }\n function isValidLink(checkLink, sub) {\n const depsTail = sub.depsTail;\n if (depsTail !== void 0) {\n let link2 = sub.deps;\n do {\n if (link2 === checkLink) {\n return true;\n }\n if (link2 === depsTail) {\n break;\n }\n link2 = link2.nextDep;\n } while (link2 !== void 0);\n }\n return false;\n }\n function clearTracking(link2) {\n do {\n const dep = link2.dep;\n const nextDep = link2.nextDep;\n const nextSub = link2.nextSub;\n const prevSub = link2.prevSub;\n if (nextSub !== void 0) {\n nextSub.prevSub = prevSub;\n } else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== void 0) {\n prevSub.nextSub = nextSub;\n } else {\n dep.subs = nextSub;\n }\n if (dep.subs === void 0 && \"deps\" in dep) {\n const depFlags = dep.flags;\n if (!(depFlags & 32 /* Dirty */)) {\n dep.flags = depFlags | 32 /* Dirty */;\n }\n const depDeps = dep.deps;\n if (depDeps !== void 0) {\n link2 = depDeps;\n dep.depsTail.nextDep = nextDep;\n dep.deps = void 0;\n dep.depsTail = void 0;\n continue;\n }\n }\n link2 = nextDep;\n } while (link2 !== void 0);\n }\n}\n\n// src/index.ts\nvar {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects\n} = createReactiveSystem({\n updateComputed(computed2) {\n const prevSub = activeSub;\n activeSub = computed2;\n startTracking(computed2);\n try {\n const oldValue = computed2.currentValue;\n const newValue = computed2.getter(oldValue);\n if (oldValue !== newValue) {\n computed2.currentValue = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(computed2);\n }\n },\n notifyEffect(e) {\n if (\"isScope\" in e) {\n return notifyEffectScope(e);\n } else {\n return notifyEffect(e);\n }\n }\n});\nvar pauseStack = [];\nvar batchDepth = 0;\nvar activeSub;\nvar activeScope;\nfunction startBatch() {\n ++batchDepth;\n}\nfunction endBatch() {\n if (!--batchDepth) {\n processEffectNotifications();\n }\n}\nfunction pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = void 0;\n}\nfunction resumeTracking() {\n activeSub = pauseStack.pop();\n}\nfunction signal(oldValue) {\n return signalGetterSetter.bind({\n currentValue: oldValue,\n subs: void 0,\n subsTail: void 0\n });\n}\nfunction computed(getter) {\n return computedGetter.bind({\n currentValue: void 0,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 1 /* Computed */ | 32 /* Dirty */,\n getter\n });\n}\nfunction effect(fn) {\n const e = {\n fn,\n subs: void 0,\n subsTail: void 0,\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */\n };\n if (activeSub !== void 0) {\n link(e, activeSub);\n } else if (activeScope !== void 0) {\n link(e, activeScope);\n }\n runEffect(e);\n return effectStop.bind(e);\n}\nfunction effectScope(fn) {\n const e = {\n deps: void 0,\n depsTail: void 0,\n flags: 2 /* Effect */,\n isScope: true\n };\n runEffectScope(e, fn);\n return effectStop.bind(e);\n}\nfunction runEffect(e) {\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n e.fn();\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n}\nfunction runEffectScope(e, fn) {\n const prevSub = activeScope;\n activeScope = e;\n startTracking(e);\n try {\n fn();\n } finally {\n activeScope = prevSub;\n endTracking(e);\n }\n}\nfunction notifyEffect(e) {\n const flags = e.flags;\n if (flags & 32 /* Dirty */ || flags & 64 /* PendingComputed */ && updateDirtyFlag(e, flags)) {\n runEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n}\nfunction notifyEffectScope(e) {\n const flags = e.flags;\n if (flags & 128 /* PendingEffect */) {\n processPendingInnerEffects(e, e.flags);\n return true;\n }\n return false;\n}\nfunction computedGetter() {\n const flags = this.flags;\n if (flags & (32 /* Dirty */ | 64 /* PendingComputed */)) {\n processComputedUpdate(this, flags);\n }\n if (activeSub !== void 0) {\n link(this, activeSub);\n } else if (activeScope !== void 0) {\n link(this, activeScope);\n }\n return this.currentValue;\n}\nfunction signalGetterSetter(...value) {\n if (value.length) {\n if (this.currentValue !== (this.currentValue = value[0])) {\n const subs = this.subs;\n if (subs !== void 0) {\n propagate(subs);\n if (!batchDepth) {\n processEffectNotifications();\n }\n }\n }\n } else {\n if (activeSub !== void 0) {\n link(this, activeSub);\n }\n return this.currentValue;\n }\n}\nfunction effectStop() {\n startTracking(this);\n endTracking(this);\n}\nexport {\n SubscriberFlags,\n computed,\n createReactiveSystem,\n effect,\n effectScope,\n endBatch,\n pauseTracking,\n resumeTracking,\n signal,\n startBatch\n};\n","import { createReactiveSystem, type Dependency, type Subscriber, SubscriberFlags } from \"alien-signals\";\nimport { isFunction } from \"../typeChecking\";\n\nexport interface Effect extends Subscriber, Dependency {\n /**\n * Effect function. Can return an optional cleanup callback to be invoked before the next fn() call.\n */\n fn(): (() => void) | void;\n\n cleanup?: () => void;\n}\n\nexport interface Computed<T = any> extends Value<T | undefined>, Subscriber {\n getter: (cachedValue?: T) => T;\n equals: EqualityFn<T>;\n}\n\nexport interface Value<T = any> extends Dependency {\n current: T;\n}\n\nexport const {\n link,\n propagate,\n updateDirtyFlag,\n startTracking,\n endTracking,\n processEffectNotifications,\n processComputedUpdate,\n processPendingInnerEffects,\n} = createReactiveSystem({\n updateComputed(c: Computed): boolean {\n const prevSub = activeSub;\n activeSub = c;\n startTracking(c);\n try {\n const oldValue = c.current;\n const newValue = c.getter(oldValue);\n if (!c.equals(oldValue, newValue)) {\n c.current = newValue;\n return true;\n }\n return false;\n } finally {\n activeSub = prevSub;\n endTracking(c);\n }\n },\n notifyEffect(e: Effect) {\n const flags = e.flags;\n if (flags & SubscriberFlags.Dirty || (flags & SubscriberFlags.PendingComputed && updateDirtyFlag(e, flags))) {\n queueEffect(e);\n } else {\n processPendingInnerEffects(e, e.flags);\n }\n return true;\n },\n});\n\n/*===================================*\\\n|| EFFECTS & TRACKING ||\n\\*===================================*/\n\nexport let activeSub: Subscriber | undefined;\n\nconst PENDING_EFFECTS: Effect[] = [];\n\nlet flushPending = false;\n\nfunction flushEffects(): void {\n if (!flushPending) {\n flushPending = true;\n\n queueMicrotask(() => {\n flushPending = false;\n for (let i = 0; i < PENDING_EFFECTS.length; i++) {\n const e = PENDING_EFFECTS[i];\n const prevSub = activeSub;\n activeSub = e;\n startTracking(e);\n try {\n if (e.cleanup) {\n pauseTracking();\n e.cleanup();\n resumeTracking();\n }\n e.cleanup = e.fn() ?? undefined;\n } finally {\n activeSub = prevSub;\n endTracking(e);\n }\n }\n PENDING_EFFECTS.length = 0;\n });\n }\n}\n\nexport function queueEffect(e: Effect) {\n PENDING_EFFECTS.push(e);\n flushEffects();\n}\n\nexport function stopEffect(this: Effect): void {\n startTracking(this);\n endTracking(this);\n // Cancel it after it receives its current value.\n queueMicrotask(() => {\n PENDING_EFFECTS.splice(PENDING_EFFECTS.indexOf(this), 1);\n if (this.cleanup) {\n this.cleanup();\n }\n });\n}\n\nconst pauseStack: (Subscriber | undefined)[] = [];\n\nexport function pauseTracking() {\n pauseStack.push(activeSub);\n activeSub = undefined;\n}\n\nexport function resumeTracking() {\n activeSub = pauseStack.pop();\n}\n\n/*===================================*\\\n|| API ||\n\\*===================================*/\n\n/* -------------- TYPES --------------- */\n\nconst SIGNAL = Symbol(\"SIGNAL\");\nconst SOURCE = Symbol(\"SOURCE\");\n\n/**\n * A getter that returns the current value held within the signal.\n * If called inside a trackable scope this signal will be tracked as a dependency.\n */\nexport interface Signal<T> {\n (): T;\n}\n\n/**\n * Extends Signal with the ability to pass a value or an updater function to change the Signal's value.\n */\nexport interface Source<T> extends Signal<T> {\n (value: T): void;\n (updater: (value: T) => T): void;\n}\n\nexport type MaybeSignal<T> = Signal<T> | T;\n\nexport type EqualityFn<T> = (current: T, next: T) => boolean;\nexport interface SignalOptions<T> {\n /**\n * A function to compare the current and next values. Returning `true` means the value has changed.\n */\n equals?: EqualityFn<T>;\n}\n\n/* -------------- PUBLIC API --------------- */\n\nexport function isSource<T>(value: MaybeSignal<T>): value is Source<T> {\n return isFunction(value) && (value as any)._type === SOURCE;\n}\n\nexport function peek<T>(value: MaybeSignal<T>) {\n let result: T;\n pauseTracking();\n result = get(value);\n resumeTracking();\n return result;\n}\n\nexport function get<T>(value: MaybeSignal<T>) {\n if (isFunction(value)) {\n return (value as () => T)();\n } else {\n return value;\n }\n}\n\n/**\n * Function to be invoked for the effect. Can return an optional cleanup function to be called between invocations.\n */\nexport type EffectFn = () => void | (() => void);\n\nexport type UnsubscribeFn = () => void;\n\n/**\n * Creates a tracked scope that re-runs whenever the values of any tracked reactives changes.\n * Reactives are tracked by accessing their `value` within the body of the function.\n *\n * NOTE: You must call the unsubscribe function to stop watching for changes.\n * If you are using an effect inside a View or Store, use `ctx.effect` instead, which cleans up automatically when the component unmounts.\n */\nexport function effect(fn: EffectFn): UnsubscribeFn {\n const e: Effect = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Effect,\n };\n if (activeSub !== undefined) {\n link(e, activeSub);\n }\n queueEffect(e);\n return stopEffect.bind(e);\n}\n\nexport function $<T>(compute: () => MaybeSignal<T>, options?: SignalOptions<T>): Signal<T>;\nexport function $<T>(value: T, options?: SignalOptions<T>): Source<T>;\nexport function $<T>(value: undefined, options?: SignalOptions<T>): Source<T | undefined>;\nexport function $<T>(): Source<T | undefined>;\n\nexport function $<T>(init?: (() => T) | T, options?: SignalOptions<T>) {\n if (isFunction(init)) {\n return _createSignal(init as () => T, options);\n } else if (init === undefined) {\n return _createSource<T | undefined>(undefined, options as SignalOptions<T | undefined>);\n } else {\n return _createSource(init, options);\n }\n}\n\n/* -------------- INTERNAL --------------- */\n\nfunction _createSource<T>(initialValue: T, options?: SignalOptions<T>): Source<T> {\n const value: Value<T> = {\n current: initialValue,\n subs: undefined,\n subsTail: undefined,\n };\n const equals = options?.equals ?? Object.is;\n const signal: Signal<any> = function () {\n if (arguments.length > 0) {\n let next = arguments[0] as T;\n\n if (typeof next === \"function\") {\n next = next(value.current);\n }\n\n if (!equals(value.current, next)) {\n value.current = next;\n const subs = value.subs;\n if (subs !== undefined) {\n propagate(subs);\n processEffectNotifications();\n }\n }\n } else {\n if (activeSub !== undefined) {\n link(value, activeSub);\n }\n return value.current;\n }\n };\n (signal as any)._type = SOURCE;\n\n return signal;\n}\n\nfunction _createSignal<T>(fn: (cachedValue?: T) => T, options?: SignalOptions<T>): Signal<T> {\n if (isFunction(fn) && (fn as any)._type === SIGNAL) {\n if ((fn as any)._type === SOURCE) {\n return (() => fn()) as Signal<T>;\n } else {\n return fn as Signal<T>;\n }\n }\n\n const computed: Computed<T> = {\n current: undefined,\n equals: options?.equals ?? Object.is,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: SubscriberFlags.Computed | SubscriberFlags.Dirty,\n getter: (cachedValue?: T) => {\n const returned = fn(cachedValue);\n\n // If a signal is returned, track it and return its value.\n return get(returned);\n },\n };\n const signal: Signal<T> = function () {\n if (arguments.length > 0) {\n throw new Error(\"Signals cannot be set as their values are derived from the sources they depend on.\");\n }\n if (activeSub !== undefined) {\n link(computed, activeSub);\n }\n const flags = computed.flags;\n if (flags & (SubscriberFlags.Dirty | SubscriberFlags.PendingComputed)) {\n processComputedUpdate(computed, flags);\n }\n return computed.current!;\n };\n (signal as any)._type = SIGNAL;\n\n return signal;\n}\n","import { isFunction, isObject, typeOf } from \"./typeChecking.js\";\n\nexport const noOp = () => {};\n\n// Guarantee unique ID by incrementing a global counter.\nlet idCounter = 1;\nexport function getUniqueId(): string {\n idCounter = (idCounter % Number.MAX_SAFE_INTEGER) + 1;\n return idCounter.toString(36) + Date.now().toString(36);\n}\n\n/*=============================*\\\n|| Object Equality ||\n\\*=============================*/\n\n/**\n * Equality check that passes if both values are the same object.\n * This is the default equality check for states.\n */\nexport function strictEqual(a: any, b: any): boolean {\n return Object.is(a, b);\n}\n\n/**\n * Equality check that passes if both values are the same object, or if both are objects or arrays with equal keys and values.\n */\nexport function shallowEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true;\n\n // Must be same type\n const t = typeOf(a);\n if (t !== typeOf(b)) {\n return false;\n }\n\n switch (t) {\n case \"object\":\n // Objects must have same number of keys with strict equal values\n let size = 0;\n for (const key in a) {\n if (a[key] !== b[key]) return false;\n size++;\n }\n return Object.keys(b).length === size;\n case \"array\":\n // Arrays must be the same length with strict equal values\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n case \"map\":\n if (a.size !== b.size) return false;\n for (const key of a.keys()) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n case \"set\":\n if (isFunction(a.symmetricDifference)) {\n return a.symmetricDifference(b).size === 0;\n } else {\n for (const key of a.keys()) {\n if (a[key] !== b.get(key)) return false;\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Equality check that passes if two objects have equal values, even if they are not the same object.\n */\n// NOTE: This code is https://github.com/epoberezkin/fast-deep-equal licensed under MIT.\n// I imported it because I couldn't get the old school module to play nice with my modern ES code as an external dependency.\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n\n if (a && b && typeof a == \"object\" && typeof b == \"object\") {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n for (i of a.entries()) if (!deepEqual(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (i of a.entries()) if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = (a as any).length;\n if (length != (b as any).length) return false;\n for (i = length; i-- !== 0; ) if ((a as any)[i] !== (b as any)[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0; ) {\n var key = keys[i];\n\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a !== a && b !== b;\n}\n\n/*=============================*\\\n|| Object Utils ||\n\\*=============================*/\n\n/**\n * Takes an old value and a new value. Returns a merged copy if both are objects, otherwise returns the new value.\n */\nexport function merge(one: unknown, two: unknown) {\n if (isObject(one)) {\n if (!isObject(two)) {\n return two;\n }\n\n const merged = Object.assign({}, one) as any;\n\n for (const key in two) {\n merged[key] = merge(merged[key], two[key]);\n }\n\n return merged;\n } else {\n return two;\n }\n}\n\n/**\n * Returns a new object without the specified keys.\n * If called without object, returns a function that takes an object\n * and returns a version with the original keys omitted.\n *\n * @param keys - An array of keys to omit.\n * @param object - An object to clone without the omitted keys.\n */\nexport function omit<O extends Record<any, any>>(keys: (keyof O)[], object: O): Record<any, any> {\n const newObject: Record<any, any> = {};\n\n for (const key in object) {\n if (!keys.includes(key)) {\n newObject[key] = object[key];\n }\n }\n\n return newObject;\n}\n\n/*=============================*\\\n|| Misc Utils ||\n\\*=============================*/\n\n/**\n * Takes any string and returns an OKLCH color.\n */\nexport function okhash(value: string) {\n let hue = 0;\n for (let i = 0; i < value.length; i++) {\n hue = (hue + value.charCodeAt(i) * 10) % 360;\n }\n return `oklch(0.68 0.15 ${hue}deg)`;\n}\n\nexport type MatcherFunction = (value: string) => boolean;\n\n/**\n * Parses a filter string into a matcher function.\n *\n * @param pattern - A string or regular expression that specifies a pattern for names of loggers whose messages you want to display.\n */\nexport function createMatcher(pattern: string | RegExp): MatcherFunction {\n if (pattern instanceof RegExp) {\n return (value: string) => pattern.test(value);\n }\n\n const matchers: Record<\"positive\" | \"negative\", MatcherFunction[]> = {\n positive: [],\n negative: [],\n };\n\n const parts = pattern\n .split(\",\")\n .map((p) => p.trim())\n .filter((p) => p !== \"\");\n\n for (let part of parts) {\n let section: \"positive\" | \"negative\" = \"positive\";\n\n if (part.startsWith(\"-\")) {\n section = \"negative\";\n part = part.slice(1);\n }\n\n if (part === \"*\") {\n matchers[section].push(function () {\n return true;\n });\n } else if (part.endsWith(\"*\")) {\n matchers[section].push(function (value) {\n return value.startsWith(part.slice(0, part.length - 1));\n });\n } else {\n matchers[section].push(function (value) {\n return value === part;\n });\n }\n }\n\n return function (name: string) {\n const { positive, negative } = matchers;\n\n // Matching any negative matcher disqualifies.\n if (negative.some((fn) => fn(name))) {\n return false;\n }\n\n // Matching at least one positive matcher is required if any are specified.\n if (positive.length > 0 && !positive.some((fn) => fn(name))) {\n return false;\n }\n\n return true;\n };\n}\n","export type Env = \"production\" | \"development\";\n\nlet env: Env = \"production\";\n\n/**\n * Gets the current environment value.\n */\nexport function getEnv(): Env {\n return env;\n}\n\n/**\n * Sets the environment value. Affects which log messages will print and how much debugging info is included in the DOM.\n */\nexport function setEnv(value: Env) {\n env = value;\n}\n","import { isString } from \"../typeChecking\";\nimport { createMatcher, noOp, okhash, type MatcherFunction } from \"../utils\";\nimport { getEnv, type Env } from \"./env\";\nimport { get, type MaybeSignal } from \"./signals\";\n\nexport interface LogLevels {\n info: boolean | Env;\n log: boolean | Env;\n warn: boolean | Env;\n error: boolean | Env;\n}\n\nexport interface Logger {\n info(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n crash(error: Error): void;\n}\n\nexport interface LoggerOptions {\n /**\n * Tag value to print with logs.\n */\n tag?: string;\n\n /**\n * Label for tag value. Will be printed without a label if not specified.\n */\n tagName?: string;\n\n /**\n * Console object to use for logging (mostly for testing). Uses window.console by default.\n */\n console?: any;\n}\n\nexport interface LoggerErrorContext {\n error: Error;\n loggerName: string;\n tag?: string;\n tagName?: string;\n}\n\nlet levels: LogLevels = {\n info: \"development\",\n log: \"development\",\n warn: \"development\",\n error: true,\n};\nlet match: MatcherFunction = createMatcher(\"*,-Dolla.*\");\nlet crashListeners: ((context: LoggerErrorContext) => void)[] = [];\n\nexport function onLoggerCrash(listener: (context: LoggerErrorContext) => void) {\n crashListeners.push(listener);\n\n return function cancel() {\n crashListeners.splice(crashListeners.indexOf(listener), 1);\n };\n}\n\nexport function createLogger(name: MaybeSignal<string>, options?: LoggerOptions): Logger {\n const _console = options?.console ?? _getDefaultConsole();\n\n const bind = (method: keyof LogLevels) => {\n let _name = get(name);\n if (levels[method] === false || (isString(levels[method]) && levels[method] !== getEnv()) || !match(_name)) {\n return noOp;\n } else {\n let label = `%c${_name}`;\n if (options?.tag) {\n if (options.tagName) {\n label += ` %c[${options.tagName}: %c${options.tag}%c]`;\n } else {\n label += ` %c[%c${options.tag}%c]`;\n }\n } else {\n label += `%c%c%c`;\n }\n return _console[method].bind(\n _console,\n label,\n `color:${okhash(label)};font-weight:bold`,\n `color:#777`,\n `color:#aaa`,\n `color:#777`,\n );\n }\n };\n\n return {\n get info() {\n return bind(\"info\");\n },\n get log() {\n return bind(\"log\");\n },\n get warn() {\n return bind(\"warn\");\n },\n get error() {\n return bind(\"error\");\n },\n crash(error: Error) {\n const ctx: LoggerErrorContext = {\n error,\n loggerName: get(name),\n tag: options?.tag,\n tagName: options?.tagName,\n };\n\n for (const listener of crashListeners) {\n listener(ctx);\n }\n },\n };\n}\n\nexport function setLogFilter(filter: string | RegExp) {\n match = createMatcher(filter);\n}\n\nexport function setLogLevels(options: Partial<LogLevels>) {\n for (const key in options) {\n const value = options[key as keyof LogLevels];\n if (value) {\n levels[key as keyof LogLevels] = value;\n }\n }\n}\n\nfunction _getDefaultConsole() {\n if (typeof window !== \"undefined\" && window.console) {\n return window.console;\n }\n if (typeof global !== \"undefined\" && global.console) {\n return global.console;\n }\n}\n"],"names":["SubscriberFlags","SubscriberFlags2","createReactiveSystem","updateComputed","notifyEffect2","queuedEffects","queuedEffectsTail","dep","sub","currentDep","nextDep","depLastSub","isValidLink","linkNewDep","link2","targetFlag","subs","stack","top","subFlags","subSubs","depSubs","depsTail","clearTracking","flags","checkDirty","computed2","shallowPropagate","effect2","queuedNext","newLink","oldTail","dirty","depFlags","checkLink","nextSub","prevSub","depDeps","link","propagate","updateDirtyFlag","startTracking","endTracking","processEffectNotifications","processComputedUpdate","processPendingInnerEffects","oldValue","newValue","notifyEffectScope","notifyEffect","runEffect","c","activeSub","queueEffect","PENDING_EFFECTS","flushPending","flushEffects","i","e","pauseTracking","resumeTracking","stopEffect","pauseStack","SIGNAL","SOURCE","peek","value","result","get","isFunction","effect","fn","$","init","options","_createSignal","_createSource","initialValue","equals","signal","next","computed","cachedValue","returned","noOp","idCounter","getUniqueId","strictEqual","a","b","shallowEqual","t","typeOf","size","key","deepEqual","length","keys","omit","object","newObject","okhash","hue","createMatcher","pattern","matchers","parts","p","part","section","name","positive","negative","env","getEnv","setEnv","levels","match","crashListeners","onLoggerCrash","listener","createLogger","_console","_getDefaultConsole","bind","method","_name","isString","label","error","ctx","setLogFilter","filter","setLogLevels"],"mappings":"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","x_google_ignoreList":[0]}
|