From 95400e74004ba67596e9a6f12d87e7a16ba8643f Mon Sep 17 00:00:00 2001 From: unnoq Date: Sat, 15 Mar 2025 16:03:22 +0700 Subject: [PATCH 1/2] fix(server): `has no properties in common with type` ts-problem --- packages/contract/src/builder.ts | 6 +++++- packages/server/src/builder.ts | 4 ++-- packages/server/src/implementer.ts | 16 ++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/contract/src/builder.ts b/packages/contract/src/builder.ts index 4be923392..3b0c522e6 100644 --- a/packages/contract/src/builder.ts +++ b/packages/contract/src/builder.ts @@ -36,7 +36,11 @@ export class ContractBuilder< */ $meta( initialMeta: U, - ): ContractBuilder { + ): ContractBuilder> { + /** + * We need `& Record` to deal with `has no properties in common with type` error + */ + return new ContractBuilder({ ...this['~orpc'], meta: initialMeta, diff --git a/packages/server/src/builder.ts b/packages/server/src/builder.ts index 3b3900ea5..10d91e8f6 100644 --- a/packages/server/src/builder.ts +++ b/packages/server/src/builder.ts @@ -118,8 +118,8 @@ export class Builder< } middleware( // = any here is important to make middleware can be used in any output by default - middleware: Middleware, TMeta>, - ): DecoratedMiddleware, TMeta> { // ORPCErrorConstructorMap ensures middleware can used in any procedure + middleware: Middleware, TMeta>, + ): DecoratedMiddleware, TMeta> { // ORPCErrorConstructorMap ensures middleware can used in any procedure return decorateMiddleware(middleware) } diff --git a/packages/server/src/implementer.ts b/packages/server/src/implementer.ts index 71fff2ae3..c0c47e6da 100644 --- a/packages/server/src/implementer.ts +++ b/packages/server/src/implementer.ts @@ -23,14 +23,14 @@ export interface RouterImplementer< > { middleware( // = any here is important to make middleware can be used in any output by default middleware: Middleware< - TCurrentContext, + TInitialContext, UOutContext, TInput, TOutput, ORPCErrorConstructorMap>, InferContractRouterMeta >, - ): DecoratedMiddleware, InferContractRouterMeta> // ORPCErrorConstructorMap ensures middleware can used in any procedure + ): DecoratedMiddleware, InferContractRouterMeta> // ORPCErrorConstructorMap ensures middleware can used in any procedure use( middleware: Middleware< @@ -169,19 +169,15 @@ export type Implementer< TCurrentContext extends Context , > = & { - $context(): Implementer + $context(): Implementer, U> // We need `& Record` to deal with `has no properties in common with type` error $config(config: BuilderConfig): Implementer } & ImplementerInternal -export function implement< - TContract extends AnyContractRouter, - TInitialContext extends Context, - TCurrentContext extends Context, ->( - contract: TContract, +export function implement>( + contract: T, config: BuilderConfig = {}, -): Implementer { +): Implementer { const implInternal = implementerInternal(contract, config, []) const impl = new Proxy(implInternal, { From 6c6752640c6c3492db4e63af0fbe453ea8e0cf2c Mon Sep 17 00:00:00 2001 From: unnoq Date: Sat, 15 Mar 2025 16:12:08 +0700 Subject: [PATCH 2/2] sync tests --- packages/contract/src/builder.test-d.ts | 2 +- packages/server/src/builder.test-d.ts | 6 +++--- packages/server/src/implementer.test-d.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/contract/src/builder.test-d.ts b/packages/contract/src/builder.test-d.ts index a81327565..f0e3a2df1 100644 --- a/packages/contract/src/builder.test-d.ts +++ b/packages/contract/src/builder.test-d.ts @@ -25,7 +25,7 @@ describe('ContractBuilder', () => { type MetaDef = { meta1?: string, meta2?: number } expectTypeOf(builder.$meta({ meta1: 'value' })).toEqualTypeOf< - ContractBuilder + ContractBuilder> >() // @ts-expect-error - invalid initial meta diff --git a/packages/server/src/builder.test-d.ts b/packages/server/src/builder.test-d.ts index 1bcbfdc52..6392719cc 100644 --- a/packages/server/src/builder.test-d.ts +++ b/packages/server/src/builder.test-d.ts @@ -157,7 +157,7 @@ describe('Builder', () => { expectTypeOf( builder.middleware(({ context, next, path, procedure, errors, signal }, input, output) => { expectTypeOf(input).toEqualTypeOf() - expectTypeOf(context).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() expectTypeOf(path).toEqualTypeOf() expectTypeOf(procedure).toEqualTypeOf< Procedure @@ -173,7 +173,7 @@ describe('Builder', () => { }) }), ).toEqualTypeOf< - DecoratedMiddleware, BaseMeta> + DecoratedMiddleware, BaseMeta> >() // @ts-expect-error --- conflict context @@ -184,7 +184,7 @@ describe('Builder', () => { expectTypeOf( builder.middleware(({ next }, input: 'input', output: MiddlewareOutputFn<'output'>) => next()), ).toEqualTypeOf< - DecoratedMiddleware, 'input', 'output', ORPCErrorConstructorMap, BaseMeta> + DecoratedMiddleware, 'input', 'output', ORPCErrorConstructorMap, BaseMeta> >() }) }) diff --git a/packages/server/src/implementer.test-d.ts b/packages/server/src/implementer.test-d.ts index daa00140b..7485a341b 100644 --- a/packages/server/src/implementer.test-d.ts +++ b/packages/server/src/implementer.test-d.ts @@ -41,7 +41,7 @@ describe('Implementer', () => { it('works', () => { const mid = implementer.nested.middleware(({ context, next, path, procedure, errors, signal }, input, output) => { expectTypeOf(input).toEqualTypeOf() - expectTypeOf(context).toEqualTypeOf() + expectTypeOf(context).toEqualTypeOf() expectTypeOf(path).toEqualTypeOf() expectTypeOf(procedure).toEqualTypeOf< Procedure @@ -57,9 +57,9 @@ describe('Implementer', () => { }) }) - expectTypeOf(mid).toMatchTypeOf< + expectTypeOf(mid).toEqualTypeOf< DecoratedMiddleware< - CurrentContext, + InitialContext, { extra: boolean }, unknown, any, @@ -77,7 +77,7 @@ describe('Implementer', () => { implementer.middleware(({ next }, input: 'input', output: MiddlewareOutputFn<'output'>) => next()), ).toEqualTypeOf< DecoratedMiddleware< - CurrentContext, + InitialContext, Record, 'input', 'output',