|
@@ -0,0 +1,793 @@
|
|
|
|
|
+"use strict";
|
|
|
|
|
+var __defProp = Object.defineProperty;
|
|
|
|
|
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
|
|
+var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
|
|
|
+var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
|
|
|
+var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
|
|
|
+var __export = (target, all) => {
|
|
|
|
|
+ for (var name in all)
|
|
|
|
|
+ __defProp(target, name, { get: all[name], enumerable: true });
|
|
|
|
|
+};
|
|
|
|
|
+var __copyProps = (to, from, except, desc) => {
|
|
|
|
|
+ if (from && typeof from === "object" || typeof from === "function") {
|
|
|
|
|
+ for (let key of __getOwnPropNames(from))
|
|
|
|
|
+ if (!__hasOwnProp.call(to, key) && key !== except)
|
|
|
|
|
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
|
|
|
+ }
|
|
|
|
|
+ return to;
|
|
|
|
|
+};
|
|
|
|
|
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
|
+
|
|
|
|
|
+// src/index.js
|
|
|
|
|
+var index_exports = {};
|
|
|
|
|
+__export(index_exports, {
|
|
|
|
|
+ OAApiKeyLocation: () => OAApiKeyLocation,
|
|
|
|
|
+ OAComponentType: () => OAComponentType,
|
|
|
|
|
+ OADataFormat: () => OADataFormat,
|
|
|
|
|
+ OADataType: () => OADataType,
|
|
|
|
|
+ OADocumentBuilder: () => OADocumentBuilder,
|
|
|
|
|
+ OADocumentScope: () => OADocumentScope,
|
|
|
|
|
+ OAMediaType: () => OAMediaType,
|
|
|
|
|
+ OAOperationMethod: () => OAOperationMethod,
|
|
|
|
|
+ OAParameterLocation: () => OAParameterLocation,
|
|
|
|
|
+ OAParameterStyle: () => OAParameterStyle,
|
|
|
|
|
+ OASecuritySchemeType: () => OASecuritySchemeType,
|
|
|
|
|
+ OA_COMPONENT_TYPE_TO_KEY_MAP: () => OA_COMPONENT_TYPE_TO_KEY_MAP,
|
|
|
|
|
+ OPENAPI_VERSION: () => OPENAPI_VERSION,
|
|
|
|
|
+ oaCallbackRef: () => oaCallbackRef,
|
|
|
|
|
+ oaExampleRef: () => oaExampleRef,
|
|
|
|
|
+ oaLinkRef: () => oaLinkRef,
|
|
|
|
|
+ oaParameterRef: () => oaParameterRef,
|
|
|
|
|
+ oaPathItemRef: () => oaPathItemRef,
|
|
|
|
|
+ oaRef: () => oaRef,
|
|
|
|
|
+ oaRequestBodyRef: () => oaRequestBodyRef,
|
|
|
|
|
+ oaResponseRef: () => oaResponseRef,
|
|
|
|
|
+ oaSchemaRef: () => oaSchemaRef,
|
|
|
|
|
+ oaSecuritySchemeRef: () => oaSecuritySchemeRef
|
|
|
|
|
+});
|
|
|
|
|
+module.exports = __toCommonJS(index_exports);
|
|
|
|
|
+
|
|
|
|
|
+// src/constants.js
|
|
|
|
|
+var OPENAPI_VERSION = "3.1.0";
|
|
|
|
|
+
|
|
|
|
|
+// src/utils/oa-ref.js
|
|
|
|
|
+var import_js_format = require("@e22m4u/js-format");
|
|
|
|
|
+var OAComponentType = {
|
|
|
|
|
+ SCHEMA: "schema",
|
|
|
|
|
+ RESPONSE: "response",
|
|
|
|
|
+ PARAMETER: "parameter",
|
|
|
|
|
+ EXAMPLE: "example",
|
|
|
|
|
+ REQUEST_BODY: "requestBody",
|
|
|
|
|
+ HEADER: "header",
|
|
|
|
|
+ SECURITY_SCHEME: "securityScheme",
|
|
|
|
|
+ LINK: "link",
|
|
|
|
|
+ CALLBACK: "callback",
|
|
|
|
|
+ PATH_ITEM: "pathItem"
|
|
|
|
|
+};
|
|
|
|
|
+var OA_COMPONENT_TYPE_TO_KEY_MAP = {
|
|
|
|
|
+ [OAComponentType.SCHEMA]: "schemas",
|
|
|
|
|
+ [OAComponentType.RESPONSE]: "responses",
|
|
|
|
|
+ [OAComponentType.PARAMETER]: "parameters",
|
|
|
|
|
+ [OAComponentType.EXAMPLE]: "examples",
|
|
|
|
|
+ [OAComponentType.REQUEST_BODY]: "requestBodies",
|
|
|
|
|
+ [OAComponentType.HEADER]: "headers",
|
|
|
|
|
+ [OAComponentType.SECURITY_SCHEME]: "securitySchemes",
|
|
|
|
|
+ [OAComponentType.LINK]: "links",
|
|
|
|
|
+ [OAComponentType.CALLBACK]: "callbacks",
|
|
|
|
|
+ [OAComponentType.PATH_ITEM]: "pathItems"
|
|
|
|
|
+};
|
|
|
|
|
+function oaRef(name, type) {
|
|
|
|
|
+ if (!name || typeof name !== "string") {
|
|
|
|
|
+ throw new import_js_format.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "name" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ name
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!type || typeof type !== "string") {
|
|
|
|
|
+ throw new import_js_format.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "type" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ type
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ const key = OA_COMPONENT_TYPE_TO_KEY_MAP[type];
|
|
|
|
|
+ if (!key) {
|
|
|
|
|
+ throw new import_js_format.InvalidArgumentError("Component type %v is not supported.", type);
|
|
|
|
|
+ }
|
|
|
|
|
+ return { $ref: `#/components/${key}/${name}` };
|
|
|
|
|
+}
|
|
|
|
|
+__name(oaRef, "oaRef");
|
|
|
|
|
+var oaSchemaRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.SCHEMA), "oaSchemaRef");
|
|
|
|
|
+var oaResponseRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.RESPONSE), "oaResponseRef");
|
|
|
|
|
+var oaParameterRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.PARAMETER), "oaParameterRef");
|
|
|
|
|
+var oaExampleRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.EXAMPLE), "oaExampleRef");
|
|
|
|
|
+var oaRequestBodyRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.REQUEST_BODY), "oaRequestBodyRef");
|
|
|
|
|
+var oaSecuritySchemeRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.SECURITY_SCHEME), "oaSecuritySchemeRef");
|
|
|
|
|
+var oaLinkRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.LINK), "oaLinkRef");
|
|
|
|
|
+var oaCallbackRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.CALLBACK), "oaCallbackRef");
|
|
|
|
|
+var oaPathItemRef = /* @__PURE__ */ __name((name) => oaRef(name, OAComponentType.PATH_ITEM), "oaPathItemRef");
|
|
|
|
|
+
|
|
|
|
|
+// src/utils/join-path.js
|
|
|
|
|
+function joinPath(...segments) {
|
|
|
|
|
+ const path = segments.filter(Boolean).map((seg) => seg.replace(/(^\/|\/$)/g, "")).filter(Boolean).join("/");
|
|
|
|
|
+ return "/" + path;
|
|
|
|
|
+}
|
|
|
|
|
+__name(joinPath, "joinPath");
|
|
|
|
|
+
|
|
|
|
|
+// src/oa-document-scope.js
|
|
|
|
|
+var import_js_format4 = require("@e22m4u/js-format");
|
|
|
|
|
+
|
|
|
|
|
+// src/oa-document-builder.js
|
|
|
|
|
+var import_js_format3 = require("@e22m4u/js-format");
|
|
|
|
|
+
|
|
|
|
|
+// src/document-specification.js
|
|
|
|
|
+var OAOperationMethod = {
|
|
|
|
|
+ GET: "get",
|
|
|
|
|
+ PUT: "put",
|
|
|
|
|
+ POST: "post",
|
|
|
|
|
+ DELETE: "delete",
|
|
|
|
|
+ OPTIONS: "options",
|
|
|
|
|
+ HEAD: "head",
|
|
|
|
|
+ PATCH: "patch",
|
|
|
|
|
+ TRACE: "trace"
|
|
|
|
|
+};
|
|
|
|
|
+var OAParameterLocation = {
|
|
|
|
|
+ QUERY: "query",
|
|
|
|
|
+ HEADER: "header",
|
|
|
|
|
+ PATH: "path",
|
|
|
|
|
+ COOKIE: "cookie"
|
|
|
|
|
+};
|
|
|
|
|
+var OAParameterStyle = {
|
|
|
|
|
+ MATRIX: "matrix",
|
|
|
|
|
+ LABEL: "label",
|
|
|
|
|
+ FORM: "form",
|
|
|
|
|
+ SIMPLE: "simple",
|
|
|
|
|
+ SPACE_DELIMITED: "spaceDelimited",
|
|
|
|
|
+ PIPE_DELIMITED: "pipeDelimited",
|
|
|
|
|
+ DEEP_OBJECT: "deepObject"
|
|
|
|
|
+};
|
|
|
|
|
+var OADataType = {
|
|
|
|
|
+ STRING: "string",
|
|
|
|
|
+ NUMBER: "number",
|
|
|
|
|
+ INTEGER: "integer",
|
|
|
|
|
+ BOOLEAN: "boolean",
|
|
|
|
|
+ OBJECT: "object",
|
|
|
|
|
+ ARRAY: "array",
|
|
|
|
|
+ NULL: "null"
|
|
|
|
|
+};
|
|
|
|
|
+var OADataFormat = {
|
|
|
|
|
+ INT32: "int32",
|
|
|
|
|
+ INT64: "int64",
|
|
|
|
|
+ FLOAT: "float",
|
|
|
|
|
+ DOUBLE: "double",
|
|
|
|
|
+ PASSWORD: "password",
|
|
|
|
|
+ BINARY: "binary"
|
|
|
|
|
+};
|
|
|
|
|
+var OAMediaType = {
|
|
|
|
|
+ TEXT_PLAIN: "text/plain",
|
|
|
|
|
+ TEXT_HTML: "text/html",
|
|
|
|
|
+ APPLICATION_XML: "application/xml",
|
|
|
|
|
+ APPLICATION_JSON: "application/json",
|
|
|
|
|
+ MULTIPART_FORM_DATA: "multipart/form-data"
|
|
|
|
|
+};
|
|
|
|
|
+var OASecuritySchemeType = {
|
|
|
|
|
+ API_KEY: "apiKey",
|
|
|
|
|
+ HTTP: "http",
|
|
|
|
|
+ MUTUAL_TLS: "mutualTLS",
|
|
|
|
|
+ OAUTH_2: "oauth2",
|
|
|
|
|
+ OPEN_ID_CONNECT: "openIdConnect"
|
|
|
|
|
+};
|
|
|
|
|
+var OAApiKeyLocation = {
|
|
|
|
|
+ QUERY: "query",
|
|
|
|
|
+ HEADER: "header",
|
|
|
|
|
+ COOKIE: "cookie"
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// src/oa-document-builder.js
|
|
|
|
|
+var import_js_service = require("@e22m4u/js-service");
|
|
|
|
|
+
|
|
|
|
|
+// src/document-validators.js
|
|
|
|
|
+var import_js_format2 = require("@e22m4u/js-format");
|
|
|
|
|
+function validateShallowOADocumentObject(documentObject) {
|
|
|
|
|
+ if (!documentObject || typeof documentObject !== "object" || Array.isArray(documentObject)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ "OpenAPI Document Object must be an Object, but %v was given.",
|
|
|
|
|
+ documentObject
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!documentObject.openapi || typeof documentObject.openapi !== "string") {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "openapi" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ documentObject.openapi
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!documentObject.info || typeof documentObject.info !== "object" || Array.isArray(documentObject.info)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "info" must be an Object, but %v was given.',
|
|
|
|
|
+ documentObject.info
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.jsonSchemaDialect !== void 0) {
|
|
|
|
|
+ if (!documentObject.jsonSchemaDialect || typeof documentObject.jsonSchemaDialect !== "string") {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "jsonSchemaDialect" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ documentObject.jsonSchemaDialect
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.servers !== void 0) {
|
|
|
|
|
+ if (!Array.isArray(documentObject.servers)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "servers" must be an Array, but %v was given.',
|
|
|
|
|
+ documentObject.servers
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ documentObject.servers.forEach((serverObject, index) => {
|
|
|
|
|
+ if (!serverObject || typeof serverObject !== "object" || Array.isArray(serverObject)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Element "servers[%d]" must be an Object, but %v was given.',
|
|
|
|
|
+ index,
|
|
|
|
|
+ serverObject
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.paths !== void 0) {
|
|
|
|
|
+ if (!documentObject.paths || typeof documentObject.paths !== "object" || Array.isArray(documentObject.paths)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "paths" must be an Object, but %v was given.',
|
|
|
|
|
+ documentObject.paths
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.webhooks !== void 0) {
|
|
|
|
|
+ if (!documentObject.webhooks || typeof documentObject.webhooks !== "object" || Array.isArray(documentObject.webhooks)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "webhooks" must be an Object, but %v was given.',
|
|
|
|
|
+ documentObject.webhooks
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.components !== void 0) {
|
|
|
|
|
+ if (!documentObject.components || typeof documentObject.components !== "object" || Array.isArray(documentObject.components)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "components" must be an Object, but %v was given.',
|
|
|
|
|
+ documentObject.components
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.security !== void 0) {
|
|
|
|
|
+ if (!Array.isArray(documentObject.security)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "security" must be an Array, but %v was given.',
|
|
|
|
|
+ documentObject.security
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ documentObject.security.forEach((securityRequirementObject, index) => {
|
|
|
|
|
+ if (!securityRequirementObject || typeof securityRequirementObject !== "object" || Array.isArray(securityRequirementObject)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Element "security[%d]" must be an Object, but %v was given.',
|
|
|
|
|
+ index,
|
|
|
|
|
+ securityRequirementObject
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.tags !== void 0) {
|
|
|
|
|
+ if (!Array.isArray(documentObject.tags)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "tags" must be an Array, but %v was given.',
|
|
|
|
|
+ documentObject.tags
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ documentObject.tags.forEach((tagObject, index) => {
|
|
|
|
|
+ if (!tagObject || typeof tagObject !== "object" || Array.isArray(tagObject)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Element "tags[%d]" must be an Object, but %v was given.',
|
|
|
|
|
+ index,
|
|
|
|
|
+ tagObject
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ if (documentObject.externalDocs !== void 0) {
|
|
|
|
|
+ if (!documentObject.externalDocs || typeof documentObject.externalDocs !== "object" || Array.isArray(documentObject.externalDocs)) {
|
|
|
|
|
+ throw new import_js_format2.InvalidArgumentError(
|
|
|
|
|
+ 'Property "externalDocs" must be an Object, but %v was given.',
|
|
|
|
|
+ documentObject.externalDocs
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+__name(validateShallowOADocumentObject, "validateShallowOADocumentObject");
|
|
|
|
|
+
|
|
|
|
|
+// src/oa-document-builder.js
|
|
|
|
|
+var _OADocumentBuilder = class _OADocumentBuilder extends import_js_service.Service {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Document.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @private
|
|
|
|
|
+ * @type {object}
|
|
|
|
|
+ */
|
|
|
|
|
+ _document = {
|
|
|
|
|
+ openapi: OPENAPI_VERSION,
|
|
|
|
|
+ info: {
|
|
|
|
|
+ title: "API Documentation",
|
|
|
|
|
+ version: "0.0.1"
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Constructor.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {object} [containerOrDocument]
|
|
|
|
|
+ * @param {object} [document]
|
|
|
|
|
+ */
|
|
|
|
|
+ constructor(containerOrDocument, document) {
|
|
|
|
|
+ if ((0, import_js_service.isServiceContainer)(containerOrDocument)) {
|
|
|
|
|
+ super(containerOrDocument);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ super();
|
|
|
|
|
+ document = containerOrDocument;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (document !== void 0) {
|
|
|
|
|
+ if (!document || typeof document !== "object" || Array.isArray(document)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ "OpenAPI Document Object must be an Object, but %v was given.",
|
|
|
|
|
+ document
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ document = structuredClone(document);
|
|
|
|
|
+ if (!document.openapi) {
|
|
|
|
|
+ document.openapi = this._document.openapi;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!document.info) {
|
|
|
|
|
+ document.info = this._document.info;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!document.info || typeof document.info !== "object" || Array.isArray(document.info)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "info" must be an Object, but %v was given.',
|
|
|
|
|
+ document.info
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!document.info.title) {
|
|
|
|
|
+ document.info.title = this._document.info.title;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!document.info.version) {
|
|
|
|
|
+ document.info.version = this._document.info.version;
|
|
|
|
|
+ }
|
|
|
|
|
+ validateShallowOADocumentObject(document);
|
|
|
|
|
+ this._document = document;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {string} targetKey
|
|
|
|
|
+ * @param {string} componentKey
|
|
|
|
|
+ * @param {string} definitionLabel
|
|
|
|
|
+ * @param {object} definition
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ _defineComponent(targetKey, componentKey, definitionLabel, definition) {
|
|
|
|
|
+ if (!targetKey || typeof targetKey !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "targetKey" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ targetKey
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!componentKey || typeof componentKey !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "componentKey" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ componentKey
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!definitionLabel || typeof definitionLabel !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "definitionLabel" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ definitionLabel
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!definition || typeof definition !== "object" || Array.isArray(definition)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ "%s Definition must be an Object, but %v was given.",
|
|
|
|
|
+ definitionLabel,
|
|
|
|
|
+ definition
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!definition.name || typeof definition.name !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "name" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ definition.name
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ const component = definition[componentKey];
|
|
|
|
|
+ if (!component || typeof component !== "object" || Array.isArray(component)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ "Property %v must be an Object, but %v was given.",
|
|
|
|
|
+ componentKey,
|
|
|
|
|
+ component
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!this._document.components) {
|
|
|
|
|
+ this._document.components = {};
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!this._document.components[targetKey]) {
|
|
|
|
|
+ this._document.components[targetKey] = {};
|
|
|
|
|
+ }
|
|
|
|
|
+ this._document.components[targetKey][definition.name] = component;
|
|
|
|
|
+ return this;
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define schema component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OASchemaComponentDefinition} schemaDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineSchemaComponent(schemaDef) {
|
|
|
|
|
+ return this._defineComponent("schemas", "schema", "Schema", schemaDef);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define response component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OAResponseComponentDefinition} responseDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineResponseComponent(responseDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "responses",
|
|
|
|
|
+ "response",
|
|
|
|
|
+ "Response",
|
|
|
|
|
+ responseDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define parameter component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OAParameterComponentDefinition} parameterDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineParameterComponent(parameterDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "parameters",
|
|
|
|
|
+ "parameter",
|
|
|
|
|
+ "Parameter",
|
|
|
|
|
+ parameterDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define example component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OAExampleComponentDefinition} exampleDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineExampleComponent(exampleDef) {
|
|
|
|
|
+ return this._defineComponent("examples", "example", "Example", exampleDef);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define request body component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OARequestBodyComponentDefinition} requestBodyDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineRequestBodyComponent(requestBodyDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "requestBodies",
|
|
|
|
|
+ "requestBody",
|
|
|
|
|
+ "Request body",
|
|
|
|
|
+ requestBodyDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define header component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OAHeaderComponentDefinition} headerDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineHeaderComponent(headerDef) {
|
|
|
|
|
+ return this._defineComponent("headers", "header", "Header", headerDef);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define security scheme component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OASecuritySchemeComponentDefinition} securitySchemeDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineSecuritySchemeComponent(securitySchemeDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "securitySchemes",
|
|
|
|
|
+ "securityScheme",
|
|
|
|
|
+ "Security Scheme",
|
|
|
|
|
+ securitySchemeDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define link component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OALinkComponentDefinition} linkDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineLinkComponent(linkDef) {
|
|
|
|
|
+ return this._defineComponent("links", "link", "Link", linkDef);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define callback component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OACallbackComponentDefinition} callbackDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineCallbackComponent(callbackDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "callbacks",
|
|
|
|
|
+ "callback",
|
|
|
|
|
+ "Callback",
|
|
|
|
|
+ callbackDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define path item component.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {import('./oa-document-builder.js').OAPathItemComponentDefinition} pathItemDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ definePathItemComponent(pathItemDef) {
|
|
|
|
|
+ return this._defineComponent(
|
|
|
|
|
+ "pathItems",
|
|
|
|
|
+ "pathItem",
|
|
|
|
|
+ "Path Item",
|
|
|
|
|
+ pathItemDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define operation.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {object} operationDef
|
|
|
|
|
+ */
|
|
|
|
|
+ defineOperation(operationDef) {
|
|
|
|
|
+ if (!operationDef || typeof operationDef !== "object" || Array.isArray(operationDef)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ "Operation Definition must be an Object, but %v was given.",
|
|
|
|
|
+ operationDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.path || typeof operationDef.path !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "path" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ operationDef.path
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (operationDef.path[0] !== "/") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "path" must start with forward slash "/", but %v was given.',
|
|
|
|
|
+ operationDef.path
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.method || typeof operationDef.method !== "string") {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "method" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ operationDef.method
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!Object.values(OAOperationMethod).includes(operationDef.method)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "method" must be one of values: %l, but %v was given.',
|
|
|
|
|
+ Object.values(OAOperationMethod)
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.operation || typeof operationDef.operation !== "object" || Array.isArray(operationDef.operation)) {
|
|
|
|
|
+ throw new import_js_format3.InvalidArgumentError(
|
|
|
|
|
+ 'Property "operation" must be an Object, but %v was given.',
|
|
|
|
|
+ operationDef.operation
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!this._document.paths) {
|
|
|
|
|
+ this._document.paths = {};
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!this._document.paths[operationDef.path]) {
|
|
|
|
|
+ this._document.paths[operationDef.path] = {};
|
|
|
|
|
+ }
|
|
|
|
|
+ this._document.paths[operationDef.path][operationDef.method] = structuredClone(operationDef.operation);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Create scope.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {object} [options]
|
|
|
|
|
+ * @returns {OADocumentScope}
|
|
|
|
|
+ */
|
|
|
|
|
+ createScope(options) {
|
|
|
|
|
+ return new OADocumentScope(this, options);
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Build.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @returns {object}
|
|
|
|
|
+ */
|
|
|
|
|
+ build() {
|
|
|
|
|
+ return structuredClone(this._document);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+__name(_OADocumentBuilder, "OADocumentBuilder");
|
|
|
|
|
+var OADocumentBuilder = _OADocumentBuilder;
|
|
|
|
|
+
|
|
|
|
|
+// src/oa-document-scope.js
|
|
|
|
|
+var _OADocumentScope = class _OADocumentScope {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @param {object} rootBuilder
|
|
|
|
|
+ * @param {object} [options]
|
|
|
|
|
+ */
|
|
|
|
|
+ constructor(rootBuilder, options = {}) {
|
|
|
|
|
+ if (!(rootBuilder instanceof OADocumentBuilder)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "rootBuilder" must be an instance of OADocumentBuilder, but %v was given.',
|
|
|
|
|
+ rootBuilder
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "options" must be an Object, but %v was given.',
|
|
|
|
|
+ options
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (options.pathPrefix !== void 0) {
|
|
|
|
|
+ if (!options.pathPrefix || typeof options.pathPrefix !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "pathPrefix" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ options.pathPrefix
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (options.tags !== void 0) {
|
|
|
|
|
+ if (!Array.isArray(options.tags)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "tags" must be an Array, but %v was given.',
|
|
|
|
|
+ options.tags
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ options.tags.forEach((tag, index) => {
|
|
|
|
|
+ if (!tag || typeof tag !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Element "tags[%d]" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ index,
|
|
|
|
|
+ tag
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ this.rootBuilder = rootBuilder;
|
|
|
|
|
+ this.pathPrefix = options.pathPrefix || "/";
|
|
|
|
|
+ this.tags = options.tags || [];
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Define operation.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {object} operationDef
|
|
|
|
|
+ * @returns {this}
|
|
|
|
|
+ */
|
|
|
|
|
+ defineOperation(operationDef) {
|
|
|
|
|
+ if (!operationDef || typeof operationDef !== "object" || Array.isArray(operationDef)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ "Operation Definition must be an Object, but %v was given.",
|
|
|
|
|
+ operationDef
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.path || typeof operationDef.path !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Property "path" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ operationDef.path
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (operationDef.path[0] !== "/") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Property "path" must start with forward slash "/", but %v was given.',
|
|
|
|
|
+ operationDef.path
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.method || typeof operationDef.method !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Property "method" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ operationDef.method
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!Object.values(OAOperationMethod).includes(operationDef.method)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Property "method" must be one of values: %l, but %v was given.',
|
|
|
|
|
+ Object.values(OAOperationMethod)
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!operationDef.operation || typeof operationDef.operation !== "object" || Array.isArray(operationDef.operation)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Property "operation" must be an Object, but %v was given.',
|
|
|
|
|
+ operationDef.operation
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ const fullPath = joinPath(this.pathPrefix, operationDef.path);
|
|
|
|
|
+ const operation = structuredClone(operationDef.operation);
|
|
|
|
|
+ if (this.tags.length > 0) {
|
|
|
|
|
+ operation.tags = [...this.tags, ...operation.tags || []];
|
|
|
|
|
+ operation.tags = [...new Set(operation.tags)];
|
|
|
|
|
+ }
|
|
|
|
|
+ this.rootBuilder.defineOperation({
|
|
|
|
|
+ ...operationDef,
|
|
|
|
|
+ path: fullPath,
|
|
|
|
|
+ operation
|
|
|
|
|
+ });
|
|
|
|
|
+ return this;
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Create scope.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param {object} [options]
|
|
|
|
|
+ * @returns {OADocumentScope}
|
|
|
|
|
+ */
|
|
|
|
|
+ createScope(options = {}) {
|
|
|
|
|
+ if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "options" must be an Object, but %v was given.',
|
|
|
|
|
+ options
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ if (options.pathPrefix !== void 0) {
|
|
|
|
|
+ if (!options.pathPrefix || typeof options.pathPrefix !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "pathPrefix" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ options.pathPrefix
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (options.tags !== void 0) {
|
|
|
|
|
+ if (!Array.isArray(options.tags)) {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Parameter "tags" must be an Array, but %v was given.',
|
|
|
|
|
+ options.tags
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ options.tags.forEach((tag, index) => {
|
|
|
|
|
+ if (!tag || typeof tag !== "string") {
|
|
|
|
|
+ throw new import_js_format4.InvalidArgumentError(
|
|
|
|
|
+ 'Element "tags[%d]" must be a non-empty String, but %v was given.',
|
|
|
|
|
+ index,
|
|
|
|
|
+ tag
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ return new _OADocumentScope(this.rootBuilder, {
|
|
|
|
|
+ pathPrefix: joinPath(this.pathPrefix, options.pathPrefix),
|
|
|
|
|
+ tags: [...this.tags, ...options.tags || []]
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Build.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @returns {object}
|
|
|
|
|
+ */
|
|
|
|
|
+ build() {
|
|
|
|
|
+ return this.rootBuilder.build();
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+__name(_OADocumentScope, "OADocumentScope");
|
|
|
|
|
+var OADocumentScope = _OADocumentScope;
|
|
|
|
|
+// Annotate the CommonJS export names for ESM import in node:
|
|
|
|
|
+0 && (module.exports = {
|
|
|
|
|
+ OAApiKeyLocation,
|
|
|
|
|
+ OAComponentType,
|
|
|
|
|
+ OADataFormat,
|
|
|
|
|
+ OADataType,
|
|
|
|
|
+ OADocumentBuilder,
|
|
|
|
|
+ OADocumentScope,
|
|
|
|
|
+ OAMediaType,
|
|
|
|
|
+ OAOperationMethod,
|
|
|
|
|
+ OAParameterLocation,
|
|
|
|
|
+ OAParameterStyle,
|
|
|
|
|
+ OASecuritySchemeType,
|
|
|
|
|
+ OA_COMPONENT_TYPE_TO_KEY_MAP,
|
|
|
|
|
+ OPENAPI_VERSION,
|
|
|
|
|
+ oaCallbackRef,
|
|
|
|
|
+ oaExampleRef,
|
|
|
|
|
+ oaLinkRef,
|
|
|
|
|
+ oaParameterRef,
|
|
|
|
|
+ oaPathItemRef,
|
|
|
|
|
+ oaRef,
|
|
|
|
|
+ oaRequestBodyRef,
|
|
|
|
|
+ oaResponseRef,
|
|
|
|
|
+ oaSchemaRef,
|
|
|
|
|
+ oaSecuritySchemeRef
|
|
|
|
|
+});
|