ts-procedures 1.1.1 → 2.0.1

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 (33) hide show
  1. package/README.md +31 -4
  2. package/build/implementations/http/express/index.d.ts +2 -1
  3. package/build/implementations/http/express/index.js.map +1 -1
  4. package/build/implementations/http/express/types.d.ts +17 -0
  5. package/build/implementations/http/express/types.js +2 -0
  6. package/build/implementations/http/express/types.js.map +1 -0
  7. package/build/implementations/http/express-rpc/index.d.ts +82 -0
  8. package/build/implementations/http/express-rpc/index.js +140 -0
  9. package/build/implementations/http/express-rpc/index.js.map +1 -0
  10. package/build/implementations/http/express-rpc/index.test.d.ts +1 -0
  11. package/build/implementations/http/express-rpc/index.test.js +445 -0
  12. package/build/implementations/http/express-rpc/index.test.js.map +1 -0
  13. package/build/implementations/http/express-rpc/types.d.ts +28 -0
  14. package/build/implementations/http/express-rpc/types.js +2 -0
  15. package/build/implementations/http/express-rpc/types.js.map +1 -0
  16. package/build/implementations/types.d.ts +17 -0
  17. package/build/implementations/types.js +2 -0
  18. package/build/implementations/types.js.map +1 -0
  19. package/package.json +13 -8
  20. package/src/implementations/http/express-rpc/README.md +321 -0
  21. package/src/implementations/http/express-rpc/index.test.ts +614 -0
  22. package/src/implementations/http/express-rpc/index.ts +180 -0
  23. package/src/implementations/http/express-rpc/types.ts +29 -0
  24. package/src/implementations/types.ts +20 -0
  25. package/src/implementations/http/client/index.ts +0 -0
  26. package/src/implementations/http/express/README.md +0 -351
  27. package/src/implementations/http/express/example/factories.ts +0 -25
  28. package/src/implementations/http/express/example/procedures/auth.ts +0 -24
  29. package/src/implementations/http/express/example/procedures/users.ts +0 -32
  30. package/src/implementations/http/express/example/server.test.ts +0 -133
  31. package/src/implementations/http/express/example/server.ts +0 -67
  32. package/src/implementations/http/express/index.test.ts +0 -526
  33. package/src/implementations/http/express/index.ts +0 -108
@@ -0,0 +1,445 @@
1
+ import { describe, expect, test, vi, beforeEach } from 'vitest';
2
+ import request from 'supertest';
3
+ import express from 'express';
4
+ import { v } from 'suretype';
5
+ import { Procedures } from '../../../index.js';
6
+ import { ExpressRPCAppBuilder } from './index.js';
7
+ /**
8
+ * ExpressRPCAppBuilder Test Suite
9
+ *
10
+ * Tests the RPC-style Express integration for ts-procedures.
11
+ * This builder creates POST routes at `/rpc/{name}/{version}` paths.
12
+ */
13
+ describe('ExpressRPCAppBuilder', () => {
14
+ // --------------------------------------------------------------------------
15
+ // Constructor Tests
16
+ // --------------------------------------------------------------------------
17
+ describe('constructor', () => {
18
+ test('creates default Express app with json middleware', async () => {
19
+ const builder = new ExpressRPCAppBuilder();
20
+ const RPC = Procedures();
21
+ RPC.Create('Echo', { name: 'echo', version: 1, schema: { params: v.object({ message: v.string() }) } }, async (ctx, params) => params);
22
+ builder.register(RPC, () => ({ userId: '123' }));
23
+ const app = builder.build();
24
+ // JSON body should be parsed automatically
25
+ const res = await request(app).post('/rpc/echo/1').send({ message: 'hello' });
26
+ expect(res.status).toBe(200);
27
+ expect(res.body).toEqual({ message: 'hello' });
28
+ });
29
+ test('uses provided Express app without adding middleware', async () => {
30
+ const customApp = express();
31
+ // Intentionally NOT adding json middleware
32
+ const builder = new ExpressRPCAppBuilder({ app: customApp });
33
+ const RPC = Procedures();
34
+ RPC.Create('Echo', { name: 'echo', version: 1, schema: { params: v.object({ message: v.string() }) } }, async (ctx, params) => ({ received: params }));
35
+ builder.register(RPC, () => ({ userId: '123' }));
36
+ const app = builder.build();
37
+ // Without json middleware, body won't be parsed (req.body is undefined)
38
+ const res = await request(app)
39
+ .post('/rpc/echo/1')
40
+ .set('Content-Type', 'application/json')
41
+ .send(JSON.stringify({ message: 'hello' }));
42
+ // Request body is undefined since json middleware wasn't added
43
+ // Handler receives undefined params
44
+ expect(res.body.received).toBeUndefined();
45
+ });
46
+ test('handles empty config', () => {
47
+ const builder = new ExpressRPCAppBuilder({});
48
+ expect(builder.app).toBeDefined();
49
+ expect(builder.docs).toEqual([]);
50
+ });
51
+ test('handles undefined config', () => {
52
+ const builder = new ExpressRPCAppBuilder(undefined);
53
+ expect(builder.app).toBeDefined();
54
+ expect(builder.docs).toEqual([]);
55
+ });
56
+ });
57
+ // --------------------------------------------------------------------------
58
+ // Lifecycle Hooks Tests
59
+ // --------------------------------------------------------------------------
60
+ describe('lifecycle hooks', () => {
61
+ test('onRequestStart is called with request object', async () => {
62
+ const onRequestStart = vi.fn();
63
+ const builder = new ExpressRPCAppBuilder({ onRequestStart });
64
+ const RPC = Procedures();
65
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => ({ ok: true }));
66
+ builder.register(RPC, () => ({}));
67
+ const app = builder.build();
68
+ await request(app).post('/rpc/test/1').send({});
69
+ expect(onRequestStart).toHaveBeenCalledTimes(1);
70
+ expect(onRequestStart.mock.calls[0][0]).toHaveProperty('method', 'POST');
71
+ expect(onRequestStart.mock.calls[0][0]).toHaveProperty('path', '/rpc/test/1');
72
+ });
73
+ test('onRequestEnd is called after response finishes', async () => {
74
+ const onRequestEnd = vi.fn();
75
+ const builder = new ExpressRPCAppBuilder({ onRequestEnd });
76
+ const RPC = Procedures();
77
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => ({ ok: true }));
78
+ builder.register(RPC, () => ({}));
79
+ const app = builder.build();
80
+ await request(app).post('/rpc/test/1').send({});
81
+ expect(onRequestEnd).toHaveBeenCalledTimes(1);
82
+ expect(onRequestEnd.mock.calls[0][0]).toHaveProperty('method', 'POST');
83
+ expect(onRequestEnd.mock.calls[0][1]).toHaveProperty('statusCode', 200);
84
+ });
85
+ test('onSuccess is called on successful procedure execution', async () => {
86
+ const onSuccess = vi.fn();
87
+ const builder = new ExpressRPCAppBuilder({ onSuccess });
88
+ const RPC = Procedures();
89
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => ({ ok: true }));
90
+ builder.register(RPC, () => ({}));
91
+ const app = builder.build();
92
+ await request(app).post('/rpc/test/1').send({});
93
+ expect(onSuccess).toHaveBeenCalledTimes(1);
94
+ expect(onSuccess.mock.calls[0][0]).toHaveProperty('name', 'Test');
95
+ });
96
+ test('onSuccess is NOT called when procedure throws', async () => {
97
+ const onSuccess = vi.fn();
98
+ const builder = new ExpressRPCAppBuilder({ onSuccess });
99
+ const RPC = Procedures();
100
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => {
101
+ throw new Error('Handler error');
102
+ });
103
+ builder.register(RPC, () => ({}));
104
+ const app = builder.build();
105
+ await request(app).post('/rpc/test/1').send({});
106
+ expect(onSuccess).not.toHaveBeenCalled();
107
+ });
108
+ test('hooks execute in correct order: start → handler → success → end', async () => {
109
+ const order = [];
110
+ const builder = new ExpressRPCAppBuilder({
111
+ onRequestStart: () => order.push('start'),
112
+ onRequestEnd: () => order.push('end'),
113
+ onSuccess: () => order.push('success'),
114
+ });
115
+ const RPC = Procedures();
116
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => {
117
+ order.push('handler');
118
+ return { ok: true };
119
+ });
120
+ builder.register(RPC, () => ({}));
121
+ const app = builder.build();
122
+ await request(app).post('/rpc/test/1').send({});
123
+ expect(order).toEqual(['start', 'handler', 'success', 'end']);
124
+ });
125
+ });
126
+ // --------------------------------------------------------------------------
127
+ // Error Handling Tests
128
+ // --------------------------------------------------------------------------
129
+ describe('error handling', () => {
130
+ test('custom error handler receives procedure, req, res, and error', async () => {
131
+ const errorHandler = vi.fn((procedure, req, res, error) => {
132
+ res.status(400).json({ customError: error.message });
133
+ });
134
+ const builder = new ExpressRPCAppBuilder({ error: errorHandler });
135
+ const RPC = Procedures();
136
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => {
137
+ throw new Error('Test error');
138
+ });
139
+ builder.register(RPC, () => ({}));
140
+ const app = builder.build();
141
+ const res = await request(app).post('/rpc/test/1').send({});
142
+ expect(errorHandler).toHaveBeenCalledTimes(1);
143
+ expect(errorHandler.mock.calls[0][0]).toHaveProperty('name', 'Test');
144
+ expect(errorHandler.mock.calls[0][3]).toBeInstanceOf(Error);
145
+ expect(res.status).toBe(400);
146
+ // Error is wrapped by Procedures with "Error in handler for {name}" prefix
147
+ expect(res.body.customError).toContain('Test error');
148
+ });
149
+ test('default error handling returns error message in response', async () => {
150
+ const builder = new ExpressRPCAppBuilder();
151
+ const RPC = Procedures();
152
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => {
153
+ throw new Error('Something went wrong');
154
+ });
155
+ builder.register(RPC, () => ({}));
156
+ const app = builder.build();
157
+ const res = await request(app).post('/rpc/test/1').send({});
158
+ // Default error handler returns error message in JSON body
159
+ expect(res.body).toHaveProperty('error');
160
+ expect(res.body.error).toContain('Something went wrong');
161
+ });
162
+ test('catches unhandled exceptions in handler', async () => {
163
+ const builder = new ExpressRPCAppBuilder();
164
+ const RPC = Procedures();
165
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => {
166
+ // Simulate unhandled exception
167
+ const obj = null;
168
+ return obj.property; // This will throw
169
+ });
170
+ builder.register(RPC, () => ({}));
171
+ const app = builder.build();
172
+ const res = await request(app).post('/rpc/test/1').send({});
173
+ // Unhandled exceptions are caught and returned as error response
174
+ expect(res.body).toHaveProperty('error');
175
+ });
176
+ });
177
+ // --------------------------------------------------------------------------
178
+ // register() Method Tests
179
+ // --------------------------------------------------------------------------
180
+ describe('register() method', () => {
181
+ test('returns this for method chaining', () => {
182
+ const builder = new ExpressRPCAppBuilder();
183
+ const RPC1 = Procedures();
184
+ const RPC2 = Procedures();
185
+ const result = builder.register(RPC1, () => ({}));
186
+ expect(result).toBe(builder);
187
+ // Chain multiple registrations
188
+ const chainResult = builder.register(RPC1, () => ({})).register(RPC2, () => ({}));
189
+ expect(chainResult).toBe(builder);
190
+ });
191
+ test('supports registering multiple factories', async () => {
192
+ const builder = new ExpressRPCAppBuilder();
193
+ const PublicRPC = Procedures();
194
+ const PrivateRPC = Procedures();
195
+ PublicRPC.Create('PublicMethod', { name: 'public', version: 1 }, async (ctx) => ({
196
+ isPublic: ctx.public,
197
+ }));
198
+ PrivateRPC.Create('PrivateMethod', { name: 'private', version: 1 }, async (ctx) => ({
199
+ isPrivate: ctx.private,
200
+ }));
201
+ builder
202
+ .register(PublicRPC, () => ({ public: true }))
203
+ .register(PrivateRPC, () => ({ private: true }));
204
+ const app = builder.build();
205
+ const publicRes = await request(app).post('/rpc/public/1').send({});
206
+ const privateRes = await request(app).post('/rpc/private/1').send({});
207
+ expect(publicRes.body).toEqual({ isPublic: true });
208
+ expect(privateRes.body).toEqual({ isPrivate: true });
209
+ });
210
+ test('context resolver receives Express request object', async () => {
211
+ const contextResolver = vi.fn((req) => ({
212
+ authHeader: req.headers.authorization,
213
+ }));
214
+ const builder = new ExpressRPCAppBuilder();
215
+ const RPC = Procedures();
216
+ RPC.Create('GetAuth', { name: 'get-auth', version: 1 }, async (ctx) => ({
217
+ auth: ctx.authHeader,
218
+ }));
219
+ builder.register(RPC, contextResolver);
220
+ const app = builder.build();
221
+ await request(app).post('/rpc/get-auth/1').set('Authorization', 'Bearer token123').send({});
222
+ expect(contextResolver).toHaveBeenCalledTimes(1);
223
+ expect(contextResolver.mock.calls[0][0]).toHaveProperty('headers');
224
+ expect(contextResolver.mock.calls[0][0].headers).toHaveProperty('authorization', 'Bearer token123');
225
+ });
226
+ });
227
+ // --------------------------------------------------------------------------
228
+ // build() Method Tests
229
+ // --------------------------------------------------------------------------
230
+ describe('build() method', () => {
231
+ test('creates POST routes for all procedures', async () => {
232
+ const builder = new ExpressRPCAppBuilder();
233
+ const RPC = Procedures();
234
+ RPC.Create('MethodOne', { name: 'method-one', version: 1 }, async () => ({ m: 1 }));
235
+ RPC.Create('MethodTwo', { name: 'method-two', version: 2 }, async () => ({ m: 2 }));
236
+ builder.register(RPC, () => ({}));
237
+ const app = builder.build();
238
+ const res1 = await request(app).post('/rpc/method-one/1').send({});
239
+ const res2 = await request(app).post('/rpc/method-two/2').send({});
240
+ expect(res1.status).toBe(200);
241
+ expect(res2.status).toBe(200);
242
+ expect(res1.body).toEqual({ m: 1 });
243
+ expect(res2.body).toEqual({ m: 2 });
244
+ });
245
+ test('returns the Express application', () => {
246
+ const builder = new ExpressRPCAppBuilder();
247
+ const app = builder.build();
248
+ expect(app).toBe(builder.app);
249
+ expect(typeof app.listen).toBe('function');
250
+ });
251
+ test('populates docs array after build', () => {
252
+ const builder = new ExpressRPCAppBuilder();
253
+ const RPC = Procedures();
254
+ RPC.Create('MethodOne', { name: 'method-one', version: 1 }, async () => ({}));
255
+ RPC.Create('MethodTwo', { name: ['nested', 'method'], version: 2 }, async () => ({}));
256
+ expect(builder.docs).toHaveLength(0);
257
+ builder.register(RPC, () => ({}));
258
+ builder.build();
259
+ expect(builder.docs).toHaveLength(2);
260
+ expect(builder.docs[0].path).toBe('/rpc/method-one/1');
261
+ expect(builder.docs[1].path).toBe('/rpc/nested/method/2');
262
+ });
263
+ test('passes request body to handler as params', async () => {
264
+ const builder = new ExpressRPCAppBuilder();
265
+ const RPC = Procedures();
266
+ RPC.Create('Echo', { name: 'echo', version: 1, schema: { params: v.object({ data: v.string() }) } }, async (ctx, params) => ({ received: params.data }));
267
+ builder.register(RPC, () => ({}));
268
+ const app = builder.build();
269
+ const res = await request(app).post('/rpc/echo/1').send({ data: 'test-data' });
270
+ expect(res.body).toEqual({ received: 'test-data' });
271
+ });
272
+ test('GET requests return 404 (RPC uses POST only)', async () => {
273
+ const builder = new ExpressRPCAppBuilder();
274
+ const RPC = Procedures();
275
+ RPC.Create('Test', { name: 'test', version: 1 }, async () => ({ ok: true }));
276
+ builder.register(RPC, () => ({}));
277
+ const app = builder.build();
278
+ const res = await request(app).get('/rpc/test/1');
279
+ expect(res.status).toBe(404);
280
+ });
281
+ });
282
+ // --------------------------------------------------------------------------
283
+ // Path Generation Tests (makeRPCHttpRoutePath)
284
+ // --------------------------------------------------------------------------
285
+ describe('makeRPCHttpRoutePath', () => {
286
+ let builder;
287
+ beforeEach(() => {
288
+ builder = new ExpressRPCAppBuilder();
289
+ });
290
+ test("simple string: 'users' → /rpc/users/1", () => {
291
+ const path = builder.makeRPCHttpRoutePath({ name: 'users', version: 1 });
292
+ expect(path).toBe('/rpc/users/1');
293
+ });
294
+ test("array name: ['users', 'get-by-id'] → /rpc/users/get-by-id/1", () => {
295
+ const path = builder.makeRPCHttpRoutePath({ name: ['users', 'get-by-id'], version: 1 });
296
+ expect(path).toBe('/rpc/users/get-by-id/1');
297
+ });
298
+ test("camelCase: 'getUserById' → /rpc/get-user-by-id/1", () => {
299
+ const path = builder.makeRPCHttpRoutePath({ name: 'getUserById', version: 1 });
300
+ expect(path).toBe('/rpc/get-user-by-id/1');
301
+ });
302
+ test("PascalCase: 'GetUserById' → /rpc/get-user-by-id/1", () => {
303
+ const path = builder.makeRPCHttpRoutePath({ name: 'GetUserById', version: 1 });
304
+ expect(path).toBe('/rpc/get-user-by-id/1');
305
+ });
306
+ test('version number included in path', () => {
307
+ const pathV1 = builder.makeRPCHttpRoutePath({ name: 'test', version: 1 });
308
+ const pathV2 = builder.makeRPCHttpRoutePath({ name: 'test', version: 2 });
309
+ const pathV99 = builder.makeRPCHttpRoutePath({ name: 'test', version: 99 });
310
+ expect(pathV1).toBe('/rpc/test/1');
311
+ expect(pathV2).toBe('/rpc/test/2');
312
+ expect(pathV99).toBe('/rpc/test/99');
313
+ });
314
+ test('handles mixed case in array segments', () => {
315
+ const path = builder.makeRPCHttpRoutePath({
316
+ name: ['UserModule', 'getActiveUsers'],
317
+ version: 1,
318
+ });
319
+ expect(path).toBe('/rpc/user-module/get-active-users/1');
320
+ });
321
+ });
322
+ // --------------------------------------------------------------------------
323
+ // Route Documentation Tests (buildRpcHttpRouteDoc)
324
+ // --------------------------------------------------------------------------
325
+ describe('buildRpcHttpRouteDoc', () => {
326
+ let builder;
327
+ beforeEach(() => {
328
+ builder = new ExpressRPCAppBuilder();
329
+ });
330
+ test('generates complete route documentation', () => {
331
+ const paramsSchema = v.object({ id: v.string() });
332
+ const returnSchema = v.object({ name: v.string() });
333
+ const RPC = Procedures();
334
+ const { info } = RPC.Create('GetUser', { name: 'users', version: 1, schema: { params: paramsSchema, returnType: returnSchema } }, async () => ({ name: 'test' }));
335
+ const procedure = RPC.getProcedures()[0];
336
+ const doc = builder.buildRpcHttpRouteDoc(procedure);
337
+ expect(doc.path).toBe('/rpc/users/1');
338
+ expect(doc.method).toBe('post');
339
+ expect(doc.jsonSchema.body).toBeDefined();
340
+ expect(doc.jsonSchema.response).toBeDefined();
341
+ });
342
+ test('omits body schema when no params defined', () => {
343
+ const RPC = Procedures();
344
+ RPC.Create('NoParams', { name: 'no-params', version: 1 }, async () => ({ ok: true }));
345
+ const procedure = RPC.getProcedures()[0];
346
+ const doc = builder.buildRpcHttpRouteDoc(procedure);
347
+ expect(doc.jsonSchema.body).toBeUndefined();
348
+ });
349
+ test('omits response schema when no returnType defined', () => {
350
+ const RPC = Procedures();
351
+ RPC.Create('NoReturn', { name: 'no-return', version: 1, schema: { params: v.object({ x: v.number() }) } }, async () => ({}));
352
+ const procedure = RPC.getProcedures()[0];
353
+ const doc = builder.buildRpcHttpRouteDoc(procedure);
354
+ expect(doc.jsonSchema.body).toBeDefined();
355
+ expect(doc.jsonSchema.response).toBeUndefined();
356
+ });
357
+ test("method is always 'post'", () => {
358
+ const RPC = Procedures();
359
+ RPC.Create('Test1', { name: 't1', version: 1 }, async () => ({}));
360
+ RPC.Create('Test2', { name: 't2', version: 2 }, async () => ({}));
361
+ const procedures = RPC.getProcedures();
362
+ procedures.forEach((proc) => {
363
+ const doc = builder.buildRpcHttpRouteDoc(proc);
364
+ expect(doc.method).toBe('post');
365
+ });
366
+ });
367
+ });
368
+ // --------------------------------------------------------------------------
369
+ // Integration Test
370
+ // --------------------------------------------------------------------------
371
+ describe('integration', () => {
372
+ test('full workflow with multiple procedure factories and different contexts', async () => {
373
+ // Create factories
374
+ const PublicRPC = Procedures();
375
+ const AuthRPC = Procedures();
376
+ // Create public procedures
377
+ PublicRPC.Create('GetVersion', { name: ['system', 'version'], version: 1 }, async () => ({
378
+ version: '1.0.0',
379
+ }));
380
+ PublicRPC.Create('HealthCheck', { name: 'health', version: 1 }, async () => ({
381
+ status: 'ok',
382
+ }));
383
+ // Create authenticated procedures
384
+ AuthRPC.Create('GetProfile', {
385
+ name: ['users', 'profile'],
386
+ version: 1,
387
+ schema: { returnType: v.object({ userId: v.string(), source: v.string() }) },
388
+ }, async (ctx) => ({ userId: ctx.userId, source: ctx.source }));
389
+ AuthRPC.Create('UpdateProfile', {
390
+ name: ['users', 'profile'],
391
+ version: 2,
392
+ schema: { params: v.object({ name: v.string() }) },
393
+ }, async (ctx, params) => ({ userId: ctx.userId, name: params.name }));
394
+ // Build app with lifecycle hooks
395
+ const events = [];
396
+ const builder = new ExpressRPCAppBuilder({
397
+ onRequestStart: () => events.push('request-start'),
398
+ onRequestEnd: () => events.push('request-end'),
399
+ onSuccess: (proc) => events.push(`success:${proc.name}`),
400
+ });
401
+ builder
402
+ .register(PublicRPC, () => ({ source: 'public' }))
403
+ .register(AuthRPC, (req) => ({
404
+ source: 'auth',
405
+ userId: req.headers['x-user-id'] || 'anonymous',
406
+ }));
407
+ const app = builder.build();
408
+ // Test public endpoints
409
+ const versionRes = await request(app).post('/rpc/system/version/1').send({});
410
+ expect(versionRes.status).toBe(200);
411
+ expect(versionRes.body).toEqual({ version: '1.0.0' });
412
+ const healthRes = await request(app).post('/rpc/health/1').send({});
413
+ expect(healthRes.status).toBe(200);
414
+ expect(healthRes.body).toEqual({ status: 'ok' });
415
+ // Test authenticated endpoints
416
+ const profileRes = await request(app)
417
+ .post('/rpc/users/profile/1')
418
+ .set('X-User-Id', 'user-123')
419
+ .send({});
420
+ expect(profileRes.status).toBe(200);
421
+ expect(profileRes.body).toEqual({ userId: 'user-123', source: 'auth' });
422
+ const updateRes = await request(app)
423
+ .post('/rpc/users/profile/2')
424
+ .set('X-User-Id', 'user-456')
425
+ .send({ name: 'John Doe' });
426
+ expect(updateRes.status).toBe(200);
427
+ expect(updateRes.body).toEqual({ userId: 'user-456', name: 'John Doe' });
428
+ // Verify documentation
429
+ expect(builder.docs).toHaveLength(4);
430
+ const paths = builder.docs.map((d) => d.path);
431
+ expect(paths).toContain('/rpc/system/version/1');
432
+ expect(paths).toContain('/rpc/health/1');
433
+ expect(paths).toContain('/rpc/users/profile/1');
434
+ expect(paths).toContain('/rpc/users/profile/2');
435
+ // Verify hooks were called
436
+ expect(events).toContain('request-start');
437
+ expect(events).toContain('success:GetVersion');
438
+ expect(events).toContain('success:HealthCheck');
439
+ expect(events).toContain('success:GetProfile');
440
+ expect(events).toContain('success:UpdateProfile');
441
+ expect(events).toContain('request-end');
442
+ });
443
+ });
444
+ });
445
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/implementations/http/express-rpc/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { RPCConfig } from '../../types.js';
2
+ import { Procedures } from '../../../index.js';
3
+ import express from 'express';
4
+ /**
5
+ * Extracts the TContext type from a Procedures factory return type.
6
+ * Uses the first parameter of the handler function to infer the context type.
7
+ */
8
+ export type ExtractContext<TFactory> = TFactory extends {
9
+ getProcedures: () => Array<{
10
+ handler: (ctx: infer TContext, ...args: any[]) => any;
11
+ }>;
12
+ } ? TContext : never;
13
+ /**
14
+ * Minimal structural type for a Procedures factory.
15
+ * Uses explicit `any` types to avoid variance issues with generic constraints.
16
+ */
17
+ export type ProceduresFactory = {
18
+ getProcedures: () => Array<{
19
+ name: string;
20
+ config: any;
21
+ handler: (ctx: any, params?: any) => Promise<any>;
22
+ }>;
23
+ Create: (...args: any[]) => any;
24
+ };
25
+ export type ExpressFactoryItem<TFactory = ReturnType<typeof Procedures<any, RPCConfig>>> = {
26
+ factory: TFactory;
27
+ contextResolver: (req: express.Request) => ExtractContext<TFactory>;
28
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/implementations/http/express-rpc/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { Procedures } from '../index.js';
2
+ export interface RPCConfig {
3
+ name: string | string[];
4
+ version: number;
5
+ }
6
+ export type FactoryItem<C> = {
7
+ factory: ReturnType<typeof Procedures<C, RPCConfig>>;
8
+ contextResolver: (req: Request) => C;
9
+ };
10
+ export interface RPCHttpRouteDoc {
11
+ path: string;
12
+ method: 'post';
13
+ jsonSchema: {
14
+ body?: object;
15
+ response?: object;
16
+ };
17
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/implementations/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,27 +1,31 @@
1
1
  {
2
2
  "name": "ts-procedures",
3
- "version": "1.1.1",
3
+ "version": "2.0.1",
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",
7
7
  "type": "module",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "lint": "npx eslint src/ --quiet",
11
+ "prepublishOnly": "npm run lint && npm run build",
12
+ "test": "vitest run"
13
+ },
8
14
  "exports": {
15
+ "./package.json": "./package.json",
9
16
  ".": {
10
17
  "types": "./build/exports.d.ts",
11
18
  "import": "./build/exports.js"
12
19
  },
13
- "./package.json": "./package.json",
14
20
  "./express": {
15
21
  "types": "./build/implementations/http/express/index.d.ts",
16
22
  "import": "./build/implementations/http/express/index.js"
23
+ },
24
+ "./express-rpc": {
25
+ "types": "./build/implementations/http/express-rpc/index.d.ts",
26
+ "import": "./build/implementations/http/express-rpc/index.js"
17
27
  }
18
28
  },
19
- "scripts": {
20
- "build": "tsc",
21
- "lint": "npx eslint src/ --quiet",
22
- "prepublishOnly": "npm run lint && npm run build",
23
- "test": "vitest run"
24
- },
25
29
  "author": "coryrobinson42@gmail.com",
26
30
  "license": "MIT",
27
31
  "files": [
@@ -44,6 +48,7 @@
44
48
  "dependencies": {
45
49
  "ajv": "^8.17.1",
46
50
  "ajv-formats": "^3.0.1",
51
+ "es-toolkit": "^1.44.0",
47
52
  "suretype": "^3.3.1",
48
53
  "typebox": "^1.0.30"
49
54
  },