@valbuild/tanstack 0.124.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 (50) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +380 -0
  3. package/client/dist/valbuild-tanstack-client.cjs.d.ts +2 -0
  4. package/client/dist/valbuild-tanstack-client.cjs.dev.js +288 -0
  5. package/client/dist/valbuild-tanstack-client.cjs.js +7 -0
  6. package/client/dist/valbuild-tanstack-client.cjs.prod.js +288 -0
  7. package/client/dist/valbuild-tanstack-client.esm.js +280 -0
  8. package/client/package.json +4 -0
  9. package/dist/ValOverlayContext-87cb022d.esm.js +284 -0
  10. package/dist/ValOverlayContext-abd6ab9a.cjs.prod.js +292 -0
  11. package/dist/ValOverlayContext-d3bfacb1.cjs.dev.js +292 -0
  12. package/dist/createForOfIteratorHelper-0324e063.cjs.prod.js +157 -0
  13. package/dist/createForOfIteratorHelper-485c2ce1.esm.js +151 -0
  14. package/dist/createForOfIteratorHelper-e75681d7.cjs.dev.js +157 -0
  15. package/dist/declarations/src/ValApp.d.ts +6 -0
  16. package/dist/declarations/src/ValImage.d.ts +24 -0
  17. package/dist/declarations/src/ValModulesClient.d.ts +34 -0
  18. package/dist/declarations/src/ValProvider.d.ts +6 -0
  19. package/dist/declarations/src/ValTypes.d.ts +4 -0
  20. package/dist/declarations/src/client/index.d.ts +1 -0
  21. package/dist/declarations/src/client/initValClient.d.ts +27 -0
  22. package/dist/declarations/src/decodeValPathsOfString.d.ts +2 -0
  23. package/dist/declarations/src/external_exempt_from_val_quickjs.d.ts +41 -0
  24. package/dist/declarations/src/getUnpatchedUnencodedVal.d.ts +3 -0
  25. package/dist/declarations/src/index.d.ts +2 -0
  26. package/dist/declarations/src/initVal.d.ts +74 -0
  27. package/dist/declarations/src/server/index.d.ts +5 -0
  28. package/dist/declarations/src/server/initValContent.d.ts +122 -0
  29. package/dist/declarations/src/server/initValMcp.d.ts +27 -0
  30. package/dist/declarations/src/server/initValServer.d.ts +41 -0
  31. package/dist/declarations/src/server/valDraftMode.d.ts +49 -0
  32. package/dist/declarations/src/version.d.ts +1 -0
  33. package/dist/routeFromVal-6693e037.cjs.prod.js +218 -0
  34. package/dist/routeFromVal-728295a0.esm.js +212 -0
  35. package/dist/routeFromVal-a9147ceb.cjs.dev.js +218 -0
  36. package/dist/valbuild-tanstack.cjs.d.ts +2 -0
  37. package/dist/valbuild-tanstack.cjs.dev.js +2005 -0
  38. package/dist/valbuild-tanstack.cjs.js +7 -0
  39. package/dist/valbuild-tanstack.cjs.prod.js +2005 -0
  40. package/dist/valbuild-tanstack.esm.js +1950 -0
  41. package/dist/version-1a88fd21.cjs.dev.js +229 -0
  42. package/dist/version-5ac70ccf.cjs.prod.js +229 -0
  43. package/dist/version-ac8df696.esm.js +225 -0
  44. package/package.json +84 -0
  45. package/server/dist/valbuild-tanstack-server.cjs.d.ts +2 -0
  46. package/server/dist/valbuild-tanstack-server.cjs.dev.js +1032 -0
  47. package/server/dist/valbuild-tanstack-server.cjs.js +7 -0
  48. package/server/dist/valbuild-tanstack-server.cjs.prod.js +1032 -0
  49. package/server/dist/valbuild-tanstack-server.esm.js +1005 -0
  50. package/server/package.json +4 -0
@@ -0,0 +1,284 @@
1
+ import { c as _toPropertyKey, b as _createForOfIteratorHelper, d as _defineProperty } from './createForOfIteratorHelper-485c2ce1.esm.js';
2
+ import { deepEqual } from '@valbuild/core/patch';
3
+ import React from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function _classCallCheck(a, n) {
7
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
8
+ }
9
+
10
+ function _defineProperties(e, r) {
11
+ for (var t = 0; t < r.length; t++) {
12
+ var o = r[t];
13
+ o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
14
+ }
15
+ }
16
+ function _createClass(e, r, t) {
17
+ return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
18
+ writable: !1
19
+ }), e;
20
+ }
21
+
22
+ var LOAD_TIMEOUT_MS = 10000;
23
+ var ValExternalStore = /*#__PURE__*/function () {
24
+ // Path-keyed cache of every source seen via update(). The single source of
25
+ // truth: load state and snapshots are both derived from this, so data can be
26
+ // queried for any combination of paths even before a subscriber registers.
27
+
28
+ // Reference-stable per-subscriberId snapshot cache for useSyncExternalStore.
29
+ // Built lazily from loadedSources in get() and invalidated in update().
30
+
31
+ // One-shot listeners used solely by waitForLoad. Kept separate from the
32
+ // useSyncExternalStore listeners so waitForLoad never has to register (and
33
+ // leak) a subscriberId.
34
+
35
+ function ValExternalStore() {
36
+ var _this = this;
37
+ _classCallCheck(this, ValExternalStore);
38
+ _defineProperty(this, "subscribe", function (paths) {
39
+ return function (listener) {
40
+ var subscriberId = createSubscriberId(paths);
41
+ var existing = _this.listeners.get(subscriberId);
42
+ if (existing) {
43
+ existing.push(listener);
44
+ } else {
45
+ _this.listeners.set(subscriberId, [listener]);
46
+ }
47
+ return function () {
48
+ var current = _this.listeners.get(subscriberId);
49
+ if (!current) return;
50
+ var idx = current.indexOf(listener);
51
+ if (idx >= 0) current.splice(idx, 1);
52
+ if (current.length === 0) _this.listeners["delete"](subscriberId);
53
+ };
54
+ };
55
+ });
56
+ _defineProperty(this, "getSnapshot", function (paths) {
57
+ return function () {
58
+ return _this.get(paths);
59
+ };
60
+ });
61
+ _defineProperty(this, "getServerSnapshot", function (paths) {
62
+ return function () {
63
+ return _this.get(paths);
64
+ };
65
+ });
66
+ _defineProperty(this, "get", function (paths) {
67
+ var subscriberId = createSubscriberId(paths);
68
+ if (_this.snapshots.has(subscriberId)) {
69
+ return _this.snapshots.get(subscriberId);
70
+ }
71
+ // Build the snapshot from the path-keyed loadedSources so data that arrived
72
+ // before this subscriber registered is still returned. Cache it for a
73
+ // reference-stable result (required by useSyncExternalStore).
74
+ var record;
75
+ var _iterator = _createForOfIteratorHelper(paths),
76
+ _step;
77
+ try {
78
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
79
+ var p = _step.value;
80
+ // Json never holds `undefined`, so a defined value means the path loaded.
81
+ var loaded = _this.loadedSources.get(p);
82
+ if (loaded !== undefined) {
83
+ if (!record) {
84
+ record = {};
85
+ }
86
+ record[p] = loaded;
87
+ }
88
+ }
89
+ } catch (err) {
90
+ _iterator.e(err);
91
+ } finally {
92
+ _iterator.f();
93
+ }
94
+ _this.snapshots.set(subscriberId, record);
95
+ return record;
96
+ });
97
+ _defineProperty(this, "hasAllLoaded", function (paths) {
98
+ var _iterator2 = _createForOfIteratorHelper(paths),
99
+ _step2;
100
+ try {
101
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
102
+ var p = _step2.value;
103
+ if (!_this.loadedSources.has(p)) {
104
+ return false;
105
+ }
106
+ }
107
+ } catch (err) {
108
+ _iterator2.e(err);
109
+ } finally {
110
+ _iterator2.f();
111
+ }
112
+ return true;
113
+ });
114
+ /**
115
+ * Returns a cached promise that resolves once `update()` has populated
116
+ * every path in `paths`. The same promise instance is returned for the
117
+ * same paths until it resolves — required so `React.use` / classic
118
+ * Suspense doesn't re-suspend on every render.
119
+ *
120
+ * If the data never arrives (network failure, a path that is never
121
+ * `update()`'d, a typo in a module path) the promise would otherwise hang
122
+ * forever and keep the Suspense boundary in its fallback. To avoid a silent
123
+ * hang it resolves anyway after `LOAD_TIMEOUT_MS`, logging an error so the
124
+ * failure is diagnosable while the page still renders with partial data.
125
+ */
126
+ _defineProperty(this, "waitForLoad", function (paths) {
127
+ if (_this.hasAllLoaded(paths)) {
128
+ return Promise.resolve();
129
+ }
130
+ var subscriberId = createSubscriberId(paths);
131
+ var existing = _this.loadPromises.get(subscriberId);
132
+ if (existing) {
133
+ return existing;
134
+ }
135
+ var promise = new Promise(function (resolve) {
136
+ var cleanup = function cleanup() {
137
+ clearTimeout(timeout);
138
+ _this.loadListeners["delete"](listener);
139
+ _this.loadPromises["delete"](subscriberId);
140
+ };
141
+ var listener = function listener() {
142
+ if (_this.hasAllLoaded(paths)) {
143
+ cleanup();
144
+ resolve();
145
+ }
146
+ };
147
+ var timeout = setTimeout(function () {
148
+ var missing = paths.filter(function (p) {
149
+ return !_this.loadedSources.has(p);
150
+ });
151
+ console.error("Val: draft module(s) did not load within ".concat(LOAD_TIMEOUT_MS, "ms; rendering with partial data. Missing: ").concat(missing.join(", ")));
152
+ cleanup();
153
+ resolve();
154
+ }, LOAD_TIMEOUT_MS);
155
+ // Don't let the pending timer keep a Node process (e.g. the test runner
156
+ // or SSR) alive; setTimeout returns a number in the browser, where there
157
+ // is nothing to unref.
158
+ if (typeof timeout !== "number") {
159
+ timeout.unref();
160
+ }
161
+ _this.loadListeners.add(listener);
162
+ });
163
+ _this.loadPromises.set(subscriberId, promise);
164
+ return promise;
165
+ });
166
+ this.listeners = new Map();
167
+ this.loadPromises = new Map();
168
+ this.loadedSources = new Map();
169
+ this.snapshots = new Map();
170
+ this.loadListeners = new Set();
171
+ }
172
+ return _createClass(ValExternalStore, [{
173
+ key: "update",
174
+ value:
175
+ /**
176
+ * Take a module's source from the editor.
177
+ *
178
+ * Returns whether this actually MOVED the value, which the caller needs and
179
+ * cannot work out for itself: the same source arrives more than once by
180
+ * design. The editor sends a catch-up snapshot of everything it holds every
181
+ * time the page becomes a new document — a reload, or the one the dev server does
182
+ * when a publish rewrites the `.val.ts` files — and most of that snapshot is
183
+ * content this page already has.
184
+ *
185
+ * Without the answer, `ValTanStackProvider` armed its `router.invalidate()` loop on
186
+ * the arrival rather than on the change, so every publish bought a whole-route
187
+ * request whether or not the page was out of date. With auto-save on that is
188
+ * one per pause in typing, which in development is a re-render (and sometimes
189
+ * a recompile) of the page — and it is what leaves the canvas looking
190
+ * permanently busy.
191
+ */
192
+ function update(path, source) {
193
+ // `Json` has no `undefined`, so absent and "stored as undefined" cannot be
194
+ // confused: a miss here means this page has never been given this module.
195
+ var before = this.loadedSources.get(path);
196
+ var changed = before === undefined || !deepEqual(before, source);
197
+ this.loadedSources.set(path, source);
198
+ if (!changed) {
199
+ // Nothing downstream to do: every subscriber's snapshot still answers
200
+ // with the same value, so invalidating them would be a re-render that
201
+ // shows exactly what is already on screen.
202
+ return false;
203
+ }
204
+ // Invalidate cached snapshots that include this path so the next get()
205
+ // rebuilds a fresh (new-reference) record, then notify their listeners.
206
+ for (var _i = 0, _Array$from = Array.from(this.snapshots.keys()); _i < _Array$from.length; _i++) {
207
+ var subscriberId = _Array$from[_i];
208
+ if (subscriberId.includes(path)) {
209
+ // TODO: hash paths instead
210
+ this.snapshots["delete"](subscriberId);
211
+ }
212
+ }
213
+ var _iterator3 = _createForOfIteratorHelper(this.listeners.keys()),
214
+ _step3;
215
+ try {
216
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
217
+ var _subscriberId = _step3.value;
218
+ if (_subscriberId.includes(path)) {
219
+ this.emitChange(_subscriberId);
220
+ }
221
+ }
222
+ } catch (err) {
223
+ _iterator3.e(err);
224
+ } finally {
225
+ _iterator3.f();
226
+ }
227
+ for (var _i2 = 0, _Array$from2 = Array.from(this.loadListeners); _i2 < _Array$from2.length; _i2++) {
228
+ var listener = _Array$from2[_i2];
229
+ listener();
230
+ }
231
+ return true;
232
+ }
233
+ }, {
234
+ key: "emitChange",
235
+ value: function emitChange(subscriberId) {
236
+ var _this$listeners$get;
237
+ var _iterator4 = _createForOfIteratorHelper((_this$listeners$get = this.listeners.get(subscriberId)) !== null && _this$listeners$get !== void 0 ? _this$listeners$get : []),
238
+ _step4;
239
+ try {
240
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
241
+ var listener = _step4.value;
242
+ listener();
243
+ }
244
+ } catch (err) {
245
+ _iterator4.e(err);
246
+ } finally {
247
+ _iterator4.f();
248
+ }
249
+ }
250
+ }]);
251
+ }();
252
+ function createSubscriberId(paths) {
253
+ return paths.slice().sort().join("&");
254
+ }
255
+ var ValOverlayContext = /*#__PURE__*/React.createContext({
256
+ store: undefined,
257
+ draftMode: false,
258
+ suspend: false,
259
+ draftModeReady: undefined,
260
+ draftSourcesSynced: false
261
+ });
262
+ function ValOverlayProvider(_ref) {
263
+ var store = _ref.store,
264
+ draftMode = _ref.draftMode,
265
+ suspend = _ref.suspend,
266
+ draftModeReady = _ref.draftModeReady,
267
+ draftSourcesSynced = _ref.draftSourcesSynced,
268
+ children = _ref.children;
269
+ return /*#__PURE__*/jsx(ValOverlayContext.Provider, {
270
+ value: {
271
+ store: store,
272
+ draftMode: draftMode,
273
+ suspend: suspend,
274
+ draftModeReady: draftModeReady,
275
+ draftSourcesSynced: draftSourcesSynced
276
+ },
277
+ children: children
278
+ });
279
+ }
280
+ var useValOverlayContext = function useValOverlayContext() {
281
+ return React.useContext(ValOverlayContext);
282
+ };
283
+
284
+ export { ValExternalStore as V, ValOverlayProvider as a, useValOverlayContext as u };
@@ -0,0 +1,292 @@
1
+ 'use strict';
2
+
3
+ var createForOfIteratorHelper = require('./createForOfIteratorHelper-0324e063.cjs.prod.js');
4
+ var patch = require('@valbuild/core/patch');
5
+ var React = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
9
+
10
+ var React__default = /*#__PURE__*/_interopDefault(React);
11
+
12
+ function _classCallCheck(a, n) {
13
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
14
+ }
15
+
16
+ function _defineProperties(e, r) {
17
+ for (var t = 0; t < r.length; t++) {
18
+ var o = r[t];
19
+ o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, createForOfIteratorHelper._toPropertyKey(o.key), o);
20
+ }
21
+ }
22
+ function _createClass(e, r, t) {
23
+ return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
24
+ writable: !1
25
+ }), e;
26
+ }
27
+
28
+ var LOAD_TIMEOUT_MS = 10000;
29
+ var ValExternalStore = /*#__PURE__*/function () {
30
+ // Path-keyed cache of every source seen via update(). The single source of
31
+ // truth: load state and snapshots are both derived from this, so data can be
32
+ // queried for any combination of paths even before a subscriber registers.
33
+
34
+ // Reference-stable per-subscriberId snapshot cache for useSyncExternalStore.
35
+ // Built lazily from loadedSources in get() and invalidated in update().
36
+
37
+ // One-shot listeners used solely by waitForLoad. Kept separate from the
38
+ // useSyncExternalStore listeners so waitForLoad never has to register (and
39
+ // leak) a subscriberId.
40
+
41
+ function ValExternalStore() {
42
+ var _this = this;
43
+ _classCallCheck(this, ValExternalStore);
44
+ createForOfIteratorHelper._defineProperty(this, "subscribe", function (paths) {
45
+ return function (listener) {
46
+ var subscriberId = createSubscriberId(paths);
47
+ var existing = _this.listeners.get(subscriberId);
48
+ if (existing) {
49
+ existing.push(listener);
50
+ } else {
51
+ _this.listeners.set(subscriberId, [listener]);
52
+ }
53
+ return function () {
54
+ var current = _this.listeners.get(subscriberId);
55
+ if (!current) return;
56
+ var idx = current.indexOf(listener);
57
+ if (idx >= 0) current.splice(idx, 1);
58
+ if (current.length === 0) _this.listeners["delete"](subscriberId);
59
+ };
60
+ };
61
+ });
62
+ createForOfIteratorHelper._defineProperty(this, "getSnapshot", function (paths) {
63
+ return function () {
64
+ return _this.get(paths);
65
+ };
66
+ });
67
+ createForOfIteratorHelper._defineProperty(this, "getServerSnapshot", function (paths) {
68
+ return function () {
69
+ return _this.get(paths);
70
+ };
71
+ });
72
+ createForOfIteratorHelper._defineProperty(this, "get", function (paths) {
73
+ var subscriberId = createSubscriberId(paths);
74
+ if (_this.snapshots.has(subscriberId)) {
75
+ return _this.snapshots.get(subscriberId);
76
+ }
77
+ // Build the snapshot from the path-keyed loadedSources so data that arrived
78
+ // before this subscriber registered is still returned. Cache it for a
79
+ // reference-stable result (required by useSyncExternalStore).
80
+ var record;
81
+ var _iterator = createForOfIteratorHelper._createForOfIteratorHelper(paths),
82
+ _step;
83
+ try {
84
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
85
+ var p = _step.value;
86
+ // Json never holds `undefined`, so a defined value means the path loaded.
87
+ var loaded = _this.loadedSources.get(p);
88
+ if (loaded !== undefined) {
89
+ if (!record) {
90
+ record = {};
91
+ }
92
+ record[p] = loaded;
93
+ }
94
+ }
95
+ } catch (err) {
96
+ _iterator.e(err);
97
+ } finally {
98
+ _iterator.f();
99
+ }
100
+ _this.snapshots.set(subscriberId, record);
101
+ return record;
102
+ });
103
+ createForOfIteratorHelper._defineProperty(this, "hasAllLoaded", function (paths) {
104
+ var _iterator2 = createForOfIteratorHelper._createForOfIteratorHelper(paths),
105
+ _step2;
106
+ try {
107
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
108
+ var p = _step2.value;
109
+ if (!_this.loadedSources.has(p)) {
110
+ return false;
111
+ }
112
+ }
113
+ } catch (err) {
114
+ _iterator2.e(err);
115
+ } finally {
116
+ _iterator2.f();
117
+ }
118
+ return true;
119
+ });
120
+ /**
121
+ * Returns a cached promise that resolves once `update()` has populated
122
+ * every path in `paths`. The same promise instance is returned for the
123
+ * same paths until it resolves — required so `React.use` / classic
124
+ * Suspense doesn't re-suspend on every render.
125
+ *
126
+ * If the data never arrives (network failure, a path that is never
127
+ * `update()`'d, a typo in a module path) the promise would otherwise hang
128
+ * forever and keep the Suspense boundary in its fallback. To avoid a silent
129
+ * hang it resolves anyway after `LOAD_TIMEOUT_MS`, logging an error so the
130
+ * failure is diagnosable while the page still renders with partial data.
131
+ */
132
+ createForOfIteratorHelper._defineProperty(this, "waitForLoad", function (paths) {
133
+ if (_this.hasAllLoaded(paths)) {
134
+ return Promise.resolve();
135
+ }
136
+ var subscriberId = createSubscriberId(paths);
137
+ var existing = _this.loadPromises.get(subscriberId);
138
+ if (existing) {
139
+ return existing;
140
+ }
141
+ var promise = new Promise(function (resolve) {
142
+ var cleanup = function cleanup() {
143
+ clearTimeout(timeout);
144
+ _this.loadListeners["delete"](listener);
145
+ _this.loadPromises["delete"](subscriberId);
146
+ };
147
+ var listener = function listener() {
148
+ if (_this.hasAllLoaded(paths)) {
149
+ cleanup();
150
+ resolve();
151
+ }
152
+ };
153
+ var timeout = setTimeout(function () {
154
+ var missing = paths.filter(function (p) {
155
+ return !_this.loadedSources.has(p);
156
+ });
157
+ console.error("Val: draft module(s) did not load within ".concat(LOAD_TIMEOUT_MS, "ms; rendering with partial data. Missing: ").concat(missing.join(", ")));
158
+ cleanup();
159
+ resolve();
160
+ }, LOAD_TIMEOUT_MS);
161
+ // Don't let the pending timer keep a Node process (e.g. the test runner
162
+ // or SSR) alive; setTimeout returns a number in the browser, where there
163
+ // is nothing to unref.
164
+ if (typeof timeout !== "number") {
165
+ timeout.unref();
166
+ }
167
+ _this.loadListeners.add(listener);
168
+ });
169
+ _this.loadPromises.set(subscriberId, promise);
170
+ return promise;
171
+ });
172
+ this.listeners = new Map();
173
+ this.loadPromises = new Map();
174
+ this.loadedSources = new Map();
175
+ this.snapshots = new Map();
176
+ this.loadListeners = new Set();
177
+ }
178
+ return _createClass(ValExternalStore, [{
179
+ key: "update",
180
+ value:
181
+ /**
182
+ * Take a module's source from the editor.
183
+ *
184
+ * Returns whether this actually MOVED the value, which the caller needs and
185
+ * cannot work out for itself: the same source arrives more than once by
186
+ * design. The editor sends a catch-up snapshot of everything it holds every
187
+ * time the page becomes a new document — a reload, or the one the dev server does
188
+ * when a publish rewrites the `.val.ts` files — and most of that snapshot is
189
+ * content this page already has.
190
+ *
191
+ * Without the answer, `ValTanStackProvider` armed its `router.invalidate()` loop on
192
+ * the arrival rather than on the change, so every publish bought a whole-route
193
+ * request whether or not the page was out of date. With auto-save on that is
194
+ * one per pause in typing, which in development is a re-render (and sometimes
195
+ * a recompile) of the page — and it is what leaves the canvas looking
196
+ * permanently busy.
197
+ */
198
+ function update(path, source) {
199
+ // `Json` has no `undefined`, so absent and "stored as undefined" cannot be
200
+ // confused: a miss here means this page has never been given this module.
201
+ var before = this.loadedSources.get(path);
202
+ var changed = before === undefined || !patch.deepEqual(before, source);
203
+ this.loadedSources.set(path, source);
204
+ if (!changed) {
205
+ // Nothing downstream to do: every subscriber's snapshot still answers
206
+ // with the same value, so invalidating them would be a re-render that
207
+ // shows exactly what is already on screen.
208
+ return false;
209
+ }
210
+ // Invalidate cached snapshots that include this path so the next get()
211
+ // rebuilds a fresh (new-reference) record, then notify their listeners.
212
+ for (var _i = 0, _Array$from = Array.from(this.snapshots.keys()); _i < _Array$from.length; _i++) {
213
+ var subscriberId = _Array$from[_i];
214
+ if (subscriberId.includes(path)) {
215
+ // TODO: hash paths instead
216
+ this.snapshots["delete"](subscriberId);
217
+ }
218
+ }
219
+ var _iterator3 = createForOfIteratorHelper._createForOfIteratorHelper(this.listeners.keys()),
220
+ _step3;
221
+ try {
222
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
223
+ var _subscriberId = _step3.value;
224
+ if (_subscriberId.includes(path)) {
225
+ this.emitChange(_subscriberId);
226
+ }
227
+ }
228
+ } catch (err) {
229
+ _iterator3.e(err);
230
+ } finally {
231
+ _iterator3.f();
232
+ }
233
+ for (var _i2 = 0, _Array$from2 = Array.from(this.loadListeners); _i2 < _Array$from2.length; _i2++) {
234
+ var listener = _Array$from2[_i2];
235
+ listener();
236
+ }
237
+ return true;
238
+ }
239
+ }, {
240
+ key: "emitChange",
241
+ value: function emitChange(subscriberId) {
242
+ var _this$listeners$get;
243
+ var _iterator4 = createForOfIteratorHelper._createForOfIteratorHelper((_this$listeners$get = this.listeners.get(subscriberId)) !== null && _this$listeners$get !== void 0 ? _this$listeners$get : []),
244
+ _step4;
245
+ try {
246
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
247
+ var listener = _step4.value;
248
+ listener();
249
+ }
250
+ } catch (err) {
251
+ _iterator4.e(err);
252
+ } finally {
253
+ _iterator4.f();
254
+ }
255
+ }
256
+ }]);
257
+ }();
258
+ function createSubscriberId(paths) {
259
+ return paths.slice().sort().join("&");
260
+ }
261
+ var ValOverlayContext = /*#__PURE__*/React__default["default"].createContext({
262
+ store: undefined,
263
+ draftMode: false,
264
+ suspend: false,
265
+ draftModeReady: undefined,
266
+ draftSourcesSynced: false
267
+ });
268
+ function ValOverlayProvider(_ref) {
269
+ var store = _ref.store,
270
+ draftMode = _ref.draftMode,
271
+ suspend = _ref.suspend,
272
+ draftModeReady = _ref.draftModeReady,
273
+ draftSourcesSynced = _ref.draftSourcesSynced,
274
+ children = _ref.children;
275
+ return /*#__PURE__*/jsxRuntime.jsx(ValOverlayContext.Provider, {
276
+ value: {
277
+ store: store,
278
+ draftMode: draftMode,
279
+ suspend: suspend,
280
+ draftModeReady: draftModeReady,
281
+ draftSourcesSynced: draftSourcesSynced
282
+ },
283
+ children: children
284
+ });
285
+ }
286
+ var useValOverlayContext = function useValOverlayContext() {
287
+ return React__default["default"].useContext(ValOverlayContext);
288
+ };
289
+
290
+ exports.ValExternalStore = ValExternalStore;
291
+ exports.ValOverlayProvider = ValOverlayProvider;
292
+ exports.useValOverlayContext = useValOverlayContext;