fix(solid): gate pending projection reads - #3225
Conversation
🦋 Changeset detectedLatest commit: cd654ca The changes in this PR will be included in the next version bump. This PR includes changesets to release 11 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
This is directly required by A25: the seed must be hidden from every external consumer path, including symbols, membership, enumeration, and descriptor/ |
d68f53f to
bbe6f71
Compare
bbe6f71 to
8d1ba82
Compare
Ensure every gated read path preserves and rethrows the original projection error after settlement. Co-authored-by: Cursor <cursoragent@cursor.com>
ryansolid
left a comment
There was a problem hiding this comment.
Rebased cleanly over #3224 and added rejection coverage across ordinary, symbol, membership, enumeration, descriptor, and Object.hasOwn reads. The composed status gate now preserves the original rejection across the full pending membrane. Full solid suite (580 tests), focused SSR suite (160 tests), declarations/type tests, package build, and all size scenarios pass. Server-only; no public API or client bundle impact.
Coverage Report for CI Build 33662596132Warning Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes. Coverage remained the same at 71.564%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
Merging this PR will not alter performance
Comparing Footnotes
|
Summary
NotReadyError/client-hole path as ordinary property readsThis is a baseline inconsistency found while working on #3194, but the fix is independent of that API proposal. Previously
store.namesuspended while operations such asstore[symbol],"name" in store,Object.keys(store), andObject.hasOwn(store, "name")could inspect the pending backing directly.Descriptor reads are included because A25 requires the seed to remain hidden from every external consumer path. The trap returns the real target descriptor unchanged after readiness, preserving the target's proxy invariants.
This is expected to compose with the rejection-state fix in #3224 once that lands.
Test plan
pnpm exec vitest run test/server/ssr-async.spec.ts(157 tests)pnpm typespnpm test-types