ts-procedures 10.1.0 → 10.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,57 @@ All notable changes to **ts-procedures** are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 10.1.2 — 2026-06-24
8
+
9
+ Fixes a registration crash and output leak when TypeBox internal markers escape
10
+ as enumerable properties. Complements the detection fix in 10.1.1.
11
+
12
+ ### Fixed
13
+
14
+ - **`Type.Optional(Type.Unsafe({...}))` no longer crashes registration or leaks
15
+ markers.** Most TypeBox `~`-prefixed markers are non-enumerable and stay out of
16
+ the JSON Schema, but some compositions — notably `Type.Optional` wrapping
17
+ `Type.Unsafe` — emit `~unsafe`/`~optional` as **enumerable** own properties.
18
+ Those then (a) made strict AJV throw `unknown keyword: "~unsafe"` at
19
+ registration and (b) leaked into serialized DocEnvelope/codegen output. JSON
20
+ Schema extracted from any channel is now deep-stripped of `~`-prefixed keys
21
+ (`stripInternalKeywords`) at the single extraction chokepoint, so both runtime
22
+ validation and emitted docs/codegen are clean. Stripping by the `~`-prefix
23
+ convention (not a fixed name list) stays robust against future markers.
24
+
25
+ ### Notes
26
+
27
+ - AJV stays strict (no `strictSchema: false`) — stripping cleans the output too
28
+ and keeps AJV's unknown-keyword safety net for genuine schema typos.
29
+ - 10.1.1 fixed *recognition* of a bare top-level `Type.Unsafe(...)`; this release
30
+ fixes the distinct *enumerable-marker leak* in nested compositions. Schemas
31
+ built only from `Type.Object`/primitives were never affected by either.
32
+
33
+ ## 10.1.1 — 2026-06-24
34
+
35
+ Fixes TypeBox schema detection for `Type.Unsafe(...)` on typebox ≥ 1.2.0. No
36
+ change to generated output, docs, or validation behavior.
37
+
38
+ ### Fixed
39
+
40
+ - **Top-level `Type.Unsafe(...)` channel schemas are recognized again.** TypeBox
41
+ 1.2.0 tags `Type.Unsafe(...)` with a `~unsafe` marker *instead of* `~kind`, so
42
+ the built-in TypeBox adapter — which only looked for `~kind` — failed to detect
43
+ a bare top-level `Type.Unsafe(...)` used as a channel schema (e.g.
44
+ `schema: { params: Type.Unsafe(...) }`), throwing a `ProcedureRegistrationError`
45
+ at registration. Detection now keys off TypeBox v1's `~`-prefix marker
46
+ *convention* (via `Reflect.ownKeys`, since the markers are non-enumerable)
47
+ rather than a fixed list of names, so current and future `~*` markers are
48
+ recognized without further changes. `Type.Unsafe` nested inside a
49
+ `Type.Object(...)` was never affected.
50
+
51
+ ### Notes
52
+
53
+ - Serialized JSON Schema was never affected: TypeBox's `~` markers are
54
+ non-enumerable, so they never reached `JSON.stringify` (DocEnvelope, codegen)
55
+ or AJV. The frozen codegen goldens and DocEnvelope parity fixtures are
56
+ unchanged. App devs only need to upgrade; no code changes required.
57
+
7
58
  ## 10.1.0 — 2026-06-24
8
59
 
9
60
  Adds explicit versioning to the DocEnvelope so downstream consumers (docs
@@ -24,9 +75,10 @@ compatible. Purely additive — existing envelopes and consumers are unaffected.
24
75
  parse-compatibility signal. Exported as `DOC_ENVELOPE_GENERATOR_VERSION` from
25
76
  `ts-procedures/server`. Strippable via the `transform` hook for servers that
26
77
  don't want to advertise the version on a public docs endpoint.
27
- - **DocEnvelope wire-contract docs** — `docs/doc-envelope-spec.md` plus a
28
- validatable JSON Schema at `docs/doc-envelope.schema.json`, for building
29
- third-party tools against the served envelope.
78
+ - **DocEnvelope wire-contract docs** — `docs/doc-envelope-spec-v1.md` plus a
79
+ validatable JSON Schema at `docs/doc-envelope-v1.schema.json` (filenames pinned
80
+ to the envelope `specVersion`), for building third-party tools against the
81
+ served envelope.
30
82
 
31
83
  ### Internal
32
84
 
@@ -1,5 +1,6 @@
1
1
  import { ProcedureRegistrationError } from '../core/errors.js';
2
2
  import { extractJsonSchema } from './adapter.js';
3
+ import { stripInternalKeywords } from './strip-internal-keywords.js';
3
4
  function fail(ctx, channel, detail) {
4
5
  throw new ProcedureRegistrationError(ctx.name, `Error parsing schema for ${ctx.name} - ${channel}: ${detail}`, ctx.definitionInfo);
5
6
  }
@@ -20,7 +21,10 @@ function extractChannel(ctx, channel, raw) {
20
21
  const known = ctx.adapters.map((a) => a.name).join(', ');
21
22
  fail(ctx, channel, `Error extracting json schema ${channel} - it might be empty or not recognized by any schema adapter (registered: ${known})`);
22
23
  }
23
- return extracted;
24
+ // Strip TypeBox internal markers (`~unsafe`/`~optional`/…) that some
25
+ // compositions leak as enumerable properties — they break strict AJV and
26
+ // pollute serialized docs/codegen. See strip-internal-keywords.ts.
27
+ return stripInternalKeywords(extracted);
24
28
  }
25
29
  /** Extracts and compiles one validated channel. */
26
30
  function compileChannel(ctx, channel, raw) {
@@ -1 +1 @@
1
- {"version":3,"file":"compute-schema.js","sourceRoot":"","sources":["../../src/schema/compute-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAuChD,SAAS,IAAI,CAAC,GAAmB,EAAE,OAAe,EAAE,MAAc;IAChE,MAAM,IAAI,0BAA0B,CAClC,GAAG,CAAC,IAAI,EACR,4BAA4B,GAAG,CAAC,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE,EAC9D,GAAG,CAAC,cAAc,CACnB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,GAAmB,EAAE,OAAe,EAAE,GAAY;IACxE,IAAI,SAAkC,CAAA;IACtC,IAAI,CAAC;QACH,SAAS,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,gCAAgC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,IAAI,CACF,GAAG,EACH,OAAO,EACP,gCAAgC,OAAO,6EAA6E,KAAK,GAAG,CAC7H,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,mDAAmD;AACnD,SAAS,cAAc,CAAC,GAAmB,EAAE,OAAe,EAAE,GAAY;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IACpD,IAAI,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAA;IAC1D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,OAAO,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/E,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAsC,EACtC,OAIC;IAED,MAAM,UAAU,GAAuB;QACrC,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,SAAS;KACf,CAAA;IACD,MAAM,WAAW,GAAwB,EAAE,CAAA;IAE3C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;IAE/C,MAAM,GAAG,GAAmB,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAA;IAEhD,kDAAkD;IAClD,IAAI,OAAO,IAAI,MAAM,IAAK,MAA8B,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7E,MAAM,IAAI,0BAA0B,CAClC,IAAI,EACJ,kHAAkH,IAAI,IAAI,EAC1H,OAAO,CAAC,cAAc,CACvB,CAAA;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,0BAA0B,CAClC,IAAI,EACJ,sEAAsE,IAAI,4EAA4E,EACtJ,OAAO,CAAC,cAAc,CACvB,CAAA;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/F,UAAU,CAAC,MAAM,GAAG,SAAS,CAAA;QAC7B,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAA;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,UAAU,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACrF,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;QACrG,UAAU,CAAC,SAAS,GAAG,SAAS,CAAA;QAChC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAA;IAC9B,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,UAAU,CAAC,GAAG,GAAG,EAAE,CAAA;QACnB,WAAW,CAAC,GAAG,GAAG,EAAE,CAAA;QACpB,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,aAAa;gBAAE,SAAQ;YAC5B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,cAAc,WAAW,EAAE,EAAE,aAAa,CAAC,CAAA;YAC3G,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS,CAAA;YACvC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAA;QACzC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,UAAU,CAAC,GAAG,GAAG,EAAE,CAAA;QACnB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACpB,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/E,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;AACpC,CAAC"}
1
+ {"version":3,"file":"compute-schema.js","sourceRoot":"","sources":["../../src/schema/compute-schema.ts"],"names":[],"mappings":"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"}
@@ -182,6 +182,19 @@ describe('computeSchema', () => {
182
182
  it('throws a meaningful error naming the failing req channel', () => {
183
183
  expect(() => computeSchema('test-procedure', { req: { query: { not: 'a schema' } } }, options)).toThrow(/Error extracting json schema schema\.req\.query/);
184
184
  });
185
+ it('handles Type.Optional(Type.Unsafe(...)) without leaking ~markers into strict AJV or output', () => {
186
+ // typebox >= 1.2.0: this composition emits `~unsafe`/`~optional` as
187
+ // enumerable props, which crashed strict AJV and polluted the JSON Schema.
188
+ const schema = {
189
+ params: Type.Object({ x: Type.Optional(Type.Unsafe({ type: 'string' })) }),
190
+ };
191
+ const result = computeSchema('test-procedure', schema, options);
192
+ // No registration crash, and the stored JSON Schema is clean.
193
+ expect(JSON.stringify(result.jsonSchema.params)).not.toMatch(/~/);
194
+ expect(result.jsonSchema.params.properties.x).toEqual({ type: 'string' });
195
+ // Validator works against the cleaned schema.
196
+ expect(result.validations.params({ x: 'hello' })).toEqual({});
197
+ });
185
198
  it('throws a compile error when the schema is recognized but invalid JSON Schema', () => {
186
199
  // Looks like a TypeBox schema (has ~kind) but AJV rejects it at compile time
187
200
  const recognizedButInvalid = { '~kind': 'Object', type: 'not-a-real-type' };
@@ -1 +1 @@
1
- {"version":3,"file":"compute-schema.test.js","sourceRoot":"","sources":["../../src/schema/compute-schema.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute-schema.test.js","sourceRoot":"","sources":["../../src/schema/compute-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { TJSONSchema } from './json-schema.js';
2
+ /**
3
+ * Deep-removes TypeBox v1 internal markers (`~kind`, `~unsafe`, `~optional`, …)
4
+ * from an extracted JSON Schema, returning a fresh structure (never mutates the
5
+ * input).
6
+ *
7
+ * These markers are *usually* non-enumerable, so they stay out of JSON Schema on
8
+ * their own. But some compositions leak them as **enumerable** own properties —
9
+ * notably `Type.Optional(Type.Unsafe({...}))`, which emits `~unsafe`/`~optional`
10
+ * inline. Left in place those markers (a) pollute serialized docs/codegen output
11
+ * and (b) make strict AJV throw `unknown keyword: "~unsafe"` at registration.
12
+ *
13
+ * Stripping by the `~`-prefix convention (rather than a fixed name list) keeps
14
+ * this robust against future TypeBox markers — same convention the TypeBox
15
+ * adapter detects on.
16
+ */
17
+ export declare function stripInternalKeywords<T>(schema: T): T;
18
+ export type { TJSONSchema };
@@ -0,0 +1,33 @@
1
+ /** TypeBox v1 prefixes every internal marker key with `~`. */
2
+ const TILDE = '~';
3
+ /**
4
+ * Deep-removes TypeBox v1 internal markers (`~kind`, `~unsafe`, `~optional`, …)
5
+ * from an extracted JSON Schema, returning a fresh structure (never mutates the
6
+ * input).
7
+ *
8
+ * These markers are *usually* non-enumerable, so they stay out of JSON Schema on
9
+ * their own. But some compositions leak them as **enumerable** own properties —
10
+ * notably `Type.Optional(Type.Unsafe({...}))`, which emits `~unsafe`/`~optional`
11
+ * inline. Left in place those markers (a) pollute serialized docs/codegen output
12
+ * and (b) make strict AJV throw `unknown keyword: "~unsafe"` at registration.
13
+ *
14
+ * Stripping by the `~`-prefix convention (rather than a fixed name list) keeps
15
+ * this robust against future TypeBox markers — same convention the TypeBox
16
+ * adapter detects on.
17
+ */
18
+ export function stripInternalKeywords(schema) {
19
+ if (Array.isArray(schema)) {
20
+ return schema.map((item) => stripInternalKeywords(item));
21
+ }
22
+ if (schema !== null && typeof schema === 'object') {
23
+ const out = {};
24
+ for (const [key, value] of Object.entries(schema)) {
25
+ if (key.startsWith(TILDE))
26
+ continue;
27
+ out[key] = stripInternalKeywords(value);
28
+ }
29
+ return out;
30
+ }
31
+ return schema;
32
+ }
33
+ //# sourceMappingURL=strip-internal-keywords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strip-internal-keywords.js","sourceRoot":"","sources":["../../src/schema/strip-internal-keywords.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,KAAK,GAAG,GAAG,CAAA;AAEjB;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAI,MAAS;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAM,CAAA;IAC/D,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAQ;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,GAAQ,CAAA;IACjB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { Type } from 'typebox';
3
+ import { stripInternalKeywords } from './strip-internal-keywords.js';
4
+ describe('stripInternalKeywords', () => {
5
+ test('removes enumerable ~-prefixed markers leaked by Type.Optional(Type.Unsafe(...))', () => {
6
+ // This composition emits `~unsafe`/`~optional` as ENUMERABLE own props.
7
+ const leaky = Type.Optional(Type.Unsafe({ type: 'string' }));
8
+ expect(Object.keys(leaky).some((k) => k.startsWith('~'))).toBe(true);
9
+ const clean = stripInternalKeywords(leaky);
10
+ expect(clean).toEqual({ type: 'string' });
11
+ expect(Object.keys(clean).some((k) => k.startsWith('~'))).toBe(false);
12
+ });
13
+ test('strips markers nested inside object properties', () => {
14
+ const schema = Type.Object({ x: Type.Optional(Type.Unsafe({ type: 'string' })) });
15
+ const clean = stripInternalKeywords(schema);
16
+ expect(JSON.stringify(clean)).not.toMatch(/~/);
17
+ expect(clean.properties.x).toEqual({ type: 'string' });
18
+ });
19
+ test('strips markers inside arrays (e.g. anyOf members)', () => {
20
+ const schema = {
21
+ anyOf: [Type.Unsafe({ type: 'string' }), { type: 'number', '~optional': true }],
22
+ };
23
+ const clean = stripInternalKeywords(schema);
24
+ expect(clean.anyOf).toEqual([{ type: 'string' }, { type: 'number' }]);
25
+ });
26
+ test('leaves a clean schema structurally equal and does not mutate the input', () => {
27
+ const input = { type: 'object', properties: { a: { type: 'string' } } };
28
+ const clean = stripInternalKeywords(input);
29
+ expect(clean).toEqual(input);
30
+ expect(clean).not.toBe(input); // fresh structure
31
+ });
32
+ test('passes primitives through unchanged', () => {
33
+ expect(stripInternalKeywords('x')).toBe('x');
34
+ expect(stripInternalKeywords(5)).toBe(5);
35
+ expect(stripInternalKeywords(null)).toBe(null);
36
+ });
37
+ });
38
+ //# sourceMappingURL=strip-internal-keywords.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strip-internal-keywords.test.js","sourceRoot":"","sources":["../../src/schema/strip-internal-keywords.test.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import type { SchemaAdapter } from './adapter.js';
2
2
  /**
3
3
  * Built-in adapter for TypeBox (`import { Type } from 'typebox'`).
4
4
  *
5
- * Detection covers both typebox v1 (`~kind` property) and legacy
5
+ * Detection covers both typebox v1 (any `~`-prefixed marker) and legacy
6
6
  * `@sinclair/typebox` 0.3x (`Symbol.for('TypeBox.Kind')`). TypeBox schemas
7
7
  * already ARE JSON Schema, so conversion is the identity.
8
8
  */
@@ -1,8 +1,26 @@
1
1
  const TYPEBOX_KIND = Symbol.for('TypeBox.Kind');
2
+ /** TypeBox v1 prefixes every internal marker key with `~`. */
3
+ const TILDE = '~'.charCodeAt(0);
4
+ /**
5
+ * TypeBox v1 namespaces all of its internal markers under a `~` prefix
6
+ * (`~kind`, `~unsafe`, `~optional`, ...) — non-enumerable own properties that
7
+ * stay out of the serialized JSON Schema. Detecting the *convention* rather
8
+ * than specific marker names means new markers (e.g. `~unsafe`, added in
9
+ * typebox 1.2.0 and used by `Type.Unsafe(...)` *instead of* `~kind`) are
10
+ * recognized without a code change. Reflect.ownKeys is required because these
11
+ * markers are non-enumerable.
12
+ */
13
+ function hasTypeBoxV1Marker(schema) {
14
+ for (const key of Reflect.ownKeys(schema)) {
15
+ if (typeof key === 'string' && key.charCodeAt(0) === TILDE)
16
+ return true;
17
+ }
18
+ return false;
19
+ }
2
20
  /**
3
21
  * Built-in adapter for TypeBox (`import { Type } from 'typebox'`).
4
22
  *
5
- * Detection covers both typebox v1 (`~kind` property) and legacy
23
+ * Detection covers both typebox v1 (any `~`-prefixed marker) and legacy
6
24
  * `@sinclair/typebox` 0.3x (`Symbol.for('TypeBox.Kind')`). TypeBox schemas
7
25
  * already ARE JSON Schema, so conversion is the identity.
8
26
  */
@@ -11,7 +29,7 @@ export const typeboxAdapter = {
11
29
  detect(schema) {
12
30
  if (typeof schema !== 'object' || schema === null)
13
31
  return false;
14
- return '~kind' in schema || TYPEBOX_KIND in schema;
32
+ return hasTypeBoxV1Marker(schema) || TYPEBOX_KIND in schema;
15
33
  },
16
34
  toJsonSchema(schema) {
17
35
  return schema;
@@ -1 +1 @@
1
- {"version":3,"file":"typebox.js","sourceRoot":"","sources":["../../src/schema/typebox.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE,SAAS;IACf,MAAM,CAAC,MAAe;QACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QAC/D,OAAO,OAAO,IAAI,MAAM,IAAI,YAAY,IAAI,MAAM,CAAA;IACpD,CAAC;IACD,YAAY,CAAC,MAAe;QAC1B,OAAO,MAAqB,CAAA;IAC9B,CAAC;CACF,CAAA;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"typebox.js","sourceRoot":"","sources":["../../src/schema/typebox.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAE/C,8DAA8D;AAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AAE/B;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;IACzE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE,SAAS;IACf,MAAM,CAAC,MAAe;QACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QAC/D,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,YAAY,IAAI,MAAM,CAAA;IAC7D,CAAC;IACD,YAAY,CAAC,MAAe;QAC1B,OAAO,MAAqB,CAAA;IAC9B,CAAC;CACF,CAAA;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACtC,CAAC"}
@@ -6,6 +6,16 @@ describe('typebox schema detection', () => {
6
6
  test('it recognizes TypeBox schema', () => {
7
7
  expect(isTypeboxSchema(typebox)).toBe(true);
8
8
  });
9
+ test('it recognizes a top-level Type.Unsafe schema (~unsafe marker, no ~kind)', () => {
10
+ // typebox >= 1.2.0: Type.Unsafe carries `~unsafe` INSTEAD of `~kind`.
11
+ expect(isTypeboxSchema(Type.Unsafe({ type: 'string' }))).toBe(true);
12
+ });
13
+ test('it recognizes any future ~-prefixed marker (convention, not a name list)', () => {
14
+ // Detection keys off TypeBox's `~` namespace convention, so a marker that
15
+ // doesn't exist yet is still recognized without a code change.
16
+ const futureMarker = { '~somethingNew': true, type: 'object' };
17
+ expect(isTypeboxSchema(futureMarker)).toBe(true);
18
+ });
9
19
  test('it rejects non-TypeBox values', () => {
10
20
  expect(isTypeboxSchema({ type: 'object' })).toBe(false);
11
21
  expect(isTypeboxSchema('string value')).toBe(false);
@@ -1 +1 @@
1
- {"version":3,"file":"typebox.test.js","sourceRoot":"","sources":["../../src/schema/typebox.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE9D,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAEpD,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvD,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC5E,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACzE,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACnE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;YAC1E,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"typebox.test.js","sourceRoot":"","sources":["../../src/schema/typebox.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
- # ts-procedures DocEnvelope — Consumer Spec
1
+ # ts-procedures DocEnvelope — Consumer Spec (`specVersion: 1`)
2
+
3
+ > **This document describes DocEnvelope `specVersion: 1`.** The filename is
4
+ > pinned to the spec version (`-v1`) so future format changes land as a sibling
5
+ > (`doc-envelope-spec-v2.md`) and the differences stay diffable. Check the
6
+ > envelope's `specVersion` field (absent ⇒ `1`) to know which spec applies.
2
7
 
3
8
  A spec for a GUI that fetches a `DocEnvelope` JSON document from a ts-procedures
4
9
  server URL and renders it. This is the **stable wire contract** between a
@@ -6,7 +11,7 @@ ts-procedures server and any documentation/codegen consumer. It is a *frozen*
6
11
  contract in the framework (changing field names/nesting breaks codegen goldens),
7
12
  so you can build against it confidently.
8
13
 
9
- Companion file: `doc-envelope.schema.json` (JSON Schema Draft-07) — validate
14
+ Companion file: `doc-envelope-v1.schema.json` (JSON Schema Draft-07) — validate
10
15
  fetched documents against it.
11
16
 
12
17
  ---
@@ -26,7 +31,7 @@ So your website's "paste a URL" flow should:
26
31
  what the official codegen uses as its "is this an envelope?" gate. If
27
32
  `routes` is missing/not-an-array, show a clear "not a ts-procedures docs
28
33
  document" error.
29
- 4. Optionally validate fully against `doc-envelope.schema.json`.
34
+ 4. Optionally validate fully against `doc-envelope-v1.schema.json`.
30
35
 
31
36
  CORS: the server must allow your origin, or you'll need a proxy. Worth surfacing
32
37
  as a distinct error from "bad JSON".
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://ts-procedures.dev/schemas/doc-envelope.schema.json",
4
- "title": "ts-procedures DocEnvelope",
3
+ "$id": "https://ts-procedures.dev/schemas/doc-envelope-v1.schema.json",
4
+ "title": "ts-procedures DocEnvelope (specVersion 1)",
5
5
  "description": "The JSON document a ts-procedures server exposes (via builder.toDocEnvelope() / DocRegistry.toJSON()). Describes every procedure/route the server serves, the global error catalog, and global headers. Payload schemas embedded under each route's `jsonSchema` are arbitrary JSON Schema (Draft-07) objects and are intentionally left unconstrained here.",
6
6
  "type": "object",
7
7
  "required": ["basePath", "headers", "errors", "routes"],
@@ -337,7 +337,7 @@ app.get('/docs', (c) => c.json(
337
337
  ))
338
338
  ```
339
339
 
340
- The `DocRegistry` output is the input for [Client Code Generation](./client-and-codegen.md). Building a third-party docs viewer or other tool that consumes the served envelope? The full wire contract — every field, per-kind shapes, and a validatable JSON Schema — is in [DocEnvelope Spec](./doc-envelope-spec.md) (`doc-envelope.schema.json`).
340
+ The `DocRegistry` output is the input for [Client Code Generation](./client-and-codegen.md). Building a third-party docs viewer or other tool that consumes the served envelope? The full wire contract — every field, per-kind shapes, and a validatable JSON Schema — is in [DocEnvelope Spec](./doc-envelope-spec-v1.md) (`doc-envelope-v1.schema.json`).
341
341
 
342
342
  ## Type Exports
343
343
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-procedures",
3
- "version": "10.1.0",
3
+ "version": "10.1.2",
4
4
  "description": "A TypeScript RPC framework that creates type-safe, schema-validated procedure calls with a single function definition. Define your procedures once and get full type inference, runtime validation, and framework integration hooks.",
5
5
  "main": "build/exports.js",
6
6
  "types": "build/exports.d.ts",
@@ -245,6 +245,22 @@ describe('computeSchema', () => {
245
245
  ).toThrow(/Error extracting json schema schema\.req\.query/)
246
246
  })
247
247
 
248
+ it('handles Type.Optional(Type.Unsafe(...)) without leaking ~markers into strict AJV or output', () => {
249
+ // typebox >= 1.2.0: this composition emits `~unsafe`/`~optional` as
250
+ // enumerable props, which crashed strict AJV and polluted the JSON Schema.
251
+ const schema = {
252
+ params: Type.Object({ x: Type.Optional(Type.Unsafe({ type: 'string' })) }),
253
+ }
254
+
255
+ const result = computeSchema('test-procedure', schema, options)
256
+
257
+ // No registration crash, and the stored JSON Schema is clean.
258
+ expect(JSON.stringify(result.jsonSchema.params)).not.toMatch(/~/)
259
+ expect((result.jsonSchema.params as any).properties.x).toEqual({ type: 'string' })
260
+ // Validator works against the cleaned schema.
261
+ expect(result.validations.params!({ x: 'hello' })).toEqual({})
262
+ })
263
+
248
264
  it('throws a compile error when the schema is recognized but invalid JSON Schema', () => {
249
265
  // Looks like a TypeBox schema (has ~kind) but AJV rejects it at compile time
250
266
  const recognizedButInvalid = { '~kind': 'Object', type: 'not-a-real-type' }
@@ -2,6 +2,7 @@ import { ProcedureRegistrationError } from '../core/errors.js'
2
2
  import type { DefinitionInfo } from '../core/definition-site.js'
3
3
  import { extractJsonSchema } from './adapter.js'
4
4
  import type { SchemaAdapter } from './adapter.js'
5
+ import { stripInternalKeywords } from './strip-internal-keywords.js'
5
6
  import type { TJSONSchema } from './json-schema.js'
6
7
  import type { TSchemaValidationError, Validate, ValidatorCompiler } from './compile.js'
7
8
 
@@ -67,7 +68,10 @@ function extractChannel(ctx: ComputeContext, channel: string, raw: unknown): TJS
67
68
  `Error extracting json schema ${channel} - it might be empty or not recognized by any schema adapter (registered: ${known})`,
68
69
  )
69
70
  }
70
- return extracted
71
+ // Strip TypeBox internal markers (`~unsafe`/`~optional`/…) that some
72
+ // compositions leak as enumerable properties — they break strict AJV and
73
+ // pollute serialized docs/codegen. See strip-internal-keywords.ts.
74
+ return stripInternalKeywords(extracted)
71
75
  }
72
76
 
73
77
  /** Extracts and compiles one validated channel. */
@@ -0,0 +1,43 @@
1
+ import { describe, expect, test } from 'vitest'
2
+ import { Type } from 'typebox'
3
+ import { stripInternalKeywords } from './strip-internal-keywords.js'
4
+
5
+ describe('stripInternalKeywords', () => {
6
+ test('removes enumerable ~-prefixed markers leaked by Type.Optional(Type.Unsafe(...))', () => {
7
+ // This composition emits `~unsafe`/`~optional` as ENUMERABLE own props.
8
+ const leaky = Type.Optional(Type.Unsafe({ type: 'string' })) as unknown as Record<string, unknown>
9
+ expect(Object.keys(leaky).some((k) => k.startsWith('~'))).toBe(true)
10
+
11
+ const clean = stripInternalKeywords(leaky)
12
+ expect(clean).toEqual({ type: 'string' })
13
+ expect(Object.keys(clean as object).some((k) => k.startsWith('~'))).toBe(false)
14
+ })
15
+
16
+ test('strips markers nested inside object properties', () => {
17
+ const schema = Type.Object({ x: Type.Optional(Type.Unsafe({ type: 'string' })) })
18
+ const clean = stripInternalKeywords(schema) as any
19
+ expect(JSON.stringify(clean)).not.toMatch(/~/)
20
+ expect(clean.properties.x).toEqual({ type: 'string' })
21
+ })
22
+
23
+ test('strips markers inside arrays (e.g. anyOf members)', () => {
24
+ const schema = {
25
+ anyOf: [Type.Unsafe({ type: 'string' }), { type: 'number', '~optional': true }],
26
+ }
27
+ const clean = stripInternalKeywords(schema) as any
28
+ expect(clean.anyOf).toEqual([{ type: 'string' }, { type: 'number' }])
29
+ })
30
+
31
+ test('leaves a clean schema structurally equal and does not mutate the input', () => {
32
+ const input = { type: 'object', properties: { a: { type: 'string' } } }
33
+ const clean = stripInternalKeywords(input)
34
+ expect(clean).toEqual(input)
35
+ expect(clean).not.toBe(input) // fresh structure
36
+ })
37
+
38
+ test('passes primitives through unchanged', () => {
39
+ expect(stripInternalKeywords('x')).toBe('x')
40
+ expect(stripInternalKeywords(5)).toBe(5)
41
+ expect(stripInternalKeywords(null)).toBe(null)
42
+ })
43
+ })
@@ -0,0 +1,36 @@
1
+ import type { TJSONSchema } from './json-schema.js'
2
+
3
+ /** TypeBox v1 prefixes every internal marker key with `~`. */
4
+ const TILDE = '~'
5
+
6
+ /**
7
+ * Deep-removes TypeBox v1 internal markers (`~kind`, `~unsafe`, `~optional`, …)
8
+ * from an extracted JSON Schema, returning a fresh structure (never mutates the
9
+ * input).
10
+ *
11
+ * These markers are *usually* non-enumerable, so they stay out of JSON Schema on
12
+ * their own. But some compositions leak them as **enumerable** own properties —
13
+ * notably `Type.Optional(Type.Unsafe({...}))`, which emits `~unsafe`/`~optional`
14
+ * inline. Left in place those markers (a) pollute serialized docs/codegen output
15
+ * and (b) make strict AJV throw `unknown keyword: "~unsafe"` at registration.
16
+ *
17
+ * Stripping by the `~`-prefix convention (rather than a fixed name list) keeps
18
+ * this robust against future TypeBox markers — same convention the TypeBox
19
+ * adapter detects on.
20
+ */
21
+ export function stripInternalKeywords<T>(schema: T): T {
22
+ if (Array.isArray(schema)) {
23
+ return schema.map((item) => stripInternalKeywords(item)) as T
24
+ }
25
+ if (schema !== null && typeof schema === 'object') {
26
+ const out: Record<string, unknown> = {}
27
+ for (const [key, value] of Object.entries(schema)) {
28
+ if (key.startsWith(TILDE)) continue
29
+ out[key] = stripInternalKeywords(value)
30
+ }
31
+ return out as T
32
+ }
33
+ return schema
34
+ }
35
+
36
+ export type { TJSONSchema }
@@ -9,6 +9,18 @@ describe('typebox schema detection', () => {
9
9
  expect(isTypeboxSchema(typebox)).toBe(true)
10
10
  })
11
11
 
12
+ test('it recognizes a top-level Type.Unsafe schema (~unsafe marker, no ~kind)', () => {
13
+ // typebox >= 1.2.0: Type.Unsafe carries `~unsafe` INSTEAD of `~kind`.
14
+ expect(isTypeboxSchema(Type.Unsafe({ type: 'string' }))).toBe(true)
15
+ })
16
+
17
+ test('it recognizes any future ~-prefixed marker (convention, not a name list)', () => {
18
+ // Detection keys off TypeBox's `~` namespace convention, so a marker that
19
+ // doesn't exist yet is still recognized without a code change.
20
+ const futureMarker = { '~somethingNew': true, type: 'object' }
21
+ expect(isTypeboxSchema(futureMarker)).toBe(true)
22
+ })
23
+
12
24
  test('it rejects non-TypeBox values', () => {
13
25
  expect(isTypeboxSchema({ type: 'object' })).toBe(false)
14
26
  expect(isTypeboxSchema('string value')).toBe(false)
@@ -3,10 +3,29 @@ import type { TJSONSchema } from './json-schema.js'
3
3
 
4
4
  const TYPEBOX_KIND = Symbol.for('TypeBox.Kind')
5
5
 
6
+ /** TypeBox v1 prefixes every internal marker key with `~`. */
7
+ const TILDE = '~'.charCodeAt(0)
8
+
9
+ /**
10
+ * TypeBox v1 namespaces all of its internal markers under a `~` prefix
11
+ * (`~kind`, `~unsafe`, `~optional`, ...) — non-enumerable own properties that
12
+ * stay out of the serialized JSON Schema. Detecting the *convention* rather
13
+ * than specific marker names means new markers (e.g. `~unsafe`, added in
14
+ * typebox 1.2.0 and used by `Type.Unsafe(...)` *instead of* `~kind`) are
15
+ * recognized without a code change. Reflect.ownKeys is required because these
16
+ * markers are non-enumerable.
17
+ */
18
+ function hasTypeBoxV1Marker(schema: object): boolean {
19
+ for (const key of Reflect.ownKeys(schema)) {
20
+ if (typeof key === 'string' && key.charCodeAt(0) === TILDE) return true
21
+ }
22
+ return false
23
+ }
24
+
6
25
  /**
7
26
  * Built-in adapter for TypeBox (`import { Type } from 'typebox'`).
8
27
  *
9
- * Detection covers both typebox v1 (`~kind` property) and legacy
28
+ * Detection covers both typebox v1 (any `~`-prefixed marker) and legacy
10
29
  * `@sinclair/typebox` 0.3x (`Symbol.for('TypeBox.Kind')`). TypeBox schemas
11
30
  * already ARE JSON Schema, so conversion is the identity.
12
31
  */
@@ -14,7 +33,7 @@ export const typeboxAdapter: SchemaAdapter = {
14
33
  name: 'typebox',
15
34
  detect(schema: unknown): boolean {
16
35
  if (typeof schema !== 'object' || schema === null) return false
17
- return '~kind' in schema || TYPEBOX_KIND in schema
36
+ return hasTypeBoxV1Marker(schema) || TYPEBOX_KIND in schema
18
37
  },
19
38
  toJsonSchema(schema: unknown): TJSONSchema {
20
39
  return schema as TJSONSchema