cross-state 0.32.0 → 0.33.1
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.
- package/dist/cjs/cache.cjs +381 -0
- package/dist/cjs/cache.cjs.map +1 -0
- package/dist/cjs/index.cjs +9 -9
- package/dist/cjs/react/index.cjs +15 -13
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/react/register.cjs +11 -11
- package/dist/cjs/react/register.cjs.map +1 -1
- package/dist/cjs/scope.cjs +11 -373
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/cjs/{scope2.cjs → useCache.cjs} +63 -27
- package/dist/cjs/useCache.cjs.map +1 -0
- package/dist/es/cache.mjs +382 -0
- package/dist/es/cache.mjs.map +1 -0
- package/dist/es/index.mjs +6 -6
- package/dist/es/react/index.mjs +6 -4
- package/dist/es/react/register.mjs +3 -3
- package/dist/es/scope.mjs +13 -375
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/{scope2.mjs → useCache.mjs} +65 -29
- package/dist/es/useCache.mjs.map +1 -0
- package/dist/types/react/index.d.ts +1 -0
- package/dist/types/react/loadingBoundary.d.ts +22 -0
- package/dist/types/react/useCache.d.ts +23 -1
- package/package.json +2 -2
- package/dist/cjs/hash.cjs +0 -18
- package/dist/cjs/hash.cjs.map +0 -1
- package/dist/cjs/scope2.cjs.map +0 -1
- package/dist/es/hash.mjs +0 -19
- package/dist/es/hash.mjs.map +0 -1
- package/dist/es/scope2.mjs.map +0 -1
package/dist/cjs/scope.cjs
CHANGED
|
@@ -1,377 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const store = require("./store.cjs");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
this.name = name;
|
|
7
|
-
this.refMap = /* @__PURE__ */ new WeakMap();
|
|
8
|
-
this.refSet = /* @__PURE__ */ new Set();
|
|
9
|
-
store.autobind(ResourceGroup);
|
|
3
|
+
function hash(value) {
|
|
4
|
+
if (value instanceof Set) {
|
|
5
|
+
return `s[${[...value].map(hash).sort().join(",")}]`;
|
|
10
6
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
this.refMap.set(resource, ref);
|
|
14
|
-
this.refSet.add(ref);
|
|
7
|
+
if (value instanceof Map) {
|
|
8
|
+
return `m[${[...value.entries()].map(hash).sort().join(",")}]`;
|
|
15
9
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (ref) {
|
|
19
|
-
this.refMap.delete(resource);
|
|
20
|
-
this.refSet.delete(ref);
|
|
21
|
-
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return `[${value.map(hash).join(",")}]`;
|
|
22
12
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const resource = ref.deref();
|
|
26
|
-
if (resource) {
|
|
27
|
-
resource.invalidateAll();
|
|
28
|
-
} else {
|
|
29
|
-
this.refSet.delete(ref);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
clearAll() {
|
|
34
|
-
for (const ref of this.refSet) {
|
|
35
|
-
const resource = ref.deref();
|
|
36
|
-
if (resource) {
|
|
37
|
-
resource.clearAll();
|
|
38
|
-
} else {
|
|
39
|
-
this.refSet.delete(ref);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const allResources = /* @__PURE__ */ new ResourceGroup();
|
|
45
|
-
function createResourceGroup(name) {
|
|
46
|
-
return new ResourceGroup(name);
|
|
47
|
-
}
|
|
48
|
-
class InstanceCache {
|
|
49
|
-
constructor(factory, cacheTime) {
|
|
50
|
-
this.factory = factory;
|
|
51
|
-
this.cacheTime = cacheTime;
|
|
52
|
-
this.cache = /* @__PURE__ */ new Map();
|
|
53
|
-
this.interval = this.cacheTime ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1)) : void 0;
|
|
54
|
-
}
|
|
55
|
-
cleanup() {
|
|
56
|
-
var _a;
|
|
57
|
-
const cutoff = this.now() - (this.cacheTime ?? 0);
|
|
58
|
-
for (const [key, entry] of this.cache.entries()) {
|
|
59
|
-
if (entry.ref && entry.t <= cutoff) {
|
|
60
|
-
delete entry.ref;
|
|
61
|
-
}
|
|
62
|
-
if (!entry.ref && !((_a = entry.weakRef) == null ? void 0 : _a.deref())) {
|
|
63
|
-
this.cache.delete(key);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
get(...args) {
|
|
68
|
-
var _a;
|
|
69
|
-
const key = hash.hash(args);
|
|
70
|
-
let entry = this.cache.get(key);
|
|
71
|
-
let value = (entry == null ? void 0 : entry.ref) ?? ((_a = entry == null ? void 0 : entry.weakRef) == null ? void 0 : _a.deref());
|
|
72
|
-
if (!entry || !value) {
|
|
73
|
-
value = this.factory(...args);
|
|
74
|
-
entry = {
|
|
75
|
-
t: this.now(),
|
|
76
|
-
ref: value,
|
|
77
|
-
weakRef: new WeakRef(value)
|
|
78
|
-
};
|
|
79
|
-
this.cache.set(key, entry);
|
|
80
|
-
} else {
|
|
81
|
-
entry.t = this.now();
|
|
82
|
-
entry.ref ?? (entry.ref = value);
|
|
83
|
-
}
|
|
84
|
-
return value;
|
|
85
|
-
}
|
|
86
|
-
values() {
|
|
87
|
-
return [...this.cache.values()].map((entry) => {
|
|
88
|
-
var _a;
|
|
89
|
-
return entry.ref ?? ((_a = entry.weakRef) == null ? void 0 : _a.deref());
|
|
90
|
-
}).filter((value) => !!value);
|
|
91
|
-
}
|
|
92
|
-
stop() {
|
|
93
|
-
if (this.interval) {
|
|
94
|
-
clearInterval(this.interval);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
stats() {
|
|
98
|
-
return {
|
|
99
|
-
count: this.cache.size,
|
|
100
|
-
withRef: [...this.cache.values()].filter((x) => !!x.ref).length,
|
|
101
|
-
withWeakRef: [...this.cache.values()].filter((x) => {
|
|
102
|
-
var _a;
|
|
103
|
-
return !!((_a = x.weakRef) == null ? void 0 : _a.deref());
|
|
104
|
-
}).length
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
now() {
|
|
108
|
-
return performance.now();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
class PromiseWithState extends Promise {
|
|
112
|
-
constructor(value, state = { status: "pending" }) {
|
|
113
|
-
super((resolve) => resolve(value));
|
|
114
|
-
this.state = state;
|
|
115
|
-
value.then((value2) => {
|
|
116
|
-
this.state = { status: "value", value: value2 };
|
|
117
|
-
}).catch((error) => {
|
|
118
|
-
this.state = { status: "error", error };
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
static resolve(value) {
|
|
122
|
-
return new PromiseWithState(Promise.resolve(value), {
|
|
123
|
-
status: "value",
|
|
124
|
-
value
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
static reject(error) {
|
|
128
|
-
return new PromiseWithState(Promise.reject(error), { status: "error", error });
|
|
13
|
+
if (value instanceof Object) {
|
|
14
|
+
return `o[${Object.entries(value).map(hash).sort().join(",")}]`;
|
|
129
15
|
}
|
|
16
|
+
return JSON.stringify(value);
|
|
130
17
|
}
|
|
131
|
-
class Cache extends store.Store {
|
|
132
|
-
constructor(getter, options = {}, derivedFromCache, _call) {
|
|
133
|
-
super(
|
|
134
|
-
function() {
|
|
135
|
-
let result = getter.apply(this);
|
|
136
|
-
if (result instanceof Function) {
|
|
137
|
-
result = result(this);
|
|
138
|
-
}
|
|
139
|
-
return result;
|
|
140
|
-
},
|
|
141
|
-
options,
|
|
142
|
-
void 0,
|
|
143
|
-
_call
|
|
144
|
-
);
|
|
145
|
-
this.options = options;
|
|
146
|
-
this.derivedFromCache = derivedFromCache;
|
|
147
|
-
this.state = store.createStore({
|
|
148
|
-
status: "pending",
|
|
149
|
-
isStale: true,
|
|
150
|
-
isUpdating: false
|
|
151
|
-
});
|
|
152
|
-
store.autobind(Cache);
|
|
153
|
-
this.calculationHelper.options.onInvalidate = () => this.invalidate({ invalidateDependencies: false });
|
|
154
|
-
this.watchPromise();
|
|
155
|
-
this.watchFocus();
|
|
156
|
-
}
|
|
157
|
-
get({ update = "whenStale", backgroundUpdate = false } = {}) {
|
|
158
|
-
var _a;
|
|
159
|
-
const promise = (_a = this._value) == null ? void 0 : _a.v;
|
|
160
|
-
const stalePromise = this.stalePromise;
|
|
161
|
-
if (update === "whenMissing" && !promise && !stalePromise || update === "whenStale" && !promise || update === "force") {
|
|
162
|
-
this.calculationHelper.execute();
|
|
163
|
-
if (!promise && !stalePromise || !backgroundUpdate) {
|
|
164
|
-
return super.get();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (!promise || stalePromise && backgroundUpdate) {
|
|
168
|
-
return stalePromise;
|
|
169
|
-
}
|
|
170
|
-
return promise;
|
|
171
|
-
}
|
|
172
|
-
updateValue(value) {
|
|
173
|
-
this.set(PromiseWithState.resolve(value));
|
|
174
|
-
}
|
|
175
|
-
updateError(error) {
|
|
176
|
-
this.set(PromiseWithState.reject(error));
|
|
177
|
-
}
|
|
178
|
-
invalidate({ invalidateDependencies = true } = {}) {
|
|
179
|
-
var _a;
|
|
180
|
-
const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;
|
|
181
|
-
if (clearOnInvalidate) {
|
|
182
|
-
return this.clear({ invalidateDependencies });
|
|
183
|
-
}
|
|
184
|
-
if (invalidateDependencies) {
|
|
185
|
-
this.calculationHelper.invalidateDependencies();
|
|
186
|
-
}
|
|
187
|
-
const { status, isStale, isUpdating } = this.state.get();
|
|
188
|
-
if (status !== "pending" && !isStale && !isUpdating) {
|
|
189
|
-
this.stalePromise = (_a = this._value) == null ? void 0 : _a.v;
|
|
190
|
-
}
|
|
191
|
-
this.state.set((state) => ({
|
|
192
|
-
...state,
|
|
193
|
-
isStale: true,
|
|
194
|
-
isUpdating: false
|
|
195
|
-
}));
|
|
196
|
-
this.calculationHelper.stop();
|
|
197
|
-
super.reset();
|
|
198
|
-
}
|
|
199
|
-
clear({ invalidateDependencies = true } = {}) {
|
|
200
|
-
if (invalidateDependencies) {
|
|
201
|
-
this.calculationHelper.invalidateDependencies();
|
|
202
|
-
}
|
|
203
|
-
this.state.set({
|
|
204
|
-
status: "pending",
|
|
205
|
-
isStale: true,
|
|
206
|
-
isUpdating: false
|
|
207
|
-
});
|
|
208
|
-
delete this.stalePromise;
|
|
209
|
-
this.calculationHelper.stop();
|
|
210
|
-
super.reset();
|
|
211
|
-
}
|
|
212
|
-
mapValue(_selector) {
|
|
213
|
-
const selector = store.makeSelector(_selector);
|
|
214
|
-
const derivedFromCache = {
|
|
215
|
-
cache: this.derivedFromCache ? this.derivedFromCache.cache : this,
|
|
216
|
-
selectors: this.derivedFromCache ? [...this.derivedFromCache.selectors, _selector] : [_selector]
|
|
217
|
-
};
|
|
218
|
-
const that = this;
|
|
219
|
-
return new Cache(
|
|
220
|
-
async function() {
|
|
221
|
-
const value = await this.use(that);
|
|
222
|
-
return selector(value);
|
|
223
|
-
},
|
|
224
|
-
{},
|
|
225
|
-
derivedFromCache
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
watchPromise() {
|
|
229
|
-
this.subscribe(
|
|
230
|
-
async (promise) => {
|
|
231
|
-
var _a, _b;
|
|
232
|
-
if (promise instanceof PromiseWithState) {
|
|
233
|
-
this.state.set({
|
|
234
|
-
...promise.state,
|
|
235
|
-
isStale: false,
|
|
236
|
-
isUpdating: false
|
|
237
|
-
});
|
|
238
|
-
delete this.stalePromise;
|
|
239
|
-
this.setTimers();
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
this.state.set((state) => ({
|
|
243
|
-
...state,
|
|
244
|
-
isUpdating: true
|
|
245
|
-
}));
|
|
246
|
-
this.setTimers();
|
|
247
|
-
try {
|
|
248
|
-
const value = await promise;
|
|
249
|
-
if (promise !== ((_a = this._value) == null ? void 0 : _a.v)) {
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
this.state.set({
|
|
253
|
-
status: "value",
|
|
254
|
-
value,
|
|
255
|
-
isStale: false,
|
|
256
|
-
isUpdating: false
|
|
257
|
-
});
|
|
258
|
-
delete this.stalePromise;
|
|
259
|
-
this.setTimers();
|
|
260
|
-
} catch (error) {
|
|
261
|
-
if (promise !== ((_b = this._value) == null ? void 0 : _b.v)) {
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
this.state.set({
|
|
265
|
-
status: "error",
|
|
266
|
-
error,
|
|
267
|
-
isStale: false,
|
|
268
|
-
isUpdating: false
|
|
269
|
-
});
|
|
270
|
-
delete this.stalePromise;
|
|
271
|
-
this.setTimers();
|
|
272
|
-
}
|
|
273
|
-
},
|
|
274
|
-
{ passive: true }
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
setTimers() {
|
|
278
|
-
if (this.invalidationTimer) {
|
|
279
|
-
clearTimeout(this.invalidationTimer);
|
|
280
|
-
}
|
|
281
|
-
this.invalidationTimer = void 0;
|
|
282
|
-
const state = this.state.get();
|
|
283
|
-
let { invalidateAfter = createCache.defaultOptions.invalidateAfter } = this.options;
|
|
284
|
-
const ref = new WeakRef(this);
|
|
285
|
-
if (state.status === "pending") {
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
if (invalidateAfter instanceof Function) {
|
|
289
|
-
invalidateAfter = invalidateAfter(state);
|
|
290
|
-
}
|
|
291
|
-
if (invalidateAfter !== null && invalidateAfter !== void 0) {
|
|
292
|
-
this.invalidationTimer = setTimeout(
|
|
293
|
-
() => {
|
|
294
|
-
var _a;
|
|
295
|
-
return (_a = ref == null ? void 0 : ref.deref()) == null ? void 0 : _a.invalidate();
|
|
296
|
-
},
|
|
297
|
-
store.calcDuration(invalidateAfter)
|
|
298
|
-
);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
watchFocus() {
|
|
302
|
-
const { invalidateOnWindowFocus = createCache.defaultOptions.invalidateOnWindowFocus } = this.options;
|
|
303
|
-
if (!invalidateOnWindowFocus || typeof document === "undefined" || typeof document.addEventListener === "undefined") {
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
const ref = new WeakRef(this);
|
|
307
|
-
const onFocus = () => {
|
|
308
|
-
const that = ref == null ? void 0 : ref.deref();
|
|
309
|
-
if (!that) {
|
|
310
|
-
document.removeEventListener("visibilitychange", onFocus);
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
if (!document.hidden) {
|
|
314
|
-
that.invalidate();
|
|
315
|
-
}
|
|
316
|
-
};
|
|
317
|
-
document.addEventListener("visibilitychange", onFocus);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
function create(cacheFunction, options) {
|
|
321
|
-
const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } = options ?? {};
|
|
322
|
-
let baseInstance;
|
|
323
|
-
const instanceCache = new InstanceCache(
|
|
324
|
-
(...args) => {
|
|
325
|
-
if (args.length === 0 && baseInstance) {
|
|
326
|
-
return baseInstance;
|
|
327
|
-
}
|
|
328
|
-
return new Cache(function() {
|
|
329
|
-
return cacheFunction.apply(this, args);
|
|
330
|
-
}, options);
|
|
331
|
-
},
|
|
332
|
-
clearUnusedAfter ? store.calcDuration(clearUnusedAfter) : void 0
|
|
333
|
-
);
|
|
334
|
-
const get = (...args) => {
|
|
335
|
-
return instanceCache.get(...args);
|
|
336
|
-
};
|
|
337
|
-
const invalidateAll = () => {
|
|
338
|
-
for (const instance of instanceCache.values()) {
|
|
339
|
-
instance.invalidate();
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
const clearAll = () => {
|
|
343
|
-
for (const instance of instanceCache.values()) {
|
|
344
|
-
instance.clear();
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
baseInstance = Object.assign(
|
|
348
|
-
new Cache(
|
|
349
|
-
function() {
|
|
350
|
-
return cacheFunction.apply(this);
|
|
351
|
-
},
|
|
352
|
-
options,
|
|
353
|
-
void 0,
|
|
354
|
-
get
|
|
355
|
-
),
|
|
356
|
-
{
|
|
357
|
-
invalidateAll,
|
|
358
|
-
clearAll
|
|
359
|
-
}
|
|
360
|
-
);
|
|
361
|
-
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
362
|
-
for (const group of groups.concat(allResources)) {
|
|
363
|
-
group.add(baseInstance);
|
|
364
|
-
}
|
|
365
|
-
get(...[]);
|
|
366
|
-
return baseInstance;
|
|
367
|
-
}
|
|
368
|
-
const createCache = /* @__PURE__ */ Object.assign(create, {
|
|
369
|
-
defaultOptions: {
|
|
370
|
-
invalidateOnWindowFocus: true,
|
|
371
|
-
invalidateOnActivation: true,
|
|
372
|
-
clearUnusedAfter: { days: 1 }
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
18
|
class Scope {
|
|
376
19
|
constructor(defaultValue) {
|
|
377
20
|
this.defaultValue = defaultValue;
|
|
@@ -381,12 +24,7 @@ class Scope {
|
|
|
381
24
|
function createScope(defaultValue) {
|
|
382
25
|
return new Scope(defaultValue);
|
|
383
26
|
}
|
|
384
|
-
exports.Cache = Cache;
|
|
385
|
-
exports.InstanceCache = InstanceCache;
|
|
386
|
-
exports.ResourceGroup = ResourceGroup;
|
|
387
27
|
exports.Scope = Scope;
|
|
388
|
-
exports.allResources = allResources;
|
|
389
|
-
exports.createCache = createCache;
|
|
390
|
-
exports.createResourceGroup = createResourceGroup;
|
|
391
28
|
exports.createScope = createScope;
|
|
29
|
+
exports.hash = hash;
|
|
392
30
|
//# sourceMappingURL=scope.cjs.map
|
package/dist/cjs/scope.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.cjs","sources":["../../src/core/resourceGroup.ts","../../src/lib/instanceCache.ts","../../src/lib/promiseWithState.ts","../../src/core/cache.ts","../../src/core/scope.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\n\nexport interface Resource {\n invalidateAll(): void;\n clearAll(): void;\n}\n\nexport class ResourceGroup {\n private refMap = new WeakMap<Resource, WeakRef<Resource>>();\n\n private refSet = new Set<WeakRef<Resource>>();\n\n constructor(public readonly name?: string) {\n autobind(ResourceGroup);\n }\n\n add(resource: Resource) {\n const ref = new WeakRef(resource);\n this.refMap.set(resource, ref);\n this.refSet.add(ref);\n }\n\n delete(resource: Resource) {\n const ref = this.refMap.get(resource);\n if (ref) {\n this.refMap.delete(resource);\n this.refSet.delete(ref);\n }\n }\n\n invalidateAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.invalidateAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n\n clearAll() {\n for (const ref of this.refSet) {\n const resource = ref.deref();\n if (resource) {\n resource.clearAll();\n } else {\n this.refSet.delete(ref);\n }\n }\n }\n}\n\nexport const allResources = /* @__PURE__ */ new ResourceGroup();\n\nexport function createResourceGroup(name?: string) {\n return new ResourceGroup(name);\n}\n","import { hash } from './hash';\n\nexport class InstanceCache<Args extends any[], T extends object> {\n private cache = new Map<string, { t: number; ref?: T; weakRef: WeakRef<T> }>();\n\n private interval = this.cacheTime\n ? setInterval(() => this.cleanup(), Math.max(this.cacheTime / 10, 1))\n : undefined;\n\n constructor(public readonly factory: (...args: Args) => T, public readonly cacheTime?: number) {}\n\n cleanup() {\n const cutoff = this.now() - (this.cacheTime ?? 0);\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ref && entry.t <= cutoff) {\n delete entry.ref;\n }\n\n if (!entry.ref && !entry.weakRef?.deref()) {\n this.cache.delete(key);\n }\n }\n }\n\n get(...args: Args) {\n const key = hash(args);\n let entry = this.cache.get(key);\n let value = entry?.ref ?? entry?.weakRef?.deref();\n\n if (!entry || !value) {\n value = this.factory(...args);\n entry = {\n t: this.now(),\n ref: value,\n weakRef: new WeakRef(value),\n };\n\n this.cache.set(key, entry);\n } else {\n entry.t = this.now();\n entry.ref ??= value;\n }\n\n return value;\n }\n\n values() {\n return [...this.cache.values()]\n .map((entry) => entry.ref ?? entry.weakRef?.deref())\n .filter((value): value is T => !!value);\n }\n\n stop() {\n if (this.interval) {\n clearInterval(this.interval);\n }\n }\n\n stats() {\n return {\n count: this.cache.size,\n withRef: [...this.cache.values()].filter((x) => !!x.ref).length,\n withWeakRef: [...this.cache.values()].filter((x) => !!x.weakRef?.deref()).length,\n };\n }\n\n private now() {\n return performance.now();\n }\n}\n","import { type ErrorState, type PendingState, type ValueState } from './cacheState';\nimport { type MaybePromise } from './maybePromise';\n\nexport class PromiseWithState<T> extends Promise<T> {\n static override resolve(): PromiseWithState<void>;\n\n static override resolve<T>(value: MaybePromise<T>): PromiseWithState<T>;\n\n static override resolve<T>(value?: MaybePromise<T>) {\n return new PromiseWithState<T>(Promise.resolve(value as MaybePromise<T>), {\n status: 'value',\n value: value as T,\n });\n }\n\n static override reject<T = never>(error: unknown) {\n return new PromiseWithState<T>(Promise.reject(error), { status: 'error', error });\n }\n\n constructor(\n value: Promise<T>,\n public state: ValueState<T> | ErrorState | PendingState = { status: 'pending' },\n ) {\n super((resolve) => resolve(value));\n\n value\n .then((value) => {\n this.state = { status: 'value', value };\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n }\n}\n","import type { Duration, Selector, Use } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore } from './store';\nimport { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { InstanceCache } from '@lib/instanceCache';\nimport { makeSelector } from '@lib/makeSelector';\nimport { type MaybePromise } from '@lib/maybePromise';\nimport type { Path, Value } from '@lib/path';\nimport { PromiseWithState } from '@lib/promiseWithState';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (this: { use: Use }, ...args: Args): Promise<T> | ((cache: { use: Use }) => Promise<T>);\n}\n\nexport interface CacheOptions<T> {\n invalidateAfter?: Duration | ((state: ValueState<T> | ErrorState) => Duration | null) | null;\n invalidateOnWindowFocus?: boolean;\n invalidateOnActivation?: boolean;\n clearOnInvalidate?: boolean;\n clearUnusedAfter?: Duration | null;\n resourceGroup?: ResourceGroup | ResourceGroup[];\n retain?: number;\n}\n\nexport class Cache<T> extends Store<Promise<T>> {\n readonly state = createStore<CacheState<T>>({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: CacheFunction<T>,\n public readonly options: CacheOptions<T> = {},\n public readonly derivedFromCache?: {\n cache: Cache<any>;\n selectors: (Selector<any, any> | Path<any>)[];\n },\n _call?: (...args: any[]) => any,\n ) {\n super(\n function () {\n let result = getter.apply(this);\n\n if (result instanceof Function) {\n result = result(this);\n }\n\n return result;\n },\n options,\n undefined,\n _call,\n );\n autobind(Cache);\n\n this.calculationHelper.options.onInvalidate = () =>\n this.invalidate({ invalidateDependencies: false });\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}) {\n const promise = this._value?.v;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculationHelper.execute();\n\n if ((!promise && !stalePromise) || !backgroundUpdate) {\n return super.get();\n }\n }\n\n if (!promise || (stalePromise && backgroundUpdate)) {\n return stalePromise!;\n }\n\n return promise;\n }\n\n updateValue(value: MaybePromise<T>) {\n this.set(PromiseWithState.resolve(value));\n }\n\n updateError(error: unknown) {\n this.set(PromiseWithState.reject(error));\n }\n\n invalidate({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}) {\n const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear({ invalidateDependencies });\n }\n\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this._value?.v;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n this.calculationHelper.stop();\n super.reset();\n }\n\n clear({ invalidateDependencies = true }: { invalidateDependencies?: boolean } = {}): void {\n if (invalidateDependencies) {\n this.calculationHelper.invalidateDependencies();\n }\n\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n });\n delete this.stalePromise;\n\n this.calculationHelper.stop();\n super.reset();\n }\n\n mapValue<S>(selector: Selector<T, S>): Cache<S>;\n\n mapValue<P extends Path<T>>(selector: P): Cache<Value<T, P>>;\n\n mapValue<S>(_selector: Selector<T, S> | Path<any>): Cache<S> {\n const selector = makeSelector(_selector);\n const derivedFromCache = {\n cache: this.derivedFromCache ? this.derivedFromCache.cache : this,\n selectors: this.derivedFromCache\n ? [...this.derivedFromCache.selectors, _selector]\n : [_selector],\n };\n const that = this;\n\n return new Cache(\n async function () {\n const value = await this.use(that);\n return selector(value);\n },\n {},\n derivedFromCache,\n );\n }\n\n protected watchPromise() {\n this.subscribe(\n async (promise) => {\n if (promise instanceof PromiseWithState) {\n this.state.set({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n });\n\n delete this.stalePromise;\n this.setTimers();\n return;\n }\n\n this.state.set((state) => ({\n ...state,\n isUpdating: true,\n }));\n\n this.setTimers();\n\n try {\n const value = await promise;\n\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this._value?.v) {\n return;\n }\n\n this.state.set({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n });\n delete this.stalePromise;\n this.setTimers();\n }\n },\n { passive: true },\n );\n }\n\n protected setTimers() {\n if (this.invalidationTimer) {\n clearTimeout(this.invalidationTimer);\n }\n this.invalidationTimer = undefined;\n\n const state = this.state.get();\n let { invalidateAfter = createCache.defaultOptions.invalidateAfter } = this.options;\n const ref = new WeakRef(this);\n\n if (state.status === 'pending') {\n return;\n }\n\n if (invalidateAfter instanceof Function) {\n invalidateAfter = invalidateAfter(state);\n }\n\n if (invalidateAfter !== null && invalidateAfter !== undefined) {\n this.invalidationTimer = setTimeout(\n () => ref?.deref()?.invalidate(),\n calcDuration(invalidateAfter),\n );\n }\n }\n\n protected watchFocus() {\n const { invalidateOnWindowFocus = createCache.defaultOptions.invalidateOnWindowFocus } =\n this.options;\n\n if (\n !invalidateOnWindowFocus ||\n typeof document === 'undefined' ||\n typeof document.addEventListener === 'undefined'\n ) {\n return;\n }\n\n const ref = new WeakRef(this);\n\n const onFocus = () => {\n const that = ref?.deref();\n if (!that) {\n document.removeEventListener('visibilitychange', onFocus);\n return;\n }\n\n if (!document.hidden) {\n that.invalidate();\n }\n };\n\n document.addEventListener('visibilitychange', onFocus);\n }\n}\n\ntype CreateReturnType<T, Args extends any[]> = {\n (...args: Args): Cache<T>;\n invalidateAll: () => void;\n clearAll: () => void;\n} & ([] extends Args ? Cache<T> : {});\n\nfunction create<T, Args extends any[]>(\n cacheFunction: CacheFunction<T, Args>,\n options?: CacheOptions<T>,\n): CreateReturnType<T, Args> {\n const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } =\n options ?? {};\n\n let baseInstance: CreateReturnType<T, Args> & Cache<T>;\n\n const instanceCache = new InstanceCache<Args, Cache<T>>(\n (...args: Args): Cache<T> => {\n if (args.length === 0 && baseInstance) {\n return baseInstance;\n }\n\n return new Cache(function () {\n return cacheFunction.apply(this, args);\n }, options);\n },\n clearUnusedAfter ? calcDuration(clearUnusedAfter) : undefined,\n );\n\n const get = (...args: Args) => {\n return instanceCache.get(...args);\n };\n\n const invalidateAll = () => {\n for (const instance of instanceCache.values()) {\n instance.invalidate();\n }\n };\n\n const clearAll = () => {\n for (const instance of instanceCache.values()) {\n instance.clear();\n }\n };\n\n baseInstance = Object.assign(\n new Cache(\n function () {\n return cacheFunction.apply(this);\n },\n options,\n undefined,\n get,\n ),\n {\n invalidateAll,\n clearAll,\n },\n ) as CreateReturnType<T, Args> & Cache<T>;\n\n const groups = Array.isArray(resourceGroup)\n ? resourceGroup\n : resourceGroup\n ? [resourceGroup]\n : [];\n for (const group of groups.concat(allResources)) {\n group.add(baseInstance);\n }\n\n get(...([] as any));\n\n return baseInstance;\n}\n\nexport const createCache = /* @__PURE__ */ Object.assign(create, {\n defaultOptions: {\n invalidateOnWindowFocus: true,\n invalidateOnActivation: true,\n clearUnusedAfter: { days: 1 },\n } as CacheOptions<unknown>,\n});\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["autobind","hash","value","Store","createStore","makeSelector","calcDuration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scope.cjs","sources":["../../src/lib/hash.ts","../../src/core/scope.ts"],"sourcesContent":["export function hash(value: unknown): string {\n if (value instanceof Set) {\n return `s[${[...value].map(hash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(hash).sort().join(',')}]`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(hash).join(',')}]`;\n }\n\n if (value instanceof Object) {\n return `o[${Object.entries(value).map(hash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n","import { autobind } from '@lib/autobind';\n\nexport class Scope<T> {\n constructor(public readonly defaultValue: T) {\n autobind(Scope);\n }\n}\n\nexport function createScope<T>(defaultValue: T): Scope<T> {\n return new Scope(defaultValue);\n}\n"],"names":["autobind"],"mappings":";;AAAO,SAAS,KAAK,OAAwB;AAC3C,MAAI,iBAAiB,KAAK;AACxB,WAAO,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,EACnD;AAEA,MAAI,iBAAiB,KAAK;AACxB,WAAO,KAAK,CAAC,GAAG,MAAM,QAAS,CAAA,EAAE,IAAI,IAAI,EAAE,KAAA,EAAO,KAAK,GAAG,CAAC;AAAA,EAC7D;AAEI,MAAA,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,EACtC;AAEA,MAAI,iBAAiB,QAAQ;AAC3B,WAAO,KAAK,OAAO,QAAQ,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,EAC9D;AAEO,SAAA,KAAK,UAAU,KAAK;AAC7B;AChBO,MAAM,MAAS;AAAA,EACpB,YAA4B,cAAiB;AAAjB,SAAA,eAAA;AAC1BA,UAAA,SAAS,KAAK;AAAA,EAChB;AACF;AAEO,SAAS,YAAe,cAA2B;AACjD,SAAA,IAAI,MAAM,YAAY;AAC/B;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const store = require("./store.cjs");
|
|
3
3
|
const require$$0 = require("react");
|
|
4
|
+
const scope = require("./scope.cjs");
|
|
4
5
|
const jsxRuntime = require("react/jsx-runtime");
|
|
5
|
-
const hash = require("./hash.cjs");
|
|
6
6
|
const unwrapProxySymbol = /* @__PURE__ */ Symbol("unwrapProxy");
|
|
7
7
|
function isPlainObject(value) {
|
|
8
8
|
return typeof value === "object" && value !== null && Object.getPrototypeOf(value) === Object.prototype;
|
|
@@ -501,7 +501,7 @@ function useStore(store$1, argument1, argument2) {
|
|
|
501
501
|
}
|
|
502
502
|
return rootStore.subscribe(_listener, subOptions);
|
|
503
503
|
},
|
|
504
|
-
[rootStore,
|
|
504
|
+
[rootStore, scope.hash(subOptions)]
|
|
505
505
|
);
|
|
506
506
|
let value = withSelectorExports.useSyncExternalStoreWithSelector(
|
|
507
507
|
//
|
|
@@ -536,6 +536,62 @@ function useProp(store2, argument1, argument2, argument3) {
|
|
|
536
536
|
const value = useStore(store2, options);
|
|
537
537
|
return [value, store2.set];
|
|
538
538
|
}
|
|
539
|
+
function getScopeContext(scope2) {
|
|
540
|
+
scope2.context ?? (scope2.context = require$$0.createContext(store.createStore(scope2.defaultValue)));
|
|
541
|
+
return scope2.context;
|
|
542
|
+
}
|
|
543
|
+
function ScopeProvider({ scope: scope2, store: inputStore, children }) {
|
|
544
|
+
const context = getScopeContext(scope2);
|
|
545
|
+
const currentStore = require$$0.useMemo(
|
|
546
|
+
() => inputStore ?? store.createStore(scope2.defaultValue),
|
|
547
|
+
[scope2, inputStore]
|
|
548
|
+
);
|
|
549
|
+
return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: currentStore, children });
|
|
550
|
+
}
|
|
551
|
+
function useScope(scope2) {
|
|
552
|
+
const context = getScopeContext(scope2);
|
|
553
|
+
return require$$0.useContext(context);
|
|
554
|
+
}
|
|
555
|
+
function useScopeStore(scope2, options) {
|
|
556
|
+
const store2 = useScope(scope2);
|
|
557
|
+
return useStore(store2, options);
|
|
558
|
+
}
|
|
559
|
+
function useScopeProp(scope2, options) {
|
|
560
|
+
const store2 = useScope(scope2);
|
|
561
|
+
return useProp(store2, options);
|
|
562
|
+
}
|
|
563
|
+
const LoadingBoundaryContext = scope.createScope(/* @__PURE__ */ new Set());
|
|
564
|
+
function LoadingBoundary({
|
|
565
|
+
fallback,
|
|
566
|
+
children,
|
|
567
|
+
isLoading: isLoadingExternal
|
|
568
|
+
}) {
|
|
569
|
+
const store$1 = require$$0.useMemo(() => store.createStore(/* @__PURE__ */ new Set()), []);
|
|
570
|
+
const entries = useStore(store$1);
|
|
571
|
+
const isLoading = entries.size > 0 || isLoadingExternal;
|
|
572
|
+
const fallbackNode = isLoading ? typeof fallback === "function" ? fallback([...entries]) : fallback : null;
|
|
573
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ScopeProvider, { scope: LoadingBoundaryContext, store: store$1, children: [
|
|
574
|
+
fallbackNode,
|
|
575
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "none" }, children }) : children
|
|
576
|
+
] });
|
|
577
|
+
}
|
|
578
|
+
function useLoadingBoundary(isLoading, label) {
|
|
579
|
+
const store2 = useScope(LoadingBoundaryContext);
|
|
580
|
+
require$$0.useLayoutEffect(() => {
|
|
581
|
+
if (!isLoading) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
const entry = { label };
|
|
585
|
+
store2.set((entries) => new Set(entries).add(entry));
|
|
586
|
+
return () => {
|
|
587
|
+
store2.set((entries) => {
|
|
588
|
+
const newEntries = new Set(entries);
|
|
589
|
+
newEntries.delete(entry);
|
|
590
|
+
return newEntries;
|
|
591
|
+
});
|
|
592
|
+
};
|
|
593
|
+
}, [isLoading]);
|
|
594
|
+
}
|
|
539
595
|
function boundUseStore(...args) {
|
|
540
596
|
return useStore(this, ...args);
|
|
541
597
|
}
|
|
@@ -552,6 +608,7 @@ function useCache(cache, {
|
|
|
552
608
|
updateOnMount,
|
|
553
609
|
withViewTransition,
|
|
554
610
|
suspense,
|
|
611
|
+
loadingBoundary = true,
|
|
555
612
|
...options
|
|
556
613
|
} = {}) {
|
|
557
614
|
if (withViewTransition === true) {
|
|
@@ -602,41 +659,20 @@ function useCache(cache, {
|
|
|
602
659
|
return cache.subscribe(() => void 0);
|
|
603
660
|
}, [cache, passive, disabled]);
|
|
604
661
|
const result = useStore(mappedState, { ...options, withViewTransition });
|
|
662
|
+
useLoadingBoundary(loadingBoundary && result.status === "pending");
|
|
605
663
|
if (suspense && result.status === "pending") {
|
|
606
664
|
throw cache.get();
|
|
607
665
|
}
|
|
608
666
|
return result;
|
|
609
667
|
}
|
|
610
|
-
|
|
611
|
-
scope.context ?? (scope.context = require$$0.createContext(store.createStore(scope.defaultValue)));
|
|
612
|
-
return scope.context;
|
|
613
|
-
}
|
|
614
|
-
function ScopeProvider({ scope, store: inputStore, children }) {
|
|
615
|
-
const context = getScopeContext(scope);
|
|
616
|
-
const currentStore = require$$0.useMemo(
|
|
617
|
-
() => inputStore ?? store.createStore(scope.defaultValue),
|
|
618
|
-
[scope, inputStore]
|
|
619
|
-
);
|
|
620
|
-
return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: currentStore, children });
|
|
621
|
-
}
|
|
622
|
-
function useScope(scope) {
|
|
623
|
-
const context = getScopeContext(scope);
|
|
624
|
-
return require$$0.useContext(context);
|
|
625
|
-
}
|
|
626
|
-
function useScopeStore(scope, options) {
|
|
627
|
-
const store2 = useScope(scope);
|
|
628
|
-
return useStore(store2, options);
|
|
629
|
-
}
|
|
630
|
-
function useScopeProp(scope, options) {
|
|
631
|
-
const store2 = useScope(scope);
|
|
632
|
-
return useProp(store2, options);
|
|
633
|
-
}
|
|
668
|
+
exports.LoadingBoundary = LoadingBoundary;
|
|
634
669
|
exports.ScopeProvider = ScopeProvider;
|
|
635
670
|
exports.reactMethods = reactMethods;
|
|
636
671
|
exports.useCache = useCache;
|
|
672
|
+
exports.useLoadingBoundary = useLoadingBoundary;
|
|
637
673
|
exports.useProp = useProp;
|
|
638
674
|
exports.useScope = useScope;
|
|
639
675
|
exports.useScopeProp = useScopeProp;
|
|
640
676
|
exports.useScopeStore = useScopeStore;
|
|
641
677
|
exports.useStore = useStore;
|
|
642
|
-
//# sourceMappingURL=
|
|
678
|
+
//# sourceMappingURL=useCache.cjs.map
|