From 7d4796c8ebd904e132f14b3a284d576c672fc415 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 00:35:39 -0500 Subject: [PATCH 1/8] chore: update package.json and TypeScript configuration across multiple packages - Added linting and type-checking scripts to package.json for api, web, and ui packages. - Updated ESLint configuration to ignore specific directories and added global window variable. - Modified TypeScript configuration for ui package to exclude turbo generators. - Refactored Button, Card, and Code components to use props for better readability and consistency. --- apps/api/package.json | 2 ++ apps/web/package.json | 2 ++ packages/eslint-config/solid.js | 4 ++++ packages/ui/package.json | 1 + packages/ui/src/button.tsx | 8 ++++---- packages/ui/src/card.tsx | 15 +++++---------- packages/ui/src/code.tsx | 7 ++----- packages/ui/tsconfig.json | 3 ++- 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 5a4a009..e2aa519 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -7,6 +7,8 @@ "test": "test" }, "scripts": { + "lint": "eslint . --max-warnings 0", + "check-types": "tsc --noEmit", "test": "ts-node --test test/**/*.test.ts", "start": "node dist/index.js", "dev": "nodemon --delay 2000ms src/index.ts", diff --git a/apps/web/package.json b/apps/web/package.json index 3848aba..a67ab5c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,6 +4,8 @@ "version": "0.0.0", "type": "module", "scripts": { + "lint": "eslint . --max-warnings 0", + "check-types": "tsc --noEmit", "dev": "vite", "build": "tsc -b && vite build", "preview": "vite preview" diff --git a/packages/eslint-config/solid.js b/packages/eslint-config/solid.js index 92c6aaa..d32dc4b 100644 --- a/packages/eslint-config/solid.js +++ b/packages/eslint-config/solid.js @@ -13,11 +13,15 @@ export const config = [ { files: ['**/*.{ts,tsx}'], ...solid, + ignores: ['turbo/generators/**'], languageOptions: { parser: tsParser, parserOptions: { project: 'tsconfig.json', }, + globals: { + window: true, + }, }, }, ]; diff --git a/packages/ui/package.json b/packages/ui/package.json index ceae1b7..de7adbd 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -5,6 +5,7 @@ "exports": { "./*": "./src/*.tsx" }, + "type": "module", "scripts": { "lint": "eslint . --max-warnings 0", "generate:component": "turbo gen react-component", diff --git a/packages/ui/src/button.tsx b/packages/ui/src/button.tsx index 8212175..2a1e82e 100644 --- a/packages/ui/src/button.tsx +++ b/packages/ui/src/button.tsx @@ -8,13 +8,13 @@ interface ButtonProps { appName: string; } -export const Button = ({ children, className, appName }: ButtonProps) => { +export const Button = (props: ButtonProps) => { return ( ); }; diff --git a/packages/ui/src/card.tsx b/packages/ui/src/card.tsx index 19d330d..8e92799 100644 --- a/packages/ui/src/card.tsx +++ b/packages/ui/src/card.tsx @@ -1,11 +1,6 @@ import { type JSX } from 'solid-js/jsx-runtime'; -export function Card({ - className, - title, - children, - href, -}: { +export function Card(props: { className?: string; title: string; children: JSX.Element; @@ -13,15 +8,15 @@ export function Card({ }): JSX.Element { return (

- {title} -> + {props.title} ->

-

{children}

+

{props.children}

); } diff --git a/packages/ui/src/code.tsx b/packages/ui/src/code.tsx index 9ed9271..3d69f1f 100644 --- a/packages/ui/src/code.tsx +++ b/packages/ui/src/code.tsx @@ -1,11 +1,8 @@ import { type JSX } from 'solid-js/jsx-runtime'; -export function Code({ - children, - className, -}: { +export function Code(props: { children: JSX.Element; className?: string; }): JSX.Element { - return {children}; + return {props.children}; } diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 44c6177..da3b702 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -3,5 +3,6 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src"] + "include": ["src"], + "exclude": ["turbo/generators"] } From 28279942ad361e1db9427cd199aff004e701f215 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 00:35:44 -0500 Subject: [PATCH 2/8] chore: update CI workflow to include linting and type-checking - Added linting step to ensure code quality. - Included type-checking step to verify TypeScript types. --- .forgejo/workflows/ci.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index e349a4d..d1ac611 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -6,7 +6,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Status - run: git status - - name: Host - run: cat /etc/hosts \ No newline at end of file + - name: Lint + run: npm run lint + - name: Check Types + run: npm run check-types From a1590e72283cc1fb3461d7ffe26ba1eba2ac4b13 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 00:44:02 -0500 Subject: [PATCH 3/8] chore: enhance CI workflow by adding Node setup and installation steps - Included Node.js setup step to specify the Node version. - Added installation step to ensure dependencies are installed before linting and type-checking. --- .forgejo/workflows/ci.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index d1ac611..98adfa3 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -6,6 +6,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Install + run: npm install - name: Lint run: npm run lint - name: Check Types From 857ffcd6b45ddb6cae2d6cd72a4940c34734e0af Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 01:16:16 -0500 Subject: [PATCH 4/8] chore: add ESLint configuration for api and web packages - Introduced ESLint configuration files for both api and web packages to enforce coding standards. - Updated MinioService and TokenService to improve error handling and type definitions. - Refactored localStorage access in web components to use window.localStorage for consistency. - Enhanced ESLint rules in base configuration to improve code quality and maintainability. --- .../{eslint.config.js => eslint.config.mjs} | 0 apps/api/src/services/minio.service.ts | 2 +- apps/api/src/services/token.service.ts | 2 +- apps/api/src/utils/middlewares.ts | 1 + .../{eslint.config.js => eslint.config.mjs} | 0 apps/web/package.json | 1 - apps/web/src/App.tsx | 8 ++-- apps/web/src/components/chat-room.tsx | 13 +++--- apps/web/src/components/login-form.tsx | 4 +- apps/web/src/components/register-form.tsx | 4 +- apps/web/src/components/room-list.tsx | 2 +- apps/web/src/lib/graphql-client.ts | 2 +- packages/eslint-config/base.js | 40 ++++++++++++------- packages/eslint-config/solid.js | 5 +-- 14 files changed, 46 insertions(+), 38 deletions(-) rename apps/api/{eslint.config.js => eslint.config.mjs} (100%) rename apps/web/{eslint.config.js => eslint.config.mjs} (100%) diff --git a/apps/api/eslint.config.js b/apps/api/eslint.config.mjs similarity index 100% rename from apps/api/eslint.config.js rename to apps/api/eslint.config.mjs diff --git a/apps/api/src/services/minio.service.ts b/apps/api/src/services/minio.service.ts index 9037852..925c88f 100644 --- a/apps/api/src/services/minio.service.ts +++ b/apps/api/src/services/minio.service.ts @@ -91,7 +91,7 @@ export class MinioService { try { await this.client.statObject(this.bucketName, objectName); return true; - } catch (error) { + } catch (_error) { return false; } } diff --git a/apps/api/src/services/token.service.ts b/apps/api/src/services/token.service.ts index 411dfc2..1cd9b31 100644 --- a/apps/api/src/services/token.service.ts +++ b/apps/api/src/services/token.service.ts @@ -90,7 +90,7 @@ export class TokenService { ); const tx = txn - ? (callback: Function) => callback(txn) + ? (callback: (tx: TransactionClient) => Promise) => callback(txn) : this.prisma.$transaction.bind(this.prisma); await tx(async (tx) => { diff --git a/apps/api/src/utils/middlewares.ts b/apps/api/src/utils/middlewares.ts index 1cfa3b3..bd95a9f 100644 --- a/apps/api/src/utils/middlewares.ts +++ b/apps/api/src/utils/middlewares.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-function-type */ import { MercuriusContext } from 'mercurius'; const isCallback = ( diff --git a/apps/web/eslint.config.js b/apps/web/eslint.config.mjs similarity index 100% rename from apps/web/eslint.config.js rename to apps/web/eslint.config.mjs diff --git a/apps/web/package.json b/apps/web/package.json index a67ab5c..eca838f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -2,7 +2,6 @@ "name": "web", "private": true, "version": "0.0.0", - "type": "module", "scripts": { "lint": "eslint . --max-warnings 0", "check-types": "tsc --noEmit", diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 40323d6..e7ccc31 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -27,8 +27,8 @@ function App() { // Check if user is already authenticated const checkAuth = () => { - const token = localStorage.getItem('token'); - const storedUserId = localStorage.getItem('userId'); + const token = window.localStorage.getItem('token'); + const storedUserId = window.localStorage.getItem('userId'); if (token && storedUserId) { setIsAuthenticated(true); @@ -52,8 +52,8 @@ function App() { } catch (error) { console.error('Logout failed:', error); } finally { - localStorage.removeItem('token'); - localStorage.removeItem('userId'); + window.localStorage.removeItem('token'); + window.localStorage.removeItem('userId'); setIsAuthenticated(false); setUserId(''); setSelectedRoomId(null); diff --git a/apps/web/src/components/chat-room.tsx b/apps/web/src/components/chat-room.tsx index d717d32..a296f2e 100644 --- a/apps/web/src/components/chat-room.tsx +++ b/apps/web/src/components/chat-room.tsx @@ -75,10 +75,7 @@ interface ChatRoomProps { } export function ChatRoom(props: ChatRoomProps) { - const [variables, setVariables] = createSignal({ - id: props.roomId, - roomId: props.roomId, - }); + const [variables, setVariables] = createSignal({}); const [message, setMessage] = createSignal(''); const [messages, setMessages] = createSignal([]); const [confirmLeave, setConfirmLeave] = createSignal(false); @@ -240,9 +237,9 @@ export function ChatRoom(props: ChatRoomProps) { } }; - document.addEventListener('mousedown', handleClickOutside); + window.document.addEventListener('mousedown', handleClickOutside); return () => { - document.removeEventListener('mousedown', handleClickOutside); + window.document.removeEventListener('mousedown', handleClickOutside); }; }); @@ -345,8 +342,8 @@ export function ChatRoom(props: ChatRoomProps) { {showEmojiPicker() && (
- {/* @ts-ignore */} - setPickerRef(el)}> + {/* @ts-expect-error - emoji-picker-element is not typed */} + setPickerRef(el)} />
)} diff --git a/apps/web/src/components/login-form.tsx b/apps/web/src/components/login-form.tsx index 3cd7c91..2ebe95d 100644 --- a/apps/web/src/components/login-form.tsx +++ b/apps/web/src/components/login-form.tsx @@ -48,8 +48,8 @@ export function LoginForm(props: LoginFormProps) { if (result.data?.login) { const { accessToken, user } = result.data.login; - localStorage.setItem('token', accessToken); - localStorage.setItem('userId', user.id); + window.localStorage.setItem('token', accessToken); + window.localStorage.setItem('userId', user.id); props.onLoginSuccess(accessToken, user.id); } else { setError('Login failed: No data received from server'); diff --git a/apps/web/src/components/register-form.tsx b/apps/web/src/components/register-form.tsx index 5352a5a..d36283a 100644 --- a/apps/web/src/components/register-form.tsx +++ b/apps/web/src/components/register-form.tsx @@ -56,8 +56,8 @@ export function RegisterForm(props: RegisterFormProps) { if (result.data?.register) { const { accessToken, user } = result.data.register; - localStorage.setItem('token', accessToken); - localStorage.setItem('userId', user.id); + window.localStorage.setItem('token', accessToken); + window.localStorage.setItem('userId', user.id); props.onRegisterSuccess(accessToken, user.id); } else { setError('Registration failed: No data received from server'); diff --git a/apps/web/src/components/room-list.tsx b/apps/web/src/components/room-list.tsx index 20b6236..0654658 100644 --- a/apps/web/src/components/room-list.tsx +++ b/apps/web/src/components/room-list.tsx @@ -172,7 +172,7 @@ export function RoomList(props: RoomListProps) { // Check if the current user is a member of a room const isMember = (room: Room) => { - const userId = localStorage.getItem('userId'); + const userId = window.localStorage.getItem('userId'); return room.members?.some((member) => member.id === userId); }; diff --git a/apps/web/src/lib/graphql-client.ts b/apps/web/src/lib/graphql-client.ts index 36fb596..3791c8b 100644 --- a/apps/web/src/lib/graphql-client.ts +++ b/apps/web/src/lib/graphql-client.ts @@ -37,7 +37,7 @@ export const client = createClient({ ], // For development, we'll add a simple header-based authentication fetchOptions: () => { - const token = localStorage.getItem('token'); + const token = window.localStorage.getItem('token'); return { credentials: 'include', headers: { diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js index 80d5b42..b7a676c 100644 --- a/packages/eslint-config/base.js +++ b/packages/eslint-config/base.js @@ -1,4 +1,4 @@ -import js from '@eslint/js'; +import eslint from '@eslint/js'; import turboPlugin from 'eslint-plugin-turbo'; import tseslint from 'typescript-eslint'; @@ -7,18 +7,30 @@ import tseslint from 'typescript-eslint'; * * @type {import("eslint").Linter.Config[]} * */ -export const config = [ - js.configs.recommended, - ...tseslint.configs.recommended, - { - plugins: { - turbo: turboPlugin, +export const config = tseslint.config( + eslint.configs.recommended, + tseslint.configs.recommended, + [ + { + plugins: { + turbo: turboPlugin, + }, + rules: { + 'turbo/no-undeclared-env-vars': 'warn', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + }, }, - rules: { - 'turbo/no-undeclared-env-vars': 'warn', + { + ignores: ['dist/**'], }, - }, - { - ignores: ['dist/**'], - }, -]; + ] +); diff --git a/packages/eslint-config/solid.js b/packages/eslint-config/solid.js index d32dc4b..951f157 100644 --- a/packages/eslint-config/solid.js +++ b/packages/eslint-config/solid.js @@ -1,4 +1,3 @@ -import js from '@eslint/js'; import solid from 'eslint-plugin-solid/configs/typescript'; import * as tsParser from '@typescript-eslint/parser'; import { config as baseConfig } from './base.js'; @@ -9,11 +8,10 @@ import { config as baseConfig } from './base.js'; * @type {import("eslint").Linter.Config[]} */ export const config = [ ...baseConfig, - js.configs.recommended, { files: ['**/*.{ts,tsx}'], ...solid, - ignores: ['turbo/generators/**'], + ignores: ['turbo/generators/**', 'vite.config.ts'], languageOptions: { parser: tsParser, parserOptions: { @@ -21,6 +19,7 @@ export const config = [ }, globals: { window: true, + console: true, }, }, }, From bb4deff66bb4fd186a7ec6aed4910cb6848b2618 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 17:41:54 -0500 Subject: [PATCH 5/8] chore: update package-lock.json --- package-lock.json | 219 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 162 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10acf2e..54a921b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -158,19 +158,25 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/@babel/compat-data": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", @@ -407,18 +413,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -434,25 +440,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -879,40 +885,36 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", - "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.9.tgz", - "integrity": "sha512-5EVjbTegqN7RSJle6hMWYxO4voo4rI+9krITk+DWR+diJgGrjZjrIBnJhjrHYYQsFgI7j1w1QnrvV7YSKBfYGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz", + "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==", "dev": true, "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" + "core-js-pure": "^3.30.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -946,13 +948,13 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5231,9 +5233,9 @@ } }, "node_modules/fastify": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.2.1.tgz", - "integrity": "sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.2.tgz", + "integrity": "sha512-AIPqBgtqBAwkOkrnwesEE+dOyU30dQ4kh7udxeGVR05CRGwubZx+p2H8P0C4cRnQT0+EPK4VGea2DTL2RtWttg==", "funding": [ { "type": "github", @@ -5256,9 +5258,9 @@ "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^9.0.0", - "process-warning": "^4.0.0", + "process-warning": "^5.0.0", "rfdc": "^1.3.1", - "secure-json-parse": "^3.0.1", + "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } @@ -5269,6 +5271,38 @@ "integrity": "sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==", "license": "MIT" }, + "node_modules/fastify/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastify/node_modules/secure-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz", + "integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastparallel": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz", @@ -8170,6 +8204,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -8537,12 +8572,6 @@ "node": ">= 12.13.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", @@ -9420,6 +9449,51 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinygradient": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", @@ -9965,15 +10039,18 @@ } }, "node_modules/vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -10061,6 +10138,34 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitefu": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", From c7911953df9256f0721cae059b3509512a4dd720 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 18:36:47 -0500 Subject: [PATCH 6/8] chore: update environment configuration and enhance Prisma integration - Added MINIO_PORT to .env.example for Minio configuration. - Updated package.json to include a script for Prisma generation. - Modified turbo.json to ensure db:generate task is executed during build and dev processes. - Updated CI workflow to run Prisma generate step. - Adjusted imports in the API to reference the generated Prisma client correctly. - Added .gitignore entry for Prisma client directory. --- .env.example | 1 + .forgejo/workflows/ci.yaml | 6 ++++-- apps/api/.gitignore | 3 +++ apps/api/prisma/schema.prisma | 1 + apps/api/src/config.ts | 2 +- apps/api/src/index.ts | 2 +- apps/api/src/services/token.service.ts | 2 +- apps/api/src/types.ts | 2 +- package.json | 3 ++- turbo.json | 6 +++++- 10 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index 9fb1c6c..e82b6a7 100644 --- a/.env.example +++ b/.env.example @@ -11,6 +11,7 @@ MINIO_BUCKET_NAME=your-bucket-name MINIO_ENDPOINT=your-endpoint MINIO_SECRET_KEY=your-secret-key MINIO_USE_SSL=true +MINIO_PORT=9000 NODE_ENV=production TOKEN_SECRET=your-secret-key diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 98adfa3..1afa3e5 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -1,7 +1,7 @@ -name: CI +name: Lint and Check Types on: [push] jobs: - test: + validations: runs-on: docker steps: - name: Checkout @@ -12,6 +12,8 @@ jobs: node-version: 22 - name: Install run: npm install + - name: Prisma Generate + run: npm run prisma:generate - name: Lint run: npm run lint - name: Check Types diff --git a/apps/api/.gitignore b/apps/api/.gitignore index 52962c2..2b6bbfa 100644 --- a/apps/api/.gitignore +++ b/apps/api/.gitignore @@ -56,3 +56,6 @@ profile-* profile* *clinic* *flamegraph* + +# prisma +prisma/client diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 112080e..23f0c55 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -6,6 +6,7 @@ generator client { provider = "prisma-client-js" + output = "./client" } datasource db { diff --git a/apps/api/src/config.ts b/apps/api/src/config.ts index d0ea62d..c47cfa4 100644 --- a/apps/api/src/config.ts +++ b/apps/api/src/config.ts @@ -3,7 +3,7 @@ import dotenv from 'dotenv'; import path from 'path'; const rootDir = path.resolve(process.cwd(), '../../'); -dotenv.config({ path: `${rootDir}/.env.local` }); +dotenv.config({ path: `${rootDir}/.env` }); const schema = z .object({ diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 389a42d..4e9f955 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -4,7 +4,7 @@ import fastifyCookie from '@fastify/cookie'; import fastifyCors from '@fastify/cors'; import mercurius from 'mercurius'; import mercuriusCodegen from 'mercurius-codegen'; -import { PrismaClient } from '@prisma/client'; +import { PrismaClient } from '../prisma/client'; import config from './config'; import { resolvers } from './resolvers'; import schema from './schema'; diff --git a/apps/api/src/services/token.service.ts b/apps/api/src/services/token.service.ts index 1cd9b31..c338967 100644 --- a/apps/api/src/services/token.service.ts +++ b/apps/api/src/services/token.service.ts @@ -2,7 +2,7 @@ import jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; import crypto from 'crypto'; import { TokenConfig } from '../config'; -import { PrismaClient } from '@prisma/client'; +import { PrismaClient } from '../../prisma/client'; import { MemcService } from './memc.service'; type TransactionClient = Omit< diff --git a/apps/api/src/types.ts b/apps/api/src/types.ts index b007799..d3864fe 100644 --- a/apps/api/src/types.ts +++ b/apps/api/src/types.ts @@ -1,4 +1,4 @@ -import { PrismaClient } from '@prisma/client'; +import type { PrismaClient } from '../prisma/client'; import { MinioService, TokenService, diff --git a/package.json b/package.json index 8fa7b12..4b59961 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "start:api": "turbo run start --filter=api", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", - "check-types": "turbo run check-types" + "check-types": "turbo run check-types", + "prisma:generate": "turbo run prisma:generate" }, "devDependencies": { "@types/node": "^22.13.9", diff --git a/turbo.json b/turbo.json index 4e97ff0..3e7b554 100644 --- a/turbo.json +++ b/turbo.json @@ -23,7 +23,7 @@ ], "tasks": { "build": { - "dependsOn": ["^build"], + "dependsOn": ["^build", "^db:generate"], "inputs": [".env*"], "outputs": ["dist/**"] }, @@ -34,9 +34,13 @@ "dependsOn": ["^check-types"] }, "dev": { + "dependsOn": ["^db:generate"], "cache": false, "persistent": true }, + "db:generate": { + "cache": false + }, "start": { "cache": false, "persistent": true From 7ed7461a2bd697feecf0dd3e4eff5a4df2f2e5d2 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 18:39:02 -0500 Subject: [PATCH 7/8] chore: update turbo.json and CI workflow for Prisma integration - Modified turbo.json to replace db:generate with prisma:generate in build and dev tasks. - Enhanced CI workflow by adding a name to the validations job for better clarity. --- .forgejo/workflows/ci.yaml | 1 + turbo.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 1afa3e5..9e88b7f 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -2,6 +2,7 @@ name: Lint and Check Types on: [push] jobs: validations: + name: Validations runs-on: docker steps: - name: Checkout diff --git a/turbo.json b/turbo.json index 3e7b554..e8b5eb3 100644 --- a/turbo.json +++ b/turbo.json @@ -23,7 +23,7 @@ ], "tasks": { "build": { - "dependsOn": ["^build", "^db:generate"], + "dependsOn": ["^build", "^prisma:generate"], "inputs": [".env*"], "outputs": ["dist/**"] }, @@ -34,11 +34,11 @@ "dependsOn": ["^check-types"] }, "dev": { - "dependsOn": ["^db:generate"], + "dependsOn": ["^prisma:generate"], "cache": false, "persistent": true }, - "db:generate": { + "prisma:generate": { "cache": false }, "start": { From f00c6efcf9bfdf1467b5e8f83db62bbb6c2c7eb4 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Tue, 6 May 2025 18:41:46 -0500 Subject: [PATCH 8/8] chore: update ESLint configuration to ignore Prisma client directory - Added 'prisma/client/**' to the ignores list in the ESLint base configuration to prevent linting errors in the generated Prisma client files. --- packages/eslint-config/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js index b7a676c..7b23abd 100644 --- a/packages/eslint-config/base.js +++ b/packages/eslint-config/base.js @@ -30,7 +30,7 @@ export const config = tseslint.config( }, }, { - ignores: ['dist/**'], + ignores: ['dist/**', 'prisma/client/**'], }, ] );