UNPKG

docusaurus-plugin-openapi-docs

Version:

OpenAPI plugin for Docusaurus.

193 lines (192 loc) 7.29 kB
"use strict"; /* ============================================================================ * Copyright (c) Palo Alto Networks * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * ========================================================================== */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sampleResponseFromSchema = void 0; const chalk_1 = __importDefault(require("chalk")); const merge_1 = __importDefault(require("lodash/merge")); const createSchema_1 = require("../markdown/createSchema"); const primitives = { string: { default: () => "string", email: () => "user@example.com", date: () => "2024-07-29", "date-time": () => "2024-07-29T15:51:28.071Z", uuid: () => "3fa85f64-5717-4562-b3fc-2c963f66afa6", hostname: () => "example.com", ipv4: () => "198.51.100.42", ipv6: () => "2001:0db8:5b96:0000:0000:426f:8e17:642a", }, number: { default: () => 0, float: () => 0.0, }, integer: { default: () => 0, }, boolean: { default: (schema) => typeof schema.default === "boolean" ? schema.default : true, }, object: {}, array: {}, }; function sampleResponseFromProp(name, prop, obj) { // Handle resolved circular props if (typeof prop === "object" && Object.keys(prop).length === 0) { obj[name] = prop; return obj; } // TODO: handle discriminators if (prop.oneOf) { obj[name] = (0, exports.sampleResponseFromSchema)(prop.oneOf[0]); } else if (prop.anyOf) { obj[name] = (0, exports.sampleResponseFromSchema)(prop.anyOf[0]); } else if (prop.allOf) { const mergedSchemas = (0, createSchema_1.mergeAllOf)(prop); sampleResponseFromProp(name, mergedSchemas, obj); } else { obj[name] = (0, exports.sampleResponseFromSchema)(prop); } return obj; } const sampleResponseFromSchema = (schema = {}) => { try { // deep copy schema before processing let schemaCopy = JSON.parse(JSON.stringify(schema)); let { type, example, allOf, properties, items, oneOf, anyOf } = schemaCopy; if (example !== undefined) { return example; } if (allOf) { const mergedSchemas = (0, createSchema_1.mergeAllOf)(schemaCopy); if (mergedSchemas.properties) { for (const [key, value] of Object.entries(mergedSchemas.properties)) { if ((value.writeOnly && value.writeOnly === true) || value.deprecated) { delete mergedSchemas.properties[key]; } } } if (properties) { const combinedSchemas = (0, merge_1.default)(schemaCopy, mergedSchemas); delete combinedSchemas.allOf; return (0, exports.sampleResponseFromSchema)(combinedSchemas); } return (0, exports.sampleResponseFromSchema)(mergedSchemas); } if (oneOf) { if (properties) { const combinedSchemas = (0, merge_1.default)(schemaCopy, oneOf[0]); delete combinedSchemas.oneOf; return (0, exports.sampleResponseFromSchema)(combinedSchemas); } // Just go with first schema return (0, exports.sampleResponseFromSchema)(oneOf[0]); } if (anyOf) { if (properties) { const combinedSchemas = (0, merge_1.default)(schemaCopy, anyOf[0]); delete combinedSchemas.anyOf; return (0, exports.sampleResponseFromSchema)(combinedSchemas); } // Just go with first schema return (0, exports.sampleResponseFromSchema)(anyOf[0]); } if (!type) { if (properties) { type = "object"; } else if (items) { type = "array"; } else { return; } } if (type === "object") { let obj = {}; for (let [name, prop] of Object.entries(properties !== null && properties !== void 0 ? properties : {})) { if (prop.properties) { for (const [key, value] of Object.entries(prop.properties)) { if ((value.writeOnly && value.writeOnly === true) || value.deprecated) { delete prop.properties[key]; } } } if (prop.items && prop.items.properties) { for (const [key, value] of Object.entries(prop.items.properties)) { if ((value.writeOnly && value.writeOnly === true) || value.deprecated) { delete prop.items.properties[key]; } } } if (prop.writeOnly && prop.writeOnly === true) { continue; } if (prop.deprecated) { continue; } // Resolve schema from prop recursively obj = sampleResponseFromProp(name, prop, obj); } return obj; } if (type === "array") { if (Array.isArray(items === null || items === void 0 ? void 0 : items.anyOf)) { return items === null || items === void 0 ? void 0 : items.anyOf.map((item) => (0, exports.sampleResponseFromSchema)(item)); } if (Array.isArray(items === null || items === void 0 ? void 0 : items.oneOf)) { return items === null || items === void 0 ? void 0 : items.oneOf.map((item) => (0, exports.sampleResponseFromSchema)(item)); } return [(0, exports.sampleResponseFromSchema)(items)]; } if (schemaCopy.enum) { if (schemaCopy.default) { return schemaCopy.default; } return normalizeArray(schemaCopy.enum)[0]; } if ((schemaCopy.writeOnly && schemaCopy.writeOnly === true) || schemaCopy.deprecated) { return undefined; } return primitive(schemaCopy); } catch (err) { console.error(chalk_1.default.yellow("WARNING: failed to create example from schema object:", err)); return; } }; exports.sampleResponseFromSchema = sampleResponseFromSchema; function primitive(schema = {}) { let { type, format } = schema; if (type === undefined) { return; } let fn = schema.default ? () => schema.default : primitives[type].default; if (format !== undefined) { fn = primitives[type][format] || fn; } if (fn) { return fn(schema); } return "Unknown Type: " + schema.type; } function normalizeArray(arr) { if (Array.isArray(arr)) { return arr; } return [arr]; }