diff --git a/packages/server/src/implementer-procedure.test-d.ts b/packages/server/src/implementer-procedure.test-d.ts index 05fd6a633..4eb841e2d 100644 --- a/packages/server/src/implementer-procedure.test-d.ts +++ b/packages/server/src/implementer-procedure.test-d.ts @@ -146,7 +146,7 @@ describe('ImplementedProcedure', () => { }) expectTypeOf(applied).toEqualTypeOf< - Procedure< + ImplementedProcedure< InitialContext, CurrentContext, typeof inputSchema, @@ -164,7 +164,7 @@ describe('ImplementedProcedure', () => { }) expectTypeOf(applied).toEqualTypeOf< - Procedure< + ImplementedProcedure< InitialContext, CurrentContext, typeof inputSchema, diff --git a/packages/server/src/implementer-procedure.ts b/packages/server/src/implementer-procedure.ts index 0f6c22713..7cb13821f 100644 --- a/packages/server/src/implementer-procedure.ts +++ b/packages/server/src/implementer-procedure.ts @@ -73,7 +73,7 @@ export interface ImplementedProcedure< TClientContext > > - ): Procedure + ): ImplementedProcedure & ProcedureClient /** @@ -90,7 +90,7 @@ export interface ImplementedProcedure< TClientContext > > - ): Procedure + ): ImplementedProcedure & ((...rest: ClientRest>) => Promise>) } diff --git a/packages/server/src/procedure-decorated.test-d.ts b/packages/server/src/procedure-decorated.test-d.ts index 490169fce..567dfadfa 100644 --- a/packages/server/src/procedure-decorated.test-d.ts +++ b/packages/server/src/procedure-decorated.test-d.ts @@ -174,7 +174,7 @@ describe('DecoratedProcedure', () => { }) expectTypeOf(applied).toEqualTypeOf< - Procedure< + DecoratedProcedure< InitialContext, CurrentContext, typeof inputSchema, @@ -192,7 +192,7 @@ describe('DecoratedProcedure', () => { }) expectTypeOf(applied).toEqualTypeOf< - Procedure< + DecoratedProcedure< InitialContext, CurrentContext, typeof inputSchema, diff --git a/packages/server/src/procedure-decorated.test.ts b/packages/server/src/procedure-decorated.test.ts index 6f7e898c5..19e74c397 100644 --- a/packages/server/src/procedure-decorated.test.ts +++ b/packages/server/src/procedure-decorated.test.ts @@ -107,19 +107,42 @@ describe('decoratedProcedure', () => { expect(createProcedureClient).toBeCalledTimes(1) expect(createProcedureClient).toBeCalledWith(decorated, options) - expect(applied).not.haveOwnPropertyDescriptor('use') + + // can access to function properties + expect('name' in applied).toBe(true) + expect(typeof applied.name).toBe('string') + expect('length' in applied).toBe(true) + expect(typeof applied.length).toBe('number') + + expect('use' in applied).toBe(true) + expect('route' in applied).toBe(true) + expect('meta' in applied).toBe(true) + + expect(applied.route({})).toBeInstanceOf(DecoratedProcedure) + expect(applied.route({})).toEqual(decorated) }) it('.actionable', () => { const options = { context: { db: 'postgres' } } const applied = decorated.actionable(options) - expect(applied).toBeInstanceOf(Function) expect(applied).toSatisfy(isProcedure) expect(createProcedureClient).toBeCalledTimes(1) expect(createProcedureClient).toBeCalledWith(decorated, options) - expect(applied).not.haveOwnPropertyDescriptor('use') + + // can access to function properties + expect('name' in applied).toBe(true) + expect(typeof applied.name).toBe('string') + expect('length' in applied).toBe(true) + expect(typeof applied.length).toBe('number') + + expect('use' in applied).toBe(true) + expect('route' in applied).toBe(true) + expect('meta' in applied).toBe(true) + + expect(applied.route({})).toBeInstanceOf(DecoratedProcedure) + expect(applied.route({})).toEqual(decorated) }) }) diff --git a/packages/server/src/procedure-decorated.ts b/packages/server/src/procedure-decorated.ts index 04a834264..a0cf177f5 100644 --- a/packages/server/src/procedure-decorated.ts +++ b/packages/server/src/procedure-decorated.ts @@ -117,12 +117,16 @@ export class DecoratedProcedure< TClientContext > > - ): Procedure + ): DecoratedProcedure & ProcedureClient { - return Object.assign(createProcedureClient(this, ...rest as any), { - '~type': 'Procedure' as const, - '~orpc': this['~orpc'], - }) + return new Proxy(createProcedureClient(this, ...rest as any), { + get: (target, key) => { + return Reflect.has(this, key) ? Reflect.get(this, key) : Reflect.get(target, key) + }, + has: (target, key) => { + return Reflect.has(this, key) || Reflect.has(target, key) + }, + }) as any } /** @@ -140,7 +144,7 @@ export class DecoratedProcedure< > > ): - & Procedure + & DecoratedProcedure & ((...rest: ClientRest>) => Promise>) { return this.callable(...rest) }