diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..8aa4daa --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,9 @@ +{ + "name": "JetKVM Cloud API", + "image": "mcr.microsoft.com/devcontainers/base:debian", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "21.1.0" + } + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9ed3f18 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.github +.env* +.prettierrc +.gitignore +.dockerignore +*.md +Dockerfile +node_modules +publish_source.sh \ No newline at end of file diff --git a/.env.example b/.env.example index 86ac439..93b855b 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL="postgresql://jetkvm:jetkvm@localhost:5432/jetkvm?schema=public" +DATABASE_URL="postgresql://jetkvm:mysecretpassword@localhost:5432/jetkvm?schema=public" # hostname is postgres for docker development GOOGLE_CLIENT_ID=XXX # Google OIDC Client ID GOOGLE_CLIENT_SECRET=XXX # Google OIDC Client Secret @@ -20,4 +20,9 @@ R2_CDN_URL=XXX # Any S3 compatible CDN URL CORS_ORIGINS=https://app.jetkvm.com,http://localhost:5173 # Allowed CORS Origins, split by comma REAL_IP_HEADER=XXX # Real IP Header for the reverse proxy (e.g. X-Real-IP), leave empty if not needed -ICE_SERVERS=XXX # ICE Servers for WebRTC, split by comma (e.g. stun:stun.l.google.com:19302,stun:stun1.l.google.com:19302) \ No newline at end of file +ICE_SERVERS=XXX # ICE Servers for WebRTC, split by comma (e.g. stun:stun.l.google.com:19302,stun:stun1.l.google.com:19302) + +# Uncomment these for development +#POSTGRES_USER=jetkvm +#POSTGRES_PASSWORD=mysecretpassword +#POSTGRES_DB=jetkvm \ No newline at end of file diff --git a/.gitignore b/.gitignore index e2622bf..df2bc22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,27 @@ +.env +.env.development + +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + node_modules +dist +dist-ssr +*.local + +.vscode/* +!.vscode/extensions.json .idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? .env .env.development diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ab4a525 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Base Stage +FROM node:22.14.0-bullseye-slim AS base +WORKDIR /app +COPY package.json package-lock.json ./ + +# Deps Stage +FROM base AS deps +RUN npm ci + +# Build / Dev Stage +FROM deps AS dev +COPY . . +RUN npx prisma generate +RUN npm run build:prod +CMD ["sh", "-c", "npm run dev"] + +# Production Stage +FROM node:22.14.0-bullseye-slim AS prod +WORKDIR /app +COPY --from=dev /app/dist ./dist +COPY --from=dev /app/prisma ./prisma +COPY --from=dev /app/package.json ./ +COPY --from=dev /app/package-lock.json ./ + +# Install only production dependencies +RUN npm ci --omit=dev +USER node +EXPOSE 3000 +CMD ["node", "./dist/index.js"] diff --git a/README.md b/README.md index aca5f03..a2e7ab5 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ The best place to search for answers is our [Documentation](https://jetkvm.com/d If you've found an issue and want to report it, please check our [Issues](https://github.com/jetkvm/cloud-api/issues) page. Make sure the description contains information about the firmware version you're using, your platform, and a clear explanation of the steps to reproduce the issue. - ## Development This project is built with Node.JS, Prisma and Express. @@ -31,17 +30,25 @@ This project is built with Node.JS, Prisma and Express. To start the development server, run: ```bash -# For local development, you can use the following command to start a postgres instanc +# Copy the .env.example file to a new file .env.development and populate it with the correct values +cp .env.example .env.development + +# For local development you can use docker compose to bring up your environment + +# this will run docker-compose.yml with docker-compose.override.yml applied + +docker compose up --build + +# Or you can run a postgres container only + # Don't use in production docker run --name jetkvm-cloud-db \ -e POSTGRES_USER=jetkvm \ -e POSTGRES_PASSWORD=mysecretpassword \ -e POSTGRES_DB=jetkvm \ + -p 5432:5432 \ -d postgres -# Copy the .env.example file to .env and populate it with the correct values -cp .env.example .env - # Install dependencies npm install diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..fb7beea --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,30 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + target: dev + args: + NODE_ENV: development + ports: + - "3000:3000" + env_file: + - .env.development + depends_on: + - postgres + volumes: + - .:/app + command: ["sh", "-c", "npm install && npm run dev"] + develop: + watch: + - action: sync + path: ./src + target: /app/src + ignore: + - node_modules/ + - action: rebuild + path: package.json + + postgres: + env_file: + - .env.development diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ac0a6fa --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +services: + postgres: # be sure to update DATABASE_URL with this hostname + image: postgres:15 + restart: always + env_file: + - .env + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U jetkvm"] + interval: 5s + retries: 5 + timeout: 3s + + app: + build: + context: . + dockerfile: Dockerfile + args: + NODE_ENV: production + env_file: + - .env + depends_on: + postgres: + condition: service_healthy + expose: + - "3000:3000" + command: ["sh", "-c", "until pg_isready -h postgres -U jetkvm; do sleep 2; done && npx prisma migrate deploy && exec node -r ts-node/register ./src/index.ts"] + +volumes: + pgdata: diff --git a/package-lock.json b/package-lock.json index 334f794..6f2378d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,6 @@ "dependencies": { "@aws-sdk/client-s3": "^3.654.0", "@prisma/client": "^5.13.0", - "@tsconfig/node22": "^22.0.0", - "@types/cookie-session": "^2.0.49", - "@types/cors": "^2.8.17", - "@types/node": "^20.12.10", - "@types/ws": "^8.5.10", "cookie-session": "^2.1.0", "cors": "^2.8.5", "express": "^4.19.2", @@ -23,15 +18,20 @@ "http-proxy-middleware": "^3.0.0", "jose": "^5.2.4", "openid-client": "^5.6.5", - "prettier": "3.2.5", "prisma": "^5.13.0", "semver": "^7.6.3", - "ts-node": "^10.9.2", - "typescript": "^5.4.5", "ws": "^8.17.0" }, "devDependencies": { - "@types/semver": "^7.5.8" + "@tsconfig/node22": "^22.0.0", + "@types/cookie-session": "^2.0.49", + "@types/cors": "^2.8.17", + "@types/node": "^20.12.10", + "@types/semver": "^7.5.8", + "@types/ws": "^8.5.10", + "prettier": "3.2.5", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" }, "engines": { "node": "21.1.0" @@ -896,6 +896,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -907,6 +908,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -914,12 +916,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1625,32 +1629,38 @@ "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@tsconfig/node22": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.0.tgz", - "integrity": "sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==" + "integrity": "sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==", + "dev": true }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -1660,6 +1670,7 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1668,6 +1679,7 @@ "version": "2.0.49", "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.49.tgz", "integrity": "sha512-4E/bBjlqLhU5l4iGPR+NkVJH593hpNsT4dC3DJDr+ODm6Qpe13kZQVkezRIb+TYDXaBMemS3yLQ+0leba3jlkQ==", + "dev": true, "dependencies": { "@types/express": "*", "@types/keygrip": "*" @@ -1677,6 +1689,7 @@ "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1685,6 +1698,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -1696,6 +1710,7 @@ "version": "4.19.0", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -1706,7 +1721,8 @@ "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, "node_modules/@types/http-proxy": { "version": "1.17.14", @@ -1719,12 +1735,14 @@ "node_modules/@types/keygrip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/node": { "version": "20.12.10", @@ -1737,12 +1755,14 @@ "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true }, "node_modules/@types/semver": { "version": "7.5.8", @@ -1754,6 +1774,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -1763,6 +1784,7 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -1773,6 +1795,7 @@ "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1793,6 +1816,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1804,6 +1828,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -1811,7 +1836,8 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/array-flatten": { "version": "1.1.1", @@ -1982,7 +2008,8 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/debug": { "version": "2.6.9", @@ -2029,6 +2056,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { "node": ">=0.3.1" } @@ -2457,7 +2485,8 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -2647,6 +2676,7 @@ "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -2876,6 +2906,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -2943,6 +2974,7 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2987,7 +3019,8 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, "node_modules/vary": { "version": "1.1.2", @@ -3026,6 +3059,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index 8420ad4..178ba0d 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "scripts": { "start": "NODE_ENV=production node -r ts-node/register ./src/index.ts", "dev": "NODE_ENV=development node --watch --watch-path=./src --env-file=.env.development -r ts-node/register ./src/index.ts", - "dev:debug": "NODE_ENV=development node --watch --watch-path=./src --env-file=.env.development -r ts-node/register ./src/index.ts --inspect-brk" + "dev:debug": "NODE_ENV=development node --watch --watch-path=./src --env-file=.env.development -r ts-node/register ./src/index.ts --inspect-brk", + "prebuild:prod": "rm -rf ./dist", + "build:prod": "tsc" }, "engines": { "node": "21.1.0" @@ -17,11 +19,6 @@ "dependencies": { "@aws-sdk/client-s3": "^3.654.0", "@prisma/client": "^5.13.0", - "@tsconfig/node22": "^22.0.0", - "@types/cookie-session": "^2.0.49", - "@types/cors": "^2.8.17", - "@types/node": "^20.12.10", - "@types/ws": "^8.5.10", "cookie-session": "^2.1.0", "cors": "^2.8.5", "express": "^4.19.2", @@ -29,17 +26,22 @@ "http-proxy-middleware": "^3.0.0", "jose": "^5.2.4", "openid-client": "^5.6.5", - "prettier": "3.2.5", "prisma": "^5.13.0", "semver": "^7.6.3", - "ts-node": "^10.9.2", - "typescript": "^5.4.5", "ws": "^8.17.0" }, "optionalDependencies": { "bufferutil": "^4.0.8" }, "devDependencies": { - "@types/semver": "^7.5.8" + "@tsconfig/node22": "^22.0.0", + "@types/cookie-session": "^2.0.49", + "@types/cors": "^2.8.17", + "@types/node": "^20.12.10", + "@types/semver": "^7.5.8", + "@types/ws": "^8.5.10", + "prettier": "3.2.5", + "ts-node": "^10.9.2", + "typescript": "^5.4.5" } } diff --git a/tsconfig.json b/tsconfig.json index 73bbd33..b8a84ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,19 @@ { - "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { + "target": "ES2020", "module": "NodeNext", - "moduleResolution": "NodeNext" + "moduleResolution": "NodeNext", + "lib": ["ES2020"], + "allowJs": true, + "outDir": "./dist", + "rootDir": "./src", + "strict": false, + "noImplicitAny": false, // few types are not defined, once they are we can change this + "esModuleInterop": true, // few types are not defined once they are we can change this + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "sourceMap": false }, - "include": [ - "src" - ], - "exclude": [ - "node_modules" - ] -} +"include": ["src/**/*.ts"], +"exclude": ["node_modules", "dist", "**/*.spec.ts"] +} \ No newline at end of file