Strip brand and codec internals from the published declarations - #6202
Closed
candrewlee14 wants to merge 3 commits into
Closed
Strip brand and codec internals from the published declarations#6202candrewlee14 wants to merge 3 commits into
candrewlee14 wants to merge 3 commits into
Conversation
Strip implementation-only query-builder details from published declarations, infer decoder results structurally, and compile two physical package copies to prevent regressions.
The single SQL assignment only guarded one type. Replace it with a table of public types probed in one tsc program, asserting both directions: a portable type regressing fails, and a known leak becoming portable fails too, prompting the flag to be flipped. Records the measured state of the surface, annotating each known leak with the private/protected member responsible. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qd99Mmmi1fZkKQiV3u1jXy
Name#brand, Param#brand and CodecsCollection#resolveTypes are implementation details that reached the emitted .d.ts as protected members, making all three types nominal and so non-portable between two installs of the package. resolveTypes is declared as a field rather than left as a constructor parameter property: on a parameter the @internal marker survives into the emitted constructor signature as a stray comment. Flips Param, Name and CodecsCollection to portable in the matrix. The three dialects do not follow -- with the nominal blocker gone they fail structurally instead, on the anonymous recursive BuildRelationalQueryResult['selection'], which is recorded as their blocker. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qd99Mmmi1fZkKQiV3u1jXy
This was referenced Aug 29, 2026
candrewlee14
marked this pull request as draft
August 29, 2026 18:19
This was referenced Aug 29, 2026
Author
|
Consolidated into #6200. The whole change is 244 lines across 16 files, and because a fork PR cannot base itself on another fork branch, every PR in the stack was already showing all of its ancestors' commits — so the split bought no review isolation, just six merges and five rebases. It is now one PR with these commits intact, plus #6205 for the single change that touches observable API. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Marks three implementation details
/** @internal */sostripInternalkeeps them out of the published declarations:Name#brand(protected)Param#brand(protected)CodecsCollection#resolveTypes(protected)All three are pure internals — two are type-level brands that exist only to keep the classes distinct, and
resolveTypesis a constructor-supplied resolver. None is callable by a consumer. But each was emitted into the.d.ts, making its class nominal and therefore non-portable between two installs.On the
codecs.tsshape changeresolveTypesmoves from a constructor parameter property to a declared field.@internalon a parameter does strip the member, but the marker itself survives into the emitted constructor signature as a stray comment:Declaring the field puts the marker on the member and leaves the emitted signature clean. Runtime behaviour is identical — a parameter property assigns at the top of the constructor body, which is exactly where the explicit assignment now sits.
Result
Param,NameandCodecsCollectionflip toportable: truein the matrix.The three dialects do not follow, which is worth flagging:
CodecsCollection#resolveTypeswas their reported blocker, but with it gone they fail structurally instead, onBuildRelationalQueryResult['selection']— an anonymous recursive intersection-of-union reached viamapperGenerators.relationalRows. Having no named symbol it misses the compiler's relation cache, so each cross-instance comparison re-expands until the recursion limiter gives up. That is a different class of problem and needs the type named rather than a member marked, so it is recorded as their blocker and left alone here.Verification
test:typesclean; fulldrizzle-ormsuite green.