/* eslint-disable @typescript-eslint/no-var-requires */ const swaggerAutogen = require('swagger-autogen')({ openapi: '3.0.0' }); const fs = require('fs').promises; const yaml = require('js-yaml'); /** * Generates OpenAPI specs for all Infisical API endpoints: * - spec.json in /backend for api-serving * - spec.yaml in /docs for API reference */ const generateOpenAPISpec = async () => { const doc = { info: { title: 'Infisical API', description: 'List of all available APIs that can be consumed', }, host: ['https://infisical.com'], servers: [ { url: 'https://infisical.com', description: 'Production server' }, { url: 'http://localhost:8080', description: 'Local server' } ], securityDefinitions: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT', description: "This security definition uses the HTTP 'bearer' scheme, which allows the client to authenticate using a JSON Web Token (JWT) that is passed in the Authorization header of the request." }, apiKeyAuth: { type: 'apiKey', in: 'header', name: 'X-API-Key', description: 'This security definition uses an API key, which is passed in the header of the request as the value of the "X-API-Key" header. The client must provide a valid key in order to access the API.' } }, definitions: { CurrentUser: { _id: '', email: 'johndoe@gmail.com', firstName: 'John', lastName: 'Doe', publicKey: 'johns_nacl_public_key', encryptedPrivateKey: 'johns_enc_nacl_private_key', iv: 'iv_of_enc_nacl_private_key', tag: 'tag_of_enc_nacl_private_key', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' }, Membership: { user: { _id: '', email: 'johndoe@gmail.com', firstName: 'John', lastName: 'Doe', publicKey: 'johns_nacl_public_key', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' }, workspace: '', role: 'admin' }, MembershipOrg: { user: { _id: '', email: 'johndoe@gmail.com', firstName: 'John', lastName: 'Doe', publicKey: 'johns_nacl_public_key', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' }, organization: '', role: 'owner', status: 'accepted' }, Organization: { _id: '', name: 'Acme Corp.', customerId: '' }, Project: { name: 'My Project', organization: '', environments: [{ name: 'development', slug: 'dev' }] }, ProjectKey: { encryptedkey: '', nonce: '', sender: { publicKey: 'senders_nacl_public_key' }, receiver: '', workspace: '' }, CreateSecret: { type: 'shared', secretKeyCiphertext: '', secretKeyIV: '', secretKeyTag: '', secretValueCiphertext: '', secretValueIV: '', secretValueTag: '', secretCommentCiphertext: '', secretCommentIV: '', secretCommentTag: '' }, UpdateSecret: { id: '', secretKeyCiphertext: '', secretKeyIV: '', secretKeyTag: '', secretValueCiphertext: '', secretValueIV: '', secretValueTag: '', secretCommentCiphertext: '', secretCommentIV: '', secretCommentTag: '' }, Secret: { _id: '', version: 1, workspace : '', type: 'shared', user: null, secretKeyCiphertext: '', secretKeyIV: '', secretKeyTag: '', secretValueCiphertext: '', secretValueIV: '', secretValueTag: '', secretCommentCiphertext: '', secretCommentIV: '', secretCommentTag: '', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' }, Log: { _id: '', user: { _id: '', email: 'johndoe@gmail.com', firstName: 'John', lastName: 'Doe' }, workspace: '', actionNames: [ 'addSecrets' ], actions: [ { name: 'addSecrets', user: '', workspace: '', payload: [ { oldSecretVersion: '', newSecretVersion: '' } ] } ], channel: 'cli', ipAddress: '192.168.0.1', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' }, SecretSnapshot: { workspace: '', version: 1, secretVersions: [ { _id: '' } ] }, SecretVersion: { _id: '', secret: '', version: 1, workspace: '', type: 'shared', user: '', environment: 'dev', isDeleted: '', secretKeyCiphertext: '', secretKeyIV: '', secretKeyTag: '', secretValueCiphertext: '', secretValueIV: '', secretValueTag: '', }, ServiceTokenData: { _id: '', name: '', workspace: '', environment: '', user: { _id: '', firstName: '', lastName: '' }, expiresAt: '2023-01-13T14:16:12.210Z', encryptedKey: '', iv: '', tag: '', updatedAt: '2023-01-13T14:16:12.210Z', createdAt: '2023-01-13T14:16:12.210Z' } } }; const outputJSONFile = '../spec.json'; const outputYAMLFile = '../docs/spec.yaml'; const endpointsFiles = ['../src/app.ts']; const spec = await swaggerAutogen(outputJSONFile, endpointsFiles, doc); await fs.writeFile(outputYAMLFile, yaml.dump(spec.data)); } generateOpenAPISpec();