@fragno-dev/core 0.1.11 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +87 -69
- package/CHANGELOG.md +79 -0
- package/dist/api/api.d.ts +21 -2
- package/dist/api/api.d.ts.map +1 -1
- package/dist/api/api.js +2 -1
- package/dist/api/api.js.map +1 -1
- package/dist/api/bind-services.d.ts +0 -1
- package/dist/api/bind-services.d.ts.map +1 -1
- package/dist/api/bind-services.js.map +1 -1
- package/dist/api/error.d.ts.map +1 -1
- package/dist/api/error.js.map +1 -1
- package/dist/api/fragment-definition-builder.d.ts +32 -40
- package/dist/api/fragment-definition-builder.d.ts.map +1 -1
- package/dist/api/fragment-definition-builder.js +15 -21
- package/dist/api/fragment-definition-builder.js.map +1 -1
- package/dist/api/fragment-instantiator.d.ts +51 -30
- package/dist/api/fragment-instantiator.d.ts.map +1 -1
- package/dist/api/fragment-instantiator.js +201 -52
- package/dist/api/fragment-instantiator.js.map +1 -1
- package/dist/api/request-context-storage.d.ts +4 -0
- package/dist/api/request-context-storage.d.ts.map +1 -1
- package/dist/api/request-context-storage.js +6 -0
- package/dist/api/request-context-storage.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 +2 -2
- package/dist/api/request-middleware.d.ts.map +1 -1
- package/dist/api/request-middleware.js.map +1 -1
- package/dist/api/request-output-context.d.ts +1 -1
- package/dist/api/request-output-context.d.ts.map +1 -1
- package/dist/api/request-output-context.js.map +1 -1
- package/dist/api/route-caller.d.ts +30 -0
- package/dist/api/route-caller.d.ts.map +1 -0
- package/dist/api/route-caller.js +63 -0
- package/dist/api/route-caller.js.map +1 -0
- package/dist/api/route-handler-input-options.d.ts.map +1 -1
- package/dist/api/route.d.ts +8 -8
- package/dist/api/route.d.ts.map +1 -1
- package/dist/api/route.js.map +1 -1
- package/dist/api/shared-types.d.ts.map +1 -1
- package/dist/client/client-error.d.ts.map +1 -1
- package/dist/client/client-error.js.map +1 -1
- package/dist/client/client.d.ts +90 -50
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +128 -16
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.svelte.d.ts +6 -5
- package/dist/client/client.svelte.d.ts.map +1 -1
- package/dist/client/client.svelte.js +10 -2
- package/dist/client/client.svelte.js.map +1 -1
- package/dist/client/internal/ndjson-streaming.js.map +1 -1
- package/dist/client/react.d.ts +5 -4
- package/dist/client/react.d.ts.map +1 -1
- package/dist/client/react.js +104 -12
- package/dist/client/react.js.map +1 -1
- package/dist/client/solid.d.ts +7 -5
- package/dist/client/solid.d.ts.map +1 -1
- package/dist/client/solid.js +23 -9
- package/dist/client/solid.js.map +1 -1
- package/dist/client/vanilla.d.ts +16 -4
- package/dist/client/vanilla.d.ts.map +1 -1
- package/dist/client/vanilla.js +21 -1
- package/dist/client/vanilla.js.map +1 -1
- package/dist/client/vue.d.ts +10 -4
- package/dist/client/vue.d.ts.map +1 -1
- package/dist/client/vue.js +24 -1
- package/dist/client/vue.js.map +1 -1
- package/dist/id.d.ts +2 -0
- package/dist/id.js +3 -0
- package/dist/internal/cuid.d.ts +16 -0
- package/dist/internal/cuid.d.ts.map +1 -0
- package/dist/internal/cuid.js +82 -0
- package/dist/internal/cuid.js.map +1 -0
- 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 +7 -20
- package/dist/mod-client.d.ts.map +1 -1
- package/dist/mod-client.js +25 -13
- package/dist/mod-client.js.map +1 -1
- package/dist/mod.d.ts +8 -6
- package/dist/mod.js +3 -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 +6 -6
- package/dist/test/test.d.ts.map +1 -1
- package/dist/test/test.js.map +1 -1
- package/dist/util/ssr.js.map +1 -1
- package/package.json +42 -52
- package/src/api/api.test.ts +3 -1
- package/src/api/api.ts +28 -0
- package/src/api/bind-services.ts +0 -5
- package/src/api/error.ts +1 -0
- package/src/api/fragment-definition-builder.extend.test.ts +2 -1
- package/src/api/fragment-definition-builder.test.ts +2 -1
- package/src/api/fragment-definition-builder.ts +56 -112
- package/src/api/fragment-instantiator.test.ts +311 -166
- package/src/api/fragment-instantiator.ts +470 -131
- package/src/api/fragment-services.test.ts +1 -0
- package/src/api/internal/path-runtime.test.ts +8 -0
- package/src/api/internal/path-type.test.ts +3 -1
- package/src/api/internal/route.test.ts +1 -0
- package/src/api/request-context-storage.ts +7 -0
- package/src/api/request-input-context.test.ts +156 -2
- package/src/api/request-input-context.ts +87 -1
- package/src/api/request-middleware.test.ts +43 -2
- package/src/api/request-middleware.ts +4 -3
- package/src/api/request-output-context.test.ts +3 -1
- package/src/api/request-output-context.ts +2 -1
- package/src/api/route-caller.test.ts +195 -0
- package/src/api/route-caller.ts +167 -0
- package/src/api/route-handler-input-options.ts +2 -1
- package/src/api/route.test.ts +4 -2
- package/src/api/route.ts +9 -3
- package/src/api/shared-types.ts +2 -1
- package/src/client/client-builder.test.ts +4 -2
- package/src/client/client-error.test.ts +2 -1
- package/src/client/client-error.ts +1 -1
- package/src/client/client-types.test.ts +19 -5
- package/src/client/client.ssr.test.ts +6 -4
- package/src/client/client.svelte.test.ts +18 -9
- package/src/client/client.svelte.ts +38 -13
- package/src/client/client.test.ts +244 -10
- package/src/client/client.ts +473 -148
- package/src/client/internal/ndjson-streaming.test.ts +6 -3
- package/src/client/internal/ndjson-streaming.ts +1 -0
- package/src/client/react.test.ts +176 -6
- package/src/client/react.ts +226 -31
- package/src/client/solid.test.ts +29 -5
- package/src/client/solid.ts +60 -22
- package/src/client/vanilla.test.ts +148 -6
- package/src/client/vanilla.ts +63 -9
- package/src/client/vue.test.ts +397 -8
- package/src/client/vue.ts +74 -4
- package/src/id.ts +1 -0
- package/src/internal/cuid.test.ts +164 -0
- package/src/internal/cuid.ts +133 -0
- package/src/internal/trace-context.ts +35 -0
- package/src/mod-client.ts +55 -9
- package/src/mod.ts +9 -3
- package/src/runtime.ts +48 -0
- package/src/test/test.test.ts +4 -2
- package/src/test/test.ts +14 -7
- package/src/util/async.test.ts +1 -0
- package/src/util/content-type.test.ts +1 -0
- package/src/util/nanostores.test.ts +3 -1
- package/src/util/ssr.ts +1 -0
- package/tsconfig.json +1 -1
- package/tsdown.config.ts +2 -0
- package/vitest.config.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-middleware.js","names":["#deps","#services","#options","#route","#state","route"],"sources":["../../src/api/request-middleware.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ExtractRouteByPath, ExtractRoutePath } from \"../client/client\";\nimport type { HTTPMethod } from \"./api\";\nimport type { ExtractPathParams } from \"./internal/path\";\nimport
|
|
1
|
+
{"version":3,"file":"request-middleware.js","names":["#deps","#services","#options","#route","#state","route"],"sources":["../../src/api/request-middleware.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\nimport type { ExtractRouteByPath, ExtractRoutePath } from \"../client/client\";\nimport type { HTTPMethod } from \"./api\";\nimport type { ExtractPathParams } from \"./internal/path\";\nimport { MutableRequestState } from \"./mutable-request-state\";\nimport { RequestInputContext } from \"./request-input-context\";\nimport { OutputContext, RequestOutputContext } from \"./request-output-context\";\nimport type { AnyFragnoRouteConfig } from \"./route\";\n\nexport type FragnoMiddlewareCallback<\n TRoutes extends readonly AnyFragnoRouteConfig[],\n TDeps,\n TServices extends Record<string, unknown>,\n> = (\n inputContext: RequestMiddlewareInputContext<TRoutes>,\n outputContext: RequestMiddlewareOutputContext<TDeps, TServices>,\n) => Promise<Response | undefined> | Response | undefined;\n\nexport interface RequestMiddlewareOptions {\n path: string;\n method: HTTPMethod;\n request: Request;\n state: MutableRequestState;\n}\n\nexport class RequestMiddlewareOutputContext<\n const TDeps,\n const TServices extends Record<string, unknown>,\n> extends OutputContext<unknown, string> {\n readonly #deps: TDeps;\n readonly #services: TServices;\n\n constructor(deps: TDeps, services: TServices) {\n super();\n this.#deps = deps;\n this.#services = services;\n }\n\n get deps(): TDeps {\n return this.#deps;\n }\n\n get services(): TServices {\n return this.#services;\n }\n}\n\nexport class RequestMiddlewareInputContext<const TRoutes extends readonly AnyFragnoRouteConfig[]> {\n readonly #options: RequestMiddlewareOptions;\n readonly #route: TRoutes[number];\n readonly #state: MutableRequestState;\n\n constructor(routes: TRoutes, options: RequestMiddlewareOptions) {\n this.#options = options;\n this.#state = options.state;\n\n const route = routes.find(\n (route) => route.path === options.path && route.method === options.method,\n );\n\n if (!route) {\n throw new Error(`Route not found: ${options.path} ${options.method}`);\n }\n\n this.#route = route;\n }\n\n get path(): string {\n return this.#options.path;\n }\n\n get method(): HTTPMethod {\n return this.#options.method;\n }\n\n get pathParams(): Record<string, string> {\n return this.#state.pathParams;\n }\n\n get queryParams(): URLSearchParams {\n return this.#state.searchParams;\n }\n\n get headers(): Headers {\n return this.#state.headers;\n }\n\n get inputSchema(): StandardSchemaV1 | undefined {\n return this.#route.inputSchema;\n }\n\n get outputSchema(): StandardSchemaV1 | undefined {\n return this.#route.outputSchema;\n }\n\n /**\n * Access to the mutable request state.\n * Use this to modify query parameters, path parameters, or request body.\n *\n * @example\n * ```typescript\n * // Modify body\n * requestState.setBody({ modified: true });\n *\n * // Query params are already accessible via queryParams getter\n * // Path params are already accessible via pathParams getter\n * ```\n */\n get requestState(): MutableRequestState {\n return this.#state;\n }\n\n // Defined as a field so that `this` reference stays in tact when destructuring\n ifMatchesRoute = async <\n const TMethod extends HTTPMethod,\n const TPath extends ExtractRoutePath<TRoutes, TMethod>,\n const TRoute extends ExtractRouteByPath<TRoutes, TPath, TMethod> = ExtractRouteByPath<\n TRoutes,\n TPath,\n TMethod\n >,\n >(\n method: TMethod,\n path: TPath,\n handler: (\n ...args: Parameters<TRoute[\"handler\"]>\n ) => Promise<Response | undefined | void> | Response | undefined | void,\n ): Promise<Response | undefined> => {\n if (this.path !== path || this.method !== method) {\n return undefined;\n }\n\n // TODO(Wilco): We should support reading/modifying headers here.\n const inputContext = await RequestInputContext.fromRequest({\n request: this.#options.request,\n method: this.#options.method,\n path: path,\n pathParams: this.pathParams as ExtractPathParams<TPath>,\n inputSchema: this.#route.inputSchema,\n state: this.#state,\n });\n\n const outputContext = new RequestOutputContext(this.#route.outputSchema);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (handler as any)(inputContext, outputContext);\n };\n}\n"],"mappings":";;;;AA0BA,IAAa,iCAAb,cAGU,cAA+B;CACvC,CAASA;CACT,CAASC;CAET,YAAY,MAAa,UAAqB;AAC5C,SAAO;AACP,QAAKD,OAAQ;AACb,QAAKC,WAAY;;CAGnB,IAAI,OAAc;AAChB,SAAO,MAAKD;;CAGd,IAAI,WAAsB;AACxB,SAAO,MAAKC;;;AAIhB,IAAa,gCAAb,MAAkG;CAChG,CAASC;CACT,CAASC;CACT,CAASC;CAET,YAAY,QAAiB,SAAmC;AAC9D,QAAKF,UAAW;AAChB,QAAKE,QAAS,QAAQ;EAEtB,MAAM,QAAQ,OAAO,MAClB,YAAUC,QAAM,SAAS,QAAQ,QAAQA,QAAM,WAAW,QAAQ,OACpE;AAED,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,oBAAoB,QAAQ,KAAK,GAAG,QAAQ,SAAS;AAGvE,QAAKF,QAAS;;CAGhB,IAAI,OAAe;AACjB,SAAO,MAAKD,QAAS;;CAGvB,IAAI,SAAqB;AACvB,SAAO,MAAKA,QAAS;;CAGvB,IAAI,aAAqC;AACvC,SAAO,MAAKE,MAAO;;CAGrB,IAAI,cAA+B;AACjC,SAAO,MAAKA,MAAO;;CAGrB,IAAI,UAAmB;AACrB,SAAO,MAAKA,MAAO;;CAGrB,IAAI,cAA4C;AAC9C,SAAO,MAAKD,MAAO;;CAGrB,IAAI,eAA6C;AAC/C,SAAO,MAAKA,MAAO;;;;;;;;;;;;;;;CAgBrB,IAAI,eAAoC;AACtC,SAAO,MAAKC;;CAId,iBAAiB,OASf,QACA,MACA,YAGkC;AAClC,MAAI,KAAK,SAAS,QAAQ,KAAK,WAAW,OACxC;AAgBF,SAAO,MAAO,QAZO,MAAM,oBAAoB,YAAY;GACzD,SAAS,MAAKF,QAAS;GACvB,QAAQ,MAAKA,QAAS;GAChB;GACN,YAAY,KAAK;GACjB,aAAa,MAAKC,MAAO;GACzB,OAAO,MAAKC;GACb,CAAC,EAEoB,IAAI,qBAAqB,MAAKD,MAAO,aAAa,CAGd"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ContentlessStatusCode, StatusCode } from "../http/http-status.js";
|
|
2
|
-
import { ResponseStream } from "./internal/response-stream.js";
|
|
3
2
|
import { InferOrUnknown } from "../util/types-util.js";
|
|
3
|
+
import { ResponseStream } from "./internal/response-stream.js";
|
|
4
4
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
5
5
|
|
|
6
6
|
//#region src/api/request-output-context.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-output-context.d.ts","names":[],"sources":["../../src/api/request-output-context.ts"],"sourcesContent":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"request-output-context.d.ts","names":[],"sources":["../../src/api/request-output-context.ts"],"sourcesContent":[],"mappings":";;;;;;UAQU,uBAAuB,aAAa;EAApC,OAAA,CAAA,EACE,WADU;EAAW,MAAA,CAAA,EAEtB,CAFsB;EAAa,UAAA,CAAA,EAAA,MAAA;;AAEnC,uBAkCW,aAlCX,CAAA,aAAA,EAAA,yBAAA,MAAA,CAAA,CAAA;EAAC;AAkCZ;;;;EAQmB,KAAA,EAAA,CAAA;IAAA,OAAA;IAAA;EAEd,CAFc,EAAA;IAAe,OAAA,EAAA,MAAA;IACpB,IAAA,EAFkC,UAElC;EACT,CAAA,EAAA,YAAA,CAAA,EAFc,YAEd,GAF6B,UAE7B,EAAA,OAAA,CAAA,EADS,WACT,EAAA,GAAA,QAAA;EAiB2B,KAAA,EAAA,CAAA,YAAA,CAAA,EAAb,YAAa,CAAA,qBAAA,CAAA,GAAyB,qBAAzB,EAAA,OAAA,CAAA,EAClB,WADkB,EAAA,GAE3B,QAF2B;EAAb,IAAA,EAAA,CAAA,MAAA,EA6BP,OA7BO,EAAA,YAAA,CAAA,EA8BA,YA9BA,GA8Be,UA9Bf,EAAA,OAAA,CAAA,EA+BL,WA/BK,EAAA,GAgCd,QAhCc;EAAsC,UAAA,EAAA,CAAA,EAAA,EAAA,CAAA,MAAA,EAuDxC,cAvDwC,CAuDzB,OAvDyB,CAAA,EAAA,GAAA,IAAA,GAuDL,OAvDK,CAAA,IAAA,CAAA,EAAA;IAAA,OAAA;IAAA;EA6B7C,CAAA,CA7B6C,EAAA;IAC3C,OAAA,CAAA,EAAA,CAAA,KAAA,EA2DU,KA3DV,EAAA,MAAA,EA2DyB,cA3DzB,CA2DwC,OA3DxC,CAAA,EAAA,GAAA,IAAA,GA2D4D,OA3D5D,CAAA,IAAA,CAAA;IACT,OAAA,CAAA,EA2DW,WA3DX;EA2BO,CAAA,EAAA,GAkCP,QAlCO;;AACsB,cAqErB,oBArEqB,CAAA,4BAsEJ,gBAtEI,GAAA,SAAA,GAAA,SAAA,EAAA,yBAAA,MAAA,GAAA,MAAA,CAAA,SAwExB,aAxEwB,CAwEV,cAxEU,CAwEK,aAxEL,CAAA,EAwEqB,UAxErB,CAAA,CAAA;EACpB,CAAA,OAAA;EACT,WAAA,CAAA,YAAA,CAAA,EA0EwB,aA1ExB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-output-context.js","names":["mergedHeaders","#outputSchema"],"sources":["../../src/api/request-output-context.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ContentlessStatusCode, StatusCode } from \"../http/http-status\";\nimport {
|
|
1
|
+
{"version":3,"file":"request-output-context.js","names":["mergedHeaders","#outputSchema"],"sources":["../../src/api/request-output-context.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\nimport type { ContentlessStatusCode, StatusCode } from \"../http/http-status\";\nimport type { InferOrUnknown } from \"../util/types-util\";\nimport { ResponseStream } from \"./internal/response-stream\";\n\nexport type ResponseData = string | ArrayBuffer | ReadableStream | Uint8Array<ArrayBuffer>;\n\ninterface ResponseInit<T extends StatusCode = StatusCode> {\n headers?: HeadersInit;\n status?: T;\n statusText?: string;\n}\n\n/**\n * Utility function to merge headers from multiple sources.\n * Later headers override earlier ones.\n */\nfunction mergeHeaders(...headerSources: (HeadersInit | undefined)[]): HeadersInit | undefined {\n const mergedHeaders = new Headers();\n\n for (const headerSource of headerSources) {\n if (!headerSource) {\n continue;\n }\n\n if (headerSource instanceof Headers) {\n for (const [key, value] of headerSource.entries()) {\n mergedHeaders.set(key, value);\n }\n } else if (Array.isArray(headerSource)) {\n for (const [key, value] of headerSource) {\n mergedHeaders.set(key, value);\n }\n } else {\n for (const [key, value] of Object.entries(headerSource)) {\n mergedHeaders.set(key, value);\n }\n }\n }\n\n return mergedHeaders;\n}\n\nexport abstract class OutputContext<const TOutput, const TErrorCode extends string> {\n /**\n * Creates an error response.\n *\n * Shortcut for `throw new FragnoApiError(...)`\n */\n error = (\n { message, code }: { message: string; code: TErrorCode },\n initOrStatus?: ResponseInit | StatusCode,\n headers?: HeadersInit,\n ): Response => {\n if (typeof initOrStatus === \"undefined\") {\n return Response.json({ message: message, code }, { status: 500, headers });\n }\n\n if (typeof initOrStatus === \"number\") {\n return Response.json({ message: message, code }, { status: initOrStatus, headers });\n }\n\n const mergedHeaders = mergeHeaders(initOrStatus.headers, headers);\n return Response.json(\n { message: message, code },\n { status: initOrStatus.status, headers: mergedHeaders },\n );\n };\n\n empty = (\n initOrStatus?: ResponseInit<ContentlessStatusCode> | ContentlessStatusCode,\n headers?: HeadersInit,\n ): Response => {\n const defaultHeaders = {};\n\n if (typeof initOrStatus === \"undefined\") {\n const mergedHeaders = mergeHeaders(defaultHeaders, headers);\n return new Response(null, {\n status: 201,\n headers: mergedHeaders,\n });\n }\n\n if (typeof initOrStatus === \"number\") {\n const mergedHeaders = mergeHeaders(defaultHeaders, headers);\n return new Response(null, {\n status: initOrStatus,\n headers: mergedHeaders,\n });\n }\n\n const mergedHeaders = mergeHeaders(defaultHeaders, initOrStatus.headers, headers);\n return new Response(null, {\n status: initOrStatus.status,\n headers: mergedHeaders,\n });\n };\n\n json = (\n object: TOutput,\n initOrStatus?: ResponseInit | StatusCode,\n headers?: HeadersInit,\n ): Response => {\n if (typeof initOrStatus === \"undefined\") {\n return Response.json(object, {\n status: 200,\n headers,\n });\n }\n\n if (typeof initOrStatus === \"number\") {\n return Response.json(object, {\n status: initOrStatus,\n headers,\n });\n }\n\n const mergedHeaders = mergeHeaders(initOrStatus.headers, headers);\n return Response.json(object, {\n status: initOrStatus.status,\n headers: mergedHeaders,\n });\n };\n\n jsonStream = (\n cb: (stream: ResponseStream<TOutput>) => void | Promise<void>,\n {\n onError,\n headers,\n }: {\n onError?: (error: Error, stream: ResponseStream<TOutput>) => void | Promise<void>;\n headers?: HeadersInit;\n } = {},\n ): Response => {\n // Note: this is intentionally an arrow function (=>) to keep `this` context.\n const defaultHeaders = {\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"transfer-encoding\": \"chunked\",\n \"cache-control\": \"no-cache\",\n };\n\n const { readable, writable } = new TransformStream();\n const stream = new ResponseStream(writable, readable);\n\n (async () => {\n try {\n await cb(stream);\n } catch (e) {\n if (e === undefined) {\n // If reading is canceled without a reason value (e.g. by StreamingApi)\n // then the .pipeTo() promise will reject with undefined.\n // In this case, do nothing because the stream is already closed.\n } else if (e instanceof Error && onError) {\n await onError(e, stream);\n } else {\n console.error(e);\n }\n } finally {\n stream.close();\n }\n })();\n\n return new Response(stream.responseReadable, {\n status: 200,\n headers: mergeHeaders(defaultHeaders, headers),\n });\n };\n}\n\nexport class RequestOutputContext<\n const TOutputSchema extends StandardSchemaV1 | undefined = undefined,\n const TErrorCode extends string = string,\n> extends OutputContext<InferOrUnknown<TOutputSchema>, TErrorCode> {\n // eslint-disable-next-line no-unused-private-class-members\n #outputSchema?: TOutputSchema;\n\n constructor(outputSchema?: TOutputSchema) {\n super();\n this.#outputSchema = outputSchema;\n }\n}\n"],"mappings":";;;;;;;AAkBA,SAAS,aAAa,GAAG,eAAqE;CAC5F,MAAM,gBAAgB,IAAI,SAAS;AAEnC,MAAK,MAAM,gBAAgB,eAAe;AACxC,MAAI,CAAC,aACH;AAGF,MAAI,wBAAwB,QAC1B,MAAK,MAAM,CAAC,KAAK,UAAU,aAAa,SAAS,CAC/C,eAAc,IAAI,KAAK,MAAM;WAEtB,MAAM,QAAQ,aAAa,CACpC,MAAK,MAAM,CAAC,KAAK,UAAU,aACzB,eAAc,IAAI,KAAK,MAAM;MAG/B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,CACrD,eAAc,IAAI,KAAK,MAAM;;AAKnC,QAAO;;AAGT,IAAsB,gBAAtB,MAAoF;;;;;;CAMlF,SACE,EAAE,SAAS,QACX,cACA,YACa;AACb,MAAI,OAAO,iBAAiB,YAC1B,QAAO,SAAS,KAAK;GAAW;GAAS;GAAM,EAAE;GAAE,QAAQ;GAAK;GAAS,CAAC;AAG5E,MAAI,OAAO,iBAAiB,SAC1B,QAAO,SAAS,KAAK;GAAW;GAAS;GAAM,EAAE;GAAE,QAAQ;GAAc;GAAS,CAAC;EAGrF,MAAM,gBAAgB,aAAa,aAAa,SAAS,QAAQ;AACjE,SAAO,SAAS,KACd;GAAW;GAAS;GAAM,EAC1B;GAAE,QAAQ,aAAa;GAAQ,SAAS;GAAe,CACxD;;CAGH,SACE,cACA,YACa;EACb,MAAM,iBAAiB,EAAE;AAEzB,MAAI,OAAO,iBAAiB,aAAa;GACvC,MAAMA,kBAAgB,aAAa,gBAAgB,QAAQ;AAC3D,UAAO,IAAI,SAAS,MAAM;IACxB,QAAQ;IACR,SAASA;IACV,CAAC;;AAGJ,MAAI,OAAO,iBAAiB,UAAU;GACpC,MAAMA,kBAAgB,aAAa,gBAAgB,QAAQ;AAC3D,UAAO,IAAI,SAAS,MAAM;IACxB,QAAQ;IACR,SAASA;IACV,CAAC;;EAGJ,MAAM,gBAAgB,aAAa,gBAAgB,aAAa,SAAS,QAAQ;AACjF,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ,aAAa;GACrB,SAAS;GACV,CAAC;;CAGJ,QACE,QACA,cACA,YACa;AACb,MAAI,OAAO,iBAAiB,YAC1B,QAAO,SAAS,KAAK,QAAQ;GAC3B,QAAQ;GACR;GACD,CAAC;AAGJ,MAAI,OAAO,iBAAiB,SAC1B,QAAO,SAAS,KAAK,QAAQ;GAC3B,QAAQ;GACR;GACD,CAAC;EAGJ,MAAM,gBAAgB,aAAa,aAAa,SAAS,QAAQ;AACjE,SAAO,SAAS,KAAK,QAAQ;GAC3B,QAAQ,aAAa;GACrB,SAAS;GACV,CAAC;;CAGJ,cACE,IACA,EACE,SACA,YAIE,EAAE,KACO;EAEb,MAAM,iBAAiB;GACrB,gBAAgB;GAChB,qBAAqB;GACrB,iBAAiB;GAClB;EAED,MAAM,EAAE,UAAU,aAAa,IAAI,iBAAiB;EACpD,MAAM,SAAS,IAAI,eAAe,UAAU,SAAS;AAErD,GAAC,YAAY;AACX,OAAI;AACF,UAAM,GAAG,OAAO;YACT,GAAG;AACV,QAAI,MAAM,QAAW,YAIV,aAAa,SAAS,QAC/B,OAAM,QAAQ,GAAG,OAAO;QAExB,SAAQ,MAAM,EAAE;aAEV;AACR,WAAO,OAAO;;MAEd;AAEJ,SAAO,IAAI,SAAS,OAAO,kBAAkB;GAC3C,QAAQ;GACR,SAAS,aAAa,gBAAgB,QAAQ;GAC/C,CAAC;;;AAIN,IAAa,uBAAb,cAGU,cAAyD;CAEjE;CAEA,YAAY,cAA8B;AACxC,SAAO;AACP,QAAKC,eAAgB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { InferOrUnknown } from "../util/types-util.js";
|
|
2
|
+
import { AnyFragnoRouteConfig } from "./route.js";
|
|
3
|
+
import { FragnoResponse } from "./fragno-response.js";
|
|
4
|
+
import { RouteHandlerInputOptions } from "./route-handler-input-options.js";
|
|
5
|
+
import { ExtractRouteByPath, ExtractRoutePath } from "../client/client.js";
|
|
6
|
+
import { HTTPMethod } from "./api.js";
|
|
7
|
+
|
|
8
|
+
//#region src/api/route-caller.d.ts
|
|
9
|
+
type RouteCallerConfig = {
|
|
10
|
+
baseUrl: string | URL;
|
|
11
|
+
mountRoute?: string;
|
|
12
|
+
baseHeaders?: HeadersInit;
|
|
13
|
+
fetch: (request: Request) => Promise<Response>;
|
|
14
|
+
redirect?: RequestRedirect;
|
|
15
|
+
};
|
|
16
|
+
type FragmentLike = {
|
|
17
|
+
routes?: readonly AnyFragnoRouteConfig[];
|
|
18
|
+
callRoute?: (...args: never[]) => Promise<unknown>;
|
|
19
|
+
};
|
|
20
|
+
type RouteCallerPath<TRoutes$1 extends readonly AnyFragnoRouteConfig[], TMethod extends HTTPMethod> = [ExtractRoutePath<TRoutes$1, TMethod>] extends [never] ? string : ExtractRoutePath<TRoutes$1, TMethod>;
|
|
21
|
+
type RouteCallerMatch<TRoutes$1 extends readonly AnyFragnoRouteConfig[], TMethod extends HTTPMethod, TPath extends string> = [ExtractRouteByPath<TRoutes$1, TPath, TMethod>] extends [never] ? AnyFragnoRouteConfig : ExtractRouteByPath<TRoutes$1, TPath, TMethod>;
|
|
22
|
+
type RouteCallerForFragment<TFragment extends FragmentLike> = TFragment extends {
|
|
23
|
+
routes: infer TRoutes extends readonly AnyFragnoRouteConfig[];
|
|
24
|
+
} ? <TMethod extends HTTPMethod, TPath extends RouteCallerPath<TRoutes, TMethod>>(method: TMethod, path: TPath, inputOptions?: RouteHandlerInputOptions<TPath, RouteCallerMatch<TRoutes, TMethod, TPath>["inputSchema"]>) => Promise<FragnoResponse<InferOrUnknown<NonNullable<RouteCallerMatch<TRoutes, TMethod, TPath>["outputSchema"]>>>> : TFragment extends {
|
|
25
|
+
callRoute: (...args: never[]) => Promise<unknown>;
|
|
26
|
+
} ? TFragment["callRoute"] : never;
|
|
27
|
+
declare function createRouteCaller<TFragment extends FragmentLike>(config: RouteCallerConfig): RouteCallerForFragment<TFragment>;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { RouteCallerConfig, RouteCallerForFragment, createRouteCaller };
|
|
30
|
+
//# sourceMappingURL=route-caller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-caller.d.ts","names":[],"sources":["../../src/api/route-caller.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAWY,iBAAA;oBACQ;EADR,UAAA,CAAA,EAAA,MAAA;EACQ,WAAA,CAAA,EAEJ,WAFI;EAEJ,KAAA,EAAA,CAAA,OAAA,EACG,OADH,EAAA,GACe,OADf,CACuB,QADvB,CAAA;EACG,QAAA,CAAA,EACN,eADM;CAAoB;KAMlC,YAAA,GAN0B;EAClB,MAAA,CAAA,EAAA,SAMO,oBANP,EAAA;EAAe,SAAA,CAAA,EAAA,CAAA,GAAA,IAAA,EAAA,KAAA,EAAA,EAAA,GAOQ,OAPR,CAAA,OAAA,CAAA;AAC1B,CAAA;AAMyC,KAGtC,eAAA,CAAA,kBAAe,SACO,oBADP,EAAA,EAAA,gBAEF,UAFE,CAAA,GAAA,CAGf,gBAHe,CAGE,SAHF,EAGW,OAHX,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,MAAA,GAKhB,gBALgB,CAKC,SALD,EAKU,OALV,CAAA;KAOf,gBANsB,CAAA,kBAAA,SAOA,oBAPA,EAAA,EAAA,gBAQT,UARS,EAAA,cAAA,MAAA,CAAA,GAAA,CAUtB,kBAVsB,CAUH,SAVG,EAUM,KAVN,EAUa,OAVb,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAWvB,oBAXuB,GAYvB,kBAZuB,CAYJ,SAZI,EAYK,KAZL,EAYY,OAZZ,CAAA;AACT,KAaN,sBAbM,CAAA,kBAamC,YAbnC,CAAA,GAamD,SAbnD,SAAA;EACI,MAAA,EAAA,KAAA,iBAAA,SAamB,oBAbnB,EAAA;CAAS,GAAA,CAAA,gBAeV,UAfU,EAAA,cAegB,eAfhB,CAegC,OAfhC,EAeyC,OAfzC,CAAA,CAAA,CAAA,MAAA,EAgBjB,OAhBiB,EAAA,IAAA,EAiBnB,KAjBmB,EAAA,YAAA,CAAA,EAkBV,wBAlBU,CAmBvB,KAnBuB,EAoBvB,gBApBuB,CAoBN,OApBM,EAoBG,OApBH,EAoBY,KApBZ,CAAA,CAAA,aAAA,CAAA,CAAA,EAAA,GAsBtB,OAtBsB,CAuBzB,cAvByB,CAwBvB,cAxBuB,CAwBR,WAxBQ,CAwBI,gBAxBJ,CAwBqB,OAxBrB,EAwB8B,OAxB9B,EAwBuC,KAxBvC,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GA2B3B,SA3B2B,SAAA;EAA1B,SAAA,EAAA,CAAA,GAAA,IAAA,EAAA,KAAA,EAAA,EAAA,GA2BoD,OA3BpD,CAAA,OAAA,CAAA;CAEgB,GA0Bf,SA1Be,CAAA,WAAA,CAAA,GAAA,KAAA;AAAS,iBA4Cd,iBA5Cc,CAAA,kBA4CsB,YA5CtB,CAAA,CAAA,MAAA,EA6CpB,iBA7CoB,CAAA,EA8C3B,sBA9C2B,CA8CJ,SA9CI,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { parseFragnoResponse } from "./fragno-response.js";
|
|
2
|
+
import { buildPath } from "./internal/path.js";
|
|
3
|
+
|
|
4
|
+
//#region src/api/route-caller.ts
|
|
5
|
+
function isArrayBufferView(value) {
|
|
6
|
+
return ArrayBuffer.isView(value) && value.buffer instanceof ArrayBuffer;
|
|
7
|
+
}
|
|
8
|
+
function buildMountedPath(mountRoute, pathname) {
|
|
9
|
+
const normalizedMount = mountRoute === "/" ? "" : mountRoute.endsWith("/") ? mountRoute.slice(0, -1) : mountRoute;
|
|
10
|
+
const pathPart = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
11
|
+
if (!normalizedMount) return pathPart;
|
|
12
|
+
return `${normalizedMount.startsWith("/") ? normalizedMount : `/${normalizedMount}`}${pathPart}`;
|
|
13
|
+
}
|
|
14
|
+
function createRouteCaller(config) {
|
|
15
|
+
const { baseUrl, fetch } = config;
|
|
16
|
+
const mountRoute = config.mountRoute ?? "";
|
|
17
|
+
const baseHeaders = config.baseHeaders ? new Headers(config.baseHeaders) : void 0;
|
|
18
|
+
const redirect = config.redirect ?? "manual";
|
|
19
|
+
const callRoute = async (method, path, inputOptions) => {
|
|
20
|
+
const headers = baseHeaders ? new Headers(baseHeaders) : new Headers();
|
|
21
|
+
const explicitHeaders = inputOptions?.headers ? inputOptions.headers instanceof Headers ? inputOptions.headers : new Headers(inputOptions.headers) : null;
|
|
22
|
+
if (explicitHeaders) for (const [key, value] of explicitHeaders.entries()) headers.set(key, value);
|
|
23
|
+
const hasExplicitContentType = explicitHeaders?.has("content-type") ?? false;
|
|
24
|
+
const searchParams = inputOptions?.query instanceof URLSearchParams ? new URLSearchParams(inputOptions.query) : new URLSearchParams();
|
|
25
|
+
if (inputOptions?.query && !(inputOptions.query instanceof URLSearchParams)) {
|
|
26
|
+
for (const [key, value] of Object.entries(inputOptions.query)) if (value !== void 0) searchParams.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
const pathname = buildPath(path, inputOptions?.pathParams ?? {});
|
|
29
|
+
const url = new URL(buildMountedPath(mountRoute, pathname), baseUrl);
|
|
30
|
+
url.search = searchParams.toString();
|
|
31
|
+
let body;
|
|
32
|
+
if (inputOptions && "body" in inputOptions) {
|
|
33
|
+
const rawBody = inputOptions.body;
|
|
34
|
+
if (rawBody instanceof FormData || rawBody instanceof Blob) {
|
|
35
|
+
body = rawBody;
|
|
36
|
+
if (!hasExplicitContentType) headers.delete("content-type");
|
|
37
|
+
} else if (rawBody instanceof ReadableStream) {
|
|
38
|
+
body = rawBody;
|
|
39
|
+
if (!hasExplicitContentType) headers.delete("content-type");
|
|
40
|
+
} else if (rawBody instanceof ArrayBuffer) {
|
|
41
|
+
body = rawBody;
|
|
42
|
+
if (!hasExplicitContentType) headers.delete("content-type");
|
|
43
|
+
} else if (isArrayBufferView(rawBody)) {
|
|
44
|
+
body = rawBody;
|
|
45
|
+
if (!hasExplicitContentType) headers.delete("content-type");
|
|
46
|
+
} else if (rawBody !== void 0) {
|
|
47
|
+
body = JSON.stringify(rawBody);
|
|
48
|
+
if (!hasExplicitContentType) headers.set("content-type", "application/json");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return parseFragnoResponse(await fetch(new Request(url, {
|
|
52
|
+
method,
|
|
53
|
+
headers,
|
|
54
|
+
body,
|
|
55
|
+
redirect
|
|
56
|
+
})));
|
|
57
|
+
};
|
|
58
|
+
return callRoute;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { createRouteCaller };
|
|
63
|
+
//# sourceMappingURL=route-caller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-caller.js","names":["body: BodyInit | undefined"],"sources":["../../src/api/route-caller.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\nimport type { ExtractRouteByPath, ExtractRoutePath } from \"../client/client\";\nimport type { InferOrUnknown } from \"../util/types-util\";\nimport type { HTTPMethod } from \"./api\";\nimport type { FragnoResponse } from \"./fragno-response\";\nimport { parseFragnoResponse } from \"./fragno-response\";\nimport { buildPath, type ExtractPathParams } from \"./internal/path\";\nimport type { AnyFragnoRouteConfig } from \"./route\";\nimport type { RouteHandlerInputOptions } from \"./route-handler-input-options\";\n\nexport type RouteCallerConfig = {\n baseUrl: string | URL;\n mountRoute?: string;\n baseHeaders?: HeadersInit;\n fetch: (request: Request) => Promise<Response>;\n redirect?: RequestRedirect;\n};\n\ntype ArrayBufferViewOfArrayBuffer = ArrayBufferView & { buffer: ArrayBuffer };\n\ntype FragmentLike = {\n routes?: readonly AnyFragnoRouteConfig[];\n callRoute?: (...args: never[]) => Promise<unknown>;\n};\n\ntype RouteCallerPath<\n TRoutes extends readonly AnyFragnoRouteConfig[],\n TMethod extends HTTPMethod,\n> = [ExtractRoutePath<TRoutes, TMethod>] extends [never]\n ? string\n : ExtractRoutePath<TRoutes, TMethod>;\n\ntype RouteCallerMatch<\n TRoutes extends readonly AnyFragnoRouteConfig[],\n TMethod extends HTTPMethod,\n TPath extends string,\n> = [ExtractRouteByPath<TRoutes, TPath, TMethod>] extends [never]\n ? AnyFragnoRouteConfig\n : ExtractRouteByPath<TRoutes, TPath, TMethod>;\n\nexport type RouteCallerForFragment<TFragment extends FragmentLike> = TFragment extends {\n routes: infer TRoutes extends readonly AnyFragnoRouteConfig[];\n}\n ? <TMethod extends HTTPMethod, TPath extends RouteCallerPath<TRoutes, TMethod>>(\n method: TMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<\n TPath,\n RouteCallerMatch<TRoutes, TMethod, TPath>[\"inputSchema\"]\n >,\n ) => Promise<\n FragnoResponse<\n InferOrUnknown<NonNullable<RouteCallerMatch<TRoutes, TMethod, TPath>[\"outputSchema\"]>>\n >\n >\n : TFragment extends { callRoute: (...args: never[]) => Promise<unknown> }\n ? TFragment[\"callRoute\"]\n : never;\n\nfunction isArrayBufferView(value: unknown): value is ArrayBufferViewOfArrayBuffer {\n return ArrayBuffer.isView(value) && value.buffer instanceof ArrayBuffer;\n}\n\nfunction buildMountedPath(mountRoute: string, pathname: string): string {\n const normalizedMount =\n mountRoute === \"/\" ? \"\" : mountRoute.endsWith(\"/\") ? mountRoute.slice(0, -1) : mountRoute;\n const pathPart = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (!normalizedMount) {\n return pathPart;\n }\n const mountPart = normalizedMount.startsWith(\"/\") ? normalizedMount : `/${normalizedMount}`;\n return `${mountPart}${pathPart}`;\n}\n\nexport function createRouteCaller<TFragment extends FragmentLike>(\n config: RouteCallerConfig,\n): RouteCallerForFragment<TFragment> {\n const { baseUrl, fetch } = config;\n const mountRoute = config.mountRoute ?? \"\";\n const baseHeaders = config.baseHeaders ? new Headers(config.baseHeaders) : undefined;\n const redirect = config.redirect ?? \"manual\";\n\n const callRoute = async <TPath extends string>(\n method: HTTPMethod,\n path: TPath,\n inputOptions?: RouteHandlerInputOptions<TPath, StandardSchemaV1 | undefined>,\n ): Promise<FragnoResponse<unknown>> => {\n const headers = baseHeaders ? new Headers(baseHeaders) : new Headers();\n const explicitHeaders = inputOptions?.headers\n ? inputOptions.headers instanceof Headers\n ? inputOptions.headers\n : new Headers(inputOptions.headers)\n : null;\n\n if (explicitHeaders) {\n for (const [key, value] of explicitHeaders.entries()) {\n headers.set(key, value);\n }\n }\n\n const hasExplicitContentType = explicitHeaders?.has(\"content-type\") ?? false;\n\n const searchParams =\n inputOptions?.query instanceof URLSearchParams\n ? new URLSearchParams(inputOptions.query)\n : new URLSearchParams();\n\n if (inputOptions?.query && !(inputOptions.query instanceof URLSearchParams)) {\n for (const [key, value] of Object.entries(inputOptions.query)) {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n }\n }\n\n const pathParams = (inputOptions?.pathParams ?? {}) as ExtractPathParams<TPath>;\n const pathname = buildPath(path, pathParams);\n const url = new URL(buildMountedPath(mountRoute, pathname), baseUrl);\n url.search = searchParams.toString();\n\n let body: BodyInit | undefined;\n if (inputOptions && \"body\" in inputOptions) {\n const rawBody = (inputOptions as { body?: unknown }).body;\n\n if (rawBody instanceof FormData || rawBody instanceof Blob) {\n body = rawBody;\n if (!hasExplicitContentType) {\n headers.delete(\"content-type\");\n }\n } else if (rawBody instanceof ReadableStream) {\n body = rawBody;\n if (!hasExplicitContentType) {\n headers.delete(\"content-type\");\n }\n } else if (rawBody instanceof ArrayBuffer) {\n body = rawBody;\n if (!hasExplicitContentType) {\n headers.delete(\"content-type\");\n }\n } else if (isArrayBufferView(rawBody)) {\n body = rawBody;\n if (!hasExplicitContentType) {\n headers.delete(\"content-type\");\n }\n } else if (rawBody !== undefined) {\n body = JSON.stringify(rawBody);\n if (!hasExplicitContentType) {\n headers.set(\"content-type\", \"application/json\");\n }\n }\n }\n\n const response = await fetch(\n new Request(url, {\n method,\n headers,\n body,\n redirect,\n }),\n );\n\n return parseFragnoResponse(response);\n };\n\n return callRoute as RouteCallerForFragment<TFragment>;\n}\n"],"mappings":";;;;AA4DA,SAAS,kBAAkB,OAAuD;AAChF,QAAO,YAAY,OAAO,MAAM,IAAI,MAAM,kBAAkB;;AAG9D,SAAS,iBAAiB,YAAoB,UAA0B;CACtE,MAAM,kBACJ,eAAe,MAAM,KAAK,WAAW,SAAS,IAAI,GAAG,WAAW,MAAM,GAAG,GAAG,GAAG;CACjF,MAAM,WAAW,SAAS,WAAW,IAAI,GAAG,WAAW,IAAI;AAC3D,KAAI,CAAC,gBACH,QAAO;AAGT,QAAO,GADW,gBAAgB,WAAW,IAAI,GAAG,kBAAkB,IAAI,oBACpD;;AAGxB,SAAgB,kBACd,QACmC;CACnC,MAAM,EAAE,SAAS,UAAU;CAC3B,MAAM,aAAa,OAAO,cAAc;CACxC,MAAM,cAAc,OAAO,cAAc,IAAI,QAAQ,OAAO,YAAY,GAAG;CAC3E,MAAM,WAAW,OAAO,YAAY;CAEpC,MAAM,YAAY,OAChB,QACA,MACA,iBACqC;EACrC,MAAM,UAAU,cAAc,IAAI,QAAQ,YAAY,GAAG,IAAI,SAAS;EACtE,MAAM,kBAAkB,cAAc,UAClC,aAAa,mBAAmB,UAC9B,aAAa,UACb,IAAI,QAAQ,aAAa,QAAQ,GACnC;AAEJ,MAAI,gBACF,MAAK,MAAM,CAAC,KAAK,UAAU,gBAAgB,SAAS,CAClD,SAAQ,IAAI,KAAK,MAAM;EAI3B,MAAM,yBAAyB,iBAAiB,IAAI,eAAe,IAAI;EAEvE,MAAM,eACJ,cAAc,iBAAiB,kBAC3B,IAAI,gBAAgB,aAAa,MAAM,GACvC,IAAI,iBAAiB;AAE3B,MAAI,cAAc,SAAS,EAAE,aAAa,iBAAiB,kBACzD;QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,MAAM,CAC3D,KAAI,UAAU,OACZ,cAAa,IAAI,KAAK,MAAM;;EAMlC,MAAM,WAAW,UAAU,MADP,cAAc,cAAc,EAAE,CACN;EAC5C,MAAM,MAAM,IAAI,IAAI,iBAAiB,YAAY,SAAS,EAAE,QAAQ;AACpE,MAAI,SAAS,aAAa,UAAU;EAEpC,IAAIA;AACJ,MAAI,gBAAgB,UAAU,cAAc;GAC1C,MAAM,UAAW,aAAoC;AAErD,OAAI,mBAAmB,YAAY,mBAAmB,MAAM;AAC1D,WAAO;AACP,QAAI,CAAC,uBACH,SAAQ,OAAO,eAAe;cAEvB,mBAAmB,gBAAgB;AAC5C,WAAO;AACP,QAAI,CAAC,uBACH,SAAQ,OAAO,eAAe;cAEvB,mBAAmB,aAAa;AACzC,WAAO;AACP,QAAI,CAAC,uBACH,SAAQ,OAAO,eAAe;cAEvB,kBAAkB,QAAQ,EAAE;AACrC,WAAO;AACP,QAAI,CAAC,uBACH,SAAQ,OAAO,eAAe;cAEvB,YAAY,QAAW;AAChC,WAAO,KAAK,UAAU,QAAQ;AAC9B,QAAI,CAAC,uBACH,SAAQ,IAAI,gBAAgB,mBAAmB;;;AAcrD,SAAO,oBATU,MAAM,MACrB,IAAI,QAAQ,KAAK;GACf;GACA;GACA;GACA;GACD,CAAC,CACH,CAEmC;;AAGtC,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-handler-input-options.d.ts","names":[],"sources":["../../src/api/route-handler-input-options.ts"],"sourcesContent":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"route-handler-input-options.d.ts","names":[],"sources":["../../src/api/route-handler-input-options.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQA;AAEuB,KAFX,wBAEW,CAAA,cAAA,MAAA,EAAA,qBAAA,gBAAA,GAAA,SAAA,CAAA,GAAA;EAEU,UAAA,CAAA,EAAlB,iBAAkB,CAAA,KAAA,CAAA;EAAlB,KAAA,CAAA,EACL,eADK,GACa,MADb,CAAA,MAAA,EAAA,MAAA,CAAA;EACL,OAAA,CAAA,EACE,OADF,GACY,MADZ,CAAA,MAAA,EAAA,MAAA,CAAA;CAAkB,GAAA,CAEvB,YAFuB,SAAA,SAAA,GAAA;EAChB,IAAA,CAAA,EAAA,KAAA;CAAU,GAAA;EACjB,IAAA,EAA4D,OAA5D,CAAoE,YAApE,EAAA,OAAA,CAAA;CAAoE,CAAA"}
|
package/dist/api/route.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { FragnoRouteConfig, HTTPMethod, RequestThisContext } from "./api.js";
|
|
2
1
|
import { BoundServices } from "./bind-services.js";
|
|
3
2
|
import { FragmentDefinition } from "./fragment-definition-builder.js";
|
|
3
|
+
import { FragnoRouteConfig, HTTPMethod, RequestThisContext } from "./api.js";
|
|
4
4
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
5
5
|
|
|
6
6
|
//#region src/api/route.d.ts
|
|
@@ -31,13 +31,13 @@ declare function defineRoute<const TMethod extends HTTPMethod, const TPath exten
|
|
|
31
31
|
declare function defineRoute<const TMethod extends HTTPMethod, const TPath extends string, const TInputSchema extends StandardSchemaV1, const TOutputSchema extends StandardSchemaV1 | undefined, const TErrorCode extends string = string, const TQueryParameters extends string = string, const TThisContext extends RequestThisContext = RequestThisContext>(config: FragnoRouteConfig<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters, TThisContext> & {
|
|
32
32
|
inputSchema: TInputSchema;
|
|
33
33
|
}): FragnoRouteConfig<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters, TThisContext>;
|
|
34
|
-
type AnyFragmentDefinition = FragmentDefinition<any, any, any, any, any, any, any, any, any, any>;
|
|
35
|
-
type ExtractFragmentConfig<T> = T extends FragmentDefinition<infer TConfig, any, any, any, any, any, any, any, any, any> ? TConfig : never;
|
|
36
|
-
type ExtractFragmentDeps<T> = T extends FragmentDefinition<any, any, infer TDeps, any, any, any, any, any, any, any> ? TDeps : never;
|
|
37
|
-
type ExtractFragmentServices<T> = T extends FragmentDefinition<any, any, any, infer TBaseServices, infer TServices, any, any, any, any, any> ? BoundServices<TBaseServices & TServices> : never;
|
|
38
|
-
type ExtractFragmentServiceDeps<T> = T extends FragmentDefinition<any, any, any, any, any, infer TServiceDependencies, any, any, any, any> ? TServiceDependencies : never;
|
|
39
|
-
type ExtractFragmentServiceThisContext<T> = T extends FragmentDefinition<any, any, any, any, any, any, any, infer TServiceThisContext, any, any> ? TServiceThisContext : RequestThisContext;
|
|
40
|
-
type ExtractFragmentHandlerThisContext<T> = T extends FragmentDefinition<any, any, any, any, any, any, any, any, infer THandlerThisContext, any> ? THandlerThisContext : RequestThisContext;
|
|
34
|
+
type AnyFragmentDefinition = FragmentDefinition<any, any, any, any, any, any, any, any, any, any, any>;
|
|
35
|
+
type ExtractFragmentConfig<T> = T extends FragmentDefinition<infer TConfig, any, any, any, any, any, any, any, any, any, any> ? TConfig : never;
|
|
36
|
+
type ExtractFragmentDeps<T> = T extends FragmentDefinition<any, any, infer TDeps, any, any, any, any, any, any, any, any> ? TDeps : never;
|
|
37
|
+
type ExtractFragmentServices<T> = T extends FragmentDefinition<any, any, any, infer TBaseServices, infer TServices, any, any, any, any, any, any> ? BoundServices<TBaseServices & TServices> : never;
|
|
38
|
+
type ExtractFragmentServiceDeps<T> = T extends FragmentDefinition<any, any, any, any, any, infer TServiceDependencies, any, any, any, any, any> ? TServiceDependencies : never;
|
|
39
|
+
type ExtractFragmentServiceThisContext<T> = T extends FragmentDefinition<any, any, any, any, any, any, any, infer TServiceThisContext, any, any, any> ? TServiceThisContext : RequestThisContext;
|
|
40
|
+
type ExtractFragmentHandlerThisContext<T> = T extends FragmentDefinition<any, any, any, any, any, any, any, any, infer THandlerThisContext, any, any> ? THandlerThisContext : RequestThisContext;
|
|
41
41
|
type ExtractFragmentThisContext<T> = ExtractFragmentServiceThisContext<T>;
|
|
42
42
|
declare function defineRoutes<const TDefinition extends AnyFragmentDefinition>(definition: TDefinition): {
|
|
43
43
|
create: <const TRoutes$1 extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string, ExtractFragmentHandlerThisContext<TDefinition>>[]>(fn: (context: RouteFactoryContext<ExtractFragmentConfig<TDefinition>, ExtractFragmentDeps<TDefinition>, ExtractFragmentServices<TDefinition>, ExtractFragmentServiceDeps<TDefinition>> & {
|
package/dist/api/route.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","names":[],"sources":["../../src/api/route.ts"],"sourcesContent":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"route.d.ts","names":[],"sources":["../../src/api/route.ts"],"sourcesContent":[],"mappings":"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"}
|
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\";\n\nimport type { FragnoRouteConfig, HTTPMethod, RequestThisContext } from \"./api\";\nimport type { BoundServices } from \"./bind-services\";\nimport type { FragmentDefinition } from \"./fragment-definition-builder\";\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":";;;;;AAsDA,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-types.d.ts","names":[],"sources":["../../src/api/shared-types.ts"],"sourcesContent":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"shared-types.d.ts","names":[],"sources":["../../src/api/shared-types.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOA;AAOY,UAPK,kBAAA,CAQe;EAMf,UAAA,CAAA,EAAA,MAAA;AASjB;;;;AAYU,KA5BE,aAAA,GA4BF;EAAO,IAAA,EAAA,SAAA;WA3Be;;;kBACQ;;;;;UAKvB,wBAAA;;;kBAGC;;;;;UAMD;UAEL;;gBAEM;iBACC;;;;;;UAOT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-error.d.ts","names":[],"sources":["../../src/client/client-error.ts"],"sourcesContent":[],"mappings":";;;KAEY,kBAAA;UACF;AADV,CAAA;AAOA;;;AASc,uBATQ,iBASR,CAAA,cAAA,MAAA,GAAA,MAAA,CAAA,SATiE,KAAA,CASjE;EATiE,CAAA,OAAA;EAAK,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAG/C,KAH+C,EAAA,OAAA,CAAA,EAG/B,kBAH+B;EAcvE,IAAA,IAAA,CAAA,CAAA,EALC,KAKD,GAAA,CAAA,MAAuB,GAAA,CAAA,CAAA,CAAA;;AAYY,cAZnC,sBAAA,SAA+B,iBAYI,CAAA,SAAA,GAAA,eAAA,GAAA,aAAA,CAAA,CAAA;EAZJ,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAA,GAAA,eAAA,GAAA,aAAA,EAAA,OAAA,CAAA,EAM/B,kBAN+B;EAAiB,OAAA,qBAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAYb,sBAZa;AA4B7D;AAUA;AAUA;;AAMa,cA1BA,6BAAA,SAAsC,sBAAA,CA0BtC;EAOG,WAAA,CAAA,OAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAhCmD,kBAgCnD;;;AAKhB;;AAMM,cAlCO,2BAAA,SAAoC,sBAAA,CAkC3C;EAAS,WAAA,CAAA,OAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAjCiD,kBAiCjD;;;;;
|
|
1
|
+
{"version":3,"file":"client-error.d.ts","names":[],"sources":["../../src/client/client-error.ts"],"sourcesContent":[],"mappings":";;;KAEY,kBAAA;UACF;AADV,CAAA;AAOA;;;AASc,uBATQ,iBASR,CAAA,cAAA,MAAA,GAAA,MAAA,CAAA,SATiE,KAAA,CASjE;EATiE,CAAA,OAAA;EAAK,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAG/C,KAH+C,EAAA,OAAA,CAAA,EAG/B,kBAH+B;EAcvE,IAAA,IAAA,CAAA,CAAA,EALC,KAKD,GAAA,CAAA,MAAuB,GAAA,CAAA,CAAA,CAAA;;AAYY,cAZnC,sBAAA,SAA+B,iBAYI,CAAA,SAAA,GAAA,eAAA,GAAA,aAAA,CAAA,CAAA;EAZJ,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAA,GAAA,eAAA,GAAA,aAAA,EAAA,OAAA,CAAA,EAM/B,kBAN+B;EAAiB,OAAA,qBAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAYb,sBAZa;AA4B7D;AAUA;AAUA;;AAMa,cA1BA,6BAAA,SAAsC,sBAAA,CA0BtC;EAOG,WAAA,CAAA,OAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAhCmD,kBAgCnD;;;AAKhB;;AAMM,cAlCO,2BAAA,SAAoC,sBAAA,CAkC3C;EAAS,WAAA,CAAA,OAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAjCiD,kBAiCjD;;;;;AAmBQ,cA3CV,2BAAA,SAAoC,iBA2C1B,CAAA,mBAAA,CAAA,CAAA;EAKT,CAAA,OAAA;EACoB,WAAA,CAAA,OAAA,EAAA,MAAA,GAAA,SAAA,EAAA,MAAA,EA5CtB,UA4CsB,EAAA,OAAA,CAAA,EA3CrB,kBA2CqB;EAArB,IAAA,MAAA,CAAA,CAAA,EApCG,UAoCH;;AAAR,cA/BQ,oBA+BR,CAAA,mBAAA,MAAA,GAAA,MAAA,CAAA,SA7BK,iBA6BL,CA7BuB,UA6BvB,CAAA,CAAA;EA7BK,CAAA,OAAA;EAAiB,WAAA,CAAA;IAAA,OAAA;IAAA;GAAA,EAAA;;UAIqB;aACpC,sBACC;gBAOG;;;;;;;cAUO;oEAKT,WACT,QAAQ,qBAAqB,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-error.js","names":["#code","#status"],"sources":["../../src/client/client-error.ts"],"sourcesContent":["import type { StatusCode } from \"../http/http-status\";\n\nexport type FragnoErrorOptions = {\n cause?: Error | unknown;\n};\n\n/**\n * Base error class for all Fragno client errors.\n */\nexport abstract class FragnoClientError<TCode extends string = string> extends Error {\n readonly #code: TCode;\n\n constructor(message: string, code: TCode, options: FragnoErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = \"FragnoClientError\";\n this.#code = code;\n }\n\n get code(): TCode | (string & {}) {\n return this.#code;\n }\n}\n\nexport class FragnoClientFetchError extends FragnoClientError<\n \"NO_BODY\" | \"NETWORK_ERROR\" | \"ABORT_ERROR\"\n> {\n constructor(\n message: string,\n code: \"NO_BODY\" | \"NETWORK_ERROR\" | \"ABORT_ERROR\",\n options: FragnoErrorOptions = {},\n ) {\n super(message, code, options);\n this.name = \"FragnoClientFetchError\";\n }\n\n static fromUnknownFetchError(error: unknown): FragnoClientFetchError {\n if (!(error instanceof Error)) {\n return new FragnoClientFetchNetworkError(\"Network request failed\", { cause: error });\n }\n\n if (error.name === \"AbortError\") {\n return new FragnoClientFetchAbortError(\"Request was aborted\", { cause: error });\n }\n\n return new FragnoClientFetchNetworkError(\"Network request failed\", { cause: error });\n }\n}\n\n/**\n * Error thrown when a network request fails (e.g., no internet connection, DNS failure).\n */\nexport class FragnoClientFetchNetworkError extends FragnoClientFetchError {\n constructor(message: string = \"Network request failed\", options: FragnoErrorOptions = {}) {\n super(message, \"NETWORK_ERROR\", options);\n this.name = \"FragnoClientFetchNetworkError\";\n }\n}\n\n/**\n * Error thrown when a request is aborted (e.g., user cancels request, timeout).\n */\nexport class FragnoClientFetchAbortError extends FragnoClientFetchError {\n constructor(message: string = \"Request was aborted\", options: FragnoErrorOptions = {}) {\n super(message, \"ABORT_ERROR\", options);\n this.name = \"FragnoClientFetchAbortError\";\n }\n}\n\n/**\n * Error thrown when the API result is unexpected, e.g. no json is returned.\n */\nexport class FragnoClientUnknownApiError extends FragnoClientError<\"UNKNOWN_API_ERROR\"> {\n readonly #status: StatusCode;\n\n constructor(\n message: string = \"Unknown API error\",\n status: StatusCode,\n options: FragnoErrorOptions = {},\n ) {\n super(message, \"UNKNOWN_API_ERROR\", options);\n this.name = \"FragnoClientUnknownApiError\";\n this.#status = status;\n }\n\n get status(): StatusCode {\n return this.#status;\n }\n}\n\nexport class FragnoClientApiError<\n TErrorCode extends string = string,\n> extends FragnoClientError<TErrorCode> {\n readonly #status: StatusCode;\n\n constructor(\n { message, code }: { message: string; code: TErrorCode },\n status: StatusCode,\n options: FragnoErrorOptions = {},\n ) {\n super(message, code, options);\n this.name = \"FragnoClientApiError\";\n this.#status = status;\n }\n\n get status(): StatusCode {\n return this.#status;\n }\n\n /**\n * The error code returned by the API.\n *\n * The type is `TErrorCode` (the set of known error codes for this route), but may also be a string\n * for forward compatibility with future error codes.\n */\n get code(): TErrorCode | (string & {}) {\n return super.code as TErrorCode | (string & {});\n }\n\n static async fromResponse<TErrorCode extends string = string>(\n response: Response,\n ): Promise<FragnoClientApiError<TErrorCode> | FragnoClientUnknownApiError> {\n const unknown = await response.json();\n const status = response.status as StatusCode;\n\n if (!(\"message\" in unknown || \"code\" in unknown)) {\n return new FragnoClientUnknownApiError(\"Unknown API error\", status);\n }\n\n if (!(typeof unknown.message === \"string\" && typeof unknown.code === \"string\")) {\n return new FragnoClientUnknownApiError(\"Unknown API error\", status);\n }\n\n return new FragnoClientApiError(\n {\n message: unknown.message,\n code: unknown.code as TErrorCode,\n },\n status,\n );\n }\n}\n"],"mappings":";;;;AASA,IAAsB,oBAAtB,cAA+E,MAAM;CACnF,CAASA;CAET,YAAY,SAAiB,MAAa,UAA8B,EAAE,EAAE;AAC1E,QAAM,SAAS,EAAE,OAAO,QAAQ,OAAO,CAAC;AACxC,OAAK,OAAO;AACZ,QAAKA,OAAQ;;CAGf,IAAI,OAA8B;AAChC,SAAO,MAAKA;;;AAIhB,IAAa,yBAAb,cAA4C,kBAE1C;CACA,YACE,SACA,MACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,MAAM,QAAQ;AAC7B,OAAK,OAAO;;CAGd,OAAO,sBAAsB,OAAwC;AACnE,MAAI,EAAE,iBAAiB,OACrB,QAAO,IAAI,8BAA8B,0BAA0B,EAAE,OAAO,OAAO,CAAC;AAGtF,MAAI,MAAM,SAAS,aACjB,QAAO,IAAI,4BAA4B,uBAAuB,EAAE,OAAO,OAAO,CAAC;AAGjF,SAAO,IAAI,8BAA8B,0BAA0B,EAAE,OAAO,OAAO,CAAC;;;;;;AAOxF,IAAa,gCAAb,cAAmD,uBAAuB;CACxE,YAAY,UAAkB,0BAA0B,UAA8B,EAAE,EAAE;AACxF,QAAM,SAAS,iBAAiB,QAAQ;AACxC,OAAK,OAAO;;;;;;AAOhB,IAAa,8BAAb,cAAiD,uBAAuB;CACtE,YAAY,UAAkB,uBAAuB,UAA8B,EAAE,EAAE;AACrF,QAAM,SAAS,eAAe,QAAQ;AACtC,OAAK,OAAO;;;;;;AAOhB,IAAa,8BAAb,cAAiD,kBAAuC;CACtF,CAASC;CAET,YACE,UAAkB,qBAClB,QACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,qBAAqB,QAAQ;AAC5C,OAAK,OAAO;AACZ,QAAKA,SAAU;;CAGjB,IAAI,SAAqB;AACvB,SAAO,MAAKA;;;AAIhB,IAAa,uBAAb,MAAa,6BAEH,kBAA8B;CACtC,CAASA;CAET,YACE,EAAE,SAAS,QACX,QACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,MAAM,QAAQ;AAC7B,OAAK,OAAO;AACZ,QAAKA,SAAU;;CAGjB,IAAI,SAAqB;AACvB,SAAO,MAAKA;;;;;;;;CASd,
|
|
1
|
+
{"version":3,"file":"client-error.js","names":["#code","#status"],"sources":["../../src/client/client-error.ts"],"sourcesContent":["import type { StatusCode } from \"../http/http-status\";\n\nexport type FragnoErrorOptions = {\n cause?: Error | unknown;\n};\n\n/**\n * Base error class for all Fragno client errors.\n */\nexport abstract class FragnoClientError<TCode extends string = string> extends Error {\n readonly #code: TCode;\n\n constructor(message: string, code: TCode, options: FragnoErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = \"FragnoClientError\";\n this.#code = code;\n }\n\n get code(): TCode | (string & {}) {\n return this.#code;\n }\n}\n\nexport class FragnoClientFetchError extends FragnoClientError<\n \"NO_BODY\" | \"NETWORK_ERROR\" | \"ABORT_ERROR\"\n> {\n constructor(\n message: string,\n code: \"NO_BODY\" | \"NETWORK_ERROR\" | \"ABORT_ERROR\",\n options: FragnoErrorOptions = {},\n ) {\n super(message, code, options);\n this.name = \"FragnoClientFetchError\";\n }\n\n static fromUnknownFetchError(error: unknown): FragnoClientFetchError {\n if (!(error instanceof Error)) {\n return new FragnoClientFetchNetworkError(\"Network request failed\", { cause: error });\n }\n\n if (error.name === \"AbortError\") {\n return new FragnoClientFetchAbortError(\"Request was aborted\", { cause: error });\n }\n\n return new FragnoClientFetchNetworkError(\"Network request failed\", { cause: error });\n }\n}\n\n/**\n * Error thrown when a network request fails (e.g., no internet connection, DNS failure).\n */\nexport class FragnoClientFetchNetworkError extends FragnoClientFetchError {\n constructor(message: string = \"Network request failed\", options: FragnoErrorOptions = {}) {\n super(message, \"NETWORK_ERROR\", options);\n this.name = \"FragnoClientFetchNetworkError\";\n }\n}\n\n/**\n * Error thrown when a request is aborted (e.g., user cancels request, timeout).\n */\nexport class FragnoClientFetchAbortError extends FragnoClientFetchError {\n constructor(message: string = \"Request was aborted\", options: FragnoErrorOptions = {}) {\n super(message, \"ABORT_ERROR\", options);\n this.name = \"FragnoClientFetchAbortError\";\n }\n}\n\n/**\n * Error thrown when the API result is unexpected, e.g. no json is returned.\n */\nexport class FragnoClientUnknownApiError extends FragnoClientError<\"UNKNOWN_API_ERROR\"> {\n readonly #status: StatusCode;\n\n constructor(\n message: string = \"Unknown API error\",\n status: StatusCode,\n options: FragnoErrorOptions = {},\n ) {\n super(message, \"UNKNOWN_API_ERROR\", options);\n this.name = \"FragnoClientUnknownApiError\";\n this.#status = status;\n }\n\n get status(): StatusCode {\n return this.#status;\n }\n}\n\nexport class FragnoClientApiError<\n TErrorCode extends string = string,\n> extends FragnoClientError<TErrorCode> {\n readonly #status: StatusCode;\n\n constructor(\n { message, code }: { message: string; code: TErrorCode },\n status: StatusCode,\n options: FragnoErrorOptions = {},\n ) {\n super(message, code, options);\n this.name = \"FragnoClientApiError\";\n this.#status = status;\n }\n\n get status(): StatusCode {\n return this.#status;\n }\n\n /**\n * The error code returned by the API.\n *\n * The type is `TErrorCode` (the set of known error codes for this route), but may also be a string\n * for forward compatibility with future error codes.\n */\n override get code(): TErrorCode | (string & {}) {\n return super.code as TErrorCode | (string & {});\n }\n\n static async fromResponse<TErrorCode extends string = string>(\n response: Response,\n ): Promise<FragnoClientApiError<TErrorCode> | FragnoClientUnknownApiError> {\n const unknown = await response.json();\n const status = response.status as StatusCode;\n\n if (!(\"message\" in unknown || \"code\" in unknown)) {\n return new FragnoClientUnknownApiError(\"Unknown API error\", status);\n }\n\n if (!(typeof unknown.message === \"string\" && typeof unknown.code === \"string\")) {\n return new FragnoClientUnknownApiError(\"Unknown API error\", status);\n }\n\n return new FragnoClientApiError(\n {\n message: unknown.message,\n code: unknown.code as TErrorCode,\n },\n status,\n );\n }\n}\n"],"mappings":";;;;AASA,IAAsB,oBAAtB,cAA+E,MAAM;CACnF,CAASA;CAET,YAAY,SAAiB,MAAa,UAA8B,EAAE,EAAE;AAC1E,QAAM,SAAS,EAAE,OAAO,QAAQ,OAAO,CAAC;AACxC,OAAK,OAAO;AACZ,QAAKA,OAAQ;;CAGf,IAAI,OAA8B;AAChC,SAAO,MAAKA;;;AAIhB,IAAa,yBAAb,cAA4C,kBAE1C;CACA,YACE,SACA,MACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,MAAM,QAAQ;AAC7B,OAAK,OAAO;;CAGd,OAAO,sBAAsB,OAAwC;AACnE,MAAI,EAAE,iBAAiB,OACrB,QAAO,IAAI,8BAA8B,0BAA0B,EAAE,OAAO,OAAO,CAAC;AAGtF,MAAI,MAAM,SAAS,aACjB,QAAO,IAAI,4BAA4B,uBAAuB,EAAE,OAAO,OAAO,CAAC;AAGjF,SAAO,IAAI,8BAA8B,0BAA0B,EAAE,OAAO,OAAO,CAAC;;;;;;AAOxF,IAAa,gCAAb,cAAmD,uBAAuB;CACxE,YAAY,UAAkB,0BAA0B,UAA8B,EAAE,EAAE;AACxF,QAAM,SAAS,iBAAiB,QAAQ;AACxC,OAAK,OAAO;;;;;;AAOhB,IAAa,8BAAb,cAAiD,uBAAuB;CACtE,YAAY,UAAkB,uBAAuB,UAA8B,EAAE,EAAE;AACrF,QAAM,SAAS,eAAe,QAAQ;AACtC,OAAK,OAAO;;;;;;AAOhB,IAAa,8BAAb,cAAiD,kBAAuC;CACtF,CAASC;CAET,YACE,UAAkB,qBAClB,QACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,qBAAqB,QAAQ;AAC5C,OAAK,OAAO;AACZ,QAAKA,SAAU;;CAGjB,IAAI,SAAqB;AACvB,SAAO,MAAKA;;;AAIhB,IAAa,uBAAb,MAAa,6BAEH,kBAA8B;CACtC,CAASA;CAET,YACE,EAAE,SAAS,QACX,QACA,UAA8B,EAAE,EAChC;AACA,QAAM,SAAS,MAAM,QAAQ;AAC7B,OAAK,OAAO;AACZ,QAAKA,SAAU;;CAGjB,IAAI,SAAqB;AACvB,SAAO,MAAKA;;;;;;;;CASd,IAAa,OAAmC;AAC9C,SAAO,MAAM;;CAGf,aAAa,aACX,UACyE;EACzE,MAAM,UAAU,MAAM,SAAS,MAAM;EACrC,MAAM,SAAS,SAAS;AAExB,MAAI,EAAE,aAAa,WAAW,UAAU,SACtC,QAAO,IAAI,4BAA4B,qBAAqB,OAAO;AAGrE,MAAI,EAAE,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,SAAS,UACnE,QAAO,IAAI,4BAA4B,qBAAqB,OAAO;AAGrE,SAAO,IAAI,qBACT;GACE,SAAS,QAAQ;GACjB,MAAM,QAAQ;GACf,EACD,OACD"}
|