UNPKG

@benpsnyder/analogjs-esm-trpc

Version:

Angular/Nitro-based tRPC integration

1 lines 29.3 kB
{"version":3,"file":"benpsnyder-analogjs-esm-trpc.mjs","sources":["../../../../packages/trpc/src/lib/client/cache-state.ts","../../../../packages/trpc/src/lib/client/links/transfer-state-link.ts","../../../../packages/trpc/src/lib/client/shared-internal.ts","../../../../packages/trpc/src/lib/client/trpc-rxjs-proxy.ts","../../../../packages/trpc/src/lib/client/client.ts","../../../../packages/trpc/src/lib/utils/wait-for.ts","../../../../packages/trpc/src/benpsnyder-analogjs-esm-trpc.ts"],"sourcesContent":["import { BehaviorSubject, first } from 'rxjs';\nimport {\n APP_BOOTSTRAP_LISTENER,\n ApplicationRef,\n inject,\n InjectionToken,\n} from '@angular/core';\n\nexport const tRPC_CACHE_STATE = new InjectionToken<{\n isCacheActive: BehaviorSubject<boolean>;\n}>('TRPC_HTTP_TRANSFER_STATE_CACHE_STATE');\n\nexport const provideTrpcCacheState = () => ({\n provide: tRPC_CACHE_STATE,\n useValue: { isCacheActive: new BehaviorSubject(true) },\n});\n\nexport const provideTrpcCacheStateStatusManager = () => ({\n provide: APP_BOOTSTRAP_LISTENER,\n multi: true,\n useFactory: () => {\n const appRef = inject(ApplicationRef);\n const cacheState = inject(tRPC_CACHE_STATE);\n\n return () =>\n appRef.isStable\n .pipe(first((isStable) => isStable))\n .subscribe(() => cacheState.isCacheActive.next(false));\n },\n deps: [ApplicationRef, tRPC_CACHE_STATE],\n});\n","import { Operation, TRPCLink } from '@trpc/client';\nimport { observable } from '@trpc/server/observable';\nimport { inject, makeStateKey, StateKey, TransferState } from '@angular/core';\nimport { AnyRouter } from '@trpc/server';\nimport { tRPC_CACHE_STATE } from '../cache-state';\nimport superjson from 'superjson';\n\nfunction makeCacheKey(request: Operation<unknown>): StateKey<string> {\n const { type, path, input } = request;\n const encodedParams = Object.entries(input ?? {}).reduce(\n (prev, [key, value]) => prev + `${key}=${JSON.stringify(value)}`,\n '',\n );\n const key = type + '.' + path + '?' + encodedParams;\n const hash = generateHash(key);\n return makeStateKey(hash);\n}\n\n/**\n * A method that returns a hash representation of a string using a variant of DJB2 hash\n * algorithm.\n *\n * This is the same hashing logic that is used to generate component ids.\n */\nfunction generateHash(value: string): string {\n let hash = 0;\n\n for (const char of value) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n}\n\nexport const transferStateLink =\n <AppRouter extends AnyRouter>(): TRPCLink<AppRouter> =>\n () => {\n const { isCacheActive } = inject(tRPC_CACHE_STATE);\n const transferState = inject(TransferState);\n const isBrowser = typeof window === 'object';\n // here we just got initialized in the app - this happens once per app\n // useful for storing cache for instance\n return ({ next, op }) => {\n const shouldUseCache =\n (op.type === 'query' && !isBrowser) || // always fetch new values on the server\n isCacheActive.getValue(); // or when initializing the client app --> same behavior as HttpClient\n\n if (!shouldUseCache) {\n return next(op);\n }\n\n const storeKey = makeCacheKey(op);\n const storeValue = transferState.get(storeKey, null);\n\n if (storeValue && isBrowser) {\n // on the server we don't care about the value we will always fetch a new one\n // use superjson to parse our superjson string and retrieve our\n // data return it instead of calling next trpc link\n return observable((observer) =>\n observer.next(superjson.parse(storeValue)),\n );\n }\n\n return observable((observer) => {\n return next(op).subscribe({\n next(value) {\n // store returned value from trpc call stringified with superjson in TransferState\n transferState.set(storeKey, superjson.stringify(value));\n observer.next(value);\n },\n error(err) {\n transferState.remove(storeKey);\n observer.error(err);\n },\n complete() {\n observer.complete();\n },\n });\n });\n };\n };\n","import {\n AnyRouter,\n ClientDataTransformerOptions,\n CombinedDataTransformer,\n DataTransformerOptions,\n DefaultDataTransformer,\n} from '@trpc/server';\nimport {\n Operation,\n TRPCLink,\n OperationContext,\n OperationLink,\n OperationResultObservable,\n} from '@trpc/client';\nimport { observable } from '@trpc/server/observable';\n\n// Removed subscription\nexport type TRPCType = 'query' | 'mutation';\n\n// Removed subscription and requestAsPromise\nexport type UntypedClientProperties =\n | 'links'\n | 'runtime'\n | 'requestId'\n | '$request'\n | 'query'\n | 'mutation';\n\n/*\n * One to one copy of the trpc client internal code\n * Nothing was changed, but we can not import these methods because\n * they are not exported\n */\nexport type IntersectionError<TKey extends string> =\n `The property '${TKey}' in your router collides with a built-in method, rename this router or procedure on your backend.`;\n\nexport interface TRPCRequestOptions {\n /**\n * Pass additional context to links\n */\n context?: OperationContext;\n}\n\nexport function createChain<\n TRouter extends AnyRouter,\n TInput = unknown,\n TOutput = unknown,\n>(opts: {\n links: OperationLink<TRouter, TInput, TOutput>[];\n op: Operation<TInput>;\n}): OperationResultObservable<TRouter, TOutput> {\n return observable((observer) => {\n function execute(index = 0, op = opts.op) {\n const next = opts.links[index];\n if (!next) {\n throw new Error(\n 'No more links to execute - did you forget to add an ending link?',\n );\n }\n const subscription = next({\n op,\n next(nextOp) {\n const nextObserver = execute(index + 1, nextOp);\n\n return nextObserver;\n },\n });\n return subscription;\n }\n\n const obs$ = execute();\n return obs$.subscribe(observer);\n });\n}\n\nexport type CreateTRPCClientOptions<TRouter extends AnyRouter> =\n CreateTRPCClientBaseOptions<TRouter> & {\n links: TRPCLink<TRouter>[];\n };\n\nexport type CreateTRPCClientBaseOptions<TRouter extends AnyRouter> =\n TRouter['_def']['_config']['transformer'] extends DefaultDataTransformer\n ? {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @link https://trpc.io/docs/data-transformers\n **/\n transformer?: 'You must set a transformer on the backend router';\n }\n : TRouter['_def']['_config']['transformer'] extends DataTransformerOptions\n ? {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @link https://trpc.io/docs/data-transformers\n **/\n transformer: TRouter['_def']['_config']['transformer'] extends CombinedDataTransformer\n ? DataTransformerOptions\n : TRouter['_def']['_config']['transformer'];\n }\n : {\n /**\n * Data transformer\n *\n * You must use the same transformer on the backend and frontend\n * @link https://trpc.io/docs/data-transformers\n **/\n transformer?:\n | /** @deprecated **/ ClientDataTransformerOptions\n | CombinedDataTransformer;\n };\n","import type {\n AnyMutationProcedure,\n AnyProcedure,\n AnyQueryProcedure,\n AnyRouter,\n CombinedDataTransformer,\n DataTransformerOptions,\n inferProcedureInput,\n inferProcedureOutput,\n IntersectionError,\n ProcedureArgs,\n ProcedureRouterRecord,\n ProcedureType,\n} from '@trpc/server';\nimport {\n createFlatProxy,\n createRecursiveProxy,\n inferTransformedProcedureOutput,\n} from '@trpc/server/shared';\nimport {\n inferObservableValue,\n share,\n Observable as TrpcObservable,\n} from '@trpc/server/observable';\nimport { Observable as RxJSObservable } from 'rxjs';\nimport {\n TRPCClientError,\n OperationContext,\n OperationLink,\n TRPCClientRuntime,\n} from '@trpc/client';\nimport {\n createChain,\n CreateTRPCClientOptions,\n TRPCRequestOptions,\n TRPCType,\n} from './shared-internal';\n\n// Changed to rxjs observable\ntype Resolver<TProcedure extends AnyProcedure> = (\n ...args: ProcedureArgs<TProcedure['_def']>\n) => RxJSObservable<inferTransformedProcedureOutput<TProcedure>>;\n\n// Removed subscription and using new type\ntype DecorateProcedure<\n TProcedure extends AnyProcedure,\n TRouter extends AnyRouter,\n> = TProcedure extends AnyQueryProcedure\n ? {\n query: Resolver<TProcedure>;\n }\n : TProcedure extends AnyMutationProcedure\n ? {\n mutate: Resolver<TProcedure>;\n }\n : never;\n\n// Removed subscription and using new type\ntype DecoratedProcedureRecord<\n TProcedures extends ProcedureRouterRecord,\n TRouter extends AnyRouter,\n> = {\n [TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter\n ? DecoratedProcedureRecord<\n TProcedures[TKey]['_def']['record'],\n TProcedures[TKey]\n >\n : TProcedures[TKey] extends AnyProcedure\n ? DecorateProcedure<TProcedures[TKey], TRouter>\n : never;\n};\n\n// Removed subscription and using new type\nconst clientCallTypeMap: Record<\n keyof DecorateProcedure<any, any>,\n ProcedureType\n> = {\n query: 'query',\n mutate: 'mutation',\n};\n\n// Removed subscription and requestAsPromise\ntype UntypedClientProperties =\n | 'links'\n | 'runtime'\n | 'requestId'\n | '$request'\n | 'query'\n | 'mutation';\n\n// Nothing changed, only using new types\nexport type CreateTrpcProxyClient<TRouter extends AnyRouter> =\n DecoratedProcedureRecord<\n TRouter['_def']['record'],\n TRouter\n > extends infer TProcedureRecord\n ? UntypedClientProperties & keyof TProcedureRecord extends never\n ? TProcedureRecord\n : IntersectionError<UntypedClientProperties & keyof TProcedureRecord>\n : never;\n\n// Nothing changed, only using new types\nfunction createTRPCRxJSClientProxy<TRouter extends AnyRouter>(\n client: TRPCClient<TRouter>,\n) {\n return createFlatProxy<CreateTrpcProxyClient<TRouter>>((key) => {\n // eslint-disable-next-line no-prototype-builtins\n if (client.hasOwnProperty(key)) {\n return (client as any)[key as any];\n }\n return createRecursiveProxy(({ path, args }) => {\n const pathCopy = [key, ...path];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const clientCallType = pathCopy.pop()! as keyof DecorateProcedure<\n any,\n any\n >;\n\n const procedureType = clientCallTypeMap[clientCallType];\n\n const fullPath = pathCopy.join('.');\n\n return (client as any)[procedureType](fullPath, ...args);\n });\n });\n}\n\nexport function createTRPCRxJSProxyClient<TRouter extends AnyRouter>(\n opts: CreateTRPCClientOptions<TRouter>,\n) {\n const client = new TRPCClient<TRouter>(opts);\n const proxy = createTRPCRxJSClientProxy(client as TRPCClient<TRouter>);\n return proxy;\n}\n\n/**\n * Removed subscription method;\n * Remove converting trpc observables to promises and therefore also the AbortController\n * Add converting to rxjs observable\n */\nclass TRPCClient<TRouter extends AnyRouter> {\n private readonly links: OperationLink<TRouter>[];\n public readonly runtime: TRPCClientRuntime;\n private requestId: number;\n\n constructor(opts: CreateTRPCClientOptions<TRouter>) {\n this.requestId = 0;\n\n const combinedTransformer: CombinedDataTransformer = (() => {\n const transformer = opts.transformer as\n | DataTransformerOptions\n | undefined;\n\n if (!transformer) {\n return {\n input: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n output: {\n serialize: (data) => data,\n deserialize: (data) => data,\n },\n };\n }\n if ('input' in transformer) {\n return opts.transformer as CombinedDataTransformer;\n }\n return {\n input: transformer,\n output: transformer,\n };\n })();\n\n this.runtime = {\n transformer: {\n serialize: (data) => combinedTransformer.input.serialize(data),\n deserialize: (data) => combinedTransformer.output.deserialize(data),\n },\n combinedTransformer,\n };\n\n // Initialize the links\n this.links = opts.links.map((link) => link(this.runtime));\n }\n\n private $request<TInput = unknown, TOutput = unknown>({\n type,\n input,\n path,\n context = {},\n }: {\n type: TRPCType;\n input: TInput;\n path: string;\n context?: OperationContext;\n }) {\n const chain$ = createChain<AnyRouter, TInput, TOutput>({\n links: this.links as OperationLink<any, any, any>[],\n op: {\n id: ++this.requestId,\n type,\n path,\n input,\n context,\n },\n });\n type TValue = inferObservableValue<typeof chain$>;\n return trpcObservableToRxJsObservable<TValue>(chain$.pipe(share()));\n }\n\n public query<\n TQueries extends TRouter['_def']['queries'],\n TPath extends string & keyof TQueries,\n TInput extends inferProcedureInput<TQueries[TPath]>,\n >(path: TPath, input?: TInput, opts?: TRPCRequestOptions) {\n type TOutput = inferProcedureOutput<TQueries[TPath]>;\n return this.$request<TInput, TOutput>({\n type: 'query',\n path,\n input: input as TInput,\n context: opts?.context,\n });\n }\n\n public mutation<\n TMutations extends TRouter['_def']['mutations'],\n TPath extends string & keyof TMutations,\n TInput extends inferProcedureInput<TMutations[TPath]>,\n >(path: TPath, input?: TInput, opts?: TRPCRequestOptions) {\n type TOutput = inferTransformedProcedureOutput<TMutations[TPath]>;\n return this.$request<TInput, TOutput>({\n type: 'mutation',\n path,\n input: input as TInput,\n context: opts?.context,\n });\n }\n}\n\nfunction trpcObservableToRxJsObservable<TValue>(\n observable: TrpcObservable<TValue, unknown>,\n) {\n return new RxJSObservable<TValue>((subscriber) => {\n const sub = observable.subscribe({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n next: (value) => subscriber.next((value.result as any).data),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n error: (err) => subscriber.error(TRPCClientError.from(err)),\n complete: () => subscriber.complete(),\n });\n return () => {\n sub.unsubscribe();\n };\n });\n}\n","import { InjectionToken, Provider, signal, TransferState } from '@angular/core';\nimport 'isomorphic-fetch';\nimport {\n httpBatchLink,\n HttpBatchLinkOptions,\n CreateTRPCClientOptions,\n HTTPHeaders,\n} from '@trpc/client';\nimport { AnyRouter } from '@trpc/server';\nimport { transferStateLink } from './links/transfer-state-link';\nimport {\n provideTrpcCacheState,\n provideTrpcCacheStateStatusManager,\n tRPC_CACHE_STATE,\n} from './cache-state';\nimport { createTRPCRxJSProxyClient } from './trpc-rxjs-proxy';\n/**\n * Types copied from @trpc/client/dist/internals/types.d.ts for JSR compatibility\n * These types define the minimal fetch-like interface required by tRPC internally.\n *\n * @see https://github.com/trpc/trpc/blob/main/packages/client/src/internals/types.ts\n */\n\n/**\n * A subset of the standard RequestInit properties needed by tRPC internally.\n * @see RequestInit from lib.dom.d.ts\n * @remarks\n * If you need a property that you know exists but doesn't exist on this\n * interface, go ahead and add it.\n */\ninterface RequestInitEsque {\n /**\n * Sets the request's body.\n */\n body?: FormData | ReadableStream | string | null;\n /**\n * Sets the request's associated headers.\n */\n headers?: [string, string][] | Record<string, string>;\n /**\n * The request's HTTP-style method.\n */\n method?: string;\n /**\n * Sets the request's signal.\n */\n signal?: AbortSignal | null;\n}\n\n/**\n * A subset of the standard Response properties needed by tRPC internally.\n * @see Response from lib.dom.d.ts\n */\ninterface ResponseEsque {\n readonly body?: NodeJS.ReadableStream | WebReadableStreamEsque | null;\n /**\n * @remarks\n * The built-in Response::json() method returns Promise<any>, but\n * that's not as type-safe as unknown. We use unknown because we're\n * more type-safe. You do want more type safety, right? 😉\n */\n json(): Promise<unknown>;\n}\n\n/**\n * A subset of the standard ReadableStream properties needed by tRPC internally.\n * @see ReadableStream from lib.dom.d.ts\n */\ntype WebReadableStreamEsque = {\n getReader: () => ReadableStreamDefaultReader<Uint8Array>;\n};\n\n/**\n * A subset of the standard fetch function type needed by tRPC internally.\n * @see fetch from lib.dom.d.ts\n * @remarks\n * If you need a property that you know exists but doesn't exist on this\n * interface, go ahead and add it.\n */\ntype FetchEsque = (\n input: RequestInfo | URL | string,\n init?: RequestInit | RequestInitEsque,\n) => Promise<ResponseEsque>;\n\nexport type TrpcOptions<T extends AnyRouter> = {\n url: string;\n options?: Partial<CreateTRPCClientOptions<T>>;\n batchLinkOptions?: Omit<HttpBatchLinkOptions, 'url' | 'headers'>;\n};\n\nexport type TrpcClient<AppRouter extends AnyRouter> = ReturnType<\n typeof createTRPCRxJSProxyClient<AppRouter>\n>;\nconst tRPC_INJECTION_TOKEN = new InjectionToken<unknown>(\n '@benpsnyder/analogjs-esm-trpc proxy client',\n);\n\nfunction customFetch(\n input: RequestInfo | URL,\n init?: RequestInit & { method: 'GET' },\n) {\n if ((globalThis as any).$fetch) {\n return (globalThis as any).$fetch\n .raw(input.toString(), init)\n .catch((e: any) => {\n throw e;\n })\n .then((response: any) => ({\n ...response,\n headers: response.headers,\n json: () => Promise.resolve(response._data),\n }));\n }\n\n // dev server trpc for analog & nitro\n if (typeof window === 'undefined') {\n const host =\n process.env['NITRO_HOST'] ?? process.env['ANALOG_HOST'] ?? 'localhost';\n const port =\n process.env['NITRO_PORT'] ?? process.env['ANALOG_PORT'] ?? 4205;\n const base = `http://${host}:${port}`;\n if (input instanceof Request) {\n input = new Request(base, input);\n } else {\n input = new URL(input, base);\n }\n }\n\n return fetch(input, init);\n}\n\nexport const createTrpcClient = <AppRouter extends AnyRouter>({\n url,\n options,\n batchLinkOptions,\n}: TrpcOptions<AppRouter>) => {\n const TrpcHeaders = signal<HTTPHeaders>({});\n const provideTrpcClient = (): Provider[] => [\n provideTrpcCacheState(),\n provideTrpcCacheStateStatusManager(),\n {\n provide: tRPC_INJECTION_TOKEN,\n useFactory: () => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO: figure out why TS is complaining\n return createTRPCRxJSProxyClient<AppRouter>({\n transformer: options?.transformer,\n links: [\n ...(options?.links ?? []),\n transferStateLink(),\n httpBatchLink({\n ...(batchLinkOptions ?? {}),\n headers() {\n return TrpcHeaders();\n },\n fetch: customFetch as FetchEsque,\n url: url ?? '',\n }),\n ],\n });\n },\n deps: [tRPC_CACHE_STATE, TransferState],\n },\n ];\n const TrpcClient = tRPC_INJECTION_TOKEN as InjectionToken<\n TrpcClient<AppRouter>\n >;\n return {\n TrpcClient,\n provideTrpcClient,\n TrpcHeaders,\n /** @deprecated use TrpcClient instead */\n tRPCClient: TrpcClient,\n /** @deprecated use provideTrpcClient instead */\n provideTRPCClient: provideTrpcClient,\n /** @deprecated use TrpcHeaders instead */\n tRPCHeaders: TrpcHeaders,\n };\n};\n","import { firstValueFrom, isObservable, Observable } from 'rxjs';\n\ndeclare const Zone: any;\n\nexport async function waitFor<T>(prom: Promise<T> | Observable<T>): Promise<T> {\n if (isObservable(prom)) {\n prom = firstValueFrom(prom);\n }\n\n if (typeof Zone === 'undefined') {\n return prom;\n }\n\n const macroTask = Zone.current.scheduleMacroTask(\n `AnalogContentResolve-${Math.random()}`,\n () => {},\n {},\n () => {},\n );\n return prom.then((p: T) => {\n macroTask.invoke();\n return p;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["RxJSObservable"],"mappings":"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"}