refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

refactor(router-core): strip internal types from public build - #4907

Merged
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types
Aug 10, 2025
Merged

refactor(router-core): strip internal types from public build#4907
Sheraff merged 3 commits into
mainfrom
refactor-strip-internal-types

Conversation

@Sheraff

@SheraffSheraff commented Aug 10, 2025

Copy link
Copy Markdown
Collaborator

This PR proposes we use the @internal JSDoc tag, and --stripInternal typescript compiler option to remove internal keys from the public .d.ts files.

Docs for stripInternal: https://www.typescriptlang.org/tsconfig/#stripInternal

This helps ensuring internal values aren't considered as part of the public API surface by users, allowing us more flexibility in refactoring.

Warning

This PR proposes we add stripInternal to the entire repo, not just router-core. However there are already some values marked as internal that weren't added by this PR:

  • InferStructuralSharing in react-router
  • handleHashScroll in router-core > scrollRestoration
  • many InferFoo types in router-core > typePrimitives

as a result of this, we might have to switch some of those @internal tags to something else (like @private maybe?) because they are, in fact, necessary for the build to be correct.

Example:

exporttypeFoo={a: number,/** @internal */b: number,}/** @internal */exportfunctionhello(){return'world'}exportconstanswer=42

gets compiled as .d.ts to

exporttypeFoo={a: number}exportconstanswer=42

@nx-cloud

nx-cloudBot commented Aug 10, 2025

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 52a8552

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...✅ Succeeded5m 4sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded1m 34sView ↗

☁️ Nx Cloud last updated this comment at 2025-08-10 10:10:39 UTC

@pkg-pr-new

pkg-pr-newBot commented Aug 10, 2025

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@4907

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@4907

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@4907

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@4907

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@4907

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@4907

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@4907

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@4907

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@4907

@tanstack/react-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-plugin@4907

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@4907

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@4907

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@4907

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@4907

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@4907

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@4907

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@4907

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@4907

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@4907

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@4907

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@4907

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@4907

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@4907

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@4907

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@4907

@tanstack/solid-start-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-plugin@4907

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@4907

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@4907

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@4907

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@4907

@tanstack/start-server-functions-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-client@4907

@tanstack/start-server-functions-fetcher

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-fetcher@4907

@tanstack/start-server-functions-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-functions-server@4907

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@4907

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@4907

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@4907

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@4907

commit: 52a8552

@Sheraff
Sheraff merged commit fd341ad into mainAug 10, 2025
5 checks passed
@Sheraff
Sheraff deleted the refactor-strip-internal-types branch August 10, 2025 21:38
Sheraff pushed a commit that referenced this pull request Sep 15, 2025
… .d.ts files (#5134)
Fixes#5116
### Root Cause
In PR #4907, the TypeScript compiler option `stripInternal` was enabled
in tsconfig.json, which causes TypeScript to remove any declarations
marked with `@internal` from the published `.d.ts` files.
This resulted in TypeScript compilation errors for library users who
have set the TypeScript compiler option `skipLibCheck` to `false`,
because the following members were missing:
- `InferStructuralSharing` type in `react-router`
- `handleHashScroll` function in `router-core > scrollRestoration`
### Fix
- This PR replaces the `@internal` annotation with the `@private`
annotation.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated internal API annotations in routing packages to mark certain
items as private, improving the accuracy of generated developer
documentation.
* No changes to public APIs, behavior, or performance.
* No user-facing impact.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
…dratedMatch
`DehydratedMatch['b']` is typed as `MakeRouteMatch['__beforeLoadContext']`,
an indexed-access into `RouteMatch['__beforeLoadContext']`. That field has
been tagged `@internal` since TanStack#4600 (2025-07-11); TanStack#4907 (2025-08-10) then
enabled `stripInternal` repo-wide specifically to remove `@internal`
members from the published `.d.ts`. From `router-core@1.171.16` onward
the published types no longer have `RouteMatch.__beforeLoadContext`, but
`ssr/types.ts` (moved to its current path by TanStack#6118, content otherwise
unchanged) still indexes into it, leaving a dangling reference.
This went unnoticed by plain SPA consumers for weeks because nothing in
the always-imported client path pulled `ssr/types.ts` into their type
graph. TanStack#7805's `load-client.ts` rewrite (2026-08-04) changed that: it
imports `TsrSsrGlobal` from `./ssr/types`, and `load-client.ts` is core
hydration code every consumer's `tsc` walks, SSR or not. Combined with
`skipLibCheck: false` (the TS default), that's enough to fail with:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Since `__beforeLoadContext` is declared as `Record<string, unknown>` in
source, give `b` that concrete type directly instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
(`skipLibCheck: false`, importing `createRouter`/`createRootRoute`) type-
checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in TanStack#4907) strips
`@internal` members from the published `.d.ts`, so this reference has
been dangling since `router-core@1.171.16`. TanStack#6118 later moved the
interface to its current file unchanged.
TanStack#7805's `load-client.ts` rewrite started importing from `./ssr/types`,
surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` `__beforeLoadContext`'s declared source type directly instead
of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Type `b` directly as `Record<string, unknown>` — the type
`__beforeLoadContext` has in source — instead of indexing into the
stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` indexes into `RouteMatch['__beforeLoadContext']`,
which is tagged `@internal`. `stripInternal` (enabled in fd341ad
(PR TanStack#4907)) strips `@internal` members from the published `.d.ts`, so
this reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
Give `b` the declared type of `__beforeLoadContext` instead of indexing
into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`.
The problem is that `RouteMatch['__beforeLoadContext']` is tagged
`@internal`. `stripInternal` (enabled in fd341ad(PR TanStack#4907))
strips `@internal` members from the published `.d.ts`, so this
reference has been dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
45c4ad8 (PR TanStack#7805)'s `load-client.ts` rewrite started importing from
`./ssr/types`, surfacing the dangling reference for any consumer with
`skipLibCheck: false`:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
oddsund added a commit to oddsund/router that referenced this pull request Aug 31, 2026
`DehydratedMatch['b']` is typed by `RouteMatch['__beforeLoadContext']`,
and `RouteMatch['__beforeLoadContext']` is tagged `@internal`.
This worked fine until `stripInternal` was enabled in fd341ad(PR TanStack#4907),
which strips `@internal` members from the published `.d.ts`. This
has made this reference dangling since `router-core@1.171.16`. f330532
(PR TanStack#6118) later moved the interface to its current file unchanged.
When 45c4ad8 (PR TanStack#7805) rewrote to `load-client.ts` and started importing
from `./ssr/types`, the dangling reference was surfaced for consumers with
`skipLibCheck: false` in this error:
error TS2339: Property '__beforeLoadContext' does not exist on type 'MakeRouteMatch'.
We solve this by giving `b` the declared type of `__beforeLoadContext`,
instead of indexing into the stripped member.
Verified against a built package: the emitted `dist/esm/ssr/types.d.ts`
no longer references the internal member, and a minimal consumer repro
type-checks cleanly with this dist swapped in.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Sheraff