@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,165 @@
1
+ /**
2
+ * createResource, on the TC39 core by way of the compat layer. This is
3
+ * Additive, the legacy `createResource` in ../signal.ts stays intact; this is the
4
+ * parallel implementation that runs on the new graph.
5
+ *
6
+ * Resources are the one part of the surface that touches framework-coupled bits, so
7
+ * they're ported by hand. The SSR transport hooks (`nextResourceId`/`getServerData`/
8
+ * `trackResourcePromise`/`reportResourceData`) are standalone module functions, so we
9
+ * Reuse them from ../signal.ts, same `__FX_DATA__` seeding + async-SSR drain as legacy.
10
+ *
11
+ * Suspense boundary integration (throwing the pending promise to a boundary that
12
+ * increments/decrements) lands with the Suspense port; the throwing getter is here so
13
+ * a boundary built on the new effect can catch it.
14
+ */
15
+ import { createSignal, createEffect, batch, untrack, onCleanup, } from './compat.js';
16
+ // Standalone SSR hooks: graph-agnostic injectables.
17
+ import { nextResourceId, getServerData, trackResourcePromise, reportResourceData, } from './ssr-hooks.js';
18
+ function isPromise(v) {
19
+ return !!v && typeof v.then === 'function';
20
+ }
21
+ const UNSET = Symbol();
22
+ export function createResource(source, fetcherFn, options = {}) {
23
+ let s;
24
+ let fetcher;
25
+ if (typeof fetcherFn === 'function') {
26
+ s = typeof source === 'function' ? source : () => source;
27
+ fetcher = fetcherFn;
28
+ }
29
+ else {
30
+ s = () => true;
31
+ fetcher = source;
32
+ if (fetcherFn && typeof fetcherFn === 'object')
33
+ options = fetcherFn;
34
+ }
35
+ // SSR data transport: stable id; on the client seed from server-serialized value.
36
+ // `transport: false` opts out, and takes the id with it. The id is a position in
37
+ // a per-render sequence that the client re-derives by counting resources in the
38
+ // same order, so a resource that exists on one side and not the other shifts
39
+ // every id after it. `lazy()` is exactly that: on the server the first request
40
+ // for a route creates a resource for the module import and later requests find
41
+ // it cached and create none, so the page's own resource was r1 for the first
42
+ // visitor after a restart and r0 for everyone else, while the client, which
43
+ // preloads routes before hydrating, always said r0. Its value is a component
44
+ // function and was never transportable anyway.
45
+ const ssrId = options.transport === false ? undefined : nextResourceId();
46
+ const seed = ssrId !== undefined ? getServerData(ssrId) : undefined;
47
+ let skipFirstFetch = seed !== undefined;
48
+ const [value, setValue] = createSignal(seed !== undefined ? seed.value : options.initialValue, { equals: false });
49
+ const [error, setError] = createSignal(undefined, { equals: false });
50
+ const [state, setState] = createSignal(seed !== undefined || options.initialValue !== undefined ? 'ready' : 'unresolved', { equals: false });
51
+ const [promise, setPromise] = createSignal(undefined, { equals: false });
52
+ const [track, trigger] = createSignal(undefined, { equals: false });
53
+ let prevKey = UNSET;
54
+ let manualRefetch = false;
55
+ createEffect(() => {
56
+ const val = s();
57
+ track();
58
+ if (val === false || val === null || val === undefined) {
59
+ prevKey = UNSET;
60
+ batch(() => {
61
+ setState('unresolved');
62
+ setPromise(undefined);
63
+ setError(undefined);
64
+ });
65
+ return;
66
+ }
67
+ const isManual = manualRefetch;
68
+ manualRefetch = false;
69
+ if (prevKey !== UNSET && val === prevKey && !isManual)
70
+ return;
71
+ prevKey = val;
72
+ if (skipFirstFetch) {
73
+ skipFirstFetch = false;
74
+ return; // seeded: source tracked, but no first fetch (no flash on hydration)
75
+ }
76
+ let cancelled = false;
77
+ onCleanup(() => (cancelled = true));
78
+ const currentState = untrack(state);
79
+ const currentValue = untrack(value);
80
+ const isRefreshing = currentState === 'ready' || currentState === 'refreshing';
81
+ batch(() => {
82
+ setState(isRefreshing ? 'refreshing' : 'pending');
83
+ setError(undefined);
84
+ });
85
+ try {
86
+ const res = fetcher(val, { value: currentValue, refetching: isRefreshing });
87
+ if (isPromise(res)) {
88
+ setPromise(res);
89
+ trackResourcePromise(res); // server async SSR: collect & await
90
+ res.then((v) => {
91
+ if (cancelled)
92
+ return;
93
+ if (ssrId !== undefined)
94
+ reportResourceData(ssrId, v); // serialize for hydration
95
+ batch(() => {
96
+ setValue(() => v);
97
+ setState('ready');
98
+ setPromise(undefined);
99
+ });
100
+ }, (e) => {
101
+ if (cancelled)
102
+ return;
103
+ batch(() => {
104
+ setError(e);
105
+ setState('errored');
106
+ setPromise(undefined);
107
+ });
108
+ });
109
+ }
110
+ else {
111
+ batch(() => {
112
+ setValue(() => res);
113
+ setState('ready');
114
+ setPromise(undefined);
115
+ });
116
+ }
117
+ }
118
+ catch (e) {
119
+ if (cancelled)
120
+ return;
121
+ batch(() => {
122
+ setError(e);
123
+ setState('errored');
124
+ setPromise(undefined);
125
+ });
126
+ }
127
+ });
128
+ const loading = () => {
129
+ const st = state();
130
+ return st === 'pending' || st === 'refreshing';
131
+ };
132
+ const resource = (() => {
133
+ const e = error();
134
+ if (e)
135
+ throw e;
136
+ if (loading()) {
137
+ const p = promise();
138
+ if (p)
139
+ throw p; // suspends, a boundary on the new effect catches this
140
+ }
141
+ return value();
142
+ });
143
+ Object.defineProperties(resource, {
144
+ state: { get: state },
145
+ loading: { get: loading },
146
+ error: { get: error },
147
+ latest: { get: value },
148
+ });
149
+ // Stamp the detection markers the legacy createResource sets (signal.ts) so the
150
+ // DOM runtime/control-flow recognise a resource accessor: $RESOURCE for
151
+ // isResource() (e.g. Show's `.loading` gate) and $SIGNAL for isSignal() so
152
+ // insert() reads it reactively instead of caching/freezing it.
153
+ Object.defineProperty(resource, Symbol.for('resource'), { value: true, enumerable: true });
154
+ Object.defineProperty(resource, Symbol.for('signal'), { value: true, enumerable: true });
155
+ return [
156
+ resource,
157
+ {
158
+ mutate: setValue,
159
+ refetch: () => {
160
+ manualRefetch = true;
161
+ trigger(undefined);
162
+ },
163
+ },
164
+ ];
165
+ }