diff --git a/.github/workflows/publish-contract.yml b/.github/workflows/publish-contract.yml index 496a6ca..dbff6d7 100644 --- a/.github/workflows/publish-contract.yml +++ b/.github/workflows/publish-contract.yml @@ -77,6 +77,7 @@ jobs: fi mkdir -p ${{ steps.branch.outputs.BRANCH }} cp ../openapi.json ${{ steps.branch.outputs.BRANCH }}/openapi.json + cp ../openapi.yaml ${{ steps.branch.outputs.BRANCH }}/openapi.yaml git config user.name "contract-bot" git config user.email "bot@faculytics.com" git add . diff --git a/.gitignore b/.gitignore index dc4f5fb..9b00a41 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ lerna-debug.log* # dotenv environment variable files .env openapi.json +openapi.yaml .env.development.local .env.test.local .env.production.local diff --git a/package-lock.json b/package-lock.json index 0d5b4ff..b83c286 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "dataloader": "^2.2.3", "dotenv": "^17.2.4", "exceljs": "^4.4.0", + "js-yaml": "^4.1.1", "nestjs-pino": "^4.6.0", "p-limit": "^7.3.0", "passport-jwt": "^4.0.1", @@ -52,6 +53,7 @@ "@types/bcrypt": "^6.0.0", "@types/express": "^5.0.0", "@types/jest": "^30.0.0", + "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.7", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^6.0.2", @@ -3509,6 +3511,13 @@ "pretty-format": "^30.0.0" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", diff --git a/package.json b/package.json index 5384a36..878f4fe 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "dataloader": "^2.2.3", "dotenv": "^17.2.4", "exceljs": "^4.4.0", + "js-yaml": "^4.1.1", "nestjs-pino": "^4.6.0", "p-limit": "^7.3.0", "passport-jwt": "^4.0.1", @@ -74,6 +75,7 @@ "@types/bcrypt": "^6.0.0", "@types/express": "^5.0.0", "@types/jest": "^30.0.0", + "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.7", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^6.0.2", diff --git a/scripts/generate-openapi.ts b/scripts/generate-openapi.ts index 67519b0..4e287bc 100644 --- a/scripts/generate-openapi.ts +++ b/scripts/generate-openapi.ts @@ -10,6 +10,7 @@ import { import { NestExpressApplication } from '@nestjs/platform-express'; import { swaggerConfig } from '../src/configurations/app/open-api'; import { NestFactory } from '@nestjs/core'; +import yaml from 'js-yaml'; async function generate() { console.log('Generating OpenAPI contract...'); @@ -37,9 +38,20 @@ async function generate() { await app.init(); const document = SwaggerModule.createDocument(app, swaggerConfig); - writeFileSync('openapi.json', JSON.stringify(document, null, 2)); - console.log('OpenAPI contract generated successfully: openapi.json'); + // Remove functions by JSON round-trip + const cleanDocument: unknown = JSON.parse(JSON.stringify(document)); + + const yamlDocument = yaml.dump(cleanDocument, { + noRefs: true, + lineWidth: 120, + }); + + writeFileSync('openapi.json', JSON.stringify(cleanDocument, null, 2)); + writeFileSync('openapi.yaml', yamlDocument, 'utf8'); + console.log( + 'OpenAPI contract generated successfully: openapi.json and openapi.yaml', + ); await app.close(); process.exit(0);