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 +55 -3
- package/build/schema/compute-schema.js +5 -1
- package/build/schema/compute-schema.js.map +1 -1
- package/build/schema/compute-schema.test.js +13 -0
- package/build/schema/compute-schema.test.js.map +1 -1
- package/build/schema/strip-internal-keywords.d.ts +18 -0
- package/build/schema/strip-internal-keywords.js +33 -0
- package/build/schema/strip-internal-keywords.js.map +1 -0
- package/build/schema/strip-internal-keywords.test.d.ts +1 -0
- package/build/schema/strip-internal-keywords.test.js +38 -0
- package/build/schema/strip-internal-keywords.test.js.map +1 -0
- package/build/schema/typebox.d.ts +1 -1
- package/build/schema/typebox.js +20 -2
- package/build/schema/typebox.js.map +1 -1
- package/build/schema/typebox.test.js +10 -0
- package/build/schema/typebox.test.js.map +1 -1
- package/docs/{doc-envelope-spec.md → doc-envelope-spec-v1.md} +8 -3
- package/docs/{doc-envelope.schema.json → doc-envelope-v1.schema.json} +2 -2
- package/docs/http-integrations.md +1 -1
- package/package.json +1 -1
- package/src/schema/compute-schema.test.ts +16 -0
- package/src/schema/compute-schema.ts +5 -1
- package/src/schema/strip-internal-keywords.test.ts +43 -0
- package/src/schema/strip-internal-keywords.ts +36 -0
- package/src/schema/typebox.test.ts +12 -0
- package/src/schema/typebox.ts +21 -2
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
|
|
29
|
-
third-party tools against the
|
|
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
|
-
|
|
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;
|
|
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 (
|
|
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
|
*/
|
package/build/schema/typebox.js
CHANGED
|
@@ -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 (
|
|
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
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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)
|
package/src/schema/typebox.ts
CHANGED
|
@@ -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 (
|
|
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
|
|
36
|
+
return hasTypeBoxV1Marker(schema) || TYPEBOX_KIND in schema
|
|
18
37
|
},
|
|
19
38
|
toJsonSchema(schema: unknown): TJSONSchema {
|
|
20
39
|
return schema as TJSONSchema
|