@silkweave/trpc 1.7.1 → 1.8.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 +17 -16
- package/.turbo/turbo-lint.log +5 -0
- package/.turbo/turbo-prepack.log +7 -7
- package/build/index.d.mts +2 -2
- package/build/index.d.mts.map +1 -1
- package/build/index.mjs +1 -1
- package/build/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/lib/errors.ts +1 -1
- package/src/lib/inferRouter.ts +4 -9
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
[34mℹ[39m
|
|
7
|
-
[34mℹ[39m
|
|
8
|
-
[34mℹ[39m
|
|
9
|
-
[34mℹ[39m
|
|
10
|
-
[34mℹ[39m
|
|
11
|
-
[34mℹ[39m
|
|
12
|
-
[34mℹ[39m [2mbuild/[
|
|
13
|
-
[34mℹ[39m [2mbuild/[22mindex.
|
|
14
|
-
[34mℹ[39m [2mbuild/[
|
|
15
|
-
[34mℹ[39m
|
|
16
|
-
[
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @silkweave/trpc@1.7.1 build /Users/atomic/projects/silkweave/silkweave/packages/trpc
|
|
4
|
+
> tsdown
|
|
5
|
+
|
|
6
|
+
[34mℹ[39m [34mtsdown v0.21.8[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.15[39m
|
|
7
|
+
[34mℹ[39m config file: [4m/Users/atomic/projects/silkweave/silkweave/packages/trpc/tsdown.config.ts[24m
|
|
8
|
+
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
9
|
+
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
|
+
[34mℹ[39m Build start
|
|
11
|
+
[34mℹ[39m Cleaning 4 files
|
|
12
|
+
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m 7.67 kB[22m [2m│ gzip: 2.62 kB[22m
|
|
13
|
+
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m15.99 kB[22m [2m│ gzip: 4.89 kB[22m
|
|
14
|
+
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 1.40 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
15
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 3.83 kB[22m [2m│ gzip: 1.51 kB[22m
|
|
16
|
+
[34mℹ[39m 4 files, total: 28.89 kB
|
|
17
|
+
[32m✔[39m Build complete in [32m936ms[39m
|
package/.turbo/turbo-prepack.log
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @silkweave/trpc@1.
|
|
3
|
+
> @silkweave/trpc@1.7.1 prepack /Users/atomic/projects/silkweave/silkweave/packages/trpc
|
|
4
4
|
> pnpm clean && pnpm build
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
> @silkweave/trpc@1.
|
|
7
|
+
> @silkweave/trpc@1.7.1 clean /Users/atomic/projects/silkweave/silkweave/packages/trpc
|
|
8
8
|
> rimraf build
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
> @silkweave/trpc@1.
|
|
11
|
+
> @silkweave/trpc@1.7.1 build /Users/atomic/projects/silkweave/silkweave/packages/trpc
|
|
12
12
|
> tsdown
|
|
13
13
|
|
|
14
14
|
[34mℹ[39m [34mtsdown v0.21.8[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.15[39m
|
|
15
|
-
[34mℹ[39m config file: [4m/Users/atomic/projects/
|
|
15
|
+
[34mℹ[39m config file: [4m/Users/atomic/projects/silkweave/silkweave/packages/trpc/tsdown.config.ts[24m
|
|
16
16
|
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
17
17
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
18
18
|
[34mℹ[39m Build start
|
|
19
19
|
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m 7.67 kB[22m [2m│ gzip: 2.62 kB[22m
|
|
20
20
|
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m15.99 kB[22m [2m│ gzip: 4.89 kB[22m
|
|
21
21
|
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 1.40 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
22
|
-
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 3.
|
|
23
|
-
[34mℹ[39m 4 files, total: 28.
|
|
24
|
-
[32m✔[39m Build complete in [
|
|
22
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 3.83 kB[22m [2m│ gzip: 1.51 kB[22m
|
|
23
|
+
[34mℹ[39m 4 files, total: 28.89 kB
|
|
24
|
+
[32m✔[39m Build complete in [32m562ms[39m
|
package/build/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _$_trpc_server0 from "@trpc/server";
|
|
2
2
|
import { AnyTRPCRootTypes, TRPCBuiltRouter, TRPCError, TRPCMutationProcedure, TRPCQueryProcedure } from "@trpc/server";
|
|
3
3
|
import { Action, AdapterFactory, AdapterGenerator, Silkweave, SilkweaveContext } from "@silkweave/core";
|
|
4
|
-
import { z } from "zod";
|
|
4
|
+
import { z } from "zod/v4";
|
|
5
5
|
import { AuthConfig } from "@silkweave/auth";
|
|
6
6
|
import { CorsOptions } from "cors";
|
|
7
7
|
|
|
@@ -59,7 +59,7 @@ declare function buildRouter(actions: Action[]): _$_trpc_server0.TRPCBuiltRouter
|
|
|
59
59
|
declare function mapError(error: unknown): TRPCError;
|
|
60
60
|
//#endregion
|
|
61
61
|
//#region src/lib/inferRouter.d.ts
|
|
62
|
-
type CamelCase<S extends string> = S extends `${infer A}-${infer B}` ? `${A}${Capitalize<CamelCase<B>>}` : S extends `${infer A}_${infer B}` ? `${A}${Capitalize<CamelCase<B>>}` : S;
|
|
62
|
+
type CamelCase<S extends string> = S extends `${infer A}-${infer B}` ? `${A}${Capitalize<CamelCase<B>>}` : (S extends `${infer A}_${infer B}` ? `${A}${Capitalize<CamelCase<B>>}` : S);
|
|
63
63
|
type ActionToProcedure<A extends Action> = 'query' extends NonNullable<A['kind']> ? TRPCQueryProcedure<{
|
|
64
64
|
meta: object;
|
|
65
65
|
input: z.infer<A['input']>;
|
package/build/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/fetch.ts","../src/adapter/trpc.ts","../src/lib/buildRouter.ts","../src/lib/errors.ts","../src/lib/inferRouter.ts"],"mappings":";;;;;;;;UAMiB,uBAAA;;EAEf,QAAA;EACA,IAAA,GAAO,UAAA;AAAA;AAAA,KAGG,YAAA,IAAgB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,UAExC,gBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA,EAAS,YAAA;EACT,GAAA,EAAK,YAAA;EACL,IAAA,EAAM,YAAA;AAAA;;;;AANR;;;;;;;;;iBAqBgB,SAAA,CAAU,OAAA,GAAS,uBAAA,GAA+B,gBAAA;;;UCzBjD,kBAAA;EACf,IAAA;EACA,IAAA;;EAEA,QAAA;EDNe;ECQf,IAAA,GAAO,WAAA;EACP,IAAA,GAAO,UAAA;AAAA;AAAA,cAWI,IAAA,EAAM,cAAA,CAAe,kBAAA;;;UCpBjB,kBAAA;EACf,gBAAA,EAAkB,gBAAA;AAAA;AAAA,iBAGJ,WAAA,CAAY,OAAA,EAAS,MAAA,qBAAQ,eAAA;;;;;;;;iBCc7B,QAAA,CAAS,KAAA,YAAiB,SAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/fetch.ts","../src/adapter/trpc.ts","../src/lib/buildRouter.ts","../src/lib/errors.ts","../src/lib/inferRouter.ts"],"mappings":";;;;;;;;UAMiB,uBAAA;;EAEf,QAAA;EACA,IAAA,GAAO,UAAA;AAAA;AAAA,KAGG,YAAA,IAAgB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,UAExC,gBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA,EAAS,YAAA;EACT,GAAA,EAAK,YAAA;EACL,IAAA,EAAM,YAAA;AAAA;;;;AANR;;;;;;;;;iBAqBgB,SAAA,CAAU,OAAA,GAAS,uBAAA,GAA+B,gBAAA;;;UCzBjD,kBAAA;EACf,IAAA;EACA,IAAA;;EAEA,QAAA;EDNe;ECQf,IAAA,GAAO,WAAA;EACP,IAAA,GAAO,UAAA;AAAA;AAAA,cAWI,IAAA,EAAM,cAAA,CAAe,kBAAA;;;UCpBjB,kBAAA;EACf,gBAAA,EAAkB,gBAAA;AAAA;AAAA,iBAGJ,WAAA,CAAY,OAAA,EAAS,MAAA,qBAAQ,eAAA;;;;;;;;iBCc7B,QAAA,CAAS,KAAA,YAAiB,SAAA;;;KCpBrC,SAAA,qBAA8B,CAAA,sCAC5B,CAAA,GAAI,UAAA,CAAW,SAAA,CAAU,CAAA,QAC3B,CAAA,sCACI,CAAA,GAAI,UAAA,CAAW,SAAA,CAAU,CAAA,OAC5B,CAAA;AAAA,KAED,iBAAA,WAA4B,MAAA,oBAA0B,WAAA,CAAY,CAAA,YACnE,kBAAA;EACA,IAAA;EACA,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA;EACf,MAAA,EAAQ,OAAA,CAAQ,UAAA,CAAW,CAAA;AAAA,KAE3B,qBAAA;EACA,IAAA;EACA,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA;EACf,MAAA,EAAQ,OAAA,CAAQ,UAAA,CAAW,CAAA;AAAA;AAAA,KAG1B,qBAAA,iBAAsC,MAAA,SAAe,MAAA,mBAC5C,OAAA,aAAoB,SAAA,CAAU,OAAA,CAAQ,CAAA,aAAc,iBAAA,CAAkB,OAAA,CAAQ,CAAA;AAAA,KAGvF,aAAA;EACH,GAAA;EACA,IAAA;EACA,UAAA;EACA,WAAA;AAAA,IACE,gBAAA;;;;;;;;;;KAWQ,eAAA,MAAqB,CAAA,SAAU,SAAA,kBACvC,eAAA,CAAgB,aAAA,EAAe,qBAAA,CAAsB,OAAA"}
|
package/build/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
|
|
|
2
2
|
import { TRPCError, initTRPC } from "@trpc/server";
|
|
3
3
|
import { camelCase } from "change-case";
|
|
4
4
|
import { SilkweaveError } from "@silkweave/core";
|
|
5
|
-
import { z } from "zod";
|
|
5
|
+
import { z } from "zod/v4";
|
|
6
6
|
import { validateToken } from "@silkweave/auth";
|
|
7
7
|
import { buildLogLevels } from "@silkweave/logger";
|
|
8
8
|
import { createHTTPHandler } from "@trpc/server/adapters/standalone";
|
package/build/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/errors.ts","../src/lib/buildRouter.ts","../src/lib/createContext.ts","../src/adapter/fetch.ts","../src/adapter/trpc.ts"],"sourcesContent":["import { SilkweaveError } from '@silkweave/core'\nimport { TRPCError } from '@trpc/server'\nimport { z } from 'zod'\n\ntype TRPCErrorCode = TRPCError['code']\n\nconst CODE_MAP: Record<number, TRPCErrorCode> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 408: 'TIMEOUT',\n 409: 'CONFLICT',\n 412: 'PRECONDITION_FAILED',\n 413: 'PAYLOAD_TOO_LARGE',\n 429: 'TOO_MANY_REQUESTS',\n 499: 'CLIENT_CLOSED_REQUEST',\n 500: 'INTERNAL_SERVER_ERROR',\n 501: 'NOT_IMPLEMENTED',\n 502: 'BAD_GATEWAY',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT'\n}\n\nexport function mapError(error: unknown): TRPCError {\n if (error instanceof TRPCError) { return error }\n if (error instanceof z.ZodError) {\n return new TRPCError({ code: 'BAD_REQUEST', message: error.message, cause: error })\n }\n if (error instanceof SilkweaveError) {\n return new TRPCError({\n code: CODE_MAP[error.statusCode] ?? 'INTERNAL_SERVER_ERROR',\n message: error.message,\n cause: error\n })\n }\n return new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Internal error',\n cause: error instanceof Error ? error : undefined\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Action, SilkweaveContext } from '@silkweave/core'\nimport { initTRPC } from '@trpc/server'\nimport { camelCase } from 'change-case'\nimport { mapError } from './errors.js'\n\nexport interface TrpcHandlerContext {\n silkweaveContext: SilkweaveContext\n}\n\nexport function buildRouter(actions: Action[]) {\n const t = initTRPC.context<TrpcHandlerContext>().create()\n const record: Record<string, any> = {}\n for (const action of actions) {\n const key = camelCase(action.name)\n const base = t.procedure.input(action.input)\n const handler = async ({ input, ctx }: { input: object; ctx: TrpcHandlerContext }) => {\n try {\n return await action.run(input, ctx.silkweaveContext)\n } catch (error) {\n throw mapError(error)\n }\n }\n record[key] = action.kind === 'query' ? base.query(handler) : base.mutation(handler)\n }\n return t.router(record)\n}\n","import { AuthConfig, AuthInfo, validateToken } from '@silkweave/auth'\nimport { SilkweaveContext } from '@silkweave/core'\nimport { buildLogLevels, Logger, LogLevel } from '@silkweave/logger'\n\nconst CONSOLE_LEVEL_MAP: Record<LogLevel, 'log' | 'info' | 'warn' | 'error'> = {\n emergency: 'error',\n alert: 'error',\n critical: 'error',\n error: 'error',\n warning: 'warn',\n notice: 'info',\n info: 'info',\n debug: 'log'\n}\n\nexport function createActionLogger(): Logger {\n return {\n ...buildLogLevels((level, data) => {\n console[CONSOLE_LEVEL_MAP[level]](data)\n }),\n progress: () => { /* progress notifications not supported on tRPC HTTP */ }\n }\n}\n\nexport interface AuthErrorPayload {\n statusCode: number\n headers: Record<string, string>\n body: { error: string; error_description: string }\n}\n\nexport type ResolvedAuth =\n | { kind: 'ok'; authInfo?: AuthInfo }\n | { kind: 'error'; error: AuthErrorPayload }\n\nexport async function resolveAuth(\n auth: AuthConfig | undefined,\n authHeader: string | null | undefined,\n context: SilkweaveContext\n): Promise<ResolvedAuth> {\n if (!auth) { return { kind: 'ok' } }\n const result = await validateToken(authHeader, auth, context)\n if (result.error) { return { kind: 'error', error: result.error } }\n return { kind: 'ok', authInfo: result.auth }\n}\n","import { AuthConfig } from '@silkweave/auth'\nimport { Adapter, AdapterGenerator, SilkweaveOptions } from '@silkweave/core'\nimport { fetchRequestHandler } from '@trpc/server/adapters/fetch'\nimport { buildRouter, TrpcHandlerContext } from '../lib/buildRouter.js'\nimport { createActionLogger, resolveAuth } from '../lib/createContext.js'\n\nexport interface TrpcFetchAdapterOptions {\n /** URL prefix stripped from incoming requests before tRPC routing. Default `/trpc`. */\n endpoint?: string\n auth?: AuthConfig\n}\n\nexport type FetchHandler = (request: Request) => Promise<Response>\n\nexport interface TrpcFetchAdapter {\n adapter: AdapterGenerator\n handler: FetchHandler\n GET: FetchHandler\n POST: FetchHandler\n}\n\n/**\n * Creates a tRPC adapter that exposes a fetch-compatible handler instead of\n * binding its own HTTP server. Use in Astro API routes, Vercel serverless\n * functions, Cloudflare Workers, or any Web Standard runtime.\n *\n * The returned `handler` waits for `server.start()` to complete (via an internal\n * `_ready` promise) before dispatching requests, so it's safe to call from a\n * cold-started serverless invocation.\n *\n * CORS is intentionally not configured here - handle it in your host framework\n * (Astro middleware, `vercel.json` headers, Worker response headers, etc).\n */\nexport function trpcFetch(options: TrpcFetchAdapterOptions = {}): TrpcFetchAdapter {\n const endpoint = (options.endpoint ?? '/trpc').replace(/\\/$/, '')\n\n let resolveReady!: () => void\n const ready = new Promise<void>((resolve) => { resolveReady = resolve })\n\n let handler: FetchHandler = async () => new Response(\n JSON.stringify({ error: 'not_ready', message: 'tRPC adapter has not started yet' }),\n { status: 503, headers: { 'Content-Type': 'application/json' } }\n )\n\n const adapter: AdapterGenerator = (_silkweaveOptions: SilkweaveOptions, baseContext): Adapter => {\n const context = baseContext.fork({ adapter: 'trpc' })\n return {\n context,\n start: async (actions) => {\n const router = buildRouter(actions)\n const logger = createActionLogger()\n\n const createContext = async (\n opts: { req: Request }\n ): Promise<TrpcHandlerContext> => {\n const resolved = await resolveAuth(\n options.auth,\n opts.req.headers.get('authorization'),\n context.fork({ request: opts.req })\n )\n if (resolved.kind === 'error') {\n const err = new Error('Unauthorized') as Error & { silkweaveAuthError?: typeof resolved.error }\n err.silkweaveAuthError = resolved.error\n throw err\n }\n return {\n silkweaveContext: context.fork({\n logger,\n request: opts.req,\n ...(resolved.authInfo ? { auth: resolved.authInfo } : {})\n })\n }\n }\n\n handler = async (request: Request): Promise<Response> => {\n try {\n return await fetchRequestHandler({\n endpoint,\n req: request,\n router,\n createContext\n })\n } catch (error) {\n const authError = (error as { silkweaveAuthError?: { statusCode: number; headers: Record<string, string>; body: object } }).silkweaveAuthError\n if (authError) {\n return new Response(JSON.stringify(authError.body), {\n status: authError.statusCode,\n headers: { 'Content-Type': 'application/json', ...authError.headers }\n })\n }\n throw error\n }\n }\n\n resolveReady()\n },\n stop: async () => { /* no-op for fetch adapter */ }\n }\n }\n\n const dispatch: FetchHandler = async (request) => {\n await ready\n return handler(request)\n }\n\n return {\n adapter,\n handler: dispatch,\n GET: dispatch,\n POST: dispatch\n }\n}\n","import { AuthConfig } from '@silkweave/auth'\nimport { AdapterFactory } from '@silkweave/core'\nimport { createHTTPHandler } from '@trpc/server/adapters/standalone'\nimport cors, { CorsOptions } from 'cors'\nimport http, { IncomingMessage, ServerResponse } from 'http'\nimport { buildRouter, TrpcHandlerContext } from '../lib/buildRouter.js'\nimport { createActionLogger, resolveAuth } from '../lib/createContext.js'\n\nexport interface TrpcAdapterOptions {\n host?: string\n port?: number\n /** URL prefix stripped from incoming requests before tRPC routing. Default `/trpc/`. */\n endpoint?: string\n /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */\n cors?: CorsOptions | boolean\n auth?: AuthConfig\n}\n\ntype CorsMiddleware = (req: IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => void\n\nfunction resolveCors(corsConfig: CorsOptions | boolean | undefined): CorsMiddleware | null {\n if (corsConfig === false) { return null }\n const userConfig = corsConfig === true || corsConfig === undefined ? {} : corsConfig\n return cors({ origin: '*', ...userConfig }) as CorsMiddleware\n}\n\nexport const trpc: AdapterFactory<TrpcAdapterOptions> = (options) => {\n return (_silkweaveOptions, baseContext) => {\n const context = baseContext.fork({ adapter: 'trpc' })\n const host = options.host ?? '0.0.0.0'\n const port = options.port ?? 8080\n const endpoint = (options.endpoint ?? '/trpc/').replace(/\\/?$/, '/')\n let server: http.Server | undefined\n\n return {\n context,\n start: async (actions) => {\n const router = buildRouter(actions)\n const corsMiddleware = resolveCors(options.cors)\n const logger = createActionLogger()\n\n const createContext = async (\n opts: { req: IncomingMessage; res: ServerResponse }\n ): Promise<TrpcHandlerContext> => {\n const resolved = await resolveAuth(\n options.auth,\n opts.req.headers.authorization,\n context.fork({ request: opts.req })\n )\n if (resolved.kind === 'error') {\n for (const [key, value] of Object.entries(resolved.error.headers)) {\n opts.res.setHeader(key, value)\n }\n opts.res.statusCode = resolved.error.statusCode\n opts.res.setHeader('Content-Type', 'application/json')\n opts.res.end(JSON.stringify(resolved.error.body))\n throw new Error('Unauthorized')\n }\n return {\n silkweaveContext: context.fork({\n logger,\n request: opts.req,\n ...(resolved.authInfo ? { auth: resolved.authInfo } : {})\n })\n }\n }\n\n const trpcHandler = createHTTPHandler({ router, basePath: endpoint, createContext })\n\n const handler = (req: IncomingMessage, res: ServerResponse) => {\n if (!req.url?.startsWith(endpoint)) {\n res.statusCode = 404\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'not_found', message: `No route for ${req.url}` }))\n return\n }\n trpcHandler(req, res)\n }\n\n server = http.createServer((req, res) => {\n if (corsMiddleware) {\n corsMiddleware(req, res, () => {\n if (req.method === 'OPTIONS') { res.statusCode = 204; res.end(); return }\n handler(req, res)\n })\n } else {\n handler(req, res)\n }\n })\n\n await new Promise<void>((resolve) => {\n server!.listen(port, host, () => { resolve() })\n })\n },\n stop: async () => {\n if (!server) { return }\n await new Promise<void>((resolve, reject) => {\n server!.close((err) => {\n if (err) { reject(err) } else { resolve() }\n })\n })\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/errors.ts","../src/lib/buildRouter.ts","../src/lib/createContext.ts","../src/adapter/fetch.ts","../src/adapter/trpc.ts"],"sourcesContent":["import { SilkweaveError } from '@silkweave/core'\nimport { TRPCError } from '@trpc/server'\nimport { z } from 'zod/v4'\n\ntype TRPCErrorCode = TRPCError['code']\n\nconst CODE_MAP: Record<number, TRPCErrorCode> = {\n 400: 'BAD_REQUEST',\n 401: 'UNAUTHORIZED',\n 403: 'FORBIDDEN',\n 404: 'NOT_FOUND',\n 408: 'TIMEOUT',\n 409: 'CONFLICT',\n 412: 'PRECONDITION_FAILED',\n 413: 'PAYLOAD_TOO_LARGE',\n 429: 'TOO_MANY_REQUESTS',\n 499: 'CLIENT_CLOSED_REQUEST',\n 500: 'INTERNAL_SERVER_ERROR',\n 501: 'NOT_IMPLEMENTED',\n 502: 'BAD_GATEWAY',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT'\n}\n\nexport function mapError(error: unknown): TRPCError {\n if (error instanceof TRPCError) { return error }\n if (error instanceof z.ZodError) {\n return new TRPCError({ code: 'BAD_REQUEST', message: error.message, cause: error })\n }\n if (error instanceof SilkweaveError) {\n return new TRPCError({\n code: CODE_MAP[error.statusCode] ?? 'INTERNAL_SERVER_ERROR',\n message: error.message,\n cause: error\n })\n }\n return new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Internal error',\n cause: error instanceof Error ? error : undefined\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Action, SilkweaveContext } from '@silkweave/core'\nimport { initTRPC } from '@trpc/server'\nimport { camelCase } from 'change-case'\nimport { mapError } from './errors.js'\n\nexport interface TrpcHandlerContext {\n silkweaveContext: SilkweaveContext\n}\n\nexport function buildRouter(actions: Action[]) {\n const t = initTRPC.context<TrpcHandlerContext>().create()\n const record: Record<string, any> = {}\n for (const action of actions) {\n const key = camelCase(action.name)\n const base = t.procedure.input(action.input)\n const handler = async ({ input, ctx }: { input: object; ctx: TrpcHandlerContext }) => {\n try {\n return await action.run(input, ctx.silkweaveContext)\n } catch (error) {\n throw mapError(error)\n }\n }\n record[key] = action.kind === 'query' ? base.query(handler) : base.mutation(handler)\n }\n return t.router(record)\n}\n","import { AuthConfig, AuthInfo, validateToken } from '@silkweave/auth'\nimport { SilkweaveContext } from '@silkweave/core'\nimport { buildLogLevels, Logger, LogLevel } from '@silkweave/logger'\n\nconst CONSOLE_LEVEL_MAP: Record<LogLevel, 'log' | 'info' | 'warn' | 'error'> = {\n emergency: 'error',\n alert: 'error',\n critical: 'error',\n error: 'error',\n warning: 'warn',\n notice: 'info',\n info: 'info',\n debug: 'log'\n}\n\nexport function createActionLogger(): Logger {\n return {\n ...buildLogLevels((level, data) => {\n console[CONSOLE_LEVEL_MAP[level]](data)\n }),\n progress: () => { /* progress notifications not supported on tRPC HTTP */ }\n }\n}\n\nexport interface AuthErrorPayload {\n statusCode: number\n headers: Record<string, string>\n body: { error: string; error_description: string }\n}\n\nexport type ResolvedAuth =\n | { kind: 'ok'; authInfo?: AuthInfo }\n | { kind: 'error'; error: AuthErrorPayload }\n\nexport async function resolveAuth(\n auth: AuthConfig | undefined,\n authHeader: string | null | undefined,\n context: SilkweaveContext\n): Promise<ResolvedAuth> {\n if (!auth) { return { kind: 'ok' } }\n const result = await validateToken(authHeader, auth, context)\n if (result.error) { return { kind: 'error', error: result.error } }\n return { kind: 'ok', authInfo: result.auth }\n}\n","import { AuthConfig } from '@silkweave/auth'\nimport { Adapter, AdapterGenerator, SilkweaveOptions } from '@silkweave/core'\nimport { fetchRequestHandler } from '@trpc/server/adapters/fetch'\nimport { buildRouter, TrpcHandlerContext } from '../lib/buildRouter.js'\nimport { createActionLogger, resolveAuth } from '../lib/createContext.js'\n\nexport interface TrpcFetchAdapterOptions {\n /** URL prefix stripped from incoming requests before tRPC routing. Default `/trpc`. */\n endpoint?: string\n auth?: AuthConfig\n}\n\nexport type FetchHandler = (request: Request) => Promise<Response>\n\nexport interface TrpcFetchAdapter {\n adapter: AdapterGenerator\n handler: FetchHandler\n GET: FetchHandler\n POST: FetchHandler\n}\n\n/**\n * Creates a tRPC adapter that exposes a fetch-compatible handler instead of\n * binding its own HTTP server. Use in Astro API routes, Vercel serverless\n * functions, Cloudflare Workers, or any Web Standard runtime.\n *\n * The returned `handler` waits for `server.start()` to complete (via an internal\n * `_ready` promise) before dispatching requests, so it's safe to call from a\n * cold-started serverless invocation.\n *\n * CORS is intentionally not configured here - handle it in your host framework\n * (Astro middleware, `vercel.json` headers, Worker response headers, etc).\n */\nexport function trpcFetch(options: TrpcFetchAdapterOptions = {}): TrpcFetchAdapter {\n const endpoint = (options.endpoint ?? '/trpc').replace(/\\/$/, '')\n\n let resolveReady!: () => void\n const ready = new Promise<void>((resolve) => { resolveReady = resolve })\n\n let handler: FetchHandler = async () => new Response(\n JSON.stringify({ error: 'not_ready', message: 'tRPC adapter has not started yet' }),\n { status: 503, headers: { 'Content-Type': 'application/json' } }\n )\n\n const adapter: AdapterGenerator = (_silkweaveOptions: SilkweaveOptions, baseContext): Adapter => {\n const context = baseContext.fork({ adapter: 'trpc' })\n return {\n context,\n start: async (actions) => {\n const router = buildRouter(actions)\n const logger = createActionLogger()\n\n const createContext = async (\n opts: { req: Request }\n ): Promise<TrpcHandlerContext> => {\n const resolved = await resolveAuth(\n options.auth,\n opts.req.headers.get('authorization'),\n context.fork({ request: opts.req })\n )\n if (resolved.kind === 'error') {\n const err = new Error('Unauthorized') as Error & { silkweaveAuthError?: typeof resolved.error }\n err.silkweaveAuthError = resolved.error\n throw err\n }\n return {\n silkweaveContext: context.fork({\n logger,\n request: opts.req,\n ...(resolved.authInfo ? { auth: resolved.authInfo } : {})\n })\n }\n }\n\n handler = async (request: Request): Promise<Response> => {\n try {\n return await fetchRequestHandler({\n endpoint,\n req: request,\n router,\n createContext\n })\n } catch (error) {\n const authError = (error as { silkweaveAuthError?: { statusCode: number; headers: Record<string, string>; body: object } }).silkweaveAuthError\n if (authError) {\n return new Response(JSON.stringify(authError.body), {\n status: authError.statusCode,\n headers: { 'Content-Type': 'application/json', ...authError.headers }\n })\n }\n throw error\n }\n }\n\n resolveReady()\n },\n stop: async () => { /* no-op for fetch adapter */ }\n }\n }\n\n const dispatch: FetchHandler = async (request) => {\n await ready\n return handler(request)\n }\n\n return {\n adapter,\n handler: dispatch,\n GET: dispatch,\n POST: dispatch\n }\n}\n","import { AuthConfig } from '@silkweave/auth'\nimport { AdapterFactory } from '@silkweave/core'\nimport { createHTTPHandler } from '@trpc/server/adapters/standalone'\nimport cors, { CorsOptions } from 'cors'\nimport http, { IncomingMessage, ServerResponse } from 'http'\nimport { buildRouter, TrpcHandlerContext } from '../lib/buildRouter.js'\nimport { createActionLogger, resolveAuth } from '../lib/createContext.js'\n\nexport interface TrpcAdapterOptions {\n host?: string\n port?: number\n /** URL prefix stripped from incoming requests before tRPC routing. Default `/trpc/`. */\n endpoint?: string\n /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */\n cors?: CorsOptions | boolean\n auth?: AuthConfig\n}\n\ntype CorsMiddleware = (req: IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => void\n\nfunction resolveCors(corsConfig: CorsOptions | boolean | undefined): CorsMiddleware | null {\n if (corsConfig === false) { return null }\n const userConfig = corsConfig === true || corsConfig === undefined ? {} : corsConfig\n return cors({ origin: '*', ...userConfig }) as CorsMiddleware\n}\n\nexport const trpc: AdapterFactory<TrpcAdapterOptions> = (options) => {\n return (_silkweaveOptions, baseContext) => {\n const context = baseContext.fork({ adapter: 'trpc' })\n const host = options.host ?? '0.0.0.0'\n const port = options.port ?? 8080\n const endpoint = (options.endpoint ?? '/trpc/').replace(/\\/?$/, '/')\n let server: http.Server | undefined\n\n return {\n context,\n start: async (actions) => {\n const router = buildRouter(actions)\n const corsMiddleware = resolveCors(options.cors)\n const logger = createActionLogger()\n\n const createContext = async (\n opts: { req: IncomingMessage; res: ServerResponse }\n ): Promise<TrpcHandlerContext> => {\n const resolved = await resolveAuth(\n options.auth,\n opts.req.headers.authorization,\n context.fork({ request: opts.req })\n )\n if (resolved.kind === 'error') {\n for (const [key, value] of Object.entries(resolved.error.headers)) {\n opts.res.setHeader(key, value)\n }\n opts.res.statusCode = resolved.error.statusCode\n opts.res.setHeader('Content-Type', 'application/json')\n opts.res.end(JSON.stringify(resolved.error.body))\n throw new Error('Unauthorized')\n }\n return {\n silkweaveContext: context.fork({\n logger,\n request: opts.req,\n ...(resolved.authInfo ? { auth: resolved.authInfo } : {})\n })\n }\n }\n\n const trpcHandler = createHTTPHandler({ router, basePath: endpoint, createContext })\n\n const handler = (req: IncomingMessage, res: ServerResponse) => {\n if (!req.url?.startsWith(endpoint)) {\n res.statusCode = 404\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'not_found', message: `No route for ${req.url}` }))\n return\n }\n trpcHandler(req, res)\n }\n\n server = http.createServer((req, res) => {\n if (corsMiddleware) {\n corsMiddleware(req, res, () => {\n if (req.method === 'OPTIONS') { res.statusCode = 204; res.end(); return }\n handler(req, res)\n })\n } else {\n handler(req, res)\n }\n })\n\n await new Promise<void>((resolve) => {\n server!.listen(port, host, () => { resolve() })\n })\n },\n stop: async () => {\n if (!server) { return }\n await new Promise<void>((resolve, reject) => {\n server!.close((err) => {\n if (err) { reject(err) } else { resolve() }\n })\n })\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@silkweave/trpc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Silkweave tRPC Adapter",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"@trpc/server": "^11.7.1",
|
|
14
14
|
"change-case": "^5.4.4",
|
|
15
15
|
"cors": "^2.8.5",
|
|
16
|
-
"zod": "^
|
|
17
|
-
"@silkweave/auth": "1.
|
|
18
|
-
"@silkweave/
|
|
19
|
-
"@silkweave/
|
|
16
|
+
"zod": "^3.25.0",
|
|
17
|
+
"@silkweave/auth": "1.8.0",
|
|
18
|
+
"@silkweave/core": "1.8.0",
|
|
19
|
+
"@silkweave/logger": "1.8.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@eslint/js": "^10.0.1",
|
package/src/lib/errors.ts
CHANGED
package/src/lib/inferRouter.ts
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import { Action, Silkweave } from '@silkweave/core'
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
TRPCBuiltRouter,
|
|
5
|
-
TRPCMutationProcedure,
|
|
6
|
-
TRPCQueryProcedure
|
|
7
|
-
} from '@trpc/server'
|
|
8
|
-
import type { z } from 'zod'
|
|
2
|
+
import type { AnyTRPCRootTypes, TRPCBuiltRouter, TRPCMutationProcedure, TRPCQueryProcedure } from '@trpc/server'
|
|
3
|
+
import type { z } from 'zod/v4'
|
|
9
4
|
|
|
10
5
|
type CamelCase<S extends string> = S extends `${infer A}-${infer B}`
|
|
11
6
|
? `${A}${Capitalize<CamelCase<B>>}`
|
|
12
|
-
: S extends `${infer A}_${infer B}`
|
|
7
|
+
: (S extends `${infer A}_${infer B}`
|
|
13
8
|
? `${A}${Capitalize<CamelCase<B>>}`
|
|
14
|
-
: S
|
|
9
|
+
: S)
|
|
15
10
|
|
|
16
11
|
type ActionToProcedure<A extends Action> = 'query' extends NonNullable<A['kind']>
|
|
17
12
|
? TRPCQueryProcedure<{
|