From d8abf9f44f235f63d7f56eb9e5ca66618e4f1874 Mon Sep 17 00:00:00 2001 From: Paul O'Reilly Date: Fri, 22 Nov 2024 09:56:40 +0100 Subject: [PATCH] feat: ability to merge routers with same alias. references kevinedry/nestjs-trpc#42 --- .../__tests__/router.generator.spec.ts | 47 ++++++++++++++++--- .../lib/generators/router.generator.ts | 18 +++++-- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/packages/nestjs-trpc/lib/generators/__tests__/router.generator.spec.ts b/packages/nestjs-trpc/lib/generators/__tests__/router.generator.spec.ts index e76a669..4a91fd8 100644 --- a/packages/nestjs-trpc/lib/generators/__tests__/router.generator.spec.ts +++ b/packages/nestjs-trpc/lib/generators/__tests__/router.generator.spec.ts @@ -2,12 +2,8 @@ import { Test, TestingModule } from '@nestjs/testing'; import { RouterGenerator } from '../router.generator'; import { DecoratorGenerator } from '../decorator.generator'; import { Project, SourceFile } from 'ts-morph'; -import { RoutersFactoryMetadata, } from '../../interfaces/factory.interface'; -import { - DecoratorGeneratorMetadata, - ProcedureGeneratorMetadata, - RouterGeneratorMetadata, -} from '../../interfaces/generator.interface'; +import { RoutersFactoryMetadata } from '../../interfaces/factory.interface'; +import { DecoratorGeneratorMetadata, RouterGeneratorMetadata } from '../../interfaces/generator.interface'; import { Query, Mutation } from '../../decorators'; import { z } from 'zod'; import { ProcedureGenerator } from '../procedure.generator'; @@ -178,5 +174,44 @@ describe('RouterGenerator', () => { '})' ); }); + + it.only('should generate merged router string from metadata', () => { + const mockRouterMetadata: Array = [ + { + name: 'TestRouter', + alias: 'test', + procedures: [ + { + name: 'testQuery', + decorators: [{ name: 'Query', arguments: {} }], + }, + { + name: 'testMutation', + decorators: [{ name: 'Mutation', arguments: {} }], + }, + ], + }, + { + name: 'TestRouter', + alias: 'test', + procedures: [ + { + name: 'testQueryExtended', + decorators: [{ name: 'Query', arguments: {} }], + }, + ], + }, + ]; + + const result = routerGenerator.generateRoutersStringFromMetadata(mockRouterMetadata); + + expect(result).toBe( + 'test: t.router({ ' + + 'testQuery: publicProcedure.query(async () => "PLACEHOLDER_DO_NOT_REMOVE" as any ),\n' + + 'testMutation: publicProcedure.mutation(async () => "PLACEHOLDER_DO_NOT_REMOVE" as any ),\n ' + + 'testQueryExtended: publicProcedure.query(async () => "PLACEHOLDER_DO_NOT_REMOVE" as any ) ' + + '})' + ); + }); }); }); \ No newline at end of file diff --git a/packages/nestjs-trpc/lib/generators/router.generator.ts b/packages/nestjs-trpc/lib/generators/router.generator.ts index 6482b2d..d432b25 100644 --- a/packages/nestjs-trpc/lib/generators/router.generator.ts +++ b/packages/nestjs-trpc/lib/generators/router.generator.ts @@ -85,10 +85,20 @@ export class RouterGenerator { public generateRoutersStringFromMetadata( routers: Array, ): string { - return routers - .map((router) => { - const { name, procedures, alias } = router; - return `${alias ?? camelCase(name)}: t.router({ ${procedures + const routersMap: { [key: string]: ProcedureGeneratorMetadata[] } = {}; + + routers.forEach((router) => { + const { name, procedures, alias } = router; + const routerName = alias ?? camelCase(name); + + routersMap[routerName] = (routersMap[routerName] ?? []).concat( + procedures, + ); + }); + + return Object.entries(routersMap) + .map(([routerName, procedures]) => { + return `${routerName}: t.router({ ${procedures .map(this.procedureGenerator.generateProcedureString) .join(',\n')} })`; })