From 7f32043bff8ba44b1e58d7cea6451f7e2669cd08 Mon Sep 17 00:00:00 2001 From: unnoq Date: Mon, 10 Mar 2025 20:50:34 +0700 Subject: [PATCH] feat(server): unlazyRouter utility --- packages/server/src/router-utils.test-d.ts | 18 ++++++++++++++-- packages/server/src/router-utils.test.ts | 15 ++++++++++++- packages/server/src/router-utils.ts | 25 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/packages/server/src/router-utils.test-d.ts b/packages/server/src/router-utils.test-d.ts index 50db2df1f..e947f7338 100644 --- a/packages/server/src/router-utils.test-d.ts +++ b/packages/server/src/router-utils.test-d.ts @@ -1,10 +1,11 @@ import type { MergedErrorMap, Meta, Schema } from '@orpc/contract' import type { baseErrorMap, BaseMeta, inputSchema, outputSchema } from '../../contract/tests/shared' -import type { CurrentContext, InitialContext, ping, pong, router } from '../tests/shared' +import type { CurrentContext, InitialContext, router } from '../tests/shared' import type { Context } from './context' import type { Lazy } from './lazy' import type { Procedure } from './procedure' -import type { AccessibleLazyRouter, EnhancedRouter } from './router-utils' +import type { AccessibleLazyRouter, EnhancedRouter, UnlaziedRouter } from './router-utils' +import { ping, pong } from '../tests/shared' it('AccessibleLazyRouter', () => { type Accessible = AccessibleLazyRouter> @@ -70,3 +71,16 @@ it('EnhancedRouter', () => { > >() }) + +it('UnlaziedRouter', () => { + type Unlazied = UnlaziedRouter + + expectTypeOf().toEqualTypeOf({ + ping, + pong, + nested: { + ping, + pong, + }, + }) +}) diff --git a/packages/server/src/router-utils.test.ts b/packages/server/src/router-utils.test.ts index cd8b2b409..800a06597 100644 --- a/packages/server/src/router-utils.test.ts +++ b/packages/server/src/router-utils.test.ts @@ -2,7 +2,7 @@ import { enhanceRoute } from '@orpc/contract' import { contract, ping, pingMiddleware, pong, router } from '../tests/shared' import { getLazyMeta, isLazy, unlazy } from './lazy' import { setHiddenRouterContract } from './router-hidden' -import { enhanceRouter, getRouter, resolveContractProcedures, traverseContractProcedures } from './router-utils' +import { enhanceRouter, getRouter, resolveContractProcedures, traverseContractProcedures, unlazyRouter } from './router-utils' it('getRouter', () => { expect(getRouter(router, [])).toEqual(router) @@ -188,3 +188,16 @@ it('resolveContractProcedures', async () => { path: ['nested', 'pong'], }) }) + +it('unlazyRouter', async () => { + const unlazied = await unlazyRouter(router) + + expect(unlazied).toEqual({ + ping, + pong, + nested: { + ping, + pong, + }, + }) +}) diff --git a/packages/server/src/router-utils.ts b/packages/server/src/router-utils.ts index ea4858bff..1a9922db9 100644 --- a/packages/server/src/router-utils.ts +++ b/packages/server/src/router-utils.ts @@ -223,3 +223,28 @@ export async function resolveContractProcedures( } } } + +export type UnlaziedRouter = + T extends AnyProcedure + ? T + : { + [K in keyof T]: T[K] extends Lazyable ? UnlaziedRouter : never + } + +export async function unlazyRouter(router: T): Promise> { + if (isProcedure(router)) { + return router as any + } + + const unlazied = {} as Record + + for (const key in router) { + const item: Lazyable = router[key]! + + const { default: unlaziedRouter } = await unlazy(item) + + unlazied[key] = await unlazyRouter(unlaziedRouter) + } + + return unlazied as any +}