@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 +40 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/computed.d.ts.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/core.d.ts +28 -49
- package/dist/core.d.ts.map +1 -1
- package/dist/effect.d.ts +1 -1
- package/dist/effect.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.dev.js +76 -72
- package/dist/index.js +1 -1
- package/dist/link.d.ts +19 -0
- package/dist/link.d.ts.map +1 -0
- package/package.json +1 -1
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"}
|
package/dist/computed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
-
*
|
|
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
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
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
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
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
|
-
|
|
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.
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/effect.d.ts
CHANGED
package/dist/effect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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"}
|