UNPKG

@lobehub/chat-plugin-sdk

Version:

Lobe Chat Plugin SDK, help you to build an amazing chat plugin for Lobe Chat

234 lines (232 loc) 8.7 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; 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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/openapi/index.ts var openapi_exports = {}; __export(openapi_exports, { OPENAPI_REQUEST_BODY_KEY: () => OPENAPI_REQUEST_BODY_KEY, OpenAPIConvertor: () => OpenAPIConvertor }); module.exports = __toCommonJS(openapi_exports); var import_swagger_parser = __toESM(require("@apidevtools/swagger-parser")); var import_openapi_jsonschema_parameters = require("openapi-jsonschema-parameters"); var import_manifest = require("../schema/manifest"); var OPENAPI_REQUEST_BODY_KEY = "_requestBody"; var OpenAPIConvertor = class { constructor(openapi) { this.convertOpenAPIToPluginSchema = async () => { var _a; const api = await import_swagger_parser.default.dereference(this.openapi); const paths = api.paths; const methods = ["get", "put", "post", "delete", "options", "head", "patch", "trace"]; const plugins = []; for (const [path, operations] of Object.entries(paths)) { for (const method of methods) { const operation = operations[method]; if (operation) { const parametersSchema = (0, import_openapi_jsonschema_parameters.convertParametersToJSONSchema)(operation.parameters || []); const requestBodySchema = this.convertRequestBodyToSchema(operation.requestBody); const parameters = this.mergeSchemas(...Object.values(parametersSchema)); if (requestBodySchema && requestBodySchema.properties && Object.keys(requestBodySchema.properties).length > 0) { parameters.properties[OPENAPI_REQUEST_BODY_KEY] = requestBodySchema; (_a = parameters.required) == null ? void 0 : _a.push("_requestBody"); } const name = operation.operationId || `${method.toUpperCase()} ${path}`; const description = operation.summary || operation.description || name; const plugin = { description, name, parameters }; const res = import_manifest.pluginApiSchema.safeParse(plugin); if (res.success) plugins.push(plugin); else { throw res.error; } } } } return plugins; }; this.convertAuthToSettingsSchema = async (rawSettingsSchema = { properties: {}, type: "object" }) => { var _a; let settingsSchema = rawSettingsSchema; const { default: SwaggerClient } = await import("swagger-client"); const openAPI = await SwaggerClient.resolve({ spec: this.openapi }); const api = openAPI.spec; for (const entry of Object.entries(((_a = api.components) == null ? void 0 : _a.securitySchemes) || {})) { let authSchema = {}; const [key, value] = entry; switch (value.type) { case "apiKey": { authSchema = { properties: { [key]: { description: value.description || `${key} API Key`, format: "password", title: value.name, type: "string" } }, required: [key], type: "object" }; break; } case "http": { if (value.scheme === "basic") { authSchema = { properties: { [key]: { description: "Basic authentication credentials", format: "password", type: "string" } }, required: [key], type: "object" }; } else if (value.scheme === "bearer") { authSchema = { properties: { [key]: { description: value.description || `${key} Bearer token`, format: "password", title: key, type: "string" } }, required: [key], type: "object" }; } break; } case "oauth2": { authSchema = { properties: { [`${key}_clientId`]: { description: "Client ID for OAuth2", type: "string" }, [`${key}_clientSecret`]: { description: "Client Secret for OAuth2", format: "password", type: "string" }, [`${key}_accessToken`]: { description: "Access token for OAuth2", format: "password", type: "string" } }, required: [`${key}_clientId`, `${key}_clientSecret`, `${key}_accessToken`], type: "object" }; break; } } Object.assign(settingsSchema.properties, authSchema.properties); if (authSchema.required) { settingsSchema.required = [ .../* @__PURE__ */ new Set([...settingsSchema.required || [], ...authSchema.required]) ]; } } return settingsSchema; }; this.openapi = openapi; } convertRequestBodyToSchema(requestBody) { if (!requestBody || !requestBody.content) { return null; } let requestBodySchema = {}; for (const [contentType, mediaType] of Object.entries(requestBody.content)) { if (mediaType.schema) { const resolvedSchema = this.removeRequiredFields(mediaType.schema); switch (contentType) { case "application/json": { requestBodySchema = resolvedSchema; break; } case "application/x-www-form-urlencoded": case "multipart/form-data": { requestBodySchema = resolvedSchema; break; } default: { console.warn(`Unsupported content-type: ${contentType}`); break; } } } } return requestBodySchema; } removeRequiredFields(schema) { if (schema && typeof schema === "object") { for (const key in schema) { if (schema.hasOwnProperty(key)) { const value = schema[key]; if (key === "required" && value === true) { delete schema[key]; } else { schema[key] = this.removeRequiredFields(value); } } } } else if (Array.isArray(schema)) { return schema.map(this.removeRequiredFields.bind(this)); } return schema; } mergeSchemas(...schemas) { var _a; const mergedSchema = { properties: {}, required: [], type: "object" }; for (const schema of schemas) { if (schema && schema.properties) { Object.assign(mergedSchema.properties, schema.properties); if (Array.isArray(schema.required)) { mergedSchema.required = [ .../* @__PURE__ */ new Set([...mergedSchema.required || [], ...schema.required]) ]; } } } if (((_a = mergedSchema.required) == null ? void 0 : _a.length) === 0) { delete mergedSchema.required; } return mergedSchema; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { OPENAPI_REQUEST_BODY_KEY, OpenAPIConvertor });