diff --git a/server/node-service/src/plugins/github/index.ts b/server/node-service/src/plugins/github/index.ts index 5df537677..3f031b65e 100644 --- a/server/node-service/src/plugins/github/index.ts +++ b/server/node-service/src/plugins/github/index.ts @@ -5,6 +5,7 @@ import { OpenAPIV3, OpenAPI } from "openapi-types"; import { ConfigToType, DataSourcePlugin } from "lowcoder-sdk/dataSource"; import { runOpenApi } from "../openApi"; import { parseOpenApi, ParseOpenApiOptions } from "../openApi/parse"; +import SwaggerParser from "@apidevtools/swagger-parser"; const spec = readYaml(path.join(__dirname, "./github.spec.yaml")); @@ -34,6 +35,7 @@ const parseOptions: ParseOpenApiOptions = { return _.upperFirst(operation.operationId || ""); }, }; +const deRefedSpec = SwaggerParser.dereference(spec); type DataSourceConfigType = ConfigToType; @@ -55,13 +57,13 @@ const gitHubPlugin: DataSourcePlugin = { actions, }; }, - run: function (actionData, dataSourceConfig): Promise { + run: async function (actionData, dataSourceConfig, ctx): Promise { const runApiDsConfig = { url: "", serverURL: "https://api.github.com", dynamicParamsConfig: dataSourceConfig, }; - return runOpenApi(actionData, runApiDsConfig, spec as OpenAPIV3.Document); + return runOpenApi(actionData, runApiDsConfig, spec as OpenAPIV3.Document, undefined, await deRefedSpec); }, }; diff --git a/server/node-service/src/plugins/openApi/index.ts b/server/node-service/src/plugins/openApi/index.ts index 27f9ed950..c99bcc9a3 100644 --- a/server/node-service/src/plugins/openApi/index.ts +++ b/server/node-service/src/plugins/openApi/index.ts @@ -12,11 +12,10 @@ import { isFile, } from "./util"; import { badRequest } from "../../common/error"; -import { safeJsonParse } from "../../common/util"; import { OpenAPI, OpenAPIV2, OpenAPIV3 } from "openapi-types"; import _ from "lodash"; import { fetch } from "../../common/fetch"; -import { RequestInit, Response } from "node-fetch"; +import { RequestInit } from "node-fetch"; const dataSourceConfig = { type: "dataSource", @@ -50,30 +49,42 @@ interface ActionDataType { [key: string]: any; } +async function getDefinitions( + spec: OpenAPI.Document | MultiOpenApiSpecItem[], + openApiSpecDereferenced?: OpenAPI.Document, +): Promise<{ def: OpenAPI.Document; id: string }[]> { + if (openApiSpecDereferenced) { + return [{ + def: openApiSpecDereferenced, + id: "", + }] + } else { + const specList = Array.isArray(spec) ? spec : [{ spec, id: "" }]; + return await Promise.all( + specList.map(async ({id, spec}) => { + const deRefedSpec = await SwaggerParser.dereference(spec); + return { + def: deRefedSpec, + id, + }; + }) + ); + } +} + export async function runOpenApi( actionData: ActionDataType, dataSourceConfig: DataSourceDataType, spec: OpenAPI.Document | MultiOpenApiSpecItem[], - defaultHeaders?: Record + defaultHeaders?: Record, + openApiSpecDereferenced?: OpenAPI.Document, ) { - const specList = Array.isArray(spec) ? spec : [{ spec, id: "" }]; - const definitions = await Promise.all( - specList.map(async ({ id, spec }) => { - const deRefedSpec = await SwaggerParser.dereference(spec); - return { - def: deRefedSpec, - id, - }; - }) - ); const { actionName, ...otherActionData } = actionData; const { serverURL } = dataSourceConfig; - let definition: OpenAPI.Document | undefined; - let operation; - let realOperationId; + let operation, realOperationId, definition: OpenAPI.Document | undefined; - for (const { id, def } of definitions) { + for (const {id, def} of await getDefinitions(spec, openApiSpecDereferenced)) { const ret = findOperation(actionName, def, id); if (ret) { definition = def;