Initial Commit
This commit is contained in:
38
openspec/specs/json/spec.md
Normal file
38
openspec/specs/json/spec.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# json
|
||||
|
||||
## Purpose
|
||||
|
||||
Safe JSON parse/stringify surface for the Suaveplan monorepo. Wraps the platform `JSON` global with prototype-pollution defense, AbortSignal handling, structured `JsonError` codes registered under the `JSON.*` namespace, OpenTelemetry spans, and a `tryParse` / `isValidJSON` / `getStringifySize` ergonomic layer that the platform global does not provide.
|
||||
|
||||
**Package path:** `universal/data/json`
|
||||
**Landed:** 2026-04-20
|
||||
|
||||
## Requirements
|
||||
|
||||
- **R1** The package MUST expose `safeParse<T>(text, options?)` that parses JSON
|
||||
and throws `JsonError(PARSE.FAILED)` on invalid syntax.
|
||||
- **R2** `safeParse` MUST reject keys in the `forbiddenKeys` list (default:
|
||||
`__proto__`, `constructor`, `prototype`) with `JsonError(PARSE.PROTOTYPE_POLLUTION)`.
|
||||
- **R3** `safeParse` MUST accept an `AbortSignal` and throw `JsonError(PARSE.FAILED)`
|
||||
when the signal is already aborted before parsing begins.
|
||||
- **R4** The package MUST expose `safeStringify(value, options?)` that stringifies
|
||||
and throws `JsonError(STRINGIFY.CIRCULAR)` on circular references.
|
||||
- **R5** `safeStringify` MUST allow DAG sharing (same object at multiple
|
||||
non-cyclic paths) without throwing.
|
||||
- **R6** `safeStringify` MUST accept an `AbortSignal` and throw
|
||||
`JsonError(STRINGIFY.FAILED)` when the signal is already aborted.
|
||||
- **R7** `safeStringify` MUST throw `JsonError(STRINGIFY.FAILED)` for any
|
||||
non-circular, non-`JsonError` exception from `JSON.stringify` (e.g. `BigInt`).
|
||||
- **R8** The package MUST expose `tryParse<T>(text, options?)` that returns
|
||||
`undefined` instead of throwing.
|
||||
- **R9** The package MUST expose `isValidJSON(text)` that returns `true` for the
|
||||
`"null"` literal (not `false` as a naïve `tryParse() !== undefined` check
|
||||
would yield).
|
||||
- **R10** The package MUST expose `getStringifySize(value)` returning UTF-8
|
||||
byte length of `JSON.stringify(value)`.
|
||||
- **R11** `safeParse` and `safeStringify` MUST emit OpenTelemetry spans via
|
||||
`@opentelemetry/api`.
|
||||
- **R12** All error codes MUST be registered under the `JSON.*` namespace via
|
||||
`defineCodes` from `@suaveplan/error`.
|
||||
- **R13** Istanbul coverage on all 4 thresholds: 100%.
|
||||
- **R14** Docs coverage: 100%.
|
||||
Reference in New Issue
Block a user