@gantryland/task-cache 0.2.3 → 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 +77 -319
- package/dist/index.d.ts +13 -97
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -144
- package/dist/index.js.map +1 -1
- package/package.json +14 -10
- package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -1,382 +1,140 @@
|
|
|
1
1
|
# @gantryland/task-cache
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
- Works with any TaskFn, no framework coupling.
|
|
6
|
-
- Built-in in-memory store with tag invalidation and events.
|
|
7
|
-
- Stale-while-revalidate and dedupe support out of the box.
|
|
8
|
-
- Works in browser and Node.js with no dependencies.
|
|
3
|
+
Task-function cache wrappers with TTL, stale-while-revalidate, and in-flight dedupe.
|
|
9
4
|
|
|
10
5
|
## Installation
|
|
11
6
|
|
|
12
7
|
```bash
|
|
13
|
-
npm install @gantryland/task-cache
|
|
8
|
+
npm install @gantryland/task @gantryland/task-cache
|
|
14
9
|
```
|
|
15
10
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
- [Quick start](#quick-start)
|
|
19
|
-
- [Design goals](#design-goals)
|
|
20
|
-
- [When to use task-cache](#when-to-use-task-cache)
|
|
21
|
-
- [When not to use task-cache](#when-not-to-use-task-cache)
|
|
22
|
-
- [Core concepts](#core-concepts)
|
|
23
|
-
- [Flow](#flow)
|
|
24
|
-
- [API](#api)
|
|
25
|
-
- [Common patterns](#common-patterns)
|
|
26
|
-
- [Integrations](#integrations)
|
|
27
|
-
- [Related packages](#related-packages)
|
|
28
|
-
- [Tests](#tests)
|
|
29
|
-
|
|
30
|
-
## Quick start
|
|
11
|
+
## Quick Start
|
|
31
12
|
|
|
32
13
|
```typescript
|
|
33
14
|
import { Task } from "@gantryland/task";
|
|
34
15
|
import { MemoryCacheStore, cache } from "@gantryland/task-cache";
|
|
35
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
36
16
|
|
|
37
17
|
const store = new MemoryCacheStore();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
pipe(
|
|
41
|
-
(signal) => fetch("/api/users", { signal }).then((r) => r.json()),
|
|
42
|
-
cache("users", store, { ttl: 60_000, tags: ["users"] })
|
|
43
|
-
)
|
|
18
|
+
const usersTaskFn = cache("users", store, { ttl: 60_000 })(
|
|
19
|
+
() => fetch("/api/users").then((r) => r.json()),
|
|
44
20
|
);
|
|
45
21
|
|
|
46
|
-
|
|
47
|
-
await usersTask.run(); // cache hit
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
This example shows `cache` reuse for fresh data.
|
|
51
|
-
|
|
52
|
-
## Design goals
|
|
53
|
-
|
|
54
|
-
- Make caching explicit and composable at the TaskFn level.
|
|
55
|
-
- Keep stores minimal so you can swap implementations.
|
|
56
|
-
- Provide deterministic cache semantics and clear invalidation paths.
|
|
57
|
-
|
|
58
|
-
## When to use task-cache
|
|
22
|
+
const usersTask = new Task(usersTaskFn);
|
|
59
23
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- You want tag-based invalidation or cache events.
|
|
63
|
-
|
|
64
|
-
## When not to use task-cache
|
|
65
|
-
|
|
66
|
-
- You need a full data layer with automatic normalization.
|
|
67
|
-
- You cannot tolerate stale reads of any kind.
|
|
68
|
-
|
|
69
|
-
## Core concepts
|
|
70
|
-
|
|
71
|
-
### CacheStore
|
|
72
|
-
|
|
73
|
-
Minimal interface for cache backends.
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
type CacheStore = {
|
|
77
|
-
get<T>(key: CacheKey): CacheEntry<T> | undefined
|
|
78
|
-
set<T>(key: CacheKey, entry: CacheEntry<T>): void
|
|
79
|
-
delete(key: CacheKey): void
|
|
80
|
-
clear(): void
|
|
81
|
-
has(key: CacheKey): boolean
|
|
82
|
-
keys?(): Iterable<CacheKey>
|
|
83
|
-
subscribe?(listener: (event: CacheEvent) => void): () => void
|
|
84
|
-
emit?(event: CacheEvent): void
|
|
85
|
-
invalidateTags?(tags: string[]): void
|
|
86
|
-
}
|
|
24
|
+
await usersTask.run();
|
|
25
|
+
await usersTask.run();
|
|
87
26
|
```
|
|
88
27
|
|
|
89
|
-
|
|
28
|
+
## Exports
|
|
90
29
|
|
|
91
|
-
|
|
92
|
-
type CacheEntry<T> = {
|
|
93
|
-
value: T
|
|
94
|
-
createdAt: number
|
|
95
|
-
updatedAt: number
|
|
96
|
-
tags?: string[]
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### CacheEvent
|
|
101
|
-
|
|
102
|
-
Stores can emit events to power analytics, logging, or invalidation tracing.
|
|
103
|
-
|
|
104
|
-
Event types: `hit`, `miss`, `stale`, `set`, `invalidate`, `clear`, `revalidate`.
|
|
105
|
-
|
|
106
|
-
### CacheKey
|
|
107
|
-
|
|
108
|
-
Cache keys can be strings, numbers, or symbols. Use `cacheKey` for consistent keys across call sites.
|
|
109
|
-
|
|
110
|
-
## Flow
|
|
111
|
-
|
|
112
|
-
```text
|
|
113
|
-
cache(): fresh -> return
|
|
114
|
-
cache(): stale/miss -> fetch -> store -> return
|
|
115
|
-
|
|
116
|
-
staleWhileRevalidate(): fresh -> return
|
|
117
|
-
staleWhileRevalidate(): stale -> return stale -> revalidate in background
|
|
118
|
-
staleWhileRevalidate(): miss -> fetch -> store -> return
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## API
|
|
122
|
-
|
|
123
|
-
### API at a glance
|
|
124
|
-
|
|
125
|
-
| Member | Purpose | Returns |
|
|
30
|
+
| Export | Kind | What it does |
|
|
126
31
|
| --- | --- | --- |
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
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?`). |
|
|
135
40
|
|
|
136
|
-
|
|
41
|
+
## API Reference
|
|
137
42
|
|
|
138
|
-
|
|
43
|
+
### `MemoryCacheStore`
|
|
139
44
|
|
|
140
|
-
|
|
141
|
-
const store = new MemoryCacheStore();
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
#### store.get
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
store.get<T>(key: CacheKey): CacheEntry<T> | undefined
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Read an entry by key.
|
|
151
|
-
|
|
152
|
-
#### store.set
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
store.set<T>(key: CacheKey, entry: CacheEntry<T>): void
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Write an entry by key and emit a `set` event.
|
|
159
|
-
|
|
160
|
-
#### store.delete
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
store.delete(key: CacheKey): void
|
|
164
|
-
```
|
|
45
|
+
Provides an in-memory `CacheStore` implementation backed by `Map`.
|
|
165
46
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
store.clear(): void
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
Clear all entries and emit a `clear` event.
|
|
175
|
-
|
|
176
|
-
#### store.has
|
|
177
|
-
|
|
178
|
-
```typescript
|
|
179
|
-
store.has(key: CacheKey): boolean
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Check whether a key exists.
|
|
183
|
-
|
|
184
|
-
#### store.keys
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
store.keys(): Iterable<CacheKey>
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Return all keys.
|
|
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`. |
|
|
191
52
|
|
|
192
|
-
|
|
53
|
+
### `cache`
|
|
193
54
|
|
|
194
55
|
```typescript
|
|
195
|
-
|
|
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>
|
|
196
61
|
```
|
|
197
62
|
|
|
198
|
-
|
|
63
|
+
Returns a wrapper that serves fresh cache hits and resolves source on miss or stale entry.
|
|
199
64
|
|
|
200
|
-
|
|
65
|
+
### `staleWhileRevalidate`
|
|
201
66
|
|
|
202
67
|
```typescript
|
|
203
|
-
|
|
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>
|
|
204
73
|
```
|
|
205
74
|
|
|
206
|
-
|
|
75
|
+
Returns a wrapper that can return stale values within `staleTtl` while refreshing in background.
|
|
207
76
|
|
|
208
|
-
|
|
77
|
+
### Types
|
|
209
78
|
|
|
210
79
|
```typescript
|
|
211
|
-
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
Invalidate all entries matching any tag.
|
|
215
|
-
|
|
216
|
-
### cache
|
|
80
|
+
type CacheKey = string | number | symbol;
|
|
217
81
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
```
|
|
82
|
+
type CacheEntry<T> = {
|
|
83
|
+
value: T;
|
|
84
|
+
updatedAt: number;
|
|
85
|
+
};
|
|
223
86
|
|
|
224
|
-
|
|
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;
|
|
91
|
+
};
|
|
225
92
|
|
|
226
|
-
```typescript
|
|
227
93
|
type CacheOptions = {
|
|
228
|
-
ttl?: number
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
dedupe?: boolean
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### staleWhileRevalidate
|
|
94
|
+
ttl?: number;
|
|
95
|
+
dedupe?: boolean;
|
|
96
|
+
};
|
|
236
97
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
98
|
+
type StaleWhileRevalidateOptions = CacheOptions & {
|
|
99
|
+
ttl: number;
|
|
100
|
+
staleTtl?: number;
|
|
101
|
+
};
|
|
241
102
|
```
|
|
242
103
|
|
|
243
|
-
|
|
104
|
+
## Practical Use Cases
|
|
244
105
|
|
|
245
|
-
|
|
106
|
+
### Example: TTL Cache for List Endpoints
|
|
246
107
|
|
|
247
108
|
```typescript
|
|
248
|
-
invalidateOnResolve("users", store)
|
|
249
|
-
invalidateOnResolve({ tags: ["users"] }, store)
|
|
250
|
-
invalidateOnResolve((result) => ["users", `user:${result.id}`], store)
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### cacheKey
|
|
254
|
-
|
|
255
|
-
Helper for consistent cache keys.
|
|
256
|
-
|
|
257
|
-
```typescript
|
|
258
|
-
cacheKey("user", userId)
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
## Common patterns
|
|
262
|
-
|
|
263
|
-
Use these patterns for most usage.
|
|
264
|
-
|
|
265
|
-
### Cache with Task and pipe
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
import { Task } from "@gantryland/task";
|
|
269
|
-
import { MemoryCacheStore, cache } from "@gantryland/task-cache";
|
|
270
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
271
|
-
|
|
272
109
|
const store = new MemoryCacheStore();
|
|
273
110
|
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
(signal) => fetch("/api/projects", { signal }).then((r) => r.json()),
|
|
277
|
-
cache("projects", store, { ttl: 15_000 })
|
|
278
|
-
)
|
|
111
|
+
const listUsers = cache("users:list", store, { ttl: 30_000 })(() =>
|
|
112
|
+
fetch("/api/users").then((r) => r.json()),
|
|
279
113
|
);
|
|
280
|
-
|
|
281
|
-
await task.run();
|
|
282
114
|
```
|
|
283
115
|
|
|
284
|
-
### Stale-
|
|
116
|
+
### Example: Stale-While-Revalidate for Dashboards
|
|
285
117
|
|
|
286
118
|
```typescript
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
const store = new MemoryCacheStore();
|
|
292
|
-
|
|
293
|
-
const feedTask = new Task(
|
|
294
|
-
pipe(
|
|
295
|
-
(signal) => fetch("/api/feed", { signal }).then((r) => r.json()),
|
|
296
|
-
staleWhileRevalidate("feed", store, { ttl: 10_000, staleTtl: 30_000 })
|
|
297
|
-
)
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
await feedTask.run();
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### Tag-based invalidation
|
|
304
|
-
|
|
305
|
-
```typescript
|
|
306
|
-
import { Task } from "@gantryland/task";
|
|
307
|
-
import { MemoryCacheStore, cache, invalidateOnResolve } from "@gantryland/task-cache";
|
|
308
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
309
|
-
|
|
310
|
-
const store = new MemoryCacheStore();
|
|
311
|
-
|
|
312
|
-
const listTask = new Task(
|
|
313
|
-
pipe(
|
|
314
|
-
(signal) => fetch("/api/posts", { signal }).then((r) => r.json()),
|
|
315
|
-
cache("posts", store, { ttl: 30_000, tags: ["posts"] })
|
|
316
|
-
)
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
const createTask = new Task(
|
|
320
|
-
pipe(
|
|
321
|
-
(signal) => fetch("/api/posts", { method: "POST", signal }).then((r) => r.json()),
|
|
322
|
-
invalidateOnResolve({ tags: ["posts"] }, store)
|
|
323
|
-
)
|
|
324
|
-
);
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### In-flight dedupe
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
cache("users", store, { ttl: 10_000, dedupe: true });
|
|
331
|
-
cache("users", store, { ttl: 10_000, dedupe: false });
|
|
119
|
+
const getStats = staleWhileRevalidate("stats", store, {
|
|
120
|
+
ttl: 10_000,
|
|
121
|
+
staleTtl: 50_000,
|
|
122
|
+
})(() => fetch("/api/stats").then((r) => r.json()));
|
|
332
123
|
```
|
|
333
124
|
|
|
334
|
-
###
|
|
125
|
+
### Example: Disable Dedupe for Independent Refreshes
|
|
335
126
|
|
|
336
127
|
```typescript
|
|
337
|
-
const
|
|
338
|
-
|
|
339
|
-
const unsub = store.subscribe((event) => {
|
|
340
|
-
console.log(event.type, event.key, event.entry?.updatedAt);
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
// Later
|
|
344
|
-
unsub();
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
## Integrations
|
|
348
|
-
|
|
349
|
-
Compose with other Gantryland utilities. This section shows common pairings.
|
|
350
|
-
|
|
351
|
-
### Persist cache with task-storage
|
|
352
|
-
|
|
353
|
-
```typescript
|
|
354
|
-
import { Task } from "@gantryland/task";
|
|
355
|
-
import { cache } from "@gantryland/task-cache";
|
|
356
|
-
import { StorageCacheStore } from "@gantryland/task-storage";
|
|
357
|
-
import { pipe } from "@gantryland/task-combinators";
|
|
358
|
-
|
|
359
|
-
const store = new StorageCacheStore(localStorage, { prefix: "gantry:" });
|
|
360
|
-
|
|
361
|
-
const task = new Task(
|
|
362
|
-
pipe(
|
|
363
|
-
(signal) => fetch("/api/settings", { signal }).then((r) => r.json()),
|
|
364
|
-
cache("settings", store, { ttl: 60_000 })
|
|
365
|
-
)
|
|
128
|
+
const getFeed = cache("feed", store, { ttl: 5_000, dedupe: false })(() =>
|
|
129
|
+
fetch("/api/feed").then((r) => r.json()),
|
|
366
130
|
);
|
|
367
131
|
```
|
|
368
132
|
|
|
369
|
-
##
|
|
133
|
+
## Runtime Semantics
|
|
370
134
|
|
|
371
|
-
-
|
|
372
|
-
-
|
|
373
|
-
-
|
|
374
|
-
-
|
|
375
|
-
-
|
|
376
|
-
|
|
377
|
-
## Tests
|
|
378
|
-
|
|
379
|
-
```bash
|
|
380
|
-
npm test
|
|
381
|
-
npx vitest packages/task-cache/test
|
|
382
|
-
```
|
|
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,121 +1,37 @@
|
|
|
1
1
|
import type { TaskFn } from "@gantryland/task";
|
|
2
|
-
/**
|
|
3
|
-
* Supported cache key types.
|
|
4
|
-
*/
|
|
2
|
+
/** Cache key type used by cache stores and wrappers. */
|
|
5
3
|
export type CacheKey = string | number | symbol;
|
|
6
|
-
/**
|
|
7
|
-
* Cache entry payload with metadata.
|
|
8
|
-
*/
|
|
4
|
+
/** Stored cache value with last update timestamp. */
|
|
9
5
|
export type CacheEntry<T> = {
|
|
10
6
|
value: T;
|
|
11
|
-
createdAt: number;
|
|
12
7
|
updatedAt: number;
|
|
13
|
-
tags?: string[];
|
|
14
8
|
};
|
|
15
|
-
/**
|
|
16
|
-
* Cache event names emitted by stores.
|
|
17
|
-
*/
|
|
18
|
-
export type CacheEventType = "hit" | "miss" | "stale" | "set" | "invalidate" | "clear" | "revalidate";
|
|
19
|
-
/**
|
|
20
|
-
* Cache event payload.
|
|
21
|
-
*/
|
|
22
|
-
export type CacheEvent = {
|
|
23
|
-
type: CacheEventType;
|
|
24
|
-
key?: CacheKey;
|
|
25
|
-
entry?: CacheEntry<unknown>;
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Minimal cache store interface.
|
|
29
|
-
*/
|
|
9
|
+
/** Minimal cache store contract used by this package. */
|
|
30
10
|
export type CacheStore = {
|
|
31
11
|
get<T>(key: CacheKey): CacheEntry<T> | undefined;
|
|
32
12
|
set<T>(key: CacheKey, entry: CacheEntry<T>): void;
|
|
33
13
|
delete(key: CacheKey): void;
|
|
34
|
-
clear(): void;
|
|
35
|
-
has(key: CacheKey): boolean;
|
|
36
|
-
keys?(): Iterable<CacheKey>;
|
|
37
|
-
subscribe?(listener: (event: CacheEvent) => void): () => void;
|
|
38
|
-
emit?(event: CacheEvent): void;
|
|
39
|
-
invalidateTags?(tags: string[]): void;
|
|
40
14
|
};
|
|
41
|
-
/**
|
|
42
|
-
* In-memory CacheStore with tag support.
|
|
43
|
-
*/
|
|
15
|
+
/** In-memory `CacheStore` backed by `Map`. */
|
|
44
16
|
export declare class MemoryCacheStore implements CacheStore {
|
|
45
17
|
private store;
|
|
46
|
-
private tagIndex;
|
|
47
|
-
private listeners;
|
|
48
|
-
/**
|
|
49
|
-
* Get a cache entry by key.
|
|
50
|
-
*/
|
|
51
18
|
get<T>(key: CacheKey): CacheEntry<T> | undefined;
|
|
52
|
-
/**
|
|
53
|
-
* Set a cache entry by key.
|
|
54
|
-
*/
|
|
55
19
|
set<T>(key: CacheKey, entry: CacheEntry<T>): void;
|
|
56
|
-
/**
|
|
57
|
-
* Delete a cache entry by key.
|
|
58
|
-
*/
|
|
59
20
|
delete(key: CacheKey): void;
|
|
60
|
-
/**
|
|
61
|
-
* Clear all entries.
|
|
62
|
-
*/
|
|
63
|
-
clear(): void;
|
|
64
|
-
/**
|
|
65
|
-
* Check whether a key exists.
|
|
66
|
-
*/
|
|
67
|
-
has(key: CacheKey): boolean;
|
|
68
|
-
/**
|
|
69
|
-
* List all keys.
|
|
70
|
-
*/
|
|
71
|
-
keys(): Iterable<CacheKey>;
|
|
72
|
-
/**
|
|
73
|
-
* Subscribe to cache events.
|
|
74
|
-
*/
|
|
75
|
-
subscribe(listener: (event: CacheEvent) => void): () => void;
|
|
76
|
-
/**
|
|
77
|
-
* Emit a cache event to listeners.
|
|
78
|
-
*/
|
|
79
|
-
emit(event: CacheEvent): void;
|
|
80
|
-
/**
|
|
81
|
-
* Invalidate entries matching any tag.
|
|
82
|
-
*/
|
|
83
|
-
invalidateTags(tags: string[]): void;
|
|
84
|
-
private addTags;
|
|
85
|
-
private removeTags;
|
|
86
21
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Options for cache and stale-while-revalidate.
|
|
89
|
-
*/
|
|
90
22
|
export type CacheOptions = {
|
|
91
23
|
ttl?: number;
|
|
92
|
-
staleTtl?: number;
|
|
93
|
-
tags?: string[];
|
|
94
24
|
dedupe?: boolean;
|
|
95
25
|
};
|
|
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. */
|
|
32
|
+
export declare const cache: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options?: CacheOptions) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
96
33
|
/**
|
|
97
|
-
*
|
|
98
|
-
*/
|
|
99
|
-
export declare const cache: <T>(key: CacheKey, store: CacheStore, options?: CacheOptions) => (taskFn: TaskFn<T>) => TaskFn<T>;
|
|
100
|
-
/**
|
|
101
|
-
* Stale-while-revalidate combinator. Returns cached data immediately if stale
|
|
102
|
-
* within the stale window, and revalidates in the background.
|
|
103
|
-
*/
|
|
104
|
-
export declare const staleWhileRevalidate: <T>(key: CacheKey, store: CacheStore, options?: CacheOptions) => (taskFn: TaskFn<T>) => TaskFn<T>;
|
|
105
|
-
/**
|
|
106
|
-
* Target(s) to invalidate after a task resolves.
|
|
107
|
-
*/
|
|
108
|
-
export type InvalidateTarget<T> = CacheKey | CacheKey[] | {
|
|
109
|
-
tags: string[];
|
|
110
|
-
} | ((result: T) => CacheKey | CacheKey[] | {
|
|
111
|
-
tags: string[];
|
|
112
|
-
});
|
|
113
|
-
/**
|
|
114
|
-
* Invalidates cache entries after a TaskFn resolves.
|
|
115
|
-
*/
|
|
116
|
-
export declare const invalidateOnResolve: <T>(target: InvalidateTarget<T>, store: CacheStore) => (taskFn: TaskFn<T>) => TaskFn<T>;
|
|
117
|
-
/**
|
|
118
|
-
* Helper for consistent cache keys.
|
|
34
|
+
* Return stale values within a stale window and refresh in background.
|
|
119
35
|
*/
|
|
120
|
-
export declare const
|
|
36
|
+
export declare const staleWhileRevalidate: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options: StaleWhileRevalidateOptions) => (taskFn: TaskFn<T, Args>) => TaskFn<T, Args>;
|
|
121
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,109 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory CacheStore with tag support.
|
|
3
|
-
*/
|
|
1
|
+
/** In-memory `CacheStore` backed by `Map`. */
|
|
4
2
|
export class MemoryCacheStore {
|
|
5
3
|
constructor() {
|
|
6
4
|
this.store = new Map();
|
|
7
|
-
this.tagIndex = new Map();
|
|
8
|
-
this.listeners = new Set();
|
|
9
5
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Get a cache entry by key.
|
|
12
|
-
*/
|
|
13
6
|
get(key) {
|
|
14
7
|
return this.store.get(key);
|
|
15
8
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Set a cache entry by key.
|
|
18
|
-
*/
|
|
19
9
|
set(key, entry) {
|
|
20
|
-
const existing = this.store.get(key);
|
|
21
|
-
if (existing?.tags)
|
|
22
|
-
this.removeTags(key, existing.tags);
|
|
23
|
-
if (entry.tags)
|
|
24
|
-
this.addTags(key, entry.tags);
|
|
25
10
|
this.store.set(key, entry);
|
|
26
|
-
this.emit({ type: "set", key, entry });
|
|
27
11
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Delete a cache entry by key.
|
|
30
|
-
*/
|
|
31
12
|
delete(key) {
|
|
32
|
-
const existing = this.store.get(key);
|
|
33
|
-
if (existing?.tags)
|
|
34
|
-
this.removeTags(key, existing.tags);
|
|
35
13
|
this.store.delete(key);
|
|
36
|
-
this.emit({ type: "invalidate", key, entry: existing });
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Clear all entries.
|
|
40
|
-
*/
|
|
41
|
-
clear() {
|
|
42
|
-
this.store.clear();
|
|
43
|
-
this.tagIndex.clear();
|
|
44
|
-
this.emit({ type: "clear" });
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Check whether a key exists.
|
|
48
|
-
*/
|
|
49
|
-
has(key) {
|
|
50
|
-
return this.store.has(key);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* List all keys.
|
|
54
|
-
*/
|
|
55
|
-
keys() {
|
|
56
|
-
return this.store.keys();
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Subscribe to cache events.
|
|
60
|
-
*/
|
|
61
|
-
subscribe(listener) {
|
|
62
|
-
this.listeners.add(listener);
|
|
63
|
-
return () => this.listeners.delete(listener);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Emit a cache event to listeners.
|
|
67
|
-
*/
|
|
68
|
-
emit(event) {
|
|
69
|
-
for (const listener of this.listeners) {
|
|
70
|
-
try {
|
|
71
|
-
listener(event);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
console.error("Cache listener error", error);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Invalidate entries matching any tag.
|
|
80
|
-
*/
|
|
81
|
-
invalidateTags(tags) {
|
|
82
|
-
for (const tag of tags) {
|
|
83
|
-
const keys = this.tagIndex.get(tag);
|
|
84
|
-
if (!keys)
|
|
85
|
-
continue;
|
|
86
|
-
for (const key of keys)
|
|
87
|
-
this.delete(key);
|
|
88
|
-
this.tagIndex.delete(tag);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
addTags(key, tags) {
|
|
92
|
-
for (const tag of tags) {
|
|
93
|
-
const set = this.tagIndex.get(tag) ?? new Set();
|
|
94
|
-
set.add(key);
|
|
95
|
-
this.tagIndex.set(tag, set);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
removeTags(key, tags) {
|
|
99
|
-
for (const tag of tags) {
|
|
100
|
-
const set = this.tagIndex.get(tag);
|
|
101
|
-
if (!set)
|
|
102
|
-
continue;
|
|
103
|
-
set.delete(key);
|
|
104
|
-
if (set.size === 0)
|
|
105
|
-
this.tagIndex.delete(tag);
|
|
106
|
-
}
|
|
107
14
|
}
|
|
108
15
|
}
|
|
109
16
|
const pendingByStore = new WeakMap();
|
|
@@ -120,24 +27,25 @@ const isFresh = (entry, ttl) => {
|
|
|
120
27
|
return true;
|
|
121
28
|
return Date.now() - entry.updatedAt <= ttl;
|
|
122
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
|
+
};
|
|
123
36
|
const isWithinStale = (entry, ttl, staleTtl) => {
|
|
124
|
-
if (ttl === undefined)
|
|
125
|
-
return false;
|
|
126
37
|
const age = Date.now() - entry.updatedAt;
|
|
127
38
|
return age > ttl && age <= ttl + (staleTtl ?? 0);
|
|
128
39
|
};
|
|
129
|
-
const setEntry = (store, key, value
|
|
130
|
-
const now = Date.now();
|
|
40
|
+
const setEntry = (store, key, value) => {
|
|
131
41
|
const entry = {
|
|
132
42
|
value,
|
|
133
|
-
|
|
134
|
-
updatedAt: now,
|
|
135
|
-
tags,
|
|
43
|
+
updatedAt: Date.now(),
|
|
136
44
|
};
|
|
137
45
|
store.set(key, entry);
|
|
138
46
|
return entry;
|
|
139
47
|
};
|
|
140
|
-
const resolveWithDedupe = async (key, store, taskFn,
|
|
48
|
+
const resolveWithDedupe = async (key, store, taskFn, args, options = {}) => {
|
|
141
49
|
const dedupe = options.dedupe !== false;
|
|
142
50
|
const pending = dedupe ? getPendingMap(store) : undefined;
|
|
143
51
|
if (pending) {
|
|
@@ -145,9 +53,10 @@ const resolveWithDedupe = async (key, store, taskFn, signal, options = {}, previ
|
|
|
145
53
|
if (inFlight)
|
|
146
54
|
return inFlight;
|
|
147
55
|
}
|
|
148
|
-
const promise =
|
|
56
|
+
const promise = Promise.resolve()
|
|
57
|
+
.then(() => taskFn(...args))
|
|
149
58
|
.then((value) => {
|
|
150
|
-
setEntry(store, key, value
|
|
59
|
+
setEntry(store, key, value);
|
|
151
60
|
return value;
|
|
152
61
|
})
|
|
153
62
|
.finally(() => {
|
|
@@ -156,54 +65,27 @@ const resolveWithDedupe = async (key, store, taskFn, signal, options = {}, previ
|
|
|
156
65
|
pending?.set(key, promise);
|
|
157
66
|
return promise;
|
|
158
67
|
};
|
|
159
|
-
/**
|
|
160
|
-
|
|
161
|
-
*/
|
|
162
|
-
export const cache = (key, store, options = {}) => (taskFn) => async (signal) => {
|
|
68
|
+
/** Cache wrapper with optional TTL and in-flight deduplication. */
|
|
69
|
+
export const cache = (key, store, options = {}) => (taskFn) => async (...args) => {
|
|
163
70
|
const entry = store.get(key);
|
|
164
|
-
if (entry && isFresh(entry, options.ttl))
|
|
165
|
-
store.emit?.({ type: "hit", key, entry });
|
|
71
|
+
if (entry && isFresh(entry, options.ttl))
|
|
166
72
|
return entry.value;
|
|
167
|
-
|
|
168
|
-
store.emit?.({ type: entry ? "stale" : "miss", key, entry });
|
|
169
|
-
return resolveWithDedupe(key, store, taskFn, signal, options, entry);
|
|
73
|
+
return resolveWithDedupe(key, store, taskFn, args, options);
|
|
170
74
|
};
|
|
171
75
|
/**
|
|
172
|
-
*
|
|
173
|
-
* within the stale window, and revalidates in the background.
|
|
76
|
+
* Return stale values within a stale window and refresh in background.
|
|
174
77
|
*/
|
|
175
|
-
export const staleWhileRevalidate = (key, store, options
|
|
78
|
+
export const staleWhileRevalidate = (key, store, options) => (taskFn) => async (...args) => {
|
|
79
|
+
const ttl = toValidTtl(options?.ttl);
|
|
176
80
|
const entry = store.get(key);
|
|
177
|
-
if (entry && isFresh(entry,
|
|
178
|
-
store.emit?.({ type: "hit", key, entry });
|
|
81
|
+
if (entry && isFresh(entry, ttl))
|
|
179
82
|
return entry.value;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
void resolveWithDedupe(key, store, taskFn, undefined, options, entry);
|
|
83
|
+
if (entry && isWithinStale(entry, ttl, options.staleTtl)) {
|
|
84
|
+
void resolveWithDedupe(key, store, taskFn, args, options).catch(() => {
|
|
85
|
+
// Background revalidation errors are ignored.
|
|
86
|
+
});
|
|
185
87
|
return entry.value;
|
|
186
88
|
}
|
|
187
|
-
|
|
188
|
-
return resolveWithDedupe(key, store, taskFn, signal, options, entry);
|
|
89
|
+
return resolveWithDedupe(key, store, taskFn, args, options);
|
|
189
90
|
};
|
|
190
|
-
/**
|
|
191
|
-
* Invalidates cache entries after a TaskFn resolves.
|
|
192
|
-
*/
|
|
193
|
-
export const invalidateOnResolve = (target, store) => (taskFn) => async (signal) => {
|
|
194
|
-
const result = await taskFn(signal);
|
|
195
|
-
const resolved = typeof target === "function" ? target(result) : target;
|
|
196
|
-
if (typeof resolved === "object" && !Array.isArray(resolved) && "tags" in resolved) {
|
|
197
|
-
store.invalidateTags?.(resolved.tags);
|
|
198
|
-
return result;
|
|
199
|
-
}
|
|
200
|
-
const keys = Array.isArray(resolved) ? resolved : [resolved];
|
|
201
|
-
for (const key of keys)
|
|
202
|
-
store.delete(key);
|
|
203
|
-
return result;
|
|
204
|
-
};
|
|
205
|
-
/**
|
|
206
|
-
* Helper for consistent cache keys.
|
|
207
|
-
*/
|
|
208
|
-
export const cacheKey = (...parts) => parts.map((part) => String(part)).join(":");
|
|
209
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,13 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gantryland/task-cache",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"keywords": [
|
|
6
|
-
"task",
|
|
7
|
-
"cache",
|
|
8
|
-
"memoize",
|
|
9
|
-
"async"
|
|
10
|
-
],
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Task-function cache wrappers for @gantryland/task",
|
|
5
|
+
"keywords": ["task", "cache", "memoize", "async"],
|
|
11
6
|
"type": "module",
|
|
12
7
|
"main": "./dist/index.js",
|
|
13
8
|
"types": "./dist/index.d.ts",
|
|
@@ -19,10 +14,19 @@
|
|
|
19
14
|
"./package.json": "./package.json"
|
|
20
15
|
},
|
|
21
16
|
"files": [
|
|
22
|
-
"dist",
|
|
17
|
+
"dist/index.js",
|
|
18
|
+
"dist/index.js.map",
|
|
19
|
+
"dist/index.d.ts",
|
|
20
|
+
"dist/index.d.ts.map",
|
|
23
21
|
"README.md"
|
|
24
22
|
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"prepack": "tsc -b"
|
|
25
|
+
},
|
|
25
26
|
"sideEffects": false,
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
26
30
|
"license": "MIT",
|
|
27
31
|
"publishConfig": {
|
|
28
32
|
"access": "public"
|
|
@@ -36,6 +40,6 @@
|
|
|
36
40
|
},
|
|
37
41
|
"homepage": "https://github.com/joehoot/gantryland/tree/main/packages/task-cache#readme",
|
|
38
42
|
"dependencies": {
|
|
39
|
-
"@gantryland/task": "^0.
|
|
43
|
+
"@gantryland/task": "^0.4.0"
|
|
40
44
|
}
|
|
41
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/aria-query/index.d.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"],"fileIdsList":[[61,109,126,127],[61,106,107,109,126,127],[61,108,109,126,127],[109,126,127],[61,109,114,126,127,144],[61,109,110,115,120,126,127,129,141,152],[61,109,110,111,120,126,127,129],[56,57,58,61,109,126,127],[61,109,112,126,127,153],[61,109,113,114,121,126,127,130],[61,109,114,126,127,141,149],[61,109,115,117,120,126,127,129],[61,108,109,116,126,127],[61,109,117,118,126,127],[61,109,119,120,126,127],[61,108,109,120,126,127],[61,109,120,121,122,126,127,141,152],[61,109,120,121,122,126,127,136,141,144],[61,102,109,117,120,123,126,127,129,141,152],[61,109,120,121,123,124,126,127,129,141,149,152],[61,109,123,125,126,127,141,149,152],[59,60,61,62,63,64,65,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,158],[61,109,120,126,127],[61,109,126,127,128,152],[61,109,117,120,126,127,129,141],[61,109,126,127,130],[61,109,126,127,131],[61,108,109,126,127,132],[61,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,158],[61,109,126,127,134],[61,109,126,127,135],[61,109,120,126,127,136,137],[61,109,126,127,136,138,153,155],[61,109,121,126,127],[61,109,120,126,127,141,142,144],[61,109,126,127,143,144],[61,109,126,127,141,142],[61,109,126,127,144],[61,109,126,127,145],[61,106,109,126,127,141,146],[61,109,120,126,127,147,148],[61,109,126,127,147,148],[61,109,114,126,127,129,141,149],[61,109,126,127,150],[61,109,126,127,129,151],[61,109,123,126,127,135,152],[61,109,114,126,127,153],[61,109,126,127,141,154],[61,109,126,127,128,155],[61,109,126,127,156],[61,102,109,126,127],[61,102,109,120,122,126,127,132,141,144,152,154,155,157],[61,109,126,127,141,158],[61,109,126,127,160,161,162],[61,74,78,109,126,127,152],[61,74,109,126,127,141,152],[61,69,109,126,127],[61,71,74,109,126,127,149,152],[61,109,126,127,129,149],[61,109,126,127,159],[61,69,109,126,127,159],[61,71,74,109,126,127,129,152],[61,66,67,70,73,109,120,126,127,141,152],[61,74,81,109,126,127],[61,66,72,109,126,127],[61,74,95,96,109,126,127],[61,70,74,109,126,127,144,152,159],[61,95,109,126,127,159],[61,68,69,109,126,127,159],[61,74,109,126,127],[61,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99,100,101,109,126,127],[61,74,89,109,126,127],[61,74,81,82,109,126,127],[61,72,74,82,83,109,126,127],[61,73,109,126,127],[61,66,69,74,109,126,127],[61,74,78,82,83,109,126,127],[61,78,109,126,127],[61,72,74,77,109,126,127,152],[61,66,71,74,81,109,126,127],[61,109,126,127,141],[61,69,74,95,109,126,127,157,159],[52,61,109,126,127]],"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":"8aa45bb914d435792b66feeda81b8aac9fd988d1972873073247aff26c0baf6e","impliedFormat":99},{"version":"e32ee05b55e05bf7ac299287adb2c79a0d6fac8a3b4fac16c0aafb4f5cd392f2","signature":"6fc95e9a3d190c86735a0c2d5c806004e04f5893ee1d60877a733976418dded4","impliedFormat":99},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"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":"7a3aa194cfd5919c4da251ef04ea051077e22702638d4edcb9579e9101653519","affectsGlobalScope":true,"impliedFormat":1}],"root":[53],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":199,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strict":true,"target":7},"referencedMap":[[54,1],[55,1],[106,2],[107,2],[108,3],[61,4],[109,5],[110,6],[111,7],[56,1],[59,8],[57,1],[58,1],[112,9],[113,10],[114,11],[115,12],[116,13],[117,14],[118,14],[119,15],[120,16],[121,17],[122,18],[62,1],[60,1],[123,19],[124,20],[125,21],[159,22],[126,23],[127,1],[128,24],[129,25],[130,26],[131,27],[132,28],[133,29],[134,30],[135,31],[136,32],[137,32],[138,33],[139,1],[140,34],[141,35],[143,36],[142,37],[144,38],[145,39],[146,40],[147,41],[148,42],[149,43],[150,44],[151,45],[152,46],[153,47],[154,48],[155,49],[156,50],[63,1],[64,1],[65,1],[103,51],[104,1],[105,1],[157,52],[158,53],[160,1],[161,1],[163,54],[162,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],[81,55],[91,56],[80,55],[101,57],[72,58],[71,59],[100,60],[94,61],[99,62],[74,63],[88,64],[73,65],[97,66],[69,67],[68,60],[98,68],[70,69],[75,70],[76,1],[79,70],[66,1],[102,71],[92,72],[83,73],[84,74],[86,75],[82,76],[85,77],[95,60],[77,78],[78,79],[87,80],[67,81],[90,72],[89,70],[93,1],[96,82],[53,83],[52,1]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|