Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 30 additions & 32 deletions packages/server/src/builder-variants.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ describe('BuilderWithMiddlewares', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
BuilderWithMiddlewares<
Expand Down Expand Up @@ -236,18 +236,17 @@ describe('BuilderWithMiddlewares', () => {

builder.router({
// @ts-expect-error - initial context is not match
ping: {} as Procedure<{ invalid: true }, Context, undefined, undefined, unknown, Record<never, never>, BaseMeta>,
ping: {} as Procedure<{ invalid: true }, any, any, any, any, any>,
})

builder.router({
// @ts-expect-error - meta def is not match
ping: {} as Procedure<
Context,
Context,
undefined,
undefined,
unknown,
Record<never, never>,
any,
any,
any,
any,
any,
{ invalid: true }
>,
})
Expand All @@ -261,19 +260,19 @@ describe('BuilderWithMiddlewares', () => {
// @ts-expect-error - initial context is not match
builder.lazy(() => Promise.resolve({
default: {
ping: {} as Procedure<{ invalid: true }, Context, AnySchema, AnySchema, Record<never, never>, BaseMeta>,
ping: {} as Procedure<{ invalid: true }, any, any, any, any, any>,
},
}))

// @ts-expect-error - meta def is not match
builder.lazy(() => Promise.resolve({
default: {
ping: {} as Procedure<
Context,
Context,
AnySchema,
AnySchema,
Record<never, never>,
any,
any,
any,
any,
any,
{ invalid: true }
>,
},
Expand Down Expand Up @@ -368,7 +367,7 @@ describe('ProcedureBuilder', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
ProcedureBuilder<
Expand Down Expand Up @@ -610,7 +609,7 @@ describe('ProcedureBuilderWithInput', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
ProcedureBuilderWithInput<
Expand Down Expand Up @@ -799,7 +798,7 @@ describe('ProcedureBuilderWithOutput', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
ProcedureBuilderWithOutput<
Expand Down Expand Up @@ -1028,7 +1027,7 @@ describe('ProcedureBuilderWithInputOutput', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
ProcedureBuilderWithInputOutput<
Expand Down Expand Up @@ -1173,7 +1172,7 @@ describe('RouterBuilder', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
RouterBuilder<
Expand Down Expand Up @@ -1208,18 +1207,17 @@ describe('RouterBuilder', () => {

builder.router({
// @ts-expect-error - initial context is not match
ping: {} as Procedure<{ invalid: true }, Context, undefined, undefined, unknown, Record<never, never>, BaseMeta>,
ping: {} as Procedure<{ invalid: true }, any, any, any, any, any>,
})

builder.router({
// @ts-expect-error - meta def is not match
ping: {} as Procedure<
Context,
Context,
undefined,
undefined,
unknown,
Record<never, never>,
any,
any,
any,
any,
any,
{ invalid: true }
>,
})
Expand All @@ -1233,19 +1231,19 @@ describe('RouterBuilder', () => {
// @ts-expect-error - initial context is not match
builder.lazy(() => Promise.resolve({
default: {
ping: {} as Procedure<{ invalid: true }, Context, AnySchema, AnySchema, Record<never, never>, BaseMeta>,
ping: {} as Procedure<{ invalid: true }, any, any, any, any, any>,
},
}))

// @ts-expect-error - meta def is not match
builder.lazy(() => Promise.resolve({
default: {
ping: {} as Procedure<
Context,
Context,
AnySchema,
AnySchema,
Record<never, never>,
any,
any,
any,
any,
any,
{ invalid: true }
>,
},
Expand Down
21 changes: 10 additions & 11 deletions packages/server/src/builder.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ describe('Builder', () => {
it('.$context', () => {
expectTypeOf(builder.$context()).toEqualTypeOf<
Builder<
Context,
Context & Record<never, never>,
Context,
typeof inputSchema,
typeof outputSchema,
Expand All @@ -72,7 +72,7 @@ describe('Builder', () => {
>()
expectTypeOf(builder.$context<{ anything: string }>()).toEqualTypeOf<
Builder<
{ anything: string },
{ anything: string } & Record<never, never>,
{ anything: string },
typeof inputSchema,
typeof outputSchema,
Expand All @@ -90,7 +90,7 @@ describe('Builder', () => {
typeof inputSchema,
typeof outputSchema,
typeof baseErrorMap,
{ auth?: boolean }
{ auth?: boolean } & Record<never, never>
>
>()

Expand Down Expand Up @@ -298,7 +298,7 @@ describe('Builder', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
BuilderWithMiddlewares<
Expand Down Expand Up @@ -437,18 +437,17 @@ describe('Builder', () => {

builder.router({
// @ts-expect-error - initial context is not match
ping: {} as Procedure<{ invalid: true }, Context, undefined, undefined, unknown, Record<never, never>, BaseMeta>,
ping: {} as Procedure<{ invalid: true }, any, any, any, any, any>,
})

builder.router({
// @ts-expect-error - meta def is not match
ping: {} as Procedure<
Context,
Context,
undefined,
undefined,
unknown,
Record<never, never>,
any,
any,
any,
any,
any,
{ invalid: true }
>,
})
Expand Down
12 changes: 10 additions & 2 deletions packages/server/src/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,11 @@ export class Builder<
/**
* Reset initial context
*/
$context<U extends Context>(): Builder<U, U, TInputSchema, TOutputSchema, TErrorMap, TMeta> {
$context<U extends Context>(): Builder<U & Record<never, never>, U, TInputSchema, TOutputSchema, TErrorMap, TMeta> {
/**
* We need `& Record<never, never>` to deal with `has no properties in common with type` error
*/

return new Builder({
...this['~orpc'],
middlewares: [],
Expand All @@ -81,7 +85,11 @@ export class Builder<
*/
$meta<U extends Meta>(
initialMeta: U,
): Builder<TInitialContext, TCurrentContext, TInputSchema, TOutputSchema, TErrorMap, U> {
): Builder<TInitialContext, TCurrentContext, TInputSchema, TOutputSchema, TErrorMap, U & Record<never, never>> {
/**
* We need `& Record<never, never>` to deal with `has no properties in common with type` error
*/

return new Builder({
...this['~orpc'],
meta: initialMeta,
Expand Down
14 changes: 11 additions & 3 deletions packages/server/src/context.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,20 @@ it('ContextExtendsGuard', () => {
expectTypeOf<ContextExtendsGuard<{ a: string }, { a: string }>>().toEqualTypeOf<unknown>()
expectTypeOf < ContextExtendsGuard< { a: string, b: string }, Empty>>().toEqualTypeOf<unknown>()
expectTypeOf < ContextExtendsGuard< { a: string, b: string }, Record<never, never>>>().toEqualTypeOf<unknown>()
expectTypeOf < ContextExtendsGuard< { a: string, b: string }, { g?: string }>>().toEqualTypeOf<unknown>()
expectTypeOf<ContextExtendsGuard<Empty, { a?: string }>>().toEqualTypeOf<unknown>()
expectTypeOf<ContextExtendsGuard<{ b: string }, { a?: string }>>().toEqualTypeOf<unknown>()
expectTypeOf<ContextExtendsGuard<{ b?: string }, { a?: string }>>().toEqualTypeOf<unknown>()

expectTypeOf < ContextExtendsGuard < { a: string }, { a: string, b: string }>>().toEqualTypeOf<never>()
expectTypeOf < ContextExtendsGuard < { a: number }, { a: string }>>().toEqualTypeOf<never>()
expectTypeOf<ContextExtendsGuard<Empty, { a: string }>>().toEqualTypeOf<never>()

expectTypeOf<ContextExtendsGuard<{ a: string, b: string }, { g?: string }>>().toEqualTypeOf<never>()
expectTypeOf<ContextExtendsGuard<{ b: string }, { a?: string }>>().toEqualTypeOf<never>()
expectTypeOf<ContextExtendsGuard<{ b?: string }, { a?: string }>>().toEqualTypeOf<never>()

/**
* We can use `& Record<never, never>` to deal with `has no properties in common with type` error
*/
expectTypeOf<ContextExtendsGuard<{ a: string, b: string }, { g?: string } & Record<never, never>>>().toEqualTypeOf<unknown>()
expectTypeOf<ContextExtendsGuard<{ b: string }, { a?: string } & Record<never, never>>>().toEqualTypeOf<unknown>()
expectTypeOf<ContextExtendsGuard<{ b?: string }, { a?: string } & Record<never, never>>>().toEqualTypeOf<unknown>()
})
2 changes: 1 addition & 1 deletion packages/server/src/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ export function mergeCurrentContext<T extends Context, U extends Context>(
return { ...context, ...other }
}

export type ContextExtendsGuard<T extends Context, U extends Context> = T extends T & U ? unknown : never
export type ContextExtendsGuard<T extends Context, U extends Context> = T extends U ? unknown : never
4 changes: 2 additions & 2 deletions packages/server/src/implementer-procedure.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ describe('ImplementedProcedure', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(implemented.use(mid)).toEqualTypeOf<
ImplementedProcedure<
Expand Down Expand Up @@ -322,7 +322,7 @@ describe('ProcedureImplementer', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
ProcedureImplementer<
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/implementer-variants.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ describe('ImplementerWithMiddlewares', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(implementer.use(mid)).toEqualTypeOf<
ImplementerInternalWithMiddlewares<
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/implementer.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ describe('Implementer', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, unknown, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(implementer.use(mid)).toEqualTypeOf<
ImplementerInternalWithMiddlewares<
Expand Down
6 changes: 3 additions & 3 deletions packages/server/src/middleware-decorated.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,11 @@ describe('DecoratedMiddleware', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(decorated.concat(mid)).toEqualTypeOf<
DecoratedMiddleware<
CurrentContext & Omit<{ cacheable?: boolean }, 'db' | 'auth' | 'extra'>,
CurrentContext & Omit<{ cacheable?: boolean } & Record<never, never>, 'db' | 'auth' | 'extra'>,
Omit<{ extra: boolean }, never> & Record<never, never>,
{ input: string },
{ output: number },
Expand All @@ -147,7 +147,7 @@ describe('DecoratedMiddleware', () => {

expectTypeOf(decorated.concat(mid, () => { })).toEqualTypeOf<
DecoratedMiddleware<
CurrentContext & Omit<{ cacheable?: boolean }, 'db' | 'auth' | 'extra'>,
CurrentContext & Omit<{ cacheable?: boolean } & Record<never, never>, 'db' | 'auth' | 'extra'>,
Omit<{ extra: boolean }, never> & Record<never, never>,
{ input: string },
{ output: number },
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/procedure-decorated.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ describe('DecoratedProcedure', () => {
})

it('with TInContext', () => {
const mid = {} as Middleware<{ cacheable?: boolean }, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>
const mid = {} as Middleware<{ cacheable?: boolean } & Record<never, never>, Record<never, never>, unknown, any, ORPCErrorConstructorMap<any>, BaseMeta>

expectTypeOf(builder.use(mid)).toEqualTypeOf<
DecoratedProcedure<
Expand Down