@firsthandjs/core 0.3.0 → 0.5.0

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.
@@ -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;AAE5D;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAIlF"}
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 +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/dev.d.ts CHANGED
@@ -26,4 +26,19 @@ export declare function devExitSnapshot(): void;
26
26
  * would otherwise print the same line a thousand times.
27
27
  */
28
28
  export declare function devCheckSetupRead(): void;
29
+ /**
30
+ * Names a cell, if anyone is listening.
31
+ *
32
+ * Nothing is recorded until a frontend attaches: naming every cell costs a
33
+ * `WeakMap` write, and a hundred thousand rows would feel that even in
34
+ * development — which is precisely the size at which devtools matter, so the
35
+ * cost has to be opt-in rather than merely small.
36
+ */
37
+ export declare function devLabel(target: object, kind: string, name: string): void;
38
+ /** Reports the source that just changed, so a run can be explained by it. */
39
+ export declare function devCause(dep: object): void;
40
+ /** Registers a scope the frontend can enumerate the graph from. */
41
+ export declare function devRoot(owner: object): void;
42
+ /** Reports the effect that is running, so a write can be attributed to it. */
43
+ export declare function devRunning(effect: object | null): void;
29
44
  //# sourceMappingURL=dev.d.ts.map
package/dist/dev.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD;AAqBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAErD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAoBxC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD;AAqBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAErD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAoBxC;AAkBD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEtD"}
@@ -7,4 +7,8 @@ export declare function devExitSetup(): void;
7
7
  export declare function devEnterSnapshot(): void;
8
8
  export declare function devExitSnapshot(): void;
9
9
  export declare function devCheckSetupRead(): void;
10
+ export declare function devLabel(_target: object, _kind: string, _name: string): void;
11
+ export declare function devCause(_dep: object): void;
12
+ export declare function devRoot(_owner: object): void;
13
+ export declare function devRunning(_effect: object | null): void;
10
14
  //# sourceMappingURL=dev.prod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.prod.d.ts","sourceRoot":"","sources":["../src/dev.prod.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
1
+ {"version":3,"file":"dev.prod.d.ts","sourceRoot":"","sources":["../src/dev.prod.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEvD"}
@@ -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,CAMjD;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,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,CAOjD;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
@@ -13,7 +13,7 @@ export { onCleanup, createRoot, catchError, runWithOwner, getOwner } from './lif
13
13
  export { createContext, provide, useContext } from './context.js';
14
14
  export type { Context } from './context.js';
15
15
  export { FirsthandCycleError, FirsthandContextError, FirsthandReadonlyError } from './errors.js';
16
- export type { CellOptions, DeepReadonly, Dispose, ReadonlyCell, ReadonlyProps, Signal, } from './types.js';
16
+ export type { CellOptions, DeepReadonly, DevtoolsHook, Dispose, ReadonlyCell, ReadonlyProps, Signal, } from './types.js';
17
17
  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 } from './effect.js';
@@ -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,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,MAAM,aAAa,CAAC;AACjD,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,GACT,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,MAAM,aAAa,CAAC;AACjD,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,GACT,MAAM,WAAW,CAAC"}
@@ -0,0 +1,750 @@
1
+ // packages/core/src/flags.ts
2
+ var MUTABLE = 1 << 0;
3
+ var WATCHING = 1 << 1;
4
+ var DIRTY = 1 << 2;
5
+ var PENDING = 1 << 3;
6
+ var DISPOSED = 1 << 4;
7
+ var HAS_VALUE = 1 << 5;
8
+ var STALE = DIRTY | PENDING;
9
+
10
+ // packages/core/src/errors.ts
11
+ var FirsthandCycleError = class extends Error {
12
+ constructor() {
13
+ super(
14
+ "Reactive update did not settle: an effect keeps invalidating its own dependencies. Use untrack() or batch() to break the cycle."
15
+ );
16
+ this.name = "FirsthandCycleError";
17
+ }
18
+ };
19
+ var FirsthandContextError = class extends Error {
20
+ constructor(description) {
21
+ super(`No provider for ${description}, and the context was created without a default value.`);
22
+ this.name = "FirsthandContextError";
23
+ }
24
+ };
25
+ var FirsthandReadonlyError = class extends Error {
26
+ constructor() {
27
+ super("Cannot assign to a computed value. Write to the signals it derives from instead.");
28
+ this.name = "FirsthandReadonlyError";
29
+ }
30
+ };
31
+
32
+ // packages/core/src/dev.ts
33
+ function devWarn(message) {
34
+ console.warn(`[firsthand] ${message}`);
35
+ }
36
+ function reportUncaught(error) {
37
+ queueMicrotask(() => {
38
+ throw error;
39
+ });
40
+ }
41
+ var strict = false;
42
+ var setups = [];
43
+ var snapshotDepth = 0;
44
+ var reported = /* @__PURE__ */ new Set();
45
+ function setStrictReactivity(on) {
46
+ strict = on;
47
+ }
48
+ function devEnterSetup(id) {
49
+ setups.push({ id, reads: 0 });
50
+ }
51
+ function devExitSetup() {
52
+ setups.pop();
53
+ }
54
+ function devEnterSnapshot() {
55
+ snapshotDepth++;
56
+ }
57
+ function devExitSnapshot() {
58
+ snapshotDepth--;
59
+ }
60
+ function devCheckSetupRead() {
61
+ const frame = setups[setups.length - 1];
62
+ if (!strict || frame === void 0 || snapshotDepth > 0) {
63
+ return;
64
+ }
65
+ const site = `${frame.id}#${String(frame.reads++)}`;
66
+ if (reported.has(site)) {
67
+ return;
68
+ }
69
+ reported.add(site);
70
+ devWarn(
71
+ "A signal or prop was read in a component setup without anything subscribing, so the value is read once and then kept. Move the read into the part, handler, effect or computed that should re-read it \u2014 or wrap it in snapshot() if reading once is what you meant."
72
+ );
73
+ }
74
+ function hook() {
75
+ const installed = globalThis.__FIRSTHAND_DEVTOOLS__;
76
+ return installed !== void 0 && installed.attached ? installed : void 0;
77
+ }
78
+ function devLabel(target, kind, name) {
79
+ hook()?.label(target, kind, name);
80
+ }
81
+ function devCause(dep) {
82
+ hook()?.cause(dep);
83
+ }
84
+ function devRoot(owner) {
85
+ hook()?.root(owner);
86
+ }
87
+ function devRunning(effect2) {
88
+ hook()?.running(effect2);
89
+ }
90
+
91
+ // packages/core/src/core.ts
92
+ var Link = class {
93
+ constructor(dep, sub, prevDep, nextDep, prevSub) {
94
+ this.dep = dep;
95
+ this.sub = sub;
96
+ this.prevDep = prevDep;
97
+ this.nextDep = nextDep;
98
+ this.prevSub = prevSub;
99
+ this.nextSub = void 0;
100
+ }
101
+ };
102
+ var is = Object.is;
103
+ var never = () => false;
104
+ var Cell = class {
105
+ constructor(flags, value, fn, equals) {
106
+ this.flags = flags;
107
+ this.v = value;
108
+ this.fn = fn;
109
+ this.equals = equals;
110
+ this.deps = void 0;
111
+ this.depsTail = void 0;
112
+ this.subs = void 0;
113
+ this.subsTail = void 0;
114
+ this.scope = void 0;
115
+ }
116
+ get value() {
117
+ const flags = this.flags;
118
+ if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
119
+ refresh(this);
120
+ }
121
+ if (activeSub !== void 0) {
122
+ link(this, activeSub);
123
+ } else {
124
+ devCheckSetupRead();
125
+ }
126
+ return this.v;
127
+ }
128
+ set value(next) {
129
+ if ((this.flags & MUTABLE) !== 0) {
130
+ throw new FirsthandReadonlyError();
131
+ }
132
+ write(this, next);
133
+ }
134
+ /** Reads without subscribing, and without refreshing lazily... except that a
135
+ * stale computed must still produce a correct value, so it does refresh. */
136
+ peek() {
137
+ const flags = this.flags;
138
+ if ((flags & MUTABLE) !== 0 && (flags & STALE) !== 0) {
139
+ refresh(this);
140
+ }
141
+ return this.v;
142
+ }
143
+ /** Functional update. The updater runs untracked. */
144
+ set(updater) {
145
+ if ((this.flags & MUTABLE) !== 0) {
146
+ throw new FirsthandReadonlyError();
147
+ }
148
+ write(this, updater(this.v));
149
+ }
150
+ };
151
+ var activeSub;
152
+ var currentOwner = null;
153
+ var batchDepth = 0;
154
+ var flushing = false;
155
+ var queueIndex = 0;
156
+ var queue = [];
157
+ var MAX_FLUSH_STEPS = 1e6;
158
+ function link(dep, sub) {
159
+ const prevDep = sub.depsTail;
160
+ if (prevDep !== void 0 && prevDep.dep === dep) {
161
+ return;
162
+ }
163
+ const nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;
164
+ if (nextDep !== void 0 && nextDep.dep === dep) {
165
+ sub.depsTail = nextDep;
166
+ return;
167
+ }
168
+ const prevSub = dep.subsTail;
169
+ if (prevSub !== void 0 && prevSub.sub === sub && isTracked(prevSub, sub)) {
170
+ return;
171
+ }
172
+ const newLink = new Link(dep, sub, prevDep, nextDep, prevSub);
173
+ sub.depsTail = newLink;
174
+ dep.subsTail = newLink;
175
+ if (nextDep !== void 0) {
176
+ nextDep.prevDep = newLink;
177
+ }
178
+ if (prevDep !== void 0) {
179
+ prevDep.nextDep = newLink;
180
+ } else {
181
+ sub.deps = newLink;
182
+ }
183
+ if (prevSub !== void 0) {
184
+ prevSub.nextSub = newLink;
185
+ } else {
186
+ dep.subs = newLink;
187
+ }
188
+ }
189
+ function isTracked(candidate, sub) {
190
+ let link2 = sub.depsTail;
191
+ while (link2 !== void 0) {
192
+ if (link2 === candidate) {
193
+ return true;
194
+ }
195
+ link2 = link2.prevDep;
196
+ }
197
+ return false;
198
+ }
199
+ function unlink(edge, sub) {
200
+ const dep = edge.dep;
201
+ const prevDep = edge.prevDep;
202
+ const nextDep = edge.nextDep;
203
+ const prevSub = edge.prevSub;
204
+ const nextSub = edge.nextSub;
205
+ if (nextDep !== void 0) {
206
+ nextDep.prevDep = prevDep;
207
+ } else {
208
+ sub.depsTail = prevDep;
209
+ }
210
+ if (prevDep !== void 0) {
211
+ prevDep.nextDep = nextDep;
212
+ } else {
213
+ sub.deps = nextDep;
214
+ }
215
+ if (nextSub !== void 0) {
216
+ nextSub.prevSub = prevSub;
217
+ } else {
218
+ dep.subsTail = prevSub;
219
+ }
220
+ if (prevSub !== void 0) {
221
+ prevSub.nextSub = nextSub;
222
+ } else {
223
+ dep.subs = nextSub;
224
+ }
225
+ return nextDep;
226
+ }
227
+ function startTracking(sub) {
228
+ sub.depsTail = void 0;
229
+ sub.flags &= ~STALE;
230
+ }
231
+ function endTracking(sub) {
232
+ const depsTail = sub.depsTail;
233
+ let stale = depsTail !== void 0 ? depsTail.nextDep : sub.deps;
234
+ while (stale !== void 0) {
235
+ stale = unlink(stale, sub);
236
+ }
237
+ }
238
+ function propagate(from) {
239
+ let edge = from;
240
+ do {
241
+ const sub = edge.sub;
242
+ const flags = sub.flags;
243
+ if ((flags & DIRTY) === 0) {
244
+ sub.flags = flags | DIRTY;
245
+ if ((flags & PENDING) === 0) {
246
+ if ((flags & WATCHING) !== 0) {
247
+ enqueue(sub);
248
+ } else if (sub.subs !== void 0) {
249
+ propagateMaybe(sub.subs);
250
+ }
251
+ }
252
+ }
253
+ edge = edge.nextSub;
254
+ } while (edge !== void 0);
255
+ }
256
+ function propagateMaybe(from) {
257
+ let edge = from;
258
+ do {
259
+ const sub = edge.sub;
260
+ const flags = sub.flags;
261
+ if ((flags & STALE) === 0) {
262
+ sub.flags = flags | PENDING;
263
+ if ((flags & WATCHING) !== 0) {
264
+ enqueue(sub);
265
+ } else if (sub.subs !== void 0) {
266
+ propagateMaybe(sub.subs);
267
+ }
268
+ }
269
+ edge = edge.nextSub;
270
+ } while (edge !== void 0);
271
+ }
272
+ function shallowPropagate(from) {
273
+ let edge = from;
274
+ do {
275
+ const sub = edge.sub;
276
+ const flags = sub.flags;
277
+ if ((flags & STALE) === PENDING) {
278
+ sub.flags = flags | DIRTY;
279
+ }
280
+ edge = edge.nextSub;
281
+ } while (edge !== void 0);
282
+ }
283
+ function write(cell, next) {
284
+ if (cell.equals(cell.v, next)) {
285
+ return;
286
+ }
287
+ devCause(cell);
288
+ cell.v = next;
289
+ const subs = cell.subs;
290
+ if (subs !== void 0) {
291
+ propagate(subs);
292
+ if (batchDepth === 0) {
293
+ flush();
294
+ }
295
+ }
296
+ }
297
+ function refresh(cell) {
298
+ const flags = cell.flags;
299
+ if ((flags & DIRTY) !== 0 || checkDirty(cell)) {
300
+ if (!evaluate(cell)) {
301
+ return false;
302
+ }
303
+ const subs = cell.subs;
304
+ if (subs !== void 0 && subs.nextSub !== void 0) {
305
+ shallowPropagate(subs);
306
+ }
307
+ return true;
308
+ }
309
+ cell.flags = cell.flags & ~PENDING;
310
+ return false;
311
+ }
312
+ function checkDirty(cell) {
313
+ let edge = cell.deps;
314
+ while (edge !== void 0) {
315
+ const dep = edge.dep;
316
+ if ((dep.flags & MUTABLE) !== 0 && (dep.flags & STALE) !== 0 && refresh(dep)) {
317
+ return true;
318
+ }
319
+ edge = edge.nextDep;
320
+ }
321
+ return false;
322
+ }
323
+ function evaluate(cell) {
324
+ const prevSub = activeSub;
325
+ const prevOwner = currentOwner;
326
+ activeSub = cell;
327
+ currentOwner = null;
328
+ startTracking(cell);
329
+ try {
330
+ const next = cell.fn();
331
+ if ((cell.flags & HAS_VALUE) !== 0 && cell.equals(cell.v, next)) {
332
+ return false;
333
+ }
334
+ cell.flags |= HAS_VALUE;
335
+ cell.v = next;
336
+ return true;
337
+ } finally {
338
+ endTracking(cell);
339
+ activeSub = prevSub;
340
+ currentOwner = prevOwner;
341
+ }
342
+ }
343
+ function enqueue(cell) {
344
+ queue.push(cell);
345
+ }
346
+ function flush() {
347
+ if (flushing) {
348
+ return;
349
+ }
350
+ flushing = true;
351
+ let steps = 0;
352
+ try {
353
+ while (queueIndex < queue.length) {
354
+ const cell = queue[queueIndex];
355
+ queue[queueIndex++] = void 0;
356
+ if ((cell.flags & DISPOSED) !== 0) {
357
+ continue;
358
+ }
359
+ if (++steps > MAX_FLUSH_STEPS) {
360
+ throw new FirsthandCycleError();
361
+ }
362
+ if ((cell.flags & DIRTY) !== 0 || checkDirty(cell)) {
363
+ runEffect(cell);
364
+ } else {
365
+ cell.flags &= ~PENDING;
366
+ }
367
+ }
368
+ } finally {
369
+ queue.length = 0;
370
+ queueIndex = 0;
371
+ flushing = false;
372
+ }
373
+ }
374
+ function runEffect(cell) {
375
+ const scope = cell.scope;
376
+ clearScope(scope);
377
+ const prevSub = activeSub;
378
+ const prevOwner = currentOwner;
379
+ activeSub = cell;
380
+ currentOwner = scope;
381
+ startTracking(cell);
382
+ devRunning(cell);
383
+ try {
384
+ const cleanup = cell.fn();
385
+ if (typeof cleanup === "function") {
386
+ (scope.disposals ??= []).push(cleanup);
387
+ }
388
+ } catch (error) {
389
+ handleError(error, scope);
390
+ } finally {
391
+ devRunning(null);
392
+ endTracking(cell);
393
+ activeSub = prevSub;
394
+ currentOwner = prevOwner;
395
+ }
396
+ }
397
+ function createOwner(parent) {
398
+ const owner = {
399
+ parent,
400
+ attached: parent !== null,
401
+ prev: null,
402
+ next: null,
403
+ head: null,
404
+ tail: null,
405
+ disposals: null,
406
+ cells: null,
407
+ // Inherited by reference: `provide` is what allocates a record.
408
+ ctx: parent !== null ? parent.ctx : null,
409
+ handler: null
410
+ };
411
+ if (parent !== null) {
412
+ const tail = parent.tail;
413
+ owner.prev = tail;
414
+ if (tail !== null) {
415
+ tail.next = owner;
416
+ } else {
417
+ parent.head = owner;
418
+ }
419
+ parent.tail = owner;
420
+ }
421
+ return owner;
422
+ }
423
+ function clearScope(owner) {
424
+ let child = owner.head;
425
+ while (child !== null) {
426
+ const next = child.next;
427
+ child.attached = false;
428
+ child.prev = null;
429
+ child.next = null;
430
+ clearScope(child);
431
+ child = next;
432
+ }
433
+ owner.head = null;
434
+ owner.tail = null;
435
+ owner.ctx = owner.parent !== null ? owner.parent.ctx : null;
436
+ const cells = owner.cells;
437
+ if (cells !== null) {
438
+ for (let i = cells.length - 1; i >= 0; i--) {
439
+ disposeCell(cells[i]);
440
+ }
441
+ owner.cells = null;
442
+ }
443
+ const disposals = owner.disposals;
444
+ if (disposals !== null) {
445
+ owner.disposals = null;
446
+ for (let i = disposals.length - 1; i >= 0; i--) {
447
+ try {
448
+ disposals[i]();
449
+ } catch (error) {
450
+ handleError(error, owner);
451
+ }
452
+ }
453
+ }
454
+ }
455
+ function disposeOwner(owner) {
456
+ if (owner.attached) {
457
+ const parent = owner.parent;
458
+ const prev = owner.prev;
459
+ const next = owner.next;
460
+ if (prev !== null) {
461
+ prev.next = next;
462
+ } else {
463
+ parent.head = next;
464
+ }
465
+ if (next !== null) {
466
+ next.prev = prev;
467
+ } else {
468
+ parent.tail = prev;
469
+ }
470
+ owner.attached = false;
471
+ owner.prev = null;
472
+ owner.next = null;
473
+ }
474
+ clearScope(owner);
475
+ }
476
+ function disposeCell(cell) {
477
+ cell.flags |= DISPOSED;
478
+ let dep = cell.deps;
479
+ while (dep !== void 0) {
480
+ dep = unlink(dep, cell);
481
+ }
482
+ let sub = cell.subs;
483
+ while (sub !== void 0) {
484
+ const next = sub.nextSub;
485
+ unlink(sub, sub.sub);
486
+ sub = next;
487
+ }
488
+ const scope = cell.scope;
489
+ if (scope !== void 0) {
490
+ disposeOwner(scope);
491
+ cell.scope = void 0;
492
+ cell.fn = void 0;
493
+ }
494
+ }
495
+ function handleError(error, owner) {
496
+ if (error instanceof FirsthandCycleError) {
497
+ throw error;
498
+ }
499
+ let scope = owner;
500
+ while (scope !== null) {
501
+ const handler = scope.handler;
502
+ if (handler !== null) {
503
+ try {
504
+ handler(error);
505
+ } catch (nested) {
506
+ handleError(nested, scope.parent);
507
+ }
508
+ return;
509
+ }
510
+ scope = scope.parent;
511
+ }
512
+ reportUncaught(error);
513
+ }
514
+ function getOwner() {
515
+ return currentOwner;
516
+ }
517
+ function setOwner(owner) {
518
+ const previous = currentOwner;
519
+ currentOwner = owner;
520
+ return previous;
521
+ }
522
+ function own(cell) {
523
+ const owner = currentOwner;
524
+ if (owner !== null) {
525
+ (owner.cells ??= []).push(cell);
526
+ }
527
+ }
528
+ function createEffectScope(cell) {
529
+ const scope = createOwner(currentOwner);
530
+ cell.scope = scope;
531
+ return scope;
532
+ }
533
+ function runEffectNow(cell) {
534
+ runEffect(cell);
535
+ }
536
+ function releaseEffect(cell) {
537
+ cell.flags |= DISPOSED;
538
+ cell.fn = void 0;
539
+ const owner = currentOwner;
540
+ if (owner !== null) {
541
+ const cells = owner.cells;
542
+ cells.pop();
543
+ }
544
+ }
545
+ function defaultEquals(equals) {
546
+ if (equals === void 0) {
547
+ return is;
548
+ }
549
+ if (equals === false) {
550
+ return never;
551
+ }
552
+ return equals;
553
+ }
554
+ function batch(fn) {
555
+ batchDepth++;
556
+ try {
557
+ return fn();
558
+ } finally {
559
+ if (--batchDepth === 0) {
560
+ flush();
561
+ }
562
+ }
563
+ }
564
+ function snapshot(read) {
565
+ devEnterSnapshot();
566
+ try {
567
+ return untrack(read);
568
+ } finally {
569
+ devExitSnapshot();
570
+ }
571
+ }
572
+ function untrack(fn) {
573
+ const previous = activeSub;
574
+ activeSub = void 0;
575
+ try {
576
+ return fn();
577
+ } finally {
578
+ activeSub = previous;
579
+ }
580
+ }
581
+
582
+ // packages/core/src/signal.ts
583
+ function signal(value, options) {
584
+ const cell = new Cell(0, value, void 0, defaultEquals(options?.equals));
585
+ devLabel(cell, "signal", "");
586
+ return cell;
587
+ }
588
+
589
+ // packages/core/src/computed.ts
590
+ function computed(fn, options) {
591
+ const cell = new Cell(MUTABLE | DIRTY, void 0, fn, defaultEquals(options?.equals));
592
+ own(cell);
593
+ devLabel(cell, "computed", fn.name);
594
+ return cell;
595
+ }
596
+
597
+ // packages/core/src/effect.ts
598
+ function createEffect(fn) {
599
+ const cell = new Cell(WATCHING, void 0, fn, defaultEquals(void 0));
600
+ devLabel(cell, "effect", fn.name);
601
+ own(cell);
602
+ createEffectScope(cell);
603
+ runEffectNow(cell);
604
+ return cell;
605
+ }
606
+ function bind(fn) {
607
+ const cell = createEffect(fn);
608
+ if (cell.deps === void 0) {
609
+ releaseEffect(cell);
610
+ }
611
+ }
612
+ function effect(fn) {
613
+ if (getOwner() === null) {
614
+ devWarn(
615
+ "effect() was created outside any scope, so nothing will ever dispose it. Wrap it in createRoot() if that is intentional."
616
+ );
617
+ }
618
+ const cell = createEffect(fn);
619
+ return () => {
620
+ disposeCell(cell);
621
+ };
622
+ }
623
+
624
+ // packages/core/src/lifecycle.ts
625
+ function onCleanup(fn) {
626
+ const owner = getOwner();
627
+ if (owner === null) {
628
+ devWarn("onCleanup() was called outside any scope, so it will never run.");
629
+ return;
630
+ }
631
+ (owner.disposals ??= []).push(fn);
632
+ }
633
+ function createRoot(fn) {
634
+ const owner = createOwner(getOwner());
635
+ devRoot(owner);
636
+ const previous = setOwner(owner);
637
+ try {
638
+ return fn(() => {
639
+ disposeOwner(owner);
640
+ });
641
+ } finally {
642
+ setOwner(previous);
643
+ }
644
+ }
645
+ function catchError(fn, handler) {
646
+ const owner = createOwner(getOwner());
647
+ owner.handler = handler;
648
+ const previous = setOwner(owner);
649
+ try {
650
+ const result = fn();
651
+ setOwner(previous);
652
+ return result;
653
+ } catch (error) {
654
+ setOwner(previous);
655
+ handleError(error, owner);
656
+ return void 0;
657
+ }
658
+ }
659
+ function runWithOwner(owner, fn) {
660
+ const previous = setOwner(owner);
661
+ try {
662
+ return fn();
663
+ } finally {
664
+ setOwner(previous);
665
+ }
666
+ }
667
+
668
+ // packages/core/src/context.ts
669
+ var RECORD_OWNER = /* @__PURE__ */ Symbol("firsthand.ctx");
670
+ function createContext(defaultValue, description) {
671
+ const label = description ?? "context";
672
+ const token = {
673
+ id: Symbol(label),
674
+ description: label,
675
+ // `arguments.length` is what distinguishes "no default" from "a default of
676
+ // undefined"; the overloads above are the type-level version of the same.
677
+ hasDefault: arguments.length > 0,
678
+ defaultValue,
679
+ fallback: void 0
680
+ };
681
+ return token;
682
+ }
683
+ function provide(context, value) {
684
+ const owner = getOwner();
685
+ if (owner === null) {
686
+ devWarn(`provide() for ${context.description} was called outside any scope; it has no effect.`);
687
+ return;
688
+ }
689
+ const cell = value instanceof Cell ? value : new Cell(0, value, void 0, defaultEquals(void 0));
690
+ recordFor(owner)[context.id] = cell;
691
+ }
692
+ function useContext(context) {
693
+ const owner = getOwner();
694
+ const record = owner !== null ? owner.ctx : null;
695
+ const found = record !== null ? record[context.id] : void 0;
696
+ if (found !== void 0) {
697
+ return found;
698
+ }
699
+ const token = context;
700
+ if (!token.hasDefault) {
701
+ throw new FirsthandContextError(token.description);
702
+ }
703
+ return token.fallback ??= new Cell(
704
+ 0,
705
+ token.defaultValue,
706
+ void 0,
707
+ defaultEquals(void 0)
708
+ );
709
+ }
710
+ function recordFor(owner) {
711
+ const inherited = owner.ctx;
712
+ if (inherited !== null && inherited[RECORD_OWNER] === owner) {
713
+ return inherited;
714
+ }
715
+ const record = inherited !== null ? Object.create(inherited) : /* @__PURE__ */ Object.create(null);
716
+ record[RECORD_OWNER] = owner;
717
+ owner.ctx = record;
718
+ return record;
719
+ }
720
+ export {
721
+ Cell,
722
+ FirsthandContextError,
723
+ FirsthandCycleError,
724
+ FirsthandReadonlyError,
725
+ batch,
726
+ bind,
727
+ catchError,
728
+ computed,
729
+ createContext,
730
+ createEffect,
731
+ createOwner,
732
+ createRoot,
733
+ devEnterSetup,
734
+ devExitSetup,
735
+ disposeCell,
736
+ disposeOwner,
737
+ effect,
738
+ getOwner,
739
+ handleError,
740
+ onCleanup,
741
+ own,
742
+ provide,
743
+ runWithOwner,
744
+ setOwner,
745
+ setStrictReactivity,
746
+ signal,
747
+ snapshot,
748
+ untrack,
749
+ useContext
750
+ };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var c=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"}},h=class extends Error{constructor(n){super(`No provider for ${n}, and the context was created without a default value.`),this.name="FirsthandContextError"}},p=class extends Error{constructor(){super("Cannot assign to a computed value. Write to the signals it derives from instead."),this.name="FirsthandReadonlyError"}};function N(e){queueMicrotask(()=>{throw e})}function K(e){}function Q(e){}function Z(){}var D=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}},ne=Object.is,te=()=>!1,l=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&&q(this),u!==void 0?re(this,u):void 0,this.v}set value(n){if((this.flags&1)!==0)throw new p;W(this,n)}peek(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&q(this),this.v}set(n){if((this.flags&1)!==0)throw new p;W(this,n(this.v))}},u,s=null,R=0,S=!1,g=0,w=[],oe=1e6;function re(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&&ie(r,n))return;let i=new D(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 ie(e,n){let t=n.depsTail;for(;t!==void 0;){if(t===e)return!0;t=t.prevDep}return!1}function L(e,n){let t=e.dep,o=e.prevDep,r=e.nextDep,i=e.prevSub,m=e.nextSub;return r!==void 0?r.prevDep=o:n.depsTail=o,o!==void 0?o.nextDep=r:n.deps=r,m!==void 0?m.prevSub=i:t.subsTail=i,i!==void 0?i.nextSub=m:t.subs=m,r}function F(e){e.depsTail=void 0,e.flags&=-13}function B(e){let n=e.depsTail,t=n!==void 0?n.nextDep:e.deps;for(;t!==void 0;)t=L(t,e)}function le(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?P(t):t.subs!==void 0&&U(t.subs))),n=n.nextSub}while(n!==void 0)}function U(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===0&&(t.flags=o|8,(o&2)!==0?P(t):t.subs!==void 0&&U(t.subs)),n=n.nextSub}while(n!==void 0)}function se(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 W(e,n){if(e.equals(e.v,n))return;e.v=n;let t=e.subs;t!==void 0&&(le(t),R===0&&H())}function q(e){if((e.flags&4)!==0||M(e)){if(!ue(e))return!1;let t=e.subs;return t!==void 0&&t.nextSub!==void 0&&se(t),!0}return e.flags=e.flags&-9,!1}function M(e){let n=e.deps;for(;n!==void 0;){let t=n.dep;if((t.flags&1)!==0&&(t.flags&12)!==0&&q(t))return!0;n=n.nextDep}return!1}function ue(e){let n=u,t=s;u=e,s=null,F(e);try{let o=e.fn();return(e.flags&32)!==0&&e.equals(e.v,o)?!1:(e.flags|=32,e.v=o,!0)}finally{B(e),u=n,s=t}}function P(e){w.push(e)}function H(){if(S)return;S=!0;let e=0;try{for(;g<w.length;){let n=w[g];if(w[g++]=void 0,(n.flags&16)===0){if(++e>oe)throw new c;(n.flags&4)!==0||M(n)?V(n):n.flags&=-9}}}finally{w.length=0,g=0,S=!1}}function V(e){let n=e.scope;j(n);let t=u,o=s;u=e,s=n,F(e);try{let r=e.fn();typeof r=="function"&&(n.disposals??=[]).push(r)}catch(r){x(r,n)}finally{B(e),u=t,s=o}}function T(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 j(e){let n=e.head;for(;n!==null;){let r=n.next;n.attached=!1,n.prev=null,n.next=null,j(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--)E(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){x(i,e)}}}function O(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}j(e)}function E(e){e.flags|=16;let n=e.deps;for(;n!==void 0;)n=L(n,e);let t=e.subs;for(;t!==void 0;){let r=t.nextSub;L(t,t.sub),t=r}let o=e.scope;o!==void 0&&(O(o),e.scope=void 0,e.fn=void 0)}function x(e,n){if(e instanceof c)throw e;let t=n;for(;t!==null;){let o=t.handler;if(o!==null){try{o(e)}catch(r){x(r,t.parent)}return}t=t.parent}N(e)}function d(){return s}function f(e){let n=s;return s=e,n}function b(e){let n=s;n!==null&&(n.cells??=[]).push(e)}function G(e){let n=T(s);return e.scope=n,n}function Y(e){V(e)}function $(e){e.flags|=16,e.fn=void 0;let n=s;n!==null&&n.cells.pop()}function a(e){return e===void 0?ne:e===!1?te:e}function de(e){R++;try{return e()}finally{--R===0&&H()}}function fe(e){try{return X(e)}finally{}}function X(e){let n=u;u=void 0;try{return e()}finally{u=n}}function ae(e,n){return new l(0,e,void 0,a(n?.equals))}function ce(e,n){let t=new l(5,void 0,e,a(n?.equals));return b(t),t}function I(e){let n=new l(2,void 0,e,a(void 0));return b(n),G(n),Y(n),n}function pe(e){let n=I(e);n.deps===void 0&&$(n)}function xe(e){d()===null&&void 0;let n=I(e);return()=>{E(n)}}function he(e){let n=d();if(n===null){return}(n.disposals??=[]).push(e)}function ve(e){let n=T(d()),t=f(n);try{return e(()=>{O(n)})}finally{f(t)}}function we(e,n){let t=T(d());t.handler=n;let o=f(t);try{let r=e();return f(o),r}catch(r){f(o),x(r,t);return}}function Ce(e,n){let t=f(e);try{return n()}finally{f(t)}}var J=Symbol("firsthand.ctx");function ye(e,n){let t=n??"context";return{id:Symbol(t),description:t,hasDefault:arguments.length>0,defaultValue:e,fallback:void 0}}function Te(e,n){let t=d();if(t===null){`${e.description}`;return}let o=n instanceof l?n:new l(0,n,void 0,a(void 0));me(t)[e.id]=o}function be(e){let n=d(),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 h(r.description);return r.fallback??=new l(0,r.defaultValue,void 0,a(void 0))}function me(e){let n=e.ctx;if(n!==null&&n[J]===e)return n;let t=n!==null?Object.create(n):Object.create(null);return t[J]=e,e.ctx=t,t}export{l as Cell,h as FirsthandContextError,c as FirsthandCycleError,p as FirsthandReadonlyError,de as batch,pe as bind,we as catchError,ce as computed,ye as createContext,I as createEffect,T as createOwner,ve as createRoot,Q as devEnterSetup,Z as devExitSetup,E as disposeCell,O as disposeOwner,xe as effect,d as getOwner,x as handleError,he as onCleanup,b as own,Te as provide,Ce as runWithOwner,f as setOwner,K as setStrictReactivity,ae as signal,fe as snapshot,X as untrack,be as useContext};
1
+ var c=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"}},v=class extends Error{constructor(n){super(`No provider for ${n}, and the context was created without a default value.`),this.name="FirsthandContextError"}},p=class extends Error{constructor(){super("Cannot assign to a computed value. Write to the signals it derives from instead."),this.name="FirsthandReadonlyError"}};function I(e){queueMicrotask(()=>{throw e})}function Q(e){}function Z(e){}function ee(){}var R=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}},te=Object.is,oe=()=>!1,l=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&&j(this),u!==void 0?ie(this,u):void 0,this.v}set value(n){if((this.flags&1)!==0)throw new p;N(this,n)}peek(){let n=this.flags;return(n&1)!==0&&(n&12)!==0&&j(this),this.v}set(n){if((this.flags&1)!==0)throw new p;N(this,n(this.v))}},u,s=null,D=0,S=!1,g=0,w=[],re=1e6;function ie(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&&le(r,n))return;let i=new R(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 le(e,n){let t=n.depsTail;for(;t!==void 0;){if(t===e)return!0;t=t.prevDep}return!1}function L(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 F(e){e.depsTail=void 0,e.flags&=-13}function B(e){let n=e.depsTail,t=n!==void 0?n.nextDep:e.deps;for(;t!==void 0;)t=L(t,e)}function se(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?M(t):t.subs!==void 0&&U(t.subs))),n=n.nextSub}while(n!==void 0)}function U(e){let n=e;do{let t=n.sub,o=t.flags;(o&12)===0&&(t.flags=o|8,(o&2)!==0?M(t):t.subs!==void 0&&U(t.subs)),n=n.nextSub}while(n!==void 0)}function ue(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 N(e,n){if(e.equals(e.v,n))return;e.v=n;let t=e.subs;t!==void 0&&(se(t),D===0&&P())}function j(e){if((e.flags&4)!==0||H(e)){if(!de(e))return!1;let t=e.subs;return t!==void 0&&t.nextSub!==void 0&&ue(t),!0}return e.flags=e.flags&-9,!1}function H(e){let n=e.deps;for(;n!==void 0;){let t=n.dep;if((t.flags&1)!==0&&(t.flags&12)!==0&&j(t))return!0;n=n.nextDep}return!1}function de(e){let n=u,t=s;u=e,s=null,F(e);try{let o=e.fn();return(e.flags&32)!==0&&e.equals(e.v,o)?!1:(e.flags|=32,e.v=o,!0)}finally{B(e),u=n,s=t}}function M(e){w.push(e)}function P(){if(S)return;S=!0;let e=0;try{for(;g<w.length;){let n=w[g];if(w[g++]=void 0,(n.flags&16)===0){if(++e>re)throw new c;(n.flags&4)!==0||H(n)?V(n):n.flags&=-9}}}finally{w.length=0,g=0,S=!1}}function V(e){let n=e.scope;q(n);let t=u,o=s;u=e,s=n,F(e);try{let r=e.fn();typeof r=="function"&&(n.disposals??=[]).push(r)}catch(r){x(r,n)}finally{B(e),u=t,s=o}}function m(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 q(e){let n=e.head;for(;n!==null;){let r=n.next;n.attached=!1,n.prev=null,n.next=null,q(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--)E(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){x(i,e)}}}function O(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}q(e)}function E(e){e.flags|=16;let n=e.deps;for(;n!==void 0;)n=L(n,e);let t=e.subs;for(;t!==void 0;){let r=t.nextSub;L(t,t.sub),t=r}let o=e.scope;o!==void 0&&(O(o),e.scope=void 0,e.fn=void 0)}function x(e,n){if(e instanceof c)throw e;let t=n;for(;t!==null;){let o=t.handler;if(o!==null){try{o(e)}catch(r){x(r,t.parent)}return}t=t.parent}I(e)}function d(){return s}function f(e){let n=s;return s=e,n}function y(e){let n=s;n!==null&&(n.cells??=[]).push(e)}function G(e){let n=m(s);return e.scope=n,n}function Y(e){V(e)}function $(e){e.flags|=16,e.fn=void 0;let n=s;n!==null&&n.cells.pop()}function a(e){return e===void 0?te:e===!1?oe:e}function fe(e){D++;try{return e()}finally{--D===0&&P()}}function ae(e){try{return X(e)}finally{}}function X(e){let n=u;u=void 0;try{return e()}finally{u=n}}function ce(e,n){let t=new l(0,e,void 0,a(n?.equals));return t}function pe(e,n){let t=new l(5,void 0,e,a(n?.equals));return y(t),e.name,t}function _(e){let n=new l(2,void 0,e,a(void 0));return e.name,y(n),G(n),Y(n),n}function xe(e){let n=_(e);n.deps===void 0&&$(n)}function ve(e){d()===null&&void 0;let n=_(e);return()=>{E(n)}}function he(e){let n=d();if(n===null){return}(n.disposals??=[]).push(e)}function we(e){let n=m(d());let t=f(n);try{return e(()=>{O(n)})}finally{f(t)}}function be(e,n){let t=m(d());t.handler=n;let o=f(t);try{let r=e();return f(o),r}catch(r){f(o),x(r,t);return}}function Ce(e,n){let t=f(e);try{return n()}finally{f(t)}}var K=Symbol("firsthand.ctx");function me(e,n){let t=n??"context";return{id:Symbol(t),description:t,hasDefault:arguments.length>0,defaultValue:e,fallback:void 0}}function ye(e,n){let t=d();if(t===null){`${e.description}`;return}let o=n instanceof l?n:new l(0,n,void 0,a(void 0));ge(t)[e.id]=o}function Te(e){let n=d(),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 v(r.description);return r.fallback??=new l(0,r.defaultValue,void 0,a(void 0))}function ge(e){let n=e.ctx;if(n!==null&&n[K]===e)return n;let t=n!==null?Object.create(n):Object.create(null);return t[K]=e,e.ctx=t,t}export{l as Cell,v as FirsthandContextError,c as FirsthandCycleError,p as FirsthandReadonlyError,fe as batch,xe as bind,be as catchError,pe as computed,me as createContext,_ as createEffect,m as createOwner,we as createRoot,Z as devEnterSetup,ee as devExitSetup,E as disposeCell,O as disposeOwner,ve as effect,d as getOwner,x as handleError,he as onCleanup,y as own,ye as provide,Ce as runWithOwner,f as setOwner,Q as setStrictReactivity,ce as signal,ae as snapshot,X as untrack,Te as useContext};
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,QAAQ,EAAyB,MAAM,WAAW,CAAC;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAO9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAU5D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,SAAS,CAgB3F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOlF;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,QAAQ,EAAyB,MAAM,WAAW,CAAC;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAO9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAa5D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,SAAS,CAgB3F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOlF;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAEvE"}
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAIvE"}
package/dist/types.d.ts CHANGED
@@ -35,4 +35,43 @@ export type DeepReadonly<T> = T extends (...args: never[]) => unknown ? T : T ex
35
35
  export type ReadonlyProps<T> = {
36
36
  readonly [K in keyof T]: DeepReadonly<T[K]>;
37
37
  };
38
+ /**
39
+ * What a devtools frontend installs on `globalThis.__FIRSTHAND_DEVTOOLS__`
40
+ * (ADR-0020).
41
+ *
42
+ * Declared once, here, because every package speaks it from its own `dev`
43
+ * module and none of them import each other's. A type costs nothing at
44
+ * runtime, so sharing the definition does not share any code.
45
+ */
46
+ export interface DevtoolsHook {
47
+ /** Set by the frontend once it is ready to receive labels. */
48
+ attached: boolean;
49
+ /** Labels a node of the graph: 'signal', 'computed' or 'effect'. */
50
+ label(target: object, kind: string, name: string): void;
51
+ /** The source that just changed, paired with whatever runs next. */
52
+ cause(dep: object): void;
53
+ /** A scope that owns cells, so the frontend can enumerate from the top. */
54
+ root(owner: object): void;
55
+ /** The effect that is running, or `null` between runs. */
56
+ running(effect: object | null): void;
57
+ /**
58
+ * A scope that belongs to a component instance, and what it is called.
59
+ *
60
+ * The owner tree already knows the shape; only the DOM layer knows the name,
61
+ * and only at the moment the instance is created.
62
+ */
63
+ component(owner: object, name: string): void;
64
+ /** The node and property a part is writing, from inside its own effect. */
65
+ part(node: object, property: string): void;
66
+ /**
67
+ * What a resource just did: created, invalidated or dropped.
68
+ *
69
+ * The cache is the one part of the framework whose behaviour is not in the
70
+ * reactive graph — a tag match is a decision rather than an edge.
71
+ */
72
+ query(event: string, key: string, tags: readonly string[]): void;
73
+ }
74
+ declare global {
75
+ var __FIRSTHAND_DEVTOOLS__: DevtoolsHook | undefined;
76
+ }
38
77
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAE7B,8CAA8C;AAC9C,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,0CAA0C;IAC1C,IAAI,IAAI,CAAC,CAAC;CACX;AAED,qDAAqD;AACrD,MAAM,WAAW,MAAM,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC;IACT,qDAAqD;IACrD,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CACxC;AAED,2DAA2D;AAC3D,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,KAAK,CAAC;CAC5C;AAED,gEAAgE;AAChE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GACjE,CAAC,GACD,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC9B,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC9B,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACrC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GAC7C,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC5B,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC5B,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GACxC,CAAC,GACD,CAAC,SAAS,MAAM,GACd;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC/C,CAAC,CAAC;AAEhB;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAE7B,8CAA8C;AAC9C,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,0CAA0C;IAC1C,IAAI,IAAI,CAAC,CAAC;CACX;AAED,qDAAqD;AACrD,MAAM,WAAW,MAAM,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC;IACT,qDAAqD;IACrD,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CACxC;AAED,2DAA2D;AAC3D,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,KAAK,CAAC;CAC5C;AAED,gEAAgE;AAChE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GACjE,CAAC,GACD,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC9B,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC9B,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACrC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GAC7C,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC5B,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC5B,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GACxC,CAAC,GACD,CAAC,SAAS,MAAM,GACd;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC/C,CAAC,CAAC;AAEhB;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,oEAAoE;IACpE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0DAA0D;IAC1D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,2EAA2E;IAC3E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAClE;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,sBAAsB,EAAE,YAAY,GAAG,SAAS,CAAC;CACtD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firsthandjs/core",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Fine-grained reactive core: signals, computeds, effects, owners and context. No DOM.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -8,6 +8,7 @@
8
8
  "exports": {
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
+ "development": "./dist/index.dev.js",
11
12
  "default": "./dist/index.js"
12
13
  }
13
14
  },