@fluojs/openapi 1.0.0-beta.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.
@@ -0,0 +1,180 @@
1
+ function _applyDecs(e, t, n, r, o, i) { var a, c, u, s, f, l, p, d = Symbol.metadata || Symbol.for("Symbol.metadata"), m = Object.defineProperty, h = Object.create, y = [h(null), h(null)], v = t.length; function g(t, n, r) { return function (o, i) { n && (i = o, o = e); for (var a = 0; a < t.length; a++) i = t[a].apply(o, r ? [i] : []); return r ? i : o; }; } function b(e, t, n, r) { if ("function" != typeof e && (r || void 0 !== e)) throw new TypeError(t + " must " + (n || "be") + " a function" + (r ? "" : " or undefined")); return e; } function applyDec(e, t, n, r, o, i, u, s, f, l, p) { function d(e) { if (!p(e)) throw new TypeError("Attempted to access private element on non-instance"); } var h = [].concat(t[0]), v = t[3], w = !u, D = 1 === o, S = 3 === o, j = 4 === o, E = 2 === o; function I(t, n, r) { return function (o, i) { return n && (i = o, o = e), r && r(o), P[t].call(o, i); }; } if (!w) { var P = {}, k = [], F = S ? "get" : j || D ? "set" : "value"; if (f ? (l || D ? P = { get: _setFunctionName(function () { return v(this); }, r, "get"), set: function (e) { t[4](this, e); } } : P[F] = v, l || _setFunctionName(P[F], r, E ? "" : F)) : l || (P = Object.getOwnPropertyDescriptor(e, r)), !l && !f) { if ((c = y[+s][r]) && 7 !== (c ^ o)) throw Error("Decorating two elements with the same name (" + P[F].name + ") is not supported yet"); y[+s][r] = o < 3 ? 1 : o; } } for (var N = e, O = h.length - 1; O >= 0; O -= n ? 2 : 1) { var T = b(h[O], "A decorator", "be", !0), z = n ? h[O - 1] : void 0, A = {}, H = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: r, metadata: a, addInitializer: function (e, t) { if (e.v) throw new TypeError("attempted to call addInitializer after decoration was finished"); b(t, "An initializer", "be", !0), i.push(t); }.bind(null, A) }; if (w) c = T.call(z, N, H), A.v = 1, b(c, "class decorators", "return") && (N = c);else if (H.static = s, H.private = f, c = H.access = { has: f ? p.bind() : function (e) { return r in e; } }, j || (c.get = f ? E ? function (e) { return d(e), P.value; } : I("get", 0, d) : function (e) { return e[r]; }), E || S || (c.set = f ? I("set", 0, d) : function (e, t) { e[r] = t; }), N = T.call(z, D ? { get: P.get, set: P.set } : P[F], H), A.v = 1, D) { if ("object" == typeof N && N) (c = b(N.get, "accessor.get")) && (P.get = c), (c = b(N.set, "accessor.set")) && (P.set = c), (c = b(N.init, "accessor.init")) && k.unshift(c);else if (void 0 !== N) throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined"); } else b(N, (l ? "field" : "method") + " decorators", "return") && (l ? k.unshift(N) : P[F] = N); } return o < 2 && u.push(g(k, s, 1), g(i, s, 0)), l || w || (f ? D ? u.splice(-1, 0, I("get", s), I("set", s)) : u.push(E ? P[F] : b.call.bind(P[F])) : m(e, r, P)), N; } function w(e) { return m(e, d, { configurable: !0, enumerable: !0, value: a }); } return void 0 !== i && (a = i[d]), a = h(null == a ? null : a), f = [], l = function (e) { e && f.push(g(e)); }, p = function (t, r) { for (var i = 0; i < n.length; i++) { var a = n[i], c = a[1], l = 7 & c; if ((8 & c) == t && !l == r) { var p = a[2], d = !!a[3], m = 16 & c; applyDec(t ? e : e.prototype, a, m, d ? "#" + p : _toPropertyKey(p), l, l < 2 ? [] : t ? s = s || [] : u = u || [], f, !!t, d, r, t && d ? function (t) { return _checkInRHS(t) === e; } : o); } } }, p(8, 0), p(0, 0), p(8, 1), p(0, 1), l(u), l(s), c = f, v || w(e), { e: c, get c() { var n = []; return v && [w(e = applyDec(e, [t], r, e.name, 5, n)), g(n, 1)]; } }; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
5
+ function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
6
+ import { Controller, Get, NotFoundException, createHandlerMapping } from '@fluojs/http';
7
+ import { Inject } from '@fluojs/core';
8
+ import { defineModule } from '@fluojs/runtime';
9
+ import { OpenApiHandlerRegistry } from './handler-registry.js';
10
+ import { buildOpenApiDocument } from './schema-builder.js';
11
+ const SWAGGER_UI_DIST_VERSION = '5.32.2';
12
+ const SWAGGER_UI_DIST_BASE_URL = `https://unpkg.com/swagger-ui-dist@${SWAGGER_UI_DIST_VERSION}`;
13
+ const SWAGGER_UI_CSS_URL = `${SWAGGER_UI_DIST_BASE_URL}/swagger-ui.css`;
14
+ const SWAGGER_UI_BUNDLE_JS_URL = `${SWAGGER_UI_DIST_BASE_URL}/swagger-ui-bundle.js`;
15
+
16
+ /**
17
+ * Public options for `OpenApiModule.forRoot(...)` and `OpenApiModule.forRootAsync(...)`.
18
+ *
19
+ * @remarks
20
+ * Keep README examples for full controller/module workflows. These options are
21
+ * intended to document the runtime hooks that shape the generated document.
22
+ */
23
+
24
+ function escapeHtml(value) {
25
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;');
26
+ }
27
+ function createSwaggerUiHtml(title) {
28
+ return `<!doctype html>
29
+ <html lang="en">
30
+ <head>
31
+ <meta charset="utf-8" />
32
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
33
+ <title>${escapeHtml(title)}</title>
34
+ <link rel="stylesheet" href="${SWAGGER_UI_CSS_URL}" />
35
+ </head>
36
+ <body>
37
+ <div id="swagger-ui"></div>
38
+ <script src="${SWAGGER_UI_BUNDLE_JS_URL}" crossorigin></script>
39
+ <script>
40
+ const specUrl = window.location.pathname.replace(/\/docs\/?$/, '/openapi.json');
41
+ window.ui = SwaggerUIBundle({
42
+ url: specUrl,
43
+ dom_id: '#swagger-ui'
44
+ });
45
+ </script>
46
+ </body>
47
+ </html>`;
48
+ }
49
+ function isOpenApiModuleOptions(value) {
50
+ if (typeof value !== 'object' || value === null) {
51
+ return false;
52
+ }
53
+ const options = value;
54
+ return typeof options.title === 'string' && typeof options.version === 'string';
55
+ }
56
+ function resolveOpenApiDescriptors(options) {
57
+ const sourceDescriptors = createHandlerMapping([...(options.sources ?? [])]).descriptors;
58
+ const explicitDescriptors = [...(options.descriptors ?? [])];
59
+ if (sourceDescriptors.length === 0) {
60
+ return explicitDescriptors;
61
+ }
62
+ if (explicitDescriptors.length === 0) {
63
+ return sourceDescriptors;
64
+ }
65
+ return [...sourceDescriptors, ...explicitDescriptors];
66
+ }
67
+
68
+ /**
69
+ * Runtime module entrypoint for serving OpenAPI JSON and optional Swagger UI.
70
+ */
71
+ export class OpenApiModule {
72
+ /**
73
+ * Registers OpenAPI providers using static options.
74
+ *
75
+ * @param options Static module options used to build and serve the OpenAPI document.
76
+ * @returns A runtime module type that can be imported in `@Module({ imports: [...] })`.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * OpenApiModule.forRoot({
81
+ * title: 'Public API',
82
+ * version: '1.0.0',
83
+ * ui: true,
84
+ * });
85
+ * ```
86
+ */
87
+ static forRoot(options) {
88
+ return this.createModule({
89
+ scope: 'singleton',
90
+ useValue: options
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Registers OpenAPI providers using an async DI factory.
96
+ *
97
+ * @param options Async options factory plus optional DI `inject` token list.
98
+ * @returns A runtime module type that resolves options at bootstrap time.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * OpenApiModule.forRootAsync({
103
+ * inject: [ConfigService],
104
+ * useFactory: (config) => ({
105
+ * title: config.get('APP_NAME'),
106
+ * version: config.get('APP_VERSION'),
107
+ * }),
108
+ * });
109
+ * ```
110
+ */
111
+ static forRootAsync(options) {
112
+ return this.createModule({
113
+ inject: options.inject,
114
+ scope: 'singleton',
115
+ useFactory: options.useFactory
116
+ });
117
+ }
118
+ static createModule(optionsProvider) {
119
+ let _initProto, _initClass;
120
+ const openApiModuleOptionsToken = Symbol('fluo.openapi.module-options');
121
+ const openApiDocumentToken = Symbol('fluo.openapi.document');
122
+ let _OpenApiController;
123
+ class OpenApiController {
124
+ static {
125
+ ({
126
+ e: [_initProto],
127
+ c: [_OpenApiController, _initClass]
128
+ } = _applyDecs(this, [Controller(''), Inject(openApiDocumentToken, openApiModuleOptionsToken)], [[Get('/openapi.json'), 2, "getDocument"], [Get('/docs'), 2, "getSwaggerUi"]]));
129
+ }
130
+ constructor(document, options) {
131
+ this.document = document;
132
+ this.options = options;
133
+ _initProto(this);
134
+ }
135
+ getDocument() {
136
+ return this.document;
137
+ }
138
+ getSwaggerUi(_input, context) {
139
+ if (!(this.options.ui ?? false)) {
140
+ throw new NotFoundException('Swagger UI is disabled.');
141
+ }
142
+ context.response.setHeader('content-type', 'text/html; charset=utf-8');
143
+ return createSwaggerUiHtml(this.options.title);
144
+ }
145
+ static {
146
+ _initClass();
147
+ }
148
+ }
149
+ class OpenApiRuntimeModule {}
150
+ defineModule(OpenApiRuntimeModule, {
151
+ controllers: [_OpenApiController],
152
+ providers: [{
153
+ ...optionsProvider,
154
+ provide: openApiModuleOptionsToken
155
+ }, {
156
+ inject: [openApiModuleOptionsToken],
157
+ provide: openApiDocumentToken,
158
+ scope: 'singleton',
159
+ useFactory: (...deps) => {
160
+ const [options] = deps;
161
+ if (!isOpenApiModuleOptions(options)) {
162
+ throw new Error('OpenApiModule options provider must resolve title and version.');
163
+ }
164
+ const registry = new OpenApiHandlerRegistry();
165
+ registry.setDescriptors(resolveOpenApiDescriptors(options));
166
+ return buildOpenApiDocument({
167
+ documentTransform: options.documentTransform,
168
+ defaultErrorResponsesPolicy: options.defaultErrorResponsesPolicy,
169
+ descriptors: registry.getDescriptors(),
170
+ extraModels: options.extraModels,
171
+ securitySchemes: options.securitySchemes,
172
+ title: options.title,
173
+ version: options.version
174
+ });
175
+ }
176
+ }]
177
+ });
178
+ return OpenApiRuntimeModule;
179
+ }
180
+ }
@@ -0,0 +1,187 @@
1
+ import { type Constructor } from '@fluojs/core';
2
+ import type { HandlerDescriptor } from '@fluojs/http';
3
+ /**
4
+ * OpenAPI `info` object emitted in the generated document.
5
+ */
6
+ export interface OpenApiInfoObject {
7
+ title: string;
8
+ version: string;
9
+ }
10
+ /**
11
+ * OpenAPI response object emitted for an operation status code.
12
+ */
13
+ export interface OpenApiResponseObject {
14
+ description: string;
15
+ content?: Record<string, OpenApiMediaTypeObject>;
16
+ }
17
+ /**
18
+ * OpenAPI security requirement object emitted on an operation.
19
+ */
20
+ export interface OpenApiSecurityRequirementObject {
21
+ [scheme: string]: string[];
22
+ }
23
+ /**
24
+ * JSON Schema-compatible OpenAPI schema object used across parameters, bodies, and components.
25
+ */
26
+ export interface OpenApiSchemaObject {
27
+ $ref?: string;
28
+ type?: 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string';
29
+ format?: string;
30
+ description?: string;
31
+ allOf?: OpenApiSchemaObject[];
32
+ oneOf?: OpenApiSchemaObject[];
33
+ anyOf?: OpenApiSchemaObject[];
34
+ not?: OpenApiSchemaObject;
35
+ discriminator?: {
36
+ propertyName: string;
37
+ mapping?: Record<string, string>;
38
+ };
39
+ properties?: Record<string, OpenApiSchemaObject>;
40
+ items?: OpenApiSchemaObject;
41
+ required?: string[];
42
+ enum?: unknown[];
43
+ additionalProperties?: boolean | OpenApiSchemaObject;
44
+ minimum?: number;
45
+ maximum?: number;
46
+ minLength?: number;
47
+ maxLength?: number;
48
+ }
49
+ /**
50
+ * OpenAPI parameter object emitted for path, query, header, or cookie bindings.
51
+ */
52
+ export interface OpenApiParameterObject {
53
+ name: string;
54
+ in: 'cookie' | 'header' | 'path' | 'query';
55
+ required?: boolean;
56
+ schema: OpenApiSchemaObject;
57
+ description?: string;
58
+ }
59
+ /**
60
+ * OpenAPI media-type object wrapping a schema.
61
+ */
62
+ export interface OpenApiMediaTypeObject {
63
+ schema: OpenApiSchemaObject;
64
+ }
65
+ /**
66
+ * OpenAPI request-body object emitted for handler body bindings.
67
+ */
68
+ export interface OpenApiRequestBodyObject {
69
+ description?: string;
70
+ content: Record<string, OpenApiMediaTypeObject>;
71
+ required?: boolean;
72
+ }
73
+ /**
74
+ * OpenAPI security scheme object registered in `components.securitySchemes`.
75
+ */
76
+ export interface OpenApiSecuritySchemeObject {
77
+ type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect';
78
+ description?: string;
79
+ in?: 'cookie' | 'header' | 'query';
80
+ name?: string;
81
+ scheme?: string;
82
+ bearerFormat?: string;
83
+ flows?: {
84
+ implicit?: {
85
+ authorizationUrl: string;
86
+ refreshUrl?: string;
87
+ scopes: Record<string, string>;
88
+ };
89
+ password?: {
90
+ tokenUrl: string;
91
+ refreshUrl?: string;
92
+ scopes: Record<string, string>;
93
+ };
94
+ clientCredentials?: {
95
+ tokenUrl: string;
96
+ refreshUrl?: string;
97
+ scopes: Record<string, string>;
98
+ };
99
+ authorizationCode?: {
100
+ authorizationUrl: string;
101
+ tokenUrl: string;
102
+ refreshUrl?: string;
103
+ scopes: Record<string, string>;
104
+ };
105
+ };
106
+ openIdConnectUrl?: string;
107
+ }
108
+ /**
109
+ * OpenAPI components object emitted for shared schemas and security schemes.
110
+ */
111
+ export interface OpenApiComponentsObject {
112
+ schemas?: Record<string, OpenApiSchemaObject>;
113
+ securitySchemes?: Record<string, OpenApiSecuritySchemeObject>;
114
+ }
115
+ /**
116
+ * OpenAPI operation object emitted for a single HTTP method on a path.
117
+ */
118
+ export interface OpenApiOperationObject {
119
+ operationId: string;
120
+ tags: string[];
121
+ summary?: string;
122
+ description?: string;
123
+ deprecated?: boolean;
124
+ parameters?: OpenApiParameterObject[];
125
+ responses: Record<string, OpenApiResponseObject>;
126
+ requestBody?: OpenApiRequestBodyObject;
127
+ security?: OpenApiSecurityRequirementObject[];
128
+ }
129
+ /**
130
+ * OpenAPI path-item object containing one or more HTTP method operations.
131
+ */
132
+ export interface OpenApiPathItemObject {
133
+ [method: string]: OpenApiOperationObject | undefined;
134
+ }
135
+ /**
136
+ * Root OpenAPI 3.1.0 document produced by `buildOpenApiDocument(...)`.
137
+ */
138
+ export interface OpenApiDocument {
139
+ openapi: '3.1.0';
140
+ info: OpenApiInfoObject;
141
+ paths: Record<string, OpenApiPathItemObject>;
142
+ components?: OpenApiComponentsObject;
143
+ }
144
+ /**
145
+ * Input used by `buildOpenApiDocument(...)` to assemble an OpenAPI document.
146
+ *
147
+ * @remarks
148
+ * Most applications should prefer `OpenApiModule.forRoot(...)`. Use this lower
149
+ * level builder when tests or custom tooling need a document without mounting
150
+ * the OpenAPI runtime module.
151
+ */
152
+ export interface BuildOpenApiDocumentOptions {
153
+ defaultErrorResponsesPolicy?: DefaultErrorResponsesPolicy;
154
+ descriptors: readonly HandlerDescriptor[];
155
+ title: string;
156
+ version: string;
157
+ securitySchemes?: Record<string, OpenApiSecuritySchemeObject>;
158
+ extraModels?: Constructor[];
159
+ documentTransform?: (document: OpenApiDocument) => OpenApiDocument;
160
+ }
161
+ /**
162
+ * Controls whether common framework error responses are injected automatically.
163
+ */
164
+ export type DefaultErrorResponsesPolicy = 'inject' | 'omit';
165
+ /**
166
+ * Build an OpenAPI 3.1.0 document directly from handler descriptors.
167
+ *
168
+ * @param options Document-generation input including handlers, metadata, and optional schema transforms.
169
+ * @returns A generated OpenAPI document ready to serialize or serve.
170
+ */
171
+ /**
172
+ * Build an OpenAPI 3.1 document from discovered Fluo HTTP handler descriptors.
173
+ *
174
+ * @param options Document assembly options, descriptors, and optional schema transforms.
175
+ * @returns A fully normalized OpenAPI document ready to serve or snapshot in tests.
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * const document = buildOpenApiDocument({
180
+ * descriptors,
181
+ * title: 'Public API',
182
+ * version: '1.0.0',
183
+ * });
184
+ * ```
185
+ */
186
+ export declare function buildOpenApiDocument(options: BuildOpenApiDocumentOptions): OpenApiDocument;
187
+ //# sourceMappingURL=schema-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-builder.d.ts","sourceRoot":"","sources":["../src/schema-builder.ts"],"names":[],"mappings":"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"}