import { createFlatProxy } from "../proxy"; import { createMiddlewareFactory } from "./middleware"; import { createBuilder } from "./procedureBuilder"; import { createRouterFactory } from "./router"; import type { InferOptional, RootConfig, RootConfigTypes, RuntimeConfig, UndefinedKeys, } from "./types"; /** * @internal */ type FlatOverwrite = InferOptional< { [TKey in keyof TWith | keyof TType]: TKey extends keyof TWith ? TWith[TKey] : TKey extends keyof TType ? TType[TKey] : never; }, UndefinedKeys | UndefinedKeys >; /** * @internal */ type CreateRootConfigTypes = TGenerics; type CreateRootConfigTypesFromPartial> = CreateRootConfigTypes<{ ctx: TTypes["ctx"] extends RootConfigTypes["ctx"] ? TTypes["ctx"] : {}; meta: TTypes["meta"] extends RootConfigTypes["meta"] ? TTypes["meta"] : {}; entity: TTypes["entity"] extends RootConfigTypes["entity"] ? TTypes["entity"] : {}; }>; /** * @internal */ type ValidateShape = TActualShape extends TExpectedShape ? Exclude extends never ? TActualShape : TExpectedShape : never; class LiveQueryBuilder = {}> { context() { return new LiveQueryBuilder>(); } meta() { return new LiveQueryBuilder>(); } dataStreamEntity() { return new LiveQueryBuilder>(); } create>( options?: ValidateShape>, ) { return createTRPCInner()(options); } } /** * Initialize Live Query - be done exactly once per backend */ export const initLiveQuery = new LiveQueryBuilder(); /** * The default check to see if we're in a server */ const isServerDefault: boolean = typeof window === "undefined" || "Deno" in window || globalThis.process?.env?.NODE_ENV === "test"; function createTRPCInner>() { type $Generics = CreateRootConfigTypesFromPartial; type $Context = $Generics["ctx"]; type $Meta = $Generics["meta"]; type $Entity = $Generics["entity"]; type $Runtime = Partial; return function initTRPCInner( runtime?: ValidateShape, ) { type $Config = RootConfig<{ ctx: $Context; meta: $Meta; entity: $Entity; }>; const config: $Config = { isDev: runtime?.isDev ?? globalThis.process?.env?.NODE_ENV !== "production", allowOutsideOfServer: runtime?.allowOutsideOfServer ?? false, isServer: runtime?.isServer ?? isServerDefault, /** * @internal */ $types: createFlatProxy((key) => { throw new Error(`Tried to access "$types.${key}" which is not available at runtime`); }), }; { // Server check const isServer: boolean = runtime?.isServer ?? isServerDefault; if (!isServer && runtime?.allowOutsideOfServer !== true) { throw new Error( `You're trying to use @live-query/server in a non-server environment. This is not supported by default.`, ); } } return { /** * These are just types, they can't be used * @internal */ _config: config, /** * Builder object for creating procedures */ procedure: createBuilder<$Config>(), /** * Create reusable middlewares */ middleware: createMiddlewareFactory<$Config>(), /** * Create a router */ router: createRouterFactory<$Config>(config), }; }; }