@gantryland/task-cache 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -124
- package/dist/index.d.ts +12 -233
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -260
- package/dist/index.js.map +1 -1
- package/package.json +10 -4
- package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -1,179 +1,140 @@
|
|
|
1
1
|
# @gantryland/task-cache
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Use this package when you want explicit caching at the `TaskFn` layer: predictable TTL behavior, optional stale-while-revalidate, and clear invalidation.
|
|
3
|
+
Task-function cache wrappers with TTL, stale-while-revalidate, and in-flight dedupe.
|
|
6
4
|
|
|
7
5
|
## Installation
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
|
-
npm install @gantryland/task-cache
|
|
8
|
+
npm install @gantryland/task @gantryland/task-cache
|
|
11
9
|
```
|
|
12
10
|
|
|
13
|
-
## Quick
|
|
11
|
+
## Quick Start
|
|
14
12
|
|
|
15
13
|
```typescript
|
|
16
14
|
import { Task } from "@gantryland/task";
|
|
17
15
|
import { MemoryCacheStore, cache } from "@gantryland/task-cache";
|
|
18
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
19
|
-
|
|
20
|
-
type User = { id: string; name: string };
|
|
21
16
|
|
|
22
17
|
const store = new MemoryCacheStore();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
pipe(
|
|
26
|
-
(signal) => fetch("/api/users", { signal }).then((r) => r.json()),
|
|
27
|
-
cache("users", store, { ttl: 60_000, tags: ["users"] })
|
|
28
|
-
)
|
|
18
|
+
const usersTaskFn = cache("users", store, { ttl: 60_000 })(
|
|
19
|
+
() => fetch("/api/users").then((r) => r.json()),
|
|
29
20
|
);
|
|
30
21
|
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
const usersTask = new Task(usersTaskFn);
|
|
23
|
+
|
|
24
|
+
await usersTask.run();
|
|
25
|
+
await usersTask.run();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Exports
|
|
29
|
+
|
|
30
|
+
| Export | Kind | What it does |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `MemoryCacheStore` | Class | Provides an in-memory `CacheStore` backed by `Map`. |
|
|
33
|
+
| `cache` | Wrapper factory | Returns a TTL cache wrapper with optional in-flight dedupe. |
|
|
34
|
+
| `staleWhileRevalidate` | Wrapper factory | Returns an SWR wrapper with stale window background refresh. |
|
|
35
|
+
| `CacheKey` | Type | Represents supported cache keys (`string | number | symbol`). |
|
|
36
|
+
| `CacheEntry` | Type | Represents cached value data with `updatedAt` timestamp. |
|
|
37
|
+
| `CacheStore` | Type | Represents the minimal cache store contract (`get`, `set`, `delete`). |
|
|
38
|
+
| `CacheOptions` | Type | Represents options for `cache` (`ttl?`, `dedupe?`). |
|
|
39
|
+
| `StaleWhileRevalidateOptions` | Type | Represents options for `staleWhileRevalidate` (`ttl`, `staleTtl?`, `dedupe?`). |
|
|
40
|
+
|
|
41
|
+
## API Reference
|
|
42
|
+
|
|
43
|
+
### `MemoryCacheStore`
|
|
44
|
+
|
|
45
|
+
Provides an in-memory `CacheStore` implementation backed by `Map`.
|
|
46
|
+
|
|
47
|
+
| Method | Signature | Description |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| `get` | `<T>(key: CacheKey) => CacheEntry<T> \| undefined` | Returns cached entry for `key`, if present. |
|
|
50
|
+
| `set` | `<T>(key: CacheKey, entry: CacheEntry<T>) => void` | Stores or replaces entry for `key`. |
|
|
51
|
+
| `delete` | `(key: CacheKey) => void` | Removes entry for `key`. |
|
|
52
|
+
|
|
53
|
+
### `cache`
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
cache<T, Args extends unknown[] = []>(
|
|
57
|
+
key: CacheKey,
|
|
58
|
+
store: CacheStore,
|
|
59
|
+
options?: CacheOptions,
|
|
60
|
+
): (taskFn: (...args: Args) => Promise<T>) => (...args: Args) => Promise<T>
|
|
33
61
|
```
|
|
34
62
|
|
|
35
|
-
|
|
63
|
+
Returns a wrapper that serves fresh cache hits and resolves source on miss or stale entry.
|
|
36
64
|
|
|
37
|
-
|
|
38
|
-
- You need per-key TTL, dedupe, and tag/key invalidation.
|
|
39
|
-
- You want a simple in-memory default store that can be replaced.
|
|
65
|
+
### `staleWhileRevalidate`
|
|
40
66
|
|
|
41
|
-
|
|
67
|
+
```typescript
|
|
68
|
+
staleWhileRevalidate<T, Args extends unknown[] = []>(
|
|
69
|
+
key: CacheKey,
|
|
70
|
+
store: CacheStore,
|
|
71
|
+
options: StaleWhileRevalidateOptions,
|
|
72
|
+
): (taskFn: (...args: Args) => Promise<T>) => (...args: Args) => Promise<T>
|
|
73
|
+
```
|
|
42
74
|
|
|
43
|
-
|
|
44
|
-
- You cannot tolerate stale reads at all.
|
|
75
|
+
Returns a wrapper that can return stale values within `staleTtl` while refreshing in background.
|
|
45
76
|
|
|
46
|
-
|
|
77
|
+
### Types
|
|
47
78
|
|
|
48
79
|
```typescript
|
|
49
80
|
type CacheKey = string | number | symbol;
|
|
50
81
|
|
|
51
82
|
type CacheEntry<T> = {
|
|
52
83
|
value: T;
|
|
53
|
-
createdAt: number;
|
|
54
84
|
updatedAt: number;
|
|
55
|
-
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
type CacheStore = {
|
|
88
|
+
get<T>(key: CacheKey): CacheEntry<T> | undefined;
|
|
89
|
+
set<T>(key: CacheKey, entry: CacheEntry<T>): void;
|
|
90
|
+
delete(key: CacheKey): void;
|
|
56
91
|
};
|
|
57
92
|
|
|
58
93
|
type CacheOptions = {
|
|
59
94
|
ttl?: number;
|
|
60
|
-
staleTtl?: number;
|
|
61
|
-
tags?: string[];
|
|
62
95
|
dedupe?: boolean;
|
|
63
96
|
};
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
`createdAt` and `updatedAt` are epoch milliseconds.
|
|
67
|
-
|
|
68
|
-
## Semantics
|
|
69
|
-
|
|
70
|
-
- `cache(...)`
|
|
71
|
-
- Fresh entry returns immediately.
|
|
72
|
-
- Miss/stale executes source task and stores on success.
|
|
73
|
-
- Rejections (including `AbortError`) do not update cache.
|
|
74
|
-
- `staleWhileRevalidate(...)`
|
|
75
|
-
- Fresh entry returns immediately.
|
|
76
|
-
- Stale-within-window returns stale value and triggers background revalidation.
|
|
77
|
-
- Background revalidation errors are ignored and emitted as `revalidateError`.
|
|
78
|
-
- Dedupe is enabled by default (`dedupe !== false`).
|
|
79
|
-
- Concurrent calls for the same key share one in-flight promise.
|
|
80
|
-
- In deduped mode, only the first caller signal is used for that shared request.
|
|
81
|
-
- `invalidateOnResolve(...)`
|
|
82
|
-
- Invalidates keys/tags only after successful resolution.
|
|
83
|
-
- Failures do not invalidate.
|
|
84
|
-
|
|
85
|
-
## API
|
|
86
97
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
| `staleWhileRevalidate(key, store, options?)` | Serve stale, refresh in background | `(taskFn) => TaskFn` |
|
|
92
|
-
| `invalidateOnResolve(target, store)` | Invalidate keys/tags after success | `(taskFn) => TaskFn` |
|
|
93
|
-
|
|
94
|
-
### MemoryCacheStore methods
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
store.get(key)
|
|
98
|
-
store.set(key, entry)
|
|
99
|
-
store.delete(key)
|
|
100
|
-
store.clear()
|
|
101
|
-
store.has(key)
|
|
102
|
-
store.keys()
|
|
103
|
-
store.subscribe((event) => {})
|
|
104
|
-
store.emit(event)
|
|
105
|
-
store.invalidateTags(tags)
|
|
98
|
+
type StaleWhileRevalidateOptions = CacheOptions & {
|
|
99
|
+
ttl: number;
|
|
100
|
+
staleTtl?: number;
|
|
101
|
+
};
|
|
106
102
|
```
|
|
107
103
|
|
|
108
|
-
##
|
|
104
|
+
## Practical Use Cases
|
|
109
105
|
|
|
110
|
-
###
|
|
106
|
+
### Example: TTL Cache for List Endpoints
|
|
111
107
|
|
|
112
108
|
```typescript
|
|
113
|
-
import { Task } from "@gantryland/task";
|
|
114
|
-
import { MemoryCacheStore, staleWhileRevalidate } from "@gantryland/task-cache";
|
|
115
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
116
|
-
|
|
117
109
|
const store = new MemoryCacheStore();
|
|
118
110
|
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
(signal) => fetch("/api/feed", { signal }).then((r) => r.json()),
|
|
122
|
-
staleWhileRevalidate("feed", store, { ttl: 10_000, staleTtl: 30_000 })
|
|
123
|
-
)
|
|
111
|
+
const listUsers = cache("users:list", store, { ttl: 30_000 })(() =>
|
|
112
|
+
fetch("/api/users").then((r) => r.json()),
|
|
124
113
|
);
|
|
125
|
-
|
|
126
|
-
await feedTask.run();
|
|
127
114
|
```
|
|
128
115
|
|
|
129
|
-
###
|
|
116
|
+
### Example: Stale-While-Revalidate for Dashboards
|
|
130
117
|
|
|
131
118
|
```typescript
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const store = new MemoryCacheStore();
|
|
137
|
-
|
|
138
|
-
const listTask = new Task(
|
|
139
|
-
pipe(
|
|
140
|
-
(signal) => fetch("/api/posts", { signal }).then((r) => r.json()),
|
|
141
|
-
cache("posts", store, { ttl: 30_000, tags: ["posts"] })
|
|
142
|
-
)
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
const createTask = new Task(
|
|
146
|
-
pipe(
|
|
147
|
-
(signal) => fetch("/api/posts", { method: "POST", signal }).then((r) => r.json()),
|
|
148
|
-
invalidateOnResolve({ tags: ["posts"] }, store)
|
|
149
|
-
)
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
await listTask.run();
|
|
153
|
-
await createTask.run();
|
|
119
|
+
const getStats = staleWhileRevalidate("stats", store, {
|
|
120
|
+
ttl: 10_000,
|
|
121
|
+
staleTtl: 50_000,
|
|
122
|
+
})(() => fetch("/api/stats").then((r) => r.json()));
|
|
154
123
|
```
|
|
155
124
|
|
|
156
|
-
###
|
|
125
|
+
### Example: Disable Dedupe for Independent Refreshes
|
|
157
126
|
|
|
158
127
|
```typescript
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const unsubscribe = store.subscribe((event) => {
|
|
164
|
-
console.log(event.type, event.key);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
unsubscribe();
|
|
128
|
+
const getFeed = cache("feed", store, { ttl: 5_000, dedupe: false })(() =>
|
|
129
|
+
fetch("/api/feed").then((r) => r.json()),
|
|
130
|
+
);
|
|
168
131
|
```
|
|
169
132
|
|
|
170
|
-
##
|
|
171
|
-
|
|
172
|
-
- [@gantryland/task](../task/) - Task execution and state primitive
|
|
173
|
-
- [@gantryland/task-combinators](../task-combinators/) - TaskFn composition and control-flow operators
|
|
133
|
+
## Runtime Semantics
|
|
174
134
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
135
|
+
- `cache` returns cached value when entry is fresh; otherwise it executes and stores on success.
|
|
136
|
+
- `staleWhileRevalidate` requires `ttl` as a non-negative finite number.
|
|
137
|
+
- Fresh SWR hit returns immediately without background work.
|
|
138
|
+
- Stale-window SWR hit returns stale value and triggers background revalidation.
|
|
139
|
+
- Background revalidation errors are ignored for the caller path.
|
|
140
|
+
- `dedupe` defaults to `true` so same key and in-flight requests share one promise.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,258 +1,37 @@
|
|
|
1
1
|
import type { TaskFn } from "@gantryland/task";
|
|
2
|
-
/**
|
|
2
|
+
/** Cache key type used by cache stores and wrappers. */
|
|
3
3
|
export type CacheKey = string | number | symbol;
|
|
4
|
-
/**
|
|
5
|
-
* Cache entry payload with metadata.
|
|
6
|
-
*
|
|
7
|
-
* Timestamps use epoch milliseconds.
|
|
8
|
-
*
|
|
9
|
-
* @template T - Cached value type
|
|
10
|
-
*
|
|
11
|
-
* @property value - Cached value
|
|
12
|
-
* @property createdAt - Epoch timestamp of initial write
|
|
13
|
-
* @property updatedAt - Epoch timestamp of last update
|
|
14
|
-
* @property tags - Optional tags for invalidation
|
|
15
|
-
*/
|
|
4
|
+
/** Stored cache value with last update timestamp. */
|
|
16
5
|
export type CacheEntry<T> = {
|
|
17
6
|
value: T;
|
|
18
|
-
createdAt: number;
|
|
19
7
|
updatedAt: number;
|
|
20
|
-
tags?: string[];
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Cache event payload.
|
|
24
|
-
*
|
|
25
|
-
* `error` is set for `revalidateError` events.
|
|
26
|
-
*
|
|
27
|
-
* @property type - Event type
|
|
28
|
-
* @property key - Cache key involved in the event
|
|
29
|
-
* @property entry - Cache entry involved in the event
|
|
30
|
-
* @property error - Error for `revalidateError` events
|
|
31
|
-
*/
|
|
32
|
-
export type CacheEvent = {
|
|
33
|
-
type: "hit" | "miss" | "stale" | "set" | "invalidate" | "clear" | "revalidate" | "revalidateError";
|
|
34
|
-
key?: CacheKey;
|
|
35
|
-
entry?: CacheEntry<unknown>;
|
|
36
|
-
error?: unknown;
|
|
37
8
|
};
|
|
38
|
-
/**
|
|
39
|
-
* Minimal cache store interface.
|
|
40
|
-
*
|
|
41
|
-
* Optional methods enable eventing and tag invalidation.
|
|
42
|
-
*
|
|
43
|
-
* @property get - Return a cache entry by key
|
|
44
|
-
* @property set - Store a cache entry by key
|
|
45
|
-
* @property delete - Remove a cache entry by key
|
|
46
|
-
* @property clear - Remove all cache entries
|
|
47
|
-
* @property has - Check whether a key exists
|
|
48
|
-
* @property keys - Return all cache keys
|
|
49
|
-
* @property subscribe - Subscribe to cache events
|
|
50
|
-
* @property emit - Emit a cache event to subscribers
|
|
51
|
-
* @property invalidateTags - Remove entries matching tags
|
|
52
|
-
*/
|
|
9
|
+
/** Minimal cache store contract used by this package. */
|
|
53
10
|
export type CacheStore = {
|
|
54
11
|
get<T>(key: CacheKey): CacheEntry<T> | undefined;
|
|
55
12
|
set<T>(key: CacheKey, entry: CacheEntry<T>): void;
|
|
56
13
|
delete(key: CacheKey): void;
|
|
57
|
-
clear(): void;
|
|
58
|
-
has(key: CacheKey): boolean;
|
|
59
|
-
keys?(): Iterable<CacheKey>;
|
|
60
|
-
subscribe?(listener: (event: CacheEvent) => void): () => void;
|
|
61
|
-
emit?(event: CacheEvent): void;
|
|
62
|
-
invalidateTags?(tags: string[]): void;
|
|
63
14
|
};
|
|
64
|
-
/**
|
|
65
|
-
* In-memory CacheStore with tag support.
|
|
66
|
-
*
|
|
67
|
-
* Emits cache events on set, delete, clear, and tag invalidation.
|
|
68
|
-
* Listener errors are caught and logged.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* const store = new MemoryCacheStore();
|
|
73
|
-
* store.set("user:1", { value: { id: 1 }, createdAt: Date.now(), updatedAt: Date.now() });
|
|
74
|
-
* const entry = store.get<{ id: number }>("user:1");
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
15
|
+
/** In-memory `CacheStore` backed by `Map`. */
|
|
77
16
|
export declare class MemoryCacheStore implements CacheStore {
|
|
78
17
|
private store;
|
|
79
|
-
private tagIndex;
|
|
80
|
-
private listeners;
|
|
81
|
-
/**
|
|
82
|
-
* Get a cache entry by key.
|
|
83
|
-
*
|
|
84
|
-
* @template T - Cached value type
|
|
85
|
-
* @param key - Cache key
|
|
86
|
-
* @returns The cache entry, or undefined when missing
|
|
87
|
-
*/
|
|
88
18
|
get<T>(key: CacheKey): CacheEntry<T> | undefined;
|
|
89
|
-
/**
|
|
90
|
-
* Set a cache entry by key.
|
|
91
|
-
*
|
|
92
|
-
* Replaces any existing entry and updates tag indices.
|
|
93
|
-
*
|
|
94
|
-
* @template T - Cached value type
|
|
95
|
-
* @param key - Cache key
|
|
96
|
-
* @param entry - Entry to store
|
|
97
|
-
*/
|
|
98
19
|
set<T>(key: CacheKey, entry: CacheEntry<T>): void;
|
|
99
|
-
/**
|
|
100
|
-
* Delete a cache entry by key.
|
|
101
|
-
*
|
|
102
|
-
* Emits an `invalidate` event with the previous entry when present.
|
|
103
|
-
*
|
|
104
|
-
* @param key - Cache key
|
|
105
|
-
*/
|
|
106
20
|
delete(key: CacheKey): void;
|
|
107
|
-
/**
|
|
108
|
-
* Clear all entries.
|
|
109
|
-
*
|
|
110
|
-
* @returns Returns nothing.
|
|
111
|
-
*/
|
|
112
|
-
clear(): void;
|
|
113
|
-
/**
|
|
114
|
-
* Check whether a key exists.
|
|
115
|
-
*
|
|
116
|
-
* @param key - Cache key
|
|
117
|
-
* @returns True when the key exists
|
|
118
|
-
*/
|
|
119
|
-
has(key: CacheKey): boolean;
|
|
120
|
-
/**
|
|
121
|
-
* List all keys.
|
|
122
|
-
*
|
|
123
|
-
* @returns Iterable of cache keys
|
|
124
|
-
*/
|
|
125
|
-
keys(): Iterable<CacheKey>;
|
|
126
|
-
/**
|
|
127
|
-
* Subscribe to cache events.
|
|
128
|
-
*
|
|
129
|
-
* @param listener - Event listener
|
|
130
|
-
* @returns Unsubscribe function
|
|
131
|
-
*/
|
|
132
|
-
subscribe(listener: (event: CacheEvent) => void): () => void;
|
|
133
|
-
/**
|
|
134
|
-
* Emit a cache event to listeners.
|
|
135
|
-
*
|
|
136
|
-
* Listener errors are caught and logged to `console.error`.
|
|
137
|
-
*
|
|
138
|
-
* @param event - Cache event payload
|
|
139
|
-
*/
|
|
140
|
-
emit(event: CacheEvent): void;
|
|
141
|
-
/**
|
|
142
|
-
* Invalidate entries matching any tag.
|
|
143
|
-
*
|
|
144
|
-
* @param tags - Tags to invalidate
|
|
145
|
-
*/
|
|
146
|
-
invalidateTags(tags: string[]): void;
|
|
147
|
-
private addTags;
|
|
148
|
-
private removeTags;
|
|
149
21
|
}
|
|
150
|
-
/**
|
|
151
|
-
* Options for cache and stale-while-revalidate.
|
|
152
|
-
*
|
|
153
|
-
* @property ttl - Time-to-live in milliseconds (fresh window)
|
|
154
|
-
* @property staleTtl - Additional stale window after ttl expires
|
|
155
|
-
* @property tags - Tags to associate with stored entries
|
|
156
|
-
* @property dedupe - Share in-flight requests for the same key
|
|
157
|
-
*/
|
|
158
22
|
export type CacheOptions = {
|
|
159
|
-
/**
|
|
160
|
-
* Time-to-live in milliseconds. When undefined, entries are always fresh.
|
|
161
|
-
*/
|
|
162
23
|
ttl?: number;
|
|
163
|
-
/**
|
|
164
|
-
* Additional stale window after ttl expires.
|
|
165
|
-
*/
|
|
166
|
-
staleTtl?: number;
|
|
167
|
-
/**
|
|
168
|
-
* Tags to associate with stored entries.
|
|
169
|
-
*/
|
|
170
|
-
tags?: string[];
|
|
171
|
-
/**
|
|
172
|
-
* Dedupe in-flight requests for the same key. Defaults to true.
|
|
173
|
-
*/
|
|
174
24
|
dedupe?: boolean;
|
|
175
25
|
};
|
|
176
|
-
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
183
|
-
*
|
|
184
|
-
* @template T - Resolved data type
|
|
185
|
-
* @template Args - TaskFn argument tuple
|
|
186
|
-
* @param key - Cache key for the entry
|
|
187
|
-
* @param store - CacheStore implementation
|
|
188
|
-
* @param options - Cache behavior options
|
|
189
|
-
* @returns A combinator that returns a TaskFn resolving to cached or fresh data
|
|
190
|
-
*
|
|
191
|
-
* @example
|
|
192
|
-
* ```typescript
|
|
193
|
-
* const store = new MemoryCacheStore();
|
|
194
|
-
* const taskFn = pipe(
|
|
195
|
-
* (signal) => fetch("/api/users", { signal }).then((r) => r.json()),
|
|
196
|
-
* cache("users", store, { ttl: 10_000 })
|
|
197
|
-
* );
|
|
198
|
-
* const users = await taskFn();
|
|
199
|
-
* ```
|
|
200
|
-
*/
|
|
26
|
+
/** Options for stale-while-revalidate behavior. */
|
|
27
|
+
export type StaleWhileRevalidateOptions = CacheOptions & {
|
|
28
|
+
ttl: number;
|
|
29
|
+
staleTtl?: number;
|
|
30
|
+
};
|
|
31
|
+
/** Cache wrapper with optional TTL and in-flight deduplication. */
|
|
201
32
|
export declare const cache: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options?: CacheOptions) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
202
33
|
/**
|
|
203
|
-
* Return
|
|
204
|
-
*
|
|
205
|
-
* Returns cached data when fresh, or when within the stale window.
|
|
206
|
-
* If the TaskFn rejects (including AbortError), the cache is not updated.
|
|
207
|
-
* Dedupe is enabled by default; when deduped, only the first caller's AbortSignal is used.
|
|
208
|
-
* Background revalidation does not use the caller's AbortSignal.
|
|
209
|
-
* Background errors emit `revalidateError`, are ignored, and do not update the cache.
|
|
210
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
211
|
-
*
|
|
212
|
-
* @template T - Resolved data type
|
|
213
|
-
* @template Args - TaskFn argument tuple
|
|
214
|
-
* @param key - Cache key for the entry
|
|
215
|
-
* @param store - CacheStore implementation
|
|
216
|
-
* @param options - Cache behavior options
|
|
217
|
-
* @returns A combinator that returns a TaskFn resolving to cached or fresh data
|
|
218
|
-
*
|
|
219
|
-
* @example
|
|
220
|
-
* ```typescript
|
|
221
|
-
* const store = new MemoryCacheStore();
|
|
222
|
-
* const taskFn = pipe(
|
|
223
|
-
* (signal) => fetch("/api/feed", { signal }).then((r) => r.json()),
|
|
224
|
-
* staleWhileRevalidate("feed", store, { ttl: 5_000, staleTtl: 30_000 })
|
|
225
|
-
* );
|
|
226
|
-
* const feed = await taskFn();
|
|
227
|
-
* ```
|
|
228
|
-
*/
|
|
229
|
-
export declare const staleWhileRevalidate: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options?: CacheOptions) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
230
|
-
/**
|
|
231
|
-
* Invalidate cache entries after a TaskFn resolves.
|
|
232
|
-
*
|
|
233
|
-
* Supports keys, key arrays, tags, or a resolver function.
|
|
234
|
-
* If the TaskFn rejects (including AbortError), no invalidation happens.
|
|
235
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
236
|
-
*
|
|
237
|
-
* @template T - Resolved data type
|
|
238
|
-
* @template Args - TaskFn argument tuple
|
|
239
|
-
* @param target - Keys, tags, or resolver for invalidation
|
|
240
|
-
* @param store - CacheStore implementation
|
|
241
|
-
* @returns A combinator that returns a TaskFn resolving to the original result
|
|
242
|
-
*
|
|
243
|
-
* @example
|
|
244
|
-
* ```typescript
|
|
245
|
-
* const store = new MemoryCacheStore();
|
|
246
|
-
* const taskFn = pipe(
|
|
247
|
-
* (signal) => fetch("/api/posts", { method: "POST", signal }).then((r) => r.json()),
|
|
248
|
-
* invalidateOnResolve({ tags: ["posts"] }, store)
|
|
249
|
-
* );
|
|
250
|
-
* await taskFn();
|
|
251
|
-
* ```
|
|
34
|
+
* Return stale values within a stale window and refresh in background.
|
|
252
35
|
*/
|
|
253
|
-
export declare const
|
|
254
|
-
tags: string[];
|
|
255
|
-
} | ((result: T) => CacheKey | CacheKey[] | {
|
|
256
|
-
tags: string[];
|
|
257
|
-
}), store: CacheStore) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
36
|
+
export declare const staleWhileRevalidate: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options: StaleWhileRevalidateOptions) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
258
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,qDAAqD;AACrD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,8CAA8C;AAC9C,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS;IAIhD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;CAG5B;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA2EF,mEAAmE;AACnE,eAAO,MAAM,KAAK,GACf,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAC7B,KAAK,QAAQ,EACb,OAAO,UAAU,EACjB,UAAS,YAAiB,MAE3B,QAAQ,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAKxC,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC9B,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAC7B,KAAK,QAAQ,EACb,OAAO,UAAU,EACjB,SAAS,2BAA2B,MAErC,QAAQ,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAcxC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,149 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory CacheStore with tag support.
|
|
3
|
-
*
|
|
4
|
-
* Emits cache events on set, delete, clear, and tag invalidation.
|
|
5
|
-
* Listener errors are caught and logged.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* const store = new MemoryCacheStore();
|
|
10
|
-
* store.set("user:1", { value: { id: 1 }, createdAt: Date.now(), updatedAt: Date.now() });
|
|
11
|
-
* const entry = store.get<{ id: number }>("user:1");
|
|
12
|
-
* ```
|
|
13
|
-
*/
|
|
1
|
+
/** In-memory `CacheStore` backed by `Map`. */
|
|
14
2
|
export class MemoryCacheStore {
|
|
15
3
|
constructor() {
|
|
16
4
|
this.store = new Map();
|
|
17
|
-
this.tagIndex = new Map();
|
|
18
|
-
this.listeners = new Set();
|
|
19
5
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Get a cache entry by key.
|
|
22
|
-
*
|
|
23
|
-
* @template T - Cached value type
|
|
24
|
-
* @param key - Cache key
|
|
25
|
-
* @returns The cache entry, or undefined when missing
|
|
26
|
-
*/
|
|
27
6
|
get(key) {
|
|
28
7
|
return this.store.get(key);
|
|
29
8
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Set a cache entry by key.
|
|
32
|
-
*
|
|
33
|
-
* Replaces any existing entry and updates tag indices.
|
|
34
|
-
*
|
|
35
|
-
* @template T - Cached value type
|
|
36
|
-
* @param key - Cache key
|
|
37
|
-
* @param entry - Entry to store
|
|
38
|
-
*/
|
|
39
9
|
set(key, entry) {
|
|
40
|
-
const existing = this.store.get(key);
|
|
41
|
-
if (existing?.tags)
|
|
42
|
-
this.removeTags(key, existing.tags);
|
|
43
|
-
if (entry.tags)
|
|
44
|
-
this.addTags(key, entry.tags);
|
|
45
10
|
this.store.set(key, entry);
|
|
46
|
-
this.emit({ type: "set", key, entry });
|
|
47
11
|
}
|
|
48
|
-
/**
|
|
49
|
-
* Delete a cache entry by key.
|
|
50
|
-
*
|
|
51
|
-
* Emits an `invalidate` event with the previous entry when present.
|
|
52
|
-
*
|
|
53
|
-
* @param key - Cache key
|
|
54
|
-
*/
|
|
55
12
|
delete(key) {
|
|
56
|
-
const existing = this.store.get(key);
|
|
57
|
-
if (existing?.tags)
|
|
58
|
-
this.removeTags(key, existing.tags);
|
|
59
13
|
this.store.delete(key);
|
|
60
|
-
this.emit({ type: "invalidate", key, entry: existing });
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Clear all entries.
|
|
64
|
-
*
|
|
65
|
-
* @returns Returns nothing.
|
|
66
|
-
*/
|
|
67
|
-
clear() {
|
|
68
|
-
this.store.clear();
|
|
69
|
-
this.tagIndex.clear();
|
|
70
|
-
this.emit({ type: "clear" });
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Check whether a key exists.
|
|
74
|
-
*
|
|
75
|
-
* @param key - Cache key
|
|
76
|
-
* @returns True when the key exists
|
|
77
|
-
*/
|
|
78
|
-
has(key) {
|
|
79
|
-
return this.store.has(key);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* List all keys.
|
|
83
|
-
*
|
|
84
|
-
* @returns Iterable of cache keys
|
|
85
|
-
*/
|
|
86
|
-
keys() {
|
|
87
|
-
return this.store.keys();
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Subscribe to cache events.
|
|
91
|
-
*
|
|
92
|
-
* @param listener - Event listener
|
|
93
|
-
* @returns Unsubscribe function
|
|
94
|
-
*/
|
|
95
|
-
subscribe(listener) {
|
|
96
|
-
this.listeners.add(listener);
|
|
97
|
-
return () => this.listeners.delete(listener);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Emit a cache event to listeners.
|
|
101
|
-
*
|
|
102
|
-
* Listener errors are caught and logged to `console.error`.
|
|
103
|
-
*
|
|
104
|
-
* @param event - Cache event payload
|
|
105
|
-
*/
|
|
106
|
-
emit(event) {
|
|
107
|
-
for (const listener of this.listeners) {
|
|
108
|
-
try {
|
|
109
|
-
listener(event);
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
console.error("Cache listener error", error);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Invalidate entries matching any tag.
|
|
118
|
-
*
|
|
119
|
-
* @param tags - Tags to invalidate
|
|
120
|
-
*/
|
|
121
|
-
invalidateTags(tags) {
|
|
122
|
-
for (const tag of tags) {
|
|
123
|
-
const keys = this.tagIndex.get(tag);
|
|
124
|
-
if (!keys)
|
|
125
|
-
continue;
|
|
126
|
-
for (const key of keys)
|
|
127
|
-
this.delete(key);
|
|
128
|
-
this.tagIndex.delete(tag);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
addTags(key, tags) {
|
|
132
|
-
for (const tag of tags) {
|
|
133
|
-
const set = this.tagIndex.get(tag) ?? new Set();
|
|
134
|
-
set.add(key);
|
|
135
|
-
this.tagIndex.set(tag, set);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
removeTags(key, tags) {
|
|
139
|
-
for (const tag of tags) {
|
|
140
|
-
const set = this.tagIndex.get(tag);
|
|
141
|
-
if (!set)
|
|
142
|
-
continue;
|
|
143
|
-
set.delete(key);
|
|
144
|
-
if (set.size === 0)
|
|
145
|
-
this.tagIndex.delete(tag);
|
|
146
|
-
}
|
|
147
14
|
}
|
|
148
15
|
}
|
|
149
16
|
const pendingByStore = new WeakMap();
|
|
@@ -160,46 +27,37 @@ const isFresh = (entry, ttl) => {
|
|
|
160
27
|
return true;
|
|
161
28
|
return Date.now() - entry.updatedAt <= ttl;
|
|
162
29
|
};
|
|
30
|
+
const toValidTtl = (ttl) => {
|
|
31
|
+
if (typeof ttl !== "number" || !Number.isFinite(ttl) || ttl < 0) {
|
|
32
|
+
throw new Error("staleWhileRevalidate requires a non-negative finite ttl");
|
|
33
|
+
}
|
|
34
|
+
return ttl;
|
|
35
|
+
};
|
|
163
36
|
const isWithinStale = (entry, ttl, staleTtl) => {
|
|
164
|
-
if (ttl === undefined)
|
|
165
|
-
return false;
|
|
166
37
|
const age = Date.now() - entry.updatedAt;
|
|
167
38
|
return age > ttl && age <= ttl + (staleTtl ?? 0);
|
|
168
39
|
};
|
|
169
|
-
const setEntry = (store, key, value
|
|
170
|
-
const now = Date.now();
|
|
40
|
+
const setEntry = (store, key, value) => {
|
|
171
41
|
const entry = {
|
|
172
42
|
value,
|
|
173
|
-
|
|
174
|
-
updatedAt: now,
|
|
175
|
-
tags,
|
|
43
|
+
updatedAt: Date.now(),
|
|
176
44
|
};
|
|
177
45
|
store.set(key, entry);
|
|
178
46
|
return entry;
|
|
179
47
|
};
|
|
180
|
-
const resolveWithDedupe = async (key, store, taskFn,
|
|
48
|
+
const resolveWithDedupe = async (key, store, taskFn, args, options = {}) => {
|
|
181
49
|
const dedupe = options.dedupe !== false;
|
|
182
50
|
const pending = dedupe ? getPendingMap(store) : undefined;
|
|
183
51
|
if (pending) {
|
|
184
52
|
const inFlight = pending.get(key);
|
|
185
|
-
if (inFlight)
|
|
186
|
-
if (onError) {
|
|
187
|
-
inFlight.catch((error) => {
|
|
188
|
-
onError(error);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
53
|
+
if (inFlight)
|
|
191
54
|
return inFlight;
|
|
192
|
-
}
|
|
193
55
|
}
|
|
194
56
|
const promise = Promise.resolve()
|
|
195
|
-
.then(() => taskFn(
|
|
57
|
+
.then(() => taskFn(...args))
|
|
196
58
|
.then((value) => {
|
|
197
|
-
setEntry(store, key, value
|
|
59
|
+
setEntry(store, key, value);
|
|
198
60
|
return value;
|
|
199
|
-
})
|
|
200
|
-
.catch((error) => {
|
|
201
|
-
onError?.(error);
|
|
202
|
-
throw error;
|
|
203
61
|
})
|
|
204
62
|
.finally(() => {
|
|
205
63
|
pending?.delete(key);
|
|
@@ -207,121 +65,27 @@ const resolveWithDedupe = async (key, store, taskFn, signal, args, options = {},
|
|
|
207
65
|
pending?.set(key, promise);
|
|
208
66
|
return promise;
|
|
209
67
|
};
|
|
210
|
-
/**
|
|
211
|
-
|
|
212
|
-
*
|
|
213
|
-
* Returns cached data when fresh; otherwise runs the TaskFn and stores the result.
|
|
214
|
-
* If the TaskFn rejects (including AbortError), the cache is not updated.
|
|
215
|
-
* Dedupe is enabled by default; when deduped, only the first caller's AbortSignal is used.
|
|
216
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
217
|
-
*
|
|
218
|
-
* @template T - Resolved data type
|
|
219
|
-
* @template Args - TaskFn argument tuple
|
|
220
|
-
* @param key - Cache key for the entry
|
|
221
|
-
* @param store - CacheStore implementation
|
|
222
|
-
* @param options - Cache behavior options
|
|
223
|
-
* @returns A combinator that returns a TaskFn resolving to cached or fresh data
|
|
224
|
-
*
|
|
225
|
-
* @example
|
|
226
|
-
* ```typescript
|
|
227
|
-
* const store = new MemoryCacheStore();
|
|
228
|
-
* const taskFn = pipe(
|
|
229
|
-
* (signal) => fetch("/api/users", { signal }).then((r) => r.json()),
|
|
230
|
-
* cache("users", store, { ttl: 10_000 })
|
|
231
|
-
* );
|
|
232
|
-
* const users = await taskFn();
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
export const cache = (key, store, options = {}) => (taskFn) => async (signal, ...args) => {
|
|
68
|
+
/** Cache wrapper with optional TTL and in-flight deduplication. */
|
|
69
|
+
export const cache = (key, store, options = {}) => (taskFn) => async (...args) => {
|
|
236
70
|
const entry = store.get(key);
|
|
237
|
-
if (entry && isFresh(entry, options.ttl))
|
|
238
|
-
store.emit?.({ type: "hit", key, entry });
|
|
71
|
+
if (entry && isFresh(entry, options.ttl))
|
|
239
72
|
return entry.value;
|
|
240
|
-
|
|
241
|
-
store.emit?.({ type: entry ? "stale" : "miss", key, entry });
|
|
242
|
-
return resolveWithDedupe(key, store, taskFn, signal, args, options, entry);
|
|
73
|
+
return resolveWithDedupe(key, store, taskFn, args, options);
|
|
243
74
|
};
|
|
244
75
|
/**
|
|
245
|
-
* Return
|
|
246
|
-
*
|
|
247
|
-
* Returns cached data when fresh, or when within the stale window.
|
|
248
|
-
* If the TaskFn rejects (including AbortError), the cache is not updated.
|
|
249
|
-
* Dedupe is enabled by default; when deduped, only the first caller's AbortSignal is used.
|
|
250
|
-
* Background revalidation does not use the caller's AbortSignal.
|
|
251
|
-
* Background errors emit `revalidateError`, are ignored, and do not update the cache.
|
|
252
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
253
|
-
*
|
|
254
|
-
* @template T - Resolved data type
|
|
255
|
-
* @template Args - TaskFn argument tuple
|
|
256
|
-
* @param key - Cache key for the entry
|
|
257
|
-
* @param store - CacheStore implementation
|
|
258
|
-
* @param options - Cache behavior options
|
|
259
|
-
* @returns A combinator that returns a TaskFn resolving to cached or fresh data
|
|
260
|
-
*
|
|
261
|
-
* @example
|
|
262
|
-
* ```typescript
|
|
263
|
-
* const store = new MemoryCacheStore();
|
|
264
|
-
* const taskFn = pipe(
|
|
265
|
-
* (signal) => fetch("/api/feed", { signal }).then((r) => r.json()),
|
|
266
|
-
* staleWhileRevalidate("feed", store, { ttl: 5_000, staleTtl: 30_000 })
|
|
267
|
-
* );
|
|
268
|
-
* const feed = await taskFn();
|
|
269
|
-
* ```
|
|
76
|
+
* Return stale values within a stale window and refresh in background.
|
|
270
77
|
*/
|
|
271
|
-
export const staleWhileRevalidate = (key, store, options
|
|
78
|
+
export const staleWhileRevalidate = (key, store, options) => (taskFn) => async (...args) => {
|
|
79
|
+
const ttl = toValidTtl(options?.ttl);
|
|
272
80
|
const entry = store.get(key);
|
|
273
|
-
if (entry && isFresh(entry,
|
|
274
|
-
store.emit?.({ type: "hit", key, entry });
|
|
81
|
+
if (entry && isFresh(entry, ttl))
|
|
275
82
|
return entry.value;
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
store.emit?.({ type: "stale", key, entry });
|
|
279
|
-
store.emit?.({ type: "revalidate", key, entry });
|
|
280
|
-
void resolveWithDedupe(key, store, taskFn, undefined, args, options, entry, (error) => {
|
|
281
|
-
store.emit?.({ type: "revalidateError", key, entry, error });
|
|
282
|
-
}).catch(() => {
|
|
83
|
+
if (entry && isWithinStale(entry, ttl, options.staleTtl)) {
|
|
84
|
+
void resolveWithDedupe(key, store, taskFn, args, options).catch(() => {
|
|
283
85
|
// Background revalidation errors are ignored.
|
|
284
86
|
});
|
|
285
87
|
return entry.value;
|
|
286
88
|
}
|
|
287
|
-
|
|
288
|
-
return resolveWithDedupe(key, store, taskFn, signal, args, options, entry);
|
|
289
|
-
};
|
|
290
|
-
/**
|
|
291
|
-
* Invalidate cache entries after a TaskFn resolves.
|
|
292
|
-
*
|
|
293
|
-
* Supports keys, key arrays, tags, or a resolver function.
|
|
294
|
-
* If the TaskFn rejects (including AbortError), no invalidation happens.
|
|
295
|
-
* The returned TaskFn rejects when the underlying TaskFn rejects.
|
|
296
|
-
*
|
|
297
|
-
* @template T - Resolved data type
|
|
298
|
-
* @template Args - TaskFn argument tuple
|
|
299
|
-
* @param target - Keys, tags, or resolver for invalidation
|
|
300
|
-
* @param store - CacheStore implementation
|
|
301
|
-
* @returns A combinator that returns a TaskFn resolving to the original result
|
|
302
|
-
*
|
|
303
|
-
* @example
|
|
304
|
-
* ```typescript
|
|
305
|
-
* const store = new MemoryCacheStore();
|
|
306
|
-
* const taskFn = pipe(
|
|
307
|
-
* (signal) => fetch("/api/posts", { method: "POST", signal }).then((r) => r.json()),
|
|
308
|
-
* invalidateOnResolve({ tags: ["posts"] }, store)
|
|
309
|
-
* );
|
|
310
|
-
* await taskFn();
|
|
311
|
-
* ```
|
|
312
|
-
*/
|
|
313
|
-
export const invalidateOnResolve = (target, store) => (taskFn) => async (signal, ...args) => {
|
|
314
|
-
const result = await taskFn(signal, ...args);
|
|
315
|
-
const resolved = typeof target === "function" ? target(result) : target;
|
|
316
|
-
if (typeof resolved === "object" &&
|
|
317
|
-
!Array.isArray(resolved) &&
|
|
318
|
-
"tags" in resolved) {
|
|
319
|
-
store.invalidateTags?.(resolved.tags);
|
|
320
|
-
return result;
|
|
321
|
-
}
|
|
322
|
-
const keys = Array.isArray(resolved) ? resolved : [resolved];
|
|
323
|
-
for (const key of keys)
|
|
324
|
-
store.delete(key);
|
|
325
|
-
return result;
|
|
89
|
+
return resolveWithDedupe(key, store, taskFn, args, options);
|
|
326
90
|
};
|
|
327
91
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gantryland/task-cache",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Task-function cache wrappers for @gantryland/task",
|
|
5
5
|
"keywords": ["task", "cache", "memoize", "async"],
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -13,7 +13,13 @@
|
|
|
13
13
|
},
|
|
14
14
|
"./package.json": "./package.json"
|
|
15
15
|
},
|
|
16
|
-
"files": [
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/index.js",
|
|
18
|
+
"dist/index.js.map",
|
|
19
|
+
"dist/index.d.ts",
|
|
20
|
+
"dist/index.d.ts.map",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
17
23
|
"scripts": {
|
|
18
24
|
"prepack": "tsc -b"
|
|
19
25
|
},
|
|
@@ -34,6 +40,6 @@
|
|
|
34
40
|
},
|
|
35
41
|
"homepage": "https://github.com/joehoot/gantryland/tree/main/packages/task-cache#readme",
|
|
36
42
|
"dependencies": {
|
|
37
|
-
"@gantryland/task": "^0.
|
|
43
|
+
"@gantryland/task": "^0.4.0"
|
|
38
44
|
}
|
|
39
45
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/typescript/lib/lib.es2020.full.d.ts","../../task/dist/index.d.ts","../index.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/prop-types/index.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@types/react-test-renderer/index.d.ts"],"fileIdsList":[[60,108,125,126],[60,105,106,108,125,126],[60,107,108,125,126],[108,125,126],[60,108,113,125,126,143],[60,108,109,114,119,125,126,128,140,151],[60,108,109,110,119,125,126,128],[55,56,57,60,108,125,126],[60,108,111,125,126,152],[60,108,112,113,120,125,126,129],[60,108,113,125,126,140,148],[60,108,114,116,119,125,126,128],[60,107,108,115,125,126],[60,108,116,117,125,126],[60,108,118,119,125,126],[60,107,108,119,125,126],[60,108,119,120,121,125,126,140,151],[60,108,119,120,121,125,126,135,140,143],[60,101,108,116,119,122,125,126,128,140,151],[60,108,119,120,122,123,125,126,128,140,148,151],[60,108,122,124,125,126,140,148,151],[58,59,60,61,62,63,64,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157],[60,108,119,125,126],[60,108,125,126,127,151],[60,108,116,119,125,126,128,140],[60,108,125,126,129],[60,108,125,126,130],[60,107,108,125,126,131],[60,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157],[60,108,125,126,133],[60,108,125,126,134],[60,108,119,125,126,135,136],[60,108,125,126,135,137,152,154],[60,108,120,125,126],[60,108,119,125,126,140,141,143],[60,108,125,126,142,143],[60,108,125,126,140,141],[60,108,125,126,143],[60,108,125,126,144],[60,105,108,125,126,140,145],[60,108,119,125,126,146,147],[60,108,125,126,146,147],[60,108,113,125,126,128,140,148],[60,108,125,126,149],[60,108,125,126,128,150],[60,108,122,125,126,134,151],[60,108,113,125,126,152],[60,108,125,126,140,153],[60,108,125,126,127,154],[60,108,125,126,155],[60,101,108,125,126],[60,101,108,119,121,125,126,131,140,143,151,153,154,156],[60,108,125,126,140,157],[60,108,125,126,162],[60,108,125,126,159,160,161],[60,73,77,108,125,126,151],[60,73,108,125,126,140,151],[60,68,108,125,126],[60,70,73,108,125,126,148,151],[60,108,125,126,128,148],[60,108,125,126,158],[60,68,108,125,126,158],[60,70,73,108,125,126,128,151],[60,65,66,69,72,108,119,125,126,140,151],[60,73,80,108,125,126],[60,65,71,108,125,126],[60,73,94,95,108,125,126],[60,69,73,108,125,126,143,151,158],[60,94,108,125,126,158],[60,67,68,108,125,126,158],[60,73,108,125,126],[60,67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,108,125,126],[60,73,88,108,125,126],[60,73,80,81,108,125,126],[60,71,73,81,82,108,125,126],[60,72,108,125,126],[60,65,68,73,108,125,126],[60,73,77,81,82,108,125,126],[60,77,108,125,126],[60,71,73,76,108,125,126,151],[60,65,70,73,80,108,125,126],[60,108,125,126,140],[60,68,73,94,108,125,126,156,158],[52,60,108,125,126]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"dafe6ade5bf79ad163c589ac03e0d21f760c432e34df45f5bada14f7b5ceb4d3","impliedFormat":99},{"version":"c14c3b8da5ce3cfc4ef06f40a05c3778d06d5eda5819809c28831448f37ad81f","signature":"577c83c5f7de9dc8331661550b506aa81546dadede4f2a5aaed92086df18f6e5","impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"bb45cd435da536500f1d9692a9b49d0c570b763ccbf00473248b777f5c1f353b","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c959a391a75be9789b43c8468f71e3fa06488b4d691d5729dde1416dcd38225b","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"a370e617fd7ec5ff8c99f3582001f7c9ebf03e3c5be4113d3a504d321aff48fd","impliedFormat":1}],"root":[53],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strict":true,"target":7},"referencedMap":[[54,1],[105,2],[106,2],[107,3],[60,4],[108,5],[109,6],[110,7],[55,1],[58,8],[56,1],[57,1],[111,9],[112,10],[113,11],[114,12],[115,13],[116,14],[117,14],[118,15],[119,16],[120,17],[121,18],[61,1],[59,1],[122,19],[123,20],[124,21],[158,22],[125,23],[126,1],[127,24],[128,25],[129,26],[130,27],[131,28],[132,29],[133,30],[134,31],[135,32],[136,32],[137,33],[138,1],[139,34],[140,35],[142,36],[141,37],[143,38],[144,39],[145,40],[146,41],[147,42],[148,43],[149,44],[150,45],[151,46],[152,47],[153,48],[154,49],[155,50],[62,1],[63,1],[64,1],[102,51],[103,1],[104,1],[156,52],[157,53],[159,1],[163,54],[160,1],[162,55],[161,1],[49,1],[50,1],[10,1],[8,1],[9,1],[14,1],[13,1],[2,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[3,1],[23,1],[24,1],[4,1],[25,1],[29,1],[26,1],[27,1],[28,1],[30,1],[31,1],[32,1],[5,1],[33,1],[34,1],[35,1],[36,1],[6,1],[40,1],[37,1],[38,1],[39,1],[41,1],[7,1],[42,1],[51,1],[47,1],[48,1],[43,1],[44,1],[45,1],[46,1],[1,1],[12,1],[11,1],[80,56],[90,57],[79,56],[100,58],[71,59],[70,60],[99,61],[93,62],[98,63],[73,64],[87,65],[72,66],[96,67],[68,68],[67,61],[97,69],[69,70],[74,71],[75,1],[78,71],[65,1],[101,72],[91,73],[82,74],[83,75],[85,76],[81,77],[84,78],[94,61],[76,79],[77,80],[86,81],[66,82],[89,73],[88,71],[92,1],[95,83],[53,84],[52,1]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|