cross-state 0.33.3 → 0.33.6

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 (46) hide show
  1. package/dist/cjs/cache.cjs +94 -118
  2. package/dist/cjs/cache.cjs.map +1 -1
  3. package/dist/cjs/immer/index.cjs +3 -21
  4. package/dist/cjs/immer/index.cjs.map +1 -1
  5. package/dist/cjs/immer/register.cjs +2 -2
  6. package/dist/cjs/immer/register.cjs.map +1 -1
  7. package/dist/cjs/immerMethods.cjs +23 -0
  8. package/dist/cjs/immerMethods.cjs.map +1 -0
  9. package/dist/cjs/index.cjs +0 -114
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/cjs/react/index.cjs +0 -11
  12. package/dist/cjs/react/index.cjs.map +1 -1
  13. package/dist/cjs/store.cjs +319 -306
  14. package/dist/cjs/store.cjs.map +1 -1
  15. package/dist/cjs/useCache.cjs +152 -142
  16. package/dist/cjs/useCache.cjs.map +1 -1
  17. package/dist/es/cache.mjs +92 -116
  18. package/dist/es/cache.mjs.map +1 -1
  19. package/dist/es/immer/index.mjs +3 -21
  20. package/dist/es/immer/index.mjs.map +1 -1
  21. package/dist/es/immer/register.mjs +1 -1
  22. package/dist/es/immerMethods.mjs +24 -0
  23. package/dist/es/immerMethods.mjs.map +1 -0
  24. package/dist/es/index.mjs +36 -151
  25. package/dist/es/index.mjs.map +1 -1
  26. package/dist/es/react/index.mjs +4 -15
  27. package/dist/es/react/index.mjs.map +1 -1
  28. package/dist/es/store.mjs +330 -317
  29. package/dist/es/store.mjs.map +1 -1
  30. package/dist/es/useCache.mjs +153 -143
  31. package/dist/es/useCache.mjs.map +1 -1
  32. package/dist/types/core/cache.d.ts +9 -18
  33. package/dist/types/core/commonTypes.d.ts +19 -5
  34. package/dist/types/core/index.d.ts +1 -2
  35. package/dist/types/core/store.d.ts +9 -16
  36. package/dist/types/lib/cacheState.d.ts +1 -0
  37. package/dist/types/lib/calculatedValue.d.ts +9 -0
  38. package/dist/types/lib/deferred.d.ts +6 -0
  39. package/dist/types/lib/disposable.d.ts +3 -0
  40. package/dist/types/lib/promiseWithState.d.ts +1 -0
  41. package/dist/types/react/index.d.ts +0 -1
  42. package/dist/types/sync/sync.d.ts +1 -1
  43. package/package.json +22 -22
  44. package/dist/types/core/subscriptionCache.d.ts +0 -62
  45. package/dist/types/lib/calculationHelper.d.ts +0 -27
  46. package/dist/types/react/read.d.ts +0 -3
@@ -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 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
- });
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
- static resolve(value) {
122
- return new PromiseWithState(Promise.resolve(value), {
123
- status: "value",
124
- value
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
- static reject(error) {
128
- return new PromiseWithState(Promise.reject(error), { status: "error", error });
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._value) == null ? void 0 : _a.v;
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.calculationHelper.execute();
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({ invalidateDependencies = true } = {}) {
149
+ invalidate(recursive) {
179
150
  var _a;
180
- const { clearOnInvalidate = createCache.defaultOptions.clearOnInvalidate } = this.options;
151
+ const { clearOnInvalidate } = this.options;
181
152
  if (clearOnInvalidate) {
182
- return this.clear({ invalidateDependencies });
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._value) == null ? void 0 : _a.v;
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
- this.calculationHelper.stop();
197
- super.reset();
164
+ super.invalidate(recursive);
198
165
  }
199
- clear({ invalidateDependencies = true } = {}) {
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
- this.calculationHelper.stop();
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 function() {
221
- const value = await this.use(that);
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._value) == null ? void 0 : _a.v)) {
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._value) == null ? void 0 : _b.v)) {
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 = createCache.defaultOptions.invalidateAfter } = this.options;
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 = createCache.defaultOptions.invalidateOnWindowFocus } = this.options;
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
- const { clearUnusedAfter = createCache.defaultOptions.clearUnusedAfter, resourceGroup } = options ?? {};
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(function() {
329
- return cacheFunction.apply(this, args);
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
- function() {
350
- return cacheFunction.apply(this);
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;
@@ -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":";;;AAOO,MAAM,cAAc;AAAA,EAKzB,YAA4B,MAAe;AAAf,SAAA,OAAA;AAJpB,SAAA,6BAAa;AAEb,SAAA,6BAAa;AAGnBA,UAAA,SAAS,aAAa;AAAA,EACxB;AAAA,EAEA,IAAI,UAAoB;AAChB,UAAA,MAAM,IAAI,QAAQ,QAAQ;AAC3B,SAAA,OAAO,IAAI,UAAU,GAAG;AACxB,SAAA,OAAO,IAAI,GAAG;AAAA,EACrB;AAAA,EAEA,OAAO,UAAoB;AACzB,UAAM,MAAM,KAAK,OAAO,IAAI,QAAQ;AACpC,QAAI,KAAK;AACF,WAAA,OAAO,OAAO,QAAQ;AACtB,WAAA,OAAO,OAAO,GAAG;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,gBAAgB;AACH,eAAA,OAAO,KAAK,QAAQ;AACvB,YAAA,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,iBAAS,cAAc;AAAA,MAAA,OAClB;AACA,aAAA,OAAO,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW;AACE,eAAA,OAAO,KAAK,QAAQ;AACvB,YAAA,WAAW,IAAI;AACrB,UAAI,UAAU;AACZ,iBAAS,SAAS;AAAA,MAAA,OACb;AACA,aAAA,OAAO,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAEa,MAAA,mCAAmC,cAAc;AAEvD,SAAS,oBAAoB,MAAe;AAC1C,SAAA,IAAI,cAAc,IAAI;AAC/B;ACvDO,MAAM,cAAoD;AAAA,EAO/D,YAA4B,SAA+C,WAAoB;AAAnE,SAAA,UAAA;AAA+C,SAAA,YAAA;AANnE,SAAA,4BAAY;AAEpB,SAAQ,WAAW,KAAK,YACpB,YAAY,MAAM,KAAK,QAAW,GAAA,KAAK,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAClE;AAAA,EAE4F;AAAA,EAEhG,UAAU;;AACR,UAAM,SAAS,KAAK,IAAI,KAAK,KAAK,aAAa;AAE/C,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW;AAC/C,UAAI,MAAM,OAAO,MAAM,KAAK,QAAQ;AAClC,eAAO,MAAM;AAAA,MACf;AAEA,UAAI,CAAC,MAAM,OAAO,GAAC,WAAM,YAAN,mBAAe,UAAS;AACpC,aAAA,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAY;;AACX,UAAA,MAAMC,WAAK,IAAI;AACrB,QAAI,QAAQ,KAAK,MAAM,IAAI,GAAG;AAC9B,QAAI,SAAQ,+BAAO,UAAO,oCAAO,YAAP,mBAAgB;AAEtC,QAAA,CAAC,SAAS,CAAC,OAAO;AACZ,cAAA,KAAK,QAAQ,GAAG,IAAI;AACpB,cAAA;AAAA,QACN,GAAG,KAAK,IAAI;AAAA,QACZ,KAAK;AAAA,QACL,SAAS,IAAI,QAAQ,KAAK;AAAA,MAAA;AAGvB,WAAA,MAAM,IAAI,KAAK,KAAK;AAAA,IAAA,OACpB;AACC,YAAA,IAAI,KAAK;AACf,YAAM,QAAN,MAAM,MAAQ;AAAA,IAChB;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACA,WAAA,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAC3B,IAAI,CAAC;;AAAU,mBAAM,SAAO,WAAM,YAAN,mBAAe;AAAA,KAAO,EAClD,OAAO,CAAC,UAAsB,CAAC,CAAC,KAAK;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,QAAQ;AACC,WAAA;AAAA,MACL,OAAO,KAAK,MAAM;AAAA,MAClB,SAAS,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;AAAA,MACzD,aAAa,CAAC,GAAG,KAAK,MAAM,OAAQ,CAAA,EAAE,OAAO,CAAC;;AAAM,gBAAC,GAAC,OAAE,YAAF,mBAAW;AAAA,OAAO,EAAE;AAAA,IAAA;AAAA,EAE9E;AAAA,EAEQ,MAAM;AACZ,WAAO,YAAY;EACrB;AACF;ACnEO,MAAM,yBAA4B,QAAW;AAAA,EAgBlD,YACE,OACO,QAAmD,EAAE,QAAQ,aACpE;AACA,UAAM,CAAC,YAAY,QAAQ,KAAK,CAAC;AAF1B,SAAA,QAAA;AAKJ,UAAA,KAAK,CAACC,WAAU;AACf,WAAK,QAAQ,EAAE,QAAQ,SAAS,OAAAA;IAAM,CACvC,EACA,MAAM,CAAC,UAAU;AAChB,WAAK,QAAQ,EAAE,QAAQ,SAAS,MAAM;AAAA,IAAA,CACvC;AAAA,EACL;AAAA,EAxBA,OAAgB,QAAW,OAAyB;AAClD,WAAO,IAAI,iBAAoB,QAAQ,QAAQ,KAAwB,GAAG;AAAA,MACxE,QAAQ;AAAA,MACR;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,OAAgB,OAAkB,OAAgB;AACzC,WAAA,IAAI,iBAAoB,QAAQ,OAAO,KAAK,GAAG,EAAE,QAAQ,SAAS,MAAA,CAAO;AAAA,EAClF;AAgBF;ACFO,MAAM,cAAiBC,MAAAA,MAAkB;AAAA,EAW9C,YACE,QACgB,UAA2B,CAAA,GAC3B,kBAIhB,OACA;AACA;AAAA,MACE,WAAY;AACN,YAAA,SAAS,OAAO,MAAM,IAAI;AAE9B,YAAI,kBAAkB,UAAU;AAC9B,mBAAS,OAAO,IAAI;AAAA,QACtB;AAEO,eAAA;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAnBc,SAAA,UAAA;AACA,SAAA,mBAAA;AAblB,SAAS,QAAQC,kBAA2B;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AA6BCJ,UAAA,SAAS,KAAK;AAET,SAAA,kBAAkB,QAAQ,eAAe,MAC5C,KAAK,WAAW,EAAE,wBAAwB,MAAA,CAAO;AACnD,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,EAAE,SAAS,aAAa,mBAAmB,MAAM,IAAqB,IAAI;;AACtE,UAAA,WAAU,UAAK,WAAL,mBAAa;AAC7B,UAAM,eAAe,KAAK;AAGvB,QAAA,WAAW,iBAAiB,CAAC,WAAW,CAAC,gBACzC,WAAW,eAAe,CAAC,WAC5B,WAAW,SACX;AACA,WAAK,kBAAkB;AAEvB,UAAK,CAAC,WAAW,CAAC,gBAAiB,CAAC,kBAAkB;AACpD,eAAO,MAAM;MACf;AAAA,IACF;AAEI,QAAA,CAAC,WAAY,gBAAgB,kBAAmB;AAC3C,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,YAAY,OAAwB;AAClC,SAAK,IAAI,iBAAiB,QAAQ,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,YAAY,OAAgB;AAC1B,SAAK,IAAI,iBAAiB,OAAO,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,WAAW,EAAE,yBAAyB,KAAK,IAA0C,CAAA,GAAI;;AACvF,UAAM,EAAE,oBAAoB,YAAY,eAAe,sBAAsB,KAAK;AAElF,QAAI,mBAAmB;AACrB,aAAO,KAAK,MAAM,EAAE,uBAAwB,CAAA;AAAA,IAC9C;AAEA,QAAI,wBAAwB;AAC1B,WAAK,kBAAkB;IACzB;AAEA,UAAM,EAAE,QAAQ,SAAS,WAAe,IAAA,KAAK,MAAM;AACnD,QAAI,WAAW,aAAa,CAAC,WAAW,CAAC,YAAY;AAC9C,WAAA,gBAAe,UAAK,WAAL,mBAAa;AAAA,IACnC;AAEK,SAAA,MAAM,IAAI,CAAC,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,IACZ,EAAA;AAEF,SAAK,kBAAkB;AACvB,UAAM,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,EAAE,yBAAyB,KAAK,IAA0C,CAAA,GAAU;AACxF,QAAI,wBAAwB;AAC1B,WAAK,kBAAkB;IACzB;AAEA,SAAK,MAAM,IAAI;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AACD,WAAO,KAAK;AAEZ,SAAK,kBAAkB;AACvB,UAAM,MAAM;AAAA,EACd;AAAA,EAMA,SAAY,WAAiD;AACrD,UAAA,WAAWK,mBAAa,SAAS;AACvC,UAAM,mBAAmB;AAAA,MACvB,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,QAAQ;AAAA,MAC7D,WAAW,KAAK,mBACZ,CAAC,GAAG,KAAK,iBAAiB,WAAW,SAAS,IAC9C,CAAC,SAAS;AAAA,IAAA;AAEhB,UAAM,OAAO;AAEb,WAAO,IAAI;AAAA,MACT,iBAAkB;AAChB,cAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AACjC,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEU,eAAe;AAClB,SAAA;AAAA,MACH,OAAO,YAAY;;AACjB,YAAI,mBAAmB,kBAAkB;AACvC,eAAK,MAAM,IAAI;AAAA,YACb,GAAG,QAAQ;AAAA,YACX,SAAS;AAAA,YACT,YAAY;AAAA,UAAA,CACb;AAED,iBAAO,KAAK;AACZ,eAAK,UAAU;AACf;AAAA,QACF;AAEK,aAAA,MAAM,IAAI,CAAC,WAAW;AAAA,UACzB,GAAG;AAAA,UACH,YAAY;AAAA,QACZ,EAAA;AAEF,aAAK,UAAU;AAEX,YAAA;AACF,gBAAM,QAAQ,MAAM;AAEhB,cAAA,cAAY,UAAK,WAAL,mBAAa,IAAG;AAC9B;AAAA,UACF;AAEA,eAAK,MAAM,IAAI;AAAA,YACb,QAAQ;AAAA,YACR;AAAA,YACA,SAAS;AAAA,YACT,YAAY;AAAA,UAAA,CACb;AACD,iBAAO,KAAK;AACZ,eAAK,UAAU;AAAA,iBACR,OAAO;AACV,cAAA,cAAY,UAAK,WAAL,mBAAa,IAAG;AAC9B;AAAA,UACF;AAEA,eAAK,MAAM,IAAI;AAAA,YACb,QAAQ;AAAA,YACR;AAAA,YACA,SAAS;AAAA,YACT,YAAY;AAAA,UAAA,CACb;AACD,iBAAO,KAAK;AACZ,eAAK,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAAA;AAAA,EAEpB;AAAA,EAEU,YAAY;AACpB,QAAI,KAAK,mBAAmB;AAC1B,mBAAa,KAAK,iBAAiB;AAAA,IACrC;AACA,SAAK,oBAAoB;AAEnB,UAAA,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAI,EAAE,kBAAkB,YAAY,eAAe,oBAAoB,KAAK;AACtE,UAAA,MAAM,IAAI,QAAQ,IAAI;AAExB,QAAA,MAAM,WAAW,WAAW;AAC9B;AAAA,IACF;AAEA,QAAI,2BAA2B,UAAU;AACvC,wBAAkB,gBAAgB,KAAK;AAAA,IACzC;AAEI,QAAA,oBAAoB,QAAQ,oBAAoB,QAAW;AAC7D,WAAK,oBAAoB;AAAA,QACvB;;AAAM,kDAAK,YAAL,mBAAc;AAAA;AAAA,QACpBC,MAAAA,aAAa,eAAe;AAAA,MAAA;AAAA,IAEhC;AAAA,EACF;AAAA,EAEU,aAAa;AACrB,UAAM,EAAE,0BAA0B,YAAY,eAAe,4BAC3D,KAAK;AAGL,QAAA,CAAC,2BACD,OAAO,aAAa,eACpB,OAAO,SAAS,qBAAqB,aACrC;AACA;AAAA,IACF;AAEM,UAAA,MAAM,IAAI,QAAQ,IAAI;AAE5B,UAAM,UAAU,MAAM;AACd,YAAA,OAAO,2BAAK;AAClB,UAAI,CAAC,MAAM;AACA,iBAAA,oBAAoB,oBAAoB,OAAO;AACxD;AAAA,MACF;AAEI,UAAA,CAAC,SAAS,QAAQ;AACpB,aAAK,WAAW;AAAA,MAClB;AAAA,IAAA;AAGO,aAAA,iBAAiB,oBAAoB,OAAO;AAAA,EACvD;AACF;AAQA,SAAS,OACP,eACA,SAC2B;AACrB,QAAA,EAAE,mBAAmB,YAAY,eAAe,kBAAkB,cAAc,IACpF,WAAW;AAET,MAAA;AAEJ,QAAM,gBAAgB,IAAI;AAAA,IACxB,IAAI,SAAyB;AACvB,UAAA,KAAK,WAAW,KAAK,cAAc;AAC9B,eAAA;AAAA,MACT;AAEO,aAAA,IAAI,MAAM,WAAY;AACpB,eAAA,cAAc,MAAM,MAAM,IAAI;AAAA,SACpC,OAAO;AAAA,IACZ;AAAA,IACA,mBAAmBA,MAAa,aAAA,gBAAgB,IAAI;AAAA,EAAA;AAGhD,QAAA,MAAM,IAAI,SAAe;AACtB,WAAA,cAAc,IAAI,GAAG,IAAI;AAAA,EAAA;AAGlC,QAAM,gBAAgB,MAAM;AACf,eAAA,YAAY,cAAc,UAAU;AAC7C,eAAS,WAAW;AAAA,IACtB;AAAA,EAAA;AAGF,QAAM,WAAW,MAAM;AACV,eAAA,YAAY,cAAc,UAAU;AAC7C,eAAS,MAAM;AAAA,IACjB;AAAA,EAAA;AAGF,iBAAe,OAAO;AAAA,IACpB,IAAI;AAAA,MACF,WAAY;AACH,eAAA,cAAc,MAAM,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EAAA;AAGI,QAAA,SAAS,MAAM,QAAQ,aAAa,IACtC,gBACA,gBACA,CAAC,aAAa,IACd;AACJ,aAAW,SAAS,OAAO,OAAO,YAAY,GAAG;AAC/C,UAAM,IAAI,YAAY;AAAA,EACxB;AAEI,MAAA,GAAI,CAAA,CAAU;AAEX,SAAA;AACT;AAEa,MAAA,cAAqC,uBAAA,OAAO,QAAQ;AAAA,EAC/D,gBAAgB;AAAA,IACd,yBAAyB;AAAA,IACzB,wBAAwB;AAAA,IACxB,kBAAkB,EAAE,MAAM,EAAE;AAAA,EAC9B;AACF,CAAC;;;;;;;"}
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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"}
@@ -1,24 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const immer = require("immer");
4
- function update(...args) {
5
- if (args.length === 1) {
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":["../../../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;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- const immer_index = require("./index.cjs");
2
+ const immerMethods = require("../immerMethods.cjs");
3
3
  const store = require("../store.cjs");
4
4
  require("immer");
5
- Object.assign(store.Store.prototype, immer_index.immerMethods);
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,wBAAY;"}
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;;"}
@@ -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;