@fluixi/reactive 1.0.0-alpha.82 → 1.0.0-alpha.84

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 (169) hide show
  1. package/README.md +4 -0
  2. package/dist/cdn/reactive.cjs +2673 -1
  3. package/dist/cdn/reactive.global.js +2 -1
  4. package/dist/cdn/reactive.mjs +2657 -1
  5. package/dist/cdn/signal.cjs +299 -1
  6. package/dist/cdn/signal.d.ts +1 -1
  7. package/dist/cdn/signal.global.js +2 -1
  8. package/dist/cdn/signal.js +1 -1
  9. package/dist/cdn/signal.mjs +276 -1
  10. package/dist/index.cjs +2673 -1
  11. package/dist/index.mjs +2657 -1
  12. package/dist/lib/index.cjs +2674 -1
  13. package/dist/lib/index.js +1 -1
  14. package/dist/lib/index.mjs +2659 -1
  15. package/dist/lib/observable/index.cjs +386 -1
  16. package/dist/lib/observable/index.mjs +364 -1
  17. package/dist/lib/observable/observable.cjs +384 -1
  18. package/dist/lib/observable/observable.d.ts +0 -137
  19. package/dist/lib/observable/observable.d.ts.map +1 -1
  20. package/dist/lib/observable/observable.js +0 -71
  21. package/dist/lib/observable/observable.mjs +361 -1
  22. package/dist/lib/observable/subscription.cjs +180 -1
  23. package/dist/lib/observable/subscription.d.ts +0 -12
  24. package/dist/lib/observable/subscription.d.ts.map +1 -1
  25. package/dist/lib/observable/subscription.js +0 -12
  26. package/dist/lib/observable/subscription.mjs +157 -1
  27. package/dist/lib/observable/types.cjs +18 -1
  28. package/dist/lib/observable/types.d.ts.map +1 -1
  29. package/dist/lib/predicates.cjs +44 -1
  30. package/dist/lib/predicates.d.ts +2 -2
  31. package/dist/lib/predicates.js +2 -2
  32. package/dist/lib/predicates.mjs +23 -1
  33. package/dist/lib/signal/api.cjs +571 -1
  34. package/dist/lib/signal/api.d.ts +211 -1
  35. package/dist/lib/signal/api.d.ts.map +1 -1
  36. package/dist/lib/signal/api.js +207 -12
  37. package/dist/lib/signal/api.mjs +548 -1
  38. package/dist/lib/signal/cached-resource.cjs +672 -1
  39. package/dist/lib/signal/cached-resource.d.ts +28 -16
  40. package/dist/lib/signal/cached-resource.d.ts.map +1 -1
  41. package/dist/lib/signal/cached-resource.js +35 -29
  42. package/dist/lib/signal/cached-resource.mjs +650 -1
  43. package/dist/lib/signal/graph/children.cjs +325 -1
  44. package/dist/lib/signal/graph/children.js +1 -1
  45. package/dist/lib/signal/graph/children.mjs +302 -1
  46. package/dist/lib/signal/graph/compat.cjs +578 -1
  47. package/dist/lib/signal/graph/compat.d.ts +13 -13
  48. package/dist/lib/signal/graph/compat.d.ts.map +1 -1
  49. package/dist/lib/signal/graph/compat.js +51 -32
  50. package/dist/lib/signal/graph/compat.mjs +556 -1
  51. package/dist/lib/signal/graph/core.cjs +295 -1
  52. package/dist/lib/signal/graph/core.d.ts +28 -24
  53. package/dist/lib/signal/graph/core.d.ts.map +1 -1
  54. package/dist/lib/signal/graph/core.js +45 -31
  55. package/dist/lib/signal/graph/core.mjs +273 -1
  56. package/dist/lib/signal/graph/debounced.cjs +668 -1
  57. package/dist/lib/signal/graph/debounced.d.ts +5 -5
  58. package/dist/lib/signal/graph/debounced.d.ts.map +1 -1
  59. package/dist/lib/signal/graph/debounced.js +5 -5
  60. package/dist/lib/signal/graph/debounced.mjs +645 -1
  61. package/dist/lib/signal/graph/derived.cjs +496 -1
  62. package/dist/lib/signal/graph/derived.d.ts +1 -1
  63. package/dist/lib/signal/graph/derived.js +1 -1
  64. package/dist/lib/signal/graph/derived.mjs +473 -1
  65. package/dist/lib/signal/graph/detect.cjs +66 -1
  66. package/dist/lib/signal/graph/detect.mjs +45 -1
  67. package/dist/lib/signal/graph/error-boundary.cjs +301 -1
  68. package/dist/lib/signal/graph/error-boundary.js +3 -3
  69. package/dist/lib/signal/graph/error-boundary.mjs +278 -1
  70. package/dist/lib/signal/graph/index.cjs +305 -1
  71. package/dist/lib/signal/graph/index.d.ts +7 -6
  72. package/dist/lib/signal/graph/index.d.ts.map +1 -1
  73. package/dist/lib/signal/graph/index.js +7 -6
  74. package/dist/lib/signal/graph/index.mjs +283 -1
  75. package/dist/lib/signal/graph/observe.cjs +163 -0
  76. package/dist/lib/signal/graph/observe.d.ts +141 -0
  77. package/dist/lib/signal/graph/observe.d.ts.map +1 -0
  78. package/dist/lib/signal/graph/observe.js +149 -0
  79. package/dist/lib/signal/graph/observe.mjs +140 -0
  80. package/dist/lib/signal/graph/resource.cjs +620 -1
  81. package/dist/lib/signal/graph/resource.d.ts +1 -1
  82. package/dist/lib/signal/graph/resource.js +7 -8
  83. package/dist/lib/signal/graph/resource.mjs +597 -1
  84. package/dist/lib/signal/graph/runtime.cjs +501 -1
  85. package/dist/lib/signal/graph/runtime.d.ts +9 -9
  86. package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
  87. package/dist/lib/signal/graph/runtime.js +56 -37
  88. package/dist/lib/signal/graph/runtime.mjs +478 -1
  89. package/dist/lib/signal/graph/signal-next.cjs +1208 -1
  90. package/dist/lib/signal/graph/signal-next.d.ts +5 -5
  91. package/dist/lib/signal/graph/signal-next.d.ts.map +1 -1
  92. package/dist/lib/signal/graph/signal-next.js +14 -12
  93. package/dist/lib/signal/graph/signal-next.mjs +1186 -1
  94. package/dist/lib/signal/graph/ssr-hooks.cjs +60 -1
  95. package/dist/lib/signal/graph/ssr-hooks.d.ts +6 -7
  96. package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -1
  97. package/dist/lib/signal/graph/ssr-hooks.js +6 -7
  98. package/dist/lib/signal/graph/ssr-hooks.mjs +39 -1
  99. package/dist/lib/signal/graph/state.cjs +72 -1
  100. package/dist/lib/signal/graph/state.d.ts +43 -10
  101. package/dist/lib/signal/graph/state.d.ts.map +1 -1
  102. package/dist/lib/signal/graph/state.js +83 -21
  103. package/dist/lib/signal/graph/state.mjs +49 -1
  104. package/dist/lib/signal/graph/suspense.cjs +301 -1
  105. package/dist/lib/signal/graph/suspense.js +4 -4
  106. package/dist/lib/signal/graph/suspense.mjs +278 -1
  107. package/dist/lib/signal/index-legacy.cjs +2540 -1
  108. package/dist/lib/signal/index-legacy.d.ts +1 -1
  109. package/dist/lib/signal/index-legacy.js +1 -1
  110. package/dist/lib/signal/index-legacy.mjs +2518 -1
  111. package/dist/lib/signal/index.cjs +1275 -1
  112. package/dist/lib/signal/index.d.ts +5 -2
  113. package/dist/lib/signal/index.d.ts.map +1 -1
  114. package/dist/lib/signal/index.js +8 -3
  115. package/dist/lib/signal/index.mjs +1253 -1
  116. package/dist/lib/signal/list.cjs +549 -1
  117. package/dist/lib/signal/list.d.ts +5 -5
  118. package/dist/lib/signal/list.js +10 -10
  119. package/dist/lib/signal/list.mjs +526 -1
  120. package/dist/lib/signal/resource-api.cjs +626 -1
  121. package/dist/lib/signal/resource-api.d.ts +5 -5
  122. package/dist/lib/signal/resource-api.js +5 -5
  123. package/dist/lib/signal/resource-api.mjs +603 -1
  124. package/dist/lib/signal/signal.cjs +2023 -1
  125. package/dist/lib/signal/signal.d.ts +4 -4
  126. package/dist/lib/signal/signal.d.ts.map +1 -1
  127. package/dist/lib/signal/signal.js +22 -23
  128. package/dist/lib/signal/signal.mjs +2000 -1
  129. package/dist/lib/signal/types.cjs +38 -1
  130. package/dist/lib/signal/types.d.ts.map +1 -1
  131. package/dist/lib/signal/types.js +2 -2
  132. package/dist/lib/signal/types.mjs +17 -1
  133. package/dist/lib/signal/utilities.cjs +1012 -1
  134. package/dist/lib/signal/utilities.d.ts +0 -108
  135. package/dist/lib/signal/utilities.d.ts.map +1 -1
  136. package/dist/lib/signal/utilities.js +0 -158
  137. package/dist/lib/signal/utilities.mjs +990 -1
  138. package/dist/lib/store/api.cjs +612 -1
  139. package/dist/lib/store/api.d.ts +33 -0
  140. package/dist/lib/store/api.d.ts.map +1 -1
  141. package/dist/lib/store/api.js +41 -8
  142. package/dist/lib/store/api.mjs +596 -1
  143. package/dist/lib/store/index.cjs +691 -1
  144. package/dist/lib/store/index.js +1 -1
  145. package/dist/lib/store/index.mjs +676 -1
  146. package/dist/lib/store/setter.types.cjs +18 -1
  147. package/dist/lib/store/setter.types.d.ts +43 -3
  148. package/dist/lib/store/setter.types.d.ts.map +1 -1
  149. package/dist/lib/store/store.cjs +658 -1
  150. package/dist/lib/store/store.d.ts +72 -0
  151. package/dist/lib/store/store.d.ts.map +1 -1
  152. package/dist/lib/store/store.js +294 -11
  153. package/dist/lib/store/store.mjs +644 -1
  154. package/dist/lib/store/types.cjs +18 -1
  155. package/dist/lib/store/types.d.ts +1 -1
  156. package/dist/lib/store/types.d.ts.map +1 -1
  157. package/dist/lib/store/utils.cjs +43 -1
  158. package/dist/lib/store/utils.d.ts +1 -1
  159. package/dist/lib/store/utils.js +1 -1
  160. package/dist/lib/store/utils.mjs +22 -1
  161. package/dist/lib/subject.cjs +450 -1
  162. package/dist/lib/subject.js +3 -91
  163. package/dist/lib/subject.mjs +427 -1
  164. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  165. package/dist/version.generated.cjs +27 -1
  166. package/dist/version.generated.d.ts +1 -1
  167. package/dist/version.generated.js +2 -2
  168. package/dist/version.generated.mjs +7 -1
  169. package/package.json +5 -4
@@ -1 +1,612 @@
1
- "use strict";var m=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},C=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of H(t))!W.call(e,o)&&o!==n&&m(e,o,{get:()=>t[o],enumerable:!(r=_(t,o))||r.enumerable});return e};var F=e=>C(m({},"__esModule",{value:!0}),e);var J={};z(J,{store:()=>G});module.exports=F(J);var i=require("@fluixi/reactive/signal"),h=Symbol("store-raw"),j=Symbol("store-node"),w=Symbol("store-has"),P=Symbol("store-self"),N=Symbol("store-track");var I=new WeakMap,U=new WeakMap;function M(e){let[t,n]=(0,i.createSignal)(e),r=t;return r.$=n,r}function p(e){let t=I.get(e);return t||I.set(e,t={keys:new Map}),t}function v(e,t,n){let r=e.keys.get(t);return r||e.keys.set(t,r=M(n)),r}function $(e){let t=p(e);(t.all||(t.all=M()))()}function D(e,t){e.$(typeof t=="function"?()=>t:t)}function E(e){if(e==null||typeof e!="object")return!1;if(Array.isArray(e))return!0;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function l(e){if(!E(e))return e;let t=U.get(e);if(t)return t;let n=new Proxy(e,X);return U.set(e,n),n}var X={get(e,t,n){if(t===h||t===j)return e;if(t===i.$PROXY)return n;if(t===w)return a=>a in e;if(t==="__proxy")return!0;if(t===N||t===P)return $(e),n;let r=e[t];if(typeof r=="function"&&!Object.prototype.hasOwnProperty.call(e,t))return r;let o=Object.getOwnPropertyDescriptor(e,t);if(o&&o.get)return o.get.call(n);let s=v(p(e),t,r)();return E(s)?l(s):s},set(){return!0},deleteProperty(e,t){return t in e&&u(e,t,void 0),!0},has(e,t){return t===h||t===i.$PROXY||t===j||t===w||t===P||t===N?!0:(v(p(e),t,e[t])(),t in e)},ownKeys(e){return $(e),Reflect.ownKeys(e)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e,t)}};function u(e,t,n){if(e[t]===n&&(n!==void 0||t in e))return;let o=Array.isArray(e),s=o?e.length:0;n===void 0?delete e[t]:e[t]=n;let a=p(e),c=a.keys.get(t);if(c&&D(c,n),o&&e.length!==s){let f=a.keys.get("length");f&&D(f,e.length)}a.all&&a.all.$(void 0)}function R(e,t){return typeof e=="function"?e(t):e}function A(e,t){for(let n of Object.keys(t)){let r=t[n],o=e[n];r&&typeof r=="object"&&!Array.isArray(r)&&o&&typeof o=="object"&&!Array.isArray(o)?A(o,r):u(e,n,r)}}function g(e){let t=[],n=e.replace(/\[([^\]]*)\]/g,".$1");for(let r of n.split("."))r.length&&t.push(r);return t}function K(e,t,n){let r=t.length-1;for(let s=0;s<r;s++){let a=t[s];if(a==="*"){let f=t.slice(s+1);if(Array.isArray(e))for(let T=0;T<e.length;T++)K(e[T],f,n);return}let c=e[a];(c==null||typeof c!="object")&&(c=/^\d+$/.test(t[s+1])?[]:{},u(e,a,c)),e=c}let o=t[r];if(o==="*"){if(Array.isArray(e))for(let s=0;s<e.length;s++)u(e,s,R(n,e[s]));return}u(e,o,R(n,e[o]))}function S(e,t,n){K(e,g(t),n)}function q(e,t){let n=t[0];if(typeof n=="function"&&t.length===1){let r=n(e);r&&r!==e&&A(e,r);return}if(Array.isArray(n)&&t.length===1){for(let r of n)Array.isArray(r)&&S(e,r[0],r[1]);return}if(n&&typeof n=="object"&&!Array.isArray(n)&&t.length===1){A(e,n);return}if(Array.isArray(t[1])&&t.length>=3){S(e,`${n}.${t[1].join(".")}`,t[2]);return}S(e,String(n),t[1])}function O(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(O);let t={};for(let n of Object.keys(e))t[n]=O(e[n]);return t}function y(e,t){let n=e;for(let r of g(t)){if(n==null)return;n=n[r]}return n}var d=class{constructor(t,n={immutable:!0}){this.options=n;this.root=t,this.set=((...r)=>(0,i.batch)(()=>q(this.root,r)))}get state(){return l(this.root)}get proxy(){return l(this.root)}get accessor(){return(()=>l(this.root))}unwrap(){return this.root}getNode(t){return this.root&&this.root[t]}get(t){if(t==null||t==="")return b(this.state);let n=this.state;for(let r of g(t)){if(n==null)return;n=n[r]}return b(n)}select(t){return(0,i.createMemo)(()=>t(this.state))}subscribe(t){return(0,i.createEffect)(()=>t(this.state))}watch(t,n){let r;return(0,i.createEffect)(()=>{let o=t(this.state);Object.is(o,r)||(n(o,r),r=o)})}reactive(t){return(0,i.createMemo)(()=>this.state[t])}produce(t){this.set((n=>{let r=O(n);return t(r),r}))}reconcile(t,n={}){this.set(t)}push(t,...n){let r=y(this.root,t);this.set(t,r.concat(n))}pop(t){let n=y(this.root,t).slice(),r=n.pop();return this.set(t,n),r}shift(t){let n=y(this.root,t).slice(),r=n.shift();return this.set(t,n),r}splice(t,n,r,...o){let s=y(this.root,t).slice(),a=s.splice(n,r,...o);return this.set(t,s),a}insert(t,n,r){let o=y(this.root,t).slice();o.splice(n,0,r),this.set(t,o)}removeAt(t,n){let r=y(this.root,t).slice(),o=r.splice(n,1);return this.set(t,r),o}toObservable(){let[t]=(0,i.createSignal)(this.state);return t.toObservable()}dispose(){}},L=["get","select","watch","subscribe","produce","reconcile","push","pop","shift","splice","insert","removeAt","unwrap","toObservable"];function V(e,t){for(let n of L)e[n]=t[n].bind(t);e.$=t.reactive.bind(t)}function x(e,t={immutable:!0}){let n=new d(e,t);return V(n.set,n),[n.proxy,n.set]}function Y(e,t={}){return new d(e,{...t,immutable:!1})}function b(e){if(e==null||typeof e!="object")return e;let t=e[h];return t!==void 0?t:e}function B(e){return(0,i.untrack)(()=>b(e))}var Z=Object.freeze({createStore:x,createMutableStore:Y,batch:i.batch,unwrap:b,untrackStore:B});function G(e,t){let[n,r]=x(e,t);return new Proxy(n,{get:(o,s)=>s==="set"?r:o[s],has:(o,s)=>s==="set"||Reflect.has(o,s)})}
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/store/api.ts
21
+ var api_exports = {};
22
+ __export(api_exports, {
23
+ store: () => store
24
+ });
25
+ module.exports = __toCommonJS(api_exports);
26
+
27
+ // src/lib/store/store.ts
28
+ var import_signal = require("@fluixi/reactive/signal");
29
+
30
+ // src/version.generated.ts
31
+ var VERSION = "1.0.0-alpha.84";
32
+
33
+ // src/lib/signal/graph/state.ts
34
+ var MAJOR = VERSION.split(".")[0];
35
+ var KEY = `__fluixi_signal_state_v${MAJOR}__`;
36
+ var VERSIONS_KEY = `__fluixi_signal_builds_v${MAJOR}__`;
37
+ var defaultSchedule = (run) => {
38
+ if (typeof queueMicrotask === "function") queueMicrotask(run);
39
+ else void Promise.resolve().then(run);
40
+ };
41
+ function defaults() {
42
+ return {
43
+ consumer: null,
44
+ untracked: false,
45
+ owner: null,
46
+ queue: [],
47
+ scheduled: false,
48
+ flushing: false,
49
+ batchDepth: 0,
50
+ hostSchedule: defaultSchedule,
51
+ onSuspend: null,
52
+ onError: null,
53
+ observer: null
54
+ };
55
+ }
56
+ var realm = globalThis;
57
+ function backfillState(existing) {
58
+ const fresh = defaults();
59
+ const target = existing;
60
+ for (const field of Object.keys(fresh)) {
61
+ if (!(field in existing)) target[field] = fresh[field];
62
+ }
63
+ return existing;
64
+ }
65
+ function claim() {
66
+ const existing = realm[KEY];
67
+ return existing ? backfillState(existing) : realm[KEY] = defaults();
68
+ }
69
+ var G = claim();
70
+ (realm[VERSIONS_KEY] ??= []).push(VERSION);
71
+
72
+ // src/lib/signal/graph/observe.ts
73
+ function observeReactiveNodes(next) {
74
+ G.observer = next;
75
+ return () => {
76
+ if (G.observer === next) G.observer = null;
77
+ };
78
+ }
79
+ var running = [];
80
+ var origin;
81
+ function withReactiveOrigin(owner, fn) {
82
+ if (!G.observer) return fn();
83
+ const previous = origin;
84
+ origin = owner;
85
+ try {
86
+ return fn();
87
+ } finally {
88
+ origin = previous;
89
+ }
90
+ }
91
+ function reportReactiveNode(report) {
92
+ const observer = G.observer;
93
+ if (observer) {
94
+ observer.created(
95
+ report.parents === void 0 ? { ...report, parents: running, origin: report.origin ?? origin } : report
96
+ );
97
+ }
98
+ }
99
+ function reportReactiveMove(node, origin2, name) {
100
+ G.observer?.moved?.(node, origin2, name);
101
+ }
102
+ function reportReactiveDispose(node) {
103
+ G.observer?.disposed?.(node);
104
+ }
105
+ var HOOK = "__FLUIXI_DEVTOOLS_HOOK__";
106
+ var hook = globalThis[HOOK];
107
+ if (typeof hook?.inject === "function") {
108
+ try {
109
+ hook.inject({ observeReactiveNodes, version: VERSION });
110
+ } catch {
111
+ }
112
+ }
113
+ function isObserved() {
114
+ return G.observer != null;
115
+ }
116
+
117
+ // src/lib/store/store.ts
118
+ var $RAW = /* @__PURE__ */ Symbol("store-raw");
119
+ var $NODE = /* @__PURE__ */ Symbol("store-node");
120
+ var $HAS = /* @__PURE__ */ Symbol("store-has");
121
+ var $SELF = /* @__PURE__ */ Symbol("store-self");
122
+ var $TRACK = /* @__PURE__ */ Symbol("store-track");
123
+ var NODES = /* @__PURE__ */ new WeakMap();
124
+ var PROXIES = /* @__PURE__ */ new WeakMap();
125
+ var OWNERS = /* @__PURE__ */ new WeakMap();
126
+ var ROOTS = /* @__PURE__ */ new WeakMap();
127
+ function forgetReplaced(dead, state) {
128
+ if (!isTrackable(dead) || !isObserved()) return;
129
+ const alive = /* @__PURE__ */ new Set();
130
+ const keep = (value) => {
131
+ if (!isTrackable(value) || alive.has(value)) return;
132
+ alive.add(value);
133
+ for (const child of Object.values(value)) keep(child);
134
+ };
135
+ keep(ROOTS.get(state) ?? state);
136
+ const seen = /* @__PURE__ */ new Set();
137
+ const drop = (value) => {
138
+ if (!isTrackable(value)) return;
139
+ const target = value;
140
+ if (alive.has(target) || seen.has(target)) return;
141
+ seen.add(target);
142
+ const ns = NODES.get(target);
143
+ if (ns) {
144
+ for (const node of ns.keys.values()) reportReactiveDispose(node);
145
+ if (ns.all) reportReactiveDispose(ns.all);
146
+ NODES.delete(target);
147
+ OWNERS.delete(target);
148
+ PROXIES.delete(target);
149
+ }
150
+ for (const child of Object.values(target)) drop(child);
151
+ };
152
+ drop(dead);
153
+ }
154
+ var pathOf = (base, key, array) => array ? `${base}[${String(key)}]` : `${base}.${String(key)}`;
155
+ function createDataNode(initial, ns, key) {
156
+ const owner = ns?.owner;
157
+ const label = owner && key !== void 0 ? pathOf(owner.name, key, ns?.array) : void 0;
158
+ const [get, set] = withReactiveOrigin(
159
+ owner?.store,
160
+ () => (0, import_signal.createSignal)(initial, label ? { name: label } : void 0)
161
+ );
162
+ const node = get;
163
+ node.$ = set;
164
+ return node;
165
+ }
166
+ function nodesOf(target) {
167
+ let ns = NODES.get(target);
168
+ if (!ns) NODES.set(target, ns = { keys: /* @__PURE__ */ new Map(), owner: OWNERS.get(target), array: Array.isArray(target) });
169
+ else if (!ns.owner) ns.owner = OWNERS.get(target);
170
+ return ns;
171
+ }
172
+ function keyNode(ns, key, seed) {
173
+ let node = ns.keys.get(key);
174
+ if (!node) ns.keys.set(key, node = createDataNode(seed, ns, key));
175
+ return node;
176
+ }
177
+ function claim2(target, holder, name, parent) {
178
+ const was = OWNERS.get(target);
179
+ if (was && was.store === holder && was.name === name) return;
180
+ const owner = { store: holder, name };
181
+ OWNERS.set(target, owner);
182
+ ROOTS.set(target, ROOTS.get(parent) ?? parent);
183
+ const ns = NODES.get(target);
184
+ if (!ns) return;
185
+ ns.owner = owner;
186
+ if (!isObserved()) return;
187
+ for (const [key, node] of ns.keys) reportReactiveMove(node, holder, pathOf(name, key, ns.array));
188
+ if (ns.all) reportReactiveMove(ns.all, holder, pathOf(name, "*", ns.array));
189
+ }
190
+ function trackKeys(target) {
191
+ const ns = nodesOf(target);
192
+ (ns.all || (ns.all = createDataNode(void 0, ns, "*")))();
193
+ }
194
+ function pokeNode(node, value) {
195
+ node.$(typeof value === "function" ? () => value : value);
196
+ }
197
+ function isTrackable(value) {
198
+ if (value == null || typeof value !== "object") return false;
199
+ if (Array.isArray(value)) return true;
200
+ const proto = Object.getPrototypeOf(value);
201
+ return proto === Object.prototype || proto === null;
202
+ }
203
+ function box(value) {
204
+ if (!isTrackable(value)) return value;
205
+ const existing = PROXIES.get(value);
206
+ if (existing) return existing;
207
+ const proxy = new Proxy(value, handler);
208
+ PROXIES.set(value, proxy);
209
+ return proxy;
210
+ }
211
+ var handler = {
212
+ get(target, key, receiver) {
213
+ if (key === $RAW) return target;
214
+ if (key === $NODE) return target;
215
+ if (key === import_signal.$PROXY) return receiver;
216
+ if (key === $HAS) return (k) => k in target;
217
+ if (key === "__proxy") return true;
218
+ if (key === $TRACK || key === $SELF) {
219
+ trackKeys(target);
220
+ return receiver;
221
+ }
222
+ const value = target[key];
223
+ if (typeof value === "function" && !Object.prototype.hasOwnProperty.call(target, key)) {
224
+ return value;
225
+ }
226
+ const desc = Object.getOwnPropertyDescriptor(target, key);
227
+ if (desc && desc.get) return desc.get.call(receiver);
228
+ const ns = nodesOf(target);
229
+ const holder = keyNode(ns, key, value);
230
+ const current = holder();
231
+ if (!isTrackable(current)) return current;
232
+ if (ns.owner) claim2(current, holder, pathOf(ns.owner.name, key, ns.array), target);
233
+ return box(current);
234
+ },
235
+ set() {
236
+ return true;
237
+ },
238
+ deleteProperty(target, key) {
239
+ if (key in target) writeKey(target, key, void 0);
240
+ return true;
241
+ },
242
+ has(target, key) {
243
+ if (key === $RAW || key === import_signal.$PROXY || key === $NODE || key === $HAS || key === $SELF || key === $TRACK)
244
+ return true;
245
+ keyNode(nodesOf(target), key, target[key])();
246
+ return key in target;
247
+ },
248
+ ownKeys(target) {
249
+ trackKeys(target);
250
+ return Reflect.ownKeys(target);
251
+ },
252
+ getOwnPropertyDescriptor(target, key) {
253
+ return Reflect.getOwnPropertyDescriptor(target, key);
254
+ }
255
+ };
256
+ function rawValue(value, seen = /* @__PURE__ */ new Set()) {
257
+ if (value == null || typeof value !== "object") return value;
258
+ const raw = value[$RAW] ?? value;
259
+ if (seen.has(raw) || !isTrackable(raw)) return raw;
260
+ seen.add(raw);
261
+ let changed = false;
262
+ const swap = (v) => {
263
+ const next = rawValue(v, seen);
264
+ if (next !== v) changed = true;
265
+ return next;
266
+ };
267
+ if (Array.isArray(raw)) {
268
+ const out2 = raw.map(swap);
269
+ return changed ? out2 : raw;
270
+ }
271
+ const out = {};
272
+ for (const k of Object.keys(raw)) out[k] = swap(raw[k]);
273
+ return changed ? out : raw;
274
+ }
275
+ function writeKey(state, key, rawInput) {
276
+ const value = rawValue(rawInput);
277
+ const prev = state[key];
278
+ if (prev === value && (value !== void 0 || key in state)) return;
279
+ const isArray = Array.isArray(state);
280
+ const len = isArray ? state.length : 0;
281
+ if (value === void 0) delete state[key];
282
+ else state[key] = value;
283
+ const ns = nodesOf(state);
284
+ const node = ns.keys.get(key);
285
+ if (node) pokeNode(node, value);
286
+ forgetReplaced(prev, state);
287
+ if (isArray && state.length !== len) {
288
+ const lengthNode = ns.keys.get("length");
289
+ if (lengthNode) pokeNode(lengthNode, state.length);
290
+ }
291
+ if (ns.all) ns.all.$(void 0);
292
+ }
293
+ function nextValue(value, prev) {
294
+ return typeof value === "function" ? value(prev) : value;
295
+ }
296
+ function mergeInto(state, value) {
297
+ for (const key of Object.keys(value)) {
298
+ const next = value[key];
299
+ const prev = state[key];
300
+ if (next && typeof next === "object" && !Array.isArray(next) && prev && typeof prev === "object" && !Array.isArray(prev)) {
301
+ mergeInto(prev, next);
302
+ } else {
303
+ writeKey(state, key, next);
304
+ }
305
+ }
306
+ }
307
+ function parsePath(path) {
308
+ const out = [];
309
+ const normalized = path.replace(/\[([^\]]*)\]/g, ".$1");
310
+ for (const part of normalized.split(".")) if (part.length) out.push(part);
311
+ return out;
312
+ }
313
+ function applyAt(current, segs, value) {
314
+ const last = segs.length - 1;
315
+ for (let i = 0; i < last; i++) {
316
+ const seg = segs[i];
317
+ if (seg === "*") {
318
+ const rest = segs.slice(i + 1);
319
+ if (Array.isArray(current))
320
+ for (let idx = 0; idx < current.length; idx++)
321
+ applyAt(current[idx], rest, value);
322
+ return;
323
+ }
324
+ let next = current[seg];
325
+ if (next == null || typeof next !== "object") {
326
+ next = /^\d+$/.test(segs[i + 1]) ? [] : {};
327
+ writeKey(current, seg, next);
328
+ }
329
+ current = next;
330
+ }
331
+ const term = segs[last];
332
+ if (term === "*") {
333
+ if (Array.isArray(current))
334
+ for (let idx = 0; idx < current.length; idx++)
335
+ writeKey(current, idx, nextValue(value, current[idx]));
336
+ return;
337
+ }
338
+ writeKey(current, term, nextValue(value, current[term]));
339
+ }
340
+ function applyPath(root, path, value) {
341
+ applyAt(root, parsePath(path), value);
342
+ }
343
+ function isPathBatch(value) {
344
+ return Array.isArray(value) && value.length > 0 && value.every((e) => Array.isArray(e) && e.length >= 2 && typeof e[0] === "string");
345
+ }
346
+ function replaceArray(target, next) {
347
+ for (let i = target.length - 1; i >= next.length; i--) writeKey(target, String(i), void 0);
348
+ if (target.length !== next.length) writeKey(target, "length", next.length);
349
+ for (let i = 0; i < next.length; i++) writeKey(target, String(i), next[i]);
350
+ }
351
+ function applySet(root, args) {
352
+ const first = args[0];
353
+ if (typeof first === "function" && args.length === 1) {
354
+ const next = first(root);
355
+ if (next && next !== root) mergeInto(root, next);
356
+ return;
357
+ }
358
+ if (Array.isArray(first) && args.length === 1) {
359
+ if (isPathBatch(first)) {
360
+ for (const entry of first) applyPath(root, entry[0], entry[1]);
361
+ return;
362
+ }
363
+ if (Array.isArray(root)) {
364
+ replaceArray(root, first);
365
+ return;
366
+ }
367
+ if (first.length === 0) return;
368
+ throw new TypeError(
369
+ "[fluixi] set() was given an array that is neither a batch of [path, value] pairs nor a replacement for an array root. Name the path you meant, as in set('items', [...])."
370
+ );
371
+ }
372
+ if (first && typeof first === "object" && !Array.isArray(first) && args.length === 1) {
373
+ mergeInto(root, first);
374
+ return;
375
+ }
376
+ if (Array.isArray(args[1]) && args.length >= 3) {
377
+ applyPath(root, `${first}.${args[1].join(".")}`, args[2]);
378
+ return;
379
+ }
380
+ applyPath(root, String(first), args[1]);
381
+ }
382
+ function clone(value) {
383
+ if (value == null || typeof value !== "object") return value;
384
+ if (Array.isArray(value)) return value.map(clone);
385
+ const out = {};
386
+ for (const key of Object.keys(value)) out[key] = clone(value[key]);
387
+ return out;
388
+ }
389
+ function rawAt(root, path) {
390
+ let cur = root;
391
+ for (const seg of parsePath(path)) {
392
+ if (cur == null) return void 0;
393
+ cur = cur[seg];
394
+ }
395
+ return cur;
396
+ }
397
+ var Store = class {
398
+ constructor(initialState, options = { immutable: true }) {
399
+ this.options = options;
400
+ this.root = initialState;
401
+ this.set = ((...args) => (0, import_signal.batch)(() => applySet(this.root, args)));
402
+ if (initialState && typeof initialState === "object") {
403
+ OWNERS.set(initialState, { store: this, name: options.name ?? "store" });
404
+ ROOTS.set(initialState, initialState);
405
+ }
406
+ reportReactiveNode({
407
+ kind: "store",
408
+ node: this,
409
+ handle: () => this.root,
410
+ name: options.name
411
+ });
412
+ }
413
+ get state() {
414
+ return box(this.root);
415
+ }
416
+ get proxy() {
417
+ return box(this.root);
418
+ }
419
+ get accessor() {
420
+ return (() => box(this.root));
421
+ }
422
+ unwrap() {
423
+ return this.root;
424
+ }
425
+ getNode(key) {
426
+ return this.root && this.root[key];
427
+ }
428
+ // Tracked read at a path. Empty path returns the whole (unwrapped) state.
429
+ get(path) {
430
+ if (path == null || path === "") return unwrap(this.state);
431
+ let cur = this.state;
432
+ for (const seg of parsePath(path)) {
433
+ if (cur == null) return void 0;
434
+ cur = cur[seg];
435
+ }
436
+ return unwrap(cur);
437
+ }
438
+ select(selector) {
439
+ return (0, import_signal.createMemo)(() => selector(this.state));
440
+ }
441
+ subscribe(listener) {
442
+ return (0, import_signal.createEffect)(() => listener(this.state));
443
+ }
444
+ watch(selector, effect) {
445
+ let prev;
446
+ return (0, import_signal.createEffect)(() => {
447
+ const cur = selector(this.state);
448
+ if (!Object.is(cur, prev)) {
449
+ effect(cur, prev);
450
+ prev = cur;
451
+ }
452
+ });
453
+ }
454
+ // Reactive accessor for a top-level key.
455
+ reactive(key) {
456
+ return (0, import_signal.createMemo)(() => this.state[key]);
457
+ }
458
+ produce(producer) {
459
+ this.set(((prev) => {
460
+ const draft = clone(prev);
461
+ producer(draft);
462
+ return draft;
463
+ }));
464
+ }
465
+ reconcile(value, _options = {}) {
466
+ this.set(value);
467
+ }
468
+ push(path, ...items) {
469
+ const arr = rawAt(this.root, path);
470
+ this.set(path, arr.concat(items));
471
+ }
472
+ pop(path) {
473
+ const arr = rawAt(this.root, path).slice();
474
+ const item = arr.pop();
475
+ this.set(path, arr);
476
+ return item;
477
+ }
478
+ shift(path) {
479
+ const arr = rawAt(this.root, path).slice();
480
+ const item = arr.shift();
481
+ this.set(path, arr);
482
+ return item;
483
+ }
484
+ splice(path, start, deleteCount, ...items) {
485
+ const arr = rawAt(this.root, path).slice();
486
+ const removed = arr.splice(start, deleteCount, ...items);
487
+ this.set(path, arr);
488
+ return removed;
489
+ }
490
+ insert(path, index, value) {
491
+ const arr = rawAt(this.root, path).slice();
492
+ arr.splice(index, 0, value);
493
+ this.set(path, arr);
494
+ }
495
+ removeAt(path, index) {
496
+ const arr = rawAt(this.root, path).slice();
497
+ const removed = arr.splice(index, 1);
498
+ this.set(path, arr);
499
+ return removed;
500
+ }
501
+ /**
502
+ * Swap a whole value, rather than merging into it.
503
+ *
504
+ * `set(partial)` merges per key, which is what you want for an object and never what
505
+ * you want for an array. This replaces: `replace(value)` at the root, or
506
+ * `replace(path, value)` further down.
507
+ *
508
+ * @example
509
+ * ```ts
510
+ * const [items, set] = createStore([1, 2, 3]);
511
+ * set.replace([]); // now empty
512
+ * set.replace(['a', 'b']); // now two entries
513
+ * ```
514
+ */
515
+ replace(pathOrValue, maybeValue) {
516
+ if (arguments.length >= 2) {
517
+ const target = rawAt(this.root, String(pathOrValue));
518
+ const next = maybeValue;
519
+ if (Array.isArray(target) && Array.isArray(next)) {
520
+ replaceArray(target, next);
521
+ return;
522
+ }
523
+ this.set(pathOrValue, next);
524
+ return;
525
+ }
526
+ const root = this.root;
527
+ if (Array.isArray(root) && Array.isArray(pathOrValue)) {
528
+ replaceArray(root, pathOrValue);
529
+ return;
530
+ }
531
+ this.set(pathOrValue);
532
+ }
533
+ /**
534
+ * Empty an array, at the root or at a path.
535
+ *
536
+ * @example
537
+ * ```ts
538
+ * set.clear(); // the root array
539
+ * set.clear('todos'); // a nested one
540
+ * ```
541
+ */
542
+ clear(path) {
543
+ const target = path === void 0 ? this.root : rawAt(this.root, path);
544
+ if (Array.isArray(target)) {
545
+ replaceArray(target, []);
546
+ return;
547
+ }
548
+ if (target && typeof target === "object") {
549
+ for (const key of Object.keys(target)) writeKey(target, key, void 0);
550
+ }
551
+ }
552
+ toObservable() {
553
+ const [get] = (0, import_signal.createSignal)(this.state);
554
+ return get.toObservable();
555
+ }
556
+ dispose() {
557
+ }
558
+ };
559
+ var SETTER_METHODS = [
560
+ "get",
561
+ "select",
562
+ "watch",
563
+ "subscribe",
564
+ "produce",
565
+ "reconcile",
566
+ "push",
567
+ "pop",
568
+ "shift",
569
+ "splice",
570
+ "insert",
571
+ "removeAt",
572
+ "replace",
573
+ "clear",
574
+ "unwrap",
575
+ "toObservable"
576
+ ];
577
+ function attachStoreMethods(target, store2) {
578
+ for (const name of SETTER_METHODS) target[name] = store2[name].bind(store2);
579
+ target.$ = store2.reactive.bind(store2);
580
+ }
581
+ function createStore(initialState, options = { immutable: true }) {
582
+ const store2 = new Store(initialState, options);
583
+ attachStoreMethods(store2.set, store2);
584
+ return [store2.proxy, store2.set];
585
+ }
586
+ function createMutableStore(initialState, options = {}) {
587
+ return new Store(initialState, { ...options, immutable: false });
588
+ }
589
+ function unwrap(item) {
590
+ if (item == null || typeof item !== "object") return item;
591
+ const raw = item[$RAW];
592
+ return raw !== void 0 ? raw : item;
593
+ }
594
+ function untrackStore(store2) {
595
+ return (0, import_signal.untrack)(() => unwrap(store2));
596
+ }
597
+ var StoreAPI = Object.freeze({
598
+ createStore,
599
+ createMutableStore,
600
+ batch: import_signal.batch,
601
+ unwrap,
602
+ untrackStore
603
+ });
604
+
605
+ // src/lib/store/api.ts
606
+ function store(initialState, options) {
607
+ const [state, set] = createStore(initialState, options);
608
+ return new Proxy(state, {
609
+ get: (target, key) => key === "set" ? set : target[key],
610
+ has: (target, key) => key === "set" || Reflect.has(target, key)
611
+ });
612
+ }
@@ -3,5 +3,38 @@ import type { Immutable, Store, StoreOptions } from './store.js';
3
3
  export type StoreHandle<T> = Immutable<T> & {
4
4
  set: Store<T>['set'];
5
5
  };
6
+ /**
7
+ * A reactive store you read by property access and write with `.set()`.
8
+ *
9
+ * Tracking is per key and lazy: a signal is created for a key the first time something
10
+ * reads it, so an effect reading one field is untouched by a write to another. Nested
11
+ * objects and arrays are proxied on access, to whatever depth is reached.
12
+ *
13
+ * `options.equals` compares whole states, not individual keys, and `options.name` is
14
+ * what a devtools panel labels the store with.
15
+ *
16
+ * @example An object argument patches the keys it names and leaves the rest:
17
+ * ```ts
18
+ * const user = store({ name: 'Ada', role: 'admin' });
19
+ *
20
+ * effect(() => console.log(user.name)); // subscribes to `name` only
21
+ * user.set({ role: 'owner' }); // the effect does not re-run
22
+ * user.set({ name: 'Grace' }); // now it does
23
+ * ```
24
+ *
25
+ * @example A dot path writes deep without rebuilding the tree above it. Array indices
26
+ * are segments like any other:
27
+ * ```ts
28
+ * const state = store({ todos: [{ done: false }] });
29
+ * state.set('todos.0.done', true);
30
+ * state.set('todos.0.done', (done) => !done); // or derive from the current value
31
+ * ```
32
+ *
33
+ * @example A `set` key of your own is unreachable through this form, because the setter
34
+ * occupies the name. `createStore` hands back a tuple and has no such collision:
35
+ * ```ts
36
+ * const [config, setConfig] = createStore({ set: 'a value' });
37
+ * ```
38
+ */
6
39
  export declare function store<T>(initialState: T, options?: StoreOptions<T>): StoreHandle<T>;
7
40
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/store/api.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,0DAA0D;AAC1D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAErE,wBAAgB,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAUnF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/store/api.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,0DAA0D;AAC1D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAUnF"}