diff --git a/packages/cli/oas/medusa-oas-cli/src/command-docs.ts b/packages/cli/oas/medusa-oas-cli/src/command-docs.ts index af77bdd56e..4ed2f745e7 100644 --- a/packages/cli/oas/medusa-oas-cli/src/command-docs.ts +++ b/packages/cli/oas/medusa-oas-cli/src/command-docs.ts @@ -12,7 +12,7 @@ import { } from "./utils/circular-patch-utils" import { getTmpDirectory, isFile } from "./utils/fs-utils" import { readJson } from "./utils/json-utils" -import { readYaml, writeYaml, writeYamlFromJson } from "./utils/yaml-utils" +import { jsonObjectToYamlString, readYaml, writeYaml, writeYamlFromJson } from "./utils/yaml-utils" import yargs from "yargs" /** @@ -135,7 +135,7 @@ export async function execute(cliParams: OptionValues): Promise { const srcFileSanitized = path.resolve(tmpDir, "tmp.oas.yaml") await sanitizeOAS(srcFile, srcFileSanitized, configTmpFile) - await circularReferenceCheck(srcFileSanitized) + await fixCirclularReferences(srcFileSanitized, dryRun) if (dryRun) { console.log(`⚫️ Dry run - no files generated`) @@ -223,22 +223,32 @@ const sanitizeOAS = async ( console.log(logs) } -const circularReferenceCheck = async (srcFile: string): Promise => { +const fixCirclularReferences = async (srcFile: string, dryRun = false): Promise => { const { circularRefs, oas } = await getCircularReferences(srcFile) if (circularRefs.length) { - console.log(circularRefs) - let errorMessage = `🔴 Unhandled circular references - Please manually patch using --config ./redocly-config.yaml` const recommendation = getCircularPatchRecommendation(circularRefs, oas) if (Object.keys(recommendation).length) { const hint = formatHintRecommendation(recommendation) - errorMessage += ` -Within redocly-config.yaml, try adding the following: + const hintMessage = ` ### ${hint} ### ` + if (dryRun) { + throw new Error( + `🔴 Unhandled circular references - Please manually patch using --config ./redocly-config.yaml +Within redocly-config.yaml, try adding the following:` + hintMessage + ) + } + const redoclyConfigPath = path.join(basePath, "redocly", "redocly-config.yaml") + const originalContent = await readYaml(redoclyConfigPath) as CircularReferenceConfig + originalContent.decorators["medusa/circular-patch"].schemas = Object.assign( + originalContent.decorators["medusa/circular-patch"].schemas, + recommendation + ) + await writeYaml(redoclyConfigPath, jsonObjectToYamlString(originalContent)) + console.log(`🟡 Added the following unhandled circular references to redocly-config.ts:` + hintMessage) } - throw new Error(errorMessage) } console.log(`🟢 All circular references are handled`) } diff --git a/packages/cli/oas/medusa-oas-cli/src/types.ts b/packages/cli/oas/medusa-oas-cli/src/types.ts index fca1bf297e..571bd3c74a 100644 --- a/packages/cli/oas/medusa-oas-cli/src/types.ts +++ b/packages/cli/oas/medusa-oas-cli/src/types.ts @@ -1 +1,11 @@ type ApiType = "store" | "admin" | "combined" + +type CircularReferenceSchema = Record + +type CircularReferenceConfig = { + decorators: { + "medusa/circular-patch": { + schemas: CircularReferenceSchema + } + } +} \ No newline at end of file diff --git a/packages/cli/oas/medusa-oas-cli/src/utils/circular-patch-utils.ts b/packages/cli/oas/medusa-oas-cli/src/utils/circular-patch-utils.ts index 5095f220fa..66c6c46b0c 100644 --- a/packages/cli/oas/medusa-oas-cli/src/utils/circular-patch-utils.ts +++ b/packages/cli/oas/medusa-oas-cli/src/utils/circular-patch-utils.ts @@ -27,7 +27,7 @@ export const getCircularReferences = async ( export const getCircularPatchRecommendation = ( circularRefs: string[], oas: OpenAPIObject -): Record => { +): CircularReferenceSchema => { type circularReferenceMatch = { schema: string property: string @@ -66,7 +66,7 @@ export const getCircularPatchRecommendation = ( } }) - const schemas = {} + const schemas: CircularReferenceSchema = {} for (const match of matches) { if (!schemas.hasOwnProperty(match.schema)) { schemas[match.schema] = [] @@ -77,7 +77,7 @@ export const getCircularPatchRecommendation = ( } export const formatHintRecommendation = ( - recommendation: Record + recommendation: CircularReferenceSchema ) => { return jsonObjectToYamlString({ decorators: { "medusa/circular-patch": { schemas: recommendation } },