ts-procedures 9.2.0 → 10.0.0

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.
Files changed (128) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/codegen/bin/cli.js +1 -1
  3. package/build/codegen/bin/cli.js.map +1 -1
  4. package/build/codegen/emit/api-route.js +1 -1
  5. package/build/codegen/emit/api-route.js.map +1 -1
  6. package/build/codegen/emit/scope-file.js +1 -1
  7. package/build/codegen/emit/scope-file.js.map +1 -1
  8. package/build/codegen/emit-errors.integration.test.js +2 -2
  9. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  10. package/build/codegen/resolve-envelope.js +1 -1
  11. package/build/codegen/resolve-envelope.js.map +1 -1
  12. package/build/codegen/test-helpers/run-tsc.js +1 -1
  13. package/build/codegen/test-helpers/run-tsc.js.map +1 -1
  14. package/package.json +8 -8
  15. package/src/codegen/bin/cli.ts +1 -1
  16. package/src/codegen/emit/api-route.ts +1 -1
  17. package/src/codegen/emit/scope-file.ts +2 -1
  18. package/src/codegen/emit-errors.integration.test.ts +2 -2
  19. package/src/codegen/resolve-envelope.ts +1 -1
  20. package/src/codegen/test-helpers/run-tsc.ts +1 -0
  21. package/build/errors.d.ts +0 -33
  22. package/build/errors.js +0 -91
  23. package/build/errors.js.map +0 -1
  24. package/build/errors.test.d.ts +0 -1
  25. package/build/errors.test.js +0 -122
  26. package/build/errors.test.js.map +0 -1
  27. package/build/implementations/http/doc-registry.d.ts +0 -28
  28. package/build/implementations/http/doc-registry.js +0 -96
  29. package/build/implementations/http/doc-registry.js.map +0 -1
  30. package/build/implementations/http/doc-registry.test.d.ts +0 -1
  31. package/build/implementations/http/doc-registry.test.js +0 -516
  32. package/build/implementations/http/doc-registry.test.js.map +0 -1
  33. package/build/implementations/http/error-taxonomy.d.ts +0 -249
  34. package/build/implementations/http/error-taxonomy.js +0 -252
  35. package/build/implementations/http/error-taxonomy.js.map +0 -1
  36. package/build/implementations/http/error-taxonomy.test.d.ts +0 -1
  37. package/build/implementations/http/error-taxonomy.test.js +0 -399
  38. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  39. package/build/implementations/http/express-rpc/error-taxonomy.test.d.ts +0 -1
  40. package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
  41. package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
  42. package/build/implementations/http/express-rpc/index.d.ts +0 -125
  43. package/build/implementations/http/express-rpc/index.js +0 -216
  44. package/build/implementations/http/express-rpc/index.js.map +0 -1
  45. package/build/implementations/http/express-rpc/index.test.d.ts +0 -1
  46. package/build/implementations/http/express-rpc/index.test.js +0 -684
  47. package/build/implementations/http/express-rpc/index.test.js.map +0 -1
  48. package/build/implementations/http/express-rpc/types.d.ts +0 -11
  49. package/build/implementations/http/express-rpc/types.js +0 -2
  50. package/build/implementations/http/express-rpc/types.js.map +0 -1
  51. package/build/implementations/http/hono-api/error-taxonomy.test.d.ts +0 -1
  52. package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
  53. package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
  54. package/build/implementations/http/hono-api/index.d.ts +0 -151
  55. package/build/implementations/http/hono-api/index.js +0 -344
  56. package/build/implementations/http/hono-api/index.js.map +0 -1
  57. package/build/implementations/http/hono-api/index.test.d.ts +0 -1
  58. package/build/implementations/http/hono-api/index.test.js +0 -992
  59. package/build/implementations/http/hono-api/index.test.js.map +0 -1
  60. package/build/implementations/http/hono-api/types.d.ts +0 -13
  61. package/build/implementations/http/hono-api/types.js +0 -2
  62. package/build/implementations/http/hono-api/types.js.map +0 -1
  63. package/build/implementations/http/hono-rpc/error-taxonomy.test.d.ts +0 -1
  64. package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
  65. package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
  66. package/build/implementations/http/hono-rpc/index.d.ts +0 -130
  67. package/build/implementations/http/hono-rpc/index.js +0 -209
  68. package/build/implementations/http/hono-rpc/index.js.map +0 -1
  69. package/build/implementations/http/hono-rpc/index.test.d.ts +0 -1
  70. package/build/implementations/http/hono-rpc/index.test.js +0 -828
  71. package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
  72. package/build/implementations/http/hono-rpc/types.d.ts +0 -11
  73. package/build/implementations/http/hono-rpc/types.js +0 -2
  74. package/build/implementations/http/hono-rpc/types.js.map +0 -1
  75. package/build/implementations/http/hono-stream/error-taxonomy.test.d.ts +0 -1
  76. package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
  77. package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
  78. package/build/implementations/http/hono-stream/index.d.ts +0 -171
  79. package/build/implementations/http/hono-stream/index.js +0 -415
  80. package/build/implementations/http/hono-stream/index.js.map +0 -1
  81. package/build/implementations/http/hono-stream/index.test.d.ts +0 -1
  82. package/build/implementations/http/hono-stream/index.test.js +0 -1383
  83. package/build/implementations/http/hono-stream/index.test.js.map +0 -1
  84. package/build/implementations/http/hono-stream/types.d.ts +0 -15
  85. package/build/implementations/http/hono-stream/types.js +0 -2
  86. package/build/implementations/http/hono-stream/types.js.map +0 -1
  87. package/build/implementations/http/on-request-error.test.d.ts +0 -1
  88. package/build/implementations/http/on-request-error.test.js +0 -173
  89. package/build/implementations/http/on-request-error.test.js.map +0 -1
  90. package/build/implementations/http/route-errors.test.d.ts +0 -1
  91. package/build/implementations/http/route-errors.test.js +0 -139
  92. package/build/implementations/http/route-errors.test.js.map +0 -1
  93. package/build/implementations/types.d.ts +0 -192
  94. package/build/implementations/types.js +0 -2
  95. package/build/implementations/types.js.map +0 -1
  96. package/build/index.d.ts +0 -165
  97. package/build/index.js +0 -258
  98. package/build/index.js.map +0 -1
  99. package/build/index.test.d.ts +0 -1
  100. package/build/index.test.js +0 -920
  101. package/build/index.test.js.map +0 -1
  102. package/build/schema/extract-json-schema.d.ts +0 -2
  103. package/build/schema/extract-json-schema.js +0 -12
  104. package/build/schema/extract-json-schema.js.map +0 -1
  105. package/build/schema/extract-json-schema.test.d.ts +0 -1
  106. package/build/schema/extract-json-schema.test.js +0 -23
  107. package/build/schema/extract-json-schema.test.js.map +0 -1
  108. package/build/schema/parser.d.ts +0 -28
  109. package/build/schema/parser.js +0 -170
  110. package/build/schema/parser.js.map +0 -1
  111. package/build/schema/parser.test.d.ts +0 -1
  112. package/build/schema/parser.test.js +0 -120
  113. package/build/schema/parser.test.js.map +0 -1
  114. package/build/schema/resolve-schema-lib.d.ts +0 -12
  115. package/build/schema/resolve-schema-lib.js +0 -11
  116. package/build/schema/resolve-schema-lib.js.map +0 -1
  117. package/build/schema/resolve-schema-lib.test.d.ts +0 -1
  118. package/build/schema/resolve-schema-lib.test.js +0 -17
  119. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  120. package/build/schema/types.d.ts +0 -8
  121. package/build/schema/types.js +0 -2
  122. package/build/schema/types.js.map +0 -1
  123. package/build/stack-utils.d.ts +0 -25
  124. package/build/stack-utils.js +0 -95
  125. package/build/stack-utils.js.map +0 -1
  126. package/build/stack-utils.test.d.ts +0 -1
  127. package/build/stack-utils.test.js +0 -80
  128. package/build/stack-utils.test.js.map +0 -1
@@ -1,516 +0,0 @@
1
- import { describe, expect, it, test, vi, afterEach } from 'vitest';
2
- import { v } from 'suretype';
3
- import { Procedures } from '../../index.js';
4
- import { HonoRPCAppBuilder } from './hono-rpc/index.js';
5
- import { DocRegistry } from './doc-registry.js';
6
- import { defineErrorTaxonomy } from './error-taxonomy.js';
7
- // ---------------------------------------------------------------------------
8
- // Helpers — minimal doc fixtures
9
- // ---------------------------------------------------------------------------
10
- const rpcDoc = {
11
- kind: 'rpc',
12
- name: 'Echo',
13
- path: '/echo/1',
14
- method: 'post',
15
- scope: 'echo',
16
- version: 1,
17
- jsonSchema: { body: { type: 'object' } },
18
- };
19
- const apiDoc = {
20
- kind: 'api',
21
- name: 'GetUser',
22
- path: '/users/:id',
23
- method: 'get',
24
- fullPath: '/api/users/:id',
25
- jsonSchema: { pathParams: { type: 'object' } },
26
- };
27
- const streamDoc = {
28
- kind: 'stream',
29
- name: 'Feed',
30
- path: '/feed/1',
31
- methods: ['get'],
32
- streamMode: 'sse',
33
- scope: 'feed',
34
- version: 1,
35
- jsonSchema: { yieldType: { type: 'object' } },
36
- };
37
- function makeSource(docs) {
38
- return { docs };
39
- }
40
- // ---------------------------------------------------------------------------
41
- // Tests
42
- // ---------------------------------------------------------------------------
43
- describe('DocRegistry', () => {
44
- // --------------------------------------------------------------------------
45
- // Constructor
46
- // --------------------------------------------------------------------------
47
- describe('constructor', () => {
48
- test('uses defaults when no config provided', () => {
49
- const registry = new DocRegistry({ includeDefaults: false });
50
- const out = registry.toJSON();
51
- expect(out.basePath).toBe('');
52
- expect(out.headers).toEqual([]);
53
- expect(out.errors).toEqual([]);
54
- });
55
- test('accepts partial config', () => {
56
- const registry = new DocRegistry({ basePath: '/v1', includeDefaults: false });
57
- const out = registry.toJSON();
58
- expect(out.basePath).toBe('/v1');
59
- expect(out.headers).toEqual([]);
60
- expect(out.errors).toEqual([]);
61
- });
62
- test('accepts full config', () => {
63
- const headers = [{ name: 'Authorization', description: 'Bearer token', required: true }];
64
- const errors = [{ name: 'Unauthorized', statusCode: 401, description: 'Missing token' }];
65
- const registry = new DocRegistry({ basePath: '/api', headers, errors, includeDefaults: false });
66
- const out = registry.toJSON();
67
- expect(out.basePath).toBe('/api');
68
- expect(out.headers).toEqual(headers);
69
- expect(out.errors).toEqual(errors);
70
- });
71
- });
72
- // --------------------------------------------------------------------------
73
- // from()
74
- // --------------------------------------------------------------------------
75
- describe('from()', () => {
76
- test('returns this for chaining', () => {
77
- const registry = new DocRegistry();
78
- const result = registry.from(makeSource([rpcDoc]));
79
- expect(result).toBe(registry);
80
- });
81
- test('accepts RPC builder source', () => {
82
- const registry = new DocRegistry().from(makeSource([rpcDoc]));
83
- expect(registry.toJSON().routes).toEqual([rpcDoc]);
84
- });
85
- test('accepts API builder source', () => {
86
- const registry = new DocRegistry().from(makeSource([apiDoc]));
87
- expect(registry.toJSON().routes).toEqual([apiDoc]);
88
- });
89
- test('accepts Stream builder source', () => {
90
- const registry = new DocRegistry().from(makeSource([streamDoc]));
91
- expect(registry.toJSON().routes).toEqual([streamDoc]);
92
- });
93
- test('accepts plain { docs } object', () => {
94
- const plain = { docs: [rpcDoc, apiDoc] };
95
- const registry = new DocRegistry().from(plain);
96
- expect(registry.toJSON().routes).toHaveLength(2);
97
- });
98
- test('builder not yet built returns empty routes', () => {
99
- const emptySource = makeSource([]);
100
- const registry = new DocRegistry().from(emptySource);
101
- expect(registry.toJSON().routes).toEqual([]);
102
- });
103
- test('same builder twice duplicates routes', () => {
104
- const source = makeSource([rpcDoc]);
105
- const registry = new DocRegistry().from(source).from(source);
106
- expect(registry.toJSON().routes).toHaveLength(2);
107
- expect(registry.toJSON().routes[0]).toEqual(registry.toJSON().routes[1]);
108
- });
109
- test('reads docs lazily at toJSON() time', () => {
110
- const mutableDocs = [];
111
- const source = { get docs() { return mutableDocs; } };
112
- const registry = new DocRegistry().from(source);
113
- expect(registry.toJSON().routes).toHaveLength(0);
114
- mutableDocs.push(rpcDoc);
115
- expect(registry.toJSON().routes).toHaveLength(1);
116
- });
117
- });
118
- // --------------------------------------------------------------------------
119
- // toJSON()
120
- // --------------------------------------------------------------------------
121
- describe('toJSON()', () => {
122
- test('returns correct DocEnvelope shape', () => {
123
- const registry = new DocRegistry({ basePath: '/api' });
124
- const out = registry.toJSON();
125
- expect(out).toHaveProperty('basePath');
126
- expect(out).toHaveProperty('headers');
127
- expect(out).toHaveProperty('errors');
128
- expect(out).toHaveProperty('routes');
129
- });
130
- test('collects routes from all sources', () => {
131
- const registry = new DocRegistry()
132
- .from(makeSource([rpcDoc]))
133
- .from(makeSource([apiDoc]))
134
- .from(makeSource([streamDoc]));
135
- const out = registry.toJSON();
136
- expect(out.routes).toHaveLength(3);
137
- expect(out.routes).toEqual([rpcDoc, apiDoc, streamDoc]);
138
- });
139
- test('empty when no sources', () => {
140
- const out = new DocRegistry().toJSON();
141
- expect(out.routes).toEqual([]);
142
- });
143
- test('headers and errors are copies', () => {
144
- const headers = [{ name: 'X-Custom' }];
145
- const errors = [{ name: 'E', statusCode: 500, description: 'd' }];
146
- const registry = new DocRegistry({ headers, errors, includeDefaults: false });
147
- const out = registry.toJSON();
148
- expect(out.headers).toEqual(headers);
149
- expect(out.headers).not.toBe(headers);
150
- expect(out.errors).toEqual(errors);
151
- expect(out.errors).not.toBe(errors);
152
- });
153
- });
154
- // --------------------------------------------------------------------------
155
- // toJSON() filter
156
- // --------------------------------------------------------------------------
157
- describe('toJSON() filter', () => {
158
- test('excludes routes by name', () => {
159
- const registry = new DocRegistry()
160
- .from(makeSource([rpcDoc]))
161
- .from(makeSource([apiDoc]));
162
- const out = registry.toJSON({ filter: (r) => r.name !== 'Echo' });
163
- expect(out.routes).toHaveLength(1);
164
- expect(out.routes[0].name).toBe('GetUser');
165
- });
166
- test('excludes routes by type field', () => {
167
- const registry = new DocRegistry()
168
- .from(makeSource([rpcDoc]))
169
- .from(makeSource([apiDoc]));
170
- const out = registry.toJSON({
171
- filter: (r) => 'method' in r && r.method === 'post' && 'scope' in r,
172
- });
173
- expect(out.routes).toHaveLength(1);
174
- expect(out.routes[0].name).toBe('Echo');
175
- });
176
- test('all filtered returns empty routes array', () => {
177
- const registry = new DocRegistry().from(makeSource([rpcDoc]));
178
- const out = registry.toJSON({ filter: () => false });
179
- expect(out.routes).toEqual([]);
180
- });
181
- });
182
- // --------------------------------------------------------------------------
183
- // toJSON() transform
184
- // --------------------------------------------------------------------------
185
- describe('toJSON() transform', () => {
186
- test('adds fields', () => {
187
- const registry = new DocRegistry({ basePath: '/api' }).from(makeSource([rpcDoc]));
188
- const out = registry.toJSON({
189
- transform: (envelope) => ({ ...envelope, version: '2.0' }),
190
- });
191
- expect(out.version).toBe('2.0');
192
- expect(out.basePath).toBe('/api');
193
- });
194
- test('reshapes envelope', () => {
195
- const registry = new DocRegistry().from(makeSource([rpcDoc]));
196
- const out = registry.toJSON({
197
- transform: (envelope) => ({ count: envelope.routes.length }),
198
- });
199
- expect(out).toEqual({ count: 1 });
200
- });
201
- test('runs after filter', () => {
202
- const registry = new DocRegistry()
203
- .from(makeSource([rpcDoc]))
204
- .from(makeSource([apiDoc]));
205
- const out = registry.toJSON({
206
- filter: (r) => r.name === 'Echo',
207
- transform: (envelope) => ({ ...envelope, filteredCount: envelope.routes.length }),
208
- });
209
- expect(out.filteredCount).toBe(1);
210
- expect(out.routes).toHaveLength(1);
211
- });
212
- });
213
- // --------------------------------------------------------------------------
214
- // defaultErrors()
215
- // --------------------------------------------------------------------------
216
- describe('defaultErrors()', () => {
217
- test('returns 4 entries', () => {
218
- const errors = DocRegistry.defaultErrors();
219
- expect(errors).toHaveLength(4);
220
- });
221
- test('has correct error names', () => {
222
- const names = DocRegistry.defaultErrors().map((e) => e.name);
223
- // Runtime errors come from the taxonomy (topologically sorted —
224
- // subclasses first), followed by the doc-only registration error.
225
- expect(names).toEqual([
226
- 'ProcedureValidationError',
227
- 'ProcedureYieldValidationError',
228
- 'ProcedureError',
229
- 'ProcedureRegistrationError',
230
- ]);
231
- });
232
- test('has correct status codes', () => {
233
- const byName = Object.fromEntries(DocRegistry.defaultErrors().map((e) => [e.name, e.statusCode]));
234
- expect(byName.ProcedureError).toBe(500);
235
- expect(byName.ProcedureValidationError).toBe(400);
236
- expect(byName.ProcedureYieldValidationError).toBe(500);
237
- expect(byName.ProcedureRegistrationError).toBe(500);
238
- });
239
- test('each entry has schema', () => {
240
- for (const err of DocRegistry.defaultErrors()) {
241
- expect(err.schema).toBeDefined();
242
- expect(err.schema.type).toBe('object');
243
- }
244
- });
245
- test('returns a new array each call', () => {
246
- const a = DocRegistry.defaultErrors();
247
- const b = DocRegistry.defaultErrors();
248
- expect(a).not.toBe(b);
249
- expect(a).toEqual(b);
250
- });
251
- });
252
- // --------------------------------------------------------------------------
253
- // taxonomy input + auto-defaults + dedupe (v6.0.1 simplification)
254
- // --------------------------------------------------------------------------
255
- describe('errors: ErrorTaxonomy (polymorphic constructor input)', () => {
256
- test('accepts an ErrorTaxonomy directly and converts to ErrorDoc[]', () => {
257
- const taxonomy = defineErrorTaxonomy({
258
- AuthError: {
259
- class: class AuthError extends Error {
260
- },
261
- statusCode: 401,
262
- description: 'unauthenticated',
263
- },
264
- });
265
- const envelope = new DocRegistry({ errors: taxonomy }).toJSON();
266
- const auth = envelope.errors.find((e) => e.name === 'AuthError');
267
- expect(auth).toBeDefined();
268
- expect(auth?.statusCode).toBe(401);
269
- expect(auth?.description).toBe('unauthenticated');
270
- });
271
- test('auto-includes framework defaults when errors is a taxonomy', () => {
272
- const taxonomy = defineErrorTaxonomy({
273
- AuthError: { class: class AuthError extends Error {
274
- }, statusCode: 401 },
275
- });
276
- const names = new DocRegistry({ errors: taxonomy }).toJSON().errors.map((e) => e.name);
277
- expect(names).toContain('AuthError');
278
- expect(names).toContain('ProcedureValidationError');
279
- expect(names).toContain('ProcedureYieldValidationError');
280
- expect(names).toContain('ProcedureError');
281
- expect(names).toContain('ProcedureRegistrationError');
282
- });
283
- test('auto-includes framework defaults when errors is ErrorDoc[]', () => {
284
- const custom = { name: 'CustomThing', statusCode: 418, description: 'teapot' };
285
- const names = new DocRegistry({ errors: [custom] }).toJSON().errors.map((e) => e.name);
286
- expect(names).toContain('CustomThing');
287
- expect(names).toContain('ProcedureValidationError');
288
- });
289
- test('includeDefaults: false omits framework defaults', () => {
290
- const taxonomy = defineErrorTaxonomy({
291
- AuthError: { class: class AuthError extends Error {
292
- }, statusCode: 401 },
293
- });
294
- const names = new DocRegistry({ errors: taxonomy, includeDefaults: false })
295
- .toJSON()
296
- .errors.map((e) => e.name);
297
- expect(names).toEqual(['AuthError']);
298
- });
299
- test('user taxonomy entry with same name as default overrides default (dedupe, user wins)', () => {
300
- const taxonomy = defineErrorTaxonomy({
301
- ProcedureError: {
302
- class: Error,
303
- statusCode: 418,
304
- description: 'custom override',
305
- },
306
- });
307
- const envelope = new DocRegistry({ errors: taxonomy }).toJSON();
308
- const proc = envelope.errors.filter((e) => e.name === 'ProcedureError');
309
- expect(proc).toHaveLength(1);
310
- expect(proc[0].statusCode).toBe(418);
311
- expect(proc[0].description).toBe('custom override');
312
- });
313
- test('user ErrorDoc with same name as default overrides default (dedupe, user wins)', () => {
314
- const custom = {
315
- name: 'ProcedureError',
316
- statusCode: 418,
317
- description: 'custom override',
318
- };
319
- const envelope = new DocRegistry({ errors: [custom] }).toJSON();
320
- const proc = envelope.errors.filter((e) => e.name === 'ProcedureError');
321
- expect(proc).toHaveLength(1);
322
- expect(proc[0].statusCode).toBe(418);
323
- expect(proc[0].description).toBe('custom override');
324
- });
325
- test('empty errors config still returns framework defaults', () => {
326
- const names = new DocRegistry().toJSON().errors.map((e) => e.name);
327
- expect(names).toContain('ProcedureError');
328
- expect(names).toContain('ProcedureValidationError');
329
- expect(names).toContain('ProcedureYieldValidationError');
330
- expect(names).toContain('ProcedureRegistrationError');
331
- });
332
- test('includeDefaults: false with no errors produces empty error list', () => {
333
- const envelope = new DocRegistry({ includeDefaults: false }).toJSON();
334
- expect(envelope.errors).toEqual([]);
335
- });
336
- });
337
- // --------------------------------------------------------------------------
338
- // .documentError() fluent extension
339
- // --------------------------------------------------------------------------
340
- describe('.documentError()', () => {
341
- test('adds a single ErrorDoc to the envelope', () => {
342
- const registry = new DocRegistry({ includeDefaults: false }).documentError({
343
- name: 'RateLimitExceeded',
344
- statusCode: 429,
345
- description: 'too many requests',
346
- });
347
- const names = registry.toJSON().errors.map((e) => e.name);
348
- expect(names).toEqual(['RateLimitExceeded']);
349
- });
350
- test('accepts multiple docs via variadic args', () => {
351
- const registry = new DocRegistry({ includeDefaults: false }).documentError({ name: 'A', statusCode: 400, description: 'a' }, { name: 'B', statusCode: 500, description: 'b' });
352
- const names = registry.toJSON().errors.map((e) => e.name);
353
- expect(names).toEqual(['A', 'B']);
354
- });
355
- test('returns this for chaining', () => {
356
- const registry = new DocRegistry();
357
- const returned = registry.documentError({
358
- name: 'Foo',
359
- statusCode: 500,
360
- description: 'x',
361
- });
362
- expect(returned).toBe(registry);
363
- });
364
- test('composes with taxonomy input — extends docs without replacing', () => {
365
- const taxonomy = defineErrorTaxonomy({
366
- AuthError: { class: class AuthError extends Error {
367
- }, statusCode: 401 },
368
- });
369
- const envelope = new DocRegistry({ errors: taxonomy })
370
- .documentError({ name: 'RateLimitExceeded', statusCode: 429, description: 'x' })
371
- .toJSON();
372
- const names = envelope.errors.map((e) => e.name);
373
- expect(names).toContain('AuthError');
374
- expect(names).toContain('RateLimitExceeded');
375
- expect(names).toContain('ProcedureValidationError');
376
- });
377
- test('dedupes against existing errors (last write wins)', () => {
378
- const registry = new DocRegistry({ includeDefaults: false })
379
- .documentError({ name: 'Foo', statusCode: 400, description: 'first' })
380
- .documentError({ name: 'Foo', statusCode: 500, description: 'second' });
381
- const foo = registry.toJSON().errors.filter((e) => e.name === 'Foo');
382
- expect(foo).toHaveLength(1);
383
- expect(foo[0].statusCode).toBe(500);
384
- expect(foo[0].description).toBe('second');
385
- });
386
- });
387
- // --------------------------------------------------------------------------
388
- // kind discriminant
389
- // --------------------------------------------------------------------------
390
- describe('kind discriminant', () => {
391
- it('rpcDoc fixture requires kind field', () => {
392
- const doc = rpcDoc;
393
- expect(doc.kind).toBe('rpc');
394
- });
395
- it('apiDoc fixture requires kind field', () => {
396
- const doc = apiDoc;
397
- expect(doc.kind).toBe('api');
398
- });
399
- it('streamDoc fixture requires kind field', () => {
400
- const doc = streamDoc;
401
- expect(doc.kind).toBe('stream');
402
- });
403
- it('narrows AnyHttpRouteDoc union via kind', () => {
404
- const routes = [rpcDoc, apiDoc, streamDoc];
405
- for (const route of routes) {
406
- expect(route.kind).toBeDefined();
407
- }
408
- });
409
- });
410
- // --------------------------------------------------------------------------
411
- // Integration
412
- // --------------------------------------------------------------------------
413
- describe('integration', () => {
414
- test('multiple builder types composed', () => {
415
- const registry = new DocRegistry({
416
- basePath: '/api',
417
- headers: [{ name: 'Authorization', description: 'Bearer token', required: false }],
418
- })
419
- .from(makeSource([rpcDoc]))
420
- .from(makeSource([apiDoc]))
421
- .from(makeSource([streamDoc]));
422
- const out = registry.toJSON();
423
- expect(out.basePath).toBe('/api');
424
- expect(out.headers).toHaveLength(1);
425
- expect(out.errors).toHaveLength(4);
426
- expect(out.routes).toHaveLength(3);
427
- });
428
- test('filter + transform combined', () => {
429
- const registry = new DocRegistry({ basePath: '/api' })
430
- .from(makeSource([rpcDoc]))
431
- .from(makeSource([apiDoc]))
432
- .from(makeSource([streamDoc]));
433
- const out = registry.toJSON({
434
- filter: (r) => r.name !== 'Feed',
435
- transform: (envelope) => ({
436
- ...envelope,
437
- generatedAt: '2026-01-01',
438
- }),
439
- });
440
- expect(out.routes).toHaveLength(2);
441
- expect(out.routes.map((r) => r.name)).toEqual(['Echo', 'GetUser']);
442
- expect(out.generatedAt).toBe('2026-01-01');
443
- });
444
- test('output is JSON.stringify-safe', () => {
445
- const registry = new DocRegistry({
446
- basePath: '/api',
447
- headers: [{ name: 'X-Request-Id', example: 'abc-123' }],
448
- })
449
- .from(makeSource([rpcDoc]))
450
- .from(makeSource([apiDoc]));
451
- const out = registry.toJSON();
452
- const str = JSON.stringify(out);
453
- expect(() => JSON.parse(str)).not.toThrow();
454
- expect(JSON.parse(str)).toEqual(out);
455
- });
456
- test('JSON.stringify(registry) produces default envelope', () => {
457
- const registry = new DocRegistry({ basePath: '/api' })
458
- .from(makeSource([rpcDoc]));
459
- const str = JSON.stringify(registry);
460
- const parsed = JSON.parse(str);
461
- expect(parsed.basePath).toBe('/api');
462
- expect(parsed.routes).toHaveLength(1);
463
- expect(parsed.routes[0].name).toBe('Echo');
464
- });
465
- describe('coverage warnings via skippedProcedures', () => {
466
- afterEach(() => {
467
- vi.restoreAllMocks();
468
- delete process.env.TS_PROCEDURES_SUPPRESS_COVERAGE_WARNINGS;
469
- });
470
- test('warns when sources expose skippedProcedures entries', () => {
471
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
472
- const sourceWithSkipped = {
473
- docs: [rpcDoc],
474
- skippedProcedures: [
475
- { name: 'StreamProc', reason: 'wrong builder' },
476
- ],
477
- };
478
- new DocRegistry().from(sourceWithSkipped).toJSON();
479
- expect(warnSpy).toHaveBeenCalledOnce();
480
- const message = warnSpy.mock.calls[0][0];
481
- expect(message).toContain('1 procedure(s)');
482
- expect(message).toContain('StreamProc');
483
- expect(message).toContain('wrong builder');
484
- });
485
- test('does not warn when sources have no skippedProcedures', () => {
486
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
487
- new DocRegistry().from(makeSource([rpcDoc])).toJSON();
488
- expect(warnSpy).not.toHaveBeenCalled();
489
- });
490
- test('TS_PROCEDURES_SUPPRESS_COVERAGE_WARNINGS=1 silences the warning', () => {
491
- process.env.TS_PROCEDURES_SUPPRESS_COVERAGE_WARNINGS = '1';
492
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
493
- const source = {
494
- docs: [rpcDoc],
495
- skippedProcedures: [{ name: 'X', reason: 'y' }],
496
- };
497
- new DocRegistry().from(source).toJSON();
498
- expect(warnSpy).not.toHaveBeenCalled();
499
- });
500
- });
501
- test('accepts a real HonoRPCAppBuilder as source', () => {
502
- const RPC = Procedures();
503
- RPC.Create('Ping', { scope: 'ping', version: 1, schema: { params: v.object({ msg: v.string() }) } }, async (_ctx, params) => params);
504
- const builder = new HonoRPCAppBuilder();
505
- builder.register(RPC, () => ({ userId: '123' }));
506
- builder.build();
507
- const registry = new DocRegistry({ basePath: '/rpc' }).from(builder);
508
- const out = registry.toJSON();
509
- expect(out.basePath).toBe('/rpc');
510
- expect(out.routes).toHaveLength(1);
511
- expect(out.routes[0].name).toBe('Ping');
512
- expect(out.routes[0]).toHaveProperty('jsonSchema');
513
- });
514
- });
515
- });
516
- //# sourceMappingURL=doc-registry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doc-registry.test.js","sourceRoot":"","sources":["../../../src/implementations/http/doc-registry.test.ts"],"names":[],"mappings":"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"}