@fragno-dev/core 0.1.5 → 0.1.7

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 (71) hide show
  1. package/.turbo/turbo-build.log +49 -45
  2. package/CHANGELOG.md +52 -0
  3. package/dist/api/api.d.ts +2 -2
  4. package/dist/api/fragment-builder.d.ts +3 -2
  5. package/dist/api/fragment-instantiation.d.ts +4 -3
  6. package/dist/api/fragment-instantiation.js +3 -3
  7. package/dist/api/route.d.ts +3 -0
  8. package/dist/api/route.js +3 -0
  9. package/dist/{api-B1-h7jPC.d.ts → api-BWN97TOr.d.ts} +17 -3
  10. package/dist/api-BWN97TOr.d.ts.map +1 -0
  11. package/dist/api-DngJDcmO.js.map +1 -1
  12. package/dist/client/client.d.ts +4 -3
  13. package/dist/client/client.js +3 -3
  14. package/dist/client/client.svelte.d.ts +3 -3
  15. package/dist/client/client.svelte.d.ts.map +1 -1
  16. package/dist/client/client.svelte.js +3 -3
  17. package/dist/client/react.d.ts +3 -3
  18. package/dist/client/react.d.ts.map +1 -1
  19. package/dist/client/react.js +3 -3
  20. package/dist/client/solid.d.ts +3 -3
  21. package/dist/client/solid.d.ts.map +1 -1
  22. package/dist/client/solid.js +3 -3
  23. package/dist/client/vanilla.d.ts +3 -3
  24. package/dist/client/vanilla.d.ts.map +1 -1
  25. package/dist/client/vanilla.js +3 -3
  26. package/dist/client/vue.d.ts +3 -3
  27. package/dist/client/vue.d.ts.map +1 -1
  28. package/dist/client/vue.js +7 -7
  29. package/dist/client/vue.js.map +1 -1
  30. package/dist/{client-YUZaNg5U.js → client-C5LsYHEI.js} +92 -11
  31. package/dist/client-C5LsYHEI.js.map +1 -0
  32. package/dist/{fragment-builder-DsqUOfJ5.d.ts → fragment-builder-MGr68GNb.d.ts} +80 -44
  33. package/dist/fragment-builder-MGr68GNb.d.ts.map +1 -0
  34. package/dist/{fragment-instantiation-Cp0K8zdS.js → fragment-instantiation-C4wvwl6V.js} +108 -3
  35. package/dist/fragment-instantiation-C4wvwl6V.js.map +1 -0
  36. package/dist/mod.d.ts +3 -2
  37. package/dist/mod.js +3 -3
  38. package/dist/{route-Dk1GyqHs.js → request-output-context-CdIjwmEN.js} +13 -24
  39. package/dist/request-output-context-CdIjwmEN.js.map +1 -0
  40. package/dist/route-Bl9Zr1Yv.d.ts +26 -0
  41. package/dist/route-Bl9Zr1Yv.d.ts.map +1 -0
  42. package/dist/route-C5Uryylh.js +21 -0
  43. package/dist/route-C5Uryylh.js.map +1 -0
  44. package/dist/test/test.d.ts +24 -70
  45. package/dist/test/test.d.ts.map +1 -1
  46. package/dist/test/test.js +27 -115
  47. package/dist/test/test.js.map +1 -1
  48. package/package.json +6 -1
  49. package/src/api/api.ts +1 -0
  50. package/src/api/fragment-instantiation.test.ts +460 -0
  51. package/src/api/fragment-instantiation.ts +121 -0
  52. package/src/api/fragno-response.ts +132 -0
  53. package/src/api/internal/path-type.test.ts +7 -7
  54. package/src/api/internal/path.ts +1 -1
  55. package/src/api/request-output-context.test.ts +10 -10
  56. package/src/api/request-output-context.ts +3 -3
  57. package/src/api/route-handler-input-options.ts +15 -0
  58. package/src/client/client-types.test.ts +4 -4
  59. package/src/client/client.test.ts +341 -0
  60. package/src/client/client.ts +96 -15
  61. package/src/client/internal/fetcher-merge.ts +59 -0
  62. package/src/test/test.test.ts +110 -165
  63. package/src/test/test.ts +56 -266
  64. package/tsdown.config.ts +1 -0
  65. package/dist/api-B1-h7jPC.d.ts.map +0 -1
  66. package/dist/client-YUZaNg5U.js.map +0 -1
  67. package/dist/fragment-builder-DsqUOfJ5.d.ts.map +0 -1
  68. package/dist/fragment-instantiation-Cp0K8zdS.js.map +0 -1
  69. package/dist/route-CTxjMtGZ.js +0 -10
  70. package/dist/route-CTxjMtGZ.js.map +0 -1
  71. package/dist/route-Dk1GyqHs.js.map +0 -1
@@ -1,28 +1,9 @@
1
- import { c as OutputContext, d as MutableRequestState, h as MaybeExtractPathParamsOrWiden, l as InferOr, n as HTTPMethod, r as NonGetHTTPMethod, t as FragnoRouteConfig, u as StatusCode } from "./api-B1-h7jPC.js";
1
+ import { d as InferOrUnknown, f as StatusCode, g as MaybeExtractPathParamsOrWiden, l as OutputContext, n as HTTPMethod, o as RouteHandlerInputOptions, p as MutableRequestState, r as NonGetHTTPMethod, t as FragnoRouteConfig, u as InferOr } from "./api-BWN97TOr.js";
2
+ import { n as AnyRouteOrFactory, r as FlattenRouteFactories, t as AnyFragnoRouteConfig } from "./route-Bl9Zr1Yv.js";
2
3
  import { ReadableAtom, Store } from "nanostores";
3
4
  import { FetcherStore, MutatorStore } from "@nanostores/query";
4
5
  import { StandardSchemaV1 } from "@standard-schema/spec";
5
6
 
6
- //#region src/api/route.d.ts
7
- type AnyFragnoRouteConfig = FragnoRouteConfig<HTTPMethod, string, any, any, any, any>;
8
- interface RouteFactoryContext<TConfig, TDeps, TServices> {
9
- config: TConfig;
10
- deps: TDeps;
11
- services: TServices;
12
- }
13
- type RouteFactory<TConfig, TDeps, TServices, TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[]> = (context: RouteFactoryContext<TConfig, TDeps, TServices>) => TRoutes$1;
14
- type AnyRouteOrFactory = AnyFragnoRouteConfig | RouteFactory<any, any, any, any>;
15
- type FlattenRouteFactories<T extends readonly AnyRouteOrFactory[]> = T extends readonly [infer First, ...infer Rest extends readonly AnyRouteOrFactory[]] ? First extends RouteFactory<any, any, any, infer TRoutes> ? [...TRoutes, ...FlattenRouteFactories<Rest>] : [First, ...FlattenRouteFactories<Rest>] : [];
16
- declare function defineRoute<const TMethod extends HTTPMethod, const TPath extends string, const TOutputSchema extends StandardSchemaV1 | undefined, const TErrorCode extends string = string, const TQueryParameters extends string = string>(config: FragnoRouteConfig<TMethod, TPath, undefined, TOutputSchema, TErrorCode, TQueryParameters> & {
17
- inputSchema?: undefined;
18
- }): FragnoRouteConfig<TMethod, TPath, undefined, TOutputSchema, TErrorCode, TQueryParameters>;
19
- declare function defineRoute<const TMethod extends HTTPMethod, const TPath extends string, const TInputSchema extends StandardSchemaV1, const TOutputSchema extends StandardSchemaV1 | undefined, const TErrorCode extends string = string, const TQueryParameters extends string = string>(config: FragnoRouteConfig<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters> & {
20
- inputSchema: TInputSchema;
21
- }): FragnoRouteConfig<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters>;
22
- declare function defineRoutes<TConfig = {}, TDeps = {}, TServices = {}>(): {
23
- create: <const TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[]>(fn: (context: RouteFactoryContext<TConfig, TDeps, TServices>) => TRoutes$1) => RouteFactory<TConfig, TDeps, TServices, TRoutes$1>;
24
- };
25
- //#endregion
26
7
  //#region src/client/client-error.d.ts
27
8
  type FragnoErrorOptions = {
28
9
  cause?: Error | unknown;
@@ -103,19 +84,19 @@ type ExtractNonGetRoutePaths<T extends readonly FragnoRouteConfig<HTTPMethod, st
103
84
  * Defaults to extracting all methods for the matching path, producing a union
104
85
  * if multiple methods exist for the same path.
105
86
  */
106
- type ExtractRouteByPath<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string, TMethod extends HTTPMethod = HTTPMethod> = { [K in keyof TRoutes$1]: TRoutes$1[K] extends FragnoRouteConfig<infer M, TPath, infer Input, infer Output, infer ErrorCode, infer QueryParams> ? M extends TMethod ? FragnoRouteConfig<M, TPath, Input, Output, ErrorCode, QueryParams> : never : never }[number];
87
+ type ExtractRouteByPath<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string, TMethod extends HTTPMethod = HTTPMethod> = { [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<infer M, TPath, infer Input, infer Output, infer ErrorCode, infer QueryParams> ? M extends TMethod ? FragnoRouteConfig<M, TPath, Input, Output, ErrorCode, QueryParams> : never : never }[number];
107
88
  /**
108
89
  * Extract the output schema type for a specific route path from a routes array
109
90
  */
110
- type ExtractOutputSchemaForPath<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined>[], TPath extends string> = { [K in keyof TRoutes$1]: TRoutes$1[K] extends FragnoRouteConfig<infer Method, TPath, StandardSchemaV1 | undefined, infer Output> ? Method extends "GET" ? Output : never : never }[number];
91
+ type ExtractOutputSchemaForPath<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined>[], TPath extends string> = { [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<infer Method, TPath, StandardSchemaV1 | undefined, infer Output> ? Method extends "GET" ? Output : never : never }[number];
111
92
  /**
112
93
  * Check if a path exists as a GET route in the routes array
113
94
  */
114
- type IsValidGetRoutePath<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string> = TPath extends ExtractGetRoutePaths<TRoutes$1> ? true : false;
95
+ type IsValidGetRoutePath<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string> = TPath extends ExtractGetRoutePaths<TRoutes> ? true : false;
115
96
  /**
116
97
  * Utility type to ensure only valid GET route paths can be used
117
98
  */
118
- type ValidateGetRoutePath<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string> = TPath extends ExtractGetRoutePaths<TRoutes$1> ? TPath : `Error: Path '${TPath}' is not a valid GET route. Available GET routes: ${ExtractGetRoutePaths<TRoutes$1>}`;
99
+ type ValidateGetRoutePath<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TPath extends string> = TPath extends ExtractGetRoutePaths<TRoutes> ? TPath : `Error: Path '${TPath}' is not a valid GET route. Available GET routes: ${ExtractGetRoutePaths<TRoutes>}`;
119
100
  /**
120
101
  * Helper type to check if a routes array has any GET routes
121
102
  */
@@ -129,11 +110,11 @@ type FragnoClientHookData<TMethod extends HTTPMethod, TPath extends string, TOut
129
110
  route: FragnoRouteConfig<TMethod, TPath, StandardSchemaV1 | undefined, TOutputSchema, TErrorCode, TQueryParameters>;
130
111
  query(args?: {
131
112
  path?: MaybeExtractPathParamsOrWiden<TPath, string>;
132
- query?: Record<TQueryParameters, string>;
113
+ query?: Record<TQueryParameters, string | undefined>;
133
114
  }): Promise<StandardSchemaV1.InferOutput<TOutputSchema>>;
134
115
  store(args?: {
135
116
  path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;
136
- query?: Record<TQueryParameters, string | ReadableAtom<string>>;
117
+ query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;
137
118
  }): FetcherStore<StandardSchemaV1.InferOutput<TOutputSchema>, FragnoClientError<TErrorCode>>;
138
119
  [GET_HOOK_SYMBOL]: true;
139
120
  } & {
@@ -144,12 +125,12 @@ type FragnoClientMutatorData<TMethod extends NonGetHTTPMethod, TPath extends str
144
125
  mutateQuery(args?: {
145
126
  body?: InferOr<TInputSchema, undefined>;
146
127
  path?: MaybeExtractPathParamsOrWiden<TPath, string>;
147
- query?: Record<TQueryParameters, string>;
128
+ query?: Record<TQueryParameters, string | undefined>;
148
129
  }): Promise<InferOr<TOutputSchema, undefined>>;
149
130
  mutatorStore: MutatorStore<{
150
131
  body?: InferOr<TInputSchema, undefined>;
151
132
  path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;
152
- query?: Record<TQueryParameters, string | ReadableAtom<string>>;
133
+ query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;
153
134
  }, InferOr<TOutputSchema, undefined>, FragnoClientError<TErrorCode>>;
154
135
  [MUTATOR_HOOK_SYMBOL]: true;
155
136
  } & {
@@ -162,20 +143,21 @@ declare function buildUrl<TPath extends string>(config: {
162
143
  path: TPath;
163
144
  }, params: {
164
145
  pathParams?: Record<string, string | ReadableAtom<string>>;
165
- queryParams?: Record<string, string | ReadableAtom<string>>;
146
+ queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;
166
147
  }): string;
167
148
  /**
168
149
  * This method returns an array, which can be passed directly to nanostores.
169
150
  *
170
151
  * The returned array is always: path, pathParams (In order they appear in the path), queryParams (In alphabetical order)
171
152
  * Missing pathParams are replaced with "<missing>".
153
+ * Atoms with undefined values are wrapped in computed atoms that map undefined to "" to avoid nanoquery treating the key as incomplete.
172
154
  * @param path
173
155
  * @param params
174
156
  * @returns
175
157
  */
176
158
  declare function getCacheKey<TMethod extends HTTPMethod, TPath extends string>(method: TMethod, path: TPath, params?: {
177
159
  pathParams?: Record<string, string | ReadableAtom<string>>;
178
- queryParams?: Record<string, string | ReadableAtom<string>>;
160
+ queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;
179
161
  }): (string | ReadableAtom<string>)[];
180
162
  declare function isGetHook<TPath extends string, TOutputSchema extends StandardSchemaV1, TErrorCode extends string, TQueryParameters extends string>(hook: unknown): hook is FragnoClientHookData<"GET", TPath, TOutputSchema, TErrorCode, TQueryParameters>;
181
163
  declare function isMutatorHook<TMethod extends NonGetHTTPMethod, TPath extends string, TInputSchema extends StandardSchemaV1 | undefined, TOutputSchema extends StandardSchemaV1 | undefined, TErrorCode extends string, TQueryParameters extends string>(hook: unknown): hook is FragnoClientMutatorData<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters>;
@@ -207,11 +189,27 @@ type CacheLine = {
207
189
  created: number;
208
190
  expires: number;
209
191
  };
210
- declare class ClientBuilder<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TFragmentConfig extends FragnoFragmentSharedConfig<TRoutes$1>> {
192
+ declare class ClientBuilder<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[], TFragmentConfig extends FragnoFragmentSharedConfig<TRoutes>> {
211
193
  #private;
212
194
  constructor(publicConfig: FragnoPublicClientConfig, fragmentConfig: TFragmentConfig);
213
195
  get cacheEntries(): Readonly<Record<string, CacheLine>>;
214
196
  createStore<const T extends object>(obj: T): FragnoStoreData<T>;
197
+ /**
198
+ * Build a URL for a custom backend call using the configured baseUrl and mountRoute.
199
+ * Useful for fragment authors who need to make custom fetch calls.
200
+ */
201
+ buildUrl<TPath extends string>(path: TPath, params?: {
202
+ path?: MaybeExtractPathParamsOrWiden<TPath, string>;
203
+ query?: Record<string, string>;
204
+ }): string;
205
+ /**
206
+ * Get the configured fetcher function for custom backend calls.
207
+ * Returns fetch with merged options applied.
208
+ */
209
+ getFetcher(): {
210
+ fetcher: typeof fetch;
211
+ defaultOptions: RequestInit | undefined;
212
+ };
215
213
  createHook<TPath extends ExtractGetRoutePaths<TFragmentConfig["routes"]>>(path: ValidateGetRoutePath<TFragmentConfig["routes"], TPath>, options?: CreateHookOptions): FragnoClientHookData<"GET", TPath, NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath>["outputSchema"]>, NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath>["errorCodes"]>[number], NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath>["queryParameters"]>[number]>;
216
214
  createMutator<TPath extends ExtractNonGetRoutePaths<TFragmentConfig["routes"]>>(method: NonGetHTTPMethod, path: TPath, onInvalidate?: OnInvalidateFn<TPath>): FragnoClientMutatorData<NonGetHTTPMethod,
217
215
  // TODO: This can be any Method, but should be related to TPath
@@ -219,10 +217,10 @@ declare class ClientBuilder<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMet
219
217
  }
220
218
  declare function createClientBuilder<TConfig, TDeps, TServices extends Record<string, unknown>, const TRoutesOrFactories extends readonly AnyRouteOrFactory[], const TAdditionalContext extends Record<string, unknown>>(fragmentBuilder: {
221
219
  definition: FragmentDefinition<TConfig, TDeps, TServices, TAdditionalContext>;
222
- }, publicConfig: FragnoPublicClientConfig, routesOrFactories: TRoutesOrFactories): ClientBuilder<FlattenRouteFactories<TRoutesOrFactories>, FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>>;
220
+ }, publicConfig: FragnoPublicClientConfig, routesOrFactories: TRoutesOrFactories, authorFetcherConfig?: FetcherConfig): ClientBuilder<FlattenRouteFactories<TRoutesOrFactories>, FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>>;
223
221
  //#endregion
224
222
  //#region src/api/request-middleware.d.ts
225
- type FragnoMiddlewareCallback<TRoutes$1 extends readonly AnyFragnoRouteConfig[], TDeps, TServices extends Record<string, unknown>> = (inputContext: RequestMiddlewareInputContext<TRoutes$1>, outputContext: RequestMiddlewareOutputContext<TDeps, TServices>) => Promise<Response | undefined> | Response | undefined;
223
+ type FragnoMiddlewareCallback<TRoutes extends readonly AnyFragnoRouteConfig[], TDeps, TServices extends Record<string, unknown>> = (inputContext: RequestMiddlewareInputContext<TRoutes>, outputContext: RequestMiddlewareOutputContext<TDeps, TServices>) => Promise<Response | undefined> | Response | undefined;
226
224
  interface RequestMiddlewareOptions {
227
225
  path: string;
228
226
  method: HTTPMethod;
@@ -235,9 +233,9 @@ declare class RequestMiddlewareOutputContext<const TDeps, const TServices extend
235
233
  get deps(): TDeps;
236
234
  get services(): TServices;
237
235
  }
238
- declare class RequestMiddlewareInputContext<const TRoutes$1 extends readonly AnyFragnoRouteConfig[]> {
236
+ declare class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFragnoRouteConfig[]> {
239
237
  #private;
240
- constructor(routes: TRoutes$1, options: RequestMiddlewareOptions);
238
+ constructor(routes: TRoutes, options: RequestMiddlewareOptions);
241
239
  get path(): string;
242
240
  get method(): HTTPMethod;
243
241
  get pathParams(): Record<string, string>;
@@ -259,16 +257,52 @@ declare class RequestMiddlewareInputContext<const TRoutes$1 extends readonly Any
259
257
  * ```
260
258
  */
261
259
  get requestState(): MutableRequestState;
262
- ifMatchesRoute: <const TMethod extends HTTPMethod, const TPath extends ExtractRoutePath<TRoutes$1>, const TRoute extends ExtractRouteByPath<TRoutes$1, TPath, TMethod> = ExtractRouteByPath<TRoutes$1, TPath, TMethod>>(method: TMethod, path: TPath, handler: (...args: Parameters<TRoute["handler"]>) => Promise<Response | undefined | void> | Response | undefined | void) => Promise<Response | undefined>;
260
+ ifMatchesRoute: <const TMethod extends HTTPMethod, const TPath extends ExtractRoutePath<TRoutes>, const TRoute extends ExtractRouteByPath<TRoutes, TPath, TMethod> = ExtractRouteByPath<TRoutes, TPath, TMethod>>(method: TMethod, path: TPath, handler: (...args: Parameters<TRoute["handler"]>) => Promise<Response | undefined | void> | Response | undefined | void) => Promise<Response | undefined>;
263
261
  }
264
262
  //#endregion
263
+ //#region src/api/fragno-response.d.ts
264
+ /**
265
+ * Discriminated union representing all possible Fragno response types
266
+ */
267
+ type FragnoResponse<T> = {
268
+ type: "empty";
269
+ status: number;
270
+ headers: Headers;
271
+ } | {
272
+ type: "error";
273
+ status: number;
274
+ headers: Headers;
275
+ error: {
276
+ message: string;
277
+ code: string;
278
+ };
279
+ } | {
280
+ type: "json";
281
+ status: number;
282
+ headers: Headers;
283
+ data: T;
284
+ } | {
285
+ type: "jsonStream";
286
+ status: number;
287
+ headers: Headers;
288
+ stream: AsyncGenerator<T extends unknown[] ? T[number] : T>;
289
+ };
290
+ //#endregion
265
291
  //#region src/api/fragment-instantiation.d.ts
266
292
  interface FragnoPublicConfig {
267
293
  mountRoute?: string;
268
294
  }
295
+ type FetcherConfig = {
296
+ type: "options";
297
+ options: RequestInit;
298
+ } | {
299
+ type: "function";
300
+ fetcher: typeof fetch;
301
+ };
269
302
  interface FragnoPublicClientConfig {
270
303
  mountRoute?: string;
271
304
  baseUrl?: string;
305
+ fetcherConfig?: FetcherConfig;
272
306
  }
273
307
  type AstroHandlers = {
274
308
  ALL: (req: Request) => Promise<Response>;
@@ -324,20 +358,22 @@ type HandlersByFramework = {
324
358
  };
325
359
  declare const instantiatedFragmentFakeSymbol: "$fragno-instantiated-fragment";
326
360
  type FullstackFrameworks = keyof HandlersByFramework;
327
- interface FragnoInstantiatedFragment<TRoutes$1 extends readonly AnyFragnoRouteConfig[] = [], TDeps = {}, TServices extends Record<string, unknown> = Record<string, unknown>, TAdditionalContext extends Record<string, unknown> = {}> {
361
+ interface FragnoInstantiatedFragment<TRoutes extends readonly AnyFragnoRouteConfig[] = [], TDeps = {}, TServices extends Record<string, unknown> = Record<string, unknown>, TAdditionalContext extends Record<string, unknown> = {}> {
328
362
  [instantiatedFragmentFakeSymbol]: typeof instantiatedFragmentFakeSymbol;
329
- config: FragnoFragmentSharedConfig<TRoutes$1>;
363
+ config: FragnoFragmentSharedConfig<TRoutes>;
330
364
  deps: TDeps;
331
365
  services: TServices;
332
366
  additionalContext?: TAdditionalContext;
333
367
  handlersFor: <T extends FullstackFrameworks>(framework: T) => HandlersByFramework[T];
334
368
  handler: (req: Request) => Promise<Response>;
335
369
  mountRoute: string;
336
- withMiddleware: (handler: FragnoMiddlewareCallback<TRoutes$1, TDeps, TServices>) => FragnoInstantiatedFragment<TRoutes$1, TDeps, TServices, TAdditionalContext>;
370
+ callRoute: <TMethod extends HTTPMethod, TPath extends ExtractRoutePath<TRoutes, TMethod>>(method: TMethod, path: TPath, inputOptions?: RouteHandlerInputOptions<TPath, ExtractRouteByPath<TRoutes, TPath, TMethod>["inputSchema"]>) => Promise<FragnoResponse<InferOrUnknown<NonNullable<ExtractRouteByPath<TRoutes, TPath, TMethod>["outputSchema"]>>>>;
371
+ callRouteRaw: <TMethod extends HTTPMethod, TPath extends ExtractRoutePath<TRoutes, TMethod>>(method: TMethod, path: TPath, inputOptions?: RouteHandlerInputOptions<TPath, ExtractRouteByPath<TRoutes, TPath, TMethod>["inputSchema"]>) => Promise<Response>;
372
+ withMiddleware: (handler: FragnoMiddlewareCallback<TRoutes, TDeps, TServices>) => FragnoInstantiatedFragment<TRoutes, TDeps, TServices, TAdditionalContext>;
337
373
  }
338
- interface FragnoFragmentSharedConfig<TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[]> {
374
+ interface FragnoFragmentSharedConfig<TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[]> {
339
375
  name: string;
340
- routes: TRoutes$1;
376
+ routes: TRoutes;
341
377
  }
342
378
  type AnyFragnoFragmentSharedConfig = FragnoFragmentSharedConfig<readonly AnyFragnoRouteConfig[]>;
343
379
  declare function createFragment<const TConfig, const TDeps, const TServices extends Record<string, unknown>, const TRoutesOrFactories extends readonly AnyRouteOrFactory[], const TAdditionalContext extends Record<string, unknown>, const TOptions extends FragnoPublicConfig>(fragmentBuilder: {
@@ -369,5 +405,5 @@ declare class FragmentBuilder<const TConfig, const TDeps = {}, const TServices e
369
405
  }
370
406
  declare function defineFragment<TConfig = {}>(name: string): FragmentBuilder<TConfig, {}, {}, {}>;
371
407
  //#endregion
372
- export { isGetHook as A, AnyRouteOrFactory as B, HasGetRoutes as C, buildUrl as D, ValidateGetRoutePath as E, FragnoClientFetchAbortError as F, defineRoutes as G, RouteFactory as H, FragnoClientFetchError as I, FragnoClientFetchNetworkError as L, isStore as M, FragnoClientApiError as N, createClientBuilder as O, FragnoClientError as P, FragnoClientUnknownApiError as R, FragnoStoreData as S, ObjectContainingStoreField as T, RouteFactoryContext as U, FlattenRouteFactories as V, defineRoute as W, ExtractOutputSchemaForPath as _, FragnoFragmentSharedConfig as a, FragnoClientHookData as b, FragnoPublicConfig as c, CacheLine as d, ClientBuilder as f, ExtractNonGetRoutePaths as g, ExtractGetRoutes as h, AnyFragnoFragmentSharedConfig as i, isMutatorHook as j, getCacheKey as k, createFragment as l, ExtractGetRoutePaths as m, FragmentDefinition as n, FragnoInstantiatedFragment as o, CreateHookOptions as p, defineFragment as r, FragnoPublicClientConfig as s, FragmentBuilder as t, instantiatedFragmentFakeSymbol as u, ExtractRouteByPath as v, IsValidGetRoutePath as w, FragnoClientMutatorData as x, ExtractRoutePath as y, FragnoErrorOptions as z };
373
- //# sourceMappingURL=fragment-builder-DsqUOfJ5.d.ts.map
408
+ export { createClientBuilder as A, FragnoClientUnknownApiError as B, FragnoClientMutatorData as C, ObjectContainingStoreField as D, IsValidGetRoutePath as E, FragnoClientApiError as F, FragnoClientError as I, FragnoClientFetchAbortError as L, isGetHook as M, isMutatorHook as N, ValidateGetRoutePath as O, isStore as P, FragnoClientFetchError as R, FragnoClientHookData as S, HasGetRoutes as T, FragnoErrorOptions as V, ExtractGetRoutes as _, FetcherConfig as a, ExtractRouteByPath as b, FragnoPublicClientConfig as c, instantiatedFragmentFakeSymbol as d, FragnoResponse as f, ExtractGetRoutePaths as g, CreateHookOptions as h, AnyFragnoFragmentSharedConfig as i, getCacheKey as j, buildUrl as k, FragnoPublicConfig as l, ClientBuilder as m, FragmentDefinition as n, FragnoFragmentSharedConfig as o, CacheLine as p, defineFragment as r, FragnoInstantiatedFragment as s, FragmentBuilder as t, createFragment as u, ExtractNonGetRoutePaths as v, FragnoStoreData as w, ExtractRoutePath as x, ExtractOutputSchemaForPath as y, FragnoClientFetchNetworkError as z };
409
+ //# sourceMappingURL=fragment-builder-MGr68GNb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-builder-MGr68GNb.d.ts","names":[],"sources":["../src/client/client-error.ts","../src/client/client.ts","../src/api/request-middleware.ts","../src/api/fragno-response.ts","../src/api/fragment-instantiation.ts","../src/api/fragment-builder.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as FragnoApiError } from "./api-DngJDcmO.js";
2
- import { t as getMountRoute } from "./route-CTxjMtGZ.js";
3
- import { a as RequestOutputContext, i as OutputContext, o as RequestInputContext, r as resolveRouteFactories } from "./route-Dk1GyqHs.js";
2
+ import { i as getMountRoute, n as RequestOutputContext, r as RequestInputContext, t as OutputContext } from "./request-output-context-CdIjwmEN.js";
3
+ import { r as resolveRouteFactories } from "./route-C5Uryylh.js";
4
4
  import { addRoute, createRouter, findRoute } from "rou3";
5
5
 
6
6
  //#region src/api/mutable-request-state.ts
@@ -175,6 +175,77 @@ var RequestMiddlewareInputContext = class {
175
175
  };
176
176
  };
177
177
 
178
+ //#endregion
179
+ //#region src/api/fragno-response.ts
180
+ /**
181
+ * Parse a Response object into a FragnoResponse discriminated union
182
+ */
183
+ async function parseFragnoResponse(response) {
184
+ const status = response.status;
185
+ const headers = response.headers;
186
+ if ((headers.get("content-type") || "").includes("application/x-ndjson")) return {
187
+ type: "jsonStream",
188
+ status,
189
+ headers,
190
+ stream: parseNDJSONStream(response)
191
+ };
192
+ const text = await response.text();
193
+ if (!text || text === "null") return {
194
+ type: "empty",
195
+ status,
196
+ headers
197
+ };
198
+ const data = JSON.parse(text);
199
+ if (data && typeof data === "object" && "code" in data) {
200
+ if ("message" in data) return {
201
+ type: "error",
202
+ status,
203
+ headers,
204
+ error: {
205
+ message: data.message,
206
+ code: data.code
207
+ }
208
+ };
209
+ if ("error" in data) return {
210
+ type: "error",
211
+ status,
212
+ headers,
213
+ error: {
214
+ message: data.error,
215
+ code: data.code
216
+ }
217
+ };
218
+ }
219
+ return {
220
+ type: "json",
221
+ status,
222
+ headers,
223
+ data
224
+ };
225
+ }
226
+ /**
227
+ * Parse an NDJSON stream into an async generator
228
+ */
229
+ async function* parseNDJSONStream(response) {
230
+ if (!response.body) return;
231
+ const reader = response.body.getReader();
232
+ const decoder = new TextDecoder();
233
+ let buffer = "";
234
+ try {
235
+ while (true) {
236
+ const { done, value } = await reader.read();
237
+ if (done) break;
238
+ buffer += decoder.decode(value, { stream: true });
239
+ const lines = buffer.split("\n");
240
+ buffer = lines.pop() || "";
241
+ for (const line of lines) if (line.trim()) yield JSON.parse(line);
242
+ }
243
+ if (buffer.trim()) yield JSON.parse(buffer);
244
+ } finally {
245
+ reader.releaseLock();
246
+ }
247
+ }
248
+
178
249
  //#endregion
179
250
  //#region src/api/fragment-instantiation.ts
180
251
  const instantiatedFragmentFakeSymbol = "$fragno-instantiated-fragment";
@@ -212,6 +283,40 @@ function createFragment(fragmentBuilder, config, routesOrFactories, options) {
212
283
  middlewareHandler = handler;
213
284
  return fragment;
214
285
  },
286
+ callRoute: async (method, path, inputOptions) => {
287
+ return parseFragnoResponse(await fragment.callRouteRaw(method, path, inputOptions));
288
+ },
289
+ callRouteRaw: async (method, path, inputOptions) => {
290
+ const route = routes.find((r) => r.method === method && r.path === path);
291
+ if (!route) return Response.json({
292
+ error: `Route ${method} ${path} not found`,
293
+ code: "ROUTE_NOT_FOUND"
294
+ }, { status: 404 });
295
+ const { pathParams = {}, body, query, headers } = inputOptions || {};
296
+ const searchParams = query instanceof URLSearchParams ? query : query ? new URLSearchParams(query) : new URLSearchParams();
297
+ const requestHeaders = headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();
298
+ const inputContext = new RequestInputContext({
299
+ path: route.path,
300
+ method: route.method,
301
+ pathParams,
302
+ searchParams,
303
+ headers: requestHeaders,
304
+ parsedBody: body,
305
+ inputSchema: route.inputSchema,
306
+ shouldValidateInput: true
307
+ });
308
+ const outputContext = new RequestOutputContext(route.outputSchema);
309
+ try {
310
+ return await route.handler(inputContext, outputContext);
311
+ } catch (error) {
312
+ console.error("Error in callRoute handler", error);
313
+ if (error instanceof FragnoApiError) return error.toResponse();
314
+ return Response.json({
315
+ error: "Internal server error",
316
+ code: "INTERNAL_SERVER_ERROR"
317
+ }, { status: 500 });
318
+ }
319
+ },
215
320
  handlersFor: (framework) => {
216
321
  const handler = fragment.handler;
217
322
  if (framework === "h3" || framework === "nuxt") throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:
@@ -338,4 +443,4 @@ function createFragment(fragmentBuilder, config, routesOrFactories, options) {
338
443
 
339
444
  //#endregion
340
445
  export { instantiatedFragmentFakeSymbol as n, createFragment as t };
341
- //# sourceMappingURL=fragment-instantiation-Cp0K8zdS.js.map
446
+ //# sourceMappingURL=fragment-instantiation-C4wvwl6V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment-instantiation-C4wvwl6V.js","names":["#pathParams","#searchParams","#headers","#initialBody","#bodyOverride","#deps","#services","#options","#route","#state","route","middlewareHandler:\n | FragnoMiddlewareCallback<FlattenRouteFactories<TRoutesOrFactories>, TDeps, TServices>\n | undefined","fragment: FragnoInstantiatedFragment<\n FlattenRouteFactories<TRoutesOrFactories>,\n TDeps,\n TServices,\n TAdditionalContext & TOptions\n >","requestBody: RequestBodyType","rawBody: string | undefined"],"sources":["../src/api/mutable-request-state.ts","../src/api/request-middleware.ts","../src/api/fragno-response.ts","../src/api/fragment-instantiation.ts"],"sourcesContent":["import type { RequestBodyType } from \"./request-input-context\";\n\n/**\n * Holds mutable request state that can be modified by middleware and consumed by handlers.\n *\n * This class provides a structural way for middleware to modify request data:\n * - Path parameters can be modified\n * - Query/search parameters can be modified\n * - Request body can be overridden\n * - Request headers can be modified\n *\n * @example\n * ```typescript\n * // In middleware\n * const state = new MutableRequestState({\n * pathParams: { id: \"123\" },\n * searchParams: new URLSearchParams(\"?role=user\"),\n * body: { name: \"John\" },\n * headers: new Headers()\n * });\n *\n * // Modify query parameters\n * state.searchParams.set(\"role\", \"admin\");\n *\n * // Override body\n * state.setBody({ name: \"Jane\" });\n *\n * // Modify headers\n * state.headers.set(\"X-Custom\", \"value\");\n * ```\n */\nexport class MutableRequestState {\n readonly #pathParams: Record<string, string>;\n readonly #searchParams: URLSearchParams;\n readonly #headers: Headers;\n // oxlint-disable-next-line no-unused-private-class-members False Positive?\n readonly #initialBody: RequestBodyType;\n #bodyOverride: RequestBodyType | undefined;\n\n constructor(config: {\n pathParams: Record<string, string>;\n searchParams: URLSearchParams;\n body: RequestBodyType;\n headers: Headers;\n }) {\n this.#pathParams = config.pathParams;\n this.#searchParams = config.searchParams;\n this.#headers = config.headers;\n this.#initialBody = config.body;\n this.#bodyOverride = undefined;\n }\n\n /**\n * Path parameters extracted from the route.\n * Can be modified directly (e.g., `state.pathParams.id = \"456\"`).\n */\n get pathParams(): Record<string, string> {\n return this.#pathParams;\n }\n\n /**\n * URLSearchParams for query parameters.\n * Can be modified using URLSearchParams API (e.g., `state.searchParams.set(\"key\", \"value\")`).\n */\n get searchParams(): URLSearchParams {\n return this.#searchParams;\n }\n\n /**\n * Request headers.\n * Can be modified using Headers API (e.g., `state.headers.set(\"X-Custom\", \"value\")`).\n */\n get headers(): Headers {\n return this.#headers;\n }\n\n /**\n * Get the current body value.\n * Returns the override if set, otherwise the initial body.\n */\n get body(): RequestBodyType {\n return this.#bodyOverride !== undefined ? this.#bodyOverride : this.#initialBody;\n }\n\n /**\n * Override the request body.\n * This allows middleware to replace the body that will be seen by the handler.\n *\n * @param body - The new body value\n *\n * @example\n * ```typescript\n * // In middleware\n * state.setBody({ modifiedField: \"new value\" });\n * ```\n */\n setBody(body: RequestBodyType): void {\n this.#bodyOverride = body;\n }\n\n /**\n * Check if the body has been overridden by middleware.\n */\n get hasBodyOverride(): boolean {\n return this.#bodyOverride !== undefined;\n }\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ExtractRouteByPath, ExtractRoutePath } from \"../client/client\";\nimport type { HTTPMethod } from \"./api\";\nimport type { ExtractPathParams } from \"./internal/path\";\nimport type { AnyFragnoRouteConfig } from \"./route\";\nimport { RequestInputContext } from \"./request-input-context\";\nimport { OutputContext, RequestOutputContext } from \"./request-output-context\";\nimport { MutableRequestState } from \"./mutable-request-state\";\n\nexport type FragnoMiddlewareCallback<\n TRoutes extends readonly AnyFragnoRouteConfig[],\n TDeps,\n TServices extends Record<string, unknown>,\n> = (\n inputContext: RequestMiddlewareInputContext<TRoutes>,\n outputContext: RequestMiddlewareOutputContext<TDeps, TServices>,\n) => Promise<Response | undefined> | Response | undefined;\n\nexport interface RequestMiddlewareOptions {\n path: string;\n method: HTTPMethod;\n request: Request;\n state: MutableRequestState;\n}\n\nexport class RequestMiddlewareOutputContext<\n const TDeps,\n const TServices extends Record<string, unknown>,\n> extends OutputContext<unknown, string> {\n readonly #deps: TDeps;\n readonly #services: TServices;\n\n constructor(deps: TDeps, services: TServices) {\n super();\n this.#deps = deps;\n this.#services = services;\n }\n\n get deps(): TDeps {\n return this.#deps;\n }\n\n get services(): TServices {\n return this.#services;\n }\n}\n\nexport class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFragnoRouteConfig[]> {\n readonly #options: RequestMiddlewareOptions;\n readonly #route: TRoutes[number];\n readonly #state: MutableRequestState;\n\n constructor(routes: TRoutes, options: RequestMiddlewareOptions) {\n this.#options = options;\n this.#state = options.state;\n\n const route = routes.find(\n (route) => route.path === options.path && route.method === options.method,\n );\n\n if (!route) {\n throw new Error(`Route not found: ${options.path} ${options.method}`);\n }\n\n this.#route = route;\n }\n\n get path(): string {\n return this.#options.path;\n }\n\n get method(): HTTPMethod {\n return this.#options.method;\n }\n\n get pathParams(): Record<string, string> {\n return this.#state.pathParams;\n }\n\n get queryParams(): URLSearchParams {\n return this.#state.searchParams;\n }\n\n get headers(): Headers {\n return this.#state.headers;\n }\n\n get inputSchema(): StandardSchemaV1 | undefined {\n return this.#route.inputSchema;\n }\n\n get outputSchema(): StandardSchemaV1 | undefined {\n return this.#route.outputSchema;\n }\n\n /**\n * Access to the mutable request state.\n * Use this to modify query parameters, path parameters, or request body.\n *\n * @example\n * ```typescript\n * // Modify body\n * requestState.setBody({ modified: true });\n *\n * // Query params are already accessible via queryParams getter\n * // Path params are already accessible via pathParams getter\n * ```\n */\n get requestState(): MutableRequestState {\n return this.#state;\n }\n\n // Defined as a field so that `this` reference stays in tact when destructuring\n ifMatchesRoute = async <\n const TMethod extends HTTPMethod,\n const TPath extends ExtractRoutePath<TRoutes>,\n const TRoute extends ExtractRouteByPath<TRoutes, TPath, TMethod> = ExtractRouteByPath<\n TRoutes,\n TPath,\n TMethod\n >,\n >(\n method: TMethod,\n path: TPath,\n handler: (\n ...args: Parameters<TRoute[\"handler\"]>\n ) => Promise<Response | undefined | void> | Response | undefined | void,\n ): Promise<Response | undefined> => {\n if (this.path !== path || this.method !== method) {\n return undefined;\n }\n\n // TODO(Wilco): We should support reading/modifying headers here.\n const inputContext = await RequestInputContext.fromRequest({\n request: this.#options.request,\n method: this.#options.method,\n path: path,\n pathParams: this.pathParams as ExtractPathParams<TPath>,\n inputSchema: this.#route.inputSchema,\n state: this.#state,\n });\n\n const outputContext = new RequestOutputContext(this.#route.outputSchema);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (handler as any)(inputContext, outputContext);\n };\n}\n","/**\n * Discriminated union representing all possible Fragno response types\n */\nexport type FragnoResponse<T> =\n | {\n type: \"empty\";\n status: number;\n headers: Headers;\n }\n | {\n type: \"error\";\n status: number;\n headers: Headers;\n error: { message: string; code: string };\n }\n | {\n type: \"json\";\n status: number;\n headers: Headers;\n data: T;\n }\n | {\n type: \"jsonStream\";\n status: number;\n headers: Headers;\n stream: AsyncGenerator<T extends unknown[] ? T[number] : T>;\n };\n\n/**\n * Parse a Response object into a FragnoResponse discriminated union\n */\nexport async function parseFragnoResponse<T>(response: Response): Promise<FragnoResponse<T>> {\n const status = response.status;\n const headers = response.headers;\n const contentType = headers.get(\"content-type\") || \"\";\n\n // Check for streaming response\n if (contentType.includes(\"application/x-ndjson\")) {\n return {\n type: \"jsonStream\",\n status,\n headers,\n stream: parseNDJSONStream<T>(response),\n };\n }\n\n // Parse JSON body\n const text = await response.text();\n\n // Empty response\n if (!text || text === \"null\") {\n return {\n type: \"empty\",\n status,\n headers,\n };\n }\n\n const data = JSON.parse(text);\n\n // Error response (has message and code, or error and code)\n if (data && typeof data === \"object\" && \"code\" in data) {\n if (\"message\" in data) {\n return {\n type: \"error\",\n status,\n headers,\n error: { message: data.message, code: data.code },\n };\n }\n if (\"error\" in data) {\n return {\n type: \"error\",\n status,\n headers,\n error: { message: data.error, code: data.code },\n };\n }\n }\n\n // JSON response\n return {\n type: \"json\",\n status,\n headers,\n data: data as T,\n };\n}\n\n/**\n * Parse an NDJSON stream into an async generator\n */\nasync function* parseNDJSONStream<T>(\n response: Response,\n): AsyncGenerator<T extends unknown[] ? T[number] : T> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n yield JSON.parse(line) as T extends unknown[] ? T[number] : T;\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer.trim()) {\n yield JSON.parse(buffer) as T extends unknown[] ? T[number] : T;\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { type FragnoRouteConfig, type HTTPMethod } from \"./api\";\nimport { FragnoApiError } from \"./error\";\nimport { getMountRoute } from \"./internal/route\";\nimport { addRoute, createRouter, findRoute } from \"rou3\";\nimport { RequestInputContext, type RequestBodyType } from \"./request-input-context\";\nimport type { ExtractPathParams } from \"./internal/path\";\nimport { RequestOutputContext } from \"./request-output-context\";\nimport {\n type AnyFragnoRouteConfig,\n type AnyRouteOrFactory,\n type FlattenRouteFactories,\n resolveRouteFactories,\n} from \"./route\";\nimport {\n RequestMiddlewareInputContext,\n RequestMiddlewareOutputContext,\n type FragnoMiddlewareCallback,\n} from \"./request-middleware\";\nimport type { FragmentDefinition } from \"./fragment-builder\";\nimport { MutableRequestState } from \"./mutable-request-state\";\nimport type { RouteHandlerInputOptions } from \"./route-handler-input-options\";\nimport type { ExtractRouteByPath, ExtractRoutePath } from \"../client/client\";\nimport { type FragnoResponse, parseFragnoResponse } from \"./fragno-response\";\nimport type { InferOrUnknown } from \"../util/types-util\";\n\nexport interface FragnoPublicConfig {\n mountRoute?: string;\n}\n\nexport type FetcherConfig =\n | { type: \"options\"; options: RequestInit }\n | { type: \"function\"; fetcher: typeof fetch };\n\nexport interface FragnoPublicClientConfig {\n mountRoute?: string;\n baseUrl?: string;\n fetcherConfig?: FetcherConfig;\n}\n\ntype AstroHandlers = {\n ALL: (req: Request) => Promise<Response>;\n};\n\ntype ReactRouterHandlers = {\n loader: (args: { request: Request }) => Promise<Response>;\n action: (args: { request: Request }) => Promise<Response>;\n};\n\ntype SolidStartHandlers = {\n GET: (args: { request: Request }) => Promise<Response>;\n POST: (args: { request: Request }) => Promise<Response>;\n PUT: (args: { request: Request }) => Promise<Response>;\n DELETE: (args: { request: Request }) => Promise<Response>;\n PATCH: (args: { request: Request }) => Promise<Response>;\n HEAD: (args: { request: Request }) => Promise<Response>;\n OPTIONS: (args: { request: Request }) => Promise<Response>;\n};\n\ntype TanStackStartHandlers = SolidStartHandlers;\n\ntype StandardHandlers = {\n GET: (req: Request) => Promise<Response>;\n POST: (req: Request) => Promise<Response>;\n PUT: (req: Request) => Promise<Response>;\n DELETE: (req: Request) => Promise<Response>;\n PATCH: (req: Request) => Promise<Response>;\n HEAD: (req: Request) => Promise<Response>;\n OPTIONS: (req: Request) => Promise<Response>;\n};\n\ntype HandlersByFramework = {\n astro: AstroHandlers;\n \"react-router\": ReactRouterHandlers;\n \"next-js\": StandardHandlers;\n \"svelte-kit\": StandardHandlers;\n \"solid-start\": SolidStartHandlers;\n \"tanstack-start\": TanStackStartHandlers;\n};\n\n// Not actually a symbol, since we might be dealing with multiple instances of this code.\nexport const instantiatedFragmentFakeSymbol = \"$fragno-instantiated-fragment\" as const;\n\ntype FullstackFrameworks = keyof HandlersByFramework;\n\nexport interface FragnoInstantiatedFragment<\n TRoutes extends readonly AnyFragnoRouteConfig[] = [],\n TDeps = {},\n TServices extends Record<string, unknown> = Record<string, unknown>,\n TAdditionalContext extends Record<string, unknown> = {},\n> {\n [instantiatedFragmentFakeSymbol]: typeof instantiatedFragmentFakeSymbol;\n\n config: FragnoFragmentSharedConfig<TRoutes>;\n deps: TDeps;\n services: TServices;\n additionalContext?: TAdditionalContext;\n handlersFor: <T extends FullstackFrameworks>(framework: T) => HandlersByFramework[T];\n handler: (req: Request) => Promise<Response>;\n mountRoute: string;\n callRoute: <TMethod extends HTTPMethod, TPath extends ExtractRoutePath<TRoutes, TMethod>>(\n method: TMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<\n TPath,\n ExtractRouteByPath<TRoutes, TPath, TMethod>[\"inputSchema\"]\n >,\n ) => Promise<\n FragnoResponse<\n InferOrUnknown<NonNullable<ExtractRouteByPath<TRoutes, TPath, TMethod>[\"outputSchema\"]>>\n >\n >;\n callRouteRaw: <TMethod extends HTTPMethod, TPath extends ExtractRoutePath<TRoutes, TMethod>>(\n method: TMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<\n TPath,\n ExtractRouteByPath<TRoutes, TPath, TMethod>[\"inputSchema\"]\n >,\n ) => Promise<Response>;\n withMiddleware: (\n handler: FragnoMiddlewareCallback<TRoutes, TDeps, TServices>,\n ) => FragnoInstantiatedFragment<TRoutes, TDeps, TServices, TAdditionalContext>;\n}\n\nexport interface FragnoFragmentSharedConfig<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> {\n name: string;\n routes: TRoutes;\n}\n\nexport type AnyFragnoFragmentSharedConfig = FragnoFragmentSharedConfig<\n readonly AnyFragnoRouteConfig[]\n>;\n\nexport function createFragment<\n const TConfig,\n const TDeps,\n const TServices extends Record<string, unknown>,\n const TRoutesOrFactories extends readonly AnyRouteOrFactory[],\n const TAdditionalContext extends Record<string, unknown>,\n const TOptions extends FragnoPublicConfig,\n>(\n fragmentBuilder: {\n definition: FragmentDefinition<TConfig, TDeps, TServices, TAdditionalContext>;\n $requiredOptions: TOptions;\n },\n config: TConfig,\n routesOrFactories: TRoutesOrFactories,\n options: TOptions,\n): FragnoInstantiatedFragment<\n FlattenRouteFactories<TRoutesOrFactories>,\n TDeps,\n TServices,\n TAdditionalContext\n> {\n type TRoutes = FlattenRouteFactories<TRoutesOrFactories>;\n\n const definition = fragmentBuilder.definition;\n\n const dependencies = definition.dependencies?.(config, options) ?? ({} as TDeps);\n const services = definition.services?.(config, options, dependencies) ?? ({} as TServices);\n\n const context = { config, deps: dependencies, services };\n const routes = resolveRouteFactories(context, routesOrFactories);\n\n const mountRoute = getMountRoute({\n name: definition.name,\n mountRoute: options.mountRoute,\n });\n\n const router =\n createRouter<\n FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >\n >();\n\n let middlewareHandler:\n | FragnoMiddlewareCallback<FlattenRouteFactories<TRoutesOrFactories>, TDeps, TServices>\n | undefined;\n\n for (const routeConfig of routes) {\n addRoute(router, routeConfig.method.toUpperCase(), routeConfig.path, routeConfig);\n }\n\n const fragment: FragnoInstantiatedFragment<\n FlattenRouteFactories<TRoutesOrFactories>,\n TDeps,\n TServices,\n TAdditionalContext & TOptions\n > = {\n [instantiatedFragmentFakeSymbol]: instantiatedFragmentFakeSymbol,\n mountRoute,\n config: {\n name: definition.name,\n routes,\n },\n services,\n deps: dependencies,\n additionalContext: {\n ...definition.additionalContext,\n ...options,\n } as TAdditionalContext & TOptions,\n withMiddleware: (handler) => {\n if (middlewareHandler) {\n throw new Error(\"Middleware already set\");\n }\n\n middlewareHandler = handler;\n\n return fragment;\n },\n callRoute: async <TMethod extends HTTPMethod, TPath extends ExtractRoutePath<TRoutes, TMethod>>(\n method: TMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<\n TPath,\n ExtractRouteByPath<TRoutes, TPath, TMethod>[\"inputSchema\"]\n >,\n ): Promise<\n FragnoResponse<\n InferOrUnknown<NonNullable<ExtractRouteByPath<TRoutes, TPath, TMethod>[\"outputSchema\"]>>\n >\n > => {\n const response = await fragment.callRouteRaw(method, path, inputOptions);\n return parseFragnoResponse(response);\n },\n callRouteRaw: async <\n TMethod extends HTTPMethod,\n TPath extends ExtractRoutePath<TRoutes, TMethod>,\n >(\n method: TMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<\n TPath,\n ExtractRouteByPath<TRoutes, TPath, TMethod>[\"inputSchema\"]\n >,\n ): Promise<Response> => {\n // Find the route configuration\n const route = routes.find((r) => r.method === method && r.path === path);\n\n if (!route) {\n return Response.json(\n {\n error: `Route ${method} ${path} not found`,\n code: \"ROUTE_NOT_FOUND\",\n },\n { status: 404 },\n );\n }\n\n const {\n pathParams = {} as ExtractPathParams<TPath>,\n body,\n query,\n headers,\n } = inputOptions || {};\n\n // Convert query to URLSearchParams if needed\n const searchParams =\n query instanceof URLSearchParams\n ? query\n : query\n ? new URLSearchParams(query)\n : new URLSearchParams();\n\n // Convert headers to Headers if needed\n const requestHeaders =\n headers instanceof Headers ? headers : headers ? new Headers(headers) : new Headers();\n\n // Construct RequestInputContext\n const inputContext = new RequestInputContext({\n path: route.path,\n method: route.method,\n pathParams,\n searchParams,\n headers: requestHeaders,\n parsedBody: body,\n inputSchema: route.inputSchema,\n shouldValidateInput: true, // Enable validation for production use\n });\n\n // Construct RequestOutputContext\n const outputContext = new RequestOutputContext(route.outputSchema);\n\n // Call the route handler\n try {\n const response = await route.handler(inputContext, outputContext);\n return response;\n } catch (error) {\n console.error(\"Error in callRoute handler\", error);\n\n if (error instanceof FragnoApiError) {\n return error.toResponse();\n }\n\n return Response.json(\n { error: \"Internal server error\", code: \"INTERNAL_SERVER_ERROR\" },\n { status: 500 },\n );\n }\n },\n handlersFor: <T extends FullstackFrameworks>(framework: T): HandlersByFramework[T] => {\n const handler = fragment.handler;\n\n // LLMs hallucinate these values sometimes, solution isn't obvious so we throw this error\n // @ts-expect-error TS2367\n if (framework === \"h3\" || framework === \"nuxt\") {\n throw new Error(`To get handlers for h3, use the 'fromWebHandler' utility function:\n import { fromWebHandler } from \"h3\";\n export default fromWebHandler(myFragment().handler);`);\n }\n const allHandlers = {\n astro: { ALL: handler },\n \"react-router\": {\n loader: ({ request }: { request: Request }) => handler(request),\n action: ({ request }: { request: Request }) => handler(request),\n },\n \"next-js\": {\n GET: handler,\n POST: handler,\n PUT: handler,\n DELETE: handler,\n PATCH: handler,\n HEAD: handler,\n OPTIONS: handler,\n },\n \"svelte-kit\": {\n GET: handler,\n POST: handler,\n PUT: handler,\n DELETE: handler,\n PATCH: handler,\n HEAD: handler,\n OPTIONS: handler,\n },\n \"solid-start\": {\n GET: ({ request }: { request: Request }) => handler(request),\n POST: ({ request }: { request: Request }) => handler(request),\n PUT: ({ request }: { request: Request }) => handler(request),\n DELETE: ({ request }: { request: Request }) => handler(request),\n PATCH: ({ request }: { request: Request }) => handler(request),\n HEAD: ({ request }: { request: Request }) => handler(request),\n OPTIONS: ({ request }: { request: Request }) => handler(request),\n },\n \"tanstack-start\": {\n GET: ({ request }: { request: Request }) => handler(request),\n POST: ({ request }: { request: Request }) => handler(request),\n PUT: ({ request }: { request: Request }) => handler(request),\n DELETE: ({ request }: { request: Request }) => handler(request),\n PATCH: ({ request }: { request: Request }) => handler(request),\n HEAD: ({ request }: { request: Request }) => handler(request),\n OPTIONS: ({ request }: { request: Request }) => handler(request),\n },\n } satisfies HandlersByFramework;\n\n return allHandlers[framework];\n },\n handler: async (req: Request) => {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n const matchRoute = pathname.startsWith(mountRoute) ? pathname.slice(mountRoute.length) : null;\n\n if (matchRoute === null) {\n return Response.json(\n {\n error:\n `Fragno: Route for '${definition.name}' not found. Is the fragment mounted on the right route? ` +\n `Expecting: '${mountRoute}'.`,\n code: \"ROUTE_NOT_FOUND\",\n },\n { status: 404 },\n );\n }\n\n const route = findRoute(router, req.method, matchRoute);\n\n if (!route) {\n return Response.json(\n { error: `Fragno: Route for '${definition.name}' not found`, code: \"ROUTE_NOT_FOUND\" },\n { status: 404 },\n );\n }\n\n const { handler, inputSchema, outputSchema, path } = route.data;\n\n const outputContext = new RequestOutputContext(outputSchema);\n\n // Create mutable request state that can be modified by middleware\n // Clone the request to read body as both text and JSON without consuming original stream\n let requestBody: RequestBodyType = undefined;\n let rawBody: string | undefined = undefined;\n\n if (req.body instanceof ReadableStream) {\n // Clone request to make sure we don't consume body stream\n const clonedReq = req.clone();\n\n // Get raw text\n rawBody = await clonedReq.text();\n\n // Parse JSON if body is not empty\n if (rawBody) {\n try {\n requestBody = JSON.parse(rawBody);\n } catch {\n // If JSON parsing fails, keep body as undefined\n // This handles cases where body is not JSON\n requestBody = undefined;\n }\n }\n }\n\n const requestState = new MutableRequestState({\n pathParams: route.params ?? {},\n searchParams: url.searchParams,\n body: requestBody,\n headers: new Headers(req.headers),\n });\n\n if (middlewareHandler) {\n const middlewareInputContext = new RequestMiddlewareInputContext(routes, {\n method: req.method as HTTPMethod,\n path,\n request: req,\n state: requestState,\n });\n\n const middlewareOutputContext = new RequestMiddlewareOutputContext(dependencies, services);\n\n try {\n const middlewareResult = await middlewareHandler(\n middlewareInputContext,\n middlewareOutputContext,\n );\n if (middlewareResult !== undefined) {\n return middlewareResult;\n }\n } catch (error) {\n console.error(\"Error in middleware\", error);\n\n if (error instanceof FragnoApiError) {\n // TODO: If a validation error occurs in middleware (when calling `await input.valid()`)\n // the processing is short-circuited and a potential `catch` block around the call\n // to `input.valid()` in the actual handler will not be executed.\n return error.toResponse();\n }\n\n return Response.json(\n { error: \"Internal server error\", code: \"INTERNAL_SERVER_ERROR\" },\n { status: 500 },\n );\n }\n }\n\n const inputContext = await RequestInputContext.fromRequest({\n request: req,\n method: req.method,\n path,\n pathParams: (route.params ?? {}) as ExtractPathParams<typeof path>,\n inputSchema,\n state: requestState,\n rawBody,\n });\n\n try {\n const result = await handler(inputContext, outputContext);\n return result;\n } catch (error) {\n console.error(\"Error in handler\", error);\n\n if (error instanceof FragnoApiError) {\n return error.toResponse();\n }\n\n return Response.json(\n { error: \"Internal server error\", code: \"INTERNAL_SERVER_ERROR\" },\n { status: 500 },\n );\n }\n },\n };\n\n return fragment;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAa,sBAAb,MAAiC;CAC/B,CAASA;CACT,CAASC;CACT,CAASC;CAET,CAASC;CACT;CAEA,YAAY,QAKT;AACD,QAAKH,aAAc,OAAO;AAC1B,QAAKC,eAAgB,OAAO;AAC5B,QAAKC,UAAW,OAAO;AACvB,QAAKC,cAAe,OAAO;AAC3B,QAAKC,eAAgB;;;;;;CAOvB,IAAI,aAAqC;AACvC,SAAO,MAAKJ;;;;;;CAOd,IAAI,eAAgC;AAClC,SAAO,MAAKC;;;;;;CAOd,IAAI,UAAmB;AACrB,SAAO,MAAKC;;;;;;CAOd,IAAI,OAAwB;AAC1B,SAAO,MAAKE,iBAAkB,SAAY,MAAKA,eAAgB,MAAKD;;;;;;;;;;;;;;CAetE,QAAQ,MAA6B;AACnC,QAAKC,eAAgB;;;;;CAMvB,IAAI,kBAA2B;AAC7B,SAAO,MAAKA,iBAAkB;;;;;;AC/ElC,IAAa,iCAAb,cAGU,cAA+B;CACvC,CAASC;CACT,CAASC;CAET,YAAY,MAAa,UAAqB;AAC5C,SAAO;AACP,QAAKD,OAAQ;AACb,QAAKC,WAAY;;CAGnB,IAAI,OAAc;AAChB,SAAO,MAAKD;;CAGd,IAAI,WAAsB;AACxB,SAAO,MAAKC;;;AAIhB,IAAa,gCAAb,MAAkG;CAChG,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,QAAiB,SAAmC;AAC9D,QAAKF,UAAW;AAChB,QAAKE,QAAS,QAAQ;EAEtB,MAAM,QAAQ,OAAO,MAClB,YAAUC,QAAM,SAAS,QAAQ,QAAQA,QAAM,WAAW,QAAQ,OACpE;AAED,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,oBAAoB,QAAQ,KAAK,GAAG,QAAQ,SAAS;AAGvE,QAAKF,QAAS;;CAGhB,IAAI,OAAe;AACjB,SAAO,MAAKD,QAAS;;CAGvB,IAAI,SAAqB;AACvB,SAAO,MAAKA,QAAS;;CAGvB,IAAI,aAAqC;AACvC,SAAO,MAAKE,MAAO;;CAGrB,IAAI,cAA+B;AACjC,SAAO,MAAKA,MAAO;;CAGrB,IAAI,UAAmB;AACrB,SAAO,MAAKA,MAAO;;CAGrB,IAAI,cAA4C;AAC9C,SAAO,MAAKD,MAAO;;CAGrB,IAAI,eAA6C;AAC/C,SAAO,MAAKA,MAAO;;;;;;;;;;;;;;;CAgBrB,IAAI,eAAoC;AACtC,SAAO,MAAKC;;CAId,iBAAiB,OASf,QACA,MACA,YAGkC;AAClC,MAAI,KAAK,SAAS,QAAQ,KAAK,WAAW,OACxC;AAgBF,SAAO,MAAO,QAZO,MAAM,oBAAoB,YAAY;GACzD,SAAS,MAAKF,QAAS;GACvB,QAAQ,MAAKA,QAAS;GAChB;GACN,YAAY,KAAK;GACjB,aAAa,MAAKC,MAAO;GACzB,OAAO,MAAKC;GACb,CAAC,EAEoB,IAAI,qBAAqB,MAAKD,MAAO,aAAa,CAGd;;;;;;;;;AClH9D,eAAsB,oBAAuB,UAAgD;CAC3F,MAAM,SAAS,SAAS;CACxB,MAAM,UAAU,SAAS;AAIzB,MAHoB,QAAQ,IAAI,eAAe,IAAI,IAGnC,SAAS,uBAAuB,CAC9C,QAAO;EACL,MAAM;EACN;EACA;EACA,QAAQ,kBAAqB,SAAS;EACvC;CAIH,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,KAAI,CAAC,QAAQ,SAAS,OACpB,QAAO;EACL,MAAM;EACN;EACA;EACD;CAGH,MAAM,OAAO,KAAK,MAAM,KAAK;AAG7B,KAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AACtD,MAAI,aAAa,KACf,QAAO;GACL,MAAM;GACN;GACA;GACA,OAAO;IAAE,SAAS,KAAK;IAAS,MAAM,KAAK;IAAM;GAClD;AAEH,MAAI,WAAW,KACb,QAAO;GACL,MAAM;GACN;GACA;GACA,OAAO;IAAE,SAAS,KAAK;IAAO,MAAM,KAAK;IAAM;GAChD;;AAKL,QAAO;EACL,MAAM;EACN;EACA;EACM;EACP;;;;;AAMH,gBAAgB,kBACd,UACqD;AACrD,KAAI,CAAC,SAAS,KACZ;CAGF,MAAM,SAAS,SAAS,KAAK,WAAW;CACxC,MAAM,UAAU,IAAI,aAAa;CACjC,IAAI,SAAS;AAEb,KAAI;AACF,SAAO,MAAM;GACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAE3C,OAAI,KACF;AAGF,aAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM,CAAC;GACjD,MAAM,QAAQ,OAAO,MAAM,KAAK;AAGhC,YAAS,MAAM,KAAK,IAAI;AAExB,QAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,MAAM,CACb,OAAM,KAAK,MAAM,KAAK;;AAM5B,MAAI,OAAO,MAAM,CACf,OAAM,KAAK,MAAM,OAAO;WAElB;AACR,SAAO,aAAa;;;;;;AChDxB,MAAa,iCAAiC;AA8D9C,SAAgB,eAQd,iBAIA,QACA,mBACA,SAMA;CAGA,MAAM,aAAa,gBAAgB;CAEnC,MAAM,eAAe,WAAW,eAAe,QAAQ,QAAQ,IAAK,EAAE;CACtE,MAAM,WAAW,WAAW,WAAW,QAAQ,SAAS,aAAa,IAAK,EAAE;CAG5E,MAAM,SAAS,sBADC;EAAE;EAAQ,MAAM;EAAc;EAAU,EACV,kBAAkB;CAEhE,MAAM,aAAa,cAAc;EAC/B,MAAM,WAAW;EACjB,YAAY,QAAQ;EACrB,CAAC;CAEF,MAAM,SACJ,cASG;CAEL,IAAIG;AAIJ,MAAK,MAAM,eAAe,OACxB,UAAS,QAAQ,YAAY,OAAO,aAAa,EAAE,YAAY,MAAM,YAAY;CAGnF,MAAMC,WAKF;GACD,iCAAiC;EAClC;EACA,QAAQ;GACN,MAAM,WAAW;GACjB;GACD;EACD;EACA,MAAM;EACN,mBAAmB;GACjB,GAAG,WAAW;GACd,GAAG;GACJ;EACD,iBAAiB,YAAY;AAC3B,OAAI,kBACF,OAAM,IAAI,MAAM,yBAAyB;AAG3C,uBAAoB;AAEpB,UAAO;;EAET,WAAW,OACT,QACA,MACA,iBAQG;AAEH,UAAO,oBADU,MAAM,SAAS,aAAa,QAAQ,MAAM,aAAa,CACpC;;EAEtC,cAAc,OAIZ,QACA,MACA,iBAIsB;GAEtB,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE,WAAW,UAAU,EAAE,SAAS,KAAK;AAExE,OAAI,CAAC,MACH,QAAO,SAAS,KACd;IACE,OAAO,SAAS,OAAO,GAAG,KAAK;IAC/B,MAAM;IACP,EACD,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,EACJ,aAAa,EAAE,EACf,MACA,OACA,YACE,gBAAgB,EAAE;GAGtB,MAAM,eACJ,iBAAiB,kBACb,QACA,QACE,IAAI,gBAAgB,MAAM,GAC1B,IAAI,iBAAiB;GAG7B,MAAM,iBACJ,mBAAmB,UAAU,UAAU,UAAU,IAAI,QAAQ,QAAQ,GAAG,IAAI,SAAS;GAGvF,MAAM,eAAe,IAAI,oBAAoB;IAC3C,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd;IACA;IACA,SAAS;IACT,YAAY;IACZ,aAAa,MAAM;IACnB,qBAAqB;IACtB,CAAC;GAGF,MAAM,gBAAgB,IAAI,qBAAqB,MAAM,aAAa;AAGlE,OAAI;AAEF,WADiB,MAAM,MAAM,QAAQ,cAAc,cAAc;YAE1D,OAAO;AACd,YAAQ,MAAM,8BAA8B,MAAM;AAElD,QAAI,iBAAiB,eACnB,QAAO,MAAM,YAAY;AAG3B,WAAO,SAAS,KACd;KAAE,OAAO;KAAyB,MAAM;KAAyB,EACjE,EAAE,QAAQ,KAAK,CAChB;;;EAGL,cAA6C,cAAyC;GACpF,MAAM,UAAU,SAAS;AAIzB,OAAI,cAAc,QAAQ,cAAc,OACtC,OAAM,IAAI,MAAM;;gEAEwC;AA8C1D,UA5CoB;IAClB,OAAO,EAAE,KAAK,SAAS;IACvB,gBAAgB;KACd,SAAS,EAAE,cAAoC,QAAQ,QAAQ;KAC/D,SAAS,EAAE,cAAoC,QAAQ,QAAQ;KAChE;IACD,WAAW;KACT,KAAK;KACL,MAAM;KACN,KAAK;KACL,QAAQ;KACR,OAAO;KACP,MAAM;KACN,SAAS;KACV;IACD,cAAc;KACZ,KAAK;KACL,MAAM;KACN,KAAK;KACL,QAAQ;KACR,OAAO;KACP,MAAM;KACN,SAAS;KACV;IACD,eAAe;KACb,MAAM,EAAE,cAAoC,QAAQ,QAAQ;KAC5D,OAAO,EAAE,cAAoC,QAAQ,QAAQ;KAC7D,MAAM,EAAE,cAAoC,QAAQ,QAAQ;KAC5D,SAAS,EAAE,cAAoC,QAAQ,QAAQ;KAC/D,QAAQ,EAAE,cAAoC,QAAQ,QAAQ;KAC9D,OAAO,EAAE,cAAoC,QAAQ,QAAQ;KAC7D,UAAU,EAAE,cAAoC,QAAQ,QAAQ;KACjE;IACD,kBAAkB;KAChB,MAAM,EAAE,cAAoC,QAAQ,QAAQ;KAC5D,OAAO,EAAE,cAAoC,QAAQ,QAAQ;KAC7D,MAAM,EAAE,cAAoC,QAAQ,QAAQ;KAC5D,SAAS,EAAE,cAAoC,QAAQ,QAAQ;KAC/D,QAAQ,EAAE,cAAoC,QAAQ,QAAQ;KAC9D,OAAO,EAAE,cAAoC,QAAQ,QAAQ;KAC7D,UAAU,EAAE,cAAoC,QAAQ,QAAQ;KACjE;IACF,CAEkB;;EAErB,SAAS,OAAO,QAAiB;GAC/B,MAAM,MAAM,IAAI,IAAI,IAAI,IAAI;GAC5B,MAAM,WAAW,IAAI;GAErB,MAAM,aAAa,SAAS,WAAW,WAAW,GAAG,SAAS,MAAM,WAAW,OAAO,GAAG;AAEzF,OAAI,eAAe,KACjB,QAAO,SAAS,KACd;IACE,OACE,sBAAsB,WAAW,KAAK,uEACvB,WAAW;IAC5B,MAAM;IACP,EACD,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,QAAQ,UAAU,QAAQ,IAAI,QAAQ,WAAW;AAEvD,OAAI,CAAC,MACH,QAAO,SAAS,KACd;IAAE,OAAO,sBAAsB,WAAW,KAAK;IAAc,MAAM;IAAmB,EACtF,EAAE,QAAQ,KAAK,CAChB;GAGH,MAAM,EAAE,SAAS,aAAa,cAAc,SAAS,MAAM;GAE3D,MAAM,gBAAgB,IAAI,qBAAqB,aAAa;GAI5D,IAAIC,cAA+B;GACnC,IAAIC,UAA8B;AAElC,OAAI,IAAI,gBAAgB,gBAAgB;AAKtC,cAAU,MAHQ,IAAI,OAAO,CAGH,MAAM;AAGhC,QAAI,QACF,KAAI;AACF,mBAAc,KAAK,MAAM,QAAQ;YAC3B;AAGN,mBAAc;;;GAKpB,MAAM,eAAe,IAAI,oBAAoB;IAC3C,YAAY,MAAM,UAAU,EAAE;IAC9B,cAAc,IAAI;IAClB,MAAM;IACN,SAAS,IAAI,QAAQ,IAAI,QAAQ;IAClC,CAAC;AAEF,OAAI,mBAAmB;IACrB,MAAM,yBAAyB,IAAI,8BAA8B,QAAQ;KACvE,QAAQ,IAAI;KACZ;KACA,SAAS;KACT,OAAO;KACR,CAAC;IAEF,MAAM,0BAA0B,IAAI,+BAA+B,cAAc,SAAS;AAE1F,QAAI;KACF,MAAM,mBAAmB,MAAM,kBAC7B,wBACA,wBACD;AACD,SAAI,qBAAqB,OACvB,QAAO;aAEF,OAAO;AACd,aAAQ,MAAM,uBAAuB,MAAM;AAE3C,SAAI,iBAAiB,eAInB,QAAO,MAAM,YAAY;AAG3B,YAAO,SAAS,KACd;MAAE,OAAO;MAAyB,MAAM;MAAyB,EACjE,EAAE,QAAQ,KAAK,CAChB;;;GAIL,MAAM,eAAe,MAAM,oBAAoB,YAAY;IACzD,SAAS;IACT,QAAQ,IAAI;IACZ;IACA,YAAa,MAAM,UAAU,EAAE;IAC/B;IACA,OAAO;IACP;IACD,CAAC;AAEF,OAAI;AAEF,WADe,MAAM,QAAQ,cAAc,cAAc;YAElD,OAAO;AACd,YAAQ,MAAM,oBAAoB,MAAM;AAExC,QAAI,iBAAiB,eACnB,QAAO,MAAM,YAAY;AAG3B,WAAO,SAAS,KACd;KAAE,OAAO;KAAyB,MAAM;KAAyB,EACjE,EAAE,QAAQ,KAAK,CAChB;;;EAGN;AAED,QAAO"}
package/dist/mod.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import { t as FragnoRouteConfig } from "./api-B1-h7jPC.js";
2
- import { B as AnyRouteOrFactory, G as defineRoutes, H as RouteFactory, U as RouteFactoryContext, V as FlattenRouteFactories, W as defineRoute, a as FragnoFragmentSharedConfig, c as FragnoPublicConfig, l as createFragment, n as FragmentDefinition, o as FragnoInstantiatedFragment, r as defineFragment, s as FragnoPublicClientConfig, t as FragmentBuilder } from "./fragment-builder-DsqUOfJ5.js";
1
+ import { t as FragnoRouteConfig } from "./api-BWN97TOr.js";
2
+ import { a as RouteFactoryContext, i as RouteFactory, n as AnyRouteOrFactory, o as defineRoute, r as FlattenRouteFactories, s as defineRoutes } from "./route-Bl9Zr1Yv.js";
3
+ import { c as FragnoPublicClientConfig, l as FragnoPublicConfig, n as FragmentDefinition, o as FragnoFragmentSharedConfig, r as defineFragment, s as FragnoInstantiatedFragment, t as FragmentBuilder, u as createFragment } from "./fragment-builder-MGr68GNb.js";
3
4
  export { type AnyRouteOrFactory, type FlattenRouteFactories, FragmentBuilder, type FragmentDefinition, type FragnoFragmentSharedConfig, type FragnoInstantiatedFragment, type FragnoPublicClientConfig, type FragnoPublicConfig, type FragnoRouteConfig, type RouteFactory, type RouteFactoryContext, createFragment, defineFragment, defineRoute, defineRoutes };
package/dist/mod.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as defineFragment, t as FragmentBuilder } from "./fragment-builder-DOnCVBqc.js";
2
2
  import "./api-DngJDcmO.js";
3
- import "./route-CTxjMtGZ.js";
4
- import { n as defineRoutes, t as defineRoute } from "./route-Dk1GyqHs.js";
5
- import { t as createFragment } from "./fragment-instantiation-Cp0K8zdS.js";
3
+ import "./request-output-context-CdIjwmEN.js";
4
+ import { n as defineRoutes, t as defineRoute } from "./route-C5Uryylh.js";
5
+ import { t as createFragment } from "./fragment-instantiation-C4wvwl6V.js";
6
6
 
7
7
  export { FragmentBuilder, createFragment, defineFragment, defineRoute, defineRoutes };
@@ -1,5 +1,13 @@
1
1
  import { r as FragnoApiValidationError } from "./api-DngJDcmO.js";
2
2
 
3
+ //#region src/api/internal/route.ts
4
+ function getMountRoute(opts) {
5
+ const mountRoute = opts.mountRoute ?? `/api/${opts.name}`;
6
+ if (mountRoute.endsWith("/")) return mountRoute.slice(0, -1);
7
+ return mountRoute;
8
+ }
9
+
10
+ //#endregion
3
11
  //#region src/api/request-input-context.ts
4
12
  var RequestInputContext = class RequestInputContext {
5
13
  #path;
@@ -242,20 +250,20 @@ var OutputContext = class {
242
250
  const defaultHeaders = {};
243
251
  if (typeof initOrStatus === "undefined") {
244
252
  const mergedHeaders$1 = mergeHeaders(defaultHeaders, headers);
245
- return Response.json(null, {
253
+ return new Response(null, {
246
254
  status: 201,
247
255
  headers: mergedHeaders$1
248
256
  });
249
257
  }
250
258
  if (typeof initOrStatus === "number") {
251
259
  const mergedHeaders$1 = mergeHeaders(defaultHeaders, headers);
252
- return Response.json(null, {
260
+ return new Response(null, {
253
261
  status: initOrStatus,
254
262
  headers: mergedHeaders$1
255
263
  });
256
264
  }
257
265
  const mergedHeaders = mergeHeaders(defaultHeaders, initOrStatus.headers, headers);
258
- return Response.json(null, {
266
+ return new Response(null, {
259
267
  status: initOrStatus.status,
260
268
  headers: mergedHeaders
261
269
  });
@@ -308,24 +316,5 @@ var RequestOutputContext = class extends OutputContext {
308
316
  };
309
317
 
310
318
  //#endregion
311
- //#region src/api/route.ts
312
- function resolveRouteFactories(context, routesOrFactories) {
313
- const routes = [];
314
- for (const item of routesOrFactories) if (typeof item === "function") {
315
- const factoryRoutes = item(context);
316
- routes.push(...factoryRoutes);
317
- } else routes.push(item);
318
- return routes;
319
- }
320
- function defineRoute(config) {
321
- return config;
322
- }
323
- function defineRoutes() {
324
- return { create: (fn) => {
325
- return fn;
326
- } };
327
- }
328
-
329
- //#endregion
330
- export { RequestOutputContext as a, OutputContext as i, defineRoutes as n, RequestInputContext as o, resolveRouteFactories as r, defineRoute as t };
331
- //# sourceMappingURL=route-Dk1GyqHs.js.map
319
+ export { getMountRoute as i, RequestOutputContext as n, RequestInputContext as r, OutputContext as t };
320
+ //# sourceMappingURL=request-output-context-CdIjwmEN.js.map