fix: address mapProps review points (#1-#4, B1, B2)#103
Merged
Conversation
Follow-up to PR #102 (mapProps feature). Addresses all review points: #1 — Runtime tests added for variant, list, createReflect (no-ssr + ssr). Previously only reflect had mapProps coverage. #2 — Unknown mapProps keys now error at the key site itself, not on fn's return. MapPropsFromSources resolves unknown-key entries to never, producing a TS2322 at the key line. Replaces the old 'K extends keyof Props ? Props[K] : never' fn-return approach that had a silent-failure path (never-returning fn compiled cleanly). #3 — Documented the Store<any> variable-source widening limitation. Type tests (3a positive, 3b widening) pin the current behavior. #4 — fn is skipped when its key is overridden by an external prop. 'if (key in props) continue' in src/core/reflect.ts. Spy assertions in reflect and createReflect tests verify fn is not called. B1 — bind + mapProps key collision is now a type error. MapPropsFromSources takes Bind as a type parameter; a key in both bind and mapProps resolves to never. Runtime skip ('if (key in storeProps) continue') is a defense-in-depth for JS/type-bypass scenarios (covers stores; events/data/functions are covered by the type fix). B2 — mapItem + mapProps key collision in list is a type error. MapItem's mapped type now omits keyof Sources alongside keyof Bind. Partial: bypassable with explicit item-parameter annotation (known TS limitation with mapped-type extends constraints), documented in the type-test comment. All four operators (reflect, createReflect, list, variant) are covered by the type fixes and runtime tests. Docs updated in docs/pages/docs/reflect.mdx: - mapProps keys must be props of the view; unknown keys error at the key - a key must not appear in both bind and mapProps - in list, a key must not appear in both mapItem and mapProps - source should be an inline literal for best inference - fn is not invoked when its key is overridden 80 runtime tests + type tests pass.
|
|
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.
Follow-up to PR #102 (mapProps feature). Addresses all review points:
#1 — Runtime tests added for variant, list, createReflect (no-ssr + ssr).
Previously only reflect had mapProps coverage.
#2 — Unknown mapProps keys now error at the key site itself, not on fn's
return. MapPropsFromSources resolves unknown-key entries to never,
producing a TS2322 at the key line. Replaces the old
'K extends keyof Props ? Props[K] : never' fn-return approach that
had a silent-failure path (never-returning fn compiled cleanly).
#3 — Documented the Store variable-source widening limitation.
Type tests (3a positive, 3b widening) pin the current behavior.
#4 — fn is skipped when its key is overridden by an external prop.
'if (key in props) continue' in src/core/reflect.ts. Spy assertions
in reflect and createReflect tests verify fn is not called.
B1 — bind + mapProps key collision is now a type error. MapPropsFromSources
takes Bind as a type parameter; a key in both bind and mapProps
resolves to never. Runtime skip ('if (key in storeProps) continue')
is a defense-in-depth for JS/type-bypass scenarios (covers stores;
events/data/functions are covered by the type fix).
B2 — mapItem + mapProps key collision in list is a type error. MapItem's
mapped type now omits keyof Sources alongside keyof Bind. Partial:
bypassable with explicit item-parameter annotation (known TS
limitation with mapped-type extends constraints), documented in the
type-test comment.
All four operators (reflect, createReflect, list, variant) are covered by the type fixes and runtime tests.
Docs updated in docs/pages/docs/reflect.mdx:
80 runtime tests + type tests pass.