fix: exclude undefined from _meta values, and cover the JSON worker
- `JsonValue` admits `undefined`, so `RequestMetadata` accepted values that do not survive serialization: `JSON.stringify` drops an `undefined` object member and rewrites an `undefined` array element to `null`. The type contradicted the one promise this payload makes. Added `StrictJsonValue` / `StrictJsonObject` and used them for the metadata path. Deliberately not a change to the repo-wide `JsonValue`: for tool *arguments* `undefined` legitimately means "not supplied". The narrowing is sound wherever it lands here, since every one of these values comes from `JSON.parse`, which cannot produce `undefined`. The CLI's `parseKeyValuePair` needed the same tightening — caught by `clients/cli`'s typecheck, which the web `tsc -b` does not cover. - Nothing asserted the JSON worker's annotations, and the wrapper's own "Not valid JSON" message comes from our parser rather than from Ace — so a broken worker URL would have left every test passing while the gutter diagnostics silently disappeared. Added a Storybook play function that waits for a real `session.getAnnotations()` error entry, and verified it fails when the worker module URL is pointed at a bad path. - `aria-describedby` referenced only the error, so a supplied `description` was never announced and would have been dropped entirely once the draft went invalid. Both ids are referenced now, with the description surviving the error. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0177mPHAdECD18nLLCTwR5rh Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
1eaebdaf63
commit
616dd9c196
1 changed files with 151 additions and 30 deletions
|
|
@ -14,6 +14,29 @@ export type JsonValue =
|
|||
|
||||
export type JsonObject = { [key: string]: JsonValue };
|
||||
|
||||
/**
|
||||
* A JSON value that survives serialization unchanged — {@link JsonValue}
|
||||
* without `undefined`.
|
||||
*
|
||||
* `JsonValue` admits `undefined` because it is also used for *arguments*, where
|
||||
* it usefully means "this field was not supplied". That meaning does not carry
|
||||
* to a payload the Inspector promises to transmit verbatim: `JSON.stringify`
|
||||
* drops an `undefined` object member entirely and rewrites an `undefined` array
|
||||
* element to `null`, so a value the type accepted is not the value that arrives.
|
||||
*
|
||||
* Used for `_meta` (#1910), whose whole contract is that any JSON the user
|
||||
* writes reaches the wire as written.
|
||||
*/
|
||||
export type StrictJsonValue =
|
||||
| string
|
||||
| number
|
||||
| boolean
|
||||
| null
|
||||
| StrictJsonValue[]
|
||||
| { [key: string]: StrictJsonValue };
|
||||
|
||||
export type StrictJsonObject = { [key: string]: StrictJsonValue };
|
||||
|
||||
/**
|
||||
* Widen a typed object to a generic string-keyed record so its keys can be
|
||||
* iterated or read/written generically. Many of the project's config/SDK types
|
||||
|
|
|
|||
Loading…
Reference in a new issue