@firsthandjs/core 0.10.0 → 0.10.1

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/dist/cell.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * One node of the reactive graph, and the equality it compares with.
3
+ *
4
+ * Signals, computeds and effects are all this class, so that every property
5
+ * access in the graph code sees one hidden class — which `npm run bench:ic`
6
+ * measures rather than assumes.
7
+ *
8
+ * It reads `activeSub` and calls into `core.ts`; it never writes the graph's
9
+ * state, which is what lets it sit beside the algorithm rather than inside it.
10
+ */
11
+ import type { Link } from './link.js';
12
+ import type { Owner } from './core.js';
13
+ /**
14
+ * One node of the reactive graph. Signals, computeds and effects all use this
15
+ * class so that every property access in the graph code sees one hidden class.
16
+ */
17
+ export declare class Cell {
18
+ flags: number;
19
+ /** Signal value, or the memoised result of `fn`. */
20
+ v: unknown;
21
+ /** Computed body, or effect body. `undefined` for signals. */
22
+ fn: (() => unknown) | undefined;
23
+ equals: (a: unknown, b: unknown) => boolean;
24
+ deps: Link | undefined;
25
+ depsTail: Link | undefined;
26
+ subs: Link | undefined;
27
+ subsTail: Link | undefined;
28
+ /** An effect's own scope: re-created on every run. `undefined` otherwise. */
29
+ scope: Owner | undefined;
30
+ constructor(flags: number, value: unknown, fn: (() => unknown) | undefined, equals: (a: unknown, b: unknown) => boolean);
31
+ get value(): unknown;
32
+ set value(next: unknown);
33
+ /** Reads without subscribing, and without refreshing lazily... except that a
34
+ * stale computed must still produce a correct value, so it does refresh. */
35
+ peek(): unknown;
36
+ /** Functional update. The updater runs untracked. */
37
+ set(updater: (previous: never) => unknown): void;
38
+ }
39
+ export declare function defaultEquals<T>(equals: ((a: T, b: T) => boolean) | false | undefined): (a: unknown, b: unknown) => boolean;
40
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAOvC;;;GAGG;AACH,qBAAa,IAAI;IACP,KAAK,EAAE,MAAM,CAAC;IACtB,oDAAoD;IAC5C,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IACtD,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC5C,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACnC,6EAA6E;IACrE,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAG/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,EAC/B,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO;IAa7C,IAAI,KAAK,IAAI,OAAO,CAenB;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,EAKtB;IAED;iFAC6E;IAC7E,IAAI,IAAI,OAAO;IAQf,qDAAqD;IACrD,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI;CAMjD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAC7B,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,SAAS,GACpD,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAQrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAKlF"}
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAKlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CACpC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAI/C,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAgBpF;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAInB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAiBlE"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CACpC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAI/C,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAgBpF;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAInB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAiBlE"}
package/dist/core.d.ts CHANGED
@@ -6,14 +6,17 @@
6
6
  * edges. The public API is layered on top in `signal.ts`, `computed.ts`,
7
7
  * `effect.ts`, `lifecycle.ts` and `context.ts`.
8
8
  *
9
- * ## Why this is one module
9
+ * ## Why this is still one module
10
10
  *
11
- * It is 561 statements against a 300-statement limit
11
+ * It is 463 lines against a 300-line limit
12
12
  * (docs/architecture/code-rules.md §1), and it is the only file in the
13
13
  * repository that does not meet it. That is a decision rather than an
14
14
  * oversight, and this is the evidence for it.
15
15
  *
16
- * Four of the sections below write the same three module variables:
16
+ * The data structures have left: `Link` is in `link.ts` and `Cell` is in
17
+ * `cell.ts`, because neither writes the graph's state and a type-only import
18
+ * costs nothing. What remains is four sections that write the same three
19
+ * module variables:
17
20
  *
18
21
  * | Variable | Written by |
19
22
  * | --------------- | --------------------------------------------------- |
@@ -21,16 +24,19 @@
21
24
  * | `currentOwner` | `evaluate`, `runEffect`, `setOwner`, `deferOwner` |
22
25
  * | `deferred` | the same four |
23
26
  *
24
- * A module cannot assign a binding it imported, so splitting those sections
25
- * apart means one of two things: a shared state object, which puts a property
26
- * load in front of every `activeSub` read — including the one in `Cell.value`,
27
- * the hottest read in the framework — or setter functions, which put a call
28
- * there instead. Both are changes to exactly what `npm run bench:ic` exists to
27
+ * A module cannot assign a binding it imported, so splitting *those* apart
28
+ * means one of two things: a shared state object, which puts a property load
29
+ * in front of every `activeSub` read — including the one in `Cell.value`, the
30
+ * hottest read in the framework — or setter functions, which put a call there
31
+ * instead. Both are changes to exactly what `npm run bench:ic` exists to
29
32
  * watch, and CONTRIBUTING §2 does not accept "probably fine" for that.
30
33
  *
31
- * So the limit stands and this file is the documented exception, not a
32
- * precedent: it has one reason to change, which is the reactive algorithm. If
33
- * somebody wants the split, the way to get it is a branch that does it, a
34
+ * `Cell` reading `activeSub` across a module boundary is not that case: a read
35
+ * of an imported binding is a plain variable read once esbuild has
36
+ * concatenated the package, which `bench:ic` confirmed at 1.02x either way.
37
+ *
38
+ * So what is left has one reason to change, which is the reactive algorithm.
39
+ * Anything further comes the same way this split did: a branch, a
34
40
  * before-and-after from `bench`, `bench:micro` and `bench:ic`, and a number
35
41
  * showing the reads stayed monomorphic.
36
42
  *
@@ -43,43 +49,7 @@
43
49
  * existing dependency list in order and reuses links in place, so the common
44
50
  * case allocates nothing.
45
51
  */
46
- /** One dependency edge, shared by the source's subscriber list and the
47
- * subscriber's dependency list. */
48
- export declare class Link {
49
- dep: Cell;
50
- sub: Cell;
51
- prevDep: Link | undefined;
52
- nextDep: Link | undefined;
53
- prevSub: Link | undefined;
54
- nextSub: Link | undefined;
55
- constructor(dep: Cell, sub: Cell, prevDep: Link | undefined, nextDep: Link | undefined, prevSub: Link | undefined);
56
- }
57
- /**
58
- * One node of the reactive graph. Signals, computeds and effects all use this
59
- * class so that every property access in the graph code sees one hidden class.
60
- */
61
- export declare class Cell {
62
- flags: number;
63
- /** Signal value, or the memoised result of `fn`. */
64
- v: unknown;
65
- /** Computed body, or effect body. `undefined` for signals. */
66
- fn: (() => unknown) | undefined;
67
- equals: (a: unknown, b: unknown) => boolean;
68
- deps: Link | undefined;
69
- depsTail: Link | undefined;
70
- subs: Link | undefined;
71
- subsTail: Link | undefined;
72
- /** An effect's own scope: re-created on every run. `undefined` otherwise. */
73
- scope: Owner | undefined;
74
- constructor(flags: number, value: unknown, fn: (() => unknown) | undefined, equals: (a: unknown, b: unknown) => boolean);
75
- get value(): unknown;
76
- set value(next: unknown);
77
- /** Reads without subscribing, and without refreshing lazily... except that a
78
- * stale computed must still produce a correct value, so it does refresh. */
79
- peek(): unknown;
80
- /** Functional update. The updater runs untracked. */
81
- set(updater: (previous: never) => unknown): void;
82
- }
52
+ import type { Cell } from './cell.js';
83
53
  /**
84
54
  * A logical scope (ADR-0008). Owners form a tree that is independent of the
85
55
  * DOM, which is what lets portals keep their context and disposal behaviour.
@@ -102,6 +72,16 @@ export type Owner = {
102
72
  handler: ((error: unknown) => void) | null;
103
73
  };
104
74
  export type ContextRecord = Record<symbol, unknown>;
75
+ /** The node currently evaluating, i.e. the one that collects dependencies. */
76
+ export declare let activeSub: Cell | undefined;
77
+ /**
78
+ * Subscribes `sub` to `dep`, reusing the link already at this position of
79
+ * `sub`'s dependency list when the dependency order is unchanged.
80
+ */
81
+ export declare function link(dep: Cell, sub: Cell): void;
82
+ export declare function write(cell: Cell, next: unknown): void;
83
+ /** Brings a stale computed up to date. Returns whether its value changed. */
84
+ export declare function refresh(cell: Cell): boolean;
105
85
  export declare function createOwner(parent: Owner | null): Owner;
106
86
  /** Disposes an owner and detaches it from its parent. */
107
87
  export declare function disposeOwner(owner: Owner): void;
@@ -146,7 +126,6 @@ export declare function runEffectNow(cell: Cell): void;
146
126
  * cleaned up with the parent.
147
127
  */
148
128
  export declare function releaseEffect(cell: Cell): void;
149
- export declare function defaultEquals<T>(equals: ((a: T, b: T) => boolean) | false | undefined): (a: unknown, b: unknown) => boolean;
150
129
  export declare function batch<T>(fn: () => T): T;
151
130
  /**
152
131
  * Reads once, on purpose.
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/effect.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Cell } from './core.js';
1
+ import { Cell } from './cell.js';
2
2
  import type { Dispose } from './types.js';
3
3
  /**
4
4
  * An effect body. Returning a function registers it as the cleanup; returning
@@ -1 +1 @@
1
- {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EAOL,MAAM,WAAW,CAAC;AAInB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AAEH,KAAK,UAAU,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CASjD;AAcD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIjD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAKzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAW9C"}
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;AAKhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AAEH,KAAK,UAAU,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CASjD;AAcD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIjD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAKzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAW9C"}
package/dist/index.d.ts CHANGED
@@ -18,5 +18,6 @@ export type { Owner } from './core.js';
18
18
  /** Internal surface used by `@firsthandjs/dom`; not part of the public contract. */
19
19
  export { createEffect, bind, setRendering, isRendering } from './effect.js';
20
20
  export { devEnterSetup, devExitSetup } from './dev.js';
21
- export { Cell, createOwner, disposeOwner, disposeCell, handleError, own, setOwner, deferOwner, restoreOwner, } from './core.js';
21
+ export { Cell } from './cell.js';
22
+ export { createOwner, disposeOwner, disposeCell, handleError, own, setOwner, deferOwner, restoreOwner, } from './core.js';
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,aAAa,EACb,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,oFAAoF;AACpF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,GAAG,EACH,QAAQ,EACR,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,aAAa,EACb,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,oFAAoF;AACpF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,GAAG,EACH,QAAQ,EACR,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAC"}
package/dist/index.dev.js CHANGED
@@ -7,6 +7,22 @@ var DISPOSED = 1 << 4;
7
7
  var HAS_VALUE = 1 << 5;
8
8
  var STALE = DIRTY | PENDING;
9
9
 
10
+ // packages/core/src/link.ts
11
+ var Link = class {
12
+ // One allocation per dependency edge (ADR-0002). An options object would be
13
+ // a second one, on the path that exists to allocate nothing in the common
14
+ // case — see docs/architecture/code-rules.md §5.
15
+ // eslint-disable-next-line max-params -- measured hot path; see above
16
+ constructor(dep, sub, prevDep, nextDep, prevSub) {
17
+ this.dep = dep;
18
+ this.sub = sub;
19
+ this.prevDep = prevDep;
20
+ this.nextDep = nextDep;
21
+ this.prevSub = prevSub;
22
+ this.nextSub = void 0;
23
+ }
24
+ };
25
+
10
26
  // packages/core/src/errors.ts
11
27
  var FirsthandCycleError = class extends Error {
12
28
  constructor() {
@@ -89,69 +105,6 @@ function devRunning(effect2) {
89
105
  }
90
106
 
91
107
  // packages/core/src/core.ts
92
- var Link = class {
93
- // One allocation per dependency edge (ADR-0002). An options object would be
94
- // a second one, on the path that exists to allocate nothing in the common
95
- // case — see docs/architecture/code-rules.md §5.
96
- // eslint-disable-next-line max-params -- measured hot path; see above
97
- constructor(dep, sub, prevDep, nextDep, prevSub) {
98
- this.dep = dep;
99
- this.sub = sub;
100
- this.prevDep = prevDep;
101
- this.nextDep = nextDep;
102
- this.prevSub = prevSub;
103
- this.nextSub = void 0;
104
- }
105
- };
106
- var is = Object.is;
107
- var never = () => false;
108
- var Cell = class {
109
- constructor(flags, value, fn, equals) {
110
- this.flags = flags;
111
- this.v = value;
112
- this.fn = fn;
113
- this.equals = equals;
114
- this.deps = void 0;
115
- this.depsTail = void 0;
116
- this.subs = void 0;
117
- this.subsTail = void 0;
118
- this.scope = void 0;
119
- }
120
- get value() {
121
- const flags = this.flags;
122
- if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
123
- refresh(this);
124
- }
125
- if (activeSub !== void 0) {
126
- link(this, activeSub);
127
- } else {
128
- devCheckSetupRead();
129
- }
130
- return this.v;
131
- }
132
- set value(next) {
133
- if ((this.flags & MUTABLE) !== 0) {
134
- throw new FirsthandReadonlyError();
135
- }
136
- write(this, next);
137
- }
138
- /** Reads without subscribing, and without refreshing lazily... except that a
139
- * stale computed must still produce a correct value, so it does refresh. */
140
- peek() {
141
- const flags = this.flags;
142
- if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
143
- refresh(this);
144
- }
145
- return this.v;
146
- }
147
- /** Functional update. The updater runs untracked. */
148
- set(updater) {
149
- if ((this.flags & MUTABLE) !== 0) {
150
- throw new FirsthandReadonlyError();
151
- }
152
- write(this, updater(this.v));
153
- }
154
- };
155
108
  var activeSub;
156
109
  var currentOwner = null;
157
110
  var deferred = false;
@@ -571,15 +524,6 @@ function releaseEffect(cell) {
571
524
  cells.pop();
572
525
  }
573
526
  }
574
- function defaultEquals(equals) {
575
- if (equals === void 0) {
576
- return is;
577
- }
578
- if (equals === false) {
579
- return never;
580
- }
581
- return equals;
582
- }
583
527
  function batch(fn) {
584
528
  batchDepth++;
585
529
  try {
@@ -608,6 +552,66 @@ function untrack(fn) {
608
552
  }
609
553
  }
610
554
 
555
+ // packages/core/src/cell.ts
556
+ var is = Object.is;
557
+ var never = () => false;
558
+ var Cell = class {
559
+ constructor(flags, value, fn, equals) {
560
+ this.flags = flags;
561
+ this.v = value;
562
+ this.fn = fn;
563
+ this.equals = equals;
564
+ this.deps = void 0;
565
+ this.depsTail = void 0;
566
+ this.subs = void 0;
567
+ this.subsTail = void 0;
568
+ this.scope = void 0;
569
+ }
570
+ get value() {
571
+ const flags = this.flags;
572
+ if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
573
+ refresh(this);
574
+ }
575
+ if (activeSub !== void 0) {
576
+ link(this, activeSub);
577
+ } else {
578
+ devCheckSetupRead();
579
+ }
580
+ return this.v;
581
+ }
582
+ set value(next) {
583
+ if ((this.flags & MUTABLE) !== 0) {
584
+ throw new FirsthandReadonlyError();
585
+ }
586
+ write(this, next);
587
+ }
588
+ /** Reads without subscribing, and without refreshing lazily... except that a
589
+ * stale computed must still produce a correct value, so it does refresh. */
590
+ peek() {
591
+ const flags = this.flags;
592
+ if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
593
+ refresh(this);
594
+ }
595
+ return this.v;
596
+ }
597
+ /** Functional update. The updater runs untracked. */
598
+ set(updater) {
599
+ if ((this.flags & MUTABLE) !== 0) {
600
+ throw new FirsthandReadonlyError();
601
+ }
602
+ write(this, updater(this.v));
603
+ }
604
+ };
605
+ function defaultEquals(equals) {
606
+ if (equals === void 0) {
607
+ return is;
608
+ }
609
+ if (equals === false) {
610
+ return never;
611
+ }
612
+ return equals;
613
+ }
614
+
611
615
  // packages/core/src/signal.ts
612
616
  function signal(value, options) {
613
617
  const cell = new Cell(0, value, void 0, defaultEquals(options?.equals));
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var p=class extends Error{constructor(){super("Reactive update did not settle: an effect keeps invalidating its own dependencies. Use untrack() or batch() to break the cycle."),this.name="FirsthandCycleError"}},w=class extends Error{constructor(n){super(`No provider for ${n}, and the context was created without a default value.`),this.name="FirsthandContextError"}},x=class extends Error{constructor(){super("Cannot assign to a computed value. Write to the signals it derives from instead."),this.name="FirsthandReadonlyError"}};function A(e){queueMicrotask(()=>{throw e})}function ne(e){}function te(e){}function oe(){}var L=class{constructor(n,t,o,r,i){this.dep=n,this.sub=t,this.prevDep=o,this.nextDep=r,this.prevSub=i,this.nextSub=void 0}},ie=Object.is,le=()=>!1,s=class{constructor(n,t,o,r){this.flags=n,this.v=t,this.fn=o,this.equals=r,this.deps=void 0,this.depsTail=void 0,this.subs=void 0,this.subsTail=void 0,this.scope=void 0}get value(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&_(this),u!==void 0?ue(this,u):void 0,this.v}set value(n){if((this.flags&1)!==0)throw new x;F(this,n)}peek(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&_(this),this.v}set(n){if((this.flags&1)!==0)throw new x;F(this,n(this.v))}},u,d=null,f=!1,I=null,j=0,D=!1,k=0,C=[],se=1e6;function ue(e,n){let t=n.depsTail;if(t!==void 0&&t.dep===e)return;let o=t!==void 0?t.nextDep:n.deps;if(o!==void 0&&o.dep===e){n.depsTail=o;return}let r=e.subsTail;if(r!==void 0&&r.sub===n&&de(r,n))return;let i=new L(e,n,t,o,r);n.depsTail=i,e.subsTail=i,o!==void 0&&(o.prevDep=i),t!==void 0?t.nextDep=i:n.deps=i,r!==void 0?r.nextSub=i:e.subs=i}function de(e,n){let t=n.depsTail;for(;t!==void 0;){if(t===e)return!0;t=t.prevDep}return!1}function q(e,n){let t=e.dep,o=e.prevDep,r=e.nextDep,i=e.prevSub,T=e.nextSub;return r!==void 0?r.prevDep=o:n.depsTail=o,o!==void 0?o.nextDep=r:n.deps=r,T!==void 0?T.prevSub=i:t.subsTail=i,i!==void 0?i.nextSub=T:t.subs=T,r}function P(e){e.depsTail=void 0,e.flags&=-13}function H(e){let n=e.depsTail,t=n!==void 0?n.nextDep:e.deps;for(;t!==void 0;)t=q(t,e)}function fe(e){let n=e;do{let t=n.sub,o=t.flags;(o&4)===0&&(t.flags=o|4,(o&8)===0&&((o&2)!==0?G(t):t.subs!==void 0&&M(t.subs))),n=n.nextSub}while(n!==void 0)}function M(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===0&&(t.flags=o|8,(o&2)!==0?G(t):t.subs!==void 0&&M(t.subs)),n=n.nextSub}while(n!==void 0)}function ae(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===8&&(t.flags=o|4),n=n.nextSub}while(n!==void 0)}function F(e,n){if(e.equals(e.v,n))return;e.v=n;let t=e.subs;t!==void 0&&(fe(t),j===0&&Y())}function _(e){if((e.flags&4)!==0||V(e)){if(!ce(e))return!1;let t=e.subs;return t!==void 0&&t.nextSub!==void 0&&ae(t),!0}return e.flags=e.flags&-9,!1}function V(e){let n=e.deps;for(;n!==void 0;){let t=n.dep;if((t.flags&1)!==0&&(t.flags&12)!==0&&_(t))return!0;n=n.nextDep}return!1}function ce(e){let n=u,t=d,o=f;u=e,d=null,f=!1,P(e);try{let r=e.fn();return(e.flags&32)!==0&&e.equals(e.v,r)?!1:(e.flags|=32,e.v=r,!0)}finally{H(e),u=n,d=t,f=o}}function G(e){C.push(e)}function Y(){if(D)return;D=!0;let e=0;try{for(;k<C.length;){let n=C[k];if(C[k++]=void 0,(n.flags&16)===0){if(++e>se)throw new p;(n.flags&4)!==0||V(n)?$(n):n.flags&=-9}}}finally{C.length=0,k=0,D=!1}}function $(e){let n=e.scope;N(n);let t=u,o=d,r=f;u=e,d=n,f=!1,P(e);try{let i=e.fn();typeof i=="function"&&(n.disposals??=[]).push(i)}catch(i){h(i,n)}finally{H(e),u=t,d=o,f=r}}function v(e){let n={parent:e,attached:e!==null,prev:null,next:null,head:null,tail:null,disposals:null,cells:null,ctx:e!==null?e.ctx:null,handler:null};if(e!==null){let t=e.tail;n.prev=t,t!==null?t.next=n:e.head=n,e.tail=n}return n}function N(e){let n=e.head;for(;n!==null;){let r=n.next;n.attached=!1,n.prev=null,n.next=null,N(n),n=r}e.head=null,e.tail=null,e.ctx=e.parent!==null?e.parent.ctx:null;let t=e.cells;if(t!==null){for(let r=t.length-1;r>=0;r--)S(t[r]);e.cells=null}let o=e.disposals;if(o!==null){e.disposals=null;for(let r=o.length-1;r>=0;r--)try{o[r]()}catch(i){h(i,e)}}}function E(e){if(e.attached){let n=e.parent,t=e.prev,o=e.next;t!==null?t.next=o:n.head=o,o!==null?o.prev=t:n.tail=t,e.attached=!1,e.prev=null,e.next=null}N(e)}function S(e){e.flags|=16;let n=e.deps;for(;n!==void 0;)n=q(n,e);let t=e.subs;for(;t!==void 0;){let r=t.nextSub;q(t,t.sub),t=r}let o=e.scope;o!==void 0&&(E(o),e.scope=void 0,e.fn=void 0)}function h(e,n){if(e instanceof p)throw e;let t=n;for(;t!==null;){let o=t.handler;if(o!==null){try{o(e)}catch(r){h(r,t.parent)}return}t=t.parent}A(e)}function l(){return f&&(d=v(I),f=!1),d}function a(e){let n=l();return d=e,f=!1,n}function pe(){let e=l();return I=e,f=!0,d=null,e}function xe(e){d=e,f=!1,I=null}function m(e){let n=l();n!==null&&(n.cells??=[]).push(e)}function X(e){let n=v(l());return e.scope=n,n}function z(e){$(e)}function J(e){e.flags|=16,e.fn=void 0;let n=l();n!==null&&n.cells.pop()}function c(e){return e===void 0?ie:e===!1?le:e}function ve(e){j++;try{return e()}finally{--j===0&&Y()}}function he(e){try{return K(e)}finally{}}function K(e){let n=u;u=void 0;try{return e()}finally{u=n}}function we(e,n){let t=new s(0,e,void 0,c(n?.equals));return t}function be(e,n){let t=new s(5,void 0,e,c(n?.equals));return m(t),e.name,t}function W(e){let n=new s(2,void 0,e,c(void 0));return e.name,m(n),X(n),R||z(n),n}var R=!1;function Ce(e){let n=R;return R=e,n}function ye(){return R}function ge(e){let n=W(e);n.deps===void 0&&J(n)}function me(e){l()===null&&void 0;let n=W(e);return()=>{S(n)}}function Te(e){let n=l();if(n===null){return}(n.disposals??=[]).push(e)}function ke(e){let n=v(l());let t=a(n);try{return e(()=>{E(n)})}finally{a(t)}}function Oe(e,n){let t=v(l());t.handler=n;let o=a(t);try{let r=e();return a(o),r}catch(r){a(o),h(r,t);return}}function Ee(e,n){let t=a(e);try{return n()}finally{a(t)}}var ee=Symbol("firsthand.ctx");function Se(e,n){let t=n??"context";return{id:Symbol(t),description:t,hasDefault:arguments.length>0,defaultValue:e,fallback:void 0}}function Re(e,n){let t=l();if(t===null){`${e.description}`;return}let o=n instanceof s?n:new s(0,n,void 0,c(void 0));Le(t)[e.id]=o}function De(e){let n=l(),t=n!==null?n.ctx:null,o=t!==null?t[e.id]:void 0;if(o!==void 0)return o;let r=e;if(!r.hasDefault)throw new w(r.description);return r.fallback??=new s(0,r.defaultValue,void 0,c(void 0))}function Le(e){let n=e.ctx;if(n!==null&&n[ee]===e)return n;let t=n!==null?Object.create(n):Object.create(null);return t[ee]=e,e.ctx=t,t}export{s as Cell,w as FirsthandContextError,p as FirsthandCycleError,x as FirsthandReadonlyError,ve as batch,ge as bind,Oe as catchError,be as computed,Se as createContext,W as createEffect,v as createOwner,ke as createRoot,pe as deferOwner,te as devEnterSetup,oe as devExitSetup,S as disposeCell,E as disposeOwner,me as effect,l as getOwner,h as handleError,ye as isRendering,Te as onCleanup,m as own,Re as provide,xe as restoreOwner,Ee as runWithOwner,a as setOwner,Ce as setRendering,ne as setStrictReactivity,we as signal,he as snapshot,K as untrack,De as useContext};
1
+ var k=class{constructor(n,t,o,r,i){this.dep=n,this.sub=t,this.prevDep=o,this.nextDep=r,this.prevSub=i,this.nextSub=void 0}};var p=class extends Error{constructor(){super("Reactive update did not settle: an effect keeps invalidating its own dependencies. Use untrack() or batch() to break the cycle."),this.name="FirsthandCycleError"}},w=class extends Error{constructor(n){super(`No provider for ${n}, and the context was created without a default value.`),this.name="FirsthandContextError"}},x=class extends Error{constructor(){super("Cannot assign to a computed value. Write to the signals it derives from instead."),this.name="FirsthandReadonlyError"}};function B(e){queueMicrotask(()=>{throw e})}function te(e){}function oe(e){}function re(){}var u,d=null,f=!1,A=null,q=0,j=!1,O=0,m=[],le=1e6;function M(e,n){let t=n.depsTail;if(t!==void 0&&t.dep===e)return;let o=t!==void 0?t.nextDep:n.deps;if(o!==void 0&&o.dep===e){n.depsTail=o;return}let r=e.subsTail;if(r!==void 0&&r.sub===n&&se(r,n))return;let i=new k(e,n,t,o,r);n.depsTail=i,e.subsTail=i,o!==void 0&&(o.prevDep=i),t!==void 0?t.nextDep=i:n.deps=i,r!==void 0?r.nextSub=i:e.subs=i}function se(e,n){let t=n.depsTail;for(;t!==void 0;){if(t===e)return!0;t=t.prevDep}return!1}function _(e,n){let t=e.dep,o=e.prevDep,r=e.nextDep,i=e.prevSub,g=e.nextSub;return r!==void 0?r.prevDep=o:n.depsTail=o,o!==void 0?o.nextDep=r:n.deps=r,g!==void 0?g.prevSub=i:t.subsTail=i,i!==void 0?i.nextSub=g:t.subs=g,r}function P(e){e.depsTail=void 0,e.flags&=-13}function H(e){let n=e.depsTail,t=n!==void 0?n.nextDep:e.deps;for(;t!==void 0;)t=_(t,e)}function ue(e){let n=e;do{let t=n.sub,o=t.flags;(o&4)===0&&(t.flags=o|4,(o&8)===0&&((o&2)!==0?Y(t):t.subs!==void 0&&V(t.subs))),n=n.nextSub}while(n!==void 0)}function V(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===0&&(t.flags=o|8,(o&2)!==0?Y(t):t.subs!==void 0&&V(t.subs)),n=n.nextSub}while(n!==void 0)}function de(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===8&&(t.flags=o|4),n=n.nextSub}while(n!==void 0)}function I(e,n){if(e.equals(e.v,n))return;e.v=n;let t=e.subs;t!==void 0&&(ue(t),q===0&&$())}function S(e){if((e.flags&4)!==0||G(e)){if(!fe(e))return!1;let t=e.subs;return t!==void 0&&t.nextSub!==void 0&&de(t),!0}return e.flags=e.flags&-9,!1}function G(e){let n=e.deps;for(;n!==void 0;){let t=n.dep;if((t.flags&1)!==0&&(t.flags&12)!==0&&S(t))return!0;n=n.nextDep}return!1}function fe(e){let n=u,t=d,o=f;u=e,d=null,f=!1,P(e);try{let r=e.fn();return(e.flags&32)!==0&&e.equals(e.v,r)?!1:(e.flags|=32,e.v=r,!0)}finally{H(e),u=n,d=t,f=o}}function Y(e){m.push(e)}function $(){if(j)return;j=!0;let e=0;try{for(;O<m.length;){let n=m[O];if(m[O++]=void 0,(n.flags&16)===0){if(++e>le)throw new p;(n.flags&4)!==0||G(n)?X(n):n.flags&=-9}}}finally{m.length=0,O=0,j=!1}}function X(e){let n=e.scope;N(n);let t=u,o=d,r=f;u=e,d=n,f=!1,P(e);try{let i=e.fn();typeof i=="function"&&(n.disposals??=[]).push(i)}catch(i){h(i,n)}finally{H(e),u=t,d=o,f=r}}function v(e){let n={parent:e,attached:e!==null,prev:null,next:null,head:null,tail:null,disposals:null,cells:null,ctx:e!==null?e.ctx:null,handler:null};if(e!==null){let t=e.tail;n.prev=t,t!==null?t.next=n:e.head=n,e.tail=n}return n}function N(e){let n=e.head;for(;n!==null;){let r=n.next;n.attached=!1,n.prev=null,n.next=null,N(n),n=r}e.head=null,e.tail=null,e.ctx=e.parent!==null?e.parent.ctx:null;let t=e.cells;if(t!==null){for(let r=t.length-1;r>=0;r--)D(t[r]);e.cells=null}let o=e.disposals;if(o!==null){e.disposals=null;for(let r=o.length-1;r>=0;r--)try{o[r]()}catch(i){h(i,e)}}}function R(e){if(e.attached){let n=e.parent,t=e.prev,o=e.next;t!==null?t.next=o:n.head=o,o!==null?o.prev=t:n.tail=t,e.attached=!1,e.prev=null,e.next=null}N(e)}function D(e){e.flags|=16;let n=e.deps;for(;n!==void 0;)n=_(n,e);let t=e.subs;for(;t!==void 0;){let r=t.nextSub;_(t,t.sub),t=r}let o=e.scope;o!==void 0&&(R(o),e.scope=void 0,e.fn=void 0)}function h(e,n){if(e instanceof p)throw e;let t=n;for(;t!==null;){let o=t.handler;if(o!==null){try{o(e)}catch(r){h(r,t.parent)}return}t=t.parent}B(e)}function l(){return f&&(d=v(A),f=!1),d}function a(e){let n=l();return d=e,f=!1,n}function ae(){let e=l();return A=e,f=!0,d=null,e}function ce(e){d=e,f=!1,A=null}function T(e){let n=l();n!==null&&(n.cells??=[]).push(e)}function z(e){let n=v(l());return e.scope=n,n}function J(e){X(e)}function K(e){e.flags|=16,e.fn=void 0;let n=l();n!==null&&n.cells.pop()}function pe(e){q++;try{return e()}finally{--q===0&&$()}}function xe(e){try{return Q(e)}finally{}}function Q(e){let n=u;u=void 0;try{return e()}finally{u=n}}var ve=Object.is,he=()=>!1,s=class{constructor(n,t,o,r){this.flags=n,this.v=t,this.fn=o,this.equals=r,this.deps=void 0,this.depsTail=void 0,this.subs=void 0,this.subsTail=void 0,this.scope=void 0}get value(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&S(this),u!==void 0?M(this,u):void 0,this.v}set value(n){if((this.flags&1)!==0)throw new x;I(this,n)}peek(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&S(this),this.v}set(n){if((this.flags&1)!==0)throw new x;I(this,n(this.v))}};function c(e){return e===void 0?ve:e===!1?he:e}function we(e,n){let t=new s(0,e,void 0,c(n?.equals));return t}function me(e,n){let t=new s(5,void 0,e,c(n?.equals));return T(t),e.name,t}function W(e){let n=new s(2,void 0,e,c(void 0));return e.name,T(n),z(n),L||J(n),n}var L=!1;function be(e){let n=L;return L=e,n}function ye(){return L}function Ce(e){let n=W(e);n.deps===void 0&&K(n)}function Te(e){l()===null&&void 0;let n=W(e);return()=>{D(n)}}function ge(e){let n=l();if(n===null){return}(n.disposals??=[]).push(e)}function ke(e){let n=v(l());let t=a(n);try{return e(()=>{R(n)})}finally{a(t)}}function Oe(e,n){let t=v(l());t.handler=n;let o=a(t);try{let r=e();return a(o),r}catch(r){a(o),h(r,t);return}}function Ee(e,n){let t=a(e);try{return n()}finally{a(t)}}var ne=Symbol("firsthand.ctx");function Se(e,n){let t=n??"context";return{id:Symbol(t),description:t,hasDefault:arguments.length>0,defaultValue:e,fallback:void 0}}function Re(e,n){let t=l();if(t===null){`${e.description}`;return}let o=n instanceof s?n:new s(0,n,void 0,c(void 0));Le(t)[e.id]=o}function De(e){let n=l(),t=n!==null?n.ctx:null,o=t!==null?t[e.id]:void 0;if(o!==void 0)return o;let r=e;if(!r.hasDefault)throw new w(r.description);return r.fallback??=new s(0,r.defaultValue,void 0,c(void 0))}function Le(e){let n=e.ctx;if(n!==null&&n[ne]===e)return n;let t=n!==null?Object.create(n):Object.create(null);return t[ne]=e,e.ctx=t,t}export{s as Cell,w as FirsthandContextError,p as FirsthandCycleError,x as FirsthandReadonlyError,pe as batch,Ce as bind,Oe as catchError,me as computed,Se as createContext,W as createEffect,v as createOwner,ke as createRoot,ae as deferOwner,oe as devEnterSetup,re as devExitSetup,D as disposeCell,R as disposeOwner,Te as effect,l as getOwner,h as handleError,ye as isRendering,ge as onCleanup,T as own,Re as provide,ce as restoreOwner,Ee as runWithOwner,a as setOwner,be as setRendering,te as setStrictReactivity,we as signal,xe as snapshot,Q as untrack,De as useContext};
package/dist/link.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * One dependency edge (ADR-0002).
3
+ *
4
+ * Its own file because it is a data structure rather than a step of the
5
+ * algorithm: `core.ts` is what walks these, and nothing here knows how.
6
+ */
7
+ import type { Cell } from './cell.js';
8
+ /** One dependency edge, shared by the source's subscriber list and the
9
+ * subscriber's dependency list. */
10
+ export declare class Link {
11
+ dep: Cell;
12
+ sub: Cell;
13
+ prevDep: Link | undefined;
14
+ nextDep: Link | undefined;
15
+ prevSub: Link | undefined;
16
+ nextSub: Link | undefined;
17
+ constructor(dep: Cell, sub: Cell, prevDep: Link | undefined, nextDep: Link | undefined, prevSub: Link | undefined);
18
+ }
19
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;oCACoC;AACpC,qBAAa,IAAI;IACP,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;IACV,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC;gBAOhC,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,IAAI,GAAG,SAAS,EACzB,OAAO,EAAE,IAAI,GAAG,SAAS,EACzB,OAAO,EAAE,IAAI,GAAG,SAAS;CAS5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firsthandjs/core",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Fine-grained reactive core: signals, computeds, effects, owners and context. No DOM.",
5
5
  "license": "MIT",
6
6
  "type": "module",