@fragno-dev/core 0.1.1 → 0.1.2
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/.turbo/turbo-build.log +16 -16
- package/CHANGELOG.md +6 -0
- package/dist/api/api.d.ts +1 -1
- package/dist/api/fragment-builder.d.ts +2 -2
- package/dist/api/fragment-instantiation.d.ts +2 -2
- package/dist/api/fragment-instantiation.js +2 -2
- package/dist/{api-Dcr4_-3g.d.ts → api-jKNXmz2B.d.ts} +92 -6
- package/dist/api-jKNXmz2B.d.ts.map +1 -0
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +2 -2
- package/dist/client/client.svelte.d.ts +2 -2
- package/dist/client/client.svelte.js +2 -2
- package/dist/client/react.d.ts +2 -2
- package/dist/client/react.d.ts.map +1 -1
- package/dist/client/react.js +2 -2
- package/dist/client/react.js.map +1 -1
- package/dist/client/solid.d.ts +2 -2
- package/dist/client/solid.js +2 -2
- package/dist/client/vanilla.d.ts +2 -2
- package/dist/client/vanilla.js +2 -2
- package/dist/client/vue.d.ts +2 -2
- package/dist/client/vue.js +2 -2
- package/dist/{client-D5ORmjBP.js → client-CzWq6IlK.js} +2 -2
- package/dist/client-CzWq6IlK.js.map +1 -0
- package/dist/{fragment-builder-D6-oLYnH.d.ts → fragment-builder-B3JXWiZB.d.ts} +18 -5
- package/dist/{fragment-builder-D6-oLYnH.d.ts.map → fragment-builder-B3JXWiZB.d.ts.map} +1 -1
- package/dist/{fragment-instantiation-f4AhwQss.js → fragment-instantiation-D1q7pltx.js} +136 -11
- package/dist/fragment-instantiation-D1q7pltx.js.map +1 -0
- package/dist/mod.d.ts +2 -2
- package/dist/mod.js +2 -2
- package/dist/{route-B4RbOWjd.js → route-DbBZ3Ep9.js} +21 -13
- package/dist/route-DbBZ3Ep9.js.map +1 -0
- package/package.json +1 -1
- package/src/api/fragment-instantiation.ts +16 -3
- package/src/api/mutable-request-state.ts +107 -0
- package/src/api/request-input-context.test.ts +51 -0
- package/src/api/request-input-context.ts +20 -13
- package/src/api/request-middleware.test.ts +88 -2
- package/src/api/request-middleware.ts +28 -6
- package/src/api/request-output-context.test.ts +6 -2
- package/src/api/request-output-context.ts +15 -9
- package/src/client/component.test.svelte +2 -0
- package/src/client/internal/ndjson-streaming.ts +6 -2
- package/src/client/react.ts +3 -1
- package/src/util/async.test.ts +6 -2
- package/.turbo/turbo-test.log +0 -297
- package/.turbo/turbo-types$colon$check.log +0 -1
- package/dist/api-Dcr4_-3g.d.ts.map +0 -1
- package/dist/client-D5ORmjBP.js.map +0 -1
- package/dist/fragment-instantiation-f4AhwQss.js.map +0 -1
- package/dist/route-B4RbOWjd.js.map +0 -1
|
@@ -500,8 +500,7 @@ describe("Request Middleware", () => {
|
|
|
500
500
|
});
|
|
501
501
|
});
|
|
502
502
|
|
|
503
|
-
|
|
504
|
-
test.todo("middleware can modify query parameters", async () => {
|
|
503
|
+
test("middleware can modify query parameters", async () => {
|
|
505
504
|
const fragment = defineFragment("test-lib");
|
|
506
505
|
|
|
507
506
|
const routes = [
|
|
@@ -542,4 +541,91 @@ describe("Request Middleware", () => {
|
|
|
542
541
|
role: "some-other-role-defined-in-middleware",
|
|
543
542
|
});
|
|
544
543
|
});
|
|
544
|
+
|
|
545
|
+
test("middleware can modify request body", async () => {
|
|
546
|
+
const fragment = defineFragment("test-lib");
|
|
547
|
+
|
|
548
|
+
const routes = [
|
|
549
|
+
defineRoute({
|
|
550
|
+
method: "POST",
|
|
551
|
+
path: "/users",
|
|
552
|
+
inputSchema: z.object({ name: z.string(), role: z.string().optional() }),
|
|
553
|
+
outputSchema: z.object({ name: z.string(), role: z.string() }),
|
|
554
|
+
handler: async ({ input }, { json }) => {
|
|
555
|
+
const body = await input.valid();
|
|
556
|
+
return json({
|
|
557
|
+
name: body.name,
|
|
558
|
+
role: body.role ?? "user",
|
|
559
|
+
});
|
|
560
|
+
},
|
|
561
|
+
}),
|
|
562
|
+
] as const;
|
|
563
|
+
|
|
564
|
+
const instance = createFragment(fragment, {}, routes, {
|
|
565
|
+
mountRoute: "/api",
|
|
566
|
+
}).withMiddleware(async ({ ifMatchesRoute, requestState }) => {
|
|
567
|
+
// Middleware modifies the request body
|
|
568
|
+
const result = await ifMatchesRoute("POST", "/users", async ({ input }) => {
|
|
569
|
+
const body = await input.valid();
|
|
570
|
+
// Modify the body by adding a role field
|
|
571
|
+
requestState.setBody({
|
|
572
|
+
...body,
|
|
573
|
+
role: "admin-from-middleware",
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
return result;
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
const req = new Request("http://localhost/api/users", {
|
|
581
|
+
method: "POST",
|
|
582
|
+
headers: { "Content-Type": "application/json" },
|
|
583
|
+
body: JSON.stringify({ name: "John Doe" }),
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
const res = await instance.handler(req);
|
|
587
|
+
expect(res.status).toBe(200);
|
|
588
|
+
expect(await res.json()).toEqual({
|
|
589
|
+
name: "John Doe",
|
|
590
|
+
role: "admin-from-middleware",
|
|
591
|
+
});
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
test("middleware can modify request headers", async () => {
|
|
595
|
+
const fragment = defineFragment("test-lib");
|
|
596
|
+
|
|
597
|
+
const routes = [
|
|
598
|
+
defineRoute({
|
|
599
|
+
method: "GET",
|
|
600
|
+
path: "/data",
|
|
601
|
+
outputSchema: z.object({ auth: z.string(), custom: z.string() }),
|
|
602
|
+
handler: async ({ headers }, { json }) => {
|
|
603
|
+
return json({
|
|
604
|
+
auth: headers.get("Authorization") ?? "none",
|
|
605
|
+
custom: headers.get("X-Custom-Header") ?? "none",
|
|
606
|
+
});
|
|
607
|
+
},
|
|
608
|
+
}),
|
|
609
|
+
] as const;
|
|
610
|
+
|
|
611
|
+
const instance = createFragment(fragment, {}, routes, {
|
|
612
|
+
mountRoute: "/api",
|
|
613
|
+
}).withMiddleware(async ({ headers }) => {
|
|
614
|
+
// Middleware modifies headers
|
|
615
|
+
headers.set("Authorization", "Bearer middleware-token");
|
|
616
|
+
headers.set("X-Custom-Header", "middleware-value");
|
|
617
|
+
return undefined;
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
const req = new Request("http://localhost/api/data", {
|
|
621
|
+
method: "GET",
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
const res = await instance.handler(req);
|
|
625
|
+
expect(res.status).toBe(200);
|
|
626
|
+
expect(await res.json()).toEqual({
|
|
627
|
+
auth: "Bearer middleware-token",
|
|
628
|
+
custom: "middleware-value",
|
|
629
|
+
});
|
|
630
|
+
});
|
|
545
631
|
});
|
|
@@ -2,10 +2,10 @@ import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
|
2
2
|
import type { ExtractRouteByPath, ExtractRoutePath } from "../client/client";
|
|
3
3
|
import type { HTTPMethod } from "./api";
|
|
4
4
|
import type { ExtractPathParams } from "./internal/path";
|
|
5
|
-
import type { RequestBodyType } from "./request-input-context";
|
|
6
5
|
import type { AnyFragnoRouteConfig } from "./route";
|
|
7
6
|
import { RequestInputContext } from "./request-input-context";
|
|
8
7
|
import { OutputContext, RequestOutputContext } from "./request-output-context";
|
|
8
|
+
import { MutableRequestState } from "./mutable-request-state";
|
|
9
9
|
|
|
10
10
|
export type FragnoMiddlewareCallback<
|
|
11
11
|
TRoutes extends readonly AnyFragnoRouteConfig[],
|
|
@@ -19,10 +19,8 @@ export type FragnoMiddlewareCallback<
|
|
|
19
19
|
export interface RequestMiddlewareOptions {
|
|
20
20
|
path: string;
|
|
21
21
|
method: HTTPMethod;
|
|
22
|
-
pathParams?: Record<string, string>;
|
|
23
|
-
searchParams: URLSearchParams;
|
|
24
|
-
body: RequestBodyType;
|
|
25
22
|
request: Request;
|
|
23
|
+
state: MutableRequestState;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
export class RequestMiddlewareOutputContext<
|
|
@@ -50,9 +48,11 @@ export class RequestMiddlewareOutputContext<
|
|
|
50
48
|
export class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFragnoRouteConfig[]> {
|
|
51
49
|
readonly #options: RequestMiddlewareOptions;
|
|
52
50
|
readonly #route: TRoutes[number];
|
|
51
|
+
readonly #state: MutableRequestState;
|
|
53
52
|
|
|
54
53
|
constructor(routes: TRoutes, options: RequestMiddlewareOptions) {
|
|
55
54
|
this.#options = options;
|
|
55
|
+
this.#state = options.state;
|
|
56
56
|
|
|
57
57
|
const route = routes.find(
|
|
58
58
|
(route) => route.path === options.path && route.method === options.method,
|
|
@@ -74,11 +74,15 @@ export class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFra
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
get pathParams(): Record<string, string> {
|
|
77
|
-
return this.#
|
|
77
|
+
return this.#state.pathParams;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
get queryParams(): URLSearchParams {
|
|
81
|
-
return this.#
|
|
81
|
+
return this.#state.searchParams;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get headers(): Headers {
|
|
85
|
+
return this.#state.headers;
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
get inputSchema(): StandardSchemaV1 | undefined {
|
|
@@ -89,6 +93,23 @@ export class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFra
|
|
|
89
93
|
return this.#route.outputSchema;
|
|
90
94
|
}
|
|
91
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Access to the mutable request state.
|
|
98
|
+
* Use this to modify query parameters, path parameters, or request body.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // Modify body
|
|
103
|
+
* requestState.setBody({ modified: true });
|
|
104
|
+
*
|
|
105
|
+
* // Query params are already accessible via queryParams getter
|
|
106
|
+
* // Path params are already accessible via pathParams getter
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
get requestState(): MutableRequestState {
|
|
110
|
+
return this.#state;
|
|
111
|
+
}
|
|
112
|
+
|
|
92
113
|
// Defined as a field so that `this` reference stays in tact when destructuring
|
|
93
114
|
ifMatchesRoute = async <
|
|
94
115
|
const TMethod extends HTTPMethod,
|
|
@@ -116,6 +137,7 @@ export class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFra
|
|
|
116
137
|
path: path,
|
|
117
138
|
pathParams: this.pathParams as ExtractPathParams<TPath>,
|
|
118
139
|
inputSchema: this.#route.inputSchema,
|
|
140
|
+
state: this.#state,
|
|
119
141
|
});
|
|
120
142
|
|
|
121
143
|
const outputContext = new RequestOutputContext(this.#route.outputSchema);
|
|
@@ -327,7 +327,9 @@ describe("RequestOutputContext", () => {
|
|
|
327
327
|
try {
|
|
328
328
|
while (true) {
|
|
329
329
|
const { done, value } = await reader.read();
|
|
330
|
-
if (done)
|
|
330
|
+
if (done) {
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
331
333
|
chunks.push(decoder.decode(value));
|
|
332
334
|
}
|
|
333
335
|
} catch {
|
|
@@ -354,7 +356,9 @@ describe("RequestOutputContext", () => {
|
|
|
354
356
|
try {
|
|
355
357
|
while (true) {
|
|
356
358
|
const { done, value } = await reader.read();
|
|
357
|
-
if (done)
|
|
359
|
+
if (done) {
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
358
362
|
chunks.push(decoder.decode(value));
|
|
359
363
|
}
|
|
360
364
|
} catch {
|
|
@@ -19,7 +19,9 @@ function mergeHeaders(...headerSources: (HeadersInit | undefined)[]): HeadersIni
|
|
|
19
19
|
const mergedHeaders = new Headers();
|
|
20
20
|
|
|
21
21
|
for (const headerSource of headerSources) {
|
|
22
|
-
if (!headerSource)
|
|
22
|
+
if (!headerSource) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
23
25
|
|
|
24
26
|
if (headerSource instanceof Headers) {
|
|
25
27
|
for (const [key, value] of headerSource.entries()) {
|
|
@@ -45,11 +47,11 @@ export abstract class OutputContext<const TOutput, const TErrorCode extends stri
|
|
|
45
47
|
*
|
|
46
48
|
* Shortcut for `throw new FragnoApiError(...)`
|
|
47
49
|
*/
|
|
48
|
-
error(
|
|
50
|
+
error = (
|
|
49
51
|
{ message, code }: { message: string; code: TErrorCode },
|
|
50
52
|
initOrStatus?: ResponseInit | StatusCode,
|
|
51
53
|
headers?: HeadersInit,
|
|
52
|
-
): Response {
|
|
54
|
+
): Response => {
|
|
53
55
|
if (typeof initOrStatus === "undefined") {
|
|
54
56
|
return Response.json({ message: message, code }, { status: 500, headers });
|
|
55
57
|
}
|
|
@@ -63,12 +65,12 @@ export abstract class OutputContext<const TOutput, const TErrorCode extends stri
|
|
|
63
65
|
{ message: message, code },
|
|
64
66
|
{ status: initOrStatus.status, headers: mergedHeaders },
|
|
65
67
|
);
|
|
66
|
-
}
|
|
68
|
+
};
|
|
67
69
|
|
|
68
|
-
empty(
|
|
70
|
+
empty = (
|
|
69
71
|
initOrStatus?: ResponseInit<ContentlessStatusCode> | ContentlessStatusCode,
|
|
70
72
|
headers?: HeadersInit,
|
|
71
|
-
): Response {
|
|
73
|
+
): Response => {
|
|
72
74
|
const defaultHeaders = {};
|
|
73
75
|
|
|
74
76
|
if (typeof initOrStatus === "undefined") {
|
|
@@ -92,9 +94,13 @@ export abstract class OutputContext<const TOutput, const TErrorCode extends stri
|
|
|
92
94
|
status: initOrStatus.status,
|
|
93
95
|
headers: mergedHeaders,
|
|
94
96
|
});
|
|
95
|
-
}
|
|
97
|
+
};
|
|
96
98
|
|
|
97
|
-
json
|
|
99
|
+
json = (
|
|
100
|
+
object: TOutput,
|
|
101
|
+
initOrStatus?: ResponseInit | StatusCode,
|
|
102
|
+
headers?: HeadersInit,
|
|
103
|
+
): Response => {
|
|
98
104
|
if (typeof initOrStatus === "undefined") {
|
|
99
105
|
return Response.json(object, {
|
|
100
106
|
status: 200,
|
|
@@ -114,7 +120,7 @@ export abstract class OutputContext<const TOutput, const TErrorCode extends stri
|
|
|
114
120
|
status: initOrStatus.status,
|
|
115
121
|
headers: mergedHeaders,
|
|
116
122
|
});
|
|
117
|
-
}
|
|
123
|
+
};
|
|
118
124
|
|
|
119
125
|
jsonStream = (
|
|
120
126
|
cb: (stream: ResponseStream<TOutput>) => void | Promise<void>,
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import type { Readable } from "svelte/store";
|
|
3
3
|
import { useFragno } from "./client.svelte";
|
|
4
4
|
|
|
5
|
+
// oxlint-disable-next-line no-unassigned-vars
|
|
5
6
|
export let clientObj: Record<string, unknown>;
|
|
7
|
+
// oxlint-disable-next-line no-unassigned-vars
|
|
6
8
|
export let hookName: string;
|
|
7
9
|
export let args: Record<string, unknown> = {};
|
|
8
10
|
|
|
@@ -191,7 +191,9 @@ async function continueStreaming<TOutputSchema extends StandardSchemaV1, TErrorC
|
|
|
191
191
|
if (buffer.trim()) {
|
|
192
192
|
const lines = buffer.split("\n");
|
|
193
193
|
for (const line of lines) {
|
|
194
|
-
if (!line.trim())
|
|
194
|
+
if (!line.trim()) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
195
197
|
|
|
196
198
|
try {
|
|
197
199
|
const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;
|
|
@@ -215,7 +217,9 @@ async function continueStreaming<TOutputSchema extends StandardSchemaV1, TErrorC
|
|
|
215
217
|
buffer = lines.pop() || ""; // Keep incomplete line in buffer
|
|
216
218
|
|
|
217
219
|
for (const line of lines) {
|
|
218
|
-
if (!line.trim())
|
|
220
|
+
if (!line.trim()) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
219
223
|
|
|
220
224
|
try {
|
|
221
225
|
const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;
|
package/src/client/react.ts
CHANGED
|
@@ -210,7 +210,9 @@ export function useStore<SomeStore extends Store>(
|
|
|
210
210
|
|
|
211
211
|
const subscribe = useCallback((onChange: () => void) => {
|
|
212
212
|
const emitChange = (value: StoreValue<SomeStore>) => {
|
|
213
|
-
if (snapshotRef.current === value)
|
|
213
|
+
if (snapshotRef.current === value) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
214
216
|
snapshotRef.current = value;
|
|
215
217
|
onChange();
|
|
216
218
|
};
|
package/src/util/async.test.ts
CHANGED
|
@@ -20,7 +20,9 @@ describe("createAsyncIteratorFromCallback", () => {
|
|
|
20
20
|
const values: string[] = [];
|
|
21
21
|
for await (const value of iterator) {
|
|
22
22
|
values.push(value);
|
|
23
|
-
if (values.length === 3)
|
|
23
|
+
if (values.length === 3) {
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
24
26
|
}
|
|
25
27
|
return values;
|
|
26
28
|
})();
|
|
@@ -53,7 +55,9 @@ describe("createAsyncIteratorFromCallback", () => {
|
|
|
53
55
|
const values: string[] = [];
|
|
54
56
|
for await (const value of iterator) {
|
|
55
57
|
values.push(value);
|
|
56
|
-
if (values.length === 2)
|
|
58
|
+
if (values.length === 2) {
|
|
59
|
+
break;
|
|
60
|
+
} // Break after 2 values
|
|
57
61
|
}
|
|
58
62
|
return values;
|
|
59
63
|
})();
|
package/.turbo/turbo-test.log
DELETED
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
$ vitest run
|
|
2
|
-
12:33:31 PM [vite-plugin-svelte] no Svelte config found at /home/runner/work/fragno/fragno/packages/fragno - using default configuration.
|
|
3
|
-
|
|
4
|
-
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/fragno/fragno/packages/fragno[39m
|
|
5
|
-
[2mCoverage enabled with [22m[33mistanbul[39m
|
|
6
|
-
|
|
7
|
-
[32m✓[39m src/client/client.test.ts [2m([22m[2m36 tests[22m[2m)[22m[33m 316[2mms[22m[39m
|
|
8
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould be able to use mutator for POST route - direct result
|
|
9
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
10
|
-
|
|
11
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
12
|
-
|
|
13
|
-
act(() => {
|
|
14
|
-
/* fire events that update state */
|
|
15
|
-
});
|
|
16
|
-
/* assert on the output */
|
|
17
|
-
|
|
18
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
19
|
-
|
|
20
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould be able to use mutator for POST route - direct result
|
|
21
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
22
|
-
|
|
23
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
24
|
-
|
|
25
|
-
act(() => {
|
|
26
|
-
/* fire events that update state */
|
|
27
|
-
});
|
|
28
|
-
/* assert on the output */
|
|
29
|
-
|
|
30
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
31
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
32
|
-
|
|
33
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
34
|
-
|
|
35
|
-
act(() => {
|
|
36
|
-
/* fire events that update state */
|
|
37
|
-
});
|
|
38
|
-
/* assert on the output */
|
|
39
|
-
|
|
40
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
41
|
-
|
|
42
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould be able to use mutator for POST route - result in store
|
|
43
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
44
|
-
|
|
45
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
46
|
-
|
|
47
|
-
act(() => {
|
|
48
|
-
/* fire events that update state */
|
|
49
|
-
});
|
|
50
|
-
/* assert on the output */
|
|
51
|
-
|
|
52
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
53
|
-
|
|
54
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould be able to use mutator for POST route - result in store
|
|
55
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
56
|
-
|
|
57
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
58
|
-
|
|
59
|
-
act(() => {
|
|
60
|
-
/* fire events that update state */
|
|
61
|
-
});
|
|
62
|
-
/* assert on the output */
|
|
63
|
-
|
|
64
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
65
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
66
|
-
|
|
67
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
68
|
-
|
|
69
|
-
act(() => {
|
|
70
|
-
/* fire events that update state */
|
|
71
|
-
});
|
|
72
|
-
/* assert on the output */
|
|
73
|
-
|
|
74
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
75
|
-
|
|
76
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for PUT route with path params
|
|
77
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
78
|
-
|
|
79
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
80
|
-
|
|
81
|
-
act(() => {
|
|
82
|
-
/* fire events that update state */
|
|
83
|
-
});
|
|
84
|
-
/* assert on the output */
|
|
85
|
-
|
|
86
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
87
|
-
|
|
88
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for PUT route with path params
|
|
89
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
90
|
-
|
|
91
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
92
|
-
|
|
93
|
-
act(() => {
|
|
94
|
-
/* fire events that update state */
|
|
95
|
-
});
|
|
96
|
-
/* assert on the output */
|
|
97
|
-
|
|
98
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
99
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
100
|
-
|
|
101
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
102
|
-
|
|
103
|
-
act(() => {
|
|
104
|
-
/* fire events that update state */
|
|
105
|
-
});
|
|
106
|
-
/* assert on the output */
|
|
107
|
-
|
|
108
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
109
|
-
|
|
110
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for DELETE route (with inputSchema and outputSchema)
|
|
111
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
112
|
-
|
|
113
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
114
|
-
|
|
115
|
-
act(() => {
|
|
116
|
-
/* fire events that update state */
|
|
117
|
-
});
|
|
118
|
-
/* assert on the output */
|
|
119
|
-
|
|
120
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
121
|
-
|
|
122
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for DELETE route (with inputSchema and outputSchema)
|
|
123
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
124
|
-
|
|
125
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
126
|
-
|
|
127
|
-
act(() => {
|
|
128
|
-
/* fire events that update state */
|
|
129
|
-
});
|
|
130
|
-
/* assert on the output */
|
|
131
|
-
|
|
132
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
133
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
134
|
-
|
|
135
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
136
|
-
|
|
137
|
-
act(() => {
|
|
138
|
-
/* fire events that update state */
|
|
139
|
-
});
|
|
140
|
-
/* assert on the output */
|
|
141
|
-
|
|
142
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
143
|
-
|
|
144
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for DELETE route (withOUT inputSchema and outputSchema)
|
|
145
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
146
|
-
|
|
147
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
148
|
-
|
|
149
|
-
act(() => {
|
|
150
|
-
/* fire events that update state */
|
|
151
|
-
});
|
|
152
|
-
/* assert on the output */
|
|
153
|
-
|
|
154
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
155
|
-
|
|
156
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould create a mutator for DELETE route (withOUT inputSchema and outputSchema)
|
|
157
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
158
|
-
|
|
159
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
160
|
-
|
|
161
|
-
act(() => {
|
|
162
|
-
/* fire events that update state */
|
|
163
|
-
});
|
|
164
|
-
/* assert on the output */
|
|
165
|
-
|
|
166
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
167
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
168
|
-
|
|
169
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
170
|
-
|
|
171
|
-
act(() => {
|
|
172
|
-
/* fire events that update state */
|
|
173
|
-
});
|
|
174
|
-
/* assert on the output */
|
|
175
|
-
|
|
176
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
177
|
-
|
|
178
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould handle mutation errors
|
|
179
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
180
|
-
|
|
181
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
182
|
-
|
|
183
|
-
act(() => {
|
|
184
|
-
/* fire events that update state */
|
|
185
|
-
});
|
|
186
|
-
/* assert on the output */
|
|
187
|
-
|
|
188
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
189
|
-
|
|
190
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2mcreateReactMutator[2m > [22m[2mshould handle mutation errors
|
|
191
|
-
[22m[39mError in mutatorStore FragnoClientFetchNetworkError: Network request failed
|
|
192
|
-
at Function.fromUnknownFetchError [90m(/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client-error.ts:83:3[90m)[39m
|
|
193
|
-
at executeMutateQuery [90m(/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client.ts:5770:60[90m)[39m
|
|
194
|
-
at [90m/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client.ts:5806:52
|
|
195
|
-
at mutate (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@nanostores+query@0.3.4+e0f9796391ddf78a/node_modules/[4m@nanostores[24m/query/dist/nanoquery.js:300:26) {
|
|
196
|
-
[cause]: Error: Server error
|
|
197
|
-
at [90m/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/react.test.ts:416:70
|
|
198
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:155:11
|
|
199
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:752:26
|
|
200
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1897:20
|
|
201
|
-
at new Promise (<anonymous>)
|
|
202
|
-
at runWithTimeout (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1863:10)
|
|
203
|
-
at runTest (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1574:12)
|
|
204
|
-
at runSuite (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1729:8)
|
|
205
|
-
at runSuite (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1729:8)
|
|
206
|
-
at runFiles (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1787:3)
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
[90mstderr[2m | src/client/vanilla.test.ts[2m > [22m[2merror handling[2m > [22m[2mshould handle mutator errors gracefully
|
|
210
|
-
[22m[39mError in mutatorStore FragnoClientFetchNetworkError: Network request failed
|
|
211
|
-
at Function.fromUnknownFetchError [90m(/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client-error.ts:83:3[90m)[39m
|
|
212
|
-
at executeMutateQuery [90m(/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client.ts:5770:60[90m)[39m
|
|
213
|
-
at [90m/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/client.ts:5806:52
|
|
214
|
-
at Object.mutate (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@nanostores+query@0.3.4+e0f9796391ddf78a/node_modules/[4m@nanostores[24m/query/dist/nanoquery.js:300:26) {
|
|
215
|
-
[cause]: Error: Server error
|
|
216
|
-
at [90m/home/runner/work/fragno/fragno/packages/fragno/[39msrc/client/vanilla.test.ts:842:70
|
|
217
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:155:11
|
|
218
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:752:26
|
|
219
|
-
at file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1897:20
|
|
220
|
-
at new Promise (<anonymous>)
|
|
221
|
-
at runWithTimeout (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1863:10)
|
|
222
|
-
at runTest (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1574:12)
|
|
223
|
-
at runSuite (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1729:8)
|
|
224
|
-
at runSuite (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1729:8)
|
|
225
|
-
at runFiles (file:///home/runner/work/fragno/fragno/node_modules/[4m.bun[24m/@vitest+runner@3.2.4/node_modules/[4m@vitest[24m/runner/dist/chunk-hooks.js:1787:3)
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2museFragno[2m > [22m[2mshould transform a mixed object of hooks and mutators
|
|
229
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
230
|
-
|
|
231
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
232
|
-
|
|
233
|
-
act(() => {
|
|
234
|
-
/* fire events that update state */
|
|
235
|
-
});
|
|
236
|
-
/* assert on the output */
|
|
237
|
-
|
|
238
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
239
|
-
|
|
240
|
-
[90mstderr[2m | src/client/react.test.ts[2m > [22m[2museFragno[2m > [22m[2mshould transform a mixed object of hooks and mutators
|
|
241
|
-
[22m[39mAn update to TestComponent inside a test was not wrapped in act(...).
|
|
242
|
-
|
|
243
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
244
|
-
|
|
245
|
-
act(() => {
|
|
246
|
-
/* fire events that update state */
|
|
247
|
-
});
|
|
248
|
-
/* assert on the output */
|
|
249
|
-
|
|
250
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
251
|
-
An update to TestComponent inside a test was not wrapped in act(...).
|
|
252
|
-
|
|
253
|
-
When testing, code that causes React state updates should be wrapped into act(...):
|
|
254
|
-
|
|
255
|
-
act(() => {
|
|
256
|
-
/* fire events that update state */
|
|
257
|
-
});
|
|
258
|
-
/* assert on the output */
|
|
259
|
-
|
|
260
|
-
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
|
|
261
|
-
|
|
262
|
-
[32m✓[39m src/client/vanilla.test.ts [2m([22m[2m19 tests[22m[2m)[22m[33m 677[2mms[22m[39m
|
|
263
|
-
[32m✓[39m src/client/react.test.ts [2m([22m[2m26 tests[22m[2m)[22m[33m 874[2mms[22m[39m
|
|
264
|
-
[32m✓[39m src/client/solid.test.ts [2m([22m[2m19 tests[22m[2m)[22m[33m 339[2mms[22m[39m
|
|
265
|
-
[32m✓[39m src/client/vue.test.ts [2m([22m[2m14 tests[22m[2m)[22m[33m 1046[2mms[22m[39m
|
|
266
|
-
[32m✓[39m src/api/internal/path-type.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 28[2mms[22m[39m
|
|
267
|
-
[32m✓[39m src/client/client.svelte.test.ts [2m([22m[2m16 tests[22m[2m)[22m[33m 1420[2mms[22m[39m
|
|
268
|
-
[32m✓[39m src/api/request-output-context.test.ts [2m([22m[2m41 tests[22m[2m)[22m[33m 337[2mms[22m[39m
|
|
269
|
-
[90mstdout[2m | src/api/fragment.test.ts[2m > [22m[2mnew-fragment API[2m > [22m[2mFragment creation[2m > [22m[2mcreateFragment instantiates fragment with config
|
|
270
|
-
[22m[39mHELLO WORLD
|
|
271
|
-
|
|
272
|
-
[32m✓[39m src/api/fragment.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 143[2mms[22m[39m
|
|
273
|
-
[32m✓[39m src/client/client-types.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 35[2mms[22m[39m
|
|
274
|
-
[90mstderr[2m | src/api/request-middleware.test.ts[2m > [22m[2mRequest Middleware[2m > [22m[2mmiddleware calling input.valid() can ignore validation error
|
|
275
|
-
[22m[39mError in middleware FragnoApiValidationError: Validation failed
|
|
276
|
-
at RequestInputContext.#validateInput [90m(/home/runner/work/fragno/fragno/packages/fragno/[39msrc/api/request-input-context.ts:1173:13[90m)[39m
|
|
277
|
-
[90m at processTicksAndRejections (node:internal/process/task_queues:95:5)[39m
|
|
278
|
-
|
|
279
|
-
[32m✓[39m src/api/request-middleware.test.ts [2m([22m[2m10 tests[22m[2m | [22m[33m1 skipped[39m[2m)[22m[32m 260[2mms[22m[39m
|
|
280
|
-
[32m✓[39m src/client/internal/ndjson-streaming.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 116[2mms[22m[39m
|
|
281
|
-
[32m✓[39m src/api/request-input-context.test.ts [2m([22m[2m27 tests[22m[2m)[22m[32m 97[2mms[22m[39m
|
|
282
|
-
[32m✓[39m src/client/client-builder.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 80[2mms[22m[39m
|
|
283
|
-
[32m✓[39m src/api/route.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 100[2mms[22m[39m
|
|
284
|
-
[32m✓[39m src/api/api.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 59[2mms[22m[39m
|
|
285
|
-
[32m✓[39m src/api/internal/path-runtime.test.ts [2m([22m[2m22 tests[22m[2m)[22m[32m 43[2mms[22m[39m
|
|
286
|
-
[32m✓[39m src/util/content-type.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 55[2mms[22m[39m
|
|
287
|
-
[32m✓[39m src/util/async.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
288
|
-
[32m✓[39m src/api/internal/route.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 53[2mms[22m[39m
|
|
289
|
-
[32m✓[39m src/client/client-error.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 35[2mms[22m[39m
|
|
290
|
-
[32m✓[39m src/util/nanostores.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
291
|
-
[32m✓[39m src/client/client.ssr.test.ts [2m([22m[2m6 tests[22m[2m)[22m[33m 368[2mms[22m[39m
|
|
292
|
-
|
|
293
|
-
[2m Test Files [22m [1m[32m23 passed[39m[22m[90m (23)[39m
|
|
294
|
-
[2m Tests [22m [1m[32m354 passed[39m[22m[2m | [22m[90m1 todo[39m[90m (355)[39m
|
|
295
|
-
[2m Start at [22m 12:33:31
|
|
296
|
-
[2m Duration [22m 44.24s[2m (transform 14.44s, setup 0ms, collect 39.32s, tests 6.55s, environment 39.87s, prepare 12.52s)[22m
|
|
297
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
$ tsc --noEmit
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-Dcr4_-3g.d.ts","names":[],"sources":["../src/api/internal/path.ts","../src/api/request-input-context.ts","../src/http/http-status.ts","../src/api/internal/response-stream.ts","../src/util/types-util.ts","../src/api/request-output-context.ts","../src/api/error.ts","../src/api/api.ts"],"sourcesContent":[],"mappings":"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A,QAAA,EOqBS,mBPrBgB,COqBI,KPrBJ,EOqBW,YPrBX,CAAA,EAAA,SAAA,EOsBf,oBPtBe,COsBM,aPtBN,EOsBqB,UPtBrB,CAAA,CAAA,EOuBzB,OPvByB,COuBjB,QPvBiB,CAAA;;AAI1B,iBOuBY,QPvBZ,CAAA,gBOwBc,UPxBd,EAAA,cAAA,MAAA,EAAA,sBO0BoB,gBP1BpB,GAAA,SAAA,EAAA,mBAAA,MAAA,GAAA,MAAA,EAAA,yBAAA,MAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EO8BK,iBP9BL,CO+BA,OP/BA,EOgCA,SPhCA,COgCU,KPhCV,CAAA,EAAA,SAAA,EOkCA,aPlCA,EOmCA,UPnCA,EOoCA,gBPpCA,CAAA,GAAA;EACE,WAAA,CAAA,EAAA,SAAA;CACe,CAAA,EOoClB,iBPpCkB,COoCA,OPpCA,EOoCS,KPpCT,EAAA,SAAA,EOoC2B,aPpC3B,EOoC0C,UPpC1C,EOoCsD,gBPpCtD,CAAA;AAAb,iBOuCQ,QPvCR,CAAA,gBOwCU,UPxCV,EAAA,cAAA,MAAA,EAAA,qBO0Ce,gBP1Cf,EAAA,sBO2CgB,gBP3ChB,GAAA,SAAA,EAAA,mBAAA,MAAA,GAAA,MAAA,EAAA,yBAAA,MAAA,GAAA,MAAA,CAAA,CAAA,KAAA,EO+CC,iBP/CD,COgDJ,OPhDI,EOiDJ,SPjDI,COiDM,KPjDN,CAAA,EOkDJ,YPlDI,EOmDJ,aPnDI,EOoDJ,UPpDI,EOqDJ,gBPrDI,CAAA,GAAA;EAAgD,WAAA,EOuDvC,YPvDuC;CAA1B,CAAA,EOyD3B,iBPzD2B,COyDT,OPzDS,EOyDA,KPzDA,EOyDO,YPzDP,EOyDqB,aPzDrB,EOyDoC,UPzDpC,EOyDgD,gBPzDhD,CAAA"}
|