diff --git a/back/src/modules/uploads/uploads.controller.ts b/back/src/modules/uploads/uploads.controller.ts index fdbf5b0..44d0b43 100644 --- a/back/src/modules/uploads/uploads.controller.ts +++ b/back/src/modules/uploads/uploads.controller.ts @@ -138,13 +138,17 @@ export class UploadsController { await execFileAsync('redocly', ['lint', mainPath], { env: execEnv, timeout: 30000 }); } } catch (cliError) { - const err = cliError as { stdout?: string; stderr?: string }; - const output = (err.stdout || err.stderr || String(cliError)).trim(); - return { - valid: false, type: detectedType, mainFile: mainFileName, - name: null, versionMajor: null, versionMinor: null, versionPatch: null, description: null, - errors: [{ file: mainFileName, message: output }], - }; + const err = cliError as NodeJS.ErrnoException & { stdout?: string; stderr?: string }; + /* CLI non installé (dev local sans Docker) → skip la validation complète */ + if (err.code !== 'ENOENT') { + const output = (err.stdout || err.stderr || String(cliError)).trim(); + return { + valid: false, type: detectedType, mainFile: mainFileName, + name: null, versionMajor: null, versionMinor: null, versionPatch: null, description: null, + errors: [{ file: mainFileName, message: output }], + }; + } + this.logger.warn(`CLI ${detectedType === 'ASYNCAPI' ? 'asyncapi' : 'redocly'} non trouvé — validation CLI ignorée`); } } finally { await fsPromises.rm(tempDir, { recursive: true, force: true }).catch(() => undefined);