signalium 2.3.2 → 3.0.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.
Files changed (130) hide show
  1. package/CHANGELOG.md +230 -0
  2. package/dist/cjs/development/component-shared-Cug2Y5YZ.js +33 -0
  3. package/dist/cjs/development/component-shared-Cug2Y5YZ.js.map +1 -0
  4. package/dist/cjs/development/{debug-ouT0N0E4.js → debug-C46WDxhL.js} +47 -195
  5. package/dist/cjs/development/debug-C46WDxhL.js.map +1 -0
  6. package/dist/cjs/development/debug.js +1 -1
  7. package/dist/cjs/development/index.js +3 -2
  8. package/dist/cjs/development/index.js.map +1 -1
  9. package/dist/cjs/development/react/index.js +256 -87
  10. package/dist/cjs/development/react/index.js.map +1 -1
  11. package/dist/cjs/development/react/index.server.js +14 -0
  12. package/dist/cjs/development/react/index.server.js.map +1 -0
  13. package/dist/cjs/development/react/server.js +37 -0
  14. package/dist/cjs/development/react/server.js.map +1 -0
  15. package/dist/cjs/development/{snapshot-BPJ-qw6l.js → snapshot-48aGePMZ.js} +2 -2
  16. package/dist/cjs/development/{snapshot-BPJ-qw6l.js.map → snapshot-48aGePMZ.js.map} +1 -1
  17. package/dist/cjs/development/transform/index.js +196 -13
  18. package/dist/cjs/development/transform/index.js.map +1 -1
  19. package/dist/cjs/development/utils.js +6 -6
  20. package/dist/cjs/development/utils.js.map +1 -1
  21. package/dist/cjs/production/component-shared-D0J85PUi.js +33 -0
  22. package/dist/cjs/production/component-shared-D0J85PUi.js.map +1 -0
  23. package/dist/cjs/production/{contexts-DtQMtXO7.js → contexts-CM3QLfV8.js} +47 -198
  24. package/dist/cjs/production/contexts-CM3QLfV8.js.map +1 -0
  25. package/dist/cjs/production/debug.js +1 -1
  26. package/dist/cjs/production/index.js +3 -2
  27. package/dist/cjs/production/index.js.map +1 -1
  28. package/dist/cjs/production/react/index.js +242 -89
  29. package/dist/cjs/production/react/index.js.map +1 -1
  30. package/dist/cjs/production/react/index.server.js +14 -0
  31. package/dist/cjs/production/react/index.server.js.map +1 -0
  32. package/dist/cjs/production/react/server.js +37 -0
  33. package/dist/cjs/production/react/server.js.map +1 -0
  34. package/dist/cjs/production/{snapshot-Dw62eSpw.js → snapshot-BCESZVAP.js} +2 -2
  35. package/dist/cjs/production/{snapshot-Dw62eSpw.js.map → snapshot-BCESZVAP.js.map} +1 -1
  36. package/dist/cjs/production/transform/index.js +196 -13
  37. package/dist/cjs/production/transform/index.js.map +1 -1
  38. package/dist/cjs/production/utils.js +6 -6
  39. package/dist/cjs/production/utils.js.map +1 -1
  40. package/dist/esm/development/component-shared-CLSmdnGU.js +34 -0
  41. package/dist/esm/development/component-shared-CLSmdnGU.js.map +1 -0
  42. package/dist/esm/development/{debug-DaK9qsbI.js → debug-BTLbgTPK.js} +79 -227
  43. package/dist/esm/development/debug-BTLbgTPK.js.map +1 -0
  44. package/dist/esm/development/debug.js +9 -9
  45. package/dist/esm/development/index.js +14 -13
  46. package/dist/esm/development/react/index.js +232 -79
  47. package/dist/esm/development/react/index.js.map +1 -1
  48. package/dist/esm/development/react/index.server.js +14 -0
  49. package/dist/esm/development/react/index.server.js.map +1 -0
  50. package/dist/esm/development/react/server.js +20 -0
  51. package/dist/esm/development/react/server.js.map +1 -0
  52. package/dist/esm/development/{snapshot-D8ZJEbwO.js → snapshot-Ca_rQa4c.js} +2 -2
  53. package/dist/esm/development/{snapshot-D8ZJEbwO.js.map → snapshot-Ca_rQa4c.js.map} +1 -1
  54. package/dist/esm/development/transform/index.js +197 -14
  55. package/dist/esm/development/transform/index.js.map +1 -1
  56. package/dist/esm/development/utils.js +11 -11
  57. package/dist/esm/development/utils.js.map +1 -1
  58. package/dist/esm/index.d.ts +2 -2
  59. package/dist/esm/index.d.ts.map +1 -1
  60. package/dist/esm/internals/async.d.ts +3 -3
  61. package/dist/esm/internals/async.d.ts.map +1 -1
  62. package/dist/esm/internals/contexts.d.ts +10 -6
  63. package/dist/esm/internals/contexts.d.ts.map +1 -1
  64. package/dist/esm/internals/core-api.d.ts +2 -2
  65. package/dist/esm/internals/core-api.d.ts.map +1 -1
  66. package/dist/esm/internals/get.d.ts.map +1 -1
  67. package/dist/esm/internals/reactive.d.ts +3 -9
  68. package/dist/esm/internals/reactive.d.ts.map +1 -1
  69. package/dist/esm/internals/scheduling.d.ts +0 -2
  70. package/dist/esm/internals/scheduling.d.ts.map +1 -1
  71. package/dist/esm/internals/watch.d.ts +3 -4
  72. package/dist/esm/internals/watch.d.ts.map +1 -1
  73. package/dist/esm/production/component-shared-Dva0S5e3.js +34 -0
  74. package/dist/esm/production/component-shared-Dva0S5e3.js.map +1 -0
  75. package/dist/esm/production/{contexts-US_h2nBi.js → contexts-FxCndlvf.js} +71 -222
  76. package/dist/esm/production/contexts-FxCndlvf.js.map +1 -0
  77. package/dist/esm/production/debug.js +1 -1
  78. package/dist/esm/production/index.js +14 -13
  79. package/dist/esm/production/react/index.js +219 -82
  80. package/dist/esm/production/react/index.js.map +1 -1
  81. package/dist/esm/production/react/index.server.js +14 -0
  82. package/dist/esm/production/react/index.server.js.map +1 -0
  83. package/dist/esm/production/react/server.js +20 -0
  84. package/dist/esm/production/react/server.js.map +1 -0
  85. package/dist/esm/production/{snapshot-CfJGJCvW.js → snapshot-TYiTYPGB.js} +2 -2
  86. package/dist/esm/production/{snapshot-CfJGJCvW.js.map → snapshot-TYiTYPGB.js.map} +1 -1
  87. package/dist/esm/production/transform/index.js +197 -14
  88. package/dist/esm/production/transform/index.js.map +1 -1
  89. package/dist/esm/production/utils.js +11 -11
  90. package/dist/esm/production/utils.js.map +1 -1
  91. package/dist/esm/react/async-component.d.ts +42 -0
  92. package/dist/esm/react/async-component.d.ts.map +1 -0
  93. package/dist/esm/react/component-server.d.ts +4 -0
  94. package/dist/esm/react/component-server.d.ts.map +1 -0
  95. package/dist/esm/react/component-shared.d.ts +21 -0
  96. package/dist/esm/react/component-shared.d.ts.map +1 -0
  97. package/dist/esm/react/component.d.ts +5 -1
  98. package/dist/esm/react/component.d.ts.map +1 -1
  99. package/dist/esm/react/index.d.ts +3 -4
  100. package/dist/esm/react/index.d.ts.map +1 -1
  101. package/dist/esm/react/index.server.d.ts +8 -0
  102. package/dist/esm/react/index.server.d.ts.map +1 -0
  103. package/dist/esm/react/pause-signals-context.d.ts +18 -0
  104. package/dist/esm/react/pause-signals-context.d.ts.map +1 -0
  105. package/dist/esm/react/server.d.ts +12 -0
  106. package/dist/esm/react/server.d.ts.map +1 -0
  107. package/dist/esm/react/use-reactive.d.ts +36 -7
  108. package/dist/esm/react/use-reactive.d.ts.map +1 -1
  109. package/dist/esm/transform/async.d.ts.map +1 -1
  110. package/dist/esm/transform/callback.d.ts.map +1 -1
  111. package/dist/esm/transform/index.d.ts +1 -0
  112. package/dist/esm/transform/index.d.ts.map +1 -1
  113. package/dist/esm/transform/preset.d.ts +1 -0
  114. package/dist/esm/transform/preset.d.ts.map +1 -1
  115. package/dist/esm/transform/use-reactive.d.ts +9 -0
  116. package/dist/esm/transform/use-reactive.d.ts.map +1 -0
  117. package/dist/esm/types.d.ts +33 -10
  118. package/dist/esm/types.d.ts.map +1 -1
  119. package/dist/esm/utils.d.ts +2 -2
  120. package/dist/esm/utils.d.ts.map +1 -1
  121. package/package.json +35 -4
  122. package/react-server.js +15 -0
  123. package/dist/cjs/development/debug-ouT0N0E4.js.map +0 -1
  124. package/dist/cjs/production/contexts-DtQMtXO7.js.map +0 -1
  125. package/dist/esm/development/debug-DaK9qsbI.js.map +0 -1
  126. package/dist/esm/internals/weakref.d.ts +0 -3
  127. package/dist/esm/internals/weakref.d.ts.map +0 -1
  128. package/dist/esm/production/contexts-US_h2nBi.js.map +0 -1
  129. package/dist/esm/react/suspend-signals-context.d.ts +0 -3
  130. package/dist/esm/react/suspend-signals-context.d.ts.map +0 -1
@@ -1,12 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
5
- const contexts = require("../contexts-DtQMtXO7.js");
6
- const snapshot = require("../snapshot-Dw62eSpw.js");
7
- const ScopeContext = react.createContext(void 0);
4
+ const React = require("react");
5
+ const contexts = require("../contexts-CM3QLfV8.js");
6
+ const componentShared = require("../component-shared-D0J85PUi.js");
7
+ const snapshot = require("../snapshot-BCESZVAP.js");
8
+ function _interopNamespaceDefault(e) {
9
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
10
+ if (e) {
11
+ for (const k in e) {
12
+ if (k !== "default") {
13
+ const d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: () => e[k]
17
+ });
18
+ }
19
+ }
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
25
+ const ScopeContext = React.createContext(void 0);
8
26
  function useScope() {
9
- return react.useContext(ScopeContext);
27
+ return React.useContext(ScopeContext);
10
28
  }
11
29
  function useContext(context) {
12
30
  const scope = contexts.getCurrentConsumer()?.scope ?? useScope();
@@ -16,122 +34,247 @@ function useContext(context) {
16
34
  return scope.getContext(context) ?? context.defaultValue;
17
35
  }
18
36
  function ContextProvider({ children, contexts: contexts$1 = [], inherit = true }) {
19
- const parentScope = react.useContext(ScopeContext) ?? contexts.getGlobalScope();
20
- const scope = react.useMemo(
37
+ const parentScope = React.useContext(ScopeContext) ?? contexts.getGlobalScope();
38
+ const scope = React.useMemo(
21
39
  () => new contexts.SignalScope(contexts$1, inherit ? parentScope : void 0),
22
40
  // eslint-disable-next-line react-hooks/exhaustive-deps
23
41
  [parentScope, inherit, contexts.hashValue(contexts$1)]
24
42
  );
25
43
  return jsxRuntime.jsx(ScopeContext.Provider, { value: scope, children });
26
44
  }
27
- const SuspendSignalsContext = react.createContext(false);
28
- const SuspendSignalsProvider = SuspendSignalsContext.Provider;
29
- function useSignalsSuspended() {
30
- return react.useContext(SuspendSignalsContext);
45
+ class PauseSignalsManager {
46
+ signals = /* @__PURE__ */ new Set();
47
+ _paused;
48
+ constructor(initialPaused) {
49
+ this._paused = initialPaused;
50
+ }
51
+ get paused() {
52
+ return this._paused;
53
+ }
54
+ register(signal) {
55
+ this.signals.add(signal);
56
+ }
57
+ unregister(signal) {
58
+ this.signals.delete(signal);
59
+ }
60
+ setPaused(value) {
61
+ if (value === this._paused)
62
+ return;
63
+ this._paused = value;
64
+ for (const signal of this.signals) {
65
+ if (value) {
66
+ contexts.unwatchSignal(signal);
67
+ } else {
68
+ contexts.watchSignal(signal);
69
+ contexts.schedulePull(signal);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ const PauseSignalsManagerContext = React.createContext(null);
75
+ function PauseSignalsProvider({ value, children }) {
76
+ const managerRef = React.useRef(null);
77
+ if (managerRef.current === null) {
78
+ managerRef.current = new PauseSignalsManager(value);
79
+ }
80
+ const manager = managerRef.current;
81
+ React.useEffect(() => {
82
+ manager.setPaused(value);
83
+ }, [manager, value]);
84
+ return React.createElement(PauseSignalsManagerContext.Provider, { value: manager }, children);
85
+ }
86
+ function usePauseSignalsManager() {
87
+ return React.useContext(PauseSignalsManagerContext);
88
+ }
89
+ const thenableOutcome = /* @__PURE__ */ new WeakMap();
90
+ function adoptYieldedThenable(thenable) {
91
+ const expanded = thenable;
92
+ if (expanded.status === "fulfilled") {
93
+ return expanded.value;
94
+ }
95
+ if (expanded.status === "rejected") {
96
+ throw expanded.reason;
97
+ }
98
+ if (expanded.status === "pending") {
99
+ throw thenable;
100
+ }
101
+ const hit = thenableOutcome.get(thenable);
102
+ if (hit !== void 0) {
103
+ if (hit.kind === "rejected") {
104
+ throw hit.reason;
105
+ }
106
+ return hit.value;
107
+ }
108
+ thenable.then((v) => {
109
+ thenableOutcome.set(thenable, { kind: "fulfilled", value: v });
110
+ }, (e) => {
111
+ thenableOutcome.set(thenable, { kind: "rejected", reason: e });
112
+ });
113
+ throw thenable;
114
+ }
115
+ const SIGNALIUM_ASYNC_COMPONENT = /* @__PURE__ */ Symbol.for("signalium.asyncComponent");
116
+ function throwIfSignaliumAsyncComponentPassedToUse(resource) {
117
+ if (typeof resource === "function" && resource[SIGNALIUM_ASYNC_COMPONENT] === true) {
118
+ throw new Error("use() with a Signalium async `component()` is not supported. Render the component under <Suspense> and use await inside the component (compiled from async/await by the Signalium preset) instead.");
119
+ }
120
+ }
121
+ function runSyncReplayAsyncComponent(fn, props, ownerSignal) {
122
+ const prevConsumer = contexts.getCurrentConsumer();
123
+ try {
124
+ contexts.setCurrentConsumer(ownerSignal);
125
+ const iter = fn(props);
126
+ let sent = void 0;
127
+ for (; ; ) {
128
+ const step = iter.next(sent);
129
+ if (step.done) {
130
+ return step.value;
131
+ }
132
+ const yielded = step.value;
133
+ if (yielded !== null && typeof yielded === "object" && contexts.isReactivePromise(yielded)) {
134
+ const rp = yielded;
135
+ if (rp.isRejected) {
136
+ throw rp.error;
137
+ }
138
+ if (!rp.isReady) {
139
+ const native = rp._promise;
140
+ throw native !== void 0 ? native : rp;
141
+ }
142
+ sent = rp.value;
143
+ continue;
144
+ }
145
+ if (yielded !== null && typeof yielded === "object" && (contexts.isPromise(yielded) || contexts.isThennable(yielded))) {
146
+ sent = adoptYieldedThenable(yielded);
147
+ continue;
148
+ }
149
+ sent = yielded;
150
+ }
151
+ } finally {
152
+ contexts.setCurrentConsumer(prevConsumer);
153
+ }
154
+ }
155
+ function createAsyncComponentWrapper(fn) {
156
+ const Inner = (props) => {
157
+ const scope = useScope();
158
+ const manager = usePauseSignalsManager();
159
+ const fnSignalRef = React.useRef(void 0);
160
+ const propsRef = React.useRef(props);
161
+ propsRef.current = props;
162
+ let sig = fnSignalRef.current;
163
+ if (sig === void 0) {
164
+ let owned;
165
+ owned = contexts.createReactiveSignal({
166
+ compute: () => runSyncReplayAsyncComponent(fn, propsRef.current, owned),
167
+ equals: () => false,
168
+ isRelay: false,
169
+ tracer: void 0
170
+ }, [], void 0, scope);
171
+ owned._isLazy = true;
172
+ fnSignalRef.current = sig = owned;
173
+ }
174
+ const watch = !manager?.paused;
175
+ manager?.register(sig);
176
+ React.useEffect(() => {
177
+ return () => manager?.unregister(sig);
178
+ }, [manager, sig]);
179
+ React.useSyncExternalStore(sig.addListenerLazy(watch), () => sig.updatedCount, () => sig.updatedCount);
180
+ contexts.runSignal(sig);
181
+ return sig.value;
182
+ };
183
+ const Outer = (props) => {
184
+ const hash = contexts.hashValue(props);
185
+ return React.useMemo(() => React.createElement(Inner, props), [hash]);
186
+ };
187
+ Object.defineProperty(Outer, SIGNALIUM_ASYNC_COMPONENT, { value: true, enumerable: false });
188
+ return Outer;
189
+ }
190
+ let _ssrScopeInitialized = false;
191
+ function ensureSsrScope() {
192
+ if (_ssrScopeInitialized || typeof window !== "undefined")
193
+ return;
194
+ _ssrScopeInitialized = true;
195
+ const cache = React__namespace.cache;
196
+ if (typeof cache === "function") {
197
+ const getScope = cache(() => new contexts.SignalScope([]));
198
+ contexts.setRequestScopeGetter(() => getScope());
199
+ }
31
200
  }
32
201
  function component(fn) {
202
+ ensureSsrScope();
203
+ if (componentShared.isAsyncFunctionWithoutTransform(fn)) {
204
+ throw new Error("signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).");
205
+ }
206
+ if (componentShared.isGeneratorFunction(fn)) {
207
+ if (typeof window === "undefined") {
208
+ return componentShared.createServerAsyncComponentWrapper(fn);
209
+ }
210
+ return createAsyncComponentWrapper(fn);
211
+ }
212
+ const syncFn = fn;
33
213
  const Component = (props) => {
34
214
  const scope = useScope();
35
- const suspended = useSignalsSuspended();
36
- const fnSignalRef = react.useRef(void 0);
37
- const propsRef = react.useRef(props);
215
+ const manager = usePauseSignalsManager();
216
+ const fnSignalRef = React.useRef(void 0);
217
+ const propsRef = React.useRef(props);
38
218
  propsRef.current = props;
39
219
  let signal = fnSignalRef.current;
40
220
  if (signal === void 0) {
41
- fnSignalRef.current = signal = contexts.createReactiveSignal({
42
- compute: () => fn(propsRef.current),
221
+ const created = contexts.createReactiveSignal({
222
+ compute: () => syncFn(propsRef.current),
43
223
  equals: () => false,
44
224
  isRelay: false,
45
225
  tracer: void 0
46
226
  }, [], void 0, scope);
47
- signal._isLazy = true;
227
+ created._isLazy = true;
228
+ fnSignalRef.current = signal = created;
48
229
  }
49
- signal.setSuspended(suspended);
50
- react.useSyncExternalStore(signal.addListenerLazy(), () => signal.updatedCount, () => signal.updatedCount);
230
+ const watch = !manager?.paused;
231
+ manager?.register(signal);
232
+ React.useEffect(() => {
233
+ return () => manager?.unregister(signal);
234
+ }, [manager, signal]);
235
+ React.useSyncExternalStore(signal.addListenerLazy(watch), () => signal.updatedCount, () => signal.updatedCount);
51
236
  contexts.runSignal(signal);
52
237
  return signal.value;
53
238
  };
54
239
  return (props) => {
55
240
  const hash = contexts.hashValue(props);
56
- return react.useMemo(() => jsxRuntime.jsx(Component, { ...props }), [hash]);
241
+ return React.useMemo(() => jsxRuntime.jsx(Component, { ...props }), [hash]);
57
242
  };
58
243
  }
59
244
  function useSignal(value, opts) {
60
- const ref = react.useRef(void 0);
245
+ const ref = React.useRef(void 0);
61
246
  if (!ref.current) {
62
247
  ref.current = contexts.signal(value, opts);
63
248
  }
64
249
  return ref.current;
65
250
  }
66
- const useStateSignal = (signal) => {
67
- const suspended = useSignalsSuspended();
68
- return react.useSyncExternalStore(
69
- // eslint-disable-next-line react-hooks/exhaustive-deps
70
- react.useCallback(suspended ? () => () => {
71
- } : (onStoreChange) => signal.addListener(onStoreChange), [
72
- signal,
73
- suspended
74
- ]),
75
- () => signal.value,
76
- () => signal.value
77
- );
78
- };
79
- const useReactiveFnSignal = (signal) => {
80
- const suspended = useSignalsSuspended();
81
- signal.setSuspended(suspended);
82
- return react.useSyncExternalStore(signal.addListenerLazy(), () => signal.value, () => signal.value);
83
- };
84
- const useReactivePromise = (promise) => {
85
- if (contexts.isRelay(promise)) {
86
- useReactiveFnSignal(promise["_signal"]);
87
- }
88
- useStateSignal(promise["_version"]);
89
- return promise;
90
- };
91
- const useReactiveFn = (fn, ...args) => {
251
+ function useSignalWithSuspension(signal) {
252
+ const manager = usePauseSignalsManager();
253
+ const watch = !manager?.paused;
254
+ manager?.register(signal);
255
+ React.useEffect(() => {
256
+ return () => manager?.unregister(signal);
257
+ }, [manager, signal]);
258
+ return React.useSyncExternalStore(signal.addListenerLazy(watch), () => signal.value, () => signal.value);
259
+ }
260
+ function useReactiveShallow(fn) {
92
261
  const [, def] = snapshot.getReactiveFnAndDefinition(fn);
93
262
  const scope = useScope() ?? contexts.getGlobalScope();
94
- const signal = scope.get(def, args);
95
- const value = useReactiveFnSignal(signal);
96
- if (typeof value === "object" && value !== null && contexts.isReactivePromise(value)) {
97
- return useReactivePromise(value);
98
- }
99
- return value;
100
- };
101
- const isNonNullishAsyncSignal = (value) => {
102
- return typeof value === "object" && value !== null && contexts.isReactivePromise(value);
103
- };
104
- function useReactive(signal, ...args) {
105
- if (contexts.getCurrentConsumer()) {
106
- if (typeof signal === "function") {
107
- return signal(...args);
108
- } else if (isNonNullishAsyncSignal(signal)) {
109
- return signal;
110
- } else {
111
- return signal.value;
112
- }
113
- }
114
- if (typeof signal === "function") {
115
- return useReactiveFn(signal, ...args);
116
- } else if (typeof signal === "object" && signal !== null && contexts.isReactivePromise(signal)) {
117
- return useReactivePromise(signal);
118
- } else {
119
- return useStateSignal(signal);
120
- }
263
+ const signal = scope.get(def, []);
264
+ return useSignalWithSuspension(signal);
121
265
  }
122
- function useReactiveDeep(fn, ...args) {
123
- if (contexts.getCurrentConsumer()) {
124
- throw new Error("useReactiveDeep cannot be used inside of a reactive context. You can use the signal/function directly instead.");
125
- }
126
- const suspended = useSignalsSuspended();
266
+ function useReactive(fn) {
267
+ const manager = usePauseSignalsManager();
268
+ const watch = !manager?.paused;
127
269
  const scope = useScope() ?? contexts.getGlobalScope();
128
- const signalRef = react.useRef();
129
- const cloneSignalRef = react.useRef();
130
- const valueRef = react.useRef();
270
+ const innerSignalRef = React.useRef(void 0);
271
+ const cloneSignalRef = React.useRef(void 0);
272
+ const valueRef = React.useRef(void 0);
131
273
  const [, def] = snapshot.getReactiveFnAndDefinition(fn);
132
- const signal = scope.get(def, args);
133
- if (signalRef.current !== signal) {
134
- signalRef.current = signal;
274
+ const signal = scope.get(def, []);
275
+ if (innerSignalRef.current !== signal) {
276
+ innerSignalRef.current = signal;
277
+ valueRef.current = void 0;
135
278
  cloneSignalRef.current = snapshot.reactiveSignal(() => {
136
279
  const next = snapshot.snapshot(signal.value, valueRef.current);
137
280
  valueRef.current = next;
@@ -139,15 +282,25 @@ function useReactiveDeep(fn, ...args) {
139
282
  });
140
283
  }
141
284
  const cloneSignal = cloneSignalRef.current;
142
- cloneSignal.setSuspended(suspended);
143
- return react.useSyncExternalStore(cloneSignal.addListenerLazy(), () => cloneSignal.value, () => cloneSignal.value);
285
+ manager?.register(cloneSignal);
286
+ React.useEffect(() => {
287
+ return () => manager?.unregister(cloneSignal);
288
+ }, [manager, cloneSignal]);
289
+ return React.useSyncExternalStore(cloneSignal.addListenerLazy(watch), () => cloneSignal.value, () => cloneSignal.value);
290
+ }
291
+ function useReactiveDeep(fn) {
292
+ return useReactive(fn);
144
293
  }
294
+ exports.isAsyncFunctionWithoutTransform = componentShared.isAsyncFunctionWithoutTransform;
145
295
  exports.ContextProvider = ContextProvider;
146
- exports.SuspendSignalsProvider = SuspendSignalsProvider;
296
+ exports.PauseSignalsProvider = PauseSignalsProvider;
297
+ exports.SIGNALIUM_ASYNC_COMPONENT = SIGNALIUM_ASYNC_COMPONENT;
147
298
  exports.component = component;
299
+ exports.runSyncReplayAsyncComponent = runSyncReplayAsyncComponent;
300
+ exports.throwIfSignaliumAsyncComponentPassedToUse = throwIfSignaliumAsyncComponentPassedToUse;
148
301
  exports.useContext = useContext;
149
302
  exports.useReactive = useReactive;
150
303
  exports.useReactiveDeep = useReactiveDeep;
304
+ exports.useReactiveShallow = useReactiveShallow;
151
305
  exports.useSignal = useSignal;
152
- exports.useSignalsSuspended = useSignalsSuspended;
153
306
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../.tsc-out/react/context.js","../../../../.tsc-out/react/provider.js","../../../../.tsc-out/react/suspend-signals-context.js","../../../../.tsc-out/react/component.js","../../../../.tsc-out/react/use-signal.js","../../../../.tsc-out/react/use-reactive.js"],"sourcesContent":["import { createContext, useContext as useReactContext } from 'react';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nexport const ScopeContext = createContext(undefined);\nexport function useScope() {\n return useReactContext(ScopeContext);\n}\nexport function useContext(context) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scope = getCurrentConsumer()?.scope ?? useScope();\n if (!scope) {\n throw new Error('useContext must be used within a signal hook, a withContext, or a component');\n }\n return scope.getContext(context) ?? context.defaultValue;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useContext, useMemo } from 'react';\nimport { ScopeContext } from './context.js';\nimport { getGlobalScope, SignalScope } from '../internals/contexts.js';\nimport { hashValue } from '../internals/utils/hash.js';\nexport function ContextProvider({ children, contexts = [], inherit = true, }) {\n const parentScope = useContext(ScopeContext) ?? getGlobalScope();\n const scope = useMemo(() => new SignalScope(contexts, inherit ? parentScope : undefined), \n // eslint-disable-next-line react-hooks/exhaustive-deps\n [parentScope, inherit, hashValue(contexts)]);\n return _jsx(ScopeContext.Provider, { value: scope, children: children });\n}\n","import { createContext, useContext } from 'react';\nconst SuspendSignalsContext = createContext(false);\nexport const SuspendSignalsProvider = SuspendSignalsContext.Provider;\nexport function useSignalsSuspended() {\n return useContext(SuspendSignalsContext);\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useScope } from './context.js';\nimport { useSignalsSuspended } from './suspend-signals-context.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { hashValue } from '../internals/utils/hash.js';\nexport default function component(fn) {\n const Component = (props) => {\n const scope = useScope();\n const suspended = useSignalsSuspended();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let signal = fnSignalRef.current;\n if (signal === undefined) {\n fnSignalRef.current = signal = createReactiveSignal({\n compute: () => fn(propsRef.current),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n signal._isLazy = true;\n }\n signal.setSuspended(suspended);\n // We always want to re-render when the signal is updated, regardless of\n // whether or not the result changed. This is because the signal is lazy,\n // so it will not be updated until the next render.\n useSyncExternalStore(signal.addListenerLazy(), () => signal.updatedCount, () => signal.updatedCount);\n runSignal(signal);\n return signal.value;\n };\n return (props) => {\n const hash = hashValue(props);\n // Renders Comp only when hash changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => _jsx(Component, { ...props }), [hash]);\n };\n}\n","import { useRef } from 'react';\nimport { signal } from '../index.js';\nexport function useSignal(value, opts) {\n const ref = useRef(undefined);\n if (!ref.current) {\n ref.current = signal(value, opts);\n }\n return ref.current;\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { useCallback, useRef, useSyncExternalStore } from 'react';\nimport { getReactiveFnAndDefinition, reactiveSignal } from '../internals/core-api.js';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nimport { isReactivePromise, isRelay } from '../internals/async.js';\nimport { snapshot } from '../internals/utils/snapshot.js';\nimport { useScope } from './context.js';\nimport { useSignalsSuspended } from './suspend-signals-context.js';\nimport { getGlobalScope } from '../internals/contexts.js';\nconst useStateSignal = (signal) => {\n const suspended = useSignalsSuspended();\n return useSyncExternalStore(\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useCallback(suspended ? () => () => { } : onStoreChange => signal.addListener(onStoreChange), [\n signal,\n suspended,\n ]), () => signal.value, () => signal.value);\n};\nconst useReactiveFnSignal = (signal) => {\n const suspended = useSignalsSuspended();\n signal.setSuspended(suspended);\n return useSyncExternalStore(signal.addListenerLazy(), () => signal.value, () => signal.value);\n};\nconst useReactivePromise = (promise) => {\n if (isRelay(promise)) {\n useReactiveFnSignal(promise['_signal']);\n }\n useStateSignal(promise['_version']);\n return promise;\n};\nconst useReactiveFn = (fn, ...args) => {\n const [, def] = getReactiveFnAndDefinition(fn);\n const scope = useScope() ?? getGlobalScope();\n const signal = scope.get(def, args);\n const value = useReactiveFnSignal(signal);\n // Reactive promises can update their value independently of the signal, since\n // we reuse the same promise object for each result. We need to entangle the\n // version of the promise here so that we can trigger a re-render when the\n // promise value updates.\n //\n // If hooks could be called in dynamic order this would not be necessary, we\n // could entangle the promise when it is used. But, because that is not the\n // case, we need to eagerly entangle.\n if (typeof value === 'object' && value !== null && isReactivePromise(value)) {\n return useReactivePromise(value);\n }\n return value;\n};\nconst isNonNullishAsyncSignal = (value) => {\n return typeof value === 'object' && value !== null && isReactivePromise(value);\n};\nexport function useReactive(signal, ...args) {\n if (getCurrentConsumer()) {\n if (typeof signal === 'function') {\n return signal(...args);\n }\n else if (isNonNullishAsyncSignal(signal)) {\n return signal;\n }\n else {\n return signal.value;\n }\n }\n if (typeof signal === 'function') {\n return useReactiveFn(signal, ...args);\n }\n else if (typeof signal === 'object' && signal !== null && isReactivePromise(signal)) {\n return useReactivePromise(signal);\n }\n else {\n return useStateSignal(signal);\n }\n}\nexport function useReactiveDeep(fn, ...args) {\n if (getCurrentConsumer()) {\n throw new Error('useReactiveDeep cannot be used inside of a reactive context. You can use the signal/function directly instead.');\n }\n const suspended = useSignalsSuspended();\n const scope = useScope() ?? getGlobalScope();\n const signalRef = useRef();\n const cloneSignalRef = useRef();\n const valueRef = useRef();\n const [, def] = getReactiveFnAndDefinition(fn);\n const signal = scope.get(def, args);\n if (signalRef.current !== signal) {\n signalRef.current = signal;\n cloneSignalRef.current = reactiveSignal(() => {\n const next = snapshot(signal.value, valueRef.current);\n valueRef.current = next;\n return next;\n });\n }\n const cloneSignal = cloneSignalRef.current;\n cloneSignal.setSuspended(suspended);\n return useSyncExternalStore(cloneSignal.addListenerLazy(), () => cloneSignal.value, () => cloneSignal.value);\n}\n"],"names":["createContext","useReactContext","getCurrentConsumer","contexts","useContext","getGlobalScope","useMemo","SignalScope","hashValue","_jsx","useRef","createReactiveSignal","useSyncExternalStore","runSignal","signal","useCallback","isRelay","getReactiveFnAndDefinition","isReactivePromise","reactiveSignal","snapshot"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../.tsc-out/react/context.js","../../../../.tsc-out/react/provider.js","../../../../.tsc-out/react/pause-signals-context.js","../../../../.tsc-out/react/async-component.js","../../../../.tsc-out/react/component.js","../../../../.tsc-out/react/use-signal.js","../../../../.tsc-out/react/use-reactive.js"],"sourcesContent":["import { createContext, useContext as useReactContext } from 'react';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nexport const ScopeContext = createContext(undefined);\nexport function useScope() {\n return useReactContext(ScopeContext);\n}\nexport function useContext(context) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scope = getCurrentConsumer()?.scope ?? useScope();\n if (!scope) {\n throw new Error('useContext must be used within a signal hook, a withContext, or a component');\n }\n return scope.getContext(context) ?? context.defaultValue;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useContext, useMemo } from 'react';\nimport { ScopeContext } from './context.js';\nimport { getGlobalScope, SignalScope } from '../internals/contexts.js';\nimport { hashValue } from '../internals/utils/hash.js';\nexport function ContextProvider({ children, contexts = [], inherit = true, }) {\n const parentScope = useContext(ScopeContext) ?? getGlobalScope();\n const scope = useMemo(() => new SignalScope(contexts, inherit ? parentScope : undefined), \n // eslint-disable-next-line react-hooks/exhaustive-deps\n [parentScope, inherit, hashValue(contexts)]);\n return _jsx(ScopeContext.Provider, { value: scope, children: children });\n}\n","import React, { createContext, useContext, useEffect, useRef } from 'react';\nimport { watchSignal, unwatchSignal } from '../internals/watch.js';\nimport { schedulePull } from '../internals/scheduling.js';\nclass PauseSignalsManager {\n signals = new Set();\n _paused;\n constructor(initialPaused) {\n this._paused = initialPaused;\n }\n get paused() {\n return this._paused;\n }\n register(signal) {\n this.signals.add(signal);\n }\n unregister(signal) {\n this.signals.delete(signal);\n }\n setPaused(value) {\n if (value === this._paused)\n return;\n this._paused = value;\n for (const signal of this.signals) {\n if (value) {\n unwatchSignal(signal);\n }\n else {\n watchSignal(signal);\n schedulePull(signal);\n }\n }\n }\n}\nconst PauseSignalsManagerContext = createContext(null);\nexport function PauseSignalsProvider({ value, children }) {\n const managerRef = useRef(null);\n if (managerRef.current === null) {\n managerRef.current = new PauseSignalsManager(value);\n }\n const manager = managerRef.current;\n useEffect(() => {\n manager.setPaused(value);\n }, [manager, value]);\n return React.createElement(PauseSignalsManagerContext.Provider, { value: manager }, children);\n}\nexport function usePauseSignalsManager() {\n return useContext(PauseSignalsManagerContext);\n}\n","import React, { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { getCurrentConsumer, setCurrentConsumer } from '../internals/consumer.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { isReactivePromise } from '../internals/async.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { isPromise, isThennable } from '../internals/utils/type-utils.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\n/**\n * Remembers settled outcomes for yielded thenables so synchronous replay can inject\n * `next(value)` on later attempts without throwing the same fulfilled promise again (which\n * can strand Suspense). Identity must be stable across replays for a given logical await.\n */\nconst thenableOutcome = new WeakMap();\nfunction adoptYieldedThenable(thenable) {\n const expanded = thenable;\n if (expanded.status === 'fulfilled') {\n return expanded.value;\n }\n if (expanded.status === 'rejected') {\n throw expanded.reason;\n }\n if (expanded.status === 'pending') {\n throw thenable;\n }\n const hit = thenableOutcome.get(thenable);\n if (hit !== undefined) {\n if (hit.kind === 'rejected') {\n throw hit.reason;\n }\n return hit.value;\n }\n thenable.then(v => {\n thenableOutcome.set(thenable, { kind: 'fulfilled', value: v });\n }, e => {\n thenableOutcome.set(thenable, { kind: 'rejected', reason: e });\n });\n throw thenable;\n}\n/** Marked on the outer wrapper returned by `component()` for async (generator) definitions. */\nexport const SIGNALIUM_ASYNC_COMPONENT = Symbol.for('signalium.asyncComponent');\n/**\n * Call from wrappers around `use()` if you might receive a Signalium async component by mistake.\n * React's `use()` does not support Signalium async `component()` wrappers — render them under\n * `<Suspense>` and use `await` inside the component (after the async transform) instead.\n */\nexport function throwIfSignaliumAsyncComponentPassedToUse(resource) {\n if (typeof resource === 'function' &&\n resource[SIGNALIUM_ASYNC_COMPONENT] === true) {\n throw new Error('use() with a Signalium async `component()` is not supported. Render the component under <Suspense> and use await inside the component (compiled from async/await by the Signalium preset) instead.');\n }\n}\nexport { isGeneratorFunction, isAsyncFunctionWithoutTransform } from './component-shared.js';\n/**\n * Synchronous replay driver for async `component()` (authoring: `async`/`await`; Babel rewrites to a generator).\n *\n * Each React render starts a **new** iterator and walks it in a tight loop. Each `yield` (from\n * the compiled generator, originally `await`) is treated like `use(promise)` / Suspense: pending\n * thenables **throw** (interrupting the render); settled `ReactivePromise` values are injected via\n * `next(value)` and the loop continues in the same turn.\n *\n * **Hooks after a suspending `await`:** Same family as React `use()` — the throw aborts before\n * later code runs; the next attempt replays from the top. Do not use conditional hooks without\n * Suspense on paths that skip them.\n *\n * **Plain `Promise` / other thenables:** First time pending, **throw** for Suspense and register\n * the outcome in a `WeakMap` keyed by thenable identity. After settlement, the **same** object\n * replays inject the value (or throw the rejection) synchronously. Keep **stable thenable\n * identity** across replays (e.g. store in a ref). Thenables may expose React `use()`-style\n * `status` / `value` / `reason` for synchronous reads when present.\n *\n * **Generator `let` / `const`:** Reset every replay; durable state should use React hooks, refs, or\n * Signalium signals.\n *\n * `ownerSignal` is set as `CURRENT_CONSUMER` so reads inside the generator participate in the\n * reactive graph like `compute` in `runSignal`.\n */\nexport function runSyncReplayAsyncComponent(fn, props, ownerSignal) {\n const prevConsumer = getCurrentConsumer();\n try {\n setCurrentConsumer(ownerSignal);\n const iter = fn(props);\n let sent = undefined;\n for (;;) {\n const step = iter.next(sent);\n if (step.done) {\n return step.value;\n }\n const yielded = step.value;\n if (yielded !== null && typeof yielded === 'object' && isReactivePromise(yielded)) {\n const rp = yielded;\n if (rp.isRejected) {\n throw rp.error;\n }\n if (!rp.isReady) {\n const native = rp._promise;\n throw native !== undefined ? native : rp;\n }\n sent = rp.value;\n continue;\n }\n if (yielded !== null && typeof yielded === 'object' && (isPromise(yielded) || isThennable(yielded))) {\n sent = adoptYieldedThenable(yielded);\n continue;\n }\n sent = yielded;\n }\n }\n finally {\n setCurrentConsumer(prevConsumer);\n }\n}\n/**\n * Async Signalium `component()`: one lazy reactive signal per **instance** (same as sync\n * `component()`), outer `useMemo` keyed by `hashValue(props)`. No definition-scoped props map.\n */\nexport function createAsyncComponentWrapper(fn) {\n const Inner = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let sig = fnSignalRef.current;\n if (sig === undefined) {\n let owned;\n owned = createReactiveSignal({\n compute: () => runSyncReplayAsyncComponent(fn, propsRef.current, owned),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n owned._isLazy = true;\n fnSignalRef.current = sig = owned;\n }\n const watch = !manager?.paused;\n manager?.register(sig);\n useEffect(() => {\n return () => manager?.unregister(sig);\n }, [manager, sig]);\n useSyncExternalStore(sig.addListenerLazy(watch), () => sig.updatedCount, () => sig.updatedCount);\n runSignal(sig);\n return sig.value;\n };\n const Outer = (props) => {\n const hash = hashValue(props);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => React.createElement(Inner, props), [hash]);\n };\n Object.defineProperty(Outer, SIGNALIUM_ASYNC_COMPONENT, { value: true, enumerable: false });\n return Outer;\n}\n","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as React from 'react';\nimport { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { setRequestScopeGetter, SignalScope } from '../internals/contexts.js';\nimport { createReactiveSignal } from '../internals/reactive.js';\nimport { runSignal } from '../internals/get.js';\nimport { hashValue } from '../internals/utils/hash.js';\nimport { createAsyncComponentWrapper } from './async-component.js';\nimport { isAsyncFunctionWithoutTransform, isGeneratorFunction, createServerAsyncComponentWrapper, } from './component-shared.js';\nexport { isAsyncFunctionWithoutTransform, runSyncReplayAsyncComponent, SIGNALIUM_ASYNC_COMPONENT, throwIfSignaliumAsyncComponentPassedToUse, } from './async-component.js';\n/**\n * Auto-install per-request scoping for SSR of client components.\n *\n * `setupRscRequestScope()` only affects the RSC bundle; Next.js (and similar frameworks) render\n * client components in a separate SSR module graph. This ensures the SSR bundle also gets a\n * fresh {@link SignalScope} per render via `React.cache` (React 19+).\n */\nlet _ssrScopeInitialized = false;\nfunction ensureSsrScope() {\n if (_ssrScopeInitialized || typeof window !== 'undefined')\n return;\n _ssrScopeInitialized = true;\n const cache = React.cache;\n if (typeof cache === 'function') {\n const getScope = cache(() => new SignalScope([]));\n setRequestScopeGetter(() => getScope());\n }\n}\nexport default function component(fn) {\n ensureSsrScope();\n if (isAsyncFunctionWithoutTransform(fn)) {\n throw new Error('signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).');\n }\n if (isGeneratorFunction(fn)) {\n if (typeof window === 'undefined') {\n return createServerAsyncComponentWrapper(fn);\n }\n return createAsyncComponentWrapper(fn);\n }\n // Async `component(async () => { await ... })` is rewritten to a generator by the Babel preset.\n // Remaining callers are synchronous render functions only (see Promise overload for TS authoring).\n const syncFn = fn;\n const Component = (props) => {\n const scope = useScope();\n const manager = usePauseSignalsManager();\n const fnSignalRef = useRef(undefined);\n const propsRef = useRef(props);\n propsRef.current = props;\n let signal = fnSignalRef.current;\n if (signal === undefined) {\n const created = createReactiveSignal({\n compute: () => syncFn(propsRef.current),\n equals: () => false,\n isRelay: false,\n tracer: undefined,\n }, [], undefined, scope);\n created._isLazy = true;\n fnSignalRef.current = signal = created;\n }\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n useSyncExternalStore(signal.addListenerLazy(watch), () => signal.updatedCount, () => signal.updatedCount);\n runSignal(signal);\n return signal.value;\n };\n return (props) => {\n const hash = hashValue(props);\n // Renders Comp only when hash changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => _jsx(Component, { ...props }), [hash]);\n };\n}\n","import { useRef } from 'react';\nimport { signal } from '../index.js';\nexport function useSignal(value, opts) {\n const ref = useRef(undefined);\n if (!ref.current) {\n ref.current = signal(value, opts);\n }\n return ref.current;\n}\n","import { useEffect, useRef, useSyncExternalStore } from 'react';\nimport { getReactiveFnAndDefinition, reactiveSignal } from '../internals/core-api.js';\nimport { getCurrentConsumer } from '../internals/consumer.js';\nimport { snapshot } from '../internals/utils/snapshot.js';\nimport { useScope } from './context.js';\nimport { usePauseSignalsManager } from './pause-signals-context.js';\nimport { getGlobalScope } from '../internals/contexts.js';\nfunction useSignalWithSuspension(signal) {\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n manager?.register(signal);\n useEffect(() => {\n return () => manager?.unregister(signal);\n }, [manager, signal]);\n return useSyncExternalStore(signal.addListenerLazy(watch), () => signal.value, () => signal.value);\n}\n/**\n * Subscribe to a reactive thunk without structural cloning. The thunk's\n * `ReactiveDefinition` is memoized by fn identity in a `WeakMap`, so a\n * memoized thunk (via `useCallback` or the Signalium Babel preset) reuses the\n * same scope-cached signal across renders.\n *\n * This is a minimal wrapper: the returned value is whatever the thunk\n * returned, by reference. In particular, when the thunk returns a\n * `ReactivePromise`, re-renders only fire when the underlying signal itself\n * re-evaluates (e.g. a new promise replaces the old one) — not when the\n * existing promise transitions from pending to resolved. If you need promise\n * state transitions to drive React, read its fields inside the thunk (e.g.\n * `useReactiveShallow(() => { const p = fetchThing(); return { value: p.value,\n * isPending: p.isPending }; })`) or use {@link useReactive} for the\n * structurally-shared snapshot that handles this automatically.\n */\nexport function useReactiveShallow(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactiveShallow` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const [, def] = getReactiveFnAndDefinition(fn);\n const scope = useScope() ?? getGlobalScope();\n const signal = scope.get(def, []);\n return useSignalWithSuspension(signal);\n}\n/**\n * Subscribe to a reactive thunk and return a structurally-shared snapshot of\n * its value. Nested objects/arrays/Maps/Sets are deep-cloned; unchanged\n * subtrees keep the same reference, so React's referential equality works as\n * expected. ReactivePromise values are flattened to plain objects.\n *\n * This is the default hook for reading reactive values inside a React\n * component — it gives you safe equality semantics at the React boundary.\n * Use {@link useReactiveShallow} if you know you don't need structural\n * sharing.\n */\nexport function useReactive(fn) {\n if (IS_DEV && getCurrentConsumer()) {\n throw new Error('signalium: `useReactive` cannot be called inside a reactive function. ' +\n 'Call your reactive function directly instead — it already participates in the signal graph.');\n }\n const manager = usePauseSignalsManager();\n const watch = !manager?.paused;\n const scope = useScope() ?? getGlobalScope();\n const innerSignalRef = useRef(undefined);\n const cloneSignalRef = useRef(undefined);\n const valueRef = useRef(undefined);\n const [, def] = getReactiveFnAndDefinition(fn);\n const signal = scope.get(def, []);\n if (innerSignalRef.current !== signal) {\n innerSignalRef.current = signal;\n valueRef.current = undefined;\n cloneSignalRef.current = reactiveSignal(() => {\n const next = snapshot(signal.value, valueRef.current);\n valueRef.current = next;\n return next;\n });\n }\n const cloneSignal = cloneSignalRef.current;\n manager?.register(cloneSignal);\n useEffect(() => {\n return () => manager?.unregister(cloneSignal);\n }, [manager, cloneSignal]);\n return useSyncExternalStore(cloneSignal.addListenerLazy(watch), () => cloneSignal.value, () => cloneSignal.value);\n}\n/**\n * @deprecated Use {@link useReactive} instead. `useReactive` is now\n * deep-by-default; `useReactiveDeep` is a thin alias kept for back-compat and\n * will be removed in a future major release.\n */\nexport function useReactiveDeep(fn) {\n if (IS_DEV) {\n warnUseReactiveDeepOnce();\n }\n return useReactive(fn);\n}\nlet _useReactiveDeepWarned = false;\nfunction warnUseReactiveDeepOnce() {\n if (_useReactiveDeepWarned)\n return;\n _useReactiveDeepWarned = true;\n console.warn('[signalium] `useReactiveDeep` is deprecated; use `useReactive` instead. ' +\n '`useReactive` is now deep-by-default. Use `useReactiveShallow` to opt out of structural snapshots.');\n}\n"],"names":["createContext","useReactContext","getCurrentConsumer","contexts","useContext","getGlobalScope","useMemo","SignalScope","hashValue","_jsx","unwatchSignal","watchSignal","schedulePull","useRef","useEffect","setCurrentConsumer","isReactivePromise","isPromise","isThennable","createReactiveSignal","useSyncExternalStore","runSignal","React","setRequestScopeGetter","isAsyncFunctionWithoutTransform","isGeneratorFunction","createServerAsyncComponentWrapper","signal","getReactiveFnAndDefinition","reactiveSignal","snapshot"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const componentShared = require("../component-shared-D0J85PUi.js");
4
+ function component(fn) {
5
+ if (componentShared.isAsyncFunctionWithoutTransform(fn)) {
6
+ throw new Error("signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).");
7
+ }
8
+ if (componentShared.isGeneratorFunction(fn)) {
9
+ return componentShared.createServerAsyncComponentWrapper(fn);
10
+ }
11
+ return componentShared.createServerSyncComponentWrapper(fn);
12
+ }
13
+ exports.component = component;
14
+ //# sourceMappingURL=index.server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.server.js","sources":["../../../../.tsc-out/react/component-server.js"],"sourcesContent":["import { isGeneratorFunction, isAsyncFunctionWithoutTransform, createServerAsyncComponentWrapper, createServerSyncComponentWrapper, } from './component-shared.js';\nexport default function component(fn) {\n if (isAsyncFunctionWithoutTransform(fn)) {\n throw new Error('signalium: `component(async (props) => { await ... })` requires the Signalium Babel preset (async transform).');\n }\n if (isGeneratorFunction(fn)) {\n return createServerAsyncComponentWrapper(fn);\n }\n return createServerSyncComponentWrapper(fn);\n}\n"],"names":["isAsyncFunctionWithoutTransform","isGeneratorFunction","createServerAsyncComponentWrapper","createServerSyncComponentWrapper"],"mappings":";;;AACe,SAAS,UAAU,IAAI;AAClC,MAAIA,gBAAAA,gCAAgC,EAAE,GAAG;AACrC,UAAM,IAAI,MAAM,+GAA+G;AAAA,EACnI;AACA,MAAIC,gBAAAA,oBAAoB,EAAE,GAAG;AACzB,WAAOC,gBAAAA,kCAAkC,EAAE;AAAA,EAC/C;AACA,SAAOC,gBAAAA,iCAAiC,EAAE;AAC9C;;"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const React = require("react");
4
+ const contexts = require("../contexts-CM3QLfV8.js");
5
+ function _interopNamespaceDefault(e) {
6
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
7
+ if (e) {
8
+ for (const k in e) {
9
+ if (k !== "default") {
10
+ const d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: () => e[k]
14
+ });
15
+ }
16
+ }
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
22
+ function getReactCache() {
23
+ const cache = React__namespace.cache;
24
+ if (typeof cache !== "function") {
25
+ throw new Error("setupRscRequestScope() requires React.cache (React 19+). Upgrade react and react-dom in this app.");
26
+ }
27
+ return cache;
28
+ }
29
+ let getCachedRequestScope;
30
+ function setupRscRequestScope() {
31
+ if (getCachedRequestScope === void 0) {
32
+ getCachedRequestScope = getReactCache()(() => new contexts.SignalScope([]));
33
+ }
34
+ contexts.setRequestScopeGetter(() => getCachedRequestScope());
35
+ }
36
+ exports.setupRscRequestScope = setupRscRequestScope;
37
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sources":["../../../../.tsc-out/react/server.js"],"sourcesContent":["import * as React from 'react';\nimport { setRequestScopeGetter, SignalScope } from '../internals/contexts.js';\nfunction getReactCache() {\n const cache = React.cache;\n if (typeof cache !== 'function') {\n throw new Error('setupRscRequestScope() requires React.cache (React 19+). Upgrade react and react-dom in this app.');\n }\n return cache;\n}\nlet getCachedRequestScope;\n/**\n * Register a per-request {@link SignalScope} for server `reactive()` / `task()` / `relay()` using\n * React's `cache` (same lifetime as other per-request memoization in RSC / Flight).\n *\n * Call **once** per server bundle before any server-side reactive work (e.g. top of root layout or\n * `instrumentation.ts`). Safe to call multiple times; the last registration wins.\n *\n * Requires **React 19+** (`React.cache`). Does not run in the browser: import this module only from\n * server code paths.\n */\nexport function setupRscRequestScope() {\n if (getCachedRequestScope === undefined) {\n getCachedRequestScope = getReactCache()(() => new SignalScope([]));\n }\n setRequestScopeGetter(() => getCachedRequestScope());\n}\n"],"names":["React","SignalScope","setRequestScopeGetter"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,gBAAgB;AACrB,QAAM,QAAQA,iBAAM;AACpB,MAAI,OAAO,UAAU,YAAY;AAC7B,UAAM,IAAI,MAAM,mGAAmG;AAAA,EACvH;AACA,SAAO;AACX;AACA,IAAI;AAWG,SAAS,uBAAuB;AACnC,MAAI,0BAA0B,QAAW;AACrC,4BAAwB,cAAa,EAAG,MAAM,IAAIC,SAAAA,YAAY,CAAA,CAAE,CAAC;AAAA,EACrE;AACAC,WAAAA,sBAAsB,MAAM,uBAAuB;AACvD;;"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const contexts = require("./contexts-DtQMtXO7.js");
2
+ const contexts = require("./contexts-CM3QLfV8.js");
3
3
  const DERIVED_DEFINITION_MAP = /* @__PURE__ */ new WeakMap();
4
4
  function getReactiveFnAndDefinition(fn, opts) {
5
5
  let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);
@@ -144,4 +144,4 @@ exports.relay = relay;
144
144
  exports.snapshot = snapshot;
145
145
  exports.task = task;
146
146
  exports.watcher = watcher;
147
- //# sourceMappingURL=snapshot-Dw62eSpw.js.map
147
+ //# sourceMappingURL=snapshot-BCESZVAP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-Dw62eSpw.js","sources":["../../../.tsc-out/internals/core-api.js","../../../.tsc-out/internals/utils/snapshot.js"],"sourcesContent":["import { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport { createReactiveDefinition, createReactiveSignal, } from './reactive.js';\nimport { createRelay, createTask } from './async.js';\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new WeakMap();\nexport function getReactiveFnAndDefinition(fn, opts) {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const defScope = getCurrentScope();\n const reactiveFn = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args);\n return signal.value;\n };\n fnAndDef = [reactiveFn, def];\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n return fnAndDef;\n}\nexport function reactive(fn, opts) {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\nexport const reactiveMethod = (owner, fn, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const reactiveFn = (...args) => {\n return getScopeOwner(owner).get(def, args).value;\n };\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n return reactiveFn;\n};\nexport function relay(activate, opts) {\n const scope = getCurrentScope();\n return createRelay(activate, scope, opts);\n}\nexport const task = (fn, opts) => {\n const scope = getCurrentScope();\n return createTask(fn, scope, opts);\n};\nexport function watcher(fn, opts) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = (compute, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n","import { isReactivePromise } from '../async.js';\nconst getProto = Object.getPrototypeOf;\nfunction snapshotArray(current, prev, snap) {\n const prevArr = Array.isArray(prev) ? prev : undefined;\n let changed = !prevArr || prevArr.length !== current.length;\n const result = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n result[i] = snap(current[i], prevArr?.[i]);\n if (!changed && result[i] !== prevArr[i]) {\n changed = true;\n }\n }\n return changed ? result : prevArr;\n}\nfunction snapshotPlainObject(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' && !Array.isArray(prev)\n ? prev\n : undefined;\n const keys = Object.keys(current);\n let changed = !prevObj || Object.keys(prevObj).length !== keys.length;\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] = snap(current[key], prevObj?.[key]);\n if (!changed && result[key] !== prevObj[key]) {\n changed = true;\n }\n }\n return changed ? result : prevObj;\n}\nfunction snapshotReactivePromise(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' ? prev : undefined;\n const value = snap(current.value, prevObj?.value);\n const error = current.error;\n const isPending = current.isPending;\n const isRejected = current.isRejected;\n const isResolved = current.isResolved;\n const isReady = current.isReady;\n const isSettled = current.isSettled;\n if (prevObj &&\n value === prevObj.value &&\n error === prevObj.error &&\n isPending === prevObj.isPending &&\n isRejected === prevObj.isRejected &&\n isResolved === prevObj.isResolved &&\n isReady === prevObj.isReady &&\n isSettled === prevObj.isSettled) {\n return prevObj;\n }\n return { value, error, isPending, isRejected, isResolved, isReady, isSettled };\n}\nfunction snapshotMap(current, prev, snap) {\n const prevMap = prev instanceof Map ? prev : undefined;\n let changed = !prevMap || prevMap.size !== current.size;\n const result = new Map();\n for (const [key, val] of current) {\n const snapped = snap(val, prevMap?.get(key));\n result.set(key, snapped);\n if (!changed && snapped !== prevMap.get(key)) {\n changed = true;\n }\n }\n return changed ? result : prevMap;\n}\nfunction snapshotSet(current, prev, _snap) {\n const prevSet = prev instanceof Set ? prev : undefined;\n let changed = !prevSet || prevSet.size !== current.size;\n const result = new Set();\n for (const val of current) {\n const snapped = snapshot(val, prevSet?.has(val) ? val : undefined);\n result.add(snapped);\n if (!changed && !prevSet.has(snapped)) {\n changed = true;\n }\n }\n return changed ? result : prevSet;\n}\nconst PROTO_TO_SNAPSHOT = new Map([\n [Object.prototype, snapshotPlainObject],\n [Array.prototype, snapshotArray],\n [Map.prototype, snapshotMap],\n [Set.prototype, snapshotSet],\n [null, snapshotPlainObject],\n]);\n/**\n * Register a custom snapshot function for instances of a class.\n * The function receives the current value, the previous snapshot (or undefined),\n * and the recursive `snapshot` function for snapshotting nested values.\n *\n * Return `prev` when nothing has changed to preserve reference stability.\n *\n * @example\n * ```ts\n * registerCustomSnapshot(MyEntity, (current, prev, snapshot) => {\n * const name = snapshot(current.name, prev?.name);\n * const age = current.age;\n * if (prev && name === prev.name && age === prev.age) return prev;\n * return { name, age };\n * });\n * ```\n */\nexport const registerCustomSnapshot = (ctor, snapshotFn) => {\n PROTO_TO_SNAPSHOT.set(ctor.prototype, snapshotFn);\n};\n/**\n * Recursively snapshot a value with structural sharing.\n *\n * - Plain objects and arrays are deep-cloned; unchanged subtrees keep the same reference.\n * - ReactivePromise instances are read (establishing deps) and flattened to a plain object.\n * - Class instances (non-plain prototypes) are returned as-is unless a custom handler is registered.\n * - Primitives are returned directly.\n */\nexport function snapshot(currentValue, prevValue) {\n if (currentValue === null || typeof currentValue !== 'object') {\n return currentValue;\n }\n if (isReactivePromise(currentValue)) {\n return snapshotReactivePromise(currentValue, prevValue, snapshot);\n }\n const handler = PROTO_TO_SNAPSHOT.get(getProto(currentValue));\n if (handler !== undefined) {\n return handler(currentValue, prevValue, snapshot);\n }\n return currentValue;\n}\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal","isReactivePromise"],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-BCESZVAP.js","sources":["../../../.tsc-out/internals/core-api.js","../../../.tsc-out/internals/utils/snapshot.js"],"sourcesContent":["import { getCurrentScope, getScopeOwner, SignalScope } from './contexts.js';\nimport { createReactiveDefinition, createReactiveSignal, } from './reactive.js';\nimport { createRelay, createTask } from './async.js';\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const DERIVED_DEFINITION_MAP = new WeakMap();\nexport function getReactiveFnAndDefinition(fn, opts) {\n let fnAndDef = DERIVED_DEFINITION_MAP.get(fn);\n if (!fnAndDef) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const defScope = getCurrentScope();\n const reactiveFn = (...args) => {\n const scope = getCurrentScope(defScope);\n const signal = scope.get(def, args);\n return signal.value;\n };\n fnAndDef = [reactiveFn, def];\n DERIVED_DEFINITION_MAP.set(fn, fnAndDef);\n }\n return fnAndDef;\n}\nexport function reactive(fn, opts) {\n return getReactiveFnAndDefinition(fn, opts)[0];\n}\nexport const reactiveMethod = (owner, fn, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, opts?.paramKey, undefined);\n const reactiveFn = (...args) => {\n return getScopeOwner(owner).get(def, args).value;\n };\n DERIVED_DEFINITION_MAP.set(reactiveFn, [reactiveFn, def]);\n return reactiveFn;\n};\nexport function relay(activate, opts) {\n const scope = getCurrentScope();\n return createRelay(activate, scope, opts);\n}\nexport const task = (fn, opts) => {\n const scope = getCurrentScope();\n return createTask(fn, scope, opts);\n};\nexport function watcher(fn, opts) {\n const def = createReactiveDefinition(opts?.id, opts?.desc, fn, opts?.equals, false, undefined, opts?.tracer);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n}\n/**\n * Creates a reactive signal from a compute function. This is useful for when you\n * want to create a signal that does not receive parameters, but is still reactive.\n *\n * @param compute\n * @param opts\n * @returns\n */\nexport const reactiveSignal = (compute, opts) => {\n const def = createReactiveDefinition(opts?.id, opts?.desc, compute, opts?.equals, false, undefined, undefined);\n const scope = opts?.isolate ? new SignalScope([]) : getCurrentScope();\n return createReactiveSignal(def, undefined, undefined, scope);\n};\n","import { isReactivePromise } from '../async.js';\nconst getProto = Object.getPrototypeOf;\nfunction snapshotArray(current, prev, snap) {\n const prevArr = Array.isArray(prev) ? prev : undefined;\n let changed = !prevArr || prevArr.length !== current.length;\n const result = new Array(current.length);\n for (let i = 0; i < current.length; i++) {\n result[i] = snap(current[i], prevArr?.[i]);\n if (!changed && result[i] !== prevArr[i]) {\n changed = true;\n }\n }\n return changed ? result : prevArr;\n}\nfunction snapshotPlainObject(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' && !Array.isArray(prev)\n ? prev\n : undefined;\n const keys = Object.keys(current);\n let changed = !prevObj || Object.keys(prevObj).length !== keys.length;\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n result[key] = snap(current[key], prevObj?.[key]);\n if (!changed && result[key] !== prevObj[key]) {\n changed = true;\n }\n }\n return changed ? result : prevObj;\n}\nfunction snapshotReactivePromise(current, prev, snap) {\n const prevObj = prev !== null && prev !== undefined && typeof prev === 'object' ? prev : undefined;\n const value = snap(current.value, prevObj?.value);\n const error = current.error;\n const isPending = current.isPending;\n const isRejected = current.isRejected;\n const isResolved = current.isResolved;\n const isReady = current.isReady;\n const isSettled = current.isSettled;\n if (prevObj &&\n value === prevObj.value &&\n error === prevObj.error &&\n isPending === prevObj.isPending &&\n isRejected === prevObj.isRejected &&\n isResolved === prevObj.isResolved &&\n isReady === prevObj.isReady &&\n isSettled === prevObj.isSettled) {\n return prevObj;\n }\n return { value, error, isPending, isRejected, isResolved, isReady, isSettled };\n}\nfunction snapshotMap(current, prev, snap) {\n const prevMap = prev instanceof Map ? prev : undefined;\n let changed = !prevMap || prevMap.size !== current.size;\n const result = new Map();\n for (const [key, val] of current) {\n const snapped = snap(val, prevMap?.get(key));\n result.set(key, snapped);\n if (!changed && snapped !== prevMap.get(key)) {\n changed = true;\n }\n }\n return changed ? result : prevMap;\n}\nfunction snapshotSet(current, prev, _snap) {\n const prevSet = prev instanceof Set ? prev : undefined;\n let changed = !prevSet || prevSet.size !== current.size;\n const result = new Set();\n for (const val of current) {\n const snapped = snapshot(val, prevSet?.has(val) ? val : undefined);\n result.add(snapped);\n if (!changed && !prevSet.has(snapped)) {\n changed = true;\n }\n }\n return changed ? result : prevSet;\n}\nconst PROTO_TO_SNAPSHOT = new Map([\n [Object.prototype, snapshotPlainObject],\n [Array.prototype, snapshotArray],\n [Map.prototype, snapshotMap],\n [Set.prototype, snapshotSet],\n [null, snapshotPlainObject],\n]);\n/**\n * Register a custom snapshot function for instances of a class.\n * The function receives the current value, the previous snapshot (or undefined),\n * and the recursive `snapshot` function for snapshotting nested values.\n *\n * Return `prev` when nothing has changed to preserve reference stability.\n *\n * @example\n * ```ts\n * registerCustomSnapshot(MyEntity, (current, prev, snapshot) => {\n * const name = snapshot(current.name, prev?.name);\n * const age = current.age;\n * if (prev && name === prev.name && age === prev.age) return prev;\n * return { name, age };\n * });\n * ```\n */\nexport const registerCustomSnapshot = (ctor, snapshotFn) => {\n PROTO_TO_SNAPSHOT.set(ctor.prototype, snapshotFn);\n};\n/**\n * Recursively snapshot a value with structural sharing.\n *\n * - Plain objects and arrays are deep-cloned; unchanged subtrees keep the same reference.\n * - ReactivePromise instances are read (establishing deps) and flattened to a plain object.\n * - Class instances (non-plain prototypes) are returned as-is unless a custom handler is registered.\n * - Primitives are returned directly.\n */\nexport function snapshot(currentValue, prevValue) {\n if (currentValue === null || typeof currentValue !== 'object') {\n return currentValue;\n }\n if (isReactivePromise(currentValue)) {\n return snapshotReactivePromise(currentValue, prevValue, snapshot);\n }\n const handler = PROTO_TO_SNAPSHOT.get(getProto(currentValue));\n if (handler !== undefined) {\n return handler(currentValue, prevValue, snapshot);\n }\n return currentValue;\n}\n"],"names":["createReactiveDefinition","getCurrentScope","getScopeOwner","createRelay","createTask","SignalScope","createReactiveSignal","isReactivePromise"],"mappings":"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"}