From eeb4a3918d81229c99e67c2bb9ba8d0b76def05d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 14:37:55 +0000 Subject: [PATCH 1/4] refactor!: stop exporting internal-only APIs before v2 stable Helpers that only exist to support each package's own implementation are no longer exported from its entry points, so they can change freely after v2 is stable. Each symbol was checked to have no use in other workspace packages, docs, playgrounds, e2e tests or benches. Removed exports: - @orpc/server: augmentRouter, augmentImplementedRouter (+ options types), createRouterImplementer, decorateMiddleware, createGuardedProcedureLazy, createContractProcedure, withHiddenRouterContract, getHiddenRouterContract, and the cloneORPCError / reconcileORPCError re-exports - @orpc/server/standard: CompositeStandardHandlerPlugin, TracingHandlerPlugin - @orpc/client: resolveFriendlyClientOptions - @orpc/client/standard: CompositeStandardLinkPlugin - @orpc/contract: augmentContractRouter, HIDDEN_META_PLUGINS_SYMBOL, getAsyncIteratorObjectSchemaDetails (+ AsyncIteratorObjectSchemaDetails) - @orpc/shared: AsyncIdQueue, startSpan, setSpanAttributeIfDefined, runInSpanContext - @orpc/openapi: isBodylessMethod, DEFAULT_OPENAPI_SUCCESS_DESCRIPTION, DEFAULT_OPENAPI_INPUT_STRUCTURE, DEFAULT_OPENAPI_OUTPUT_STRUCTURE - @orpc/openapi/standard: serializeHeaders - @orpc/tanstack-query, @orpc/pinia-colada: generateOperationKey, isProcedureUtilsOptions, CompositeRouterUtilsPlugin, serializableStreamedQuery (and liveQuery in Pinia Colada) - @orpc/swr: generateOperationKey, isSubsetOf Now type-only exports, because they appear in public inferred types but are only constructed internally: SharedRouterImplementer (@orpc/server), ProcedureUtils and SharedUtils (TanStack Query, Pinia Colada, SWR), and HTTPProcedureUtils (@orpc/msw). Kept on purpose: adapter building blocks (StandardHandler, RPCMatcher, createStandardPeerRequestHandler, WebSocketHandler, ...), the @orpc/json-schema toolkit, meta readers (getMcpToolMeta, ...), mergeProcedureUtilsOptions for RouterUtilsPlugin authors, unique-symbol context keys that appear in public types, and deprecated aliases. Index tests now assert the internals are not exported. The OpenAPI matcher test builds its contract-first router with implement(contract).router() instead of withHiddenRouterContract. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01U63hBfpeESmJiHXznRFzjN --- .../src/adapters/standard/index.test.ts | 6 ++++ .../client/src/adapters/standard/index.ts | 2 +- packages/client/src/index.test.ts | 6 ++++ packages/client/src/index.ts | 3 +- packages/contract/src/index.test.ts | 8 +++++ packages/contract/src/index.ts | 16 ++++++++-- packages/contract/src/meta.ts | 2 +- packages/msw/src/index.test.ts | 6 ++++ packages/msw/src/index.ts | 2 +- .../src/adapters/standard/index.test.ts | 6 ++++ .../openapi/src/adapters/standard/index.ts | 1 - .../adapters/standard/openapi-matcher.test.ts | 14 +++++---- packages/openapi/src/index.test.ts | 9 ++++++ packages/openapi/src/index.ts | 4 +-- packages/pinia-colada/src/index.test.ts | 16 +++++++--- packages/pinia-colada/src/index.ts | 31 +++++++++++++++---- .../server/src/adapters/standard/handler.ts | 2 +- .../src/adapters/standard/index.test.ts | 10 ++++-- .../server/src/adapters/standard/index.ts | 2 +- packages/server/src/index.test.ts | 16 ++++++++++ packages/server/src/index.ts | 29 ++++++++++++----- packages/server/src/router-utils.ts | 4 +-- packages/shared/src/index.test.ts | 9 ++++++ packages/shared/src/index.ts | 19 ++++++++++-- packages/swr/src/index.test.ts | 11 +++++-- packages/swr/src/index.ts | 11 ++++--- packages/tanstack-query/src/index.test.ts | 11 +++++++ packages/tanstack-query/src/index.ts | 30 +++++++++++++++--- 28 files changed, 235 insertions(+), 51 deletions(-) diff --git a/packages/client/src/adapters/standard/index.test.ts b/packages/client/src/adapters/standard/index.test.ts index 97ea9309e0..e60142a65f 100644 --- a/packages/client/src/adapters/standard/index.test.ts +++ b/packages/client/src/adapters/standard/index.test.ts @@ -4,3 +4,9 @@ it('exports StandardLink, RPCLinkCodec', async () => { RPCLinkCodec: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('CompositeStandardLinkPlugin') +}) diff --git a/packages/client/src/adapters/standard/index.ts b/packages/client/src/adapters/standard/index.ts index 5427ab9a81..b2a051e923 100644 --- a/packages/client/src/adapters/standard/index.ts +++ b/packages/client/src/adapters/standard/index.ts @@ -1,5 +1,5 @@ export * from './codec' export * from './link' -export * from './plugin' +export type { StandardLinkPlugin } from './plugin' export * from './rpc-link-codec' export * from './transport' diff --git a/packages/client/src/index.test.ts b/packages/client/src/index.test.ts index ca43438720..292897f00a 100644 --- a/packages/client/src/index.test.ts +++ b/packages/client/src/index.test.ts @@ -7,3 +7,9 @@ it('exports createORPCClient, ORPCError, DynamicLink, RPCJsonSerializer, RPCSeri RPCSerializer: expect.any(Function), })) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('resolveFriendlyClientOptions') +}) diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 69c52e14b9..258e1dd93a 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -14,7 +14,8 @@ export type { */ InferClientError as InferClientErrorUnion, } from './types' -export * from './utils' +export { resolveClientRest, safe } from './utils' +export type { SafeResult } from './utils' export type { AsyncCleanupFn, diff --git a/packages/contract/src/index.test.ts b/packages/contract/src/index.test.ts index 1a98e575e8..3874aafd86 100644 --- a/packages/contract/src/index.test.ts +++ b/packages/contract/src/index.test.ts @@ -3,3 +3,11 @@ it('exports oc', async () => { oc: expect.any(Object), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('augmentContractRouter') + expect(mod).not.toHaveProperty('getAsyncIteratorObjectSchemaDetails') + expect(mod).not.toHaveProperty('HIDDEN_META_PLUGINS_SYMBOL') +}) diff --git a/packages/contract/src/index.ts b/packages/contract/src/index.ts index ec469c0589..30be2534e8 100644 --- a/packages/contract/src/index.ts +++ b/packages/contract/src/index.ts @@ -41,7 +41,15 @@ export type { */ RouterContractClient as ContractRouterClient, } from './router-client' -export * from './router-utils' +export { + getProcedureContractOrThrow, + getRouterContract, + minifyRouterContract, +} from './router-utils' +export type { + AugmentContractRouterOptions, + AugmentedContractRouter, +} from './router-utils' export { /** * @deprecated Use `getRouterContract` instead. @@ -53,7 +61,11 @@ export { minifyRouterContract as minifyContractRouter, } from './router-utils' export * from './schema' -export * from './schema-built-in' +export { + asyncIteratorObject, + getAsyncIteratorObjectSchemasDetails, +} from './schema-built-in' +export type { AsyncIteratorObjectSchemasDetails } from './schema-built-in' export { /** * @deprecated Use `asyncIteratorObject` instead. diff --git a/packages/contract/src/meta.ts b/packages/contract/src/meta.ts index 589855d53a..9ca70849dd 100644 --- a/packages/contract/src/meta.ts +++ b/packages/contract/src/meta.ts @@ -60,7 +60,7 @@ export interface MetaPlugin< */ export type AnyMetaPlugin = MetaPlugin -export const HIDDEN_META_PLUGINS_SYMBOL = Symbol.for('ORPC_HIDDEN_META_PLUGINS') +const HIDDEN_META_PLUGINS_SYMBOL = Symbol.for('ORPC_HIDDEN_META_PLUGINS') export function getHiddenMetaPlugins(container: unknown): AnyMetaPlugin[] | undefined { if (!isTypescriptObject(container)) { diff --git a/packages/msw/src/index.test.ts b/packages/msw/src/index.test.ts index d72bfb7e38..217ae1bdfd 100644 --- a/packages/msw/src/index.test.ts +++ b/packages/msw/src/index.test.ts @@ -3,3 +3,9 @@ it('exports createHTTPUtils', async () => { createHTTPUtils: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('HTTPProcedureUtils') +}) diff --git a/packages/msw/src/index.ts b/packages/msw/src/index.ts index 433871cb1b..bf017a1456 100644 --- a/packages/msw/src/index.ts +++ b/packages/msw/src/index.ts @@ -1,2 +1,2 @@ -export * from './http-procedure-utils' +export type { HTTPProcedureUtils, HTTPProcedureUtilsOptions } from './http-procedure-utils' export * from './http-router-utils' diff --git a/packages/openapi/src/adapters/standard/index.test.ts b/packages/openapi/src/adapters/standard/index.test.ts index fe77888524..f686eb4c53 100644 --- a/packages/openapi/src/adapters/standard/index.test.ts +++ b/packages/openapi/src/adapters/standard/index.test.ts @@ -5,3 +5,9 @@ it('exports OpenAPIMatcher, OpenAPIHandlerCodec, OpenAPILinkCodec', async () => OpenAPILinkCodec: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('serializeHeaders') +}) diff --git a/packages/openapi/src/adapters/standard/index.ts b/packages/openapi/src/adapters/standard/index.ts index 487a43e4e0..a754da32a1 100644 --- a/packages/openapi/src/adapters/standard/index.ts +++ b/packages/openapi/src/adapters/standard/index.ts @@ -1,4 +1,3 @@ export * from './openapi-handler-codec' export * from './openapi-link-codec' export * from './openapi-matcher' -export * from './utils' diff --git a/packages/openapi/src/adapters/standard/openapi-matcher.test.ts b/packages/openapi/src/adapters/standard/openapi-matcher.test.ts index da889a51c4..9183724ed8 100644 --- a/packages/openapi/src/adapters/standard/openapi-matcher.test.ts +++ b/packages/openapi/src/adapters/standard/openapi-matcher.test.ts @@ -1,5 +1,5 @@ import { oc } from '@orpc/contract' -import { os, withHiddenRouterContract } from '@orpc/server' +import { implement, os } from '@orpc/server' import { findAllRoutes } from 'rou3' import { getOpenAPIMeta, openapi } from '../../meta' import { OpenAPIMatcher } from './openapi-matcher' @@ -742,7 +742,7 @@ describe('openAPIMatcher', () => { ping: oc.meta(openapi({ method: 'DELETE', path: '/contract/{id}' })), } - const matcher = new OpenAPIMatcher(withHiddenRouterContract(implementation, contract)) + const matcher = new OpenAPIMatcher(implement(contract).router(implementation)) const firstResult = await matcher.match('DELETE', '/contract/42', undefined) expect(firstResult).toBeDefined() @@ -763,11 +763,13 @@ describe('openAPIMatcher', () => { }) it('throws when a contract-first implementation is missing', async () => { - const matcher = new OpenAPIMatcher(withHiddenRouterContract({ - ping: os.handler(() => 'pong'), - }, { + const contract = { missing: oc.meta(openapi({ method: 'GET', path: '/missing' })), - })) + } + + const matcher = new OpenAPIMatcher(implement(contract).router({ + ping: os.handler(() => 'pong'), + } as any)) await expect(matcher.match('GET', '/missing', undefined)).rejects.toThrowError( '[Contract-First] Missing or invalid implementation for procedure at path: "missing"', diff --git a/packages/openapi/src/index.test.ts b/packages/openapi/src/index.test.ts index c4c7f8558e..3f695cc237 100644 --- a/packages/openapi/src/index.test.ts +++ b/packages/openapi/src/index.test.ts @@ -7,3 +7,12 @@ it('exports openapi meta, OpenAPIGenerator, OpenAPISerializer, OpenAPIJsonSerial BracketNotationSerializer: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_INPUT_STRUCTURE') + expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_OUTPUT_STRUCTURE') + expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_SUCCESS_DESCRIPTION') + expect(mod).not.toHaveProperty('isBodylessMethod') +}) diff --git a/packages/openapi/src/index.ts b/packages/openapi/src/index.ts index c4e3d738ed..261fb78de6 100644 --- a/packages/openapi/src/index.ts +++ b/packages/openapi/src/index.ts @@ -1,13 +1,13 @@ export * from './bracket-notation' export * from './client-factory' -export * from './constants' +export { DEFAULT_OPENAPI_METHOD } from './constants' export * from './meta' export * from './openapi-generator' export * from './openapi-json-serializer' export * from './openapi-serializer' export * from './router-utils' export * from './types' -export * from './utils' +export { getDynamicPathParams } from './utils' export { COMMON_ERROR_STATUS_MAP, diff --git a/packages/pinia-colada/src/index.test.ts b/packages/pinia-colada/src/index.test.ts index 8330e1e15a..e8f511f230 100644 --- a/packages/pinia-colada/src/index.test.ts +++ b/packages/pinia-colada/src/index.test.ts @@ -2,10 +2,18 @@ it('exports createPiniaColadaUtils, PINIA_COLADA_OPERATION_CONTEXT_SYMBOL', asyn await expect(import('./index')).resolves.toMatchObject({ createPiniaColadaUtils: expect.any(Function), createRouterUtils: expect.any(Function), - generateOperationKey: expect.any(Function), - serializableStreamedQuery: expect.any(Function), - liveQuery: expect.any(Function), - CompositeRouterUtilsPlugin: expect.any(Function), PINIA_COLADA_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('CompositeRouterUtilsPlugin') + expect(mod).not.toHaveProperty('generateOperationKey') + expect(mod).not.toHaveProperty('isProcedureUtilsOptions') + expect(mod).not.toHaveProperty('liveQuery') + expect(mod).not.toHaveProperty('ProcedureUtils') + expect(mod).not.toHaveProperty('serializableStreamedQuery') + expect(mod).not.toHaveProperty('SharedUtils') +}) diff --git a/packages/pinia-colada/src/index.ts b/packages/pinia-colada/src/index.ts index 43a0189a80..c75dbd7cf6 100644 --- a/packages/pinia-colada/src/index.ts +++ b/packages/pinia-colada/src/index.ts @@ -1,9 +1,28 @@ export * from './contract-utils' -export * from './key' -export * from './live-query' +export type { + OperationKey, + OperationKeyBaseOptions, + OperationKeyOptions, + OperationKeyPrefixOptions, +} from './key' export * from './meta' -export * from './plugin' -export * from './procedure-utils' +export type { RouterUtilsPlugin } from './plugin' +export { mergeProcedureUtilsOptions } from './procedure-utils' +export type { + ProcedureUtils, + ProcedureUtilsInfiniteInterceptor, + ProcedureUtilsInfiniteInterceptorOptions, + ProcedureUtilsLiveInterceptor, + ProcedureUtilsLiveInterceptorOptions, + ProcedureUtilsModifier, + ProcedureUtilsMutationInterceptor, + ProcedureUtilsMutationInterceptorOptions, + ProcedureUtilsOptions, + ProcedureUtilsQueryInterceptor, + ProcedureUtilsQueryInterceptorOptions, + ProcedureUtilsStreamedInterceptor, + ProcedureUtilsStreamedInterceptorOptions, +} from './procedure-utils' export * from './router-utils' export { /** @@ -14,8 +33,8 @@ export { export { createRouterUtils as createPiniaColadaUtils, } from './router-utils' -export * from './shared-utils' -export * from './stream-query' +export type { SharedUtils } from './shared-utils' +export type { SerializableStreamedQueryOptions } from './stream-query' export * from './types' export { OPERATION_CONTEXT_SYMBOL as PINIA_COLADA_OPERATION_CONTEXT_SYMBOL, diff --git a/packages/server/src/adapters/standard/handler.ts b/packages/server/src/adapters/standard/handler.ts index e9eaa85913..bf2fc52fbf 100644 --- a/packages/server/src/adapters/standard/handler.ts +++ b/packages/server/src/adapters/standard/handler.ts @@ -200,7 +200,7 @@ export class StandardHandler { } } -export class TracingHandlerPlugin implements StandardHandlerPlugin { +class TracingHandlerPlugin implements StandardHandlerPlugin { name = '~tracing' init(options: StandardHandlerOptions): StandardHandlerOptions { diff --git a/packages/server/src/adapters/standard/index.test.ts b/packages/server/src/adapters/standard/index.test.ts index 6efd06809d..eab640fff4 100644 --- a/packages/server/src/adapters/standard/index.test.ts +++ b/packages/server/src/adapters/standard/index.test.ts @@ -1,9 +1,15 @@ -it('exports StandardHandler, CompositeStandardHandlerPlugin, resolveFriendlyStandardHandlerHandleOptions, RPCMatcher, RPCHandlerCodec', async () => { +it('exports StandardHandler, resolveFriendlyStandardHandlerHandleOptions, RPCMatcher, RPCHandlerCodec', async () => { await expect(import('.')).resolves.toMatchObject({ StandardHandler: expect.any(Function), - CompositeStandardHandlerPlugin: expect.any(Function), resolveFriendlyStandardHandlerHandleOptions: expect.any(Function), RPCMatcher: expect.any(Function), RPCHandlerCodec: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('CompositeStandardHandlerPlugin') + expect(mod).not.toHaveProperty('TracingHandlerPlugin') +}) diff --git a/packages/server/src/adapters/standard/index.ts b/packages/server/src/adapters/standard/index.ts index 80e653d980..e84a94c5ec 100644 --- a/packages/server/src/adapters/standard/index.ts +++ b/packages/server/src/adapters/standard/index.ts @@ -1,6 +1,6 @@ export * from './codec' export * from './handler' -export * from './plugin' +export type { StandardHandlerPlugin } from './plugin' export * from './rpc-handler-codec' export * from './rpc-matcher' export * from './utils' diff --git a/packages/server/src/index.test.ts b/packages/server/src/index.test.ts index d7f8fd9aea..4ea76693b5 100644 --- a/packages/server/src/index.test.ts +++ b/packages/server/src/index.test.ts @@ -7,3 +7,19 @@ it('exports os, ORPCError, createRouterClient, RPCJsonSerializer, RPCSerializer' RPCSerializer: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('augmentImplementedRouter') + expect(mod).not.toHaveProperty('augmentRouter') + expect(mod).not.toHaveProperty('cloneORPCError') + expect(mod).not.toHaveProperty('createContractProcedure') + expect(mod).not.toHaveProperty('createGuardedProcedureLazy') + expect(mod).not.toHaveProperty('createRouterImplementer') + expect(mod).not.toHaveProperty('decorateMiddleware') + expect(mod).not.toHaveProperty('getHiddenRouterContract') + expect(mod).not.toHaveProperty('reconcileORPCError') + expect(mod).not.toHaveProperty('SharedRouterImplementer') + expect(mod).not.toHaveProperty('withHiddenRouterContract') +}) diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 5215f4ae25..b6a410c283 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -4,14 +4,20 @@ export * from './constants' export * from './context' export * from './implementer' export * from './implementer-procedure' -export * from './implementer-router' +export type { + RouterImplementer, + RouterImplementerWithMiddlewares, + SharedRouterImplementer, + SharedRouterImplementerWithMiddlewares, +} from './implementer-router' export * from './lazy' export * from './middleware' -export * from './middleware-decorated' +export type { DecoratedMiddleware } from './middleware-decorated' export * from './procedure' export * from './procedure-client' export * from './procedure-decorated' -export * from './procedure-utils' +export { call } from './procedure-utils' +export type { CallOptions, CallRest } from './procedure-utils' export * from './router' export type { /** @@ -20,8 +26,19 @@ export type { InferRouterFinalContexts as InferRouterCurrentContexts, } from './router' export * from './router-client' -export * from './router-hidden' -export * from './router-utils' +export { + getRouter, + resolveContractProcedure, + unlazyRouter, + walkProcedureContractsAsync, + walkProcedureContractsSync, +} from './router-utils' +export type { + AugmentedRouter, + AugmentedRouterWithMiddlewares, + UnlaziedRouter, + WalkProcedureContractsLazyResult, +} from './router-utils' export type { AnyORPCError, @@ -44,7 +61,6 @@ export type { } from '@orpc/client' export { - cloneORPCError, COMMON_ERROR_STATUS_MAP, isDefinedError, ORPCError, @@ -85,7 +101,6 @@ export { defineMeta, error, eventIterator, - reconcileORPCError, type, ValidationError, } from '@orpc/contract' diff --git a/packages/server/src/router-utils.ts b/packages/server/src/router-utils.ts index 36c65d077b..08c0cfebd6 100644 --- a/packages/server/src/router-utils.ts +++ b/packages/server/src/router-utils.ts @@ -65,7 +65,7 @@ export type AugmentedRouterWithMiddlewares< : never } -export interface AugmentRouterOptions extends AugmentContractRouterOptions, ProcedureConfig { +interface AugmentRouterOptions extends AugmentContractRouterOptions, ProcedureConfig { middlewares: AnyMiddleware[] } @@ -133,7 +133,7 @@ export function augmentRouter< return enhanced as any } -export interface AugmentImplementedRouterOptions extends ProcedureConfig { +interface AugmentImplementedRouterOptions extends ProcedureConfig { middlewares: AnyMiddleware[] } diff --git a/packages/shared/src/index.test.ts b/packages/shared/src/index.test.ts index 7ec8aaf0af..06dbe9c138 100644 --- a/packages/shared/src/index.test.ts +++ b/packages/shared/src/index.test.ts @@ -3,3 +3,12 @@ it('exports somethings', async () => { allAbortSignal: expect.any(Function), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('.') + + expect(mod).not.toHaveProperty('AsyncIdQueue') + expect(mod).not.toHaveProperty('runInSpanContext') + expect(mod).not.toHaveProperty('setSpanAttributeIfDefined') + expect(mod).not.toHaveProperty('startSpan') +}) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index db5260e840..81896cda76 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -14,10 +14,25 @@ export * from './object' export * from './plugin' export * from './promise' export * from './proxy' -export * from './queue' export * from './signal' export * from './stream' -export * from './tracing' +export { + getTracer, + recordSpanError, + runWithSpan, + setTracer, + toSpanAttributeValue, + toTracingException, +} from './tracing' +export type { + StartSpanOptions, + Tracer, + TracingAttributeValue, + TracingException, + TracingExceptionLevel, + TracingHeaders, + TracingSpan, +} from './tracing' export * from './types' export * from './value' diff --git a/packages/swr/src/index.test.ts b/packages/swr/src/index.test.ts index 5bc06787c9..a714673fa3 100644 --- a/packages/swr/src/index.test.ts +++ b/packages/swr/src/index.test.ts @@ -2,8 +2,15 @@ it('exports createSWRUtils, SWR_OPERATION_CONTEXT_SYMBOL', async () => { await expect(import('./index')).resolves.toMatchObject({ createSWRUtils: expect.any(Function), createRouterUtils: expect.any(Function), - generateOperationKey: expect.any(Function), - isSubsetOf: expect.any(Function), SWR_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('generateOperationKey') + expect(mod).not.toHaveProperty('isSubsetOf') + expect(mod).not.toHaveProperty('ProcedureUtils') + expect(mod).not.toHaveProperty('SharedUtils') +}) diff --git a/packages/swr/src/index.ts b/packages/swr/src/index.ts index d93dd34317..eb0f647266 100644 --- a/packages/swr/src/index.ts +++ b/packages/swr/src/index.ts @@ -1,16 +1,19 @@ -export * from './key' -export * from './procedure-utils' +export type { + OperationKey, + OperationKeyOptions, + OperationKeyPrefixOptions, +} from './key' +export type { ProcedureUtils, ProcedureUtilsOptions } from './procedure-utils' export * from './router-utils' export { createRouterUtils as createSWRUtils, } from './router-utils' -export * from './shared-utils' +export type { SharedUtils } from './shared-utils' export * from './types' export { OPERATION_CONTEXT_SYMBOL as SWR_OPERATION_CONTEXT_SYMBOL, type OperationContext as SWROperationContext, } from './types' -export * from './utils' export type { Public, diff --git a/packages/tanstack-query/src/index.test.ts b/packages/tanstack-query/src/index.test.ts index cf9f87c518..0ee1f7d5d4 100644 --- a/packages/tanstack-query/src/index.test.ts +++ b/packages/tanstack-query/src/index.test.ts @@ -4,3 +4,14 @@ it('exports createTanstackQueryUtils, TANSTACK_QUERY_OPERATION_CONTEXT_SYMBOL', TANSTACK_QUERY_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) + +it('does not export internal helpers', async () => { + const mod = await import('./index') + + expect(mod).not.toHaveProperty('CompositeRouterUtilsPlugin') + expect(mod).not.toHaveProperty('generateOperationKey') + expect(mod).not.toHaveProperty('isProcedureUtilsOptions') + expect(mod).not.toHaveProperty('ProcedureUtils') + expect(mod).not.toHaveProperty('serializableStreamedQuery') + expect(mod).not.toHaveProperty('SharedUtils') +}) diff --git a/packages/tanstack-query/src/index.ts b/packages/tanstack-query/src/index.ts index 2cbfe2305c..773727f250 100644 --- a/packages/tanstack-query/src/index.ts +++ b/packages/tanstack-query/src/index.ts @@ -1,13 +1,33 @@ export * from './contract-utils' -export * from './key' +export type { + OperationKey, + OperationKeyBaseOptions, + OperationKeyOptions, + OperationKeyPrefixOptions, +} from './key' export * from './meta' -export * from './plugin' -export * from './procedure-utils' +export type { RouterUtilsPlugin } from './plugin' +export { mergeProcedureUtilsOptions } from './procedure-utils' +export type { + ProcedureUtils, + ProcedureUtilsInfiniteInterceptor, + ProcedureUtilsInfiniteInterceptorOptions, + ProcedureUtilsLiveInterceptor, + ProcedureUtilsLiveInterceptorOptions, + ProcedureUtilsModifier, + ProcedureUtilsMutationInterceptor, + ProcedureUtilsMutationInterceptorOptions, + ProcedureUtilsOptions, + ProcedureUtilsQueryInterceptor, + ProcedureUtilsQueryInterceptorOptions, + ProcedureUtilsStreamedInterceptor, + ProcedureUtilsStreamedInterceptorOptions, +} from './procedure-utils' export * from './router-utils' export { createRouterUtils as createTanstackQueryUtils } from './router-utils' -export * from './shared-utils' +export type { SharedUtils } from './shared-utils' export * from './ssr' -export * from './stream-query' +export type { SerializableStreamedQueryOptions } from './stream-query' export * from './structural-sharing' export * from './types' export { From 7e0ef6aca1c6f6ad6bd5f7b6b853fe9c21dc123d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 23:35:57 +0000 Subject: [PATCH 2/4] test: drop assertions that internal helpers are not exported Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01U63hBfpeESmJiHXznRFzjN --- .../client/src/adapters/standard/index.test.ts | 6 ------ packages/client/src/index.test.ts | 6 ------ packages/contract/src/index.test.ts | 8 -------- packages/effect/src/index.test.ts | 7 ------- packages/msw/src/index.test.ts | 6 ------ .../openapi/src/adapters/standard/index.test.ts | 6 ------ packages/openapi/src/index.test.ts | 9 --------- packages/pinia-colada/src/index.test.ts | 12 ------------ .../server/src/adapters/standard/index.test.ts | 7 ------- packages/server/src/index.test.ts | 16 ---------------- packages/shared/src/index.test.ts | 9 --------- packages/swr/src/index.test.ts | 9 --------- packages/tanstack-query/src/index.test.ts | 11 ----------- 13 files changed, 112 deletions(-) diff --git a/packages/client/src/adapters/standard/index.test.ts b/packages/client/src/adapters/standard/index.test.ts index e60142a65f..97ea9309e0 100644 --- a/packages/client/src/adapters/standard/index.test.ts +++ b/packages/client/src/adapters/standard/index.test.ts @@ -4,9 +4,3 @@ it('exports StandardLink, RPCLinkCodec', async () => { RPCLinkCodec: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('CompositeStandardLinkPlugin') -}) diff --git a/packages/client/src/index.test.ts b/packages/client/src/index.test.ts index 292897f00a..ca43438720 100644 --- a/packages/client/src/index.test.ts +++ b/packages/client/src/index.test.ts @@ -7,9 +7,3 @@ it('exports createORPCClient, ORPCError, DynamicLink, RPCJsonSerializer, RPCSeri RPCSerializer: expect.any(Function), })) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('resolveFriendlyClientOptions') -}) diff --git a/packages/contract/src/index.test.ts b/packages/contract/src/index.test.ts index 3874aafd86..1a98e575e8 100644 --- a/packages/contract/src/index.test.ts +++ b/packages/contract/src/index.test.ts @@ -3,11 +3,3 @@ it('exports oc', async () => { oc: expect.any(Object), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('augmentContractRouter') - expect(mod).not.toHaveProperty('getAsyncIteratorObjectSchemaDetails') - expect(mod).not.toHaveProperty('HIDDEN_META_PLUGINS_SYMBOL') -}) diff --git a/packages/effect/src/index.test.ts b/packages/effect/src/index.test.ts index 28adaf8475..181640da9c 100644 --- a/packages/effect/src/index.test.ts +++ b/packages/effect/src/index.test.ts @@ -9,10 +9,3 @@ it('exports', async () => { createEffectClient: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('runPromise') - expect(mod).not.toHaveProperty('toStandardSchema') -}) diff --git a/packages/msw/src/index.test.ts b/packages/msw/src/index.test.ts index 217ae1bdfd..d72bfb7e38 100644 --- a/packages/msw/src/index.test.ts +++ b/packages/msw/src/index.test.ts @@ -3,9 +3,3 @@ it('exports createHTTPUtils', async () => { createHTTPUtils: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('HTTPProcedureUtils') -}) diff --git a/packages/openapi/src/adapters/standard/index.test.ts b/packages/openapi/src/adapters/standard/index.test.ts index f686eb4c53..fe77888524 100644 --- a/packages/openapi/src/adapters/standard/index.test.ts +++ b/packages/openapi/src/adapters/standard/index.test.ts @@ -5,9 +5,3 @@ it('exports OpenAPIMatcher, OpenAPIHandlerCodec, OpenAPILinkCodec', async () => OpenAPILinkCodec: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('serializeHeaders') -}) diff --git a/packages/openapi/src/index.test.ts b/packages/openapi/src/index.test.ts index 3f695cc237..c4c7f8558e 100644 --- a/packages/openapi/src/index.test.ts +++ b/packages/openapi/src/index.test.ts @@ -7,12 +7,3 @@ it('exports openapi meta, OpenAPIGenerator, OpenAPISerializer, OpenAPIJsonSerial BracketNotationSerializer: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_INPUT_STRUCTURE') - expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_OUTPUT_STRUCTURE') - expect(mod).not.toHaveProperty('DEFAULT_OPENAPI_SUCCESS_DESCRIPTION') - expect(mod).not.toHaveProperty('isBodylessMethod') -}) diff --git a/packages/pinia-colada/src/index.test.ts b/packages/pinia-colada/src/index.test.ts index e8f511f230..6509b3e8d8 100644 --- a/packages/pinia-colada/src/index.test.ts +++ b/packages/pinia-colada/src/index.test.ts @@ -5,15 +5,3 @@ it('exports createPiniaColadaUtils, PINIA_COLADA_OPERATION_CONTEXT_SYMBOL', asyn PINIA_COLADA_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('CompositeRouterUtilsPlugin') - expect(mod).not.toHaveProperty('generateOperationKey') - expect(mod).not.toHaveProperty('isProcedureUtilsOptions') - expect(mod).not.toHaveProperty('liveQuery') - expect(mod).not.toHaveProperty('ProcedureUtils') - expect(mod).not.toHaveProperty('serializableStreamedQuery') - expect(mod).not.toHaveProperty('SharedUtils') -}) diff --git a/packages/server/src/adapters/standard/index.test.ts b/packages/server/src/adapters/standard/index.test.ts index eab640fff4..b69575d349 100644 --- a/packages/server/src/adapters/standard/index.test.ts +++ b/packages/server/src/adapters/standard/index.test.ts @@ -6,10 +6,3 @@ it('exports StandardHandler, resolveFriendlyStandardHandlerHandleOptions, RPCMat RPCHandlerCodec: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('CompositeStandardHandlerPlugin') - expect(mod).not.toHaveProperty('TracingHandlerPlugin') -}) diff --git a/packages/server/src/index.test.ts b/packages/server/src/index.test.ts index 4ea76693b5..d7f8fd9aea 100644 --- a/packages/server/src/index.test.ts +++ b/packages/server/src/index.test.ts @@ -7,19 +7,3 @@ it('exports os, ORPCError, createRouterClient, RPCJsonSerializer, RPCSerializer' RPCSerializer: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('augmentImplementedRouter') - expect(mod).not.toHaveProperty('augmentRouter') - expect(mod).not.toHaveProperty('cloneORPCError') - expect(mod).not.toHaveProperty('createContractProcedure') - expect(mod).not.toHaveProperty('createGuardedProcedureLazy') - expect(mod).not.toHaveProperty('createRouterImplementer') - expect(mod).not.toHaveProperty('decorateMiddleware') - expect(mod).not.toHaveProperty('getHiddenRouterContract') - expect(mod).not.toHaveProperty('reconcileORPCError') - expect(mod).not.toHaveProperty('SharedRouterImplementer') - expect(mod).not.toHaveProperty('withHiddenRouterContract') -}) diff --git a/packages/shared/src/index.test.ts b/packages/shared/src/index.test.ts index 06dbe9c138..7ec8aaf0af 100644 --- a/packages/shared/src/index.test.ts +++ b/packages/shared/src/index.test.ts @@ -3,12 +3,3 @@ it('exports somethings', async () => { allAbortSignal: expect.any(Function), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('.') - - expect(mod).not.toHaveProperty('AsyncIdQueue') - expect(mod).not.toHaveProperty('runInSpanContext') - expect(mod).not.toHaveProperty('setSpanAttributeIfDefined') - expect(mod).not.toHaveProperty('startSpan') -}) diff --git a/packages/swr/src/index.test.ts b/packages/swr/src/index.test.ts index a714673fa3..ef976db9ab 100644 --- a/packages/swr/src/index.test.ts +++ b/packages/swr/src/index.test.ts @@ -5,12 +5,3 @@ it('exports createSWRUtils, SWR_OPERATION_CONTEXT_SYMBOL', async () => { SWR_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('generateOperationKey') - expect(mod).not.toHaveProperty('isSubsetOf') - expect(mod).not.toHaveProperty('ProcedureUtils') - expect(mod).not.toHaveProperty('SharedUtils') -}) diff --git a/packages/tanstack-query/src/index.test.ts b/packages/tanstack-query/src/index.test.ts index 0ee1f7d5d4..cf9f87c518 100644 --- a/packages/tanstack-query/src/index.test.ts +++ b/packages/tanstack-query/src/index.test.ts @@ -4,14 +4,3 @@ it('exports createTanstackQueryUtils, TANSTACK_QUERY_OPERATION_CONTEXT_SYMBOL', TANSTACK_QUERY_OPERATION_CONTEXT_SYMBOL: expect.any(Symbol), }) }) - -it('does not export internal helpers', async () => { - const mod = await import('./index') - - expect(mod).not.toHaveProperty('CompositeRouterUtilsPlugin') - expect(mod).not.toHaveProperty('generateOperationKey') - expect(mod).not.toHaveProperty('isProcedureUtilsOptions') - expect(mod).not.toHaveProperty('ProcedureUtils') - expect(mod).not.toHaveProperty('serializableStreamedQuery') - expect(mod).not.toHaveProperty('SharedUtils') -}) From 41f6d48b76a0bec6ae8431f970797fdb750d04a3 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 02:11:33 +0000 Subject: [PATCH 3/4] fix: keep public classes as value exports SharedRouterImplementer, ProcedureUtils, SharedUtils and HTTPProcedureUtils were switched to `export type`, but the bundled .d.mts drops the type-only modifier and still lists them as values. A consumer could import them without `type` (or use them with instanceof) and pass type-checking, then fail at load time because the runtime module no longer exports them. Export them as values again, as before. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01U63hBfpeESmJiHXznRFzjN --- packages/msw/src/index.ts | 3 ++- packages/pinia-colada/src/index.ts | 5 ++--- packages/server/src/index.ts | 2 +- packages/swr/src/index.ts | 5 +++-- packages/tanstack-query/src/index.ts | 5 ++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/msw/src/index.ts b/packages/msw/src/index.ts index bf017a1456..48c94b2f53 100644 --- a/packages/msw/src/index.ts +++ b/packages/msw/src/index.ts @@ -1,2 +1,3 @@ -export type { HTTPProcedureUtils, HTTPProcedureUtilsOptions } from './http-procedure-utils' +export { HTTPProcedureUtils } from './http-procedure-utils' +export type { HTTPProcedureUtilsOptions } from './http-procedure-utils' export * from './http-router-utils' diff --git a/packages/pinia-colada/src/index.ts b/packages/pinia-colada/src/index.ts index c75dbd7cf6..fb59f1fa63 100644 --- a/packages/pinia-colada/src/index.ts +++ b/packages/pinia-colada/src/index.ts @@ -7,9 +7,8 @@ export type { } from './key' export * from './meta' export type { RouterUtilsPlugin } from './plugin' -export { mergeProcedureUtilsOptions } from './procedure-utils' +export { mergeProcedureUtilsOptions, ProcedureUtils } from './procedure-utils' export type { - ProcedureUtils, ProcedureUtilsInfiniteInterceptor, ProcedureUtilsInfiniteInterceptorOptions, ProcedureUtilsLiveInterceptor, @@ -33,7 +32,7 @@ export { export { createRouterUtils as createPiniaColadaUtils, } from './router-utils' -export type { SharedUtils } from './shared-utils' +export { SharedUtils } from './shared-utils' export type { SerializableStreamedQueryOptions } from './stream-query' export * from './types' export { diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index b6a410c283..46af416248 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -4,10 +4,10 @@ export * from './constants' export * from './context' export * from './implementer' export * from './implementer-procedure' +export { SharedRouterImplementer } from './implementer-router' export type { RouterImplementer, RouterImplementerWithMiddlewares, - SharedRouterImplementer, SharedRouterImplementerWithMiddlewares, } from './implementer-router' export * from './lazy' diff --git a/packages/swr/src/index.ts b/packages/swr/src/index.ts index eb0f647266..3262dd6846 100644 --- a/packages/swr/src/index.ts +++ b/packages/swr/src/index.ts @@ -3,12 +3,13 @@ export type { OperationKeyOptions, OperationKeyPrefixOptions, } from './key' -export type { ProcedureUtils, ProcedureUtilsOptions } from './procedure-utils' +export { ProcedureUtils } from './procedure-utils' +export type { ProcedureUtilsOptions } from './procedure-utils' export * from './router-utils' export { createRouterUtils as createSWRUtils, } from './router-utils' -export type { SharedUtils } from './shared-utils' +export { SharedUtils } from './shared-utils' export * from './types' export { OPERATION_CONTEXT_SYMBOL as SWR_OPERATION_CONTEXT_SYMBOL, diff --git a/packages/tanstack-query/src/index.ts b/packages/tanstack-query/src/index.ts index 773727f250..5102067767 100644 --- a/packages/tanstack-query/src/index.ts +++ b/packages/tanstack-query/src/index.ts @@ -7,9 +7,8 @@ export type { } from './key' export * from './meta' export type { RouterUtilsPlugin } from './plugin' -export { mergeProcedureUtilsOptions } from './procedure-utils' +export { mergeProcedureUtilsOptions, ProcedureUtils } from './procedure-utils' export type { - ProcedureUtils, ProcedureUtilsInfiniteInterceptor, ProcedureUtilsInfiniteInterceptorOptions, ProcedureUtilsLiveInterceptor, @@ -25,7 +24,7 @@ export type { } from './procedure-utils' export * from './router-utils' export { createRouterUtils as createTanstackQueryUtils } from './router-utils' -export type { SharedUtils } from './shared-utils' +export { SharedUtils } from './shared-utils' export * from './ssr' export type { SerializableStreamedQueryOptions } from './stream-query' export * from './structural-sharing' From 5f2a5be64635897b587e361b4ee7443b292e19cd Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 04:05:38 +0000 Subject: [PATCH 4/4] revert(shared): keep exporting all shared APIs Restore `export * from './queue'` and `export * from './tracing'` so AsyncIdQueue, AsyncIdQueueCloseOptions, startSpan, setSpanAttributeIfDefined and runInSpanContext stay exported. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01U63hBfpeESmJiHXznRFzjN --- packages/shared/src/index.ts | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 81896cda76..db5260e840 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -14,25 +14,10 @@ export * from './object' export * from './plugin' export * from './promise' export * from './proxy' +export * from './queue' export * from './signal' export * from './stream' -export { - getTracer, - recordSpanError, - runWithSpan, - setTracer, - toSpanAttributeValue, - toTracingException, -} from './tracing' -export type { - StartSpanOptions, - Tracer, - TracingAttributeValue, - TracingException, - TracingExceptionLevel, - TracingHeaders, - TracingSpan, -} from './tracing' +export * from './tracing' export * from './types' export * from './value'