diff --git a/.gitignore b/.gitignore index f516ffb..6500c60 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ node_modules db/migrations .vscode build -openapi-document.yaml +openapi-document.* #From docker compose database db-data \ No newline at end of file diff --git a/src/openapi/config.ts b/openapi/config.ts similarity index 100% rename from src/openapi/config.ts rename to openapi/config.ts diff --git a/openapi/generate-document.ts b/openapi/generate-document.ts new file mode 100644 index 0000000..a6c5bd4 --- /dev/null +++ b/openapi/generate-document.ts @@ -0,0 +1,31 @@ +import fs from "node:fs"; +import YAML from "yaml"; + +import { openapiSpecification } from "@/docs/config"; + +const OPENAPI_YAML_DOCUMENT_PATH = "./openapi/openapi-document.yaml"; +const OPENAPI_JSON_DOCUMENT_PATH = "./openapi/openapi-document.json"; + +try { + const yamlString = YAML.stringify(openapiSpecification); + fs.writeFileSync(OPENAPI_YAML_DOCUMENT_PATH, yamlString); + console.info( + "Wrote to", + `"${OPENAPI_YAML_DOCUMENT_PATH}".`, + "Remember to add it in the .gitignore.", + ); +} catch { + console.error("Failed writing to ", OPENAPI_YAML_DOCUMENT_PATH); +} + +try { + const jsonString = JSON.stringify(openapiSpecification); + fs.writeFileSync(OPENAPI_JSON_DOCUMENT_PATH, jsonString); + console.info( + "Wrote to", + `"${OPENAPI_JSON_DOCUMENT_PATH}".`, + "Remember to add it in the .gitignore.", + ); +} catch { + console.error("Failed writing to ", OPENAPI_JSON_DOCUMENT_PATH); +} diff --git a/package.json b/package.json index b27f022..43c41bf 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "db:migrate": "drizzle-kit migrate --config=db/config/drizzle.config.ts", "db:studio": "drizzle-kit studio --config=db/config/drizzle.config.ts", "db:seed": "tsx ./db/seeding/seeding.ts", - "docs:generate": "tsx ./src/openapi/generateDocument.ts" + "docs:generate": "tsx ./openapi/generate-document.ts" }, "license": "ISC", "dependencies": { @@ -31,7 +31,6 @@ "express-zod-safe": "^1.3.3", "pg": "^8.14.1", "swagger-jsdoc": "^6.2.8", - "swagger-ui-express": "^5.0.1", "validator": "^13.15.0", "zod": "^3.24.2", "zod-openapi": "^3.3.0", @@ -45,7 +44,6 @@ "@types/pg": "^8.11.11", "@types/supertest": "^6.0.3", "@types/swagger-jsdoc": "^6.0.4", - "@types/swagger-ui-express": "^4.1.8", "@types/validator": "^13.12.3", "drizzle-kit": "^0.24.2", "supertest": "^7.1.0", @@ -55,4 +53,4 @@ "yaml": "^2.7.1" }, "packageManager": "pnpm@10.6.5+sha512.cdf928fca20832cd59ec53826492b7dc25dc524d4370b6b4adbf65803d32efaa6c1c88147c0ae4e8d579a6c9eec715757b50d4fa35eea179d868eada4ed043af" -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64e555a..a06990e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ importers: swagger-jsdoc: specifier: ^6.2.8 version: 6.2.8(openapi-types@12.1.3) - swagger-ui-express: - specifier: ^5.0.1 - version: 5.0.1(express@4.21.2) validator: specifier: ^13.15.0 version: 13.15.0 @@ -72,9 +69,6 @@ importers: '@types/swagger-jsdoc': specifier: ^6.0.4 version: 6.0.4 - '@types/swagger-ui-express': - specifier: ^4.1.8 - version: 4.1.8 '@types/validator': specifier: ^13.12.3 version: 13.12.3 @@ -613,9 +607,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@scarf/scarf@1.4.0': - resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} - '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -673,9 +664,6 @@ packages: '@types/swagger-jsdoc@6.0.4': resolution: {integrity: sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==} - '@types/swagger-ui-express@4.1.8': - resolution: {integrity: sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==} - '@types/validator@13.12.3': resolution: {integrity: sha512-2ipwZ2NydGQJImne+FhNdhgRM37e9lCev99KnqkbFHd94Xn/mErARWI1RSLem1QA19ch5kOhzIZd7e8CA2FI8g==} @@ -1444,15 +1432,6 @@ packages: resolution: {integrity: sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==} engines: {node: '>=10'} - swagger-ui-dist@5.20.4: - resolution: {integrity: sha512-3AdoFZyYBsqk65HpBckS6MVUxMZxpCgukDfGb9pz83faUGziO5k5QTO4gYrPBtkqiJC9b1rC0QwLwH8MkcWJ0g==} - - swagger-ui-express@5.0.1: - resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} - engines: {node: '>= v0.10.32'} - peerDependencies: - express: '>=4.0.0 || >=5.0.0-beta' - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1829,8 +1808,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@scarf/scarf@1.4.0': {} - '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 @@ -1907,11 +1884,6 @@ snapshots: '@types/swagger-jsdoc@6.0.4': {} - '@types/swagger-ui-express@4.1.8': - dependencies: - '@types/express': 4.17.21 - '@types/serve-static': 1.15.7 - '@types/validator@13.12.3': {} accepts@1.3.8: @@ -2683,15 +2655,6 @@ snapshots: transitivePeerDependencies: - openapi-types - swagger-ui-dist@5.20.4: - dependencies: - '@scarf/scarf': 1.4.0 - - swagger-ui-express@5.0.1(express@4.21.2): - dependencies: - express: 4.21.2 - swagger-ui-dist: 5.20.4 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 diff --git a/src/main.ts b/src/main.ts index 2a17a73..8541087 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,7 +8,6 @@ import { zodErrorHandler, } from "@/src/middleware/error-middleware"; import { logger } from "@/src/middleware/logging-middleware"; -import { openapiSpecification } from "@/src/openapi/config"; import { teamApplicationRouter } from "@/src/routers/applications"; import { expensesRouter } from "@/src/routers/expenses"; import { sponsorsRouter } from "@/src/routers/sponsors"; @@ -16,7 +15,6 @@ import { teamsRouter } from "@/src/routers/teams"; import { usersRouter } from "@/src/routers/users"; import { customCors, customHelmetSecurity } from "@/src/security"; import express from "express"; -import openapiExpressHandler from "swagger-ui-express"; export const api = express(); @@ -25,11 +23,8 @@ api.use(customHelmetSecurity, customCors()); api.disable("x-powered-by"); // OpenAPI -api.get( - "/docs/openapi", - openapiExpressHandler.serve, - openapiExpressHandler.setup(openapiSpecification), -); +api.use("/api-docs.yaml", express.static("./openapi/openapi-document.yaml")); +api.use("/api-docs.json", express.static("./openapi/openapi-document.json")); // Logger api.use(logger); diff --git a/src/openapi/generate-document.ts b/src/openapi/generate-document.ts deleted file mode 100644 index 44d45a4..0000000 --- a/src/openapi/generate-document.ts +++ /dev/null @@ -1,18 +0,0 @@ -import fs from "node:fs"; -import YAML from "yaml"; - -import { openapiSpecification } from "@/src/openapi/config"; - -const openapiDocumentPath = "openapi-document.yaml"; - -try { - const yamlString = YAML.stringify(openapiSpecification); - fs.writeFileSync(openapiDocumentPath, yamlString); - console.info( - "Wrote to", - `"${openapiDocumentPath}".`, - "Remember to add it in the .gitignore.", - ); -} catch { - console.error("Failed writing to ", openapiDocumentPath); -} diff --git a/tsconfig.json b/tsconfig.json index 1c58e04..2fb5978 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,8 @@ "paths": { "@/src/*": ["./src/*"], "@/db/*": ["./db/*"], - "@/lib/*": ["./lib/*"] + "@/lib/*": ["./lib/*"], + "@/docs/*": ["./openapi/*"] } } }