@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.
Files changed (51) hide show
  1. package/.turbo/turbo-build.log +16 -16
  2. package/CHANGELOG.md +6 -0
  3. package/dist/api/api.d.ts +1 -1
  4. package/dist/api/fragment-builder.d.ts +2 -2
  5. package/dist/api/fragment-instantiation.d.ts +2 -2
  6. package/dist/api/fragment-instantiation.js +2 -2
  7. package/dist/{api-Dcr4_-3g.d.ts → api-jKNXmz2B.d.ts} +92 -6
  8. package/dist/api-jKNXmz2B.d.ts.map +1 -0
  9. package/dist/client/client.d.ts +2 -2
  10. package/dist/client/client.js +2 -2
  11. package/dist/client/client.svelte.d.ts +2 -2
  12. package/dist/client/client.svelte.js +2 -2
  13. package/dist/client/react.d.ts +2 -2
  14. package/dist/client/react.d.ts.map +1 -1
  15. package/dist/client/react.js +2 -2
  16. package/dist/client/react.js.map +1 -1
  17. package/dist/client/solid.d.ts +2 -2
  18. package/dist/client/solid.js +2 -2
  19. package/dist/client/vanilla.d.ts +2 -2
  20. package/dist/client/vanilla.js +2 -2
  21. package/dist/client/vue.d.ts +2 -2
  22. package/dist/client/vue.js +2 -2
  23. package/dist/{client-D5ORmjBP.js → client-CzWq6IlK.js} +2 -2
  24. package/dist/client-CzWq6IlK.js.map +1 -0
  25. package/dist/{fragment-builder-D6-oLYnH.d.ts → fragment-builder-B3JXWiZB.d.ts} +18 -5
  26. package/dist/{fragment-builder-D6-oLYnH.d.ts.map → fragment-builder-B3JXWiZB.d.ts.map} +1 -1
  27. package/dist/{fragment-instantiation-f4AhwQss.js → fragment-instantiation-D1q7pltx.js} +136 -11
  28. package/dist/fragment-instantiation-D1q7pltx.js.map +1 -0
  29. package/dist/mod.d.ts +2 -2
  30. package/dist/mod.js +2 -2
  31. package/dist/{route-B4RbOWjd.js → route-DbBZ3Ep9.js} +21 -13
  32. package/dist/route-DbBZ3Ep9.js.map +1 -0
  33. package/package.json +1 -1
  34. package/src/api/fragment-instantiation.ts +16 -3
  35. package/src/api/mutable-request-state.ts +107 -0
  36. package/src/api/request-input-context.test.ts +51 -0
  37. package/src/api/request-input-context.ts +20 -13
  38. package/src/api/request-middleware.test.ts +88 -2
  39. package/src/api/request-middleware.ts +28 -6
  40. package/src/api/request-output-context.test.ts +6 -2
  41. package/src/api/request-output-context.ts +15 -9
  42. package/src/client/component.test.svelte +2 -0
  43. package/src/client/internal/ndjson-streaming.ts +6 -2
  44. package/src/client/react.ts +3 -1
  45. package/src/util/async.test.ts +6 -2
  46. package/.turbo/turbo-test.log +0 -297
  47. package/.turbo/turbo-types$colon$check.log +0 -1
  48. package/dist/api-Dcr4_-3g.d.ts.map +0 -1
  49. package/dist/client-D5ORmjBP.js.map +0 -1
  50. package/dist/fragment-instantiation-f4AhwQss.js.map +0 -1
  51. package/dist/route-B4RbOWjd.js.map +0 -1
@@ -500,8 +500,7 @@ describe("Request Middleware", () => {
500
500
  });
501
501
  });
502
502
 
503
- // TODO: This is not currently supported
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.#options.pathParams ?? {};
77
+ return this.#state.pathParams;
78
78
  }
79
79
 
80
80
  get queryParams(): URLSearchParams {
81
- return this.#options.searchParams;
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) break;
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) break;
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) continue;
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(object: TOutput, initOrStatus?: ResponseInit | StatusCode, headers?: HeadersInit): Response {
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()) continue;
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()) continue;
220
+ if (!line.trim()) {
221
+ continue;
222
+ }
219
223
 
220
224
  try {
221
225
  const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;
@@ -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) return;
213
+ if (snapshotRef.current === value) {
214
+ return;
215
+ }
214
216
  snapshotRef.current = value;
215
217
  onChange();
216
218
  };
@@ -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) break;
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) break; // Break after 2 values
58
+ if (values.length === 2) {
59
+ break;
60
+ } // Break after 2 values
57
61
  }
58
62
  return values;
59
63
  })();
@@ -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
-  RUN  v3.2.4 /home/runner/work/fragno/fragno/packages/fragno
5
- Coverage enabled with istanbul
6
-
7
- ✓ src/client/client.test.ts (36 tests) 316ms
8
- stderr | src/client/react.test.ts > createReactMutator > should be able to use mutator for POST route - direct result
9
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should be able to use mutator for POST route - direct result
21
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should be able to use mutator for POST route - result in store
43
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should be able to use mutator for POST route - result in store
55
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for PUT route with path params
77
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for PUT route with path params
89
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for DELETE route (with inputSchema and outputSchema)
111
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for DELETE route (with inputSchema and outputSchema)
123
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for DELETE route (withOUT inputSchema and outputSchema)
145
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should create a mutator for DELETE route (withOUT inputSchema and outputSchema)
157
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should handle mutation errors
179
- An 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
- stderr | src/client/react.test.ts > createReactMutator > should handle mutation errors
191
- Error in mutatorStore FragnoClientFetchNetworkError: Network request failed
192
- at Function.fromUnknownFetchError (/home/runner/work/fragno/fragno/packages/fragno/src/client/client-error.ts:83:3)
193
- at executeMutateQuery (/home/runner/work/fragno/fragno/packages/fragno/src/client/client.ts:5770:60)
194
- at /home/runner/work/fragno/fragno/packages/fragno/src/client/client.ts:5806:52
195
- at mutate (file:///home/runner/work/fragno/fragno/node_modules/.bun/@nanostores+query@0.3.4+e0f9796391ddf78a/node_modules/@nanostores/query/dist/nanoquery.js:300:26) {
196
- [cause]: Error: Server error
197
- at /home/runner/work/fragno/fragno/packages/fragno/src/client/react.test.ts:416:70
198
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:155:11
199
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:752:26
200
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1897:20
201
- at new Promise (<anonymous>)
202
- at runWithTimeout (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1863:10)
203
- at runTest (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1574:12)
204
- at runSuite (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1729:8)
205
- at runSuite (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1729:8)
206
- at runFiles (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1787:3)
207
- }
208
-
209
- stderr | src/client/vanilla.test.ts > error handling > should handle mutator errors gracefully
210
- Error in mutatorStore FragnoClientFetchNetworkError: Network request failed
211
- at Function.fromUnknownFetchError (/home/runner/work/fragno/fragno/packages/fragno/src/client/client-error.ts:83:3)
212
- at executeMutateQuery (/home/runner/work/fragno/fragno/packages/fragno/src/client/client.ts:5770:60)
213
- at /home/runner/work/fragno/fragno/packages/fragno/src/client/client.ts:5806:52
214
- at Object.mutate (file:///home/runner/work/fragno/fragno/node_modules/.bun/@nanostores+query@0.3.4+e0f9796391ddf78a/node_modules/@nanostores/query/dist/nanoquery.js:300:26) {
215
- [cause]: Error: Server error
216
- at /home/runner/work/fragno/fragno/packages/fragno/src/client/vanilla.test.ts:842:70
217
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:155:11
218
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:752:26
219
- at file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1897:20
220
- at new Promise (<anonymous>)
221
- at runWithTimeout (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1863:10)
222
- at runTest (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1574:12)
223
- at runSuite (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1729:8)
224
- at runSuite (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1729:8)
225
- at runFiles (file:///home/runner/work/fragno/fragno/node_modules/.bun/@vitest+runner@3.2.4/node_modules/@vitest/runner/dist/chunk-hooks.js:1787:3)
226
- }
227
-
228
- stderr | src/client/react.test.ts > useFragno > should transform a mixed object of hooks and mutators
229
- An 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
- stderr | src/client/react.test.ts > useFragno > should transform a mixed object of hooks and mutators
241
- An 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
- ✓ src/client/vanilla.test.ts (19 tests) 677ms
263
- ✓ src/client/react.test.ts (26 tests) 874ms
264
- ✓ src/client/solid.test.ts (19 tests) 339ms
265
- ✓ src/client/vue.test.ts (14 tests) 1046ms
266
- ✓ src/api/internal/path-type.test.ts (16 tests) 28ms
267
- ✓ src/client/client.svelte.test.ts (16 tests) 1420ms
268
- ✓ src/api/request-output-context.test.ts (41 tests) 337ms
269
- stdout | src/api/fragment.test.ts > new-fragment API > Fragment creation > createFragment instantiates fragment with config
270
- HELLO WORLD
271
-
272
- ✓ src/api/fragment.test.ts (15 tests) 143ms
273
- ✓ src/client/client-types.test.ts (15 tests) 35ms
274
- stderr | src/api/request-middleware.test.ts > Request Middleware > middleware calling input.valid() can ignore validation error
275
- Error in middleware FragnoApiValidationError: Validation failed
276
- at RequestInputContext.#validateInput (/home/runner/work/fragno/fragno/packages/fragno/src/api/request-input-context.ts:1173:13)
277
-  at processTicksAndRejections (node:internal/process/task_queues:95:5)
278
-
279
- ✓ src/api/request-middleware.test.ts (10 tests | 1 skipped) 260ms
280
- ✓ src/client/internal/ndjson-streaming.test.ts (10 tests) 116ms
281
- ✓ src/api/request-input-context.test.ts (27 tests) 97ms
282
- ✓ src/client/client-builder.test.ts (9 tests) 80ms
283
- ✓ src/api/route.test.ts (9 tests) 100ms
284
- ✓ src/api/api.test.ts (10 tests) 59ms
285
- ✓ src/api/internal/path-runtime.test.ts (22 tests) 43ms
286
- ✓ src/util/content-type.test.ts (13 tests) 55ms
287
- ✓ src/util/async.test.ts (3 tests) 41ms
288
- ✓ src/api/internal/route.test.ts (12 tests) 53ms
289
- ✓ src/client/client-error.test.ts (2 tests) 35ms
290
- ✓ src/util/nanostores.test.ts (5 tests) 25ms
291
- ✓ src/client/client.ssr.test.ts (6 tests) 368ms
292
-
293
-  Test Files  23 passed (23)
294
-  Tests  354 passed | 1 todo (355)
295
-  Start at  12:33:31
296
-  Duration  44.24s (transform 14.44s, setup 0ms, collect 39.32s, tests 6.55s, environment 39.87s, prepare 12.52s)
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"}