@fluixi/reactive 1.0.0-alpha.100

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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -0
  3. package/dist/cdn/reactive.cjs +2803 -0
  4. package/dist/cdn/reactive.d.ts +11 -0
  5. package/dist/cdn/reactive.d.ts.map +1 -0
  6. package/dist/cdn/reactive.global.js +2 -0
  7. package/dist/cdn/reactive.js +10 -0
  8. package/dist/cdn/reactive.mjs +2787 -0
  9. package/dist/cdn/signal.cjs +299 -0
  10. package/dist/cdn/signal.d.ts +19 -0
  11. package/dist/cdn/signal.d.ts.map +1 -0
  12. package/dist/cdn/signal.global.js +2 -0
  13. package/dist/cdn/signal.js +18 -0
  14. package/dist/cdn/signal.mjs +276 -0
  15. package/dist/index.cjs +2803 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +1 -0
  19. package/dist/index.mjs +2787 -0
  20. package/dist/lib/index.cjs +2804 -0
  21. package/dist/lib/index.d.ts +8 -0
  22. package/dist/lib/index.d.ts.map +1 -0
  23. package/dist/lib/index.js +11 -0
  24. package/dist/lib/index.mjs +2789 -0
  25. package/dist/lib/observable/index.cjs +386 -0
  26. package/dist/lib/observable/index.d.ts +4 -0
  27. package/dist/lib/observable/index.d.ts.map +1 -0
  28. package/dist/lib/observable/index.js +3 -0
  29. package/dist/lib/observable/index.mjs +364 -0
  30. package/dist/lib/observable/observable.cjs +384 -0
  31. package/dist/lib/observable/observable.d.ts +246 -0
  32. package/dist/lib/observable/observable.d.ts.map +1 -0
  33. package/dist/lib/observable/observable.js +268 -0
  34. package/dist/lib/observable/observable.mjs +361 -0
  35. package/dist/lib/observable/subscription.cjs +180 -0
  36. package/dist/lib/observable/subscription.d.ts +58 -0
  37. package/dist/lib/observable/subscription.d.ts.map +1 -0
  38. package/dist/lib/observable/subscription.js +177 -0
  39. package/dist/lib/observable/subscription.mjs +157 -0
  40. package/dist/lib/observable/types.cjs +18 -0
  41. package/dist/lib/observable/types.d.ts +44 -0
  42. package/dist/lib/observable/types.d.ts.map +1 -0
  43. package/dist/lib/observable/types.js +1 -0
  44. package/dist/lib/observable/types.mjs +0 -0
  45. package/dist/lib/predicates.cjs +44 -0
  46. package/dist/lib/predicates.d.ts +37 -0
  47. package/dist/lib/predicates.d.ts.map +1 -0
  48. package/dist/lib/predicates.js +62 -0
  49. package/dist/lib/predicates.mjs +23 -0
  50. package/dist/lib/signal/api.cjs +592 -0
  51. package/dist/lib/signal/api.d.ts +227 -0
  52. package/dist/lib/signal/api.d.ts.map +1 -0
  53. package/dist/lib/signal/api.js +228 -0
  54. package/dist/lib/signal/api.mjs +569 -0
  55. package/dist/lib/signal/cached-resource.cjs +726 -0
  56. package/dist/lib/signal/cached-resource.d.ts +86 -0
  57. package/dist/lib/signal/cached-resource.d.ts.map +1 -0
  58. package/dist/lib/signal/cached-resource.js +250 -0
  59. package/dist/lib/signal/cached-resource.mjs +704 -0
  60. package/dist/lib/signal/graph/children.cjs +326 -0
  61. package/dist/lib/signal/graph/children.d.ts +2 -0
  62. package/dist/lib/signal/graph/children.d.ts.map +1 -0
  63. package/dist/lib/signal/graph/children.js +30 -0
  64. package/dist/lib/signal/graph/children.mjs +303 -0
  65. package/dist/lib/signal/graph/compat.cjs +590 -0
  66. package/dist/lib/signal/graph/compat.d.ts +66 -0
  67. package/dist/lib/signal/graph/compat.d.ts.map +1 -0
  68. package/dist/lib/signal/graph/compat.js +197 -0
  69. package/dist/lib/signal/graph/compat.mjs +568 -0
  70. package/dist/lib/signal/graph/core.cjs +295 -0
  71. package/dist/lib/signal/graph/core.d.ts +99 -0
  72. package/dist/lib/signal/graph/core.d.ts.map +1 -0
  73. package/dist/lib/signal/graph/core.js +268 -0
  74. package/dist/lib/signal/graph/core.mjs +273 -0
  75. package/dist/lib/signal/graph/debounced.cjs +680 -0
  76. package/dist/lib/signal/graph/debounced.d.ts +67 -0
  77. package/dist/lib/signal/graph/debounced.d.ts.map +1 -0
  78. package/dist/lib/signal/graph/debounced.js +92 -0
  79. package/dist/lib/signal/graph/debounced.mjs +657 -0
  80. package/dist/lib/signal/graph/derived.cjs +508 -0
  81. package/dist/lib/signal/graph/derived.d.ts +14 -0
  82. package/dist/lib/signal/graph/derived.d.ts.map +1 -0
  83. package/dist/lib/signal/graph/derived.js +65 -0
  84. package/dist/lib/signal/graph/derived.mjs +485 -0
  85. package/dist/lib/signal/graph/detect.cjs +66 -0
  86. package/dist/lib/signal/graph/detect.d.ts +17 -0
  87. package/dist/lib/signal/graph/detect.d.ts.map +1 -0
  88. package/dist/lib/signal/graph/detect.js +39 -0
  89. package/dist/lib/signal/graph/detect.mjs +45 -0
  90. package/dist/lib/signal/graph/error-boundary.cjs +313 -0
  91. package/dist/lib/signal/graph/error-boundary.d.ts +16 -0
  92. package/dist/lib/signal/graph/error-boundary.d.ts.map +1 -0
  93. package/dist/lib/signal/graph/error-boundary.js +34 -0
  94. package/dist/lib/signal/graph/error-boundary.mjs +290 -0
  95. package/dist/lib/signal/graph/index.cjs +305 -0
  96. package/dist/lib/signal/graph/index.d.ts +22 -0
  97. package/dist/lib/signal/graph/index.d.ts.map +1 -0
  98. package/dist/lib/signal/graph/index.js +21 -0
  99. package/dist/lib/signal/graph/index.mjs +283 -0
  100. package/dist/lib/signal/graph/observe.cjs +198 -0
  101. package/dist/lib/signal/graph/observe.d.ts +185 -0
  102. package/dist/lib/signal/graph/observe.d.ts.map +1 -0
  103. package/dist/lib/signal/graph/observe.js +198 -0
  104. package/dist/lib/signal/graph/observe.mjs +175 -0
  105. package/dist/lib/signal/graph/resource.cjs +632 -0
  106. package/dist/lib/signal/graph/resource.d.ts +39 -0
  107. package/dist/lib/signal/graph/resource.d.ts.map +1 -0
  108. package/dist/lib/signal/graph/resource.js +165 -0
  109. package/dist/lib/signal/graph/resource.mjs +609 -0
  110. package/dist/lib/signal/graph/runtime.cjs +522 -0
  111. package/dist/lib/signal/graph/runtime.d.ts +80 -0
  112. package/dist/lib/signal/graph/runtime.d.ts.map +1 -0
  113. package/dist/lib/signal/graph/runtime.js +358 -0
  114. package/dist/lib/signal/graph/runtime.mjs +499 -0
  115. package/dist/lib/signal/graph/signal-next.cjs +1249 -0
  116. package/dist/lib/signal/graph/signal-next.d.ts +38 -0
  117. package/dist/lib/signal/graph/signal-next.d.ts.map +1 -0
  118. package/dist/lib/signal/graph/signal-next.js +44 -0
  119. package/dist/lib/signal/graph/signal-next.mjs +1227 -0
  120. package/dist/lib/signal/graph/ssr-hooks.cjs +89 -0
  121. package/dist/lib/signal/graph/ssr-hooks.d.ts +51 -0
  122. package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -0
  123. package/dist/lib/signal/graph/ssr-hooks.js +80 -0
  124. package/dist/lib/signal/graph/ssr-hooks.mjs +68 -0
  125. package/dist/lib/signal/graph/state.cjs +72 -0
  126. package/dist/lib/signal/graph/state.d.ts +76 -0
  127. package/dist/lib/signal/graph/state.d.ts.map +1 -0
  128. package/dist/lib/signal/graph/state.js +99 -0
  129. package/dist/lib/signal/graph/state.mjs +49 -0
  130. package/dist/lib/signal/graph/suspense.cjs +313 -0
  131. package/dist/lib/signal/graph/suspense.d.ts +13 -0
  132. package/dist/lib/signal/graph/suspense.d.ts.map +1 -0
  133. package/dist/lib/signal/graph/suspense.js +36 -0
  134. package/dist/lib/signal/graph/suspense.mjs +290 -0
  135. package/dist/lib/signal/index-legacy.cjs +2582 -0
  136. package/dist/lib/signal/index-legacy.d.ts +12 -0
  137. package/dist/lib/signal/index-legacy.d.ts.map +1 -0
  138. package/dist/lib/signal/index-legacy.js +11 -0
  139. package/dist/lib/signal/index-legacy.mjs +2560 -0
  140. package/dist/lib/signal/index.cjs +1350 -0
  141. package/dist/lib/signal/index.d.ts +19 -0
  142. package/dist/lib/signal/index.d.ts.map +1 -0
  143. package/dist/lib/signal/index.js +19 -0
  144. package/dist/lib/signal/index.mjs +1328 -0
  145. package/dist/lib/signal/list.cjs +561 -0
  146. package/dist/lib/signal/list.d.ts +39 -0
  147. package/dist/lib/signal/list.d.ts.map +1 -0
  148. package/dist/lib/signal/list.js +172 -0
  149. package/dist/lib/signal/list.mjs +538 -0
  150. package/dist/lib/signal/resource-api.cjs +638 -0
  151. package/dist/lib/signal/resource-api.d.ts +19 -0
  152. package/dist/lib/signal/resource-api.d.ts.map +1 -0
  153. package/dist/lib/signal/resource-api.js +27 -0
  154. package/dist/lib/signal/resource-api.mjs +615 -0
  155. package/dist/lib/signal/signal.cjs +2035 -0
  156. package/dist/lib/signal/signal.d.ts +303 -0
  157. package/dist/lib/signal/signal.d.ts.map +1 -0
  158. package/dist/lib/signal/signal.js +1233 -0
  159. package/dist/lib/signal/signal.mjs +2012 -0
  160. package/dist/lib/signal/types.cjs +38 -0
  161. package/dist/lib/signal/types.d.ts +133 -0
  162. package/dist/lib/signal/types.d.ts.map +1 -0
  163. package/dist/lib/signal/types.js +38 -0
  164. package/dist/lib/signal/types.mjs +17 -0
  165. package/dist/lib/signal/utilities.cjs +1024 -0
  166. package/dist/lib/signal/utilities.d.ts +247 -0
  167. package/dist/lib/signal/utilities.d.ts.map +1 -0
  168. package/dist/lib/signal/utilities.js +346 -0
  169. package/dist/lib/signal/utilities.mjs +1002 -0
  170. package/dist/lib/store/api.cjs +662 -0
  171. package/dist/lib/store/api.d.ts +40 -0
  172. package/dist/lib/store/api.d.ts.map +1 -0
  173. package/dist/lib/store/api.js +63 -0
  174. package/dist/lib/store/api.mjs +646 -0
  175. package/dist/lib/store/index.cjs +741 -0
  176. package/dist/lib/store/index.d.ts +16 -0
  177. package/dist/lib/store/index.d.ts.map +1 -0
  178. package/dist/lib/store/index.js +13 -0
  179. package/dist/lib/store/index.mjs +726 -0
  180. package/dist/lib/store/setter.types.cjs +18 -0
  181. package/dist/lib/store/setter.types.d.ts +131 -0
  182. package/dist/lib/store/setter.types.d.ts.map +1 -0
  183. package/dist/lib/store/setter.types.js +65 -0
  184. package/dist/lib/store/setter.types.mjs +0 -0
  185. package/dist/lib/store/store.cjs +708 -0
  186. package/dist/lib/store/store.d.ts +142 -0
  187. package/dist/lib/store/store.d.ts.map +1 -0
  188. package/dist/lib/store/store.js +812 -0
  189. package/dist/lib/store/store.mjs +694 -0
  190. package/dist/lib/store/types.cjs +18 -0
  191. package/dist/lib/store/types.d.ts +57 -0
  192. package/dist/lib/store/types.d.ts.map +1 -0
  193. package/dist/lib/store/types.js +1 -0
  194. package/dist/lib/store/types.mjs +0 -0
  195. package/dist/lib/store/utils.cjs +43 -0
  196. package/dist/lib/store/utils.d.ts +13 -0
  197. package/dist/lib/store/utils.d.ts.map +1 -0
  198. package/dist/lib/store/utils.js +29 -0
  199. package/dist/lib/store/utils.mjs +22 -0
  200. package/dist/lib/subject.cjs +450 -0
  201. package/dist/lib/subject.d.ts +14 -0
  202. package/dist/lib/subject.d.ts.map +1 -0
  203. package/dist/lib/subject.js +81 -0
  204. package/dist/lib/subject.mjs +427 -0
  205. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  206. package/dist/version.generated.cjs +27 -0
  207. package/dist/version.generated.d.ts +3 -0
  208. package/dist/version.generated.d.ts.map +1 -0
  209. package/dist/version.generated.js +3 -0
  210. package/dist/version.generated.mjs +7 -0
  211. package/package.json +115 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * The `create*` names, over the graph core and the runtime.
3
+ *
4
+ * Signatures are identical to the ones this API has always had, so nothing calling
5
+ * `createSignal`, `createMemo` or `createEffect` can tell the difference. What
6
+ * changed underneath is that they now delegate to the TC39-shaped core in `core.ts`
7
+ * rather than to the bespoke `Computation` graph, which survives in `../signal.ts`
8
+ * as archive.
9
+ *
10
+ * This module covers the primitives: signals, memos, effects, roots, batch, untrack
11
+ * and on. The wider surface, resources and stores and context and suspense and
12
+ * transitions and the SSR hooks, is ported in the modules beside it.
13
+ *
14
+ * Timing: effects flush synchronously on a write outside a batch, which is what this
15
+ * API has always done, so the scheduler installed here is synchronous. `batch` still
16
+ * coalesces a group of writes into one flush.
17
+ */
18
+ import { State, Computed, untrack as l0untrack } from './core.js';
19
+ import { effect as l1effect, batch as l1batch, setScheduler, afterWrite, flushSync, reportSuspend, getOwner, runWithOwner, onCleanup as l1onCleanup, } from './runtime.js';
20
+ import { isObserved, reportReactiveDispose, reportReactiveNode } from './observe.js';
21
+ function isThenable(v) {
22
+ return !!v && typeof v.then === 'function';
23
+ }
24
+ export { createRoot, onCleanup, getOwner, setOwner, runWithOwner } from './runtime.js';
25
+ // Compat owns all flush points (afterWrite / batch), so the host scheduler is a
26
+ // no-op: enqueue only queues; a write marks the whole graph then flushes once via
27
+ // afterWrite. This separates marking from running (glitch-free, legacy-equivalent
28
+ // synchronous effects), a synchronous scheduler that flushed mid-propagation would
29
+ // run effects before all observers were marked.
30
+ setScheduler(() => { });
31
+ const $SIGNAL = Symbol.for('signal');
32
+ const $MEMO = Symbol.for('memo');
33
+ // The legacy createSignal attaches a ReactiveNode (with a live `.value`/`.version`)
34
+ // under this symbol; consumers like the store read `signal[$NODE].value` to gate
35
+ // updates. compat exposes a matching node-like view so those consumers work unchanged.
36
+ const $NODE = Symbol.for('signal-node');
37
+ /** createSignal, a writable cell, returned as the legacy `[get, set]` tuple. */
38
+ export function createSignal(value, options) {
39
+ const state = new State(value, { equals: options?.equals });
40
+ const read = (() => state.get());
41
+ const write = ((next) => {
42
+ const v = typeof next === 'function' ? next(state.peek()) : next;
43
+ state.set(v); // marks the graph dirty
44
+ afterWrite(); // then flush effects once (no-op inside a batch)
45
+ return v;
46
+ });
47
+ Object.defineProperty(read, $SIGNAL, { value: true, enumerable: true });
48
+ // Node-like view for consumers (e.g. the store) that read `signal[$NODE].value`.
49
+ Object.defineProperty(read, $NODE, {
50
+ value: {
51
+ get value() {
52
+ return state.peek();
53
+ },
54
+ get version() {
55
+ return state.version;
56
+ },
57
+ },
58
+ enumerable: false,
59
+ });
60
+ reportReactiveNode({
61
+ kind: 'signal',
62
+ node: state,
63
+ handle: read,
64
+ name: options?.name,
65
+ set: write,
66
+ });
67
+ // A signal goes when its owner does, the same as a memo. A list rebuilt without a key
68
+ // makes one per row per update, and a watcher that is never told keeps every one of them.
69
+ if (isObserved())
70
+ l1onCleanup(() => reportReactiveDispose(state));
71
+ return [read, write];
72
+ }
73
+ /** createMemo, a lazy, cached derived value (legacy accessor). */
74
+ export function createMemo(fn, value, options) {
75
+ let prev = value;
76
+ // Capture the owner at creation so the memo's fn (and any component it renders, e.g.
77
+ // a lazy route) runs under this scope's owner, preserving context up the owner chain
78
+ // even when the memo recomputes later (async SSR drain). Matches legacy memo semantics.
79
+ const owner = getOwner();
80
+ const c = new Computed(() => runWithOwner(owner, () => {
81
+ try {
82
+ return (prev = fn(prev));
83
+ }
84
+ catch (e) {
85
+ // A suspended read (resource/lazy while pending) throws its promise. Legacy
86
+ // memos keep their previous value and let a Suspense boundary handle it,
87
+ // rather than rethrowing the promise as an error.
88
+ if (isThenable(e)) {
89
+ reportSuspend(e);
90
+ return prev;
91
+ }
92
+ throw e;
93
+ }
94
+ }), { equals: options?.equals });
95
+ const read = (() => c.get());
96
+ // A memo is a readable reactive accessor: stamp $SIGNAL (matching the legacy
97
+ // createMemo) so `isSignal(memo)` is true. Without this, the DOM runtime's
98
+ // insert() fails to recognise a control-flow memo (For/Switch/Index/Dynamic)
99
+ // as reactive, caches it as a component, and freezes it -> updates never apply.
100
+ Object.defineProperty(read, $SIGNAL, { value: true, enumerable: true });
101
+ Object.defineProperty(read, $MEMO, { value: true, enumerable: true });
102
+ reportReactiveNode({ kind: 'memo', node: c, handle: read, name: options?.name });
103
+ // A memo has no dispose of its own, it goes when its owner does. Without saying so, a
104
+ // list that re-renders leaves every row it ever had in a watcher's graph.
105
+ if (isObserved())
106
+ l1onCleanup(() => reportReactiveDispose(c));
107
+ return read;
108
+ }
109
+ /**
110
+ * createEffect, a re-running side effect. The fn receives the previous return
111
+ * value and may return a new one (legacy signature) or a cleanup function.
112
+ */
113
+ export function createEffect(fn, value, options) {
114
+ let prev = value;
115
+ return l1effect(() => {
116
+ const r = fn(prev);
117
+ // A function result is treated as the next "prev" (legacy), unless the fn
118
+ // never returns one, in which case onCleanup is the cleanup path. We keep the
119
+ // legacy carry-the-value behaviour; cleanups use onCleanup.
120
+ prev = r;
121
+ }, true, options?.name);
122
+ }
123
+ /**
124
+ * createComputed, an EAGER, owner-managed reactive computation (returns void).
125
+ * Unlike a lazy memo it runs immediately and re-runs eagerly when a dep changes;
126
+ * used for derivations with side effects, such as store internals. It is an eager
127
+ * effect whose dispose is owned by the current scope.
128
+ */
129
+ export function createComputed(fn, value) {
130
+ let prev = value;
131
+ l1effect(() => {
132
+ prev = fn(prev);
133
+ });
134
+ }
135
+ /**
136
+ * createRenderEffect, an effect that runs in the render phase. For the reactive
137
+ * core this is an eager effect (the render-vs-commit timing distinction is a DOM-
138
+ * layer concern); returns a dispose like createEffect.
139
+ */
140
+ export function createRenderEffect(fn, value) {
141
+ let prev = value;
142
+ return l1effect(() => {
143
+ prev = fn(prev);
144
+ });
145
+ }
146
+ /** batch: coalesce writes so dependent effects flush once. */
147
+ export function batch(fn) {
148
+ return l1batch(fn);
149
+ }
150
+ /** untrack: read without subscribing. */
151
+ export function untrack(fn) {
152
+ return l0untrack(fn);
153
+ }
154
+ /**
155
+ * startTransition: run `fn`'s updates as one batch. (Minimal port, the concurrent
156
+ * time-slicing/deferral of the legacy implementation is a later refinement; the
157
+ * batched-commit semantics that callers rely on are preserved.)
158
+ */
159
+ export function startTransition(fn) {
160
+ l1batch(fn);
161
+ return Promise.resolve();
162
+ }
163
+ /** useTransition: `[isPending, startTransition]`. isPending is synchronous here (no deferral). */
164
+ export function useTransition() {
165
+ return [() => false, startTransition];
166
+ }
167
+ /** Force any pending effects to run now. */
168
+ export { flushSync };
169
+ /**
170
+ * flush: drain pending effects, returning a Promise (legacy `flush()` is async; many
171
+ * callers do `flush().then(...)`). Effects already flush synchronously on each write via
172
+ * afterWrite, so this just settles any remainder and resolves.
173
+ */
174
+ export function flush() {
175
+ flushSync();
176
+ return Promise.resolve();
177
+ }
178
+ /**
179
+ * on(deps, fn, { defer }), an explicit-dependency helper. Reads `deps` (tracked),
180
+ * then runs `fn(value, prevValue, prevResult)` untracked. `defer` skips the first run.
181
+ */
182
+ export function on(deps, fn, options) {
183
+ const isArray = Array.isArray(deps);
184
+ let prevValue;
185
+ let defer = options?.defer ?? false;
186
+ return (prevResult) => {
187
+ const value = (isArray ? deps.map((d) => d()) : deps());
188
+ if (defer) {
189
+ defer = false;
190
+ prevValue = value;
191
+ return undefined;
192
+ }
193
+ const result = l0untrack(() => fn(value, prevValue, prevResult));
194
+ prevValue = value;
195
+ return result;
196
+ };
197
+ }