constantia 1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/dist/adapters/express.d.ts +36 -0
  4. package/dist/adapters/express.d.ts.map +1 -0
  5. package/dist/adapters/express.js +494 -0
  6. package/dist/adapters/express.js.map +1 -0
  7. package/dist/adapters/index.d.ts +9 -0
  8. package/dist/adapters/index.d.ts.map +1 -0
  9. package/dist/adapters/index.js +3 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/adapters/validation.d.ts +3 -0
  12. package/dist/adapters/validation.d.ts.map +1 -0
  13. package/dist/adapters/validation.js +171 -0
  14. package/dist/adapters/validation.js.map +1 -0
  15. package/dist/context.d.ts +37 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +24 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/controllers.d.ts +9 -0
  20. package/dist/controllers.d.ts.map +1 -0
  21. package/dist/controllers.js +28 -0
  22. package/dist/controllers.js.map +1 -0
  23. package/dist/decorators.d.ts +38 -0
  24. package/dist/decorators.d.ts.map +1 -0
  25. package/dist/decorators.js +232 -0
  26. package/dist/decorators.js.map +1 -0
  27. package/dist/errors/index.d.ts +26 -0
  28. package/dist/errors/index.d.ts.map +1 -0
  29. package/dist/errors/index.js +52 -0
  30. package/dist/errors/index.js.map +1 -0
  31. package/dist/index.d.ts +18 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +19 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/logger.d.ts +11 -0
  36. package/dist/logger.d.ts.map +1 -0
  37. package/dist/logger.js +29 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/metadata.d.ts +62 -0
  40. package/dist/metadata.d.ts.map +1 -0
  41. package/dist/metadata.js +304 -0
  42. package/dist/metadata.js.map +1 -0
  43. package/dist/openapi/helpers.d.ts +8 -0
  44. package/dist/openapi/helpers.d.ts.map +1 -0
  45. package/dist/openapi/helpers.js +343 -0
  46. package/dist/openapi/helpers.js.map +1 -0
  47. package/dist/openapi/index.d.ts +15 -0
  48. package/dist/openapi/index.d.ts.map +1 -0
  49. package/dist/openapi/index.js +134 -0
  50. package/dist/openapi/index.js.map +1 -0
  51. package/dist/openapi/types.d.ts +129 -0
  52. package/dist/openapi/types.d.ts.map +1 -0
  53. package/dist/openapi/types.js +34 -0
  54. package/dist/openapi/types.js.map +1 -0
  55. package/dist/types/files.d.ts +38 -0
  56. package/dist/types/files.d.ts.map +1 -0
  57. package/dist/types/files.js +50 -0
  58. package/dist/types/files.js.map +1 -0
  59. package/dist/types/index.d.ts +20 -0
  60. package/dist/types/index.d.ts.map +1 -0
  61. package/dist/types/index.js +121 -0
  62. package/dist/types/index.js.map +1 -0
  63. package/dist/types/middleware.d.ts +10 -0
  64. package/dist/types/middleware.d.ts.map +1 -0
  65. package/dist/types/middleware.js +16 -0
  66. package/dist/types/middleware.js.map +1 -0
  67. package/dist/types/stream.d.ts +29 -0
  68. package/dist/types/stream.d.ts.map +1 -0
  69. package/dist/types/stream.js +13 -0
  70. package/dist/types/stream.js.map +1 -0
  71. package/package.json +134 -0
@@ -0,0 +1,343 @@
1
+ /*@ts-ignore*/
2
+ import { __ΩComponentsObject } from './types.js';
3
+ /*@ts-ignore*/
4
+ import { __ΩSchemaObject } from './types.js';
5
+ /*@ts-ignore*/
6
+ import { __ΩReferenceObject } from './types.js';
7
+ /*@ts-ignore*/
8
+ import { __ΩParameterObject } from './types.js';
9
+ /*@ts-ignore*/
10
+ import { __ΩRequestBodyObject } from './types.js';
11
+ /*@ts-ignore*/
12
+ import { __ΩResponsesObject } from './types.js';
13
+ function __assignType(fn, args) {
14
+ fn.__type = args;
15
+ return fn;
16
+ }
17
+ import { logger } from '../logger.js';
18
+ export const schemaTypeToOpenAPISchema = __assignType((schemaType, components) => {
19
+ if (!schemaType) {
20
+ return undefined;
21
+ }
22
+ switch (schemaType.type) {
23
+ case 'string':
24
+ if (schemaType.format) {
25
+ return { type: 'string', format: schemaType.format };
26
+ }
27
+ return { type: 'string' };
28
+ case 'number':
29
+ return { type: 'number' };
30
+ case 'boolean':
31
+ return { type: 'boolean' };
32
+ case 'null':
33
+ case 'void':
34
+ return { nullable: true };
35
+ case 'file':
36
+ return { type: 'string', format: 'binary' };
37
+ case 'fileStream':
38
+ return { type: 'string', format: 'binary' };
39
+ case 'dataStream':
40
+ logger.warn(`OpenAPI: DataStream schema generation defaults to 'object'. Define item schema explicitly if possible.`);
41
+ return {
42
+ type: 'object',
43
+ description: 'Stream of data objects (e.g., ndjson)',
44
+ };
45
+ case 'array': {
46
+ const itemsSchema = schemaTypeToOpenAPISchema(schemaType.items, components);
47
+ return { type: 'array', items: itemsSchema || {} };
48
+ }
49
+ case 'object': {
50
+ const properties = {};
51
+ if (schemaType.properties) {
52
+ for (const [key, propSchema] of Object.entries(schemaType.properties)) {
53
+ const openApiPropSchema = schemaTypeToOpenAPISchema(propSchema, components);
54
+ if (openApiPropSchema) {
55
+ properties[key] = openApiPropSchema;
56
+ }
57
+ }
58
+ }
59
+ return {
60
+ type: 'object',
61
+ properties: properties,
62
+ required: schemaType.required,
63
+ };
64
+ }
65
+ case 'union': {
66
+ const nonNullTypes = schemaType.oneOf?.filter(__assignType((t) => t.type !== 'null' && t.type !== 'void', ['t', '', 'P"2!"/"']));
67
+ const hasNull = schemaType.oneOf?.some(__assignType((t) => t.type === 'null' || t.type === 'void', ['t', '', 'P"2!"/"']));
68
+ if (nonNullTypes?.length === 1) {
69
+ const baseSchema = schemaTypeToOpenAPISchema(nonNullTypes[0], components);
70
+ if (baseSchema && hasNull) {
71
+ baseSchema.nullable = true;
72
+ }
73
+ return baseSchema;
74
+ }
75
+ else if (schemaType.oneOf) {
76
+ return {
77
+ oneOf: schemaType.oneOf
78
+ .map(__assignType((subSchema) => schemaTypeToOpenAPISchema(subSchema, components), ['subSchema', '', 'P"2!"/"']))
79
+ .filter(__assignType((s) => s !== undefined, ['s', '', 'P"2!"/"'])),
80
+ };
81
+ }
82
+ return {};
83
+ }
84
+ case 'tuple': {
85
+ if (!schemaType.elements || schemaType.elements.length === 0) {
86
+ return {
87
+ type: 'array',
88
+ items: {},
89
+ minItems: 0,
90
+ maxItems: 0,
91
+ };
92
+ }
93
+ const elementSchemas = schemaType.elements.map(__assignType((el) => schemaTypeToOpenAPISchema(el, components), ['el', '', 'P"2!"/"']));
94
+ const allSameType = schemaType.elements.every(__assignType((el) => el.type === schemaType.elements[0].type, ['el', '', 'P"2!"/"']));
95
+ if (allSameType && schemaType.elements.length > 0) {
96
+ return {
97
+ type: 'array',
98
+ items: elementSchemas[0] || {},
99
+ minItems: schemaType.elements.length,
100
+ maxItems: schemaType.elements.length,
101
+ description: `Fixed-length array (tuple) with ${schemaType.elements.length} elements`,
102
+ };
103
+ }
104
+ else {
105
+ return {
106
+ type: 'array',
107
+ items: {},
108
+ minItems: schemaType.elements.length,
109
+ maxItems: schemaType.elements.length,
110
+ description: `Fixed-length tuple with ${schemaType.elements.length} elements of types: ${schemaType.elements.map(__assignType((el) => el.type, ['el', '', 'P"2!"/"'])).join(', ')}`,
111
+ };
112
+ }
113
+ }
114
+ default:
115
+ logger.warn(`OpenAPI: Unsupported schema type "${schemaType.type}" encountered.`);
116
+ return {};
117
+ }
118
+ }, ['SchemaType', 'schemaType', () => __ΩComponentsObject, 'components', () => __ΩSchemaObject, () => __ΩReferenceObject, '', 'PP"w!-J2"n#2$Pn%n&-J/\'']);
119
+ export const createOpenAPIParameters = __assignType((routeParams, components) => {
120
+ const openApiParams = [];
121
+ for (const param of routeParams) {
122
+ let location = null;
123
+ switch (param.type) {
124
+ case 'param':
125
+ location = 'path';
126
+ break;
127
+ case 'query':
128
+ location = 'query';
129
+ break;
130
+ case 'header':
131
+ location = 'header';
132
+ break;
133
+ case 'body':
134
+ case 'file':
135
+ continue;
136
+ case 'ctx':
137
+ case 'rawBody':
138
+ continue;
139
+ default:
140
+ logger.warn(`OpenAPI: Unsupported parameter type "${param.type}" for parameter "${param.name}".`);
141
+ continue;
142
+ }
143
+ if (!param.name) {
144
+ logger.warn(`OpenAPI: Parameter of type "${param.type}" is missing a name.`);
145
+ continue;
146
+ }
147
+ openApiParams.push({
148
+ name: param.name,
149
+ in: location,
150
+ required: param.required ?? location === 'path',
151
+ schema: schemaTypeToOpenAPISchema(param.schema, components) || {},
152
+ });
153
+ }
154
+ return openApiParams;
155
+ }, ['ParameterMetadata', 'routeParams', () => __ΩComponentsObject, 'components', () => __ΩParameterObject, () => __ΩReferenceObject, '', 'P"w!F2"n#2$Pn%n&JF/\'']);
156
+ export const createOpenAPIRequestBody = __assignType((routeParams, components) => {
157
+ const bodyParam = routeParams.find(__assignType((p) => p.type === 'body', ['p', '', 'P"2!"/"']));
158
+ const fileParams = routeParams.filter(__assignType((p) => p.type === 'file', ['p', '', 'P"2!"/"']));
159
+ if (!bodyParam && fileParams.length === 0) {
160
+ return undefined;
161
+ }
162
+ const requestBody = {
163
+ required: true,
164
+ content: {},
165
+ };
166
+ if (bodyParam) {
167
+ requestBody.content['application/json'] = {
168
+ schema: schemaTypeToOpenAPISchema(bodyParam.schema, components) || {},
169
+ };
170
+ requestBody.required = bodyParam.required;
171
+ }
172
+ if (fileParams.length > 0) {
173
+ const properties = {};
174
+ const requiredFields = [];
175
+ let hasUnnamedFileArray = false;
176
+ for (const fileParam of fileParams) {
177
+ if (fileParam.name) {
178
+ properties[fileParam.name] = {
179
+ type: 'string',
180
+ format: 'binary',
181
+ };
182
+ if (fileParam.required) {
183
+ requiredFields.push(fileParam.name);
184
+ }
185
+ }
186
+ else {
187
+ hasUnnamedFileArray = true;
188
+ if (fileParam.required) {
189
+ requiredFields.push('files');
190
+ }
191
+ }
192
+ }
193
+ if (hasUnnamedFileArray) {
194
+ properties['files'] = {
195
+ type: 'array',
196
+ items: { type: 'string', format: 'binary' },
197
+ description: 'One or more files uploaded.',
198
+ };
199
+ }
200
+ else if (Object.keys(properties).length === 0 &&
201
+ fileParams.length > 0) {
202
+ properties['file'] = {
203
+ type: 'string',
204
+ format: 'binary',
205
+ description: 'A file upload.',
206
+ };
207
+ if (fileParams.some(__assignType((fp) => fp.required, ['fp', '', 'P"2!"/"'])))
208
+ requiredFields.push('file');
209
+ }
210
+ requestBody.content['multipart/form-data'] = {
211
+ schema: {
212
+ type: 'object',
213
+ properties: properties,
214
+ required: requiredFields.length > 0 ? requiredFields : undefined,
215
+ },
216
+ };
217
+ requestBody.required = true;
218
+ }
219
+ return requestBody;
220
+ }, ['ParameterMetadata', 'routeParams', () => __ΩComponentsObject, 'components', () => __ΩRequestBodyObject, '', 'P"w!F2"n#2$Pn%-J/&']);
221
+ export const createOpenAPIResponses = __assignType((route, components) => {
222
+ const responses = {};
223
+ if (!components.schemas)
224
+ components.schemas = {};
225
+ if (!components.responses)
226
+ components.responses = {};
227
+ if (!components.schemas['ErrorResponse']) {
228
+ components.schemas['ErrorResponse'] = {
229
+ type: 'object',
230
+ properties: {
231
+ error: {
232
+ type: 'string',
233
+ description: 'Short error identifier (e.g., BadRequest, NotFound, Unauthorized)',
234
+ },
235
+ message: {
236
+ type: 'string',
237
+ description: 'Detailed error message',
238
+ },
239
+ },
240
+ required: ['error', 'message'],
241
+ description: 'Standard error structure for failed responses.',
242
+ };
243
+ }
244
+ const errorResponseRef = { $ref: '#/components/schemas/ErrorResponse' };
245
+ if (!components.responses['BadRequest']) {
246
+ components.responses['BadRequest'] = {
247
+ description: 'Bad Request (e.g., validation error, invalid input)',
248
+ content: { 'application/json': { schema: errorResponseRef } },
249
+ };
250
+ }
251
+ if (!components.responses['Unauthorized']) {
252
+ components.responses['Unauthorized'] = {
253
+ description: 'Unauthorized (e.g., missing or invalid authentication credentials)',
254
+ content: { 'application/json': { schema: errorResponseRef } },
255
+ };
256
+ }
257
+ if (!components.responses['NotFound']) {
258
+ components.responses['NotFound'] = {
259
+ description: 'Resource Not Found',
260
+ content: { 'application/json': { schema: errorResponseRef } },
261
+ };
262
+ }
263
+ if (!components.responses['InternalError']) {
264
+ components.responses['InternalError'] = {
265
+ description: 'Internal Server Error (an unexpected condition occurred)',
266
+ content: { 'application/json': { schema: errorResponseRef } },
267
+ };
268
+ }
269
+ if (!components.responses['DefaultError']) {
270
+ components.responses['DefaultError'] = {
271
+ description: 'An unexpected error occurred (includes errors specified by StatusCodeErrorError)',
272
+ content: { 'application/json': { schema: errorResponseRef } },
273
+ };
274
+ }
275
+ let successStatusCode = '200';
276
+ const successResponse = {
277
+ description: 'Successful operation',
278
+ };
279
+ const returnSchema = schemaTypeToOpenAPISchema(route.returnType, components);
280
+ const specifiedContentType = route.stream?.options?.contentType;
281
+ if (route.stream?.streamType === 'fileStream') {
282
+ const responseContentType = specifiedContentType || 'application/octet-stream';
283
+ successResponse.description = 'File stream';
284
+ successResponse.content = {
285
+ [responseContentType]: {
286
+ schema: { type: 'string', format: 'binary' },
287
+ },
288
+ };
289
+ successResponse.headers = {
290
+ 'Accept-Ranges': {
291
+ schema: { type: 'string' },
292
+ description: 'Indicates support for range requests (bytes)',
293
+ },
294
+ 'Content-Range': {
295
+ schema: { type: 'string' },
296
+ description: 'Indicates the part of the file returned for partial content',
297
+ },
298
+ 'Content-Length': {
299
+ schema: { type: 'string' },
300
+ description: 'The size of the file part or whole file',
301
+ },
302
+ 'Content-Disposition': {
303
+ schema: { type: 'string' },
304
+ description: 'Specifies presentation (inline/attachment) and filename',
305
+ },
306
+ };
307
+ }
308
+ else if (route.stream?.streamType === 'dataStream') {
309
+ const responseContentType = specifiedContentType || 'application/x-ndjson';
310
+ successResponse.description = 'Data stream';
311
+ successResponse.content = {
312
+ [responseContentType]: {
313
+ schema: {
314
+ type: 'string',
315
+ description: `Stream of data objects, often newline-delimited (like ${responseContentType}). Schema represents one object within the stream.`,
316
+ },
317
+ },
318
+ };
319
+ }
320
+ else if (route.returnType.type === 'void' ||
321
+ route.returnType.type === 'null') {
322
+ successStatusCode = '204';
323
+ successResponse.description = 'Success (No Content)';
324
+ }
325
+ else if (returnSchema) {
326
+ successResponse.content = {
327
+ 'application/json': {
328
+ schema: returnSchema,
329
+ },
330
+ };
331
+ }
332
+ else {
333
+ successResponse.description = 'Success';
334
+ }
335
+ responses[successStatusCode] = successResponse;
336
+ responses['400'] = { $ref: '#/components/responses/BadRequest' };
337
+ responses['401'] = { $ref: '#/components/responses/Unauthorized' };
338
+ responses['404'] = { $ref: '#/components/responses/NotFound' };
339
+ responses['500'] = { $ref: '#/components/responses/InternalError' };
340
+ responses.default = { $ref: '#/components/responses/DefaultError' };
341
+ return responses;
342
+ }, ['RouteMetadata', 'route', () => __ΩComponentsObject, 'components', () => __ΩResponsesObject, '', 'P"w!2"n#2$n%/&']);
343
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/openapi/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { OpenAPISpec } from './types.js';
2
+ import { type IFrameworkAdapter } from '../adapters/index.js';
3
+ export interface OpenAPIConfig {
4
+ title?: string;
5
+ version?: string;
6
+ description?: string;
7
+ }
8
+ export interface RegisterOpenAPIOptions {
9
+ config?: OpenAPIConfig;
10
+ }
11
+ export declare const registerOpenAPI: (adapter: IFrameworkAdapter, options?: RegisterOpenAPIOptions) => Promise<void>;
12
+ export { type OpenAPISpec };
13
+ export declare type __ΩOpenAPIConfig = any[];
14
+ export declare type __ΩRegisterOpenAPIOptions = any[];
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,WAAW,EAId,MAAM,SAAS,CAAC;AAUjB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AA0GD,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,eAAO,MAAM,eAAe,YACf,iBAAiB,YACjB,sBAAsB,KAChC,OAAO,CAAC,IAAI,CA4Cd,CAAC;AAEF,OAAO,EAAE,KAAK,WAAW,EAAE,CAAC"}
@@ -0,0 +1,134 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ /*@ts-ignore*/
11
+ import { __ΩOpenAPISpec } from './types.js';
12
+ function __assignType(fn, args) {
13
+ fn.__type = args;
14
+ return fn;
15
+ }
16
+ import fs from 'fs';
17
+ import path from 'path';
18
+ import { createOpenAPIResponses, createOpenAPIParameters, createOpenAPIRequestBody, } from './helpers.js';
19
+ import { logger } from '../logger.js';
20
+ import { Get, Controller } from '../decorators.js';
21
+ import { MetadataStorage } from '../metadata.js';
22
+ const __ΩOpenAPIConfig = ['title', 'version', 'description', 'OpenAPIConfig', 'P&4!8&4"8&4#8Mw$y'];
23
+ export { __ΩOpenAPIConfig as __ΩOpenAPIConfig };
24
+ let OpenAPIController = class OpenAPIController {
25
+ cachedSpec = null;
26
+ config;
27
+ constructor(config = {}) {
28
+ this.config = config;
29
+ }
30
+ generateOpenAPISpec(allMetadata) {
31
+ if (this.cachedSpec)
32
+ return this.cachedSpec;
33
+ const paths = {};
34
+ const allTags = [];
35
+ const components = { schemas: {}, responses: {} };
36
+ for (const controllerMeta of allMetadata) {
37
+ const controllerTag = controllerMeta.path.split('/').filter(Boolean).pop() ||
38
+ 'Default';
39
+ allTags.push(controllerTag);
40
+ for (const routeMeta of controllerMeta.routes) {
41
+ const fullPath = (controllerMeta.path + routeMeta.path)
42
+ .replace(/\/+/g, '/')
43
+ .replace(/:([a-zA-Z0-9_]+)/g, '{$1}');
44
+ if (!paths[fullPath])
45
+ paths[fullPath] = {};
46
+ const __ΩHttpMethodKey = ["get", "put", "post", "delete", "patch", 'HttpMethodKey', 'P.!.".#.$.%Jw&y'];
47
+ const httpMethod = routeMeta.method.toLowerCase();
48
+ if (!['get', 'put', 'post', 'delete', 'patch'].includes(httpMethod))
49
+ throw new Error('Invalid HTTP method: ' + httpMethod);
50
+ if (paths[fullPath][httpMethod])
51
+ logger.warn(`OpenAPI: Duplicate operation detected for ${httpMethod.toUpperCase()} ${fullPath}. Overwriting.`);
52
+ const operation = {
53
+ tags: [controllerTag],
54
+ operationId: `${routeMeta.methodName}`,
55
+ parameters: createOpenAPIParameters(routeMeta.parameters, components),
56
+ requestBody: createOpenAPIRequestBody(routeMeta.parameters, components),
57
+ responses: createOpenAPIResponses(routeMeta, components),
58
+ summary: `${controllerTag}_${routeMeta.methodName}`,
59
+ };
60
+ if (operation.parameters?.length === 0)
61
+ delete operation.parameters;
62
+ paths[fullPath][httpMethod] = operation;
63
+ }
64
+ }
65
+ this.cachedSpec = {
66
+ openapi: '3.0.3',
67
+ info: {
68
+ title: this.config.title || 'API',
69
+ version: this.config.version || '1.0.0',
70
+ description: this.config.description ||
71
+ 'API documentation generated by Constantia',
72
+ },
73
+ tags: allTags.map(__assignType((tag) => ({
74
+ name: tag,
75
+ description: `Operations related to ${tag}`,
76
+ }), ['tag', '', 'P"2!"/"'])),
77
+ paths: paths,
78
+ components: components,
79
+ };
80
+ return this.cachedSpec;
81
+ }
82
+ async getOpenAPISpec() {
83
+ const allMetadata = Array.from(MetadataStorage.getInstance().controllers.values()).filter(__assignType((meta) => meta.path !== '/openapi.json', ['meta', '', 'P"2!"/"']));
84
+ return this.generateOpenAPISpec(allMetadata);
85
+ }
86
+ static __type = [() => __ΩOpenAPISpec, 'cachedSpec', function () { return null; }, () => __ΩOpenAPIConfig, 'config', () => __ΩOpenAPIConfig, () => ({}), 'constructor', 'ControllerMetadata', 'allMetadata', () => __ΩOpenAPISpec, 'generateOpenAPISpec', () => __ΩOpenAPISpec, 'getOpenAPISpec', 'OpenAPIController', 'Pn!,J3";>#n$3%;Pn&2%>\'"0(P"w)F2*n+0,;Pn-`0.5w/'];
87
+ };
88
+ __decorate([
89
+ Get(),
90
+ __metadata("design:type", Function),
91
+ __metadata("design:paramtypes", []),
92
+ __metadata("design:returntype", Promise)
93
+ ], OpenAPIController.prototype, "getOpenAPISpec", null);
94
+ OpenAPIController = __decorate([
95
+ Controller('/openapi.json', false),
96
+ __metadata("design:paramtypes", [Object])
97
+ ], OpenAPIController);
98
+ const __ΩRegisterOpenAPIOptions = [() => __ΩOpenAPIConfig, 'config', 'RegisterOpenAPIOptions', 'Pn!4"8Mw#y'];
99
+ export { __ΩRegisterOpenAPIOptions as __ΩRegisterOpenAPIOptions };
100
+ export const registerOpenAPI = __assignType(async (adapter, options = {}) => {
101
+ const metadata = MetadataStorage.getInstance();
102
+ metadata.addController(OpenAPIController, '/openapi.json');
103
+ const args = process.argv.slice(2);
104
+ let onlyGenerate = false;
105
+ let specFileArgIndex = args.indexOf('--generate-spec');
106
+ if (specFileArgIndex === -1) {
107
+ specFileArgIndex = args.indexOf('--only-generate-spec');
108
+ onlyGenerate = specFileArgIndex !== -1;
109
+ }
110
+ if (specFileArgIndex !== -1) {
111
+ let specFilePath = args[specFileArgIndex + 1];
112
+ if (!specFilePath || specFilePath.startsWith('--'))
113
+ specFilePath = './openapi.json';
114
+ const fullPath = path.resolve(specFilePath);
115
+ const dirPath = path.dirname(fullPath);
116
+ const controller = new OpenAPIController(options.config);
117
+ const spec = await controller.getOpenAPISpec();
118
+ await fs.promises.mkdir(dirPath, { recursive: true });
119
+ await fs.promises.writeFile(fullPath, JSON.stringify(spec, null, 2));
120
+ const pathParts = fullPath.split('/').filter(Boolean);
121
+ const lastThreeDirs = pathParts.slice(-3).join('/');
122
+ logger.info(`OpenAPI spec written to ...${lastThreeDirs}`);
123
+ if (onlyGenerate)
124
+ process.exit(0);
125
+ }
126
+ const openAPIControllerMetadata = metadata.controllers.get(OpenAPIController);
127
+ if (!openAPIControllerMetadata)
128
+ throw new Error('Failed to register OpenAPI controller');
129
+ adapter.registerControllers([
130
+ [openAPIControllerMetadata],
131
+ [OpenAPIController],
132
+ ]);
133
+ }, ['IFrameworkAdapter', 'adapter', () => __ΩRegisterOpenAPIOptions, 'options', () => ({}), '', 'P"w!2"n#2$>%$`/&']);
134
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ export interface OpenAPISpec {
2
+ openapi: string;
3
+ info: InfoObject;
4
+ paths: PathsObject;
5
+ components?: ComponentsObject;
6
+ tags?: {
7
+ name: string;
8
+ description?: string;
9
+ }[];
10
+ servers?: ServerObject[];
11
+ }
12
+ export interface InfoObject {
13
+ title: string;
14
+ version: string;
15
+ description?: string;
16
+ }
17
+ export interface PathsObject {
18
+ [path: string]: PathItemObject;
19
+ }
20
+ export interface PathItemObject {
21
+ get?: OperationObject;
22
+ put?: OperationObject;
23
+ post?: OperationObject;
24
+ delete?: OperationObject;
25
+ patch?: OperationObject;
26
+ parameters?: (ParameterObject | ReferenceObject)[];
27
+ }
28
+ export interface OperationObject {
29
+ tags?: string[];
30
+ summary?: string;
31
+ description?: string;
32
+ operationId?: string;
33
+ parameters?: (ParameterObject | ReferenceObject)[];
34
+ requestBody?: RequestBodyObject | ReferenceObject;
35
+ responses: ResponsesObject;
36
+ deprecated?: boolean;
37
+ }
38
+ export interface ParameterObject {
39
+ name: string;
40
+ in: 'query' | 'header' | 'path' | 'cookie';
41
+ description?: string;
42
+ required?: boolean;
43
+ deprecated?: boolean;
44
+ allowEmptyValue?: boolean;
45
+ schema?: SchemaObject | ReferenceObject;
46
+ }
47
+ export interface RequestBodyObject {
48
+ description?: string;
49
+ content: {
50
+ [mediaType: string]: MediaTypeObject;
51
+ };
52
+ required?: boolean;
53
+ }
54
+ export interface MediaTypeObject {
55
+ schema?: SchemaObject | ReferenceObject;
56
+ }
57
+ export interface ResponsesObject {
58
+ default?: ResponseObject | ReferenceObject;
59
+ [statusCode: string]: ResponseObject | ReferenceObject | undefined;
60
+ }
61
+ export interface ResponseObject {
62
+ description: string;
63
+ headers?: {
64
+ [headerName: string]: HeaderObject | ReferenceObject;
65
+ };
66
+ content?: {
67
+ [mediaType: string]: MediaTypeObject;
68
+ };
69
+ }
70
+ export interface SchemaObject {
71
+ type?: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
72
+ format?: string;
73
+ items?: SchemaObject | ReferenceObject;
74
+ properties?: {
75
+ [propertyName: string]: SchemaObject | ReferenceObject;
76
+ };
77
+ required?: string[];
78
+ nullable?: boolean;
79
+ oneOf?: (SchemaObject | ReferenceObject)[];
80
+ allOf?: (SchemaObject | ReferenceObject)[];
81
+ anyOf?: (SchemaObject | ReferenceObject)[];
82
+ description?: string;
83
+ example?: unknown;
84
+ minItems?: number;
85
+ maxItems?: number;
86
+ additionalProperties?: boolean | SchemaObject | ReferenceObject;
87
+ }
88
+ export interface ComponentsObject {
89
+ schemas?: {
90
+ [schemaName: string]: SchemaObject | ReferenceObject;
91
+ };
92
+ responses?: {
93
+ [responseName: string]: ResponseObject | ReferenceObject;
94
+ };
95
+ parameters?: {
96
+ [parameterName: string]: ParameterObject | ReferenceObject;
97
+ };
98
+ requestBodies?: {
99
+ [requestBodyName: string]: RequestBodyObject | ReferenceObject;
100
+ };
101
+ headers?: {
102
+ [headerName: string]: HeaderObject | ReferenceObject;
103
+ };
104
+ }
105
+ export interface ServerObject {
106
+ url: string;
107
+ description?: string;
108
+ }
109
+ export interface HeaderObject extends Omit<ParameterObject, 'name' | 'in'> {
110
+ }
111
+ export interface ReferenceObject {
112
+ $ref: string;
113
+ }
114
+ export declare type __ΩOpenAPISpec = any[];
115
+ export declare type __ΩInfoObject = any[];
116
+ export declare type __ΩPathsObject = any[];
117
+ export declare type __ΩPathItemObject = any[];
118
+ export declare type __ΩOperationObject = any[];
119
+ export declare type __ΩParameterObject = any[];
120
+ export declare type __ΩRequestBodyObject = any[];
121
+ export declare type __ΩMediaTypeObject = any[];
122
+ export declare type __ΩResponsesObject = any[];
123
+ export declare type __ΩResponseObject = any[];
124
+ export declare type __ΩSchemaObject = any[];
125
+ export declare type __ΩComponentsObject = any[];
126
+ export declare type __ΩServerObject = any[];
127
+ export declare type __ΩHeaderObject = any[];
128
+ export declare type __ΩReferenceObject = any[];
129
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/openapi/types.ts"],"names":[],"mappings":"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"}