@sdkgen/node-runtime 2.3.1 → 2.4.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 (54) hide show
  1. package/dist/api-config.js +19 -0
  2. package/dist/{src/context.d.ts → context.d.ts} +1 -0
  3. package/dist/context.js +3 -0
  4. package/dist/encode-decode.js +344 -0
  5. package/dist/error.js +33 -0
  6. package/dist/execute.js +57 -0
  7. package/dist/http-client.js +107 -0
  8. package/dist/{src/http-server.d.ts → http-server.d.ts} +1 -0
  9. package/dist/http-server.js +941 -0
  10. package/dist/{src/index.js → index.js} +1 -0
  11. package/dist/swagger.js +453 -0
  12. package/dist/test-wrapper.js +58 -0
  13. package/dist/utils.js +8 -0
  14. package/package.json +50 -34
  15. package/.eslintignore +0 -1
  16. package/.eslintrc.json +0 -3
  17. package/.prettierrc +0 -12
  18. package/.vscode/settings.json +0 -14
  19. package/dist/spec/error.spec.d.ts +0 -1
  20. package/dist/spec/error.spec.js +0 -15
  21. package/dist/spec/rest/rest.spec.d.ts +0 -1
  22. package/dist/spec/rest/rest.spec.js +0 -353
  23. package/dist/spec/runtime/errors.spec.d.ts +0 -1
  24. package/dist/spec/runtime/errors.spec.js +0 -43
  25. package/dist/spec/runtime/middleware.spec.d.ts +0 -1
  26. package/dist/spec/runtime/middleware.spec.js +0 -100
  27. package/dist/spec/simple/legacyNodeClient.d.ts +0 -17
  28. package/dist/spec/simple/legacyNodeClient.js +0 -128
  29. package/dist/spec/simple/simple.spec.d.ts +0 -1
  30. package/dist/spec/simple/simple.spec.js +0 -113
  31. package/dist/spec/types.d.ts +0 -1
  32. package/dist/spec/types.js +0 -60
  33. package/dist/spec/types.spec.d.ts +0 -1
  34. package/dist/spec/types.spec.js +0 -128
  35. package/dist/src/api-config.js +0 -19
  36. package/dist/src/context.js +0 -2
  37. package/dist/src/encode-decode.js +0 -376
  38. package/dist/src/error.js +0 -32
  39. package/dist/src/execute.js +0 -56
  40. package/dist/src/http-client.js +0 -105
  41. package/dist/src/http-server.js +0 -941
  42. package/dist/src/swagger.js +0 -439
  43. package/dist/src/test-wrapper.js +0 -52
  44. package/dist/src/utils.js +0 -7
  45. package/dist/tsconfig.tsbuildinfo +0 -1
  46. /package/dist/{src/api-config.d.ts → api-config.d.ts} +0 -0
  47. /package/dist/{src/encode-decode.d.ts → encode-decode.d.ts} +0 -0
  48. /package/dist/{src/error.d.ts → error.d.ts} +0 -0
  49. /package/dist/{src/execute.d.ts → execute.d.ts} +0 -0
  50. /package/dist/{src/http-client.d.ts → http-client.d.ts} +0 -0
  51. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  52. /package/dist/{src/swagger.d.ts → swagger.d.ts} +0 -0
  53. /package/dist/{src/test-wrapper.d.ts → test-wrapper.d.ts} +0 -0
  54. /package/dist/{src/utils.d.ts → utils.d.ts} +0 -0
@@ -16,3 +16,4 @@ var http_server_1 = require("./http-server");
16
16
  Object.defineProperty(exports, "SdkgenHttpServer", { enumerable: true, get: function () { return http_server_1.SdkgenHttpServer; } });
17
17
  var test_wrapper_1 = require("./test-wrapper");
18
18
  Object.defineProperty(exports, "apiTestWrapper", { enumerable: true, get: function () { return test_wrapper_1.apiTestWrapper; } });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTZDO0FBQXBDLDJHQUFBLGFBQWEsT0FBQTtBQUV0QixpREFBMkU7QUFBbEUsdUdBQUEsTUFBTSxPQUFBO0FBQUUsdUdBQUEsTUFBTSxPQUFBO0FBQ3ZCLGlDQUFrRTtBQUF6RCw4RkFBQSxLQUFLLE9BQUE7QUFBRSxvR0FBQSxXQUFXLE9BQUE7QUFBRSw0R0FBQSxtQkFBbUIsT0FBQTtBQUNoRCw2Q0FBaUQ7QUFBeEMsK0dBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkNBQWlEO0FBQXhDLCtHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLCtDQUFnRDtBQUF2Qyw4R0FBQSxjQUFjLE9BQUEifQ==
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupSwagger = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const parser_1 = require("@sdkgen/parser");
6
+ const serve_handler_1 = tslib_1.__importDefault(require("serve-handler"));
7
+ const swagger_ui_dist_1 = require("swagger-ui-dist");
8
+ const swaggerUiAssetPath = (0, swagger_ui_dist_1.getAbsoluteFSPath)();
9
+ function objectFromEntries(entries) {
10
+ return Object.assign({}, ...Array.from(entries, ([k, v]) => ({ [k]: v })));
11
+ }
12
+ function typeToSchema(definitions, type) {
13
+ if (type instanceof parser_1.EnumType) {
14
+ return {
15
+ enum: type.values.map(x => x.value),
16
+ type: "string",
17
+ };
18
+ }
19
+ else if (type instanceof parser_1.StructType) {
20
+ return {
21
+ properties: objectFromEntries(type.fields.map(field => [
22
+ field.name,
23
+ {
24
+ description: field.annotations
25
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
26
+ .map(x => x.text)
27
+ .join(" ") || undefined,
28
+ ...typeToSchema(definitions, field.type),
29
+ },
30
+ ])),
31
+ required: type.fields.filter(f => !(f.type instanceof parser_1.OptionalType)).map(f => f.name),
32
+ type: "object",
33
+ additionalProperties: false,
34
+ };
35
+ }
36
+ else if (type instanceof parser_1.StringPrimitiveType ||
37
+ type instanceof parser_1.UuidPrimitiveType ||
38
+ type instanceof parser_1.HexPrimitiveType ||
39
+ type instanceof parser_1.HtmlPrimitiveType ||
40
+ type instanceof parser_1.Base64PrimitiveType) {
41
+ return {
42
+ type: "string",
43
+ };
44
+ }
45
+ else if (type instanceof parser_1.UrlPrimitiveType) {
46
+ return {
47
+ format: "uri",
48
+ type: "string",
49
+ };
50
+ }
51
+ else if (type instanceof parser_1.DatePrimitiveType) {
52
+ return {
53
+ format: "date",
54
+ type: "string",
55
+ };
56
+ }
57
+ else if (type instanceof parser_1.DateTimePrimitiveType) {
58
+ return {
59
+ format: "date-time",
60
+ type: "string",
61
+ };
62
+ }
63
+ else if (type instanceof parser_1.CpfPrimitiveType) {
64
+ return {
65
+ type: "string",
66
+ };
67
+ }
68
+ else if (type instanceof parser_1.CnpjPrimitiveType) {
69
+ return {
70
+ type: "string",
71
+ };
72
+ }
73
+ else if (type instanceof parser_1.BoolPrimitiveType) {
74
+ return {
75
+ type: "boolean",
76
+ };
77
+ }
78
+ else if (type instanceof parser_1.BytesPrimitiveType) {
79
+ return {
80
+ format: "byte",
81
+ type: "string",
82
+ };
83
+ }
84
+ else if (type instanceof parser_1.IntPrimitiveType) {
85
+ return {
86
+ format: "int32",
87
+ type: "integer",
88
+ };
89
+ }
90
+ else if (type instanceof parser_1.UIntPrimitiveType) {
91
+ return {
92
+ format: "int32",
93
+ minimum: 0,
94
+ type: "integer",
95
+ };
96
+ }
97
+ else if (type instanceof parser_1.MoneyPrimitiveType) {
98
+ return {
99
+ format: "int64",
100
+ type: "integer",
101
+ };
102
+ }
103
+ else if (type instanceof parser_1.FloatPrimitiveType) {
104
+ return {
105
+ type: "number",
106
+ };
107
+ }
108
+ else if (type instanceof parser_1.EmailPrimitiveType) {
109
+ return {
110
+ type: "string",
111
+ };
112
+ }
113
+ else if (type instanceof parser_1.BigIntPrimitiveType) {
114
+ return {
115
+ type: "string",
116
+ };
117
+ }
118
+ else if (type instanceof parser_1.DecimalPrimitiveType) {
119
+ return {
120
+ type: "string",
121
+ };
122
+ }
123
+ else if (type instanceof parser_1.JsonPrimitiveType) {
124
+ return {};
125
+ }
126
+ else if (type instanceof parser_1.OptionalType) {
127
+ return {
128
+ oneOf: [typeToSchema(definitions, type.base), { type: "null" }],
129
+ };
130
+ }
131
+ else if (type instanceof parser_1.ArrayType) {
132
+ return {
133
+ items: typeToSchema(definitions, type.base),
134
+ type: "array",
135
+ };
136
+ }
137
+ else if (type instanceof parser_1.TypeReference) {
138
+ if (!definitions[type.name]) {
139
+ definitions[type.name] = typeToSchema(definitions, type.type);
140
+ }
141
+ return { $ref: `#/components/schemas/${type.name}` };
142
+ }
143
+ throw new Error(`Unhandled type ${type.constructor.name}`);
144
+ }
145
+ function getSwaggerJson(apiConfig) {
146
+ const schemas = {};
147
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+ const paths = {};
149
+ for (const op of apiConfig.ast.operations) {
150
+ const throwAnnotations = op.annotations.filter(ann => ann instanceof parser_1.ThrowsAnnotation);
151
+ let possibleErrors = throwAnnotations.map(ann => apiConfig.ast.errors.find(err => err.name === ann.error)).filter(x => x);
152
+ if (possibleErrors.length === 0) {
153
+ possibleErrors = apiConfig.ast.errors;
154
+ }
155
+ const errorsByStatus = new Map();
156
+ for (const error of possibleErrors) {
157
+ const statusAnnotation = error.annotations.find(ann => ann instanceof parser_1.StatusCodeAnnotation);
158
+ const statusCode = statusAnnotation ? statusAnnotation.statusCode : error.name === "Fatal" ? 500 : 400;
159
+ const errorList = errorsByStatus.get(statusCode) ?? [];
160
+ errorList.push(error);
161
+ errorsByStatus.set(statusCode, errorList);
162
+ }
163
+ const errorResponses = Object.fromEntries([...errorsByStatus.entries()].map(([status, errors]) => [
164
+ status,
165
+ {
166
+ description: errors
167
+ .map(error => error.name)
168
+ .sort((a, b) => a.localeCompare(b))
169
+ .join("<br>"),
170
+ content: {
171
+ "application/json": {
172
+ schema: {
173
+ anyOf: errors.map(error => ({
174
+ properties: {
175
+ message: {
176
+ type: "string",
177
+ },
178
+ type: {
179
+ enum: [error.name],
180
+ type: "string",
181
+ },
182
+ ...(error.dataType instanceof parser_1.VoidPrimitiveType
183
+ ? {}
184
+ : {
185
+ data: typeToSchema(schemas, error.dataType),
186
+ }),
187
+ },
188
+ required: ["type", "message", ...(error.dataType instanceof parser_1.VoidPrimitiveType ? [] : ["data"])],
189
+ type: "object",
190
+ additionalProperties: false,
191
+ })),
192
+ },
193
+ },
194
+ },
195
+ },
196
+ ]));
197
+ for (const ann of op.annotations) {
198
+ if (ann instanceof parser_1.RestAnnotation) {
199
+ if (!paths[ann.path]) {
200
+ paths[ann.path] = {};
201
+ }
202
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
203
+ paths[ann.path][ann.method.toLowerCase()] = {
204
+ operationId: op.name,
205
+ parameters: [
206
+ ...ann.pathVariables.map(name => ({
207
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
208
+ arg: op.args.find(arg => arg.name === name),
209
+ location: "path",
210
+ name,
211
+ })),
212
+ ...ann.queryVariables.map(name => ({
213
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
214
+ arg: op.args.find(arg => arg.name === name),
215
+ location: "query",
216
+ name,
217
+ })),
218
+ ...[...ann.headers.entries()].map(([header, name]) => ({
219
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
220
+ arg: op.args.find(arg => arg.name === name),
221
+ location: "header",
222
+ name: header,
223
+ })),
224
+ ].map(({ name, location, arg }) => ({
225
+ description: arg.annotations
226
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
227
+ .map(x => x.text)
228
+ .join(" ") || undefined,
229
+ in: location,
230
+ name,
231
+ required: !(arg.type instanceof parser_1.OptionalType),
232
+ schema: typeToSchema(schemas, arg.type),
233
+ })),
234
+ requestBody: ann.bodyVariable
235
+ ? {
236
+ content: {
237
+ ...(() => {
238
+ const bodyType = op.args.find(arg => arg.name === ann.bodyVariable)?.type;
239
+ return bodyType instanceof parser_1.BoolPrimitiveType ||
240
+ bodyType instanceof parser_1.IntPrimitiveType ||
241
+ bodyType instanceof parser_1.UIntPrimitiveType ||
242
+ bodyType instanceof parser_1.FloatPrimitiveType ||
243
+ bodyType instanceof parser_1.StringPrimitiveType ||
244
+ bodyType instanceof parser_1.DatePrimitiveType ||
245
+ bodyType instanceof parser_1.DateTimePrimitiveType ||
246
+ bodyType instanceof parser_1.MoneyPrimitiveType ||
247
+ bodyType instanceof parser_1.CpfPrimitiveType ||
248
+ bodyType instanceof parser_1.CnpjPrimitiveType ||
249
+ bodyType instanceof parser_1.EmailPrimitiveType ||
250
+ bodyType instanceof parser_1.HtmlPrimitiveType ||
251
+ bodyType instanceof parser_1.UuidPrimitiveType ||
252
+ bodyType instanceof parser_1.HexPrimitiveType ||
253
+ bodyType instanceof parser_1.BytesPrimitiveType ||
254
+ bodyType instanceof parser_1.Base64PrimitiveType
255
+ ? {
256
+ [bodyType instanceof parser_1.HtmlPrimitiveType ? "text/html" : "text/plain"]: {
257
+ schema: typeToSchema(schemas, bodyType),
258
+ },
259
+ }
260
+ : {};
261
+ })(),
262
+ "application/json": {
263
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
264
+ schema: typeToSchema(schemas, op.args.find(arg => arg.name === ann.bodyVariable).type),
265
+ },
266
+ },
267
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
268
+ required: !(op.args.find(arg => arg.name === ann.bodyVariable).type instanceof parser_1.OptionalType),
269
+ }
270
+ : undefined,
271
+ responses: {
272
+ ...(op.returnType instanceof parser_1.OptionalType || op.returnType instanceof parser_1.VoidPrimitiveType
273
+ ? { [ann.method === "GET" ? "404" : "204"]: {} }
274
+ : {}),
275
+ ...(op.returnType instanceof parser_1.VoidPrimitiveType
276
+ ? {}
277
+ : {
278
+ 200: {
279
+ description: "",
280
+ content: {
281
+ ...(() => {
282
+ return op.returnType instanceof parser_1.BoolPrimitiveType ||
283
+ op.returnType instanceof parser_1.IntPrimitiveType ||
284
+ op.returnType instanceof parser_1.UIntPrimitiveType ||
285
+ op.returnType instanceof parser_1.FloatPrimitiveType ||
286
+ op.returnType instanceof parser_1.StringPrimitiveType ||
287
+ op.returnType instanceof parser_1.DatePrimitiveType ||
288
+ op.returnType instanceof parser_1.DateTimePrimitiveType ||
289
+ op.returnType instanceof parser_1.MoneyPrimitiveType ||
290
+ op.returnType instanceof parser_1.CpfPrimitiveType ||
291
+ op.returnType instanceof parser_1.CnpjPrimitiveType ||
292
+ op.returnType instanceof parser_1.EmailPrimitiveType ||
293
+ op.returnType instanceof parser_1.UuidPrimitiveType ||
294
+ op.returnType instanceof parser_1.HexPrimitiveType ||
295
+ op.returnType instanceof parser_1.BytesPrimitiveType ||
296
+ op.returnType instanceof parser_1.Base64PrimitiveType
297
+ ? {
298
+ "text/plain": {
299
+ schema: typeToSchema(schemas, op.returnType),
300
+ },
301
+ }
302
+ : {};
303
+ })(),
304
+ "application/json": {
305
+ schema: typeToSchema(schemas, op.returnType),
306
+ },
307
+ },
308
+ },
309
+ }),
310
+ ...errorResponses,
311
+ },
312
+ summary: op.annotations
313
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
314
+ .map(x => x.text)
315
+ .join(" ") || undefined,
316
+ tags: [ann.path.split("/")[1]],
317
+ };
318
+ }
319
+ }
320
+ }
321
+ const securitySchemes = {
322
+ bearerAuth: {
323
+ type: "http",
324
+ scheme: "bearer",
325
+ },
326
+ };
327
+ const security = [
328
+ {
329
+ bearerAuth: [],
330
+ },
331
+ ];
332
+ return {
333
+ openapi: "3.0.0",
334
+ info: {
335
+ title: "",
336
+ version: "",
337
+ },
338
+ paths,
339
+ components: {
340
+ schemas,
341
+ securitySchemes,
342
+ },
343
+ security,
344
+ };
345
+ }
346
+ function setupSwagger(server) {
347
+ server.addHttpHandler("GET", "/swagger", (req, res) => {
348
+ if (!server.introspection) {
349
+ res.statusCode = 404;
350
+ res.end();
351
+ return;
352
+ }
353
+ res.setHeader("content-type", "text/html");
354
+ res.write(`
355
+ <!DOCTYPE html>
356
+ <html lang="en">
357
+ <head>
358
+ <meta charset="UTF-8">
359
+ <title>Swagger UI</title>
360
+ <link rel="stylesheet" type="text/css" href="/swagger/swagger-ui.css" >
361
+ <link rel="icon" type="image/png" href="/swagger/favicon-32x32.png" sizes="32x32" />
362
+ <link rel="icon" type="image/png" href="/swagger/favicon-16x16.png" sizes="16x16" />
363
+ <style>
364
+ html {
365
+ box-sizing: border-box;
366
+ overflow: -moz-scrollbars-vertical;
367
+ overflow-y: scroll;
368
+ }
369
+
370
+ *, *:before, *:after {
371
+ box-sizing: inherit;
372
+ }
373
+
374
+ body {
375
+ margin: 0;
376
+ background: #fafafa;
377
+ }
378
+
379
+ .topbar {
380
+ display: none !important;
381
+ }
382
+ </style>
383
+ </head>
384
+
385
+ <body>
386
+ <div id="swagger-ui"></div>
387
+ <script src="swagger/swagger-ui-bundle.js"> </script>
388
+ <script src="swagger/swagger-ui-standalone-preset.js"> </script>
389
+ <script>
390
+ window.onload = function() {
391
+ window.ui = SwaggerUIBundle({
392
+ spec: {
393
+ ...${JSON.stringify(getSwaggerJson(server.apiConfig))},
394
+ servers: [{ url: location.origin + location.pathname.replace(/\\/swagger$/, "") }]
395
+ },
396
+ dom_id: '#swagger-ui',
397
+ deepLinking: true,
398
+ presets: [
399
+ SwaggerUIBundle.presets.apis,
400
+ SwaggerUIStandalonePreset,
401
+ ],
402
+ plugins: [
403
+ SwaggerUIBundle.plugins.DownloadUrl,
404
+ ],
405
+ layout: "StandaloneLayout"
406
+ });
407
+ }
408
+ </script>
409
+ </body>
410
+ </html>
411
+ `);
412
+ res.end();
413
+ });
414
+ server.addHttpHandler("GET", /^\/swagger.*/u, (req, res) => {
415
+ if (!server.introspection) {
416
+ res.statusCode = 404;
417
+ res.end();
418
+ return;
419
+ }
420
+ if (req.url) {
421
+ req.url = req.url.replace(/\/swagger/u, "");
422
+ }
423
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
424
+ (0, serve_handler_1.default)(req, res, {
425
+ cleanUrls: false,
426
+ directoryListing: false,
427
+ etag: true,
428
+ public: swaggerUiAssetPath,
429
+ }).catch(e => {
430
+ console.error(e);
431
+ res.statusCode = 500;
432
+ res.write(`${e}`);
433
+ res.end();
434
+ });
435
+ });
436
+ server.addHttpHandler("GET", "/swagger.json", (req, res) => {
437
+ if (!server.introspection) {
438
+ res.statusCode = 404;
439
+ res.end();
440
+ return;
441
+ }
442
+ try {
443
+ res.write(JSON.stringify(getSwaggerJson(server.apiConfig)));
444
+ }
445
+ catch (error) {
446
+ console.error(error);
447
+ res.statusCode = 500;
448
+ }
449
+ res.end();
450
+ });
451
+ }
452
+ exports.setupSwagger = setupSwagger;
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zd2FnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSwyQ0ErQndCO0FBR3hCLDBFQUErQztBQUMvQyxxREFBNkU7QUFLN0UsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLG1DQUFxQixHQUFFLENBQUM7QUFFbkQsU0FBUyxpQkFBaUIsQ0FBSSxPQUEyQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFzQixDQUFDO0FBQ2xHLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxXQUFtRCxFQUFFLElBQVU7SUFDbkYsSUFBSSxJQUFJLFlBQVksaUJBQVEsRUFBRTtRQUM1QixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNuQyxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLG1CQUFVLEVBQUU7UUFDckMsT0FBTztZQUNMLFVBQVUsRUFBRSxpQkFBaUIsQ0FDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLElBQUk7Z0JBQ1Y7b0JBQ0UsV0FBVyxFQUNULEtBQUssQ0FBQyxXQUFXO3lCQUNkLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSw4QkFBcUIsQ0FBQzt5QkFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBMkIsQ0FBQyxJ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
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiTestWrapper = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable @typescript-eslint/no-unused-vars */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
7
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
8
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
9
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
10
+ const crypto_1 = require("crypto");
11
+ const encode_decode_1 = require("./encode-decode");
12
+ const execute_1 = require("./execute");
13
+ function apiTestWrapper(api, extraContext = {}) {
14
+ const wrappedApi = new api.constructor();
15
+ for (const functionName of Object.keys(api.astJson.functionTable)) {
16
+ wrappedApi.fn[functionName] = async (partialCtx, args) => {
17
+ const encodedArgs = (0, encode_decode_1.encode)(api.astJson.typeTable, `fn.${functionName}.args`, api.astJson.functionTable[functionName].args, args);
18
+ const ctx = {
19
+ ...extraContext,
20
+ ...partialCtx,
21
+ request: {
22
+ args: encodedArgs,
23
+ deviceInfo: partialCtx.request?.deviceInfo ?? {
24
+ fingerprint: null,
25
+ id: (0, crypto_1.randomBytes)(16).toString("hex"),
26
+ language: null,
27
+ platform: null,
28
+ timezone: null,
29
+ type: "test",
30
+ version: null,
31
+ },
32
+ extra: partialCtx.request?.extra ?? {},
33
+ files: partialCtx.request?.files ?? [],
34
+ headers: partialCtx.request?.headers ?? {},
35
+ id: partialCtx.request?.id ?? (0, crypto_1.randomBytes)(16).toString("hex"),
36
+ ip: partialCtx.request?.ip ?? "0.0.0.0",
37
+ name: functionName,
38
+ version: 3,
39
+ query: null,
40
+ },
41
+ response: {
42
+ headers: new Map(),
43
+ },
44
+ };
45
+ const reply = await (0, execute_1.executeRequest)(ctx, api);
46
+ if (reply.error) {
47
+ throw reply.error;
48
+ }
49
+ else {
50
+ const decodedRet = (0, encode_decode_1.decode)(api.astJson.typeTable, `fn.${functionName}.ret`, api.astJson.functionTable[functionName].ret, JSON.parse(JSON.stringify(reply.result)));
51
+ return decodedRet;
52
+ }
53
+ };
54
+ }
55
+ return wrappedApi;
56
+ }
57
+ exports.apiTestWrapper = apiTestWrapper;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3Qtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBdUQ7QUFDdkQsc0RBQXNEO0FBQ3RELDREQUE0RDtBQUM1RCxzREFBc0Q7QUFDdEQsK0RBQStEO0FBQy9ELHdEQUF3RDtBQUN4RCxtQ0FBcUM7QUFJckMsbURBQWlEO0FBQ2pELHVDQUEyQztBQUUzQyxTQUFnQixjQUFjLENBQTJELEdBQVMsRUFBRSxlQUF1QyxFQUFFO0lBQzNJLE1BQU0sVUFBVSxHQUFTLElBQUssR0FBRyxDQUFDLFdBQW1CLEVBQUUsQ0FBQztJQUV4RCxLQUFLLE1BQU0sWUFBWSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNqRSxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssRUFBRSxVQUE0QixFQUFFLElBQVMsRUFBRSxFQUFFO1lBQzlFLE1BQU0sV0FBVyxHQUFHLElBQUEsc0JBQU0sRUFBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLFlBQVksT0FBTyxFQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFMUksTUFBTSxHQUFHLEdBQVk7Z0JBQ25CLEdBQUcsWUFBWTtnQkFDZixHQUFHLFVBQVU7Z0JBQ2IsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxXQUFzQztvQkFDNUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJO3dCQUM1QyxXQUFXLEVBQUUsSUFBSTt3QkFDakIsRUFBRSxFQUFFLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUNuQyxRQUFRLEVBQUUsSUFBSTt3QkFDZCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxJQUFJLEVBQUUsTUFBTTt3QkFDWixPQUFPLEVBQUUsSUFBSTtxQkFDZDtvQkFDRCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDdEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ3RDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO29CQUMxQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQzdELEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxTQUFTO29CQUN2QyxJQUFJLEVBQUUsWUFBWTtvQkFDbEIsT0FBTyxFQUFFLENBQUM7b0JBQ1YsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRTtpQkFDbkI7YUFDRixDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLHdCQUFjLEVBQUMsR0FBOEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUV4RSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLE1BQU0sVUFBVSxHQUFHLElBQUEsc0JBQU0sRUFDdkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQ3JCLE1BQU0sWUFBWSxNQUFNLEVBQ3ZCLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDekMsQ0FBQztnQkFFRixPQUFPLFVBQVUsQ0FBQzthQUNuQjtRQUNILENBQUMsQ0FBQztLQUNIO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQXJERCx3Q0FxREMifQ==
package/dist/utils.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.has = void 0;
4
+ function has(target, property) {
5
+ return property in target;
6
+ }
7
+ exports.has = has;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBY0EsU0FBZ0IsR0FBRyxDQUF3QixNQUFjLEVBQUUsUUFBVztJQUNwRSxPQUFPLFFBQVEsSUFBSSxNQUFNLENBQUM7QUFDNUIsQ0FBQztBQUZELGtCQUVDIn0=
package/package.json CHANGED
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "name": "@sdkgen/node-runtime",
3
- "version": "2.3.1",
3
+ "version": "2.4.0",
4
4
  "description": "",
5
- "main": "dist/src/index.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "directories": {
8
+ "lib": "dist"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
6
13
  "scripts": {
7
14
  "test": "TZ=UTC jest --passWithNoTests",
8
15
  "eslint:fix": "eslint --fix '{src,spec}/**/*.ts'",
@@ -19,28 +26,55 @@
19
26
  "url": "https://github.com/sdkgen/sdkgen/issues"
20
27
  },
21
28
  "publishConfig": {
22
- "access": "public"
29
+ "access": "public",
30
+ "provenance": true
23
31
  },
24
32
  "homepage": "https://github.com/sdkgen/sdkgen#readme",
33
+ "dependencies": {
34
+ "@fnando/cnpj": "^1.0.2",
35
+ "@fnando/cpf": "^1.0.2",
36
+ "@sdkgen/csharp-generator": "^2.4.0",
37
+ "@sdkgen/dart-generator": "^2.4.0",
38
+ "@sdkgen/fsharp-generator": "^2.4.0",
39
+ "@sdkgen/kotlin-generator": "^2.4.0",
40
+ "@sdkgen/parser": "^2.4.0",
41
+ "@sdkgen/playground": "^2.4.0",
42
+ "@sdkgen/swift-generator": "^2.4.0",
43
+ "@sdkgen/typescript-generator": "^2.4.0",
44
+ "busboy": "1.5.0",
45
+ "decimal.js": "^10.4.3",
46
+ "file-type": "^16.5.4",
47
+ "request-ip": "^3.3.0",
48
+ "serve-handler": "^6.1.5",
49
+ "swagger-ui-dist": "^5.11.0"
50
+ },
25
51
  "devDependencies": {
26
52
  "@cubos/eslint-config": "^2.2.0",
27
- "@types/busboy": "^1.0.0",
28
- "@types/jest": "^29.0.0",
29
- "@types/node": "^16.7.0",
30
- "@types/request-ip": "0.0.37",
31
- "@types/serve-handler": "^6.1.1",
32
- "@types/swagger-ui-dist": "^3.30.1",
33
- "axios": "^0.27.0",
53
+ "@types/busboy": "^1.5.3",
54
+ "@types/jest": "^29.5.11",
55
+ "@types/node": "^20.10.8",
56
+ "@types/request-ip": "0.0.41",
57
+ "@types/serve-handler": "^6.1.4",
58
+ "@types/swagger-ui-dist": "^3.30.4",
59
+ "axios": "^1.6.5",
34
60
  "form-data": "^4.0.0",
35
- "jest": "^29.0.0",
36
- "json-schema-typed": "^8.0.0",
61
+ "jest": "^29.7.0",
62
+ "json-schema-typed": "^8.0.1",
37
63
  "spec.ts": "^1.1.3",
38
- "ts-jest": "^29.0.0",
39
- "type-fest": "^3.0.0",
40
- "typescript": "^4.3.5"
64
+ "ts-jest": "^29.1.1",
65
+ "type-fest": "^4.9.0",
66
+ "typescript": "~5.2.2"
41
67
  },
42
68
  "jest": {
43
69
  "transform": {
70
+ "^.+\\.js$": [
71
+ "babel-jest",
72
+ {
73
+ "plugins": [
74
+ "@babel/plugin-transform-modules-commonjs"
75
+ ]
76
+ }
77
+ ],
44
78
  "^.+\\.tsx?$": "ts-jest"
45
79
  },
46
80
  "transformIgnorePatterns": [
@@ -58,23 +92,5 @@
58
92
  "/spec/"
59
93
  ]
60
94
  },
61
- "dependencies": {
62
- "@fnando/cnpj": "^1.0.2",
63
- "@fnando/cpf": "^1.0.2",
64
- "@sdkgen/csharp-generator": "2.3.1",
65
- "@sdkgen/dart-generator": "2.3.1",
66
- "@sdkgen/fsharp-generator": "2.3.1",
67
- "@sdkgen/kotlin-generator": "2.3.1",
68
- "@sdkgen/parser": "2.3.1",
69
- "@sdkgen/playground": "2.3.1",
70
- "@sdkgen/swift-generator": "2.3.1",
71
- "@sdkgen/typescript-generator": "2.3.1",
72
- "busboy": "1.5.0",
73
- "decimal.js": "^10.3.1",
74
- "file-type": "^16.5.3",
75
- "request-ip": "^3.0.0",
76
- "serve-handler": "^6.1.3",
77
- "swagger-ui-dist": "^4.0.0"
78
- },
79
- "types": "dist/src/index.d.ts"
95
+ "gitHead": "a3e20bed64cdde6c64dd8b6c6fa41a5cad626d31"
80
96
  }