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
9 changes: 6 additions & 3 deletions apps/content/docs/advanced/validation-errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { RPCHandler } from '@orpc/server/fetch'
import { router } from './shared/planet'
// ---cut---
import { onError, ORPCError, ValidationError } from '@orpc/server'
import { ZodError, type ZodIssue } from 'zod'
import { ZodError } from 'zod'
import type { ZodIssue } from 'zod'

const handler = new RPCHandler(router, {
clientInterceptors: [
Expand Down Expand Up @@ -53,7 +54,8 @@ const handler = new RPCHandler(router, {
## Customizing with Middleware

```ts twoslash
import { z, ZodError, type ZodIssue } from 'zod'
import { z, ZodError } from 'zod'
import type { ZodIssue } from 'zod'
import { onError, ORPCError, os, ValidationError } from '@orpc/server'

const base = os.use(onError((error) => {
Expand Down Expand Up @@ -105,7 +107,8 @@ As explained in the [error handling guide](/docs/error-handling#combining-both-a
import { RPCHandler } from '@orpc/server/fetch'
// ---cut---
import { onError, ORPCError, os, ValidationError } from '@orpc/server'
import { z, ZodError, type ZodIssue } from 'zod'
import { z, ZodError } from 'zod'
import type { ZodIssue } from 'zod'

const base = os.errors({
INPUT_VALIDATION_FAILED: {
Expand Down
4 changes: 2 additions & 2 deletions apps/content/docs/tanstack-query/react.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Integrate oRPC React Query utils into your React app with Context:
```ts twoslash
import { router } from './shared/planet'
// ---cut---
import { createContext, useContext } from 'react'
import { createContext, use } from 'react'
import { RouterUtils } from '@orpc/react-query'
import { RouterClient } from '@orpc/server'

Expand All @@ -83,7 +83,7 @@ Integrate oRPC React Query utils into your React app with Context:
export const ORPCContext = createContext<ORPCReactUtils | undefined>(undefined)

export function useORPC(): ORPCReactUtils {
const orpc = useContext(ORPCContext)
const orpc = use(ORPCContext)
if (!orpc) {
throw new Error('ORPCContext is not set up properly')
}
Expand Down
2 changes: 1 addition & 1 deletion apps/content/examples/openai-streaming.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const complete = os
stream: true,
})

yield * stream
yield* stream
})

const router = { complete }
Expand Down
6 changes: 0 additions & 6 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@ import antfu from '@antfu/eslint-config'
import pluginBan from 'eslint-plugin-ban'

export default antfu({
react: true,
formatters: true,
}, {
plugins: { ban: pluginBan },
rules: {
'ts/consistent-type-definitions': 'off',
'react-refresh/only-export-components': 'off',
'react/prefer-destructuring-assignment': 'off',
'react/no-context-provider': 'off',
'ts/method-signature-style': ['off'],
'ban/ban': [
'error',
Expand Down Expand Up @@ -38,7 +34,6 @@ export default antfu({
rules: {
'unused-imports/no-unused-vars': 'off',
'antfu/no-top-level-await': 'off',
'react-hooks/rules-of-hooks': 'off',
'no-alert': 'off',
'ban/ban': 'off',
},
Expand All @@ -48,7 +43,6 @@ export default antfu({
'no-console': 'off',
'perfectionist/sort-imports': 'off',
'import/first': 'off',
'react-hooks/rules-of-hooks': 'off',
'ban/ban': 'off',
},
}, {
Expand Down
5 changes: 1 addition & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
"packages:changelog:github": "pnpm dlx changelogithub --draft"
},
"devDependencies": {
"@antfu/eslint-config": "^3.9.2",
"@eslint-react/eslint-plugin": "^1.16.2",
"@antfu/eslint-config": "^4.0.0",
"@solidjs/testing-library": "^0.8.10",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@testing-library/jest-dom": "^6.6.3",
Expand All @@ -42,8 +41,6 @@
"eslint": "^9.15.0",
"eslint-plugin-ban": "^2.0.0",
"eslint-plugin-format": "^0.1.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.14",
"jsdom": "^25.0.1",
"lint-staged": "^15.2.10",
"simple-git-hooks": "^2.11.1",
Expand Down
3 changes: 2 additions & 1 deletion packages/client/src/adapters/standard/link.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import type { Interceptor, ThrowableError } from '@orpc/shared'
import type { StandardLazyResponse, StandardRequest } from '@orpc/standard-server'
import type { ClientContext, ClientLink, ClientOptions } from '../../types'
import type { StandardLinkPlugin } from './plugin'
import type { StandardLinkClient, StandardLinkCodec } from './types'
import { intercept, toArray } from '@orpc/shared'
import { CompositeStandardLinkPlugin, type StandardLinkPlugin } from './plugin'
import { CompositeStandardLinkPlugin } from './plugin'

export interface StandardLinkInterceptorOptions<T extends ClientContext> extends ClientOptions<T> {
path: readonly string[]
Expand Down
3 changes: 2 additions & 1 deletion packages/client/src/adapters/standard/rpc-json-serializer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { isObject, type Segment } from '@orpc/shared'
import type { Segment } from '@orpc/shared'
import { isObject } from '@orpc/shared'

export const STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES = {
BIGINT: 0,
Expand Down
3 changes: 2 additions & 1 deletion packages/client/src/adapters/standard/rpc-link-codec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import type { Value } from '@orpc/shared'
import type { StandardHeaders, StandardLazyResponse, StandardRequest, StandardResponse } from '@orpc/standard-server'
import type { ClientContext, ClientOptions, HTTPMethod } from '../../types'
import type { StandardRPCSerializer } from './rpc-serializer'
import type { StandardLinkCodec } from './types'
import { isAsyncIteratorObject, stringifyJSON, value, type Value } from '@orpc/shared'
import { isAsyncIteratorObject, stringifyJSON, value } from '@orpc/shared'
import { mergeStandardHeaders } from '@orpc/standard-server'
import { createORPCErrorFromJson, isORPCErrorJson, isORPCErrorStatus, ORPCError } from '../../error'
import { getMalformedResponseErrorCode, toHttpPath } from './utils'
Expand Down
9 changes: 6 additions & 3 deletions packages/client/src/adapters/standard/rpc-link.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import type { ClientContext } from '../../types'
import type { StandardLinkOptions } from './link'
import type { StandardRPCJsonSerializerOptions } from './rpc-json-serializer'
import type { StandardRPCLinkCodecOptions } from './rpc-link-codec'
import type { StandardLinkClient } from './types'
import { StandardLink, type StandardLinkOptions } from './link'
import { StandardRPCJsonSerializer, type StandardRPCJsonSerializerOptions } from './rpc-json-serializer'
import { StandardRPCLinkCodec, type StandardRPCLinkCodecOptions } from './rpc-link-codec'
import { StandardLink } from './link'
import { StandardRPCJsonSerializer } from './rpc-json-serializer'
import { StandardRPCLinkCodec } from './rpc-link-codec'
import { StandardRPCSerializer } from './rpc-serializer'

export interface StandardRPCLinkOptions<T extends ClientContext>
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/dynamic-link.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { DynamicLink } from './dynamic-link'
describe('dynamicLink', () => {
it('pass correct context', () => {
void new DynamicLink<{ batch?: boolean }>(({ context }, path, input) => {
expectTypeOf(context).toEqualTypeOf<{ batch?: boolean } >()
expectTypeOf(context).toEqualTypeOf<{ batch?: boolean }>()

return {} as any
})
Expand Down
5 changes: 3 additions & 2 deletions packages/client/src/error.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { isObject, type MaybeOptionalOptions } from '@orpc/shared'
import type { MaybeOptionalOptions } from '@orpc/shared'
import { isObject } from '@orpc/shared'

export const COMMON_ORPC_ERROR_DEFS = {
BAD_REQUEST: {
Expand Down Expand Up @@ -172,7 +173,7 @@ export function isORPCErrorJson(json: unknown): json is ORPCErrorJSON<ORPCErrorC
export function createORPCErrorFromJson<TCode extends ORPCErrorCode, TData>(
json: ORPCErrorJSON<TCode, TData>,
options: ErrorOptions = {},
): ORPCError < TCode, TData > {
): ORPCError <TCode, TData> {
return new ORPCError(json.code, {
...options,
...json,
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/plugins/batch.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ describe('batchLinkPlugin', () => {
)
})

it.each([new FormData(), (async function*() {})()])('not batch on un-supported body', async (body) => {
it.each([new FormData(), (async function* () {})()])('not batch on un-supported body', async (body) => {
encode.mockResolvedValueOnce({
body,
headers: {
Expand Down
3 changes: 2 additions & 1 deletion packages/client/src/plugins/simple-csrf-protection.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { Value } from '@orpc/shared'
import type { StandardLinkClientInterceptorOptions, StandardLinkOptions, StandardLinkPlugin } from '../adapters/standard'
import type { ClientContext } from '../types'
import { value, type Value } from '@orpc/shared'
import { value } from '@orpc/shared'

export interface SimpleCsrfProtectionLinkPluginOptions<T extends ClientContext> {
/**
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/utils.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ describe('safe', async () => {
const { error, data } = await safe({} as Promise<number>)

expectTypeOf(error).toEqualTypeOf<Error | null>()
expectTypeOf(data).toEqualTypeOf<number | undefined >()
expectTypeOf(data).toEqualTypeOf<number | undefined>()
})
})
3 changes: 2 additions & 1 deletion packages/contract/src/builder-variants.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import type { OmitChainMethodDeep } from '@orpc/shared'
import type { baseErrorMap, BaseMeta, inputSchema, outputSchema } from '../tests/shared'
import type { ContractBuilder } from './builder'
import type { ContractProcedureBuilder, ContractProcedureBuilderWithInput, ContractProcedureBuilderWithInputOutput, ContractProcedureBuilderWithOutput, ContractRouterBuilder } from './builder-variants'
import type { MergedErrorMap } from './error'
import type { ContractProcedure } from './procedure'
import type { EnhancedContractRouter } from './router-utils'
import type { Schema } from './schema'
import { type baseErrorMap, type BaseMeta, generalSchema, type inputSchema, type outputSchema, ping, pong } from '../tests/shared'
import { generalSchema, ping, pong } from '../tests/shared'

const generalBuilder = {} as ContractBuilder<typeof inputSchema, typeof outputSchema, typeof baseErrorMap, BaseMeta>

Expand Down
12 changes: 8 additions & 4 deletions packages/contract/src/builder.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import type { HTTPPath } from '@orpc/client'
import type { ContractProcedureBuilder, ContractProcedureBuilderWithInput, ContractProcedureBuilderWithOutput, ContractRouterBuilder } from './builder-variants'
import type { ErrorMap, MergedErrorMap } from './error'
import type { Meta } from './meta'
import type { ContractProcedureDef } from './procedure'
import type { Route } from './route'
import type { ContractRouter } from './router'
import type { EnhanceContractRouterOptions, EnhancedContractRouter } from './router-utils'
import type { AnySchema, Schema } from './schema'
import { type ErrorMap, type MergedErrorMap, mergeErrorMap } from './error'
import { mergeMeta, type Meta } from './meta'
import { mergeErrorMap } from './error'
import { mergeMeta } from './meta'
import { ContractProcedure } from './procedure'
import { mergePrefix, mergeRoute, mergeTags, type Route } from './route'
import { enhanceContractRouter, type EnhanceContractRouterOptions, type EnhancedContractRouter } from './router-utils'
import { mergePrefix, mergeRoute, mergeTags } from './route'
import { enhanceContractRouter } from './router-utils'

export interface ContractBuilderDef<
TInputSchema extends AnySchema,
Expand Down
6 changes: 3 additions & 3 deletions packages/contract/src/event-iterator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ describe('eventIterator', async () => {
it('can validate yields', async () => {
const schema = eventIterator(z.object({ order: z.number() }))

const result = await schema['~standard'].validate((async function*() {
const result = await schema['~standard'].validate((async function* () {
yield { order: 1 }
yield withEventMeta({ order: 2 }, { id: 'id-2' })
yield { order: '3' }
Expand Down Expand Up @@ -53,7 +53,7 @@ describe('eventIterator', async () => {
it('can validate returns', async () => {
const schema = eventIterator(z.object({ order: z.number() }), z.object({ order: z.number() }))

const result = await schema['~standard'].validate((async function*() {
const result = await schema['~standard'].validate((async function* () {
return { order: 1 }
})())

Expand All @@ -73,7 +73,7 @@ describe('eventIterator', async () => {
it('not required returns schema', async () => {
const schema = eventIterator(z.object({ order: z.number() }))

const result = await schema['~standard'].validate((async function*() {
const result = await schema['~standard'].validate((async function* () {
return 'anything'
})())

Expand Down
6 changes: 4 additions & 2 deletions packages/contract/src/router-utils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { ErrorMap, MergedErrorMap } from './error'
import type { EnhanceRouteOptions } from './route'
import type { AnyContractRouter } from './router'
import { type ErrorMap, type MergedErrorMap, mergeErrorMap } from './error'
import { mergeErrorMap } from './error'
import { ContractProcedure, isContractProcedure } from './procedure'
import { enhanceRoute, type EnhanceRouteOptions } from './route'
import { enhanceRoute } from './route'

export function getContractRouter(router: AnyContractRouter, path: readonly string[]): AnyContractRouter | undefined {
let current: AnyContractRouter | undefined = router
Expand Down
3 changes: 2 additions & 1 deletion packages/contract/src/schema.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import type { AnySchema, InferSchemaInput, InferSchemaOutput } from './schema'
import { type as arktypeType } from 'arktype'
import * as v from 'valibot'
import { z } from 'zod'
import { type AnySchema, type InferSchemaInput, type InferSchemaOutput, type } from './schema'
import { type } from './schema'

const zod = z.object({
value: z.string().transform(() => 123),
Expand Down
6 changes: 4 additions & 2 deletions packages/openapi-client/src/adapters/fetch/openapi-link.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { ClientContext } from '@orpc/client'
import type { LinkFetchClientOptions } from '@orpc/client/fetch'
import type { AnyContractRouter } from '@orpc/contract'
import { LinkFetchClient, type LinkFetchClientOptions } from '@orpc/client/fetch'
import { StandardOpenAPILink, type StandardOpenAPILinkOptions } from '../standard'
import type { StandardOpenAPILinkOptions } from '../standard'
import { LinkFetchClient } from '@orpc/client/fetch'
import { StandardOpenAPILink } from '../standard'

export interface OpenAPILinkOptions<T extends ClientContext>
extends StandardOpenAPILinkOptions<T>, LinkFetchClientOptions<T> { }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { isObject, type Segment } from '@orpc/shared'
import type { Segment } from '@orpc/shared'
import { isObject } from '@orpc/shared'

export type StandardBracketNotationSerialized = [string, unknown][]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import type { ClientContext, ClientOptions, HTTPPath } from '@orpc/client'
import type { StandardLinkCodec } from '@orpc/client/standard'
import type { AnyContractProcedure, AnyContractRouter } from '@orpc/contract'
import type { Value } from '@orpc/shared'
import type { StandardHeaders, StandardLazyResponse, StandardRequest, StandardResponse } from '@orpc/standard-server'
import type { StandardOpenAPISerializer } from './openapi-serializer'
import { type ClientContext, type ClientOptions, createORPCErrorFromJson, type HTTPPath, isORPCErrorJson, isORPCErrorStatus } from '@orpc/client'
import { createORPCErrorFromJson, isORPCErrorJson, isORPCErrorStatus } from '@orpc/client'
import { getMalformedResponseErrorCode, toHttpPath } from '@orpc/client/standard'
import { fallbackContractConfig, isContractProcedure, ORPCError } from '@orpc/contract'
import { get, isObject, value, type Value } from '@orpc/shared'
import { get, isObject, value } from '@orpc/shared'
import { mergeStandardHeaders } from '@orpc/standard-server'
import { getDynamicParams, standardizeHTTPPath } from './utils'

Expand Down
9 changes: 6 additions & 3 deletions packages/openapi-client/src/adapters/standard/openapi-link.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import type { ClientContext } from '@orpc/client'
import type { StandardLinkClient, StandardLinkOptions } from '@orpc/client/standard'
import type { AnyContractRouter } from '@orpc/contract'
import { StandardLink, type StandardLinkClient, type StandardLinkOptions } from '@orpc/client/standard'
import type { StandardOpenAPIJsonSerializerOptions } from './openapi-json-serializer'
import type { StandardOpenapiLinkCodecOptions } from './openapi-link-codec'
import { StandardLink } from '@orpc/client/standard'
import { StandardBracketNotationSerializer } from './bracket-notation'
import { StandardOpenAPIJsonSerializer, type StandardOpenAPIJsonSerializerOptions } from './openapi-json-serializer'
import { StandardOpenapiLinkCodec, type StandardOpenapiLinkCodecOptions } from './openapi-link-codec'
import { StandardOpenAPIJsonSerializer } from './openapi-json-serializer'
import { StandardOpenapiLinkCodec } from './openapi-link-codec'
import { StandardOpenAPISerializer } from './openapi-serializer'

export interface StandardOpenAPILinkOptions<T extends ClientContext>
Expand Down
3 changes: 2 additions & 1 deletion packages/openapi/src/adapters/node/openapi-handler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import type { Context, Router } from '@orpc/server'
import type { NodeHttpHandlerOptions } from '@orpc/server/node'
import type { StandardOpenAPIHandlerOptions } from '../standard'
import { NodeHttpHandler } from '@orpc/server/node'
import { StandardOpenAPIHandler, type StandardOpenAPIHandlerOptions } from '../standard'
import { StandardOpenAPIHandler } from '../standard'

export class OpenAPIHandler<T extends Context> extends NodeHttpHandler<T> {
constructor(router: Router<any, T>, options: NoInfer<StandardOpenAPIHandlerOptions<T> & NodeHttpHandlerOptions<T>> = {}) {
Expand Down
6 changes: 4 additions & 2 deletions packages/openapi/src/adapters/standard/openapi-handler.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import type { StandardOpenAPIJsonSerializerOptions } from '@orpc/openapi-client/standard'
import type { Context, Router } from '@orpc/server'
import { StandardBracketNotationSerializer, StandardOpenAPIJsonSerializer, type StandardOpenAPIJsonSerializerOptions, StandardOpenAPISerializer } from '@orpc/openapi-client/standard'
import { StandardHandler, type StandardHandlerOptions } from '@orpc/server/standard'
import type { StandardHandlerOptions } from '@orpc/server/standard'
import { StandardBracketNotationSerializer, StandardOpenAPIJsonSerializer, StandardOpenAPISerializer } from '@orpc/openapi-client/standard'
import { StandardHandler } from '@orpc/server/standard'
import { StandardOpenAPICodec } from './openapi-codec'
import { StandardOpenAPIMatcher } from './openapi-matcher'

Expand Down
3 changes: 2 additions & 1 deletion packages/openapi/src/adapters/standard/openapi-matcher.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import type { HTTPPath } from '@orpc/client'
import type { AnyContractProcedure } from '@orpc/contract'
import type { AnyProcedure, AnyRouter, LazyTraverseContractProceduresOptions } from '@orpc/server'
import type { StandardMatcher, StandardMatchResult } from '@orpc/server/standard'
import { toHttpPath } from '@orpc/client/standard'
import { type AnyContractProcedure, fallbackContractConfig } from '@orpc/contract'
import { fallbackContractConfig } from '@orpc/contract'
import { createContractedProcedure, getLazyMeta, getRouter, isProcedure, traverseContractProcedures, unlazy } from '@orpc/server'
import { addRoute, createRouter, findRoute } from 'rou3'
import { decodeParams, toRou3Pattern } from './utils'
Expand Down
3 changes: 2 additions & 1 deletion packages/openapi/src/openapi-generator.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { AnyContractProcedure } from '@orpc/contract'
import type { PartialDeep } from '@orpc/shared'
import type { OpenAPI } from './openapi'
import { type AnyContractProcedure, eventIterator, oc } from '@orpc/contract'
import { eventIterator, oc } from '@orpc/contract'
import { z } from 'zod'
import { oz, ZodToJsonSchemaConverter } from '../../zod/src'
import { customOpenAPIOperation } from './openapi-custom'
Expand Down
3 changes: 2 additions & 1 deletion packages/openapi/src/openapi-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { StandardOpenAPIJsonSerializerOptions } from '@orpc/openapi-client/
import type { AnyRouter } from '@orpc/server'
import type { OpenAPI } from './openapi'
import type { JSONSchema } from './schema'
import type { ConditionalSchemaConverter, SchemaConverter } from './schema-converter'
import { fallbackORPCErrorMessage, fallbackORPCErrorStatus } from '@orpc/client'
import { toHttpPath } from '@orpc/client/standard'
import { fallbackContractConfig, getEventIteratorSchemaDetails } from '@orpc/contract'
Expand All @@ -11,7 +12,7 @@ import { resolveContractProcedures } from '@orpc/server'
import { clone, toArray } from '@orpc/shared'
import { applyCustomOpenAPIOperation } from './openapi-custom'
import { checkParamsSchema, toOpenAPIContent, toOpenAPIEventIteratorContent, toOpenAPIMethod, toOpenAPIParameters, toOpenAPIPath, toOpenAPISchema } from './openapi-utils'
import { CompositeSchemaConverter, type ConditionalSchemaConverter, type SchemaConverter } from './schema-converter'
import { CompositeSchemaConverter } from './schema-converter'
import { applySchemaOptionality, isAnySchema, isObjectSchema, separateObjectSchema } from './schema-utils'

class OpenAPIGeneratorError extends Error {}
Expand Down
Loading