@fragno-dev/core 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +139 -131
- package/CHANGELOG.md +63 -0
- package/dist/api/api.d.ts +23 -5
- package/dist/api/api.d.ts.map +1 -1
- package/dist/api/api.js.map +1 -1
- package/dist/api/fragment-definition-builder.d.ts +17 -7
- package/dist/api/fragment-definition-builder.d.ts.map +1 -1
- package/dist/api/fragment-definition-builder.js +3 -2
- package/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/api/fragment-instantiator.d.ts +129 -32
- package/dist/api/fragment-instantiator.d.ts.map +1 -1
- package/dist/api/fragment-instantiator.js +232 -50
- package/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/api/request-input-context.d.ts +57 -1
- package/dist/api/request-input-context.d.ts.map +1 -1
- package/dist/api/request-input-context.js +67 -0
- package/dist/api/request-input-context.js.map +1 -1
- package/dist/api/request-middleware.d.ts +1 -1
- package/dist/api/request-middleware.d.ts.map +1 -1
- package/dist/api/request-middleware.js.map +1 -1
- package/dist/api/route.d.ts +7 -7
- package/dist/api/route.d.ts.map +1 -1
- package/dist/api/route.js.map +1 -1
- package/dist/client/client.d.ts +4 -3
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +103 -7
- package/dist/client/client.js.map +1 -1
- package/dist/client/vue.d.ts +7 -3
- package/dist/client/vue.d.ts.map +1 -1
- package/dist/client/vue.js +16 -1
- package/dist/client/vue.js.map +1 -1
- package/dist/internal/trace-context.d.ts +23 -0
- package/dist/internal/trace-context.d.ts.map +1 -0
- package/dist/internal/trace-context.js +14 -0
- package/dist/internal/trace-context.js.map +1 -0
- package/dist/mod-client.d.ts +5 -27
- package/dist/mod-client.d.ts.map +1 -1
- package/dist/mod-client.js +50 -13
- package/dist/mod-client.js.map +1 -1
- package/dist/mod.d.ts +4 -3
- package/dist/mod.js +2 -1
- package/dist/runtime.d.ts +15 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +33 -0
- package/dist/runtime.js.map +1 -0
- package/dist/test/test.d.ts +2 -2
- package/dist/test/test.d.ts.map +1 -1
- package/dist/test/test.js.map +1 -1
- package/package.json +31 -18
- package/src/api/api.ts +24 -0
- package/src/api/fragment-definition-builder.ts +36 -17
- package/src/api/fragment-instantiator.test.ts +429 -1
- package/src/api/fragment-instantiator.ts +572 -58
- package/src/api/internal/path-runtime.test.ts +7 -0
- package/src/api/request-input-context.test.ts +152 -0
- package/src/api/request-input-context.ts +85 -0
- package/src/api/request-middleware.test.ts +47 -1
- package/src/api/request-middleware.ts +1 -1
- package/src/api/route.ts +7 -2
- package/src/client/client.test.ts +195 -0
- package/src/client/client.ts +185 -10
- package/src/client/vue.test.ts +253 -3
- package/src/client/vue.ts +44 -1
- package/src/internal/trace-context.ts +35 -0
- package/src/mod-client.ts +89 -9
- package/src/mod.ts +7 -1
- package/src/runtime.ts +48 -0
- package/src/test/test.ts +13 -4
- package/tsdown.config.ts +1 -0
package/dist/api/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","names":["routes: any[]"],"sources":["../../src/api/route.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\n\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { FragnoRouteConfig, HTTPMethod, RequestThisContext } from \"./api\";\nimport type { FragmentDefinition } from \"./fragment-definition-builder\";\nimport type { BoundServices } from \"./bind-services\";\n\nexport type AnyFragnoRouteConfig = FragnoRouteConfig<HTTPMethod, string, any, any, any, any, any>;\n\nexport interface RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps = {}> {\n config: TConfig;\n deps: TDeps;\n services: TServices;\n serviceDeps: TServiceDeps;\n}\n\nexport type RouteFactory<\n TConfig,\n TDeps,\n TServices,\n TServiceDeps,\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n RequestThisContext\n >[],\n> = (context: RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps>) => TRoutes;\n\n/**\n * @internal\n */\nexport type AnyRouteOrFactory = AnyFragnoRouteConfig | RouteFactory<any, any, any, any, any>;\n\n/**\n * @internal\n */\nexport type FlattenRouteFactories<T extends readonly AnyRouteOrFactory[]> = T extends readonly [\n infer First,\n ...infer Rest extends readonly AnyRouteOrFactory[],\n]\n ? First extends RouteFactory<any, any, any, any, infer TRoutes>\n ? [...TRoutes, ...FlattenRouteFactories<Rest>]\n : [First, ...FlattenRouteFactories<Rest>]\n : [];\n\n/**\n * Helper to resolve route factories into routes\n * @internal\n */\nexport function resolveRouteFactories<\n TConfig,\n TDeps,\n TServices,\n TServiceDeps,\n const TRoutesOrFactories extends readonly AnyRouteOrFactory[],\n>(\n context: RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps>,\n routesOrFactories: TRoutesOrFactories,\n): FlattenRouteFactories<TRoutesOrFactories> {\n const routes: any[] = [];\n\n for (const item of routesOrFactories) {\n if (typeof item === \"function\") {\n // It's a route factory\n const factoryRoutes = item(context);\n routes.push(...factoryRoutes);\n } else {\n // It's a direct route\n routes.push(item);\n }\n }\n\n return routes as FlattenRouteFactories<TRoutesOrFactories>;\n}\n\n// TODO(Wilco): Do these overloads actually do anything?\n// TODO(Wilco): ValidPath<T> should be added back in here.\n\n// Overload for routes without inputSchema\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n > & { inputSchema?: undefined },\n): FragnoRouteConfig<\n TMethod,\n TPath,\n undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n>;\n\n// Overload for routes with inputSchema\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n > & { inputSchema: TInputSchema },\n): FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n>;\n\n// implementation\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n >,\n): FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n> {\n return config;\n}\n\n// ============================================================================\n// Type extractors for FragmentDefinition\n// ============================================================================\n\nexport type AnyFragmentDefinition = FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\n// Extract config from FragmentDefinition\nexport type ExtractFragmentConfig<T> =\n T extends FragmentDefinition<infer TConfig, any, any, any, any, any, any, any, any, any>\n ? TConfig\n : never;\n\n// Extract deps from FragmentDefinition\nexport type ExtractFragmentDeps<T> =\n T extends FragmentDefinition<any, any, infer TDeps, any, any, any, any, any, any, any>\n ? TDeps\n : never;\n\n// Extract services from FragmentDefinition\n// This extracts both base services (flat) and named services (nested)\n// The result matches the structure of fragment.services at runtime\nexport type ExtractFragmentServices<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n infer TBaseServices,\n infer TServices,\n any,\n any,\n any,\n any,\n any\n >\n ? BoundServices<TBaseServices & TServices>\n : never;\n\n// Extract service dependencies from FragmentDefinition\nexport type ExtractFragmentServiceDeps<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n infer TServiceDependencies,\n any,\n any,\n any,\n any\n >\n ? TServiceDependencies\n : never;\n\n// Extract service this context from FragmentDefinition (used by services)\nexport type ExtractFragmentServiceThisContext<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer TServiceThisContext,\n any,\n any\n >\n ? TServiceThisContext\n : RequestThisContext;\n\n// Extract handler this context from FragmentDefinition (used by route handlers)\nexport type ExtractFragmentHandlerThisContext<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer THandlerThisContext,\n any\n >\n ? THandlerThisContext\n : RequestThisContext;\n\n// Legacy: Extract this context from FragmentDefinition (defaults to service context for backwards compatibility)\nexport type ExtractFragmentThisContext<T> = ExtractFragmentServiceThisContext<T>;\n\n// Overload that infers types from FragmentDefinition (runtime value)\nexport function defineRoutes<const TDefinition extends AnyFragmentDefinition>(\n definition: TDefinition,\n): {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n ExtractFragmentHandlerThisContext<TDefinition>\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >;\n },\n ) => TRoutes,\n ) => RouteFactory<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>,\n TRoutes\n >;\n};\n\n// Overload that infers types from FragmentDefinition (type parameter only)\nexport function defineRoutes<const TDefinition extends AnyFragmentDefinition>(): {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n ExtractFragmentHandlerThisContext<TDefinition>\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >;\n },\n ) => TRoutes,\n ) => RouteFactory<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>,\n TRoutes\n >;\n};\n\n// Implementation\nexport function defineRoutes<\n const TDefinition extends AnyFragmentDefinition | undefined = undefined,\n>(\n // Parameter is only used for type inference, not runtime\n _definition?: TDefinition,\n) {\n return {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentConfig<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentDeps<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServices<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServiceDeps<TDefinition> : {}\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >;\n },\n ) => TRoutes,\n ): RouteFactory<\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentConfig<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentDeps<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServices<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServiceDeps<TDefinition> : {},\n TRoutes\n > => {\n // Create a wrapper around the callback that adds the defineRoute function\n return (ctx: RouteFactoryContext<unknown, unknown, unknown, unknown>) => {\n const extendedCtx = {\n ...ctx,\n defineRoute,\n };\n return fn(extendedCtx as any);\n };\n },\n };\n}\n"],"mappings":";;;;;AAqDA,SAAgB,sBAOd,SACA,mBAC2C;CAC3C,MAAMA,SAAgB,EAAE;AAExB,MAAK,MAAM,QAAQ,kBACjB,KAAI,OAAO,SAAS,YAAY;EAE9B,MAAM,gBAAgB,KAAK,QAAQ;AACnC,SAAO,KAAK,GAAG,cAAc;OAG7B,QAAO,KAAK,KAAK;AAIrB,QAAO;;AAgET,SAAgB,YASd,QAiBA;AACA,QAAO;;AA8NT,SAAgB,aAId,aACA;AACA,QAAO,EACL,SAaE,OA6CG;AAEH,UAAQ,QAAiE;AAKvE,UAAO,GAJa;IAClB,GAAG;IACH;IACD,CAC4B;;IAGlC"}
|
|
1
|
+
{"version":3,"file":"route.js","names":["routes: any[]"],"sources":["../../src/api/route.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\n\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { FragnoRouteConfig, HTTPMethod, RequestThisContext } from \"./api\";\nimport type { FragmentDefinition } from \"./fragment-definition-builder\";\nimport type { BoundServices } from \"./bind-services\";\n\nexport type AnyFragnoRouteConfig = FragnoRouteConfig<HTTPMethod, string, any, any, any, any, any>;\n\nexport interface RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps = {}> {\n config: TConfig;\n deps: TDeps;\n services: TServices;\n serviceDeps: TServiceDeps;\n}\n\nexport type RouteFactory<\n TConfig,\n TDeps,\n TServices,\n TServiceDeps,\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n RequestThisContext\n >[],\n> = (context: RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps>) => TRoutes;\n\n/**\n * @internal\n */\nexport type AnyRouteOrFactory = AnyFragnoRouteConfig | RouteFactory<any, any, any, any, any>;\n\n/**\n * @internal\n */\nexport type FlattenRouteFactories<T extends readonly AnyRouteOrFactory[]> = T extends readonly [\n infer First,\n ...infer Rest extends readonly AnyRouteOrFactory[],\n]\n ? First extends RouteFactory<any, any, any, any, infer TRoutes>\n ? [...TRoutes, ...FlattenRouteFactories<Rest>]\n : [First, ...FlattenRouteFactories<Rest>]\n : [];\n\n/**\n * Helper to resolve route factories into routes\n * @internal\n */\nexport function resolveRouteFactories<\n TConfig,\n TDeps,\n TServices,\n TServiceDeps,\n const TRoutesOrFactories extends readonly AnyRouteOrFactory[],\n>(\n context: RouteFactoryContext<TConfig, TDeps, TServices, TServiceDeps>,\n routesOrFactories: TRoutesOrFactories,\n): FlattenRouteFactories<TRoutesOrFactories> {\n const routes: any[] = [];\n\n for (const item of routesOrFactories) {\n if (typeof item === \"function\") {\n // It's a route factory\n const factoryRoutes = item(context);\n routes.push(...factoryRoutes);\n } else {\n // It's a direct route\n routes.push(item);\n }\n }\n\n return routes as FlattenRouteFactories<TRoutesOrFactories>;\n}\n\n// TODO(Wilco): Do these overloads actually do anything?\n// TODO(Wilco): ValidPath<T> should be added back in here.\n\n// Overload for routes without inputSchema\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n > & { inputSchema?: undefined },\n): FragnoRouteConfig<\n TMethod,\n TPath,\n undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n>;\n\n// Overload for routes with inputSchema\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n > & { inputSchema: TInputSchema },\n): FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n>;\n\n// implementation\nexport function defineRoute<\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n const TThisContext extends RequestThisContext = RequestThisContext,\n>(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n >,\n): FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TThisContext\n> {\n return config;\n}\n\n// ============================================================================\n// Type extractors for FragmentDefinition\n// ============================================================================\n\nexport type AnyFragmentDefinition = FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\n// Extract config from FragmentDefinition\nexport type ExtractFragmentConfig<T> =\n T extends FragmentDefinition<infer TConfig, any, any, any, any, any, any, any, any, any, any>\n ? TConfig\n : never;\n\n// Extract deps from FragmentDefinition\nexport type ExtractFragmentDeps<T> =\n T extends FragmentDefinition<any, any, infer TDeps, any, any, any, any, any, any, any, any>\n ? TDeps\n : never;\n\n// Extract services from FragmentDefinition\n// This extracts both base services (flat) and named services (nested)\n// The result matches the structure of fragment.services at runtime\nexport type ExtractFragmentServices<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n infer TBaseServices,\n infer TServices,\n any,\n any,\n any,\n any,\n any,\n any\n >\n ? BoundServices<TBaseServices & TServices>\n : never;\n\n// Extract service dependencies from FragmentDefinition\nexport type ExtractFragmentServiceDeps<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n infer TServiceDependencies,\n any,\n any,\n any,\n any,\n any\n >\n ? TServiceDependencies\n : never;\n\n// Extract service this context from FragmentDefinition (used by services)\nexport type ExtractFragmentServiceThisContext<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer TServiceThisContext,\n any,\n any,\n any\n >\n ? TServiceThisContext\n : RequestThisContext;\n\n// Extract handler this context from FragmentDefinition (used by route handlers)\nexport type ExtractFragmentHandlerThisContext<T> =\n T extends FragmentDefinition<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer THandlerThisContext,\n any,\n any\n >\n ? THandlerThisContext\n : RequestThisContext;\n\n// Legacy: Extract this context from FragmentDefinition (defaults to service context for backwards compatibility)\nexport type ExtractFragmentThisContext<T> = ExtractFragmentServiceThisContext<T>;\n\n// Overload that infers types from FragmentDefinition (runtime value)\nexport function defineRoutes<const TDefinition extends AnyFragmentDefinition>(\n definition: TDefinition,\n): {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n ExtractFragmentHandlerThisContext<TDefinition>\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >;\n },\n ) => TRoutes,\n ) => RouteFactory<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>,\n TRoutes\n >;\n};\n\n// Overload that infers types from FragmentDefinition (type parameter only)\nexport function defineRoutes<const TDefinition extends AnyFragmentDefinition>(): {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n ExtractFragmentHandlerThisContext<TDefinition>\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n ExtractFragmentHandlerThisContext<TDefinition>\n >;\n },\n ) => TRoutes,\n ) => RouteFactory<\n ExtractFragmentConfig<TDefinition>,\n ExtractFragmentDeps<TDefinition>,\n ExtractFragmentServices<TDefinition>,\n ExtractFragmentServiceDeps<TDefinition>,\n TRoutes\n >;\n};\n\n// Implementation\nexport function defineRoutes<\n const TDefinition extends AnyFragmentDefinition | undefined = undefined,\n>(\n // Parameter is only used for type inference, not runtime\n _definition?: TDefinition,\n) {\n return {\n create: <\n const TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >[],\n >(\n fn: (\n context: RouteFactoryContext<\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentConfig<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentDeps<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServices<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServiceDeps<TDefinition> : {}\n > & {\n defineRoute: <\n const TMethod extends HTTPMethod,\n const TPath extends string,\n const TInputSchema extends StandardSchemaV1 | undefined,\n const TOutputSchema extends StandardSchemaV1 | undefined,\n const TErrorCode extends string = string,\n const TQueryParameters extends string = string,\n >(\n config: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >,\n ) => FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters,\n TDefinition extends AnyFragmentDefinition\n ? ExtractFragmentThisContext<TDefinition>\n : RequestThisContext\n >;\n },\n ) => TRoutes,\n ): RouteFactory<\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentConfig<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentDeps<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServices<TDefinition> : {},\n TDefinition extends AnyFragmentDefinition ? ExtractFragmentServiceDeps<TDefinition> : {},\n TRoutes\n > => {\n // Create a wrapper around the callback that adds the defineRoute function\n return (ctx: RouteFactoryContext<unknown, unknown, unknown, unknown>) => {\n const extendedCtx = {\n ...ctx,\n defineRoute,\n };\n return fn(extendedCtx as any);\n };\n },\n };\n}\n"],"mappings":";;;;;AAqDA,SAAgB,sBAOd,SACA,mBAC2C;CAC3C,MAAMA,SAAgB,EAAE;AAExB,MAAK,MAAM,QAAQ,kBACjB,KAAI,OAAO,SAAS,YAAY;EAE9B,MAAM,gBAAgB,KAAK,QAAQ;AACnC,SAAO,KAAK,GAAG,cAAc;OAG7B,QAAO,KAAK,KAAK;AAIrB,QAAO;;AAgET,SAAgB,YASd,QAiBA;AACA,QAAO;;AAmOT,SAAgB,aAId,aACA;AACA,QAAO,EACL,SAaE,OA6CG;AAEH,UAAQ,QAAiE;AAKvE,UAAO,GAJa;IAClB,GAAG;IACH;IACD,CAC4B;;IAGlC"}
|
package/dist/client/client.d.ts
CHANGED
|
@@ -4,13 +4,14 @@ import { FetcherConfig, FragnoFragmentSharedConfig as FragnoFragmentSharedConfig
|
|
|
4
4
|
import { FragnoRouteConfig, HTTPMethod, NonGetHTTPMethod, RequestThisContext } from "../api/api.js";
|
|
5
5
|
import { AnyRouteOrFactory, FlattenRouteFactories } from "../api/route.js";
|
|
6
6
|
import { FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError, FragnoErrorOptions } from "./client-error.js";
|
|
7
|
-
import { FragnoFragmentSharedConfig } from "../api/fragment-instantiator.js";
|
|
7
|
+
import { AnyFragnoInstantiatedFragment, FragnoFragmentSharedConfig } from "../api/fragment-instantiator.js";
|
|
8
8
|
import { FragmentDefinition } from "../api/fragment-definition-builder.js";
|
|
9
9
|
import { ReadableAtom, Store } from "nanostores";
|
|
10
10
|
import { FetcherStore, MutatorStore } from "@nanostores/query";
|
|
11
11
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
12
12
|
|
|
13
13
|
//#region src/client/client.d.ts
|
|
14
|
+
|
|
14
15
|
/**
|
|
15
16
|
* Symbols used to identify hook types
|
|
16
17
|
*/
|
|
@@ -195,7 +196,7 @@ declare class ClientBuilder<TRoutes extends readonly FragnoRouteConfig<HTTPMetho
|
|
|
195
196
|
fetcher: typeof fetch;
|
|
196
197
|
defaultOptions: RequestInit | undefined;
|
|
197
198
|
};
|
|
198
|
-
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]>;
|
|
199
|
+
createHook<TPath extends ExtractGetRoutePaths<TFragmentConfig["routes"]>>(path: ValidateGetRoutePath<TFragmentConfig["routes"], TPath>, options?: CreateHookOptions): FragnoClientHookData<"GET", TPath, NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath, "GET">["outputSchema"]>, NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath, "GET">["errorCodes"]>[number], NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath, "GET">["queryParameters"]>[number]>;
|
|
199
200
|
createMutator<TPath extends ExtractNonGetRoutePaths<TFragmentConfig["routes"]>>(method: NonGetHTTPMethod, path: TPath, onInvalidate?: OnInvalidateFn<TPath>): FragnoClientMutatorData<NonGetHTTPMethod,
|
|
200
201
|
// TODO: This can be any Method, but should be related to TPath
|
|
201
202
|
TPath, ExtractRouteByPath<TFragmentConfig["routes"], TPath>["inputSchema"], ExtractRouteByPath<TFragmentConfig["routes"], TPath>["outputSchema"], NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath>["errorCodes"]>[number], NonNullable<ExtractRouteByPath<TFragmentConfig["routes"], TPath>["queryParameters"]>[number]>;
|
|
@@ -204,7 +205,7 @@ declare class ClientBuilder<TRoutes extends readonly FragnoRouteConfig<HTTPMetho
|
|
|
204
205
|
* Create a client builder for fragments using the new fragment definition API.
|
|
205
206
|
* This is the same as createClientBuilder but works with FragmentDefinition.
|
|
206
207
|
*/
|
|
207
|
-
declare function createClientBuilder<TConfig, TOptions extends FragnoPublicConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext extends RequestThisContext, THandlerThisContext extends RequestThisContext, TRequestStorage, const TRoutesOrFactories extends readonly AnyRouteOrFactory[]>(definition: FragmentDefinition<TConfig, TOptions, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext, THandlerThisContext, TRequestStorage>, publicConfig: FragnoPublicClientConfig, routesOrFactories: TRoutesOrFactories, authorFetcherConfig?: FetcherConfig): ClientBuilder<FlattenRouteFactories<TRoutesOrFactories>, FragnoFragmentSharedConfig$1<FlattenRouteFactories<TRoutesOrFactories>>>;
|
|
208
|
+
declare function createClientBuilder<TConfig, TOptions extends FragnoPublicConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext extends RequestThisContext, THandlerThisContext extends RequestThisContext, TRequestStorage, const TRoutesOrFactories extends readonly AnyRouteOrFactory[], TLinkedFragments extends Record<string, AnyFragnoInstantiatedFragment> = {}>(definition: FragmentDefinition<TConfig, TOptions, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext, THandlerThisContext, TRequestStorage, TLinkedFragments>, publicConfig: FragnoPublicClientConfig, routesOrFactories: TRoutesOrFactories, authorFetcherConfig?: FetcherConfig): ClientBuilder<FlattenRouteFactories<TRoutesOrFactories>, FragnoFragmentSharedConfig$1<FlattenRouteFactories<TRoutesOrFactories>>>;
|
|
208
209
|
//#endregion
|
|
209
210
|
export { CacheLine, ClientBuilder, CreateHookOptions, ExtractGetRoutePaths, ExtractGetRoutes, ExtractNonGetRoutePaths, ExtractOutputSchemaForPath, ExtractRouteByPath, ExtractRoutePath, type FetcherConfig, FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientHookData, FragnoClientMutatorData, FragnoClientUnknownApiError, FragnoErrorOptions, type FragnoFragmentSharedConfig, type FragnoPublicClientConfig, FragnoStoreData, HasGetRoutes, IsValidGetRoutePath, ObjectContainingStoreField, ValidateGetRoutePath, buildUrl, createClientBuilder, getCacheKey, isGetHook, isMutatorHook, isStore };
|
|
210
211
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/client/client.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../src/client/client.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/client/client.js
CHANGED
|
@@ -20,6 +20,85 @@ const GET_HOOK_SYMBOL = Symbol("fragno-get-hook");
|
|
|
20
20
|
const MUTATOR_HOOK_SYMBOL = Symbol("fragno-mutator-hook");
|
|
21
21
|
const STORE_SYMBOL = Symbol("fragno-store");
|
|
22
22
|
/**
|
|
23
|
+
* Check if a value contains files that should be sent as FormData.
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
function containsFiles(value) {
|
|
27
|
+
if (value instanceof File || value instanceof Blob) return true;
|
|
28
|
+
if (value instanceof FormData) return true;
|
|
29
|
+
if (typeof value === "object" && value !== null) return Object.values(value).some((v) => v instanceof File || v instanceof Blob || v instanceof FormData);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert an object containing files to FormData.
|
|
34
|
+
* Handles nested File/Blob values by appending them directly.
|
|
35
|
+
* Other values are JSON-stringified.
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
function toFormData(value) {
|
|
39
|
+
const formData = new FormData();
|
|
40
|
+
for (const [key, val] of Object.entries(value)) if (val instanceof File) formData.append(key, val, val.name);
|
|
41
|
+
else if (val instanceof Blob) formData.append(key, val);
|
|
42
|
+
else if (val !== void 0 && val !== null) formData.append(key, typeof val === "string" ? val : JSON.stringify(val));
|
|
43
|
+
return formData;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Prepare request body and headers for sending.
|
|
47
|
+
* Handles FormData (file uploads) vs JSON data.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
function prepareRequestBody(body, contentType) {
|
|
51
|
+
if (body === void 0) return { body: void 0 };
|
|
52
|
+
if (contentType === "application/octet-stream") {
|
|
53
|
+
if (body instanceof ReadableStream || body instanceof Blob || body instanceof File || body instanceof ArrayBuffer || body instanceof Uint8Array) return {
|
|
54
|
+
body,
|
|
55
|
+
headers: { "Content-Type": "application/octet-stream" }
|
|
56
|
+
};
|
|
57
|
+
throw new Error("Octet-stream routes only accept Blob, File, ArrayBuffer, Uint8Array, or ReadableStream bodies.");
|
|
58
|
+
}
|
|
59
|
+
if (body instanceof FormData) return { body };
|
|
60
|
+
if (body instanceof File) {
|
|
61
|
+
const formData = new FormData();
|
|
62
|
+
formData.append("file", body, body.name);
|
|
63
|
+
return { body: formData };
|
|
64
|
+
}
|
|
65
|
+
if (body instanceof Blob) {
|
|
66
|
+
const formData = new FormData();
|
|
67
|
+
formData.append("file", body);
|
|
68
|
+
return { body: formData };
|
|
69
|
+
}
|
|
70
|
+
if (typeof body === "object" && body !== null && containsFiles(body)) return { body: toFormData(body) };
|
|
71
|
+
return {
|
|
72
|
+
body: JSON.stringify(body),
|
|
73
|
+
headers: { "Content-Type": "application/json" }
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Merge request headers from multiple sources.
|
|
78
|
+
* Returns undefined if there are no headers to merge.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
function mergeRequestHeaders(...headerSources) {
|
|
82
|
+
const result = {};
|
|
83
|
+
let hasHeaders = false;
|
|
84
|
+
for (const source of headerSources) {
|
|
85
|
+
if (!source) continue;
|
|
86
|
+
if (source instanceof Headers) for (const [key, value] of source.entries()) {
|
|
87
|
+
result[key] = value;
|
|
88
|
+
hasHeaders = true;
|
|
89
|
+
}
|
|
90
|
+
else if (Array.isArray(source)) for (const [key, value] of source) {
|
|
91
|
+
result[key] = value;
|
|
92
|
+
hasHeaders = true;
|
|
93
|
+
}
|
|
94
|
+
else for (const [key, value] of Object.entries(source)) {
|
|
95
|
+
result[key] = value;
|
|
96
|
+
hasHeaders = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return hasHeaders ? result : void 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
23
102
|
* @internal
|
|
24
103
|
*/
|
|
25
104
|
function buildUrl(config, params) {
|
|
@@ -117,7 +196,10 @@ var ClientBuilder = class {
|
|
|
117
196
|
buildUrl(path, params) {
|
|
118
197
|
return buildUrl({
|
|
119
198
|
baseUrl: this.#publicConfig.baseUrl ?? "",
|
|
120
|
-
mountRoute: getMountRoute(
|
|
199
|
+
mountRoute: getMountRoute({
|
|
200
|
+
name: this.#fragmentConfig.name,
|
|
201
|
+
mountRoute: this.#publicConfig.mountRoute
|
|
202
|
+
}),
|
|
121
203
|
path
|
|
122
204
|
}, {
|
|
123
205
|
pathParams: params?.path,
|
|
@@ -155,7 +237,10 @@ var ClientBuilder = class {
|
|
|
155
237
|
if (route.method !== "GET") throw new Error(`Only GET routes are supported for hooks. Route '${route.path}' is a ${route.method} route.`);
|
|
156
238
|
if (!route.outputSchema) throw new Error(`Output schema is required for GET routes. Route '${route.path}' has no output schema.`);
|
|
157
239
|
const baseUrl = this.#publicConfig.baseUrl ?? "";
|
|
158
|
-
const mountRoute = getMountRoute(
|
|
240
|
+
const mountRoute = getMountRoute({
|
|
241
|
+
name: this.#fragmentConfig.name,
|
|
242
|
+
mountRoute: this.#publicConfig.mountRoute
|
|
243
|
+
});
|
|
159
244
|
const fetcher = this.#getFetcher();
|
|
160
245
|
const fetcherOptions = this.#getFetcherOptions();
|
|
161
246
|
async function callServerSideHandler(params) {
|
|
@@ -263,7 +348,10 @@ var ClientBuilder = class {
|
|
|
263
348
|
#createRouteQueryMutator(route, onInvalidate = (invalidate, params) => invalidate("GET", route.path, params)) {
|
|
264
349
|
const method = route.method;
|
|
265
350
|
const baseUrl = this.#publicConfig.baseUrl ?? "";
|
|
266
|
-
const mountRoute = getMountRoute(
|
|
351
|
+
const mountRoute = getMountRoute({
|
|
352
|
+
name: this.#fragmentConfig.name,
|
|
353
|
+
mountRoute: this.#publicConfig.mountRoute
|
|
354
|
+
});
|
|
267
355
|
const fetcher = this.#getFetcher();
|
|
268
356
|
const fetcherOptions = this.#getFetcherOptions();
|
|
269
357
|
async function executeMutateQuery({ body, path, query }) {
|
|
@@ -285,11 +373,16 @@ var ClientBuilder = class {
|
|
|
285
373
|
});
|
|
286
374
|
let response;
|
|
287
375
|
try {
|
|
288
|
-
|
|
376
|
+
const { body: preparedBody, headers: bodyHeaders } = prepareRequestBody(body, route.contentType);
|
|
377
|
+
const mergedHeaders = mergeRequestHeaders(fetcherOptions?.headers, bodyHeaders);
|
|
378
|
+
const requestOptions = {
|
|
289
379
|
...fetcherOptions,
|
|
290
380
|
method,
|
|
291
|
-
body:
|
|
292
|
-
|
|
381
|
+
body: preparedBody,
|
|
382
|
+
...mergedHeaders ? { headers: mergedHeaders } : {}
|
|
383
|
+
};
|
|
384
|
+
if (preparedBody instanceof ReadableStream) requestOptions.duplex = "half";
|
|
385
|
+
response = await fetcher(url, requestOptions);
|
|
293
386
|
} catch (error) {
|
|
294
387
|
throw FragnoClientFetchError.fromUnknownFetchError(error);
|
|
295
388
|
}
|
|
@@ -384,7 +477,10 @@ function createClientBuilder(definition, publicConfig, routesOrFactories, author
|
|
|
384
477
|
name: definition.name,
|
|
385
478
|
routes
|
|
386
479
|
};
|
|
387
|
-
const mountRoute =
|
|
480
|
+
const mountRoute = getMountRoute({
|
|
481
|
+
name: definition.name,
|
|
482
|
+
mountRoute: publicConfig.mountRoute
|
|
483
|
+
});
|
|
388
484
|
const mergedFetcherConfig = mergeFetcherConfigs(authorFetcherConfig, publicConfig.fetcherConfig);
|
|
389
485
|
return new ClientBuilder({
|
|
390
486
|
...publicConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["#publicConfig","#fragmentConfig","#fetcherConfig","#cache","#createFetcherStore","#createMutatorStore","#invalidateKeys","#getFetcher","#getFetcherOptions","#createRouteQueryHook","#createRouteQueryMutator","response: Response","mutatorStore: FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutatorStore\"]","#invalidate","fragmentConfig: FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { nanoquery, type FetcherStore, type MutatorStore } from \"@nanostores/query\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { computed, task, type ReadableAtom, type Store } from \"nanostores\";\nimport type {\n FragnoRouteConfig,\n HTTPMethod,\n NonGetHTTPMethod,\n RequestThisContext,\n} from \"../api/api\";\nimport {\n buildPath,\n extractPathParams,\n type ExtractPathParams,\n type ExtractPathParamsOrWiden,\n type MaybeExtractPathParamsOrWiden,\n} from \"../api/internal/path\";\nimport { getMountRoute } from \"../api/internal/route\";\nimport { RequestInputContext } from \"../api/request-input-context\";\nimport { RequestOutputContext } from \"../api/request-output-context\";\nimport type {\n FetcherConfig,\n FragnoFragmentSharedConfig,\n FragnoPublicClientConfig,\n FragnoPublicConfig,\n} from \"../api/shared-types\";\nimport { FragnoClientApiError, FragnoClientError, FragnoClientFetchError } from \"./client-error\";\nimport type { InferOr } from \"../util/types-util\";\nimport { parseContentType } from \"../util/content-type\";\nimport {\n handleNdjsonStreamingFirstItem,\n type NdjsonStreamingStore,\n} from \"./internal/ndjson-streaming\";\nimport { addStore, getInitialData, SSR_ENABLED } from \"../util/ssr\";\nimport { unwrapObject } from \"../util/nanostores\";\nimport type { FragmentDefinition } from \"../api/fragment-definition-builder\";\nimport {\n type AnyRouteOrFactory,\n type FlattenRouteFactories,\n resolveRouteFactories,\n} from \"../api/route\";\nimport { mergeFetcherConfigs } from \"./internal/fetcher-merge\";\n\n/**\n * Symbols used to identify hook types\n */\nconst GET_HOOK_SYMBOL = Symbol(\"fragno-get-hook\");\nconst MUTATOR_HOOK_SYMBOL = Symbol(\"fragno-mutator-hook\");\nconst STORE_SYMBOL = Symbol(\"fragno-store\");\n\n/**\n * Extract only GET routes from a library config's routes array\n * @internal\n */\nexport type ExtractGetRoutes<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = {\n [K in keyof T]: T[K] extends FragnoRouteConfig<\n infer Method,\n infer Path,\n infer Input,\n infer Output,\n infer ErrorCode,\n infer QueryParams\n >\n ? Method extends \"GET\"\n ? FragnoRouteConfig<Method, Path, Input, Output, ErrorCode, QueryParams>\n : never\n : never;\n}[number][];\n\n/**\n * Extract the path from a route configuration for a given method\n * @internal\n */\nexport type ExtractRoutePath<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TExpectedMethod extends HTTPMethod = HTTPMethod,\n> = {\n [K in keyof T]: T[K] extends FragnoRouteConfig<\n infer Method,\n infer Path,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >\n ? Method extends TExpectedMethod\n ? Path\n : never\n : never;\n}[number];\n\n/**\n * @internal\n */\nexport type ExtractGetRoutePaths<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractRoutePath<T, \"GET\">;\n\n/**\n * @internal\n */\nexport type ExtractNonGetRoutePaths<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractRoutePath<T, NonGetHTTPMethod>;\n\n/**\n * Extract the route configuration type(s) for a given path from a routes array.\n * Optionally narrow by HTTP method via the third type parameter.\n *\n * Defaults to extracting all methods for the matching path, producing a union\n * if multiple methods exist for the same path.\n * @internal\n */\nexport type ExtractRouteByPath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n TMethod extends HTTPMethod = HTTPMethod,\n> = {\n [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<\n infer M,\n TPath,\n infer Input,\n infer Output,\n infer ErrorCode,\n infer QueryParams\n >\n ? M extends TMethod\n ? FragnoRouteConfig<M, TPath, Input, Output, ErrorCode, QueryParams>\n : never\n : never;\n}[number];\n\n/**\n * Extract the output schema type for a specific route path from a routes array\n * @internal\n */\nexport type ExtractOutputSchemaForPath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined\n >[],\n TPath extends string,\n> = {\n [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<\n infer Method,\n TPath,\n StandardSchemaV1 | undefined,\n infer Output\n >\n ? Method extends \"GET\"\n ? Output\n : never\n : never;\n}[number];\n\n/**\n * Check if a path exists as a GET route in the routes array\n * @internal\n */\nexport type IsValidGetRoutePath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n> = TPath extends ExtractGetRoutePaths<TRoutes> ? true : false;\n\n/**\n * Utility type to ensure only valid GET route paths can be used\n * @internal\n */\nexport type ValidateGetRoutePath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n> =\n TPath extends ExtractGetRoutePaths<TRoutes>\n ? TPath\n : `Error: Path '${TPath}' is not a valid GET route. Available GET routes: ${ExtractGetRoutePaths<TRoutes>}`;\n\n/**\n * Helper type to check if a routes array has any GET routes\n * @internal\n */\nexport type HasGetRoutes<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractGetRoutePaths<T> extends never ? false : true;\n\n/**\n * @internal\n */\nexport type ObjectContainingStoreField<T extends object> = T extends Store\n ? T\n : {\n [K in keyof T]: T[K] extends Store ? { [P in K]: T[P] } & Partial<Omit<T, K>> : never;\n }[keyof T] extends never\n ? never\n : T;\n\n/**\n * @internal\n */\nexport type FragnoStoreData<T extends object> = {\n obj: T;\n [STORE_SYMBOL]: true;\n};\n\nexport type FragnoClientHookData<\n TMethod extends HTTPMethod,\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = {\n route: FragnoRouteConfig<\n TMethod,\n TPath,\n StandardSchemaV1 | undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >;\n query(args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<TQueryParameters, string | undefined>;\n }): Promise<StandardSchemaV1.InferOutput<TOutputSchema>>;\n store(args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;\n }): FetcherStore<StandardSchemaV1.InferOutput<TOutputSchema>, FragnoClientError<TErrorCode>>;\n [GET_HOOK_SYMBOL]: true;\n} & {\n // Phantom field that preserves the specific TOutputSchema type parameter\n // in the structural type. This makes the type covariant, allowing more\n // specific schema types (like z.ZodString) to be assigned to variables\n // typed with more general schema types (like StandardSchemaV1<any, any>)\n readonly _outputSchema?: TOutputSchema;\n};\n\nexport type FragnoClientMutatorData<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = {\n route: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >;\n\n mutateQuery(args?: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<TQueryParameters, string | undefined>;\n }): Promise<InferOr<TOutputSchema, undefined>>;\n\n mutatorStore: MutatorStore<\n {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;\n },\n InferOr<TOutputSchema, undefined>,\n FragnoClientError<TErrorCode>\n >;\n [MUTATOR_HOOK_SYMBOL]: true;\n} & {\n readonly _inputSchema?: TInputSchema;\n readonly _outputSchema?: TOutputSchema;\n};\n\n/**\n * @internal\n */\nexport function buildUrl<TPath extends string>(\n config: {\n baseUrl?: string;\n mountRoute: string;\n path: TPath;\n },\n params: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n },\n): string {\n const { baseUrl = \"\", mountRoute, path } = config;\n const { pathParams, queryParams } = params ?? {};\n\n const normalizedPathParams = unwrapObject(pathParams) as ExtractPathParams<TPath, string>;\n const normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\n // Filter out undefined values to prevent URLSearchParams from converting them to string \"undefined\"\n const filteredQueryParams = Object.fromEntries(\n Object.entries(normalizedQueryParams).filter(([_, value]) => value !== undefined),\n ) as Record<string, string>;\n\n const searchParams = new URLSearchParams(filteredQueryParams);\n const builtPath = buildPath(path, normalizedPathParams ?? {});\n const search = searchParams.toString() ? `?${searchParams.toString()}` : \"\";\n return `${baseUrl}${mountRoute}${builtPath}${search}`;\n}\n\n/**\n * This method returns an array, which can be passed directly to nanostores.\n *\n * The returned array is always: path, pathParams (In order they appear in the path), queryParams (In alphabetical order)\n * Missing pathParams are replaced with \"<missing>\".\n * Atoms with undefined values are wrapped in computed atoms that map undefined to \"\" to avoid nanoquery treating the key as incomplete.\n * @param path\n * @param params\n * @returns\n * @internal\n */\nexport function getCacheKey<TMethod extends HTTPMethod, TPath extends string>(\n method: TMethod,\n path: TPath,\n params?: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n },\n): (string | ReadableAtom<string>)[] {\n if (!params) {\n return [method, path];\n }\n\n const { pathParams, queryParams } = params;\n\n const pathParamNames = extractPathParams(path);\n const pathParamValues = pathParamNames.map((name) => pathParams?.[name] ?? \"<missing>\");\n\n const queryParamValues = queryParams\n ? Object.keys(queryParams)\n .sort()\n .map((key) => {\n const value = queryParams[key];\n // If it's an atom, wrap it to convert undefined to \"\"\n if (value && typeof value === \"object\" && \"get\" in value) {\n return computed(value as ReadableAtom<string | undefined>, (v) => v ?? \"\");\n }\n // Plain string value (or undefined)\n return value ?? \"\";\n })\n : [];\n\n return [method, path, ...pathParamValues, ...queryParamValues];\n}\n\nfunction isStreamingResponse(response: Response): false | \"ndjson\" | \"octet-stream\" {\n const contentType = parseContentType(response.headers.get(\"content-type\"));\n\n if (!contentType) {\n // Always assume 'normal' JSON by default.\n return false;\n }\n\n const isChunked = response.headers.get(\"transfer-encoding\") === \"chunked\";\n\n if (!isChunked) {\n return false;\n }\n\n if (contentType.subtype === \"octet-stream\") {\n // TODO(Wilco): This is not actually supported properly\n return \"octet-stream\";\n }\n\n if (contentType.subtype === \"x-ndjson\") {\n return \"ndjson\";\n }\n\n return false;\n}\n\n// Type guard to check if a hook is a GET hook\n/**\n * @internal\n */\nexport function isGetHook<\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: unknown,\n): hook is FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return (\n typeof hook === \"object\" &&\n hook !== null &&\n GET_HOOK_SYMBOL in hook &&\n hook[GET_HOOK_SYMBOL] === true\n );\n}\n\n// Type guard to check if a hook is a mutator\n/**\n * @internal\n */\nexport function isMutatorHook<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: unknown,\n): hook is FragnoClientMutatorData<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n> {\n return (\n typeof hook === \"object\" &&\n hook !== null &&\n MUTATOR_HOOK_SYMBOL in hook &&\n hook[MUTATOR_HOOK_SYMBOL] === true\n );\n}\n\n/**\n * @internal\n */\nexport function isStore<TStore extends Store>(obj: unknown): obj is FragnoStoreData<TStore> {\n return (\n typeof obj === \"object\" && obj !== null && STORE_SYMBOL in obj && obj[STORE_SYMBOL] === true\n );\n}\n\ntype OnErrorRetryFn = (opts: {\n error: unknown;\n key: string;\n retryCount: number;\n}) => number | undefined;\n\nexport type CreateHookOptions = {\n /**\n * A function that will be called when an error occurs. Implements an exponential backoff strategy\n * when left undefined. When null, retries will be disabled. The number returned (> 0) by the\n * callback will determine in how many ms to retry next.\n */\n onErrorRetry?: OnErrorRetryFn | null;\n};\n\ntype OnInvalidateFn<TPath extends string> = (\n invalidate: <TInnerPath extends string>(\n method: HTTPMethod,\n path: TInnerPath,\n params: {\n pathParams?: MaybeExtractPathParamsOrWiden<TInnerPath, string>;\n queryParams?: Record<string, string>;\n },\n ) => void,\n params: {\n pathParams: MaybeExtractPathParamsOrWiden<TPath, string>;\n queryParams?: Record<string, string>;\n },\n) => void;\n\n/**\n * @internal\n */\nexport type CacheLine = {\n data: unknown;\n error: unknown;\n retryCount: number;\n created: number;\n expires: number;\n};\n\nexport class ClientBuilder<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TFragmentConfig extends FragnoFragmentSharedConfig<TRoutes>,\n> {\n #publicConfig: FragnoPublicClientConfig;\n #fragmentConfig: TFragmentConfig;\n #fetcherConfig?: FetcherConfig;\n\n #cache = new Map<string, CacheLine>();\n\n #createFetcherStore;\n #createMutatorStore;\n #invalidateKeys;\n\n constructor(publicConfig: FragnoPublicClientConfig, fragmentConfig: TFragmentConfig) {\n this.#publicConfig = publicConfig;\n this.#fragmentConfig = fragmentConfig;\n this.#fetcherConfig = publicConfig.fetcherConfig;\n\n const [createFetcherStore, createMutatorStore, { invalidateKeys }] = nanoquery({\n cache: this.#cache,\n });\n this.#createFetcherStore = createFetcherStore;\n this.#createMutatorStore = createMutatorStore;\n this.#invalidateKeys = invalidateKeys;\n }\n\n get cacheEntries(): Readonly<Record<string, CacheLine>> {\n return Object.fromEntries(this.#cache.entries());\n }\n\n createStore<const T extends object>(obj: T): FragnoStoreData<T> {\n return { obj: obj, [STORE_SYMBOL]: true };\n }\n\n /**\n * Build a URL for a custom backend call using the configured baseUrl and mountRoute.\n * Useful for fragment authors who need to make custom fetch calls.\n */\n buildUrl<TPath extends string>(\n path: TPath,\n params?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n },\n ): string {\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute(this.#fragmentConfig);\n\n return buildUrl(\n { baseUrl, mountRoute, path },\n { pathParams: params?.path, queryParams: params?.query },\n );\n }\n\n /**\n * Get the configured fetcher function for custom backend calls.\n * Returns fetch with merged options applied.\n */\n getFetcher(): {\n fetcher: typeof fetch;\n defaultOptions: RequestInit | undefined;\n } {\n return {\n fetcher: this.#getFetcher(),\n defaultOptions: this.#getFetcherOptions(),\n };\n }\n\n #getFetcher(): typeof fetch {\n if (this.#fetcherConfig?.type === \"function\") {\n return this.#fetcherConfig.fetcher;\n }\n return fetch;\n }\n\n #getFetcherOptions(): RequestInit | undefined {\n if (this.#fetcherConfig?.type === \"options\") {\n return this.#fetcherConfig.options;\n }\n return undefined;\n }\n\n createHook<TPath extends ExtractGetRoutePaths<TFragmentConfig[\"routes\"]>>(\n path: ValidateGetRoutePath<TFragmentConfig[\"routes\"], TPath>,\n options?: CreateHookOptions,\n ): FragnoClientHookData<\n \"GET\",\n TPath,\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"outputSchema\"]>,\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"errorCodes\"]>[number],\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"queryParameters\"]>[number]\n > {\n const route = this.#fragmentConfig.routes.find(\n (\n r,\n ): r is FragnoRouteConfig<\n \"GET\",\n TPath,\n StandardSchemaV1 | undefined,\n StandardSchemaV1,\n string,\n string\n > => r.path === path && r.method === \"GET\" && r.outputSchema !== undefined,\n );\n\n if (!route) {\n throw new Error(`Route '${path}' not found or is not a GET route with an output schema.`);\n }\n\n return this.#createRouteQueryHook(route, options);\n }\n\n createMutator<TPath extends ExtractNonGetRoutePaths<TFragmentConfig[\"routes\"]>>(\n method: NonGetHTTPMethod,\n path: TPath,\n onInvalidate?: OnInvalidateFn<TPath>,\n ): FragnoClientMutatorData<\n NonGetHTTPMethod, // TODO: This can be any Method, but should be related to TPath\n TPath,\n ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"inputSchema\"],\n ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"outputSchema\"],\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"errorCodes\"]>[number],\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"queryParameters\"]>[number]\n > {\n type TRoute = ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>;\n\n const route = this.#fragmentConfig.routes.find(\n (\n r,\n ): r is FragnoRouteConfig<\n NonGetHTTPMethod,\n TPath,\n TRoute[\"inputSchema\"],\n TRoute[\"outputSchema\"],\n string,\n string\n > => r.method !== \"GET\" && r.path === path && r.method === method,\n );\n\n if (!route) {\n throw new Error(\n `Route '${path}' not found or is a GET route with an input and output schema.`,\n );\n }\n\n return this.#createRouteQueryMutator(route, onInvalidate);\n }\n\n #createRouteQueryHook<\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n >(\n route: FragnoRouteConfig<\n \"GET\",\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n options: CreateHookOptions = {},\n ): FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n if (route.method !== \"GET\") {\n throw new Error(\n `Only GET routes are supported for hooks. Route '${route.path}' is a ${route.method} route.`,\n );\n }\n\n if (!route.outputSchema) {\n throw new Error(\n `Output schema is required for GET routes. Route '${route.path}' has no output schema.`,\n );\n }\n\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute(this.#fragmentConfig);\n const fetcher = this.#getFetcher();\n const fetcherOptions = this.#getFetcherOptions();\n\n async function callServerSideHandler(params: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n }): Promise<Response> {\n const { pathParams, queryParams } = params ?? {};\n\n const normalizedPathParams = unwrapObject(pathParams) as ExtractPathParams<TPath, string>;\n const normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\n // Filter out undefined values to prevent URLSearchParams from converting them to string \"undefined\"\n const filteredQueryParams = Object.fromEntries(\n Object.entries(normalizedQueryParams).filter(([_, value]) => value !== undefined),\n ) as Record<string, string>;\n\n const searchParams = new URLSearchParams(filteredQueryParams);\n\n const result = await route.handler(\n RequestInputContext.fromSSRContext({\n method: route.method,\n path: route.path,\n pathParams: normalizedPathParams,\n searchParams,\n }),\n new RequestOutputContext(route.outputSchema),\n );\n\n return result;\n }\n\n async function executeQuery(params?: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n }): Promise<Response> {\n const { pathParams, queryParams } = params ?? {};\n\n if (typeof window === \"undefined\") {\n return task(async () => callServerSideHandler({ pathParams, queryParams }));\n }\n\n const url = buildUrl({ baseUrl, mountRoute, path: route.path }, { pathParams, queryParams });\n\n let response: Response;\n try {\n response = fetcherOptions ? await fetcher(url, fetcherOptions) : await fetcher(url);\n } catch (error) {\n throw FragnoClientFetchError.fromUnknownFetchError(error);\n }\n\n if (!response.ok) {\n throw await FragnoClientApiError.fromResponse<TErrorCode>(response);\n }\n\n return response;\n }\n\n return {\n route,\n store: (args) => {\n const { path, query } = args ?? {};\n\n const key = getCacheKey(route.method, route.path, {\n pathParams: path,\n queryParams: query,\n });\n\n const store = this.#createFetcherStore<\n StandardSchemaV1.InferOutput<TOutputSchema>,\n FragnoClientError<TErrorCode>\n >(key, {\n fetcher: async (): Promise<StandardSchemaV1.InferOutput<TOutputSchema>> => {\n if (SSR_ENABLED) {\n const initialData = getInitialData(\n key.map((d) => (typeof d === \"string\" ? d : d.get())).join(\"\"),\n );\n\n if (initialData) {\n return initialData;\n }\n }\n\n const response = await executeQuery({ pathParams: path, queryParams: query });\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json() as Promise<StandardSchemaV1.InferOutput<TOutputSchema>>;\n }\n\n if (typeof window === \"undefined\") {\n return [];\n }\n\n if (isStreaming === \"ndjson\") {\n const storeAdapter: NdjsonStreamingStore<TOutputSchema, TErrorCode> = {\n setData: (value) => {\n store.set({\n ...store.get(),\n loading: !(Array.isArray(value) && value.length > 0),\n data: value as InferOr<TOutputSchema, undefined>,\n });\n },\n setError: (value) => {\n store.set({\n ...store.get(),\n error: value,\n });\n },\n };\n\n // Start streaming in background and return first item\n const { firstItem } = await handleNdjsonStreamingFirstItem(response, storeAdapter);\n return [firstItem];\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n\n onErrorRetry: options?.onErrorRetry,\n dedupeTime: Infinity,\n });\n\n if (typeof window === \"undefined\") {\n addStore(store);\n }\n\n return store;\n },\n query: async (args) => {\n const { path, query } = args ?? {};\n\n const response = await executeQuery({ pathParams: path, queryParams: query });\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return (await response.json()) as StandardSchemaV1.InferOutput<TOutputSchema>;\n }\n\n if (isStreaming === \"ndjson\") {\n const { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n // Resolves once the stream is done\n return await streamingPromise;\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n [GET_HOOK_SYMBOL]: true,\n };\n }\n\n #createRouteQueryMutator<\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n >(\n route: FragnoRouteConfig<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n onInvalidate: OnInvalidateFn<TPath> = (invalidate, params) =>\n invalidate(\"GET\", route.path, params),\n ): FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n > {\n const method = route.method;\n\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute(this.#fragmentConfig);\n const fetcher = this.#getFetcher();\n const fetcherOptions = this.#getFetcherOptions();\n\n async function executeMutateQuery({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n }): Promise<Response> {\n if (typeof window === \"undefined\") {\n return task(async () =>\n route.handler(\n RequestInputContext.fromSSRContext({\n inputSchema: route.inputSchema,\n method,\n path: route.path,\n pathParams: (path ?? {}) as ExtractPathParams<TPath, string>,\n searchParams: new URLSearchParams(query),\n body,\n }),\n new RequestOutputContext(route.outputSchema),\n ),\n );\n }\n\n const url = buildUrl(\n { baseUrl, mountRoute, path: route.path },\n { pathParams: path, queryParams: query },\n );\n\n let response: Response;\n try {\n const requestOptions: RequestInit = {\n ...fetcherOptions,\n method,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n };\n response = await fetcher(url, requestOptions);\n } catch (error) {\n throw FragnoClientFetchError.fromUnknownFetchError(error);\n }\n\n if (!response.ok) {\n throw await FragnoClientApiError.fromResponse<TErrorCode>(response);\n }\n\n return response;\n }\n\n const mutatorStore: FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutatorStore\"] = this.#createMutatorStore(\n async ({ data }) => {\n if (typeof window === \"undefined\") {\n // TODO(Wilco): Handle server-side rendering.\n }\n\n const { body, path, query } = data as {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n };\n\n if (typeof body === \"undefined\" && route.inputSchema !== undefined) {\n throw new Error(\"Body is required.\");\n }\n\n const response = await executeMutateQuery({ body, path, query });\n\n onInvalidate(this.#invalidate.bind(this), {\n pathParams: (path ?? {}) as MaybeExtractPathParamsOrWiden<TPath, string>,\n queryParams: query,\n });\n\n if (response.status === 201 || response.status === 204) {\n return undefined;\n }\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json();\n }\n\n if (typeof window === \"undefined\") {\n return [];\n }\n\n if (isStreaming === \"ndjson\") {\n const storeAdapter: NdjsonStreamingStore<NonNullable<TOutputSchema>, TErrorCode> = {\n setData: (value) => {\n mutatorStore.set({\n ...mutatorStore.get(),\n loading: !(Array.isArray(value) && value.length > 0),\n data: value as InferOr<TOutputSchema, undefined>,\n });\n },\n setError: (value) => {\n mutatorStore.set({\n ...mutatorStore.get(),\n error: value,\n });\n },\n };\n\n // Start streaming in background and return first item\n const { firstItem } = await handleNdjsonStreamingFirstItem(response, storeAdapter);\n\n // Return the first item immediately. The streaming will continue in the background\n return [firstItem];\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n {\n onError: (error) => {\n console.error(\"Error in mutatorStore\", error);\n },\n },\n );\n\n const mutateQuery = (async (data) => {\n // TypeScript infers the fields to not exist, even though they might\n const { body, path, query } = data as {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n };\n\n if (typeof body === \"undefined\" && route.inputSchema !== undefined) {\n throw new Error(\"Body is required for mutateQuery\");\n }\n\n const response = await executeMutateQuery({ body, path, query });\n\n if (response.status === 201 || response.status === 204) {\n return undefined;\n }\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json();\n }\n\n if (isStreaming === \"ndjson\") {\n const { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n // Resolves once the stream is done, i.e. we block until done\n return await streamingPromise;\n }\n\n if (isStreaming === \"octet-stream\") {\n throw new Error(\"Octet-stream streaming is not supported for mutations\");\n }\n\n throw new Error(\"Unreachable\");\n }) satisfies FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutateQuery\"];\n\n return {\n route,\n mutateQuery,\n mutatorStore,\n [MUTATOR_HOOK_SYMBOL]: true,\n };\n }\n\n #invalidate<TPath extends string>(\n method: HTTPMethod,\n path: TPath,\n params: {\n pathParams?: MaybeExtractPathParamsOrWiden<TPath, string>;\n queryParams?: Record<string, string>;\n },\n ) {\n const prefixArray = getCacheKey(method, path, {\n pathParams: params?.pathParams,\n queryParams: params?.queryParams,\n });\n\n const prefix = prefixArray.map((k) => (typeof k === \"string\" ? k : k.get())).join(\"\");\n\n this.#invalidateKeys((key) => key.startsWith(prefix));\n }\n}\n\n/**\n * Create a client builder for fragments using the new fragment definition API.\n * This is the same as createClientBuilder but works with FragmentDefinition.\n */\nexport function createClientBuilder<\n TConfig,\n TOptions extends FragnoPublicConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext extends RequestThisContext,\n THandlerThisContext extends RequestThisContext,\n TRequestStorage,\n const TRoutesOrFactories extends readonly AnyRouteOrFactory[],\n>(\n definition: FragmentDefinition<\n TConfig,\n TOptions,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n TRequestStorage\n >,\n publicConfig: FragnoPublicClientConfig,\n routesOrFactories: TRoutesOrFactories,\n authorFetcherConfig?: FetcherConfig,\n): ClientBuilder<\n FlattenRouteFactories<TRoutesOrFactories>,\n FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>\n> {\n // For client-side, we resolve route factories with dummy context\n // This will be removed by the bundle plugin anyway\n const dummyContext = {\n config: {} as TConfig,\n deps: {} as TDeps,\n services: {} as TBaseServices & TServices,\n serviceDeps: {},\n };\n\n const routes = resolveRouteFactories(dummyContext, routesOrFactories);\n\n const fragmentConfig: FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>> = {\n name: definition.name,\n routes,\n };\n\n const mountRoute = publicConfig.mountRoute ?? `/${definition.name}`;\n const mergedFetcherConfig = mergeFetcherConfigs(authorFetcherConfig, publicConfig.fetcherConfig);\n const fullPublicConfig = {\n ...publicConfig,\n mountRoute,\n fetcherConfig: mergedFetcherConfig,\n };\n\n return new ClientBuilder(fullPublicConfig, fragmentConfig);\n}\n\nexport * from \"./client-error\";\nexport type { FetcherConfig, FragnoPublicClientConfig } from \"../api/shared-types\";\nexport type { FragnoFragmentSharedConfig } from \"../api/fragment-instantiator\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["result: Record<string, string>","#publicConfig","#fragmentConfig","#fetcherConfig","#cache","#createFetcherStore","#createMutatorStore","#invalidateKeys","#getFetcher","#getFetcherOptions","#createRouteQueryHook","#createRouteQueryMutator","response: Response","requestOptions: RequestInit & { duplex?: \"half\" }","mutatorStore: FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutatorStore\"]","#invalidate","fragmentConfig: FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { nanoquery, type FetcherStore, type MutatorStore } from \"@nanostores/query\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { computed, task, type ReadableAtom, type Store } from \"nanostores\";\nimport type {\n FragnoRouteConfig,\n HTTPMethod,\n NonGetHTTPMethod,\n RequestThisContext,\n RouteContentType,\n} from \"../api/api\";\nimport {\n buildPath,\n extractPathParams,\n type ExtractPathParams,\n type ExtractPathParamsOrWiden,\n type MaybeExtractPathParamsOrWiden,\n} from \"../api/internal/path\";\nimport { getMountRoute } from \"../api/internal/route\";\nimport { RequestInputContext } from \"../api/request-input-context\";\nimport { RequestOutputContext } from \"../api/request-output-context\";\nimport type {\n FetcherConfig,\n FragnoFragmentSharedConfig,\n FragnoPublicClientConfig,\n FragnoPublicConfig,\n} from \"../api/shared-types\";\nimport { FragnoClientApiError, FragnoClientError, FragnoClientFetchError } from \"./client-error\";\nimport type { InferOr } from \"../util/types-util\";\nimport { parseContentType } from \"../util/content-type\";\nimport {\n handleNdjsonStreamingFirstItem,\n type NdjsonStreamingStore,\n} from \"./internal/ndjson-streaming\";\nimport { addStore, getInitialData, SSR_ENABLED } from \"../util/ssr\";\nimport { unwrapObject } from \"../util/nanostores\";\nimport type { FragmentDefinition } from \"../api/fragment-definition-builder\";\nimport type { AnyFragnoInstantiatedFragment } from \"../api/fragment-instantiator\";\nimport {\n type AnyRouteOrFactory,\n type FlattenRouteFactories,\n resolveRouteFactories,\n} from \"../api/route\";\nimport { mergeFetcherConfigs } from \"./internal/fetcher-merge\";\n\n/**\n * Symbols used to identify hook types\n */\nconst GET_HOOK_SYMBOL = Symbol(\"fragno-get-hook\");\nconst MUTATOR_HOOK_SYMBOL = Symbol(\"fragno-mutator-hook\");\nconst STORE_SYMBOL = Symbol(\"fragno-store\");\n\n/**\n * Check if a value contains files that should be sent as FormData.\n * @internal\n */\nfunction containsFiles(value: unknown): boolean {\n if (value instanceof File || value instanceof Blob) {\n return true;\n }\n\n if (value instanceof FormData) {\n return true;\n }\n\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).some(\n (v) => v instanceof File || v instanceof Blob || v instanceof FormData,\n );\n }\n\n return false;\n}\n\n/**\n * Convert an object containing files to FormData.\n * Handles nested File/Blob values by appending them directly.\n * Other values are JSON-stringified.\n * @internal\n */\nfunction toFormData(value: object): FormData {\n const formData = new FormData();\n\n for (const [key, val] of Object.entries(value)) {\n if (val instanceof File) {\n formData.append(key, val, val.name);\n } else if (val instanceof Blob) {\n formData.append(key, val);\n } else if (val !== undefined && val !== null) {\n // For non-file values, stringify if needed\n formData.append(key, typeof val === \"string\" ? val : JSON.stringify(val));\n }\n }\n\n return formData;\n}\n\n/**\n * Prepare request body and headers for sending.\n * Handles FormData (file uploads) vs JSON data.\n * @internal\n */\nfunction prepareRequestBody(\n body: unknown,\n contentType?: RouteContentType,\n): { body: BodyInit | undefined; headers?: HeadersInit } {\n if (body === undefined) {\n return { body: undefined };\n }\n\n if (contentType === \"application/octet-stream\") {\n if (\n body instanceof ReadableStream ||\n body instanceof Blob ||\n body instanceof File ||\n body instanceof ArrayBuffer ||\n body instanceof Uint8Array\n ) {\n return { body: body as BodyInit, headers: { \"Content-Type\": \"application/octet-stream\" } };\n }\n\n throw new Error(\n \"Octet-stream routes only accept Blob, File, ArrayBuffer, Uint8Array, or ReadableStream bodies.\",\n );\n }\n\n // If already FormData, send as-is (browser sets Content-Type with boundary)\n if (body instanceof FormData) {\n return { body };\n }\n\n // If body is directly a File or Blob, wrap it in FormData\n if (body instanceof File) {\n const formData = new FormData();\n formData.append(\"file\", body, body.name);\n return { body: formData };\n }\n\n if (body instanceof Blob) {\n const formData = new FormData();\n formData.append(\"file\", body);\n return { body: formData };\n }\n\n // If object contains files, convert to FormData\n if (typeof body === \"object\" && body !== null && containsFiles(body)) {\n return { body: toFormData(body) };\n }\n\n // Otherwise, JSON-stringify\n return {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n };\n}\n\n/**\n * Merge request headers from multiple sources.\n * Returns undefined if there are no headers to merge.\n * @internal\n */\nfunction mergeRequestHeaders(\n ...headerSources: (HeadersInit | undefined)[]\n): Record<string, string> | undefined {\n const result: Record<string, string> = {};\n let hasHeaders = false;\n\n for (const source of headerSources) {\n if (!source) {\n continue;\n }\n\n if (source instanceof Headers) {\n for (const [key, value] of source.entries()) {\n result[key] = value;\n hasHeaders = true;\n }\n } else if (Array.isArray(source)) {\n for (const [key, value] of source) {\n result[key] = value;\n hasHeaders = true;\n }\n } else {\n for (const [key, value] of Object.entries(source)) {\n result[key] = value;\n hasHeaders = true;\n }\n }\n }\n\n return hasHeaders ? result : undefined;\n}\n\n/**\n * Extract only GET routes from a library config's routes array\n * @internal\n */\nexport type ExtractGetRoutes<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = {\n [K in keyof T]: T[K] extends FragnoRouteConfig<\n infer Method,\n infer Path,\n infer Input,\n infer Output,\n infer ErrorCode,\n infer QueryParams\n >\n ? Method extends \"GET\"\n ? FragnoRouteConfig<Method, Path, Input, Output, ErrorCode, QueryParams>\n : never\n : never;\n}[number][];\n\n/**\n * Extract the path from a route configuration for a given method\n * @internal\n */\nexport type ExtractRoutePath<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TExpectedMethod extends HTTPMethod = HTTPMethod,\n> = {\n [K in keyof T]: T[K] extends FragnoRouteConfig<\n infer Method,\n infer Path,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >\n ? Method extends TExpectedMethod\n ? Path\n : never\n : never;\n}[number];\n\n/**\n * @internal\n */\nexport type ExtractGetRoutePaths<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractRoutePath<T, \"GET\">;\n\n/**\n * @internal\n */\nexport type ExtractNonGetRoutePaths<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractRoutePath<T, NonGetHTTPMethod>;\n\n/**\n * Extract the route configuration type(s) for a given path from a routes array.\n * Optionally narrow by HTTP method via the third type parameter.\n *\n * Defaults to extracting all methods for the matching path, producing a union\n * if multiple methods exist for the same path.\n * @internal\n */\nexport type ExtractRouteByPath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n TMethod extends HTTPMethod = HTTPMethod,\n> = {\n [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<\n infer M,\n TPath,\n infer Input,\n infer Output,\n infer ErrorCode,\n infer QueryParams\n >\n ? M extends TMethod\n ? FragnoRouteConfig<M, TPath, Input, Output, ErrorCode, QueryParams>\n : never\n : never;\n}[number];\n\n/**\n * Extract the output schema type for a specific route path from a routes array\n * @internal\n */\nexport type ExtractOutputSchemaForPath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined\n >[],\n TPath extends string,\n> = {\n [K in keyof TRoutes]: TRoutes[K] extends FragnoRouteConfig<\n infer Method,\n TPath,\n StandardSchemaV1 | undefined,\n infer Output\n >\n ? Method extends \"GET\"\n ? Output\n : never\n : never;\n}[number];\n\n/**\n * Check if a path exists as a GET route in the routes array\n * @internal\n */\nexport type IsValidGetRoutePath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n> = TPath extends ExtractGetRoutePaths<TRoutes> ? true : false;\n\n/**\n * Utility type to ensure only valid GET route paths can be used\n * @internal\n */\nexport type ValidateGetRoutePath<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TPath extends string,\n> =\n TPath extends ExtractGetRoutePaths<TRoutes>\n ? TPath\n : `Error: Path '${TPath}' is not a valid GET route. Available GET routes: ${ExtractGetRoutePaths<TRoutes>}`;\n\n/**\n * Helper type to check if a routes array has any GET routes\n * @internal\n */\nexport type HasGetRoutes<\n T extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n> = ExtractGetRoutePaths<T> extends never ? false : true;\n\n/**\n * @internal\n */\nexport type ObjectContainingStoreField<T extends object> = T extends Store\n ? T\n : {\n [K in keyof T]: T[K] extends Store ? { [P in K]: T[P] } & Partial<Omit<T, K>> : never;\n }[keyof T] extends never\n ? never\n : T;\n\n/**\n * @internal\n */\nexport type FragnoStoreData<T extends object> = {\n obj: T;\n [STORE_SYMBOL]: true;\n};\n\nexport type FragnoClientHookData<\n TMethod extends HTTPMethod,\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = {\n route: FragnoRouteConfig<\n TMethod,\n TPath,\n StandardSchemaV1 | undefined,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >;\n query(args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<TQueryParameters, string | undefined>;\n }): Promise<StandardSchemaV1.InferOutput<TOutputSchema>>;\n store(args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;\n }): FetcherStore<StandardSchemaV1.InferOutput<TOutputSchema>, FragnoClientError<TErrorCode>>;\n [GET_HOOK_SYMBOL]: true;\n} & {\n // Phantom field that preserves the specific TOutputSchema type parameter\n // in the structural type. This makes the type covariant, allowing more\n // specific schema types (like z.ZodString) to be assigned to variables\n // typed with more general schema types (like StandardSchemaV1<any, any>)\n readonly _outputSchema?: TOutputSchema;\n};\n\nexport type FragnoClientMutatorData<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = {\n route: FragnoRouteConfig<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >;\n\n mutateQuery(args?: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<TQueryParameters, string | undefined>;\n }): Promise<InferOr<TOutputSchema, undefined>>;\n\n mutatorStore: MutatorStore<\n {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | undefined | ReadableAtom<string | undefined>>;\n },\n InferOr<TOutputSchema, undefined>,\n FragnoClientError<TErrorCode>\n >;\n [MUTATOR_HOOK_SYMBOL]: true;\n} & {\n readonly _inputSchema?: TInputSchema;\n readonly _outputSchema?: TOutputSchema;\n};\n\n/**\n * @internal\n */\nexport function buildUrl<TPath extends string>(\n config: {\n baseUrl?: string;\n mountRoute: string;\n path: TPath;\n },\n params: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n },\n): string {\n const { baseUrl = \"\", mountRoute, path } = config;\n const { pathParams, queryParams } = params ?? {};\n\n const normalizedPathParams = unwrapObject(pathParams) as ExtractPathParams<TPath, string>;\n const normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\n // Filter out undefined values to prevent URLSearchParams from converting them to string \"undefined\"\n const filteredQueryParams = Object.fromEntries(\n Object.entries(normalizedQueryParams).filter(([_, value]) => value !== undefined),\n ) as Record<string, string>;\n\n const searchParams = new URLSearchParams(filteredQueryParams);\n const builtPath = buildPath(path, normalizedPathParams ?? {});\n const search = searchParams.toString() ? `?${searchParams.toString()}` : \"\";\n return `${baseUrl}${mountRoute}${builtPath}${search}`;\n}\n\n/**\n * This method returns an array, which can be passed directly to nanostores.\n *\n * The returned array is always: path, pathParams (In order they appear in the path), queryParams (In alphabetical order)\n * Missing pathParams are replaced with \"<missing>\".\n * Atoms with undefined values are wrapped in computed atoms that map undefined to \"\" to avoid nanoquery treating the key as incomplete.\n * @param path\n * @param params\n * @returns\n * @internal\n */\nexport function getCacheKey<TMethod extends HTTPMethod, TPath extends string>(\n method: TMethod,\n path: TPath,\n params?: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n },\n): (string | ReadableAtom<string>)[] {\n if (!params) {\n return [method, path];\n }\n\n const { pathParams, queryParams } = params;\n\n const pathParamNames = extractPathParams(path);\n const pathParamValues = pathParamNames.map((name) => pathParams?.[name] ?? \"<missing>\");\n\n const queryParamValues = queryParams\n ? Object.keys(queryParams)\n .sort()\n .map((key) => {\n const value = queryParams[key];\n // If it's an atom, wrap it to convert undefined to \"\"\n if (value && typeof value === \"object\" && \"get\" in value) {\n return computed(value as ReadableAtom<string | undefined>, (v) => v ?? \"\");\n }\n // Plain string value (or undefined)\n return value ?? \"\";\n })\n : [];\n\n return [method, path, ...pathParamValues, ...queryParamValues];\n}\n\nfunction isStreamingResponse(response: Response): false | \"ndjson\" | \"octet-stream\" {\n const contentType = parseContentType(response.headers.get(\"content-type\"));\n\n if (!contentType) {\n // Always assume 'normal' JSON by default.\n return false;\n }\n\n const isChunked = response.headers.get(\"transfer-encoding\") === \"chunked\";\n\n if (!isChunked) {\n return false;\n }\n\n if (contentType.subtype === \"octet-stream\") {\n // TODO(Wilco): This is not actually supported properly\n return \"octet-stream\";\n }\n\n if (contentType.subtype === \"x-ndjson\") {\n return \"ndjson\";\n }\n\n return false;\n}\n\n// Type guard to check if a hook is a GET hook\n/**\n * @internal\n */\nexport function isGetHook<\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: unknown,\n): hook is FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return (\n typeof hook === \"object\" &&\n hook !== null &&\n GET_HOOK_SYMBOL in hook &&\n hook[GET_HOOK_SYMBOL] === true\n );\n}\n\n// Type guard to check if a hook is a mutator\n/**\n * @internal\n */\nexport function isMutatorHook<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: unknown,\n): hook is FragnoClientMutatorData<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n> {\n return (\n typeof hook === \"object\" &&\n hook !== null &&\n MUTATOR_HOOK_SYMBOL in hook &&\n hook[MUTATOR_HOOK_SYMBOL] === true\n );\n}\n\n/**\n * @internal\n */\nexport function isStore<TStore extends Store>(obj: unknown): obj is FragnoStoreData<TStore> {\n return (\n typeof obj === \"object\" && obj !== null && STORE_SYMBOL in obj && obj[STORE_SYMBOL] === true\n );\n}\n\ntype OnErrorRetryFn = (opts: {\n error: unknown;\n key: string;\n retryCount: number;\n}) => number | undefined;\n\nexport type CreateHookOptions = {\n /**\n * A function that will be called when an error occurs. Implements an exponential backoff strategy\n * when left undefined. When null, retries will be disabled. The number returned (> 0) by the\n * callback will determine in how many ms to retry next.\n */\n onErrorRetry?: OnErrorRetryFn | null;\n};\n\ntype OnInvalidateFn<TPath extends string> = (\n invalidate: <TInnerPath extends string>(\n method: HTTPMethod,\n path: TInnerPath,\n params: {\n pathParams?: MaybeExtractPathParamsOrWiden<TInnerPath, string>;\n queryParams?: Record<string, string>;\n },\n ) => void,\n params: {\n pathParams: MaybeExtractPathParamsOrWiden<TPath, string>;\n queryParams?: Record<string, string>;\n },\n) => void;\n\n/**\n * @internal\n */\nexport type CacheLine = {\n data: unknown;\n error: unknown;\n retryCount: number;\n created: number;\n expires: number;\n};\n\nexport class ClientBuilder<\n TRoutes extends readonly FragnoRouteConfig<\n HTTPMethod,\n string,\n StandardSchemaV1 | undefined,\n StandardSchemaV1 | undefined,\n string,\n string\n >[],\n TFragmentConfig extends FragnoFragmentSharedConfig<TRoutes>,\n> {\n #publicConfig: FragnoPublicClientConfig;\n #fragmentConfig: TFragmentConfig;\n #fetcherConfig?: FetcherConfig;\n\n #cache = new Map<string, CacheLine>();\n\n #createFetcherStore;\n #createMutatorStore;\n #invalidateKeys;\n\n constructor(publicConfig: FragnoPublicClientConfig, fragmentConfig: TFragmentConfig) {\n this.#publicConfig = publicConfig;\n this.#fragmentConfig = fragmentConfig;\n this.#fetcherConfig = publicConfig.fetcherConfig;\n\n const [createFetcherStore, createMutatorStore, { invalidateKeys }] = nanoquery({\n cache: this.#cache,\n });\n this.#createFetcherStore = createFetcherStore;\n this.#createMutatorStore = createMutatorStore;\n this.#invalidateKeys = invalidateKeys;\n }\n\n get cacheEntries(): Readonly<Record<string, CacheLine>> {\n return Object.fromEntries(this.#cache.entries());\n }\n\n createStore<const T extends object>(obj: T): FragnoStoreData<T> {\n return { obj: obj, [STORE_SYMBOL]: true };\n }\n\n /**\n * Build a URL for a custom backend call using the configured baseUrl and mountRoute.\n * Useful for fragment authors who need to make custom fetch calls.\n */\n buildUrl<TPath extends string>(\n path: TPath,\n params?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n },\n ): string {\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute({\n name: this.#fragmentConfig.name,\n mountRoute: this.#publicConfig.mountRoute,\n });\n\n return buildUrl(\n { baseUrl, mountRoute, path },\n { pathParams: params?.path, queryParams: params?.query },\n );\n }\n\n /**\n * Get the configured fetcher function for custom backend calls.\n * Returns fetch with merged options applied.\n */\n getFetcher(): {\n fetcher: typeof fetch;\n defaultOptions: RequestInit | undefined;\n } {\n return {\n fetcher: this.#getFetcher(),\n defaultOptions: this.#getFetcherOptions(),\n };\n }\n\n #getFetcher(): typeof fetch {\n if (this.#fetcherConfig?.type === \"function\") {\n return this.#fetcherConfig.fetcher;\n }\n return fetch;\n }\n\n #getFetcherOptions(): RequestInit | undefined {\n if (this.#fetcherConfig?.type === \"options\") {\n return this.#fetcherConfig.options;\n }\n return undefined;\n }\n\n createHook<TPath extends ExtractGetRoutePaths<TFragmentConfig[\"routes\"]>>(\n path: ValidateGetRoutePath<TFragmentConfig[\"routes\"], TPath>,\n options?: CreateHookOptions,\n ): FragnoClientHookData<\n \"GET\",\n TPath,\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath, \"GET\">[\"outputSchema\"]>,\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath, \"GET\">[\"errorCodes\"]>[number],\n NonNullable<\n ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath, \"GET\">[\"queryParameters\"]\n >[number]\n > {\n const route = this.#fragmentConfig.routes.find(\n (\n r,\n ): r is FragnoRouteConfig<\n \"GET\",\n TPath,\n StandardSchemaV1 | undefined,\n StandardSchemaV1,\n string,\n string\n > => r.path === path && r.method === \"GET\" && r.outputSchema !== undefined,\n );\n\n if (!route) {\n throw new Error(`Route '${path}' not found or is not a GET route with an output schema.`);\n }\n\n return this.#createRouteQueryHook(route, options);\n }\n\n createMutator<TPath extends ExtractNonGetRoutePaths<TFragmentConfig[\"routes\"]>>(\n method: NonGetHTTPMethod,\n path: TPath,\n onInvalidate?: OnInvalidateFn<TPath>,\n ): FragnoClientMutatorData<\n NonGetHTTPMethod, // TODO: This can be any Method, but should be related to TPath\n TPath,\n ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"inputSchema\"],\n ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"outputSchema\"],\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"errorCodes\"]>[number],\n NonNullable<ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>[\"queryParameters\"]>[number]\n > {\n type TRoute = ExtractRouteByPath<TFragmentConfig[\"routes\"], TPath>;\n\n const route = this.#fragmentConfig.routes.find(\n (\n r,\n ): r is FragnoRouteConfig<\n NonGetHTTPMethod,\n TPath,\n TRoute[\"inputSchema\"],\n TRoute[\"outputSchema\"],\n string,\n string\n > => r.method !== \"GET\" && r.path === path && r.method === method,\n );\n\n if (!route) {\n throw new Error(\n `Route '${path}' not found or is a GET route with an input and output schema.`,\n );\n }\n\n return this.#createRouteQueryMutator(route, onInvalidate);\n }\n\n #createRouteQueryHook<\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n >(\n route: FragnoRouteConfig<\n \"GET\",\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n options: CreateHookOptions = {},\n ): FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n if (route.method !== \"GET\") {\n throw new Error(\n `Only GET routes are supported for hooks. Route '${route.path}' is a ${route.method} route.`,\n );\n }\n\n if (!route.outputSchema) {\n throw new Error(\n `Output schema is required for GET routes. Route '${route.path}' has no output schema.`,\n );\n }\n\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute({\n name: this.#fragmentConfig.name,\n mountRoute: this.#publicConfig.mountRoute,\n });\n const fetcher = this.#getFetcher();\n const fetcherOptions = this.#getFetcherOptions();\n\n async function callServerSideHandler(params: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n }): Promise<Response> {\n const { pathParams, queryParams } = params ?? {};\n\n const normalizedPathParams = unwrapObject(pathParams) as ExtractPathParams<TPath, string>;\n const normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\n // Filter out undefined values to prevent URLSearchParams from converting them to string \"undefined\"\n const filteredQueryParams = Object.fromEntries(\n Object.entries(normalizedQueryParams).filter(([_, value]) => value !== undefined),\n ) as Record<string, string>;\n\n const searchParams = new URLSearchParams(filteredQueryParams);\n\n const result = await route.handler(\n RequestInputContext.fromSSRContext({\n method: route.method,\n path: route.path,\n pathParams: normalizedPathParams,\n searchParams,\n }),\n new RequestOutputContext(route.outputSchema),\n );\n\n return result;\n }\n\n async function executeQuery(params?: {\n pathParams?: Record<string, string | ReadableAtom<string>>;\n queryParams?: Record<string, string | undefined | ReadableAtom<string | undefined>>;\n }): Promise<Response> {\n const { pathParams, queryParams } = params ?? {};\n\n if (typeof window === \"undefined\") {\n return task(async () => callServerSideHandler({ pathParams, queryParams }));\n }\n\n const url = buildUrl({ baseUrl, mountRoute, path: route.path }, { pathParams, queryParams });\n\n let response: Response;\n try {\n response = fetcherOptions ? await fetcher(url, fetcherOptions) : await fetcher(url);\n } catch (error) {\n throw FragnoClientFetchError.fromUnknownFetchError(error);\n }\n\n if (!response.ok) {\n throw await FragnoClientApiError.fromResponse<TErrorCode>(response);\n }\n\n return response;\n }\n\n return {\n route,\n store: (args) => {\n const { path, query } = args ?? {};\n\n const key = getCacheKey(route.method, route.path, {\n pathParams: path,\n queryParams: query,\n });\n\n const store = this.#createFetcherStore<\n StandardSchemaV1.InferOutput<TOutputSchema>,\n FragnoClientError<TErrorCode>\n >(key, {\n fetcher: async (): Promise<StandardSchemaV1.InferOutput<TOutputSchema>> => {\n if (SSR_ENABLED) {\n const initialData = getInitialData(\n key.map((d) => (typeof d === \"string\" ? d : d.get())).join(\"\"),\n );\n\n if (initialData) {\n return initialData;\n }\n }\n\n const response = await executeQuery({ pathParams: path, queryParams: query });\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json() as Promise<StandardSchemaV1.InferOutput<TOutputSchema>>;\n }\n\n if (typeof window === \"undefined\") {\n return [];\n }\n\n if (isStreaming === \"ndjson\") {\n const storeAdapter: NdjsonStreamingStore<TOutputSchema, TErrorCode> = {\n setData: (value) => {\n store.set({\n ...store.get(),\n loading: !(Array.isArray(value) && value.length > 0),\n data: value as InferOr<TOutputSchema, undefined>,\n });\n },\n setError: (value) => {\n store.set({\n ...store.get(),\n error: value,\n });\n },\n };\n\n // Start streaming in background and return first item\n const { firstItem } = await handleNdjsonStreamingFirstItem(response, storeAdapter);\n return [firstItem];\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n\n onErrorRetry: options?.onErrorRetry,\n dedupeTime: Infinity,\n });\n\n if (typeof window === \"undefined\") {\n addStore(store);\n }\n\n return store;\n },\n query: async (args) => {\n const { path, query } = args ?? {};\n\n const response = await executeQuery({ pathParams: path, queryParams: query });\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return (await response.json()) as StandardSchemaV1.InferOutput<TOutputSchema>;\n }\n\n if (isStreaming === \"ndjson\") {\n const { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n // Resolves once the stream is done\n return await streamingPromise;\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n [GET_HOOK_SYMBOL]: true,\n };\n }\n\n #createRouteQueryMutator<\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n >(\n route: FragnoRouteConfig<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n onInvalidate: OnInvalidateFn<TPath> = (invalidate, params) =>\n invalidate(\"GET\", route.path, params),\n ): FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n > {\n const method = route.method;\n\n const baseUrl = this.#publicConfig.baseUrl ?? \"\";\n const mountRoute = getMountRoute({\n name: this.#fragmentConfig.name,\n mountRoute: this.#publicConfig.mountRoute,\n });\n const fetcher = this.#getFetcher();\n const fetcherOptions = this.#getFetcherOptions();\n\n async function executeMutateQuery({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n }): Promise<Response> {\n if (typeof window === \"undefined\") {\n return task(async () =>\n route.handler(\n RequestInputContext.fromSSRContext({\n inputSchema: route.inputSchema,\n method,\n path: route.path,\n pathParams: (path ?? {}) as ExtractPathParams<TPath, string>,\n searchParams: new URLSearchParams(query),\n body,\n }),\n new RequestOutputContext(route.outputSchema),\n ),\n );\n }\n\n const url = buildUrl(\n { baseUrl, mountRoute, path: route.path },\n { pathParams: path, queryParams: query },\n );\n\n let response: Response;\n try {\n const { body: preparedBody, headers: bodyHeaders } = prepareRequestBody(\n body,\n route.contentType,\n );\n\n // Merge headers: fetcherOptions headers + body-specific headers (e.g., Content-Type for JSON)\n // For FormData, bodyHeaders is undefined and browser sets Content-Type with boundary automatically\n const mergedHeaders = mergeRequestHeaders(\n fetcherOptions?.headers as HeadersInit | undefined,\n bodyHeaders,\n );\n\n const requestOptions: RequestInit & { duplex?: \"half\" } = {\n ...fetcherOptions,\n method,\n body: preparedBody,\n ...(mergedHeaders ? { headers: mergedHeaders } : {}),\n };\n if (preparedBody instanceof ReadableStream) {\n requestOptions.duplex = \"half\";\n }\n response = await fetcher(url, requestOptions);\n } catch (error) {\n throw FragnoClientFetchError.fromUnknownFetchError(error);\n }\n\n if (!response.ok) {\n throw await FragnoClientApiError.fromResponse<TErrorCode>(response);\n }\n\n return response;\n }\n\n const mutatorStore: FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutatorStore\"] = this.#createMutatorStore(\n async ({ data }) => {\n if (typeof window === \"undefined\") {\n // TODO(Wilco): Handle server-side rendering.\n }\n\n const { body, path, query } = data as {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n };\n\n if (typeof body === \"undefined\" && route.inputSchema !== undefined) {\n throw new Error(\"Body is required.\");\n }\n\n const response = await executeMutateQuery({ body, path, query });\n\n onInvalidate(this.#invalidate.bind(this), {\n pathParams: (path ?? {}) as MaybeExtractPathParamsOrWiden<TPath, string>,\n queryParams: query,\n });\n\n if (response.status === 201 || response.status === 204) {\n return undefined;\n }\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json();\n }\n\n if (typeof window === \"undefined\") {\n return [];\n }\n\n if (isStreaming === \"ndjson\") {\n const storeAdapter: NdjsonStreamingStore<NonNullable<TOutputSchema>, TErrorCode> = {\n setData: (value) => {\n mutatorStore.set({\n ...mutatorStore.get(),\n loading: !(Array.isArray(value) && value.length > 0),\n data: value as InferOr<TOutputSchema, undefined>,\n });\n },\n setError: (value) => {\n mutatorStore.set({\n ...mutatorStore.get(),\n error: value,\n });\n },\n };\n\n // Start streaming in background and return first item\n const { firstItem } = await handleNdjsonStreamingFirstItem(response, storeAdapter);\n\n // Return the first item immediately. The streaming will continue in the background\n return [firstItem];\n }\n\n if (isStreaming === \"octet-stream\") {\n // TODO(Wilco): Implement this\n throw new Error(\"Octet-stream streaming is not supported.\");\n }\n\n throw new Error(\"Unreachable\");\n },\n {\n onError: (error) => {\n console.error(\"Error in mutatorStore\", error);\n },\n },\n );\n\n const mutateQuery = (async (data) => {\n // TypeScript infers the fields to not exist, even though they might\n const { body, path, query } = data as {\n body?: InferOr<TInputSchema, undefined>;\n path?: ExtractPathParamsOrWiden<TPath, string>;\n query?: Record<string, string>;\n };\n\n if (typeof body === \"undefined\" && route.inputSchema !== undefined) {\n throw new Error(\"Body is required for mutateQuery\");\n }\n\n const response = await executeMutateQuery({ body, path, query });\n\n if (response.status === 201 || response.status === 204) {\n return undefined;\n }\n\n const isStreaming = isStreamingResponse(response);\n\n if (!isStreaming) {\n return response.json();\n }\n\n if (isStreaming === \"ndjson\") {\n const { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n // Resolves once the stream is done, i.e. we block until done\n return await streamingPromise;\n }\n\n if (isStreaming === \"octet-stream\") {\n throw new Error(\"Octet-stream streaming is not supported for mutations\");\n }\n\n throw new Error(\"Unreachable\");\n }) satisfies FragnoClientMutatorData<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >[\"mutateQuery\"];\n\n return {\n route,\n mutateQuery,\n mutatorStore,\n [MUTATOR_HOOK_SYMBOL]: true,\n };\n }\n\n #invalidate<TPath extends string>(\n method: HTTPMethod,\n path: TPath,\n params: {\n pathParams?: MaybeExtractPathParamsOrWiden<TPath, string>;\n queryParams?: Record<string, string>;\n },\n ) {\n const prefixArray = getCacheKey(method, path, {\n pathParams: params?.pathParams,\n queryParams: params?.queryParams,\n });\n\n const prefix = prefixArray.map((k) => (typeof k === \"string\" ? k : k.get())).join(\"\");\n\n this.#invalidateKeys((key) => key.startsWith(prefix));\n }\n}\n\n/**\n * Create a client builder for fragments using the new fragment definition API.\n * This is the same as createClientBuilder but works with FragmentDefinition.\n */\nexport function createClientBuilder<\n TConfig,\n TOptions extends FragnoPublicConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext extends RequestThisContext,\n THandlerThisContext extends RequestThisContext,\n TRequestStorage,\n const TRoutesOrFactories extends readonly AnyRouteOrFactory[],\n TLinkedFragments extends Record<string, AnyFragnoInstantiatedFragment> = {},\n>(\n definition: FragmentDefinition<\n TConfig,\n TOptions,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n TRequestStorage,\n TLinkedFragments\n >,\n publicConfig: FragnoPublicClientConfig,\n routesOrFactories: TRoutesOrFactories,\n authorFetcherConfig?: FetcherConfig,\n): ClientBuilder<\n FlattenRouteFactories<TRoutesOrFactories>,\n FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>>\n> {\n // For client-side, we resolve route factories with dummy context\n // This will be removed by the bundle plugin anyway\n const dummyContext = {\n config: {} as TConfig,\n deps: {} as TDeps,\n services: {} as TBaseServices & TServices,\n serviceDeps: {},\n };\n\n const routes = resolveRouteFactories(dummyContext, routesOrFactories);\n\n const fragmentConfig: FragnoFragmentSharedConfig<FlattenRouteFactories<TRoutesOrFactories>> = {\n name: definition.name,\n routes,\n };\n\n const mountRoute = getMountRoute({\n name: definition.name,\n mountRoute: publicConfig.mountRoute,\n });\n const mergedFetcherConfig = mergeFetcherConfigs(authorFetcherConfig, publicConfig.fetcherConfig);\n const fullPublicConfig = {\n ...publicConfig,\n mountRoute,\n fetcherConfig: mergedFetcherConfig,\n };\n\n return new ClientBuilder(fullPublicConfig, fragmentConfig);\n}\n\nexport * from \"./client-error\";\nexport type { FetcherConfig, FragnoPublicClientConfig } from \"../api/shared-types\";\nexport type { FragnoFragmentSharedConfig } from \"../api/fragment-instantiator\";\n"],"mappings":"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"}
|
package/dist/client/vue.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { MaybeExtractPathParamsOrWiden, QueryParamsHint } from "../api/internal/
|
|
|
2
2
|
import { InferOr } from "../util/types-util.js";
|
|
3
3
|
import { NonGetHTTPMethod } from "../api/api.js";
|
|
4
4
|
import { FragnoClientError } from "./client-error.js";
|
|
5
|
-
import { FragnoClientHookData, FragnoClientMutatorData } from "./client.js";
|
|
5
|
+
import { FragnoClientHookData, FragnoClientMutatorData, FragnoStoreData } from "./client.js";
|
|
6
6
|
import { ReadableAtom, Store, StoreValue } from "nanostores";
|
|
7
7
|
import { DeepReadonly, Ref, ShallowRef, UnwrapNestedRefs } from "vue";
|
|
8
8
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
@@ -26,6 +26,10 @@ type FragnoVueMutator<_TMethod extends NonGetHTTPMethod, TPath$1 extends string,
|
|
|
26
26
|
error: Ref<FragnoClientError<TErrorCode$1[number]> | undefined>;
|
|
27
27
|
data: Ref<InferOr<TOutputSchema$1, undefined>>;
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Type helper that unwraps any Store fields of the object into StoreValues
|
|
31
|
+
*/
|
|
32
|
+
type FragnoVueStore<T extends object> = () => T extends Store<infer TStore> ? StoreValue<TStore> : { [K in keyof T]: T[K] extends Store ? StoreValue<T[K]> : T[K] };
|
|
29
33
|
/**
|
|
30
34
|
* Converts a Vue Ref to a NanoStore Atom.
|
|
31
35
|
*
|
|
@@ -34,8 +38,8 @@ type FragnoVueMutator<_TMethod extends NonGetHTTPMethod, TPath$1 extends string,
|
|
|
34
38
|
* @private
|
|
35
39
|
*/
|
|
36
40
|
declare function refToAtom<T>(ref: Ref<T>): ReadableAtom<T>;
|
|
37
|
-
declare function useFragno<T extends Record<string, unknown>>(clientObj: T): { [K in keyof T]: T[K] extends FragnoClientHookData<"GET", infer TPath, infer TOutputSchema, infer TErrorCode, infer TQueryParameters> ? FragnoVueHook<"GET", TPath, TOutputSchema, TErrorCode, TQueryParameters> : T[K] extends FragnoClientMutatorData<infer M, infer TPath, infer TInputSchema, infer TOutputSchema, infer TErrorCode, infer TQueryParameters> ? FragnoVueMutator<M, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters> : T[K] };
|
|
41
|
+
declare function useFragno<T extends Record<string, unknown>>(clientObj: T): { [K in keyof T]: T[K] extends FragnoClientHookData<"GET", infer TPath, infer TOutputSchema, infer TErrorCode, infer TQueryParameters> ? FragnoVueHook<"GET", TPath, TOutputSchema, TErrorCode, TQueryParameters> : T[K] extends FragnoClientMutatorData<infer M, infer TPath, infer TInputSchema, infer TOutputSchema, infer TErrorCode, infer TQueryParameters> ? FragnoVueMutator<M, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters> : T[K] extends FragnoStoreData<infer TStoreObj> ? FragnoVueStore<TStoreObj> : T[K] };
|
|
38
42
|
declare function useStore<SomeStore extends Store, Value extends StoreValue<SomeStore>>(store: SomeStore): DeepReadonly<UnwrapNestedRefs<ShallowRef<Value>>>;
|
|
39
43
|
//#endregion
|
|
40
|
-
export { FragnoVueHook, FragnoVueMutator, refToAtom, useFragno, useStore };
|
|
44
|
+
export { FragnoVueHook, FragnoVueMutator, FragnoVueStore, refToAtom, useFragno, useStore };
|
|
41
45
|
//# sourceMappingURL=vue.d.ts.map
|
package/dist/client/vue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue.d.ts","names":[],"sources":["../../src/client/vue.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"vue.d.ts","names":[],"sources":["../../src/client/vue.ts"],"sourcesContent":[],"mappings":"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"}
|