@reckona/mreact-reactive-core 0.0.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/dist/batch.d.ts +2 -0
  4. package/dist/batch.d.ts.map +1 -0
  5. package/dist/batch.js +17 -0
  6. package/dist/batch.js.map +1 -0
  7. package/dist/cell.d.ts +3 -0
  8. package/dist/cell.d.ts.map +1 -0
  9. package/dist/cell.js +42 -0
  10. package/dist/cell.js.map +1 -0
  11. package/dist/computed.d.ts +3 -0
  12. package/dist/computed.d.ts.map +1 -0
  13. package/dist/computed.js +107 -0
  14. package/dist/computed.js.map +1 -0
  15. package/dist/devtools.d.ts +6 -0
  16. package/dist/devtools.d.ts.map +1 -0
  17. package/dist/devtools.js +25 -0
  18. package/dist/devtools.js.map +1 -0
  19. package/dist/effect.d.ts +2 -0
  20. package/dist/effect.d.ts.map +1 -0
  21. package/dist/effect.js +89 -0
  22. package/dist/effect.js.map +1 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/internal.d.ts +4 -0
  28. package/dist/internal.d.ts.map +1 -0
  29. package/dist/internal.js +3 -0
  30. package/dist/internal.js.map +1 -0
  31. package/dist/runtime-state.d.ts +2 -0
  32. package/dist/runtime-state.d.ts.map +1 -0
  33. package/dist/runtime-state.js +11 -0
  34. package/dist/runtime-state.js.map +1 -0
  35. package/dist/scheduler.d.ts +9 -0
  36. package/dist/scheduler.d.ts.map +1 -0
  37. package/dist/scheduler.js +100 -0
  38. package/dist/scheduler.js.map +1 -0
  39. package/dist/state.d.ts +23 -0
  40. package/dist/state.d.ts.map +1 -0
  41. package/dist/state.js +9 -0
  42. package/dist/state.js.map +1 -0
  43. package/dist/testing.d.ts +3 -0
  44. package/dist/testing.d.ts.map +1 -0
  45. package/dist/testing.js +10 -0
  46. package/dist/testing.js.map +1 -0
  47. package/dist/tracking.d.ts +6 -0
  48. package/dist/tracking.d.ts.map +1 -0
  49. package/dist/tracking.js +120 -0
  50. package/dist/tracking.js.map +1 -0
  51. package/dist/types.d.ts +7 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/untrack.d.ts +2 -0
  56. package/dist/untrack.d.ts.map +1 -0
  57. package/dist/untrack.js +12 -0
  58. package/dist/untrack.js.map +1 -0
  59. package/package.json +49 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tatsuo Kaniwa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @reckona/mreact-reactive-core
2
+
3
+ `@reckona/mreact-reactive-core` provides the fine-grained reactive primitives
4
+ used across mreact. It is independent from the DOM and can be used by stores,
5
+ forms, query observers, and compiled runtime code.
6
+
7
+ ## Basic Usage
8
+
9
+ ```ts
10
+ import { cell, computed, effect } from "@reckona/mreact-reactive-core";
11
+
12
+ const count = cell(0);
13
+ const doubled = computed(() => count.get() * 2);
14
+
15
+ const dispose = effect(() => {
16
+ console.log(doubled.get());
17
+ });
18
+
19
+ count.set(1);
20
+ dispose();
21
+ ```
22
+
23
+ ## Core APIs
24
+
25
+ - `cell()` creates a writable reactive value.
26
+ - `computed()` creates a derived readonly value.
27
+ - `effect()` runs side effects when dependencies change.
28
+ - `batch()` groups updates into one flush.
29
+ - `untrack()` reads values without subscribing.
30
+
31
+ ## Testing
32
+
33
+ `@reckona/mreact-reactive-core/testing` exports `flushMicrotasks()` and
34
+ `flushEffects()` for deterministic tests.
@@ -0,0 +1,2 @@
1
+ export declare function batch<T>(fn: () => T): T;
2
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAIA,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAavC"}
package/dist/batch.js ADDED
@@ -0,0 +1,17 @@
1
+ import { runtimeState } from "./state.js";
2
+ import { schedulePendingFlush } from "./scheduler.js";
3
+ import { flushPendingComputed } from "./tracking.js";
4
+ export function batch(fn) {
5
+ runtimeState.batchDepth += 1;
6
+ try {
7
+ return fn();
8
+ }
9
+ finally {
10
+ runtimeState.batchDepth -= 1;
11
+ if (runtimeState.batchDepth === 0) {
12
+ flushPendingComputed();
13
+ schedulePendingFlush();
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,UAAU,KAAK,CAAI,EAAW;IAClC,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC;QAE7B,IAAI,YAAY,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAClC,oBAAoB,EAAE,CAAC;YACvB,oBAAoB,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/cell.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { Cell } from "./types.js";
2
+ export declare function cell<T>(initial: T): Cell<T>;
3
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CA4C3C"}
package/dist/cell.js ADDED
@@ -0,0 +1,42 @@
1
+ import { emitReactiveDevtoolsEvent, hasReactiveDevtoolsEmitter, } from "./devtools.js";
2
+ import { notifySubscribers, trackSource } from "./tracking.js";
3
+ export function cell(initial) {
4
+ let current = initial;
5
+ const source = {
6
+ subscribers: new Set(),
7
+ };
8
+ return {
9
+ get() {
10
+ trackSource(source);
11
+ return current;
12
+ },
13
+ set(next) {
14
+ const resolved = typeof next === "function" ? next(current) : next;
15
+ if (Object.is(current, resolved)) {
16
+ return;
17
+ }
18
+ if ((typeof __MREACT_CLIENT_DEVTOOLS__ === "undefined" ||
19
+ __MREACT_CLIENT_DEVTOOLS__ !== false) &&
20
+ hasReactiveDevtoolsEmitter()) {
21
+ const previous = current;
22
+ current = resolved;
23
+ emitReactiveDevtoolsEvent({
24
+ previous,
25
+ subscribers: source.subscribers.size,
26
+ type: "reactive:cell:set",
27
+ value: resolved,
28
+ });
29
+ }
30
+ else {
31
+ current = resolved;
32
+ }
33
+ const singleSubscriber = source.singleSubscriber;
34
+ if (singleSubscriber !== undefined &&
35
+ (singleSubscriber.disposed || singleSubscriber.queued)) {
36
+ return;
37
+ }
38
+ notifySubscribers(source);
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.js","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,UAAU,IAAI,CAAI,OAAU;IAChC,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,MAAM,MAAM,GAAW;QACrB,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;IAEF,OAAO;QACL,GAAG;YACD,WAAW,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,CAAC,IAA0B;YAC5B,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAE,IAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEvF,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,IACE,CAAC,OAAO,0BAA0B,KAAK,WAAW;gBAChD,0BAA0B,KAAK,KAAK,CAAC;gBACvC,0BAA0B,EAAE,EAC5B,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC;gBACzB,OAAO,GAAG,QAAQ,CAAC;gBACnB,yBAAyB,CAAC;oBACxB,QAAQ;oBACR,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;oBACpC,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,QAAQ,CAAC;YACrB,CAAC;YACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACjD,IACE,gBAAgB,KAAK,SAAS;gBAC9B,CAAC,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB,CAAC,MAAM,CAAC,EACtD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReadonlyCell } from "./types.js";
2
+ export declare function computed<T>(fn: () => T): ReadonlyCell<T>;
3
+ //# sourceMappingURL=computed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAwHxD"}
@@ -0,0 +1,107 @@
1
+ import { schedulePendingFlush } from "./scheduler.js";
2
+ import { runtimeState } from "./state.js";
3
+ import { cleanupDeps, notifySubscribers, trackSource } from "./tracking.js";
4
+ export function computed(fn) {
5
+ let hasValue = false;
6
+ let value;
7
+ let dirty = true;
8
+ const source = {
9
+ subscribers: new Set(),
10
+ };
11
+ const computation = {
12
+ id: runtimeState.nextComputationId,
13
+ deps: new Set(),
14
+ disposed: false,
15
+ queued: false,
16
+ markDirty() {
17
+ if (dirty && source.subscribers.size === 0) {
18
+ return;
19
+ }
20
+ dirty = true;
21
+ if (source.subscribers.size > 0) {
22
+ if (runtimeState.notificationDepth > 0) {
23
+ computation.queued = true;
24
+ runtimeState.pendingComputed.add(computation);
25
+ return;
26
+ }
27
+ publishIfChanged();
28
+ }
29
+ },
30
+ run() {
31
+ publishIfChanged();
32
+ },
33
+ dispose() {
34
+ if (computation.disposed) {
35
+ return;
36
+ }
37
+ computation.disposed = true;
38
+ cleanupDeps(computation);
39
+ source.subscribers.clear();
40
+ },
41
+ };
42
+ runtimeState.nextComputationId += 1;
43
+ function publishIfChanged() {
44
+ const previousHasValue = hasValue;
45
+ const previousValue = value;
46
+ try {
47
+ const nextValue = recompute();
48
+ if (!previousHasValue || !Object.is(previousValue, nextValue)) {
49
+ notifySubscribers(source);
50
+ }
51
+ }
52
+ catch {
53
+ runtimeState.batchDepth += 1;
54
+ try {
55
+ notifySubscribers(source);
56
+ }
57
+ finally {
58
+ runtimeState.batchDepth -= 1;
59
+ if (runtimeState.batchDepth === 0) {
60
+ schedulePendingFlush();
61
+ }
62
+ }
63
+ }
64
+ }
65
+ function recompute() {
66
+ if (!dirty && hasValue) {
67
+ return value;
68
+ }
69
+ const previousTracker = runtimeState.activeTracker;
70
+ const previousDeps = computation.deps;
71
+ const nextDeps = new Set();
72
+ computation.deps = nextDeps;
73
+ runtimeState.activeTracker = computation;
74
+ try {
75
+ const nextValue = fn();
76
+ for (const dep of previousDeps) {
77
+ if (!nextDeps.has(dep)) {
78
+ dep.subscribers.delete(computation);
79
+ }
80
+ }
81
+ value = nextValue;
82
+ hasValue = true;
83
+ dirty = false;
84
+ return value;
85
+ }
86
+ catch (error) {
87
+ for (const dep of nextDeps) {
88
+ if (!previousDeps.has(dep)) {
89
+ dep.subscribers.delete(computation);
90
+ }
91
+ }
92
+ computation.deps = previousDeps;
93
+ dirty = true;
94
+ throw error;
95
+ }
96
+ finally {
97
+ runtimeState.activeTracker = previousTracker;
98
+ }
99
+ }
100
+ return {
101
+ get() {
102
+ trackSource(source);
103
+ return recompute();
104
+ },
105
+ };
106
+ }
107
+ //# sourceMappingURL=computed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computed.js","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type DevtoolsEmitter = (event: Record<string, unknown>) => void;
2
+ export declare function emitReactiveDevtoolsEvent(event: Record<string, unknown>): void;
3
+ export declare function hasReactiveDevtoolsEmitter(): boolean;
4
+ export declare function currentDevtoolsEmitter(): DevtoolsEmitter | undefined;
5
+ export {};
6
+ //# sourceMappingURL=devtools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEhE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAa9E;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAKpE"}
@@ -0,0 +1,25 @@
1
+ export function emitReactiveDevtoolsEvent(event) {
2
+ const devtools = currentDevtools();
3
+ const emit = devtools?.emit;
4
+ if (typeof emit !== "function") {
5
+ return;
6
+ }
7
+ emit.call(devtools, {
8
+ package: "@reckona/mreact-reactive-core",
9
+ timestamp: Date.now(),
10
+ ...event,
11
+ });
12
+ }
13
+ export function hasReactiveDevtoolsEmitter() {
14
+ return typeof currentDevtools()?.emit === "function";
15
+ }
16
+ export function currentDevtoolsEmitter() {
17
+ const devtools = currentDevtools();
18
+ const emit = devtools?.emit;
19
+ return typeof emit === "function" ? emit.bind(devtools) : undefined;
20
+ }
21
+ function currentDevtools() {
22
+ const devtools = globalThis.__mreactDevtools;
23
+ return devtools;
24
+ }
25
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools.js","sourceRoot":"","sources":["../src/devtools.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,KAA8B;IACtE,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC;IAE5B,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QAClB,OAAO,EAAE,+BAA+B;QACxC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,OAAO,eAAe,EAAE,EAAE,IAAI,KAAK,UAAU,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAC;IAE5B,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC;AAED,SAAS,eAAe;IAGtB,MAAM,QAAQ,GACZ,UAGD,CAAC,gBAAgB,CAAC;IAEnB,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function effect(fn: () => void | (() => void)): () => void;
2
+ //# sourceMappingURL=effect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CA6FhE"}
package/dist/effect.js ADDED
@@ -0,0 +1,89 @@
1
+ import { queueComputation } from "./scheduler.js";
2
+ import { currentDevtoolsEmitter } from "./devtools.js";
3
+ import { runtimeState } from "./state.js";
4
+ import { cleanupDeps } from "./tracking.js";
5
+ export function effect(fn) {
6
+ let cleanup;
7
+ const computation = {
8
+ id: runtimeState.nextComputationId,
9
+ deps: new Set(),
10
+ disposed: false,
11
+ queued: false,
12
+ markDirty() {
13
+ queueComputation(computation);
14
+ },
15
+ run() {
16
+ if (computation.disposed) {
17
+ return;
18
+ }
19
+ const previousTracker = runtimeState.activeTracker;
20
+ if (cleanup !== undefined) {
21
+ const currentCleanup = cleanup;
22
+ currentCleanup();
23
+ cleanup = undefined;
24
+ }
25
+ cleanupDeps(computation);
26
+ runtimeState.activeTracker = computation;
27
+ if (typeof __MREACT_CLIENT_DEVTOOLS__ !== "undefined" &&
28
+ __MREACT_CLIENT_DEVTOOLS__ === false) {
29
+ try {
30
+ const result = fn();
31
+ cleanup = typeof result === "function" ? result : undefined;
32
+ }
33
+ finally {
34
+ runtimeState.activeTracker = previousTracker;
35
+ }
36
+ return;
37
+ }
38
+ const emit = currentDevtoolsEmitter();
39
+ const startedAt = emit === undefined ? 0 : performanceNow();
40
+ try {
41
+ const result = fn();
42
+ cleanup = typeof result === "function" ? result : undefined;
43
+ }
44
+ finally {
45
+ runtimeState.activeTracker = previousTracker;
46
+ if (emit !== undefined) {
47
+ emit({
48
+ durationMs: performanceNow() - startedAt,
49
+ id: computation.id,
50
+ package: "@reckona/mreact-reactive-core",
51
+ timestamp: Date.now(),
52
+ type: "reactive:effect:run",
53
+ });
54
+ }
55
+ }
56
+ },
57
+ dispose() {
58
+ if (computation.disposed) {
59
+ return;
60
+ }
61
+ computation.disposed = true;
62
+ cleanupDeps(computation);
63
+ if (cleanup !== undefined) {
64
+ const currentCleanup = cleanup;
65
+ cleanup = undefined;
66
+ currentCleanup();
67
+ }
68
+ },
69
+ };
70
+ runtimeState.nextComputationId += 1;
71
+ try {
72
+ computation.run();
73
+ }
74
+ catch (error) {
75
+ computation.disposed = true;
76
+ cleanupDeps(computation);
77
+ if (cleanup !== undefined) {
78
+ const currentCleanup = cleanup;
79
+ cleanup = undefined;
80
+ currentCleanup();
81
+ }
82
+ throw error;
83
+ }
84
+ return computation.dispose;
85
+ }
86
+ function performanceNow() {
87
+ return typeof performance === "undefined" ? Date.now() : performance.now();
88
+ }
89
+ //# sourceMappingURL=effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { Cell, ReadonlyCell } from "./types.js";
2
+ export { batch } from "./batch.js";
3
+ export { cell } from "./cell.js";
4
+ export { computed } from "./computed.js";
5
+ export { effect } from "./effect.js";
6
+ export { untrack } from "./untrack.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { batch } from "./batch.js";
2
+ export { cell } from "./cell.js";
3
+ export { computed } from "./computed.js";
4
+ export { effect } from "./effect.js";
5
+ export { untrack } from "./untrack.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { Scheduler } from "./scheduler.js";
2
+ export { flushQueuedComputations, schedulePendingFlush, setScheduler, } from "./scheduler.js";
3
+ export { getGlobalRuntimeState } from "./runtime-state.js";
4
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { flushQueuedComputations, schedulePendingFlush, setScheduler, } from "./scheduler.js";
2
+ export { getGlobalRuntimeState } from "./runtime-state.js";
3
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getGlobalRuntimeState<TState extends object>(key: string, create: () => TState): TState;
2
+ //# sourceMappingURL=runtime-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,EACzD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,MAAM,GACnB,MAAM,CAWR"}
@@ -0,0 +1,11 @@
1
+ export function getGlobalRuntimeState(key, create) {
2
+ const global = globalThis;
3
+ const existing = global[key];
4
+ if (existing !== undefined) {
5
+ return existing;
6
+ }
7
+ const state = create();
8
+ global[key] = state;
9
+ return state;
10
+ }
11
+ //# sourceMappingURL=runtime-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,MAAoB;IAEpB,MAAM,MAAM,GAAG,UAA2B,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactiveComputation } from "./state.js";
2
+ export interface Scheduler {
3
+ schedule(flush: () => void): void;
4
+ }
5
+ export declare function setScheduler(nextScheduler: Scheduler): () => void;
6
+ export declare function queueComputation(computation: ReactiveComputation): void;
7
+ export declare function schedulePendingFlush(): void;
8
+ export declare function flushQueuedComputations(): void;
9
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACnC;AAmBD,wBAAgB,YAAY,CAAC,aAAa,EAAE,SAAS,GAAG,MAAM,IAAI,CAOjE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAavE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAiB3C;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAqC9C"}
@@ -0,0 +1,100 @@
1
+ import { runtimeState } from "./state.js";
2
+ const defaultScheduler = {
3
+ schedule(flush) {
4
+ if (typeof queueMicrotask === "function") {
5
+ queueMicrotask(flush);
6
+ return;
7
+ }
8
+ void Promise.resolve().then(flush);
9
+ },
10
+ };
11
+ let scheduler = defaultScheduler;
12
+ const queue = new Set();
13
+ let scheduled = false;
14
+ let flushing = false;
15
+ const maxFlushIterations = 100;
16
+ export function setScheduler(nextScheduler) {
17
+ const previous = scheduler;
18
+ scheduler = nextScheduler;
19
+ return () => {
20
+ scheduler = previous;
21
+ };
22
+ }
23
+ export function queueComputation(computation) {
24
+ if (computation.disposed) {
25
+ return;
26
+ }
27
+ queue.add(computation);
28
+ computation.queued = true;
29
+ if (runtimeState.batchDepth > 0) {
30
+ return;
31
+ }
32
+ schedulePendingFlush();
33
+ }
34
+ export function schedulePendingFlush() {
35
+ if (queue.size === 0 || scheduled || flushing) {
36
+ return;
37
+ }
38
+ scheduled = true;
39
+ try {
40
+ scheduler.schedule(flushQueuedComputations);
41
+ }
42
+ catch (error) {
43
+ scheduled = false;
44
+ for (const computation of queue) {
45
+ computation.queued = false;
46
+ }
47
+ queue.clear();
48
+ throw error;
49
+ }
50
+ }
51
+ export function flushQueuedComputations() {
52
+ if (flushing) {
53
+ return;
54
+ }
55
+ scheduled = false;
56
+ flushing = true;
57
+ let firstError;
58
+ try {
59
+ for (let iteration = 0; queue.size > 0; iteration += 1) {
60
+ if (iteration >= maxFlushIterations) {
61
+ throw new Error("Reactive flush limit exceeded");
62
+ }
63
+ const current = orderedComputations(queue);
64
+ queue.clear();
65
+ for (const computation of current) {
66
+ computation.queued = false;
67
+ if (!computation.disposed) {
68
+ try {
69
+ computation.run();
70
+ }
71
+ catch (error) {
72
+ firstError ??= error;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ if (firstError !== undefined) {
78
+ throw firstError;
79
+ }
80
+ }
81
+ finally {
82
+ flushing = false;
83
+ }
84
+ }
85
+ function orderedComputations(computations) {
86
+ const ordered = [];
87
+ let previousId = -1;
88
+ let monotonic = true;
89
+ for (const computation of computations) {
90
+ ordered.push(computation);
91
+ if (computation.id < previousId) {
92
+ monotonic = false;
93
+ }
94
+ previousId = computation.id;
95
+ }
96
+ return monotonic || ordered.length < 2
97
+ ? ordered
98
+ : ordered.sort((a, b) => a.id - b.id);
99
+ }
100
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface Source {
2
+ singleSubscriber?: ReactiveComputation | undefined;
3
+ subscribers: Set<ReactiveComputation>;
4
+ }
5
+ export interface ReactiveComputation {
6
+ readonly id: number;
7
+ deps: Set<Source>;
8
+ disposed: boolean;
9
+ queued: boolean;
10
+ markDirty(): void;
11
+ run(): void;
12
+ dispose(): void;
13
+ }
14
+ export type Tracker = ReactiveComputation | null;
15
+ export declare const runtimeState: {
16
+ activeTracker: Tracker;
17
+ batchDepth: number;
18
+ flushingComputed: boolean;
19
+ nextComputationId: number;
20
+ notificationDepth: number;
21
+ pendingComputed: Set<ReactiveComputation>;
22
+ };
23
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,gBAAgB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACnD,WAAW,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,IAAI,IAAI,CAAC;IAClB,GAAG,IAAI,IAAI,CAAC;IACZ,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAAC;AAEjD,eAAO,MAAM,YAAY,EAAE;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CAQ3C,CAAC"}
package/dist/state.js ADDED
@@ -0,0 +1,9 @@
1
+ export const runtimeState = {
2
+ activeTracker: null,
3
+ batchDepth: 0,
4
+ flushingComputed: false,
5
+ nextComputationId: 0,
6
+ notificationDepth: 0,
7
+ pendingComputed: new Set(),
8
+ };
9
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,YAAY,GAOrB;IACF,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,KAAK;IACvB,iBAAiB,EAAE,CAAC;IACpB,iBAAiB,EAAE,CAAC;IACpB,eAAe,EAAE,IAAI,GAAG,EAAE;CAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function flushMicrotasks(): Promise<void>;
2
+ export declare function flushEffects(): Promise<void>;
3
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD"}
@@ -0,0 +1,10 @@
1
+ import { flushQueuedComputations } from "./scheduler.js";
2
+ export async function flushMicrotasks() {
3
+ await Promise.resolve();
4
+ }
5
+ export async function flushEffects() {
6
+ flushQueuedComputations();
7
+ await Promise.resolve();
8
+ flushQueuedComputations();
9
+ }
10
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,uBAAuB,EAAE,CAAC;IAC1B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,uBAAuB,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type ReactiveComputation, type Source } from "./state.js";
2
+ export declare function trackSource(source: Source): void;
3
+ export declare function cleanupDeps(computation: ReactiveComputation): void;
4
+ export declare function notifySubscribers(source: Source): void;
5
+ export declare function flushPendingComputed(): void;
6
+ //# sourceMappingURL=tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAqBhD;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAclE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAqDtD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CA0B3C"}
@@ -0,0 +1,120 @@
1
+ import { runtimeState } from "./state.js";
2
+ export function trackSource(source) {
3
+ const tracker = runtimeState.activeTracker;
4
+ if (tracker === null || tracker.disposed) {
5
+ return;
6
+ }
7
+ if (source.singleSubscriber === tracker) {
8
+ tracker.deps.add(source);
9
+ return;
10
+ }
11
+ const previousSize = source.subscribers.size;
12
+ source.subscribers.add(tracker);
13
+ tracker.deps.add(source);
14
+ if (previousSize === 0) {
15
+ source.singleSubscriber = tracker;
16
+ }
17
+ else if (source.subscribers.size > 1) {
18
+ source.singleSubscriber = undefined;
19
+ }
20
+ }
21
+ export function cleanupDeps(computation) {
22
+ for (const dep of computation.deps) {
23
+ if (!dep.subscribers.delete(computation)) {
24
+ continue;
25
+ }
26
+ if (dep.subscribers.size === 0) {
27
+ dep.singleSubscriber = undefined;
28
+ }
29
+ else if (dep.subscribers.size === 1) {
30
+ dep.singleSubscriber = dep.subscribers.values().next().value;
31
+ }
32
+ }
33
+ computation.deps.clear();
34
+ }
35
+ export function notifySubscribers(source) {
36
+ if (source.subscribers.size === 0) {
37
+ return;
38
+ }
39
+ const cachedSingleSubscriber = source.singleSubscriber;
40
+ if (cachedSingleSubscriber !== undefined) {
41
+ if (cachedSingleSubscriber.disposed || cachedSingleSubscriber.queued) {
42
+ return;
43
+ }
44
+ runtimeState.notificationDepth += 1;
45
+ try {
46
+ cachedSingleSubscriber.markDirty();
47
+ }
48
+ finally {
49
+ runtimeState.notificationDepth -= 1;
50
+ if (runtimeState.notificationDepth === 0 && runtimeState.batchDepth === 0) {
51
+ flushPendingComputed();
52
+ }
53
+ }
54
+ return;
55
+ }
56
+ runtimeState.notificationDepth += 1;
57
+ try {
58
+ const singleSubscriber = source.subscribers.size === 1
59
+ ? source.subscribers.values().next().value
60
+ : undefined;
61
+ if (singleSubscriber !== undefined) {
62
+ if (!singleSubscriber.disposed && !singleSubscriber.queued) {
63
+ singleSubscriber.markDirty();
64
+ }
65
+ }
66
+ else {
67
+ const subscribers = orderedComputations(source.subscribers);
68
+ for (const subscriber of subscribers) {
69
+ if (!subscriber.disposed && !subscriber.queued) {
70
+ subscriber.markDirty();
71
+ }
72
+ }
73
+ }
74
+ }
75
+ finally {
76
+ runtimeState.notificationDepth -= 1;
77
+ if (runtimeState.notificationDepth === 0 && runtimeState.batchDepth === 0) {
78
+ flushPendingComputed();
79
+ }
80
+ }
81
+ }
82
+ export function flushPendingComputed() {
83
+ if (runtimeState.flushingComputed) {
84
+ return;
85
+ }
86
+ runtimeState.flushingComputed = true;
87
+ try {
88
+ while (runtimeState.pendingComputed.size > 0) {
89
+ const computations = runtimeState.pendingComputed.size === 1
90
+ ? [runtimeState.pendingComputed.values().next().value]
91
+ : orderedComputations(runtimeState.pendingComputed);
92
+ runtimeState.pendingComputed.clear();
93
+ for (const computation of computations) {
94
+ computation.queued = false;
95
+ if (!computation.disposed) {
96
+ computation.run();
97
+ }
98
+ }
99
+ }
100
+ }
101
+ finally {
102
+ runtimeState.flushingComputed = false;
103
+ }
104
+ }
105
+ function orderedComputations(computations) {
106
+ const ordered = [];
107
+ let previousId = -1;
108
+ let monotonic = true;
109
+ for (const computation of computations) {
110
+ ordered.push(computation);
111
+ if (computation.id < previousId) {
112
+ monotonic = false;
113
+ }
114
+ previousId = computation.id;
115
+ }
116
+ return monotonic || ordered.length < 2
117
+ ? ordered
118
+ : ordered.sort((a, b) => a.id - b.id);
119
+ }
120
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ReadonlyCell<T> {
2
+ get(): T;
3
+ }
4
+ export interface Cell<T> extends ReadonlyCell<T> {
5
+ set(value: T | ((prev: T) => T)): void;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,GAAG,IAAI,CAAC,CAAC;CACV;AAED,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC9C,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;CACxC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function untrack<T>(fn: () => T): T;
2
+ //# sourceMappingURL=untrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack.d.ts","sourceRoot":"","sources":["../src/untrack.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CASzC"}
@@ -0,0 +1,12 @@
1
+ import { runtimeState } from "./state.js";
2
+ export function untrack(fn) {
3
+ const previousTracker = runtimeState.activeTracker;
4
+ runtimeState.activeTracker = null;
5
+ try {
6
+ return fn();
7
+ }
8
+ finally {
9
+ runtimeState.activeTracker = previousTracker;
10
+ }
11
+ }
12
+ //# sourceMappingURL=untrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack.js","sourceRoot":"","sources":["../src/untrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,OAAO,CAAI,EAAW;IACpC,MAAM,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC;IACnD,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC;IAElC,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,aAAa,GAAG,eAAe,CAAC;IAC/C,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@reckona/mreact-reactive-core",
3
+ "version": "0.0.1",
4
+ "description": "Fine-grained reactive primitives used across mreact.",
5
+ "keywords": [
6
+ "jsx",
7
+ "mreact",
8
+ "primitives",
9
+ "reactivity",
10
+ "signals",
11
+ "typescript"
12
+ ],
13
+ "homepage": "https://github.com/t-k/mreact/tree/main/packages/reactive-core#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/t-k/mreact/issues"
16
+ },
17
+ "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/t-k/mreact.git",
21
+ "directory": "packages/reactive-core"
22
+ },
23
+ "files": [
24
+ "dist/**/*.js",
25
+ "dist/**/*.js.map",
26
+ "dist/**/*.d.ts",
27
+ "dist/**/*.d.ts.map"
28
+ ],
29
+ "type": "module",
30
+ "sideEffects": false,
31
+ "types": "./dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./internal": {
38
+ "types": "./dist/internal.d.ts",
39
+ "default": "./dist/internal.js"
40
+ },
41
+ "./testing": {
42
+ "types": "./dist/testing.d.ts",
43
+ "default": "./dist/testing.js"
44
+ }
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ }
49
+ }