cross-state 0.33.2 → 0.33.5
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 +94 -118
- package/dist/cjs/cache.cjs.map +1 -1
- package/dist/cjs/immer/index.cjs +3 -21
- package/dist/cjs/immer/index.cjs.map +1 -1
- package/dist/cjs/immer/register.cjs +2 -2
- package/dist/cjs/immer/register.cjs.map +1 -1
- package/dist/cjs/immerMethods.cjs +23 -0
- package/dist/cjs/immerMethods.cjs.map +1 -0
- package/dist/cjs/index.cjs +0 -114
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +0 -11
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/store.cjs +319 -306
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/useCache.cjs +152 -142
- package/dist/cjs/useCache.cjs.map +1 -1
- package/dist/es/cache.mjs +92 -116
- package/dist/es/cache.mjs.map +1 -1
- package/dist/es/immer/index.mjs +3 -21
- package/dist/es/immer/index.mjs.map +1 -1
- package/dist/es/immer/register.mjs +1 -1
- package/dist/es/immerMethods.mjs +24 -0
- package/dist/es/immerMethods.mjs.map +1 -0
- package/dist/es/index.mjs +36 -151
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react/index.mjs +4 -15
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/store.mjs +330 -317
- package/dist/es/store.mjs.map +1 -1
- package/dist/es/useCache.mjs +153 -143
- package/dist/es/useCache.mjs.map +1 -1
- package/dist/types/core/cache.d.ts +9 -18
- package/dist/types/core/commonTypes.d.ts +23 -6
- package/dist/types/core/index.d.ts +1 -2
- package/dist/types/core/store.d.ts +9 -16
- package/dist/types/lib/cacheState.d.ts +1 -0
- package/dist/types/lib/calculatedValue.d.ts +9 -0
- package/dist/types/lib/deferred.d.ts +6 -0
- package/dist/types/lib/disposable.d.ts +3 -0
- package/dist/types/lib/promiseWithState.d.ts +1 -0
- package/dist/types/react/index.d.ts +0 -1
- package/dist/types/react/register.d.ts +2 -2
- package/dist/types/react/scope.d.ts +2 -2
- package/dist/types/sync/sync.d.ts +1 -1
- package/package.json +22 -22
- package/dist/types/core/subscriptionCache.d.ts +0 -62
- package/dist/types/lib/calculationHelper.d.ts +0 -27
- package/dist/types/react/read.d.ts +0 -3
package/dist/cjs/cache.cjs
CHANGED
|
@@ -1,50 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const store = require("./store.cjs");
|
|
3
3
|
const scope = require("./scope.cjs");
|
|
4
|
-
class ResourceGroup {
|
|
5
|
-
constructor(name) {
|
|
6
|
-
this.name = name;
|
|
7
|
-
this.refMap = /* @__PURE__ */ new WeakMap();
|
|
8
|
-
this.refSet = /* @__PURE__ */ new Set();
|
|
9
|
-
store.autobind(ResourceGroup);
|
|
10
|
-
}
|
|
11
|
-
add(resource) {
|
|
12
|
-
const ref = new WeakRef(resource);
|
|
13
|
-
this.refMap.set(resource, ref);
|
|
14
|
-
this.refSet.add(ref);
|
|
15
|
-
}
|
|
16
|
-
delete(resource) {
|
|
17
|
-
const ref = this.refMap.get(resource);
|
|
18
|
-
if (ref) {
|
|
19
|
-
this.refMap.delete(resource);
|
|
20
|
-
this.refSet.delete(ref);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
invalidateAll() {
|
|
24
|
-
for (const ref of this.refSet) {
|
|
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
4
|
class InstanceCache {
|
|
49
5
|
constructor(factory, cacheTime) {
|
|
50
6
|
this.factory = factory;
|
|
@@ -108,58 +64,73 @@ class InstanceCache {
|
|
|
108
64
|
return performance.now();
|
|
109
65
|
}
|
|
110
66
|
}
|
|
111
|
-
class
|
|
112
|
-
constructor(
|
|
113
|
-
|
|
114
|
-
this.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}).catch((error) => {
|
|
118
|
-
this.state = { status: "error", error };
|
|
119
|
-
});
|
|
67
|
+
class ResourceGroup {
|
|
68
|
+
constructor(name) {
|
|
69
|
+
this.name = name;
|
|
70
|
+
this.refMap = /* @__PURE__ */ new WeakMap();
|
|
71
|
+
this.refSet = /* @__PURE__ */ new Set();
|
|
72
|
+
store.autobind(ResourceGroup);
|
|
120
73
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
74
|
+
add(resource) {
|
|
75
|
+
const ref = new WeakRef(resource);
|
|
76
|
+
this.refMap.set(resource, ref);
|
|
77
|
+
this.refSet.add(ref);
|
|
78
|
+
}
|
|
79
|
+
delete(resource) {
|
|
80
|
+
const ref = this.refMap.get(resource);
|
|
81
|
+
if (ref) {
|
|
82
|
+
this.refMap.delete(resource);
|
|
83
|
+
this.refSet.delete(ref);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
invalidateAll() {
|
|
87
|
+
for (const ref of this.refSet) {
|
|
88
|
+
const resource = ref.deref();
|
|
89
|
+
if (resource) {
|
|
90
|
+
resource.invalidateAll();
|
|
91
|
+
} else {
|
|
92
|
+
this.refSet.delete(ref);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
126
95
|
}
|
|
127
|
-
|
|
128
|
-
|
|
96
|
+
clearAll() {
|
|
97
|
+
for (const ref of this.refSet) {
|
|
98
|
+
const resource = ref.deref();
|
|
99
|
+
if (resource) {
|
|
100
|
+
resource.clearAll();
|
|
101
|
+
} else {
|
|
102
|
+
this.refSet.delete(ref);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
129
105
|
}
|
|
130
106
|
}
|
|
107
|
+
const allResources = /* @__PURE__ */ new ResourceGroup();
|
|
108
|
+
function createResourceGroup(name) {
|
|
109
|
+
return new ResourceGroup(name);
|
|
110
|
+
}
|
|
131
111
|
class Cache extends store.Store {
|
|
132
112
|
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
|
-
);
|
|
113
|
+
super(getter, options, void 0, _call);
|
|
145
114
|
this.options = options;
|
|
146
115
|
this.derivedFromCache = derivedFromCache;
|
|
147
116
|
this.state = store.createStore({
|
|
148
117
|
status: "pending",
|
|
149
118
|
isStale: true,
|
|
150
|
-
isUpdating: false
|
|
119
|
+
isUpdating: false,
|
|
120
|
+
isConnected: false
|
|
151
121
|
});
|
|
152
122
|
store.autobind(Cache);
|
|
153
|
-
this.calculationHelper.options.onInvalidate = () => this.invalidate({ invalidateDependencies: false });
|
|
154
123
|
this.watchPromise();
|
|
155
124
|
this.watchFocus();
|
|
156
125
|
}
|
|
157
126
|
get({ update = "whenStale", backgroundUpdate = false } = {}) {
|
|
158
|
-
var _a;
|
|
159
|
-
const promise = (_a = this.
|
|
127
|
+
var _a, _b;
|
|
128
|
+
const promise = (_a = this.calculatedValue) == null ? void 0 : _a.value;
|
|
160
129
|
const stalePromise = this.stalePromise;
|
|
161
130
|
if (update === "whenMissing" && !promise && !stalePromise || update === "whenStale" && !promise || update === "force") {
|
|
162
|
-
this.
|
|
131
|
+
(_b = this.calculatedValue) == null ? void 0 : _b.stop();
|
|
132
|
+
this.calculatedValue = store.calculatedValue(this, this.notify);
|
|
133
|
+
this.notify();
|
|
163
134
|
if (!promise && !stalePromise || !backgroundUpdate) {
|
|
164
135
|
return super.get();
|
|
165
136
|
}
|
|
@@ -170,44 +141,37 @@ class Cache extends store.Store {
|
|
|
170
141
|
return promise;
|
|
171
142
|
}
|
|
172
143
|
updateValue(value) {
|
|
173
|
-
this.set(PromiseWithState.resolve(value));
|
|
144
|
+
this.set(store.PromiseWithState.resolve(value));
|
|
174
145
|
}
|
|
175
146
|
updateError(error) {
|
|
176
|
-
this.set(PromiseWithState.reject(error));
|
|
147
|
+
this.set(store.PromiseWithState.reject(error));
|
|
177
148
|
}
|
|
178
|
-
invalidate(
|
|
149
|
+
invalidate(recursive) {
|
|
179
150
|
var _a;
|
|
180
|
-
const { clearOnInvalidate
|
|
151
|
+
const { clearOnInvalidate } = this.options;
|
|
181
152
|
if (clearOnInvalidate) {
|
|
182
|
-
return this.clear(
|
|
183
|
-
}
|
|
184
|
-
if (invalidateDependencies) {
|
|
185
|
-
this.calculationHelper.invalidateDependencies();
|
|
153
|
+
return this.clear(recursive);
|
|
186
154
|
}
|
|
187
155
|
const { status, isStale, isUpdating } = this.state.get();
|
|
188
156
|
if (status !== "pending" && !isStale && !isUpdating) {
|
|
189
|
-
this.stalePromise = (_a = this.
|
|
157
|
+
this.stalePromise = (_a = this.calculatedValue) == null ? void 0 : _a.value;
|
|
190
158
|
}
|
|
191
159
|
this.state.set((state) => ({
|
|
192
160
|
...state,
|
|
193
161
|
isStale: true,
|
|
194
162
|
isUpdating: false
|
|
195
163
|
}));
|
|
196
|
-
|
|
197
|
-
super.reset();
|
|
164
|
+
super.invalidate(recursive);
|
|
198
165
|
}
|
|
199
|
-
clear(
|
|
200
|
-
if (invalidateDependencies) {
|
|
201
|
-
this.calculationHelper.invalidateDependencies();
|
|
202
|
-
}
|
|
166
|
+
clear(recursive) {
|
|
203
167
|
this.state.set({
|
|
204
168
|
status: "pending",
|
|
205
169
|
isStale: true,
|
|
206
|
-
isUpdating: false
|
|
170
|
+
isUpdating: false,
|
|
171
|
+
isConnected: false
|
|
207
172
|
});
|
|
208
173
|
delete this.stalePromise;
|
|
209
|
-
|
|
210
|
-
super.reset();
|
|
174
|
+
super.invalidate(recursive);
|
|
211
175
|
}
|
|
212
176
|
mapValue(_selector) {
|
|
213
177
|
const selector = store.makeSelector(_selector);
|
|
@@ -215,10 +179,9 @@ class Cache extends store.Store {
|
|
|
215
179
|
cache: this.derivedFromCache ? this.derivedFromCache.cache : this,
|
|
216
180
|
selectors: this.derivedFromCache ? [...this.derivedFromCache.selectors, _selector] : [_selector]
|
|
217
181
|
};
|
|
218
|
-
const that = this;
|
|
219
182
|
return new Cache(
|
|
220
|
-
async
|
|
221
|
-
const value = await
|
|
183
|
+
async ({ use }) => {
|
|
184
|
+
const value = await use(this);
|
|
222
185
|
return selector(value);
|
|
223
186
|
},
|
|
224
187
|
{},
|
|
@@ -229,12 +192,13 @@ class Cache extends store.Store {
|
|
|
229
192
|
this.subscribe(
|
|
230
193
|
async (promise) => {
|
|
231
194
|
var _a, _b;
|
|
232
|
-
if (promise instanceof PromiseWithState) {
|
|
233
|
-
this.state.set({
|
|
195
|
+
if (promise instanceof store.PromiseWithState) {
|
|
196
|
+
this.state.set((state) => ({
|
|
234
197
|
...promise.state,
|
|
235
198
|
isStale: false,
|
|
236
|
-
isUpdating: false
|
|
237
|
-
|
|
199
|
+
isUpdating: false,
|
|
200
|
+
isConnected: state.isConnected
|
|
201
|
+
}));
|
|
238
202
|
delete this.stalePromise;
|
|
239
203
|
this.setTimers();
|
|
240
204
|
return;
|
|
@@ -246,27 +210,29 @@ class Cache extends store.Store {
|
|
|
246
210
|
this.setTimers();
|
|
247
211
|
try {
|
|
248
212
|
const value = await promise;
|
|
249
|
-
if (promise !== ((_a = this.
|
|
213
|
+
if (promise !== ((_a = this.calculatedValue) == null ? void 0 : _a.value)) {
|
|
250
214
|
return;
|
|
251
215
|
}
|
|
252
|
-
this.state.set({
|
|
216
|
+
this.state.set((state) => ({
|
|
253
217
|
status: "value",
|
|
254
218
|
value,
|
|
255
219
|
isStale: false,
|
|
256
|
-
isUpdating: false
|
|
257
|
-
|
|
220
|
+
isUpdating: false,
|
|
221
|
+
isConnected: state.isConnected
|
|
222
|
+
}));
|
|
258
223
|
delete this.stalePromise;
|
|
259
224
|
this.setTimers();
|
|
260
225
|
} catch (error) {
|
|
261
|
-
if (promise !== ((_b = this.
|
|
226
|
+
if (promise !== ((_b = this.calculatedValue) == null ? void 0 : _b.value)) {
|
|
262
227
|
return;
|
|
263
228
|
}
|
|
264
|
-
this.state.set({
|
|
229
|
+
this.state.set((state) => ({
|
|
265
230
|
status: "error",
|
|
266
231
|
error,
|
|
267
232
|
isStale: false,
|
|
268
|
-
isUpdating: false
|
|
269
|
-
|
|
233
|
+
isUpdating: false,
|
|
234
|
+
isConnected: state.isConnected
|
|
235
|
+
}));
|
|
270
236
|
delete this.stalePromise;
|
|
271
237
|
this.setTimers();
|
|
272
238
|
}
|
|
@@ -280,7 +246,7 @@ class Cache extends store.Store {
|
|
|
280
246
|
}
|
|
281
247
|
this.invalidationTimer = void 0;
|
|
282
248
|
const state = this.state.get();
|
|
283
|
-
let { invalidateAfter
|
|
249
|
+
let { invalidateAfter } = this.options;
|
|
284
250
|
const ref = new WeakRef(this);
|
|
285
251
|
if (state.status === "pending") {
|
|
286
252
|
return;
|
|
@@ -299,7 +265,7 @@ class Cache extends store.Store {
|
|
|
299
265
|
}
|
|
300
266
|
}
|
|
301
267
|
watchFocus() {
|
|
302
|
-
const { invalidateOnWindowFocus
|
|
268
|
+
const { invalidateOnWindowFocus } = this.options;
|
|
303
269
|
if (!invalidateOnWindowFocus || typeof document === "undefined" || typeof document.addEventListener === "undefined") {
|
|
304
270
|
return;
|
|
305
271
|
}
|
|
@@ -318,15 +284,20 @@ class Cache extends store.Store {
|
|
|
318
284
|
}
|
|
319
285
|
}
|
|
320
286
|
function create(cacheFunction, options) {
|
|
321
|
-
|
|
287
|
+
options = { ...createCache.defaultOptions, ...options };
|
|
288
|
+
const { clearUnusedAfter, resourceGroup } = options ?? {};
|
|
322
289
|
let baseInstance;
|
|
323
290
|
const instanceCache = new InstanceCache(
|
|
324
291
|
(...args) => {
|
|
325
292
|
if (args.length === 0 && baseInstance) {
|
|
326
293
|
return baseInstance;
|
|
327
294
|
}
|
|
328
|
-
return new Cache(
|
|
329
|
-
|
|
295
|
+
return new Cache((helpers) => {
|
|
296
|
+
const result = cacheFunction.apply(helpers, args);
|
|
297
|
+
if (result instanceof Function) {
|
|
298
|
+
return result(helpers);
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
330
301
|
}, options);
|
|
331
302
|
},
|
|
332
303
|
clearUnusedAfter ? store.calcDuration(clearUnusedAfter) : void 0
|
|
@@ -346,8 +317,12 @@ function create(cacheFunction, options) {
|
|
|
346
317
|
};
|
|
347
318
|
baseInstance = Object.assign(
|
|
348
319
|
new Cache(
|
|
349
|
-
|
|
350
|
-
|
|
320
|
+
(helpers) => {
|
|
321
|
+
const result = cacheFunction.apply(helpers);
|
|
322
|
+
if (result instanceof Function) {
|
|
323
|
+
return result(helpers);
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
351
326
|
},
|
|
352
327
|
options,
|
|
353
328
|
void 0,
|
|
@@ -369,7 +344,8 @@ const createCache = /* @__PURE__ */ Object.assign(create, {
|
|
|
369
344
|
defaultOptions: {
|
|
370
345
|
invalidateOnWindowFocus: true,
|
|
371
346
|
invalidateOnActivation: true,
|
|
372
|
-
clearUnusedAfter: { days: 1 }
|
|
347
|
+
clearUnusedAfter: { days: 1 },
|
|
348
|
+
retain: { seconds: 1 }
|
|
373
349
|
}
|
|
374
350
|
});
|
|
375
351
|
exports.Cache = Cache;
|
package/dist/cjs/cache.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.cjs","sources":["../../src/core/resourceGroup.ts","../../src/lib/instanceCache.ts","../../src/lib/promiseWithState.ts","../../src/core/cache.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"],"names":["autobind","hash","value","Store","createStore","makeSelector","calcDuration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.cjs","sources":["../../src/lib/instanceCache.ts","../../src/core/resourceGroup.ts","../../src/core/cache.ts"],"sourcesContent":["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 { 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 { autobind } from '@lib/autobind';\nimport type { CacheState, ErrorState, ValueState } from '@lib/cacheState';\nimport { calcDuration } from '@lib/calcDuration';\nimport { calculatedValue } from '@lib/calculatedValue';\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';\nimport type { Duration, Selector } from './commonTypes';\nimport { allResources, type ResourceGroup } from './resourceGroup';\nimport { Store, createStore, type Calculate, type StoreOptions } from './store';\n\nexport interface CacheGetOptions {\n update?: 'whenMissing' | 'whenStale' | 'force';\n backgroundUpdate?: boolean;\n}\n\nexport interface CacheFunction<T, Args extends any[] = []> {\n (...args: Args): Promise<T> | Calculate<Promise<T>>;\n}\n\nexport interface CacheOptions<T> extends StoreOptions {\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}\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 isConnected: false,\n });\n\n protected stalePromise?: Promise<T>;\n\n protected invalidationTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n getter: Calculate<Promise<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(getter, options, undefined, _call);\n autobind(Cache);\n\n this.watchPromise();\n this.watchFocus();\n }\n\n get({ update = 'whenStale', backgroundUpdate = false }: CacheGetOptions = {}) {\n const promise = this.calculatedValue?.value;\n const stalePromise = this.stalePromise;\n\n if (\n (update === 'whenMissing' && !promise && !stalePromise) ||\n (update === 'whenStale' && !promise) ||\n update === 'force'\n ) {\n this.calculatedValue?.stop();\n this.calculatedValue = calculatedValue(this, this.notify);\n this.notify();\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(recursive?: boolean) {\n const { clearOnInvalidate } = this.options;\n\n if (clearOnInvalidate) {\n return this.clear(recursive);\n }\n\n const { status, isStale, isUpdating } = this.state.get();\n if (status !== 'pending' && !isStale && !isUpdating) {\n this.stalePromise = this.calculatedValue?.value;\n }\n\n this.state.set((state) => ({\n ...state,\n isStale: true,\n isUpdating: false,\n }));\n\n super.invalidate(recursive);\n }\n\n clear(recursive?: boolean): void {\n this.state.set({\n status: 'pending',\n isStale: true,\n isUpdating: false,\n isConnected: false,\n });\n delete this.stalePromise;\n\n super.invalidate(recursive);\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\n return new Cache(\n async ({ use }) => {\n const value = await use(this);\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((state) => ({\n ...promise.state,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\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.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'value',\n value,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\n }));\n delete this.stalePromise;\n this.setTimers();\n } catch (error) {\n if (promise !== this.calculatedValue?.value) {\n return;\n }\n\n this.state.set((state) => ({\n status: 'error',\n error,\n isStale: false,\n isUpdating: false,\n isConnected: state.isConnected,\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 } = 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 } = 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 options = { ...createCache.defaultOptions, ...options };\n const { clearUnusedAfter, resourceGroup } = 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((helpers) => {\n const result = cacheFunction.apply(helpers, args);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\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 (helpers) => {\n const result = cacheFunction.apply(helpers);\n\n if (result instanceof Function) {\n return result(helpers);\n }\n\n return result;\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 retain: { seconds: 1 },\n } as CacheOptions<unknown>,\n});\n"],"names":["hash","autobind","Store","createStore","calculatedValue","PromiseWithState","makeSelector","calcDuration"],"mappings":"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"}
|
package/dist/cjs/immer/index.cjs
CHANGED
|
@@ -1,24 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
this.set(
|
|
7
|
-
(value) => immer.produce(value, (draft) => {
|
|
8
|
-
args[0](draft);
|
|
9
|
-
})
|
|
10
|
-
);
|
|
11
|
-
} else {
|
|
12
|
-
this.set(
|
|
13
|
-
args[0],
|
|
14
|
-
(value) => immer.produce(value, (draft) => {
|
|
15
|
-
args[1](draft);
|
|
16
|
-
})
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
const immerMethods = {
|
|
21
|
-
update
|
|
22
|
-
};
|
|
23
|
-
exports.immerMethods = immerMethods;
|
|
3
|
+
const immerMethods = require("../immerMethods.cjs");
|
|
4
|
+
require("immer");
|
|
5
|
+
exports.immerMethods = immerMethods.immerMethods;
|
|
24
6
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
2
|
+
const immerMethods = require("../immerMethods.cjs");
|
|
3
3
|
const store = require("../store.cjs");
|
|
4
4
|
require("immer");
|
|
5
|
-
Object.assign(store.Store.prototype,
|
|
5
|
+
Object.assign(store.Store.prototype, immerMethods.immerMethods);
|
|
6
6
|
//# sourceMappingURL=register.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.cjs","sources":["../../../src/immer/register.ts"],"sourcesContent":["import { immerMethods } from './immerMethods';\nimport { Store } from '@core';\n\ntype ImmerMethods = typeof immerMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends ImmerMethods {}\n}\n\nObject.assign(Store.prototype, immerMethods);\n"],"names":["Store","immerMethods"],"mappings":";;;;AAUA,OAAO,OAAOA,MAAAA,MAAM,WAAWC,
|
|
1
|
+
{"version":3,"file":"register.cjs","sources":["../../../src/immer/register.ts"],"sourcesContent":["import { immerMethods } from './immerMethods';\nimport { Store } from '@core';\n\ntype ImmerMethods = typeof immerMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends ImmerMethods {}\n}\n\nObject.assign(Store.prototype, immerMethods);\n"],"names":["Store","immerMethods"],"mappings":";;;;AAUA,OAAO,OAAOA,MAAAA,MAAM,WAAWC,yBAAY;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const immer = require("immer");
|
|
3
|
+
function update(...args) {
|
|
4
|
+
if (args.length === 1) {
|
|
5
|
+
this.set(
|
|
6
|
+
(value) => immer.produce(value, (draft) => {
|
|
7
|
+
args[0](draft);
|
|
8
|
+
})
|
|
9
|
+
);
|
|
10
|
+
} else {
|
|
11
|
+
this.set(
|
|
12
|
+
args[0],
|
|
13
|
+
(value) => immer.produce(value, (draft) => {
|
|
14
|
+
args[1](draft);
|
|
15
|
+
})
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const immerMethods = {
|
|
20
|
+
update
|
|
21
|
+
};
|
|
22
|
+
exports.immerMethods = immerMethods;
|
|
23
|
+
//# sourceMappingURL=immerMethods.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immerMethods.cjs","sources":["../../src/immer/immerMethods.ts"],"sourcesContent":["import type { Draft } from 'immer';\nimport { produce } from 'immer';\nimport type { Store } from '@core/store';\nimport { type Path, type Value } from '@lib/path';\n\ntype Recipe<T> = (draft: Draft<T>) => void;\n\nfunction update<T>(this: Store<T>, recipe: Recipe<T>): void;\n\nfunction update<T, const P extends Path<T>>(\n this: Store<T>,\n path: P,\n recipe: Recipe<Value<T, P>>,\n): void;\n\nfunction update<T, P extends Path<T>>(\n this: Store<T>,\n ...args: [recipe: Recipe<T>] | [P: P, recipe: Recipe<Value<T, P>>]\n) {\n if (args.length === 1) {\n this.set((value) =>\n produce(value, (draft) => {\n args[0](draft);\n }),\n );\n } else {\n this.set(args[0], (value) =>\n produce(value, (draft) => {\n args[1](draft);\n }),\n );\n }\n}\n\nexport const immerMethods = {\n update,\n};\n"],"names":["produce"],"mappings":";;AAeA,SAAS,UAEJ,MACH;AACI,MAAA,KAAK,WAAW,GAAG;AAChB,SAAA;AAAA,MAAI,CAAC,UACRA,MAAAA,QAAQ,OAAO,CAAC,UAAU;AACnB,aAAA,CAAC,EAAE,KAAK;AAAA,MAAA,CACd;AAAA,IAAA;AAAA,EACH,OACK;AACA,SAAA;AAAA,MAAI,KAAK,CAAC;AAAA,MAAG,CAAC,UACjBA,MAAAA,QAAQ,OAAO,CAAC,UAAU;AACnB,aAAA,CAAC,EAAE,KAAK;AAAA,MAAA,CACd;AAAA,IAAA;AAAA,EAEL;AACF;AAEO,MAAM,eAAe;AAAA,EAC1B;AACF;;"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -4,118 +4,6 @@ const cache = require("./cache.cjs");
|
|
|
4
4
|
const scope = require("./scope.cjs");
|
|
5
5
|
const store = require("./store.cjs");
|
|
6
6
|
const urlStore = require("./urlStore.cjs");
|
|
7
|
-
class SubstriptionCache extends store.Store {
|
|
8
|
-
constructor(connectFunction, options, derivedFromSubscriptionCache, _call) {
|
|
9
|
-
super(options.default, options, void 0, _call);
|
|
10
|
-
this.connectFunction = connectFunction;
|
|
11
|
-
this.options = options;
|
|
12
|
-
this.derivedFromSubscriptionCache = derivedFromSubscriptionCache;
|
|
13
|
-
this.state = store.createStore({
|
|
14
|
-
connectionState: "closed",
|
|
15
|
-
error: void 0
|
|
16
|
-
});
|
|
17
|
-
this.calculationHelper.options = {
|
|
18
|
-
...this.calculationHelper.options,
|
|
19
|
-
calculate: (helpers) => {
|
|
20
|
-
let result = connectFunction.apply(helpers);
|
|
21
|
-
if (result instanceof Function && result.length > 0) {
|
|
22
|
-
result = result(helpers);
|
|
23
|
-
}
|
|
24
|
-
return result;
|
|
25
|
-
},
|
|
26
|
-
onValue: (value) => {
|
|
27
|
-
this.set(value);
|
|
28
|
-
},
|
|
29
|
-
onError: (error) => {
|
|
30
|
-
this.state.set("error", error);
|
|
31
|
-
},
|
|
32
|
-
onConnectionState: (state) => {
|
|
33
|
-
this.state.set("connectionState", state);
|
|
34
|
-
},
|
|
35
|
-
onInvalidate: () => {
|
|
36
|
-
this.invalidate();
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
invalidate({ invalidateDependencies = true } = {}) {
|
|
41
|
-
const { clearOnInvalidate } = this.options;
|
|
42
|
-
if (clearOnInvalidate) {
|
|
43
|
-
return this.clear({ invalidateDependencies });
|
|
44
|
-
}
|
|
45
|
-
if (invalidateDependencies) {
|
|
46
|
-
this.calculationHelper.invalidateDependencies();
|
|
47
|
-
}
|
|
48
|
-
this.calculationHelper.stop();
|
|
49
|
-
if (this.isActive()) {
|
|
50
|
-
this.calculationHelper.execute();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
clear({ invalidateDependencies = true } = {}) {
|
|
54
|
-
if (invalidateDependencies) {
|
|
55
|
-
this.calculationHelper.invalidateDependencies();
|
|
56
|
-
}
|
|
57
|
-
this.calculationHelper.stop();
|
|
58
|
-
if (this.isActive()) {
|
|
59
|
-
this.calculationHelper.execute();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const defaultOptions = {
|
|
64
|
-
clearUnusedAfter: { days: 1 },
|
|
65
|
-
retain: { seconds: 1 }
|
|
66
|
-
};
|
|
67
|
-
function create(cacheFunction, ...[options = {}]) {
|
|
68
|
-
options = Object.assign({}, defaultOptions, options);
|
|
69
|
-
const { clearUnusedAfter, resourceGroup } = options;
|
|
70
|
-
let baseInstance;
|
|
71
|
-
const instanceCache = new cache.InstanceCache(
|
|
72
|
-
(...args) => {
|
|
73
|
-
if (args.length === 0 && baseInstance) {
|
|
74
|
-
return baseInstance;
|
|
75
|
-
}
|
|
76
|
-
return new SubstriptionCache(function() {
|
|
77
|
-
return cacheFunction.apply(this, args);
|
|
78
|
-
}, options);
|
|
79
|
-
},
|
|
80
|
-
clearUnusedAfter ? store.calcDuration(clearUnusedAfter) : void 0
|
|
81
|
-
);
|
|
82
|
-
const get = (...args) => {
|
|
83
|
-
return instanceCache.get(...args);
|
|
84
|
-
};
|
|
85
|
-
const invalidateAll = () => {
|
|
86
|
-
for (const instance of instanceCache.values()) {
|
|
87
|
-
instance.invalidate();
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const clearAll = () => {
|
|
91
|
-
for (const instance of instanceCache.values()) {
|
|
92
|
-
instance.clear();
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
baseInstance = Object.assign(
|
|
96
|
-
new SubstriptionCache(
|
|
97
|
-
function() {
|
|
98
|
-
return cacheFunction.apply(this);
|
|
99
|
-
},
|
|
100
|
-
options,
|
|
101
|
-
void 0,
|
|
102
|
-
get
|
|
103
|
-
),
|
|
104
|
-
{
|
|
105
|
-
invalidateAll,
|
|
106
|
-
clearAll
|
|
107
|
-
}
|
|
108
|
-
);
|
|
109
|
-
const groups = Array.isArray(resourceGroup) ? resourceGroup : resourceGroup ? [resourceGroup] : [];
|
|
110
|
-
for (const group of groups.concat(cache.allResources)) {
|
|
111
|
-
group.add(baseInstance);
|
|
112
|
-
}
|
|
113
|
-
get(...[]);
|
|
114
|
-
return baseInstance;
|
|
115
|
-
}
|
|
116
|
-
const createSubscriptionCache = /* @__PURE__ */ Object.assign(create, {
|
|
117
|
-
defaultOptions
|
|
118
|
-
});
|
|
119
7
|
function applySinglePatch(target, patch) {
|
|
120
8
|
if (patch.op === "remove") {
|
|
121
9
|
return store.remove(target, patch.path);
|
|
@@ -440,10 +328,8 @@ exports.setMethods = store.setMethods;
|
|
|
440
328
|
exports.connectUrl = urlStore.connectUrl;
|
|
441
329
|
exports.createUrlStore = urlStore.createUrlStore;
|
|
442
330
|
exports.updateUrlStore = urlStore.updateUrlStore;
|
|
443
|
-
exports.SubstriptionCache = SubstriptionCache;
|
|
444
331
|
exports.Sync = Sync;
|
|
445
332
|
exports.applyPatches = applyPatches;
|
|
446
|
-
exports.createSubscriptionCache = createSubscriptionCache;
|
|
447
333
|
exports.createSync = createSync;
|
|
448
334
|
exports.diff = diff;
|
|
449
335
|
exports.findOrDefault = findOrDefault;
|