@praxisjs/concurrent 1.2.12 → 1.3.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/CHANGELOG.md +40 -0
- package/dist/__tests__/decorators.test.js +60 -3
- package/dist/__tests__/decorators.test.js.map +1 -1
- package/dist/__tests__/pool.test.js +103 -70
- package/dist/__tests__/pool.test.js.map +1 -1
- package/dist/__tests__/queue.test.js +86 -71
- package/dist/__tests__/queue.test.js.map +1 -1
- package/dist/__tests__/task.test.js +90 -68
- package/dist/__tests__/task.test.js.map +1 -1
- package/dist/__tests__/utils.test.d.ts +2 -0
- package/dist/__tests__/utils.test.d.ts.map +1 -0
- package/dist/__tests__/utils.test.js +32 -0
- package/dist/__tests__/utils.test.js.map +1 -0
- package/dist/decorators.d.ts +13 -3
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +8 -3
- package/dist/decorators.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pool.d.ts +4 -1
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +29 -5
- package/dist/pool.js.map +1 -1
- package/dist/queue.d.ts +3 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +35 -9
- package/dist/queue.js.map +1 -1
- package/dist/task.d.ts +3 -1
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +16 -3
- package/dist/task.js.map +1 -1
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +26 -0
- package/dist/utils.js.map +1 -0
- package/package.json +4 -4
- package/src/__tests__/decorators.test.ts +78 -3
- package/src/__tests__/pool.test.ts +110 -102
- package/src/__tests__/queue.test.ts +103 -114
- package/src/__tests__/task.test.ts +96 -90
- package/src/__tests__/utils.test.ts +48 -0
- package/src/decorators.ts +23 -6
- package/src/index.ts +1 -0
- package/src/pool.ts +33 -4
- package/src/queue.ts +36 -8
- package/src/task.ts +18 -2
- package/src/utils.ts +24 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# @praxisjs/concurrent
|
|
2
2
|
|
|
3
|
+
## 1.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e2c7317: Add opt-in `AbortSignal` support to `@Task`, `@Queue`, and `@Pool`.
|
|
8
|
+
|
|
9
|
+
Name the first parameter of your async method `signal` to receive a live `AbortSignal`. The decorator detects the parameter name and injects it automatically — callers are unaffected. Methods without a `signal` parameter continue to work exactly as before.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// opt-in — declare signal as first param
|
|
13
|
+
async loadUser(signal: AbortSignal, id: number) {
|
|
14
|
+
return fetch(`/api/users/${id}`, { signal }).then(r => r.json())
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// unchanged — no signal, no change in behavior
|
|
18
|
+
async saveDoc(data: DocumentData) {
|
|
19
|
+
return api.save(data)
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Changes per primitive:
|
|
24
|
+
- **`@Task`** — each new invocation aborts the previous signal; `cancelAll()` also aborts the active signal. `AbortError` is not stored in `.error()`.
|
|
25
|
+
- **`@Queue`** — `clear()` now also aborts the currently running call's signal in addition to cancelling pending items.
|
|
26
|
+
- **`@Pool`** — new `cancelAll()` method; aborts all active signals and resolves all pending calls as `undefined`.
|
|
27
|
+
- `QueueClearedError` is now exported from the package root.
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [80442e0]
|
|
32
|
+
- @praxisjs/decorators@1.3.0
|
|
33
|
+
- @praxisjs/core@1.8.0
|
|
34
|
+
- @praxisjs/shared@0.3.0
|
|
35
|
+
|
|
36
|
+
## 1.2.13
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- Updated dependencies [3fb2309]
|
|
41
|
+
- @praxisjs/decorators@1.2.0
|
|
42
|
+
|
|
3
43
|
## 1.2.12
|
|
4
44
|
|
|
5
45
|
### Patch Changes
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
import { Task, Queue, Pool } from "../decorators";
|
|
3
|
+
import { QueueClearedError } from "../queue";
|
|
3
4
|
function fieldCtx(name) {
|
|
4
5
|
const initializers = [];
|
|
5
6
|
return {
|
|
@@ -25,6 +26,7 @@ describe("Task decorator", () => {
|
|
|
25
26
|
expect(taskLoad.loading).toBeDefined();
|
|
26
27
|
expect(taskLoad.error).toBeDefined();
|
|
27
28
|
expect(taskLoad.lastResult).toBeDefined();
|
|
29
|
+
expect(taskLoad.cancelAll).toBeDefined();
|
|
28
30
|
const result = await taskLoad(5);
|
|
29
31
|
expect(result).toBe(10);
|
|
30
32
|
expect(taskLoad.lastResult()).toBe(10);
|
|
@@ -44,6 +46,25 @@ describe("Task decorator", () => {
|
|
|
44
46
|
await p;
|
|
45
47
|
expect(taskFetch.loading()).toBe(false);
|
|
46
48
|
});
|
|
49
|
+
it("cancelAll() aborts the in-flight signal", async () => {
|
|
50
|
+
const { ctx, run } = fieldCtx("taskFetch");
|
|
51
|
+
Task("fetch")(undefined, ctx);
|
|
52
|
+
let capturedSignal;
|
|
53
|
+
let resolve;
|
|
54
|
+
const instance = {
|
|
55
|
+
fetch: async (signal) => {
|
|
56
|
+
capturedSignal = signal;
|
|
57
|
+
await new Promise((r) => { resolve = r; });
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
run(instance);
|
|
61
|
+
const taskFetch = instance.taskFetch;
|
|
62
|
+
const p = taskFetch();
|
|
63
|
+
taskFetch.cancelAll();
|
|
64
|
+
resolve();
|
|
65
|
+
await p;
|
|
66
|
+
expect(capturedSignal.aborted).toBe(true);
|
|
67
|
+
});
|
|
47
68
|
});
|
|
48
69
|
// ── Queue ─────────────────────────────────────────────────────────────────────
|
|
49
70
|
describe("Queue decorator", () => {
|
|
@@ -68,9 +89,12 @@ describe("Queue decorator", () => {
|
|
|
68
89
|
Queue("save")(undefined, ctx);
|
|
69
90
|
let resolveFirst;
|
|
70
91
|
const instance = {
|
|
71
|
-
save: async (_, idx) =>
|
|
72
|
-
|
|
73
|
-
|
|
92
|
+
save: async (signal, _, idx) => {
|
|
93
|
+
void signal;
|
|
94
|
+
return idx === 0
|
|
95
|
+
? new Promise((r) => { resolveFirst = r; })
|
|
96
|
+
: Promise.resolve();
|
|
97
|
+
},
|
|
74
98
|
};
|
|
75
99
|
run(instance);
|
|
76
100
|
const taskSave = instance.taskSave;
|
|
@@ -96,6 +120,7 @@ describe("Pool decorator", () => {
|
|
|
96
120
|
expect(taskProcess.active).toBeDefined();
|
|
97
121
|
expect(taskProcess.pending).toBeDefined();
|
|
98
122
|
expect(taskProcess.error).toBeDefined();
|
|
123
|
+
expect(taskProcess.cancelAll).toBeDefined();
|
|
99
124
|
const result = await taskProcess(9);
|
|
100
125
|
expect(result).toBe(10);
|
|
101
126
|
});
|
|
@@ -134,5 +159,37 @@ describe("Pool decorator", () => {
|
|
|
134
159
|
resolvers[1]();
|
|
135
160
|
await t2;
|
|
136
161
|
});
|
|
162
|
+
it("cancelAll() cancels pending and active tasks", async () => {
|
|
163
|
+
const { ctx, run } = fieldCtx("taskWork");
|
|
164
|
+
Pool("work", 1)(undefined, ctx);
|
|
165
|
+
let resolveFirst;
|
|
166
|
+
const instance = {
|
|
167
|
+
work: async (signal, idx) => {
|
|
168
|
+
void signal;
|
|
169
|
+
if (idx === 0)
|
|
170
|
+
await new Promise((r) => { resolveFirst = r; });
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
run(instance);
|
|
174
|
+
const taskWork = instance.taskWork;
|
|
175
|
+
const t1 = taskWork(0);
|
|
176
|
+
const t2 = taskWork(1);
|
|
177
|
+
await Promise.resolve();
|
|
178
|
+
taskWork.cancelAll();
|
|
179
|
+
resolveFirst();
|
|
180
|
+
await Promise.all([t1, t2]);
|
|
181
|
+
expect(taskWork.active()).toBe(0);
|
|
182
|
+
expect(taskWork.pending()).toBe(0);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
// ── QueueClearedError re-export ────────────────────────────────────────────────
|
|
186
|
+
describe("QueueClearedError", () => {
|
|
187
|
+
it("is exported from the package", () => {
|
|
188
|
+
expect(QueueClearedError).toBeDefined();
|
|
189
|
+
const e = new QueueClearedError();
|
|
190
|
+
expect(e).toBeInstanceOf(Error);
|
|
191
|
+
expect(e.name).toBe("QueueClearedError");
|
|
192
|
+
expect(e.message).toBe("Queue cleared");
|
|
193
|
+
});
|
|
137
194
|
});
|
|
138
195
|
//# sourceMappingURL=decorators.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from "vitest";
|
|
2
2
|
import { pool } from "../pool";
|
|
3
|
-
|
|
3
|
+
/** Abortable delay — rejects with AbortError when signal fires. */
|
|
4
|
+
function delay(ms, signal) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const timer = setTimeout(resolve, ms);
|
|
7
|
+
signal?.addEventListener("abort", () => {
|
|
8
|
+
clearTimeout(timer);
|
|
9
|
+
reject(Object.assign(new Error("Aborted"), { name: "AbortError" }));
|
|
10
|
+
}, { once: true });
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
// ── Without AbortSignal (existing behaviour) ───────────────────────────────────
|
|
14
|
+
describe("pool — without signal", () => {
|
|
4
15
|
it("executes a task and resolves with its result", async () => {
|
|
5
16
|
const p = pool(2, async (x) => x * 3);
|
|
6
17
|
expect(await p(4)).toBe(12);
|
|
@@ -29,47 +40,44 @@ describe("pool", () => {
|
|
|
29
40
|
it("loading is true when active > 0", async () => {
|
|
30
41
|
let resolve;
|
|
31
42
|
const p = pool(1, () => new Promise((r) => { resolve = r; }));
|
|
32
|
-
const
|
|
43
|
+
const t = p();
|
|
33
44
|
expect(p.loading()).toBe(true);
|
|
34
45
|
resolve();
|
|
35
|
-
await
|
|
46
|
+
await t;
|
|
36
47
|
expect(p.loading()).toBe(false);
|
|
37
48
|
});
|
|
38
49
|
it("captures errors in the error signal and resolves undefined", async () => {
|
|
39
|
-
const p = pool(1, async () => {
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
const p = pool(1, async () => { throw new Error("pool error"); });
|
|
51
|
+
expect(await p()).toBeUndefined();
|
|
52
|
+
expect(p.error()?.message).toBe("pool error");
|
|
53
|
+
});
|
|
54
|
+
it("wraps non-Error throws in an Error object", async () => {
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
56
|
+
const p = pool(1, async () => { throw "plain string error"; });
|
|
57
|
+
expect(await p()).toBeUndefined();
|
|
58
|
+
expect(p.error()).toBeInstanceOf(Error);
|
|
59
|
+
expect(p.error()?.message).toBe("plain string error");
|
|
60
|
+
});
|
|
61
|
+
it("AbortError thrown by fn itself (no cancelAll) is not stored in error()", async () => {
|
|
62
|
+
const p = pool(1, async () => { throw new DOMException("Aborted", "AbortError"); });
|
|
42
63
|
const result = await p();
|
|
43
64
|
expect(result).toBeUndefined();
|
|
44
|
-
expect(p.error()
|
|
65
|
+
expect(p.error()).toBeNull();
|
|
45
66
|
});
|
|
46
67
|
it("pending count decrements as tasks start", async () => {
|
|
47
68
|
let resolveFirst;
|
|
48
|
-
const started = [];
|
|
49
69
|
const p = pool(1, async (idx) => {
|
|
50
|
-
started.push(idx);
|
|
51
70
|
if (idx === 0)
|
|
52
71
|
await new Promise((r) => { resolveFirst = r; });
|
|
53
72
|
});
|
|
54
73
|
const t1 = p(0);
|
|
55
74
|
const t2 = p(1);
|
|
56
|
-
// second task is pending while first runs
|
|
57
75
|
expect(p.pending()).toBe(1);
|
|
58
76
|
resolveFirst();
|
|
59
77
|
await t1;
|
|
60
78
|
await t2;
|
|
61
79
|
expect(p.pending()).toBe(0);
|
|
62
80
|
});
|
|
63
|
-
it("wraps non-Error throws in an Error object", async () => {
|
|
64
|
-
const p = pool(1, async () => {
|
|
65
|
-
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
66
|
-
throw "plain string error";
|
|
67
|
-
});
|
|
68
|
-
const result = await p();
|
|
69
|
-
expect(result).toBeUndefined();
|
|
70
|
-
expect(p.error()).toBeInstanceOf(Error);
|
|
71
|
-
expect(p.error()?.message).toBe("plain string error");
|
|
72
|
-
});
|
|
73
81
|
it("concurrency=1 guarantees serial execution", async () => {
|
|
74
82
|
const order = [];
|
|
75
83
|
let resolveFirst;
|
|
@@ -80,84 +88,109 @@ describe("pool", () => {
|
|
|
80
88
|
});
|
|
81
89
|
const t1 = p(0);
|
|
82
90
|
const t2 = p(1);
|
|
83
|
-
// t2 cannot start until t1 finishes
|
|
84
91
|
expect(p.active()).toBe(1);
|
|
85
92
|
expect(p.pending()).toBe(1);
|
|
86
93
|
resolveFirst();
|
|
87
94
|
await t1;
|
|
88
95
|
await t2;
|
|
89
|
-
expect(order).toEqual([0, 1]);
|
|
96
|
+
expect(order).toEqual([0, 1]);
|
|
90
97
|
});
|
|
91
98
|
it("error in one task does not block subsequent tasks", async () => {
|
|
92
|
-
const results = [];
|
|
93
99
|
const p = pool(1, async (n) => {
|
|
94
100
|
if (n === 0)
|
|
95
101
|
throw new Error("task 0 failed");
|
|
96
102
|
return n;
|
|
97
103
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
expect(results[0]).toBeUndefined(); // error → undefined
|
|
103
|
-
expect(results[1]).toBe(1); // subsequent task ran
|
|
104
|
-
});
|
|
105
|
-
it("concurrency=0 — clamps to 1, tasks execute serially", async () => {
|
|
104
|
+
expect(await p(0)).toBeUndefined();
|
|
105
|
+
expect(await p(1)).toBe(1);
|
|
106
|
+
});
|
|
107
|
+
it("concurrency=0 — clamps to 1", async () => {
|
|
106
108
|
const fn = vi.fn(async () => "result");
|
|
107
109
|
const p = pool(0, fn);
|
|
108
|
-
|
|
109
|
-
const result = await p();
|
|
110
|
+
expect(await p()).toBe("result");
|
|
110
111
|
expect(fn).toHaveBeenCalledOnce();
|
|
111
|
-
|
|
112
|
+
});
|
|
113
|
+
it("cancelAll() when idle — no-op, no crash", () => {
|
|
114
|
+
const p = pool(2, async () => "ok");
|
|
115
|
+
expect(() => p.cancelAll()).not.toThrow();
|
|
112
116
|
expect(p.pending()).toBe(0);
|
|
113
|
-
expect(p.
|
|
117
|
+
expect(p.active()).toBe(0);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// ── With AbortSignal (opt-in via first param named "signal") ──────────────────
|
|
121
|
+
describe("pool — with signal", () => {
|
|
122
|
+
it("passes a live AbortSignal to fn", async () => {
|
|
123
|
+
let capturedSignal;
|
|
124
|
+
const p = pool(1, async (signal) => { capturedSignal = signal; });
|
|
125
|
+
await p();
|
|
126
|
+
expect(capturedSignal).toBeInstanceOf(AbortSignal);
|
|
127
|
+
expect(capturedSignal.aborted).toBe(false);
|
|
114
128
|
});
|
|
115
|
-
it("
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
129
|
+
it("executes tasks and passes correct args alongside signal", async () => {
|
|
130
|
+
const p = pool(2, async (signal, x) => { void signal; return x * 3; });
|
|
131
|
+
expect(await p(4)).toBe(12);
|
|
132
|
+
});
|
|
133
|
+
it("cancelAll() aborts all active signals", async () => {
|
|
134
|
+
const signals = [];
|
|
135
|
+
const resolvers = [];
|
|
136
|
+
const p = pool(3, async (signal) => {
|
|
137
|
+
signals.push(signal);
|
|
138
|
+
await new Promise((r) => resolvers.push(r));
|
|
121
139
|
});
|
|
122
|
-
|
|
123
|
-
|
|
140
|
+
const t1 = p();
|
|
141
|
+
const t2 = p();
|
|
142
|
+
const t3 = p();
|
|
143
|
+
await Promise.resolve();
|
|
144
|
+
p.cancelAll();
|
|
145
|
+
resolvers.forEach((r) => r());
|
|
146
|
+
await Promise.all([t1, t2, t3]);
|
|
147
|
+
expect(signals.every((s) => s.aborted)).toBe(true);
|
|
124
148
|
});
|
|
125
|
-
it("
|
|
126
|
-
const
|
|
149
|
+
it("cancelAll() resolves active tasks as undefined without setting error()", async () => {
|
|
150
|
+
const p = pool(1, async (signal) => { await delay(10000, signal); });
|
|
151
|
+
const t = p();
|
|
152
|
+
await Promise.resolve();
|
|
153
|
+
p.cancelAll();
|
|
154
|
+
expect(await t).toBeUndefined();
|
|
155
|
+
expect(p.error()).toBeNull();
|
|
156
|
+
expect(p.active()).toBe(0);
|
|
157
|
+
});
|
|
158
|
+
it("cancelAll() resolves pending tasks as undefined", async () => {
|
|
127
159
|
let resolveFirst;
|
|
128
|
-
const p = pool(
|
|
129
|
-
|
|
160
|
+
const p = pool(1, async (signal, idx) => {
|
|
161
|
+
void signal;
|
|
162
|
+
if (idx === 0)
|
|
130
163
|
await new Promise((r) => { resolveFirst = r; });
|
|
131
|
-
order.push(n);
|
|
132
164
|
});
|
|
133
165
|
const t1 = p(0);
|
|
134
166
|
const t2 = p(1);
|
|
135
|
-
|
|
136
|
-
|
|
167
|
+
const t3 = p(2);
|
|
168
|
+
await Promise.resolve();
|
|
169
|
+
p.cancelAll();
|
|
137
170
|
resolveFirst();
|
|
138
|
-
await t1;
|
|
139
|
-
|
|
140
|
-
expect(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const p = pool(1, async () => {
|
|
145
|
-
callCount++;
|
|
146
|
-
throw new Error(`error ${callCount}`);
|
|
147
|
-
});
|
|
148
|
-
await p();
|
|
149
|
-
await p();
|
|
150
|
-
await p();
|
|
151
|
-
expect(p.error()?.message).toBe("error 3");
|
|
171
|
+
const [r1, r2, r3] = await Promise.all([t1, t2, t3]);
|
|
172
|
+
expect(r1).toBeUndefined();
|
|
173
|
+
expect(r2).toBeUndefined();
|
|
174
|
+
expect(r3).toBeUndefined();
|
|
175
|
+
expect(p.pending()).toBe(0);
|
|
176
|
+
expect(p.error()).toBeNull();
|
|
152
177
|
});
|
|
153
|
-
it("
|
|
154
|
-
|
|
155
|
-
|
|
178
|
+
it("cancelAll() then new runs work normally", async () => {
|
|
179
|
+
let resolve;
|
|
180
|
+
const p = pool(1, async (signal, which) => {
|
|
181
|
+
void signal;
|
|
182
|
+
if (which === "stale")
|
|
183
|
+
await new Promise((r) => { resolve = r; });
|
|
184
|
+
return which;
|
|
156
185
|
});
|
|
157
|
-
|
|
158
|
-
await
|
|
159
|
-
|
|
186
|
+
const stale = p("stale");
|
|
187
|
+
await Promise.resolve();
|
|
188
|
+
p.cancelAll();
|
|
189
|
+
resolve();
|
|
190
|
+
await stale;
|
|
191
|
+
expect(await p("fresh")).toBe("fresh");
|
|
160
192
|
expect(p.active()).toBe(0);
|
|
193
|
+
expect(p.error()).toBeNull();
|
|
161
194
|
});
|
|
162
195
|
});
|
|
163
196
|
//# sourceMappingURL=pool.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../../src/__tests__/pool.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,
|
|
1
|
+
{"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../../src/__tests__/pool.test.ts"],"names":[],"mappings":"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"}
|