ts-procedures 9.2.0 → 10.1.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 (161) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/build/adapters/hono/envelope-parity.test.js +17 -6
  3. package/build/adapters/hono/envelope-parity.test.js.map +1 -1
  4. package/build/codegen/bin/cli.js +1 -1
  5. package/build/codegen/bin/cli.js.map +1 -1
  6. package/build/codegen/constants.js +2 -2
  7. package/build/codegen/constants.js.map +1 -1
  8. package/build/codegen/emit/api-route.js +1 -1
  9. package/build/codegen/emit/api-route.js.map +1 -1
  10. package/build/codegen/emit/scope-file.js +1 -1
  11. package/build/codegen/emit/scope-file.js.map +1 -1
  12. package/build/codegen/emit-errors.integration.test.js +2 -2
  13. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  14. package/build/codegen/resolve-envelope.js +1 -1
  15. package/build/codegen/resolve-envelope.js.map +1 -1
  16. package/build/codegen/test-helpers/run-tsc.js +1 -1
  17. package/build/codegen/test-helpers/run-tsc.js.map +1 -1
  18. package/build/exports.d.ts +1 -0
  19. package/build/exports.js +4 -0
  20. package/build/exports.js.map +1 -1
  21. package/build/server/doc-registry.js +3 -0
  22. package/build/server/doc-registry.js.map +1 -1
  23. package/build/server/doc-registry.test.js +31 -0
  24. package/build/server/doc-registry.test.js.map +1 -1
  25. package/build/server/index.d.ts +1 -0
  26. package/build/server/index.js +1 -0
  27. package/build/server/index.js.map +1 -1
  28. package/build/server/spec-version.d.ts +24 -0
  29. package/build/server/spec-version.js +26 -0
  30. package/build/server/spec-version.js.map +1 -0
  31. package/build/server/types.d.ts +15 -0
  32. package/build/version.d.ts +9 -0
  33. package/build/version.js +11 -0
  34. package/build/version.js.map +1 -0
  35. package/docs/doc-envelope-spec.md +291 -0
  36. package/docs/doc-envelope.schema.json +253 -0
  37. package/docs/http-integrations.md +27 -1
  38. package/package.json +8 -8
  39. package/src/adapters/hono/envelope-parity.test.ts +18 -6
  40. package/src/codegen/bin/cli.ts +1 -1
  41. package/src/codegen/constants.ts +2 -2
  42. package/src/codegen/emit/api-route.ts +1 -1
  43. package/src/codegen/emit/scope-file.ts +2 -1
  44. package/src/codegen/emit-errors.integration.test.ts +2 -2
  45. package/src/codegen/resolve-envelope.ts +1 -1
  46. package/src/codegen/test-helpers/run-tsc.ts +1 -0
  47. package/src/exports.ts +4 -0
  48. package/src/server/doc-registry.test.ts +34 -0
  49. package/src/server/doc-registry.ts +3 -0
  50. package/src/server/index.ts +1 -0
  51. package/src/server/spec-version.ts +27 -0
  52. package/src/server/types.ts +15 -0
  53. package/src/version.ts +11 -0
  54. package/build/errors.d.ts +0 -33
  55. package/build/errors.js +0 -91
  56. package/build/errors.js.map +0 -1
  57. package/build/errors.test.d.ts +0 -1
  58. package/build/errors.test.js +0 -122
  59. package/build/errors.test.js.map +0 -1
  60. package/build/implementations/http/doc-registry.d.ts +0 -28
  61. package/build/implementations/http/doc-registry.js +0 -96
  62. package/build/implementations/http/doc-registry.js.map +0 -1
  63. package/build/implementations/http/doc-registry.test.d.ts +0 -1
  64. package/build/implementations/http/doc-registry.test.js +0 -516
  65. package/build/implementations/http/doc-registry.test.js.map +0 -1
  66. package/build/implementations/http/error-taxonomy.d.ts +0 -249
  67. package/build/implementations/http/error-taxonomy.js +0 -252
  68. package/build/implementations/http/error-taxonomy.js.map +0 -1
  69. package/build/implementations/http/error-taxonomy.test.d.ts +0 -1
  70. package/build/implementations/http/error-taxonomy.test.js +0 -399
  71. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  72. package/build/implementations/http/express-rpc/error-taxonomy.test.d.ts +0 -1
  73. package/build/implementations/http/express-rpc/error-taxonomy.test.js +0 -83
  74. package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +0 -1
  75. package/build/implementations/http/express-rpc/index.d.ts +0 -125
  76. package/build/implementations/http/express-rpc/index.js +0 -216
  77. package/build/implementations/http/express-rpc/index.js.map +0 -1
  78. package/build/implementations/http/express-rpc/index.test.d.ts +0 -1
  79. package/build/implementations/http/express-rpc/index.test.js +0 -684
  80. package/build/implementations/http/express-rpc/index.test.js.map +0 -1
  81. package/build/implementations/http/express-rpc/types.d.ts +0 -11
  82. package/build/implementations/http/express-rpc/types.js +0 -2
  83. package/build/implementations/http/express-rpc/types.js.map +0 -1
  84. package/build/implementations/http/hono-api/error-taxonomy.test.d.ts +0 -1
  85. package/build/implementations/http/hono-api/error-taxonomy.test.js +0 -137
  86. package/build/implementations/http/hono-api/error-taxonomy.test.js.map +0 -1
  87. package/build/implementations/http/hono-api/index.d.ts +0 -151
  88. package/build/implementations/http/hono-api/index.js +0 -344
  89. package/build/implementations/http/hono-api/index.js.map +0 -1
  90. package/build/implementations/http/hono-api/index.test.d.ts +0 -1
  91. package/build/implementations/http/hono-api/index.test.js +0 -992
  92. package/build/implementations/http/hono-api/index.test.js.map +0 -1
  93. package/build/implementations/http/hono-api/types.d.ts +0 -13
  94. package/build/implementations/http/hono-api/types.js +0 -2
  95. package/build/implementations/http/hono-api/types.js.map +0 -1
  96. package/build/implementations/http/hono-rpc/error-taxonomy.test.d.ts +0 -1
  97. package/build/implementations/http/hono-rpc/error-taxonomy.test.js +0 -64
  98. package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +0 -1
  99. package/build/implementations/http/hono-rpc/index.d.ts +0 -130
  100. package/build/implementations/http/hono-rpc/index.js +0 -209
  101. package/build/implementations/http/hono-rpc/index.js.map +0 -1
  102. package/build/implementations/http/hono-rpc/index.test.d.ts +0 -1
  103. package/build/implementations/http/hono-rpc/index.test.js +0 -828
  104. package/build/implementations/http/hono-rpc/index.test.js.map +0 -1
  105. package/build/implementations/http/hono-rpc/types.d.ts +0 -11
  106. package/build/implementations/http/hono-rpc/types.js +0 -2
  107. package/build/implementations/http/hono-rpc/types.js.map +0 -1
  108. package/build/implementations/http/hono-stream/error-taxonomy.test.d.ts +0 -1
  109. package/build/implementations/http/hono-stream/error-taxonomy.test.js +0 -159
  110. package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +0 -1
  111. package/build/implementations/http/hono-stream/index.d.ts +0 -171
  112. package/build/implementations/http/hono-stream/index.js +0 -415
  113. package/build/implementations/http/hono-stream/index.js.map +0 -1
  114. package/build/implementations/http/hono-stream/index.test.d.ts +0 -1
  115. package/build/implementations/http/hono-stream/index.test.js +0 -1383
  116. package/build/implementations/http/hono-stream/index.test.js.map +0 -1
  117. package/build/implementations/http/hono-stream/types.d.ts +0 -15
  118. package/build/implementations/http/hono-stream/types.js +0 -2
  119. package/build/implementations/http/hono-stream/types.js.map +0 -1
  120. package/build/implementations/http/on-request-error.test.d.ts +0 -1
  121. package/build/implementations/http/on-request-error.test.js +0 -173
  122. package/build/implementations/http/on-request-error.test.js.map +0 -1
  123. package/build/implementations/http/route-errors.test.d.ts +0 -1
  124. package/build/implementations/http/route-errors.test.js +0 -139
  125. package/build/implementations/http/route-errors.test.js.map +0 -1
  126. package/build/implementations/types.d.ts +0 -192
  127. package/build/implementations/types.js +0 -2
  128. package/build/implementations/types.js.map +0 -1
  129. package/build/index.d.ts +0 -165
  130. package/build/index.js +0 -258
  131. package/build/index.js.map +0 -1
  132. package/build/index.test.d.ts +0 -1
  133. package/build/index.test.js +0 -920
  134. package/build/index.test.js.map +0 -1
  135. package/build/schema/extract-json-schema.d.ts +0 -2
  136. package/build/schema/extract-json-schema.js +0 -12
  137. package/build/schema/extract-json-schema.js.map +0 -1
  138. package/build/schema/extract-json-schema.test.d.ts +0 -1
  139. package/build/schema/extract-json-schema.test.js +0 -23
  140. package/build/schema/extract-json-schema.test.js.map +0 -1
  141. package/build/schema/parser.d.ts +0 -28
  142. package/build/schema/parser.js +0 -170
  143. package/build/schema/parser.js.map +0 -1
  144. package/build/schema/parser.test.d.ts +0 -1
  145. package/build/schema/parser.test.js +0 -120
  146. package/build/schema/parser.test.js.map +0 -1
  147. package/build/schema/resolve-schema-lib.d.ts +0 -12
  148. package/build/schema/resolve-schema-lib.js +0 -11
  149. package/build/schema/resolve-schema-lib.js.map +0 -1
  150. package/build/schema/resolve-schema-lib.test.d.ts +0 -1
  151. package/build/schema/resolve-schema-lib.test.js +0 -17
  152. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  153. package/build/schema/types.d.ts +0 -8
  154. package/build/schema/types.js +0 -2
  155. package/build/schema/types.js.map +0 -1
  156. package/build/stack-utils.d.ts +0 -25
  157. package/build/stack-utils.js +0 -95
  158. package/build/stack-utils.js.map +0 -1
  159. package/build/stack-utils.test.d.ts +0 -1
  160. package/build/stack-utils.test.js +0 -80
  161. package/build/stack-utils.test.js.map +0 -1
@@ -1,216 +0,0 @@
1
- import express from 'express';
2
- import { kebabCase } from 'es-toolkit/string';
3
- import { defineErrorTaxonomy, resolveErrorResponse, } from '../error-taxonomy.js';
4
- import { castArray } from 'es-toolkit/compat';
5
- export { defineErrorTaxonomy };
6
- /**
7
- * Builder class for creating an Express application with RPC routes.
8
- *
9
- * Usage:
10
- * const PublicRPC = Procedures<PublicRPCContext, RPCConfig>()
11
- * const ProtectedRPC = Procedures<ProtectedRPCContext, RPCConfig>()
12
- *
13
- * const rpcApp = new ExpressRPCAppBuilder()
14
- * .register(PublicRPC, (req): Promise<PublicRPCContext> => { /* context resolution logic * / })
15
- * .register(ProtectedRPC, (req): Promise<ProtectedRPCContext> => { /* context resolution logic * / })
16
- * .build();
17
- *
18
- * const app = rpcApp.app; // Express application
19
- * const docs = rpcApp.docs; // RPC route documentation
20
- */
21
- export class ExpressRPCAppBuilder {
22
- config;
23
- /**
24
- * Constructor for ExpressRPCAppBuilder.
25
- *
26
- * @param config
27
- */
28
- constructor(config) {
29
- this.config = config;
30
- if (config?.app) {
31
- this._app = config.app;
32
- }
33
- else {
34
- // Default middleware if no app is provided
35
- this._app.use(express.json());
36
- }
37
- if (config?.onRequestStart) {
38
- this._app.use((req, res, next) => {
39
- config.onRequestStart(req);
40
- next();
41
- });
42
- }
43
- if (config?.onRequestEnd) {
44
- this._app.use((req, res, next) => {
45
- res.on('finish', () => {
46
- config.onRequestEnd(req, res);
47
- });
48
- next();
49
- });
50
- }
51
- }
52
- /**
53
- * Generates the RPC route path based on the RPC configuration.
54
- * `RPCConfig.scope` can be a string or an array of strings to form nested paths.
55
- *
56
- * Example
57
- * name: 'GetUser'
58
- * scope: ['users', 'profile']
59
- * version: 1
60
- * path: /users/profile/get-user/1
61
- * @param config
62
- */
63
- static makeRPCHttpRoutePath({ name, config, prefix, }) {
64
- const normalizedPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';
65
- return `${normalizedPrefix}/${castArray(config.scope).map(kebabCase).join('/')}/${kebabCase(name)}/${String(config.version).trim()}`;
66
- }
67
- /**
68
- * Instance method wrapper for makeRPCHttpRoutePath that uses the builder's pathPrefix.
69
- * @param config - The RPC configuration
70
- */
71
- makeRPCHttpRoutePath(name, config) {
72
- return ExpressRPCAppBuilder.makeRPCHttpRoutePath({
73
- name,
74
- config,
75
- prefix: this.config?.pathPrefix,
76
- });
77
- }
78
- factories = [];
79
- _app = express();
80
- _docs = [];
81
- get app() {
82
- return this._app;
83
- }
84
- get docs() {
85
- return this._docs;
86
- }
87
- /**
88
- * Registers a procedure factory with its context.
89
- * @param factory - The procedure factory created by Procedures<Context, RPCConfig>()
90
- * @param factoryContext - The context for procedure handlers. Can be a direct value,
91
- * a sync function (req) => Context, or an async function (req) => Promise<Context>
92
- * @param extendProcedureDoc - A custom function to extend the generated RPC route documentation for each procedure.
93
- */
94
- register(factory, factoryContext, extendProcedureDoc) {
95
- this.factories.push({ factory, factoryContext, extendProcedureDoc });
96
- return this;
97
- }
98
- /**
99
- * Builds and returns the Express application with registered RPC routes.
100
- * @return express.Application
101
- */
102
- build() {
103
- this.factories.forEach(({ factory, factoryContext, extendProcedureDoc }) => {
104
- factory.getProcedures().map((procedure) => {
105
- const route = this.buildRpcHttpRouteDoc(procedure, extendProcedureDoc);
106
- this._docs.push(route);
107
- this._app[route.method](route.path, async (req, res) => {
108
- try {
109
- const context = typeof factoryContext === 'function'
110
- ? await factoryContext(req)
111
- : factoryContext;
112
- let ac;
113
- const ctxWithSignal = Object.defineProperty({ ...context }, 'signal', {
114
- get() {
115
- if (!ac) {
116
- ac = new AbortController();
117
- req.on('close', () => { if (!res.writableFinished)
118
- ac.abort(); });
119
- }
120
- return ac.signal;
121
- },
122
- enumerable: true,
123
- });
124
- res.json(await procedure.handler(ctxWithSignal, req.body));
125
- if (this.config?.onSuccess) {
126
- this.config.onSuccess(procedure, req, res);
127
- }
128
- // if status not set, set to 200
129
- if (!res.status) {
130
- res.status(200);
131
- }
132
- }
133
- catch (error) {
134
- if (this.config?.onRequestError) {
135
- try {
136
- await this.config.onRequestError({ err: error, procedure, raw: { req, res } });
137
- }
138
- catch (observerErr) {
139
- console.error('[ts-procedures express-rpc] onRequestError threw — swallowed:', observerErr);
140
- }
141
- }
142
- if (this.config?.errors || this.config?.unknownError) {
143
- const resolved = resolveErrorResponse({
144
- err: error,
145
- userTaxonomy: this.config.errors,
146
- unknownError: this.config.unknownError,
147
- procedure,
148
- raw: { req, res },
149
- });
150
- if (resolved) {
151
- await resolved.runOnCatch();
152
- if (!res.headersSent) {
153
- res.status(resolved.statusCode).json(resolved.body);
154
- }
155
- return;
156
- }
157
- }
158
- if (this.config?.onError) {
159
- this.config.onError(procedure, req, res, error);
160
- return;
161
- }
162
- // Hard default — `res.status` is always truthy (it's a method),
163
- // so the previous `if (!res.status)` guard never ran. Set status
164
- // and body together unconditionally, respecting an already-sent
165
- // response.
166
- if (!res.headersSent) {
167
- res.status(500).json({ error: error.message });
168
- }
169
- }
170
- });
171
- });
172
- });
173
- return this._app;
174
- }
175
- /**
176
- * Generates the RPC HTTP route for the given procedure.
177
- * @param procedure
178
- */
179
- buildRpcHttpRouteDoc(procedure, extendProcedureDoc) {
180
- const { config } = procedure;
181
- const path = ExpressRPCAppBuilder.makeRPCHttpRoutePath({
182
- name: procedure.name,
183
- config,
184
- prefix: this.config?.pathPrefix,
185
- });
186
- const method = 'post'; // RPCs use POST method
187
- const jsonSchema = {};
188
- if (config.schema?.params) {
189
- jsonSchema.body = config.schema.params;
190
- }
191
- if (config.schema?.returnType) {
192
- jsonSchema.response = config.schema.returnType;
193
- }
194
- const base = {
195
- kind: 'rpc',
196
- name: procedure.name,
197
- version: config.version,
198
- scope: config.scope,
199
- path,
200
- method,
201
- jsonSchema,
202
- };
203
- if (config.errors && config.errors.length > 0) {
204
- base.errors = [...config.errors];
205
- }
206
- let extendedDoc = {};
207
- if (extendProcedureDoc) {
208
- extendedDoc = extendProcedureDoc({ base, procedure });
209
- }
210
- return {
211
- ...extendedDoc,
212
- ...base,
213
- };
214
- }
215
- }
216
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/express-rpc/index.ts"],"names":[],"mappings":"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"}