diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 06218f4..2ce8029 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,16 +3,16 @@ // Linting & Formatting "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", - + // Code Quality & Error Handling "usernamehw.errorlens", "yoavbls.pretty-typescript-errors", "wix.vscode-import-cost", - + // Comments & Documentation "aaron-bond.better-comments", "gruntfuggly.todo-tree", - + // Framework & Language Support "ashinzekene.nestjs", "dsznajder.es7-react-js-snippets", @@ -20,51 +20,51 @@ "bradlc.vscode-tailwindcss", "heybourn.headwind", "prisma.prisma", - + // API Testing "rangav.vscode-thunder-client", "humao.rest-client", - + // Auto Tags "formulahendry.auto-close-tag", "formulahendry.auto-rename-tag", - + // Docker & DevOps "ms-azuretools.vscode-docker", "ms-kubernetes-tools.vscode-kubernetes-tools", - + // Database "mtxr.sqltools", "mongodb.mongodb-vscode", - + // YAML & Config "redhat.vscode-yaml", "mikestead.dotenv", "editorconfig.editorconfig", - + // Git "eamodio.gitlens", "mhutchie.git-graph", "vivaxy.vscode-conventional-commits", - + // Path & Navigation "christian-kohler.path-intellisense", "christian-kohler.npm-intellisense", "csstools.postcss", - + // CSS Enhancement "pranaygp.vscode-css-peek", - + // Productivity "alefragnani.bookmarks", "chakrounanas.turbo-console-log", "wallabyjs.console-ninja", - + // Icons & Theme "pkief.material-icon-theme", - + // AI Assistance (Optional - เลือก 1 อัน) - "github.copilot", + // "github.copilot", // "tabnine.tabnine-vscode" ] -} \ No newline at end of file +} diff --git a/.vscode/nap-dms.lcbp3.code-workspace b/.vscode/nap-dms.lcbp3.code-workspace deleted file mode 100644 index 6ace058..0000000 --- a/.vscode/nap-dms.lcbp3.code-workspace +++ /dev/null @@ -1,41 +0,0 @@ -{ - "folders": [ - { - "path": ".." - } - ], - "settings": { - "sqltools.connections": [ - { - "mysqlOptions": { - "authProtocol": "default", - "enableSsl": "Disabled" - }, - "ssh": "Disabled", - "previewLimit": 50, - "server": "localhost", - "port": 3306, - "driver": "MySQL", - "name": "lcbp3_dev", - "database": "lcbp3_dev", - "username": "root" - } - ], - "editor.fontSize": 16, - "editor.codeActionsOnSave": { - "terminal": "explicit" - }, - "editor.codeActions.triggerOnFocusChange": true, - "editor.tabSize": 2, - "editor.minimap.sectionHeaderFontSize": 12, - "terminal.integrated.fontSize": 15, - "workbench.colorTheme": "Default Dark Modern", - "workbench.colorCustomizations": { - "terminal.background": "#07003c", - "terminal.foreground": "#ffffff", - "terminalCursor.background": "#ffffff", - "terminalCursor.foreground": "#eeff00" - }, - "geminicodeassist.agentYoloMode": false, - } -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c5d5f52..807e69b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,34 +1,559 @@ { + // ======================================== + // EDITOR SETTINGS + // ======================================== + + // ขนาดตัวอักษรในโค้ด + "editor.fontSize": 14, + + // ความสูงของแต่ละบรรทัด + "editor.lineHeight": 1.6, + + // แสดงเส้นแนวตั้งที่ตำแหน่งตัวอักษรที่ 80 และ 120 + "editor.rulers": [80, 120], + + // เปิดใช้ minimap ขวามือ + "editor.minimap.enabled": true, + + // แสดงช่องว่างและ tab เป็นจุดและเส้น + "editor.renderWhitespace": "boundary", + + // เปิดใช้ bracket pair colorization + "editor.bracketPairColorization.enabled": true, + + // แสดงเส้นเชื่อม brackets + "editor.guides.bracketPairs": "active", + + // smooth scrolling + "editor.smoothScrolling": true, + + // cursor animation + "editor.cursorBlinking": "smooth", + "editor.cursorSmoothCaretAnimation": "on", + + // แสดง breadcrumb ด้านบน + "breadcrumbs.enabled": true, + + // word wrap ที่ขอบหน้าต่าง + "editor.wordWrap": "on", + + // ======================================== + // FORMAT ON SAVE + // ======================================== + + // format โค้ดอัตโนมัติเมื่อ save "editor.formatOnSave": true, + + // format โค้ดเมื่อ paste + "editor.formatOnPaste": true, + + // ใช้ Prettier เป็น default formatter + "editor.defaultFormatter": "esbenp.prettier-vscode", + + // กำหนด formatter เฉพาะแต่ละภาษา + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + + // ======================================== + // CODE ACTION ON SAVE + // ======================================== + + // รัน ESLint fix และจัดเรียง imports เมื่อ save "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", - "source.fixAll.sqltools": "explicit" + "source.organizeImports": "explicit", + "source.addMissingImports": "explicit" }, + + // ======================================== + // PRETTIER SETTINGS + // ======================================== + + // ใช้ single quotes แทน double quotes + "prettier.singleQuote": true, + + // ใช้ semicolons ท้ายบรรทัด + "prettier.semi": true, + + // ความกว้างของ tab เป็น 2 spaces + "prettier.tabWidth": 2, + + // ใช้ spaces แทน tabs + "prettier.useTabs": false, + + // ใส่ trailing comma ใน ES5 (objects, arrays, etc.) + "prettier.trailingComma": "es5", + + // ความกว้างสูงสุดก่อนขึ้นบรรทัดใหม่ + "prettier.printWidth": 80, + + // ใส่ comma ท้ายสุดใน multiline + "prettier.arrowParens": "always", + + // ใช้ LF (Line Feed) แทน CRLF + "prettier.endOfLine": "lf", + + // ======================================== + // ESLINT SETTINGS + // ======================================== + + // เปิดใช้ ESLint + "eslint.enable": true, + + // รัน ESLint บนไฟล์เหล่านี้ "eslint.validate": [ "javascript", "javascriptreact", "typescript", "typescriptreact" ], - "sqltools.connections": [ + + // แสดง ESLint status ใน status bar + "eslint.alwaysShowStatus": true, + + // ======================================== + // ERROR LENS SETTINGS + // ======================================== + + // เปิดใช้ Error Lens + "errorLens.enabled": true, + + // แสดง errors, warnings, และ info + "errorLens.enabledDiagnosticLevels": [ + "error", + "warning", + "info" + ], + + // ระยะห่างของข้อความจากโค้ด + "errorLens.padding": "0 1ch", + + // ตำแหน่งข้อความ error + "errorLens.messageTemplate": "$message", + + // แสดง error ท้ายบรรทัด + "errorLens.messageEnabled": true, + + // ======================================== + // TAILWIND CSS SETTINGS + // ======================================== + + // เปิดใช้ IntelliSense สำหรับ Tailwind + "tailwindCSS.emmetCompletions": true, + + // แสดง color preview + "tailwindCSS.colorDecorators": true, + + // เปิดใช้ suggestions + "tailwindCSS.suggestions": true, + + // ไฟล์ที่จะใช้ Tailwind IntelliSense + "tailwindCSS.includeLanguages": { + "typescript": "javascript", + "typescriptreact": "javascript" + }, + + // ======================================== + // HEADWIND (Tailwind Class Sorter) + // ======================================== + + // รัน Headwind เมื่อ save + "headwind.runOnSave": true, + + // ======================================== + // AUTO CLOSE/RENAME TAG + // ======================================== + + // เปิดใช้ auto close tag + "auto-close-tag.activationOnLanguage": [ + "html", + "xml", + "php", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + + // เปิดใช้ auto rename tag + "auto-rename-tag.activationOnLanguage": [ + "html", + "xml", + "php", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + + // ======================================== + // BETTER COMMENTS + // ======================================== + + // กำหนดสีและรูปแบบของ comments + "better-comments.tags": [ { - "mysqlOptions": { - "authProtocol": "default", - "enableSsl": "Disabled" - }, - "ssh": "Disabled", - "previewLimit": 50, - "server": "localhost", - "port": 3306, - "driver": "MySQL", - "name": "lcbp3_dev", - "database": "lcbp3_dev", - "username": "root" + "tag": "!", + "color": "#FF2D00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "?", + "color": "#3498DB", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "//", + "color": "#474747", + "strikethrough": true, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "todo", + "color": "#FF8C00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "*", + "color": "#98C379", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false } ], - "editor.fontSize": 16, - "editor.fontLigatures": false, - "editor.tabSize": 2, - "editor.minimap.sectionHeaderFontSize": 12, - "markdown.extension.print.theme": "dark" + + // ======================================== + // TODO TREE + // ======================================== + + // keywords ที่จะ highlight + "todo-tree.general.tags": [ + "TODO", + "FIXME", + "BUG", + "HACK", + "NOTE", + "XXX" + ], + + // highlight TODO ในโค้ด + "todo-tree.highlights.enabled": true, + + // แสดง TODO tree ใน activity bar + "todo-tree.tree.showInExplorer": false, + + // กำหนดสีของแต่ละ tag + "todo-tree.highlights.defaultHighlight": { + "foreground": "black", + "type": "text", + "opacity": 50 + }, + + "todo-tree.highlights.customHighlight": { + "TODO": { + "icon": "check", + "iconColour": "#FF8C00", + "foreground": "#FF8C00" + }, + "FIXME": { + "icon": "alert", + "iconColour": "#FF2D00", + "foreground": "#FF2D00" + }, + "BUG": { + "icon": "bug", + "iconColour": "#FF2D00", + "foreground": "#FF2D00" + }, + "NOTE": { + "icon": "note", + "iconColour": "#3498DB", + "foreground": "#3498DB" + } + }, + + // ======================================== + // GITLENS SETTINGS + // ======================================== + + // แสดง Git blame ใน status bar + "gitlens.statusBar.enabled": true, + + // แสดง current line blame + "gitlens.currentLine.enabled": true, + + // format ของ current line blame + "gitlens.currentLine.format": "${author}, ${agoOrDate}", + + // แสดง codelens (ข้อมูล Git เหนือฟังก์ชัน) + "gitlens.codeLens.enabled": true, + + // แสดง blame annotations + "gitlens.hovers.enabled": true, + + // ======================================== + // GIT SETTINGS + // ======================================== + + // เปิดใช้ Git + "git.enabled": true, + + // auto fetch ทุก 180 วินาที + "git.autofetch": true, + "git.autofetchPeriod": 180, + + // ยืนยันก่อน sync + "git.confirmSync": false, + + // enable smart commit + "git.enableSmartCommit": true, + + // ======================================== + // PATH INTELLISENSE + // ======================================== + + // mappings สำหรับ path aliases + "path-intellisense.mappings": { + "@": "${workspaceFolder}/src" + }, + + // ======================================== + // IMPORT COST + // ======================================== + + // แสดงขนาดของ imports + "importCost.showCalculatingDecoration": true, + + // เตือนเมื่อ import ใหญ่เกิน + "importCost.largePackageSize": 100, + "importCost.mediumPackageSize": 50, + "importCost.smallPackageSize": 20, + + // ======================================== + // JAVASCRIPT/TYPESCRIPT + // ======================================== + + // auto imports + "javascript.suggest.autoImports": true, + "typescript.suggest.autoImports": true, + + // update imports on file move + "javascript.updateImportsOnFileMove.enabled": "always", + "typescript.updateImportsOnFileMove.enabled": "always", + + // inlay hints + "javascript.inlayHints.parameterNames.enabled": "all", + "typescript.inlayHints.parameterNames.enabled": "all", + "javascript.inlayHints.functionLikeReturnTypes.enabled": true, + "typescript.inlayHints.functionLikeReturnTypes.enabled": true, + + // ======================================== + // EMMET + // ======================================== + + // เปิดใช้ Emmet + "emmet.includeLanguages": { + "javascript": "javascriptreact", + "typescript": "typescriptreact" + }, + + // trigger Emmet ด้วย Tab + "emmet.triggerExpansionOnTab": true, + + // ======================================== + // FILES + // ======================================== + + // auto save + "files.autoSave": "onFocusChange", + + // ลบ whitespace ท้ายบรรทัดเมื่อ save + "files.trimTrailingWhitespace": true, + + // เพิ่มบรรทัดว่างท้ายไฟล์ + "files.insertFinalNewline": true, + + // encoding + "files.encoding": "utf8", + + // line ending + "files.eol": "\n", + + // exclude files/folders จาก explorer + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/node_modules": true, + "**/.next": true, + "**/dist": true, + "**/build": true, + "**/.turbo": true + }, + + // ======================================== + // SEARCH + // ======================================== + + // exclude files/folders จากการค้นหา + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/build": true, + "**/.next": true, + "**/.turbo": true, + "**/coverage": true, + "**/.git": true, + "**/yarn.lock": true, + "**/package-lock.json": true, + "**/pnpm-lock.yaml": true + }, + + // ======================================== + // TERMINAL + // ======================================== + + // font size ใน terminal + "terminal.integrated.fontSize": 13, + + // line height ใน terminal + "terminal.integrated.lineHeight": 1.2, + + // smooth scrolling + "terminal.integrated.smoothScrolling": true, + + // ======================================== + // WORKBENCH + // ======================================== + + // icon theme + "workbench.iconTheme": "material-icon-theme", + + // color theme (เลือกตามชอบ) + // "workbench.colorTheme": "One Dark Pro", + + // แสดง activity bar + "workbench.activityBar.location": "default", + + // tree indent + "workbench.tree.indent": 15, + + // smooth scrolling + "workbench.list.smoothScrolling": true, + + // ======================================== + // EXPLORER + // ======================================== + + // compact folders + "explorer.compactFolders": false, + + // confirm before delete + "explorer.confirmDelete": true, + + // confirm drag and drop + "explorer.confirmDragAndDrop": false, + + // ======================================== + // JEST + // ======================================== + + // auto run tests + "jest.autoRun": "off", + + // แสดง coverage overlay + "jest.showCoverageOnLoad": false, + + // ======================================== + // DOCKER + // ======================================== + + // format docker files + "docker.languageserver.formatter.ignoreMultilineInstructions": true, + + // ======================================== + // YAML + // ======================================== + + // schemas สำหรับ YAML validation + "yaml.schemas": { + "https://json.schemastore.org/github-workflow.json": ".github/workflows/*.{yml,yaml}", + "https://json.schemastore.org/github-action.json": "action.{yml,yaml}", + "https://json.schemastore.org/prettierrc.json": ".prettierrc.{yml,yaml}" + }, + + // format YAML files + "yaml.format.enable": true, + + // ======================================== + // CONSOLE NINJA + // ======================================== + + // เปิดใช้ Console Ninja + "console-ninja.featureSet": "Community", + + // ======================================== + // REST CLIENT + // ======================================== + + // timeout สำหรับ HTTP requests (milliseconds) + "rest-client.timeoutinmilliseconds": 30000, + + // แสดงเวลาที่ใช้ในการ request + "rest-client.showResponseInDifferentTab": true, + + // ======================================== + // SECURITY + // ======================================== + + // trust workspace + "security.workspace.trust.untrustedFiles": "open", + + // ======================================== + // PERFORMANCE + // ======================================== + + // จำกัดจำนวนไฟล์ที่เปิดพร้อมกัน + "files.maxMemoryForLargeFilesMB": 4096, + + // ปิด crash reporter + "telemetry.telemetryLevel": "off" } \ No newline at end of file diff --git a/nap-dms.lcbp3.code-workspace b/nap-dms.lcbp3.code-workspace new file mode 100644 index 0000000..22e9684 --- /dev/null +++ b/nap-dms.lcbp3.code-workspace @@ -0,0 +1,718 @@ +{ + "folders": [+ + { + "name": "🗓️ Documents", + "path": "./Documnets" + }, + + { + "name": "🔧 Backend", + "path": "./backend" + }, + { + "name": "🎨 Frontend", + "path": "./frontend" + }, + { + "name": "🎯 Root", + "path": "./" + } + ], + "settings": { + // ======================================== + // EDITOR SETTINGS + // ======================================== + + "editor.fontSize": 14, + "editor.lineHeight": 1.6, + "editor.rulers": [80, 120], + "editor.minimap.enabled": true, + "editor.renderWhitespace": "boundary", + "editor.bracketPairColorization.enabled": true, + "editor.guides.bracketPairs": "active", + "editor.smoothScrolling": true, + "editor.cursorBlinking": "smooth", + "editor.cursorSmoothCaretAnimation": "on", + "editor.wordWrap": "on", + "editor.linkedEditing": true, + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.suggestSelection": "first", + "editor.tabSize": 2, + "editor.detectIndentation": true, + + // ======================================== + // DEFAULT FORMATTER + // ======================================== + + "editor.defaultFormatter": "esbenp.prettier-vscode", + + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.wordWrap": "on" + }, + "[yaml]": { + "editor.defaultFormatter": "redhat.vscode-yaml" + }, + "[dockerfile]": { + "editor.defaultFormatter": "ms-azuretools.vscode-docker" + }, + + // ======================================== + // CODE ACTION ON SAVE + // ======================================== + + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit", + "source.addMissingImports": "explicit" + }, + + // ======================================== + // PRETTIER SETTINGS + // ======================================== + + "prettier.singleQuote": true, + "prettier.semi": true, + "prettier.tabWidth": 2, + "prettier.useTabs": false, + "prettier.trailingComma": "es5", + "prettier.printWidth": 80, + "prettier.arrowParens": "always", + "prettier.endOfLine": "lf", + "prettier.bracketSpacing": true, + "prettier.jsxSingleQuote": false, + + // ======================================== + // ESLINT SETTINGS + // ======================================== + + "eslint.enable": true, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + "eslint.alwaysShowStatus": true, + "eslint.format.enable": false, + "eslint.workingDirectories": ["./backend", "./frontend"], + + // ======================================== + // PATH INTELLISENSE - ไม่มี src folder + // ======================================== + + "path-intellisense.mappings": { + // Backend paths (ไม่มี src) + "@backend": "${workspaceFolder:🔧 Backend}", + "@backend/*": "${workspaceFolder:🔧 Backend}/*", + "@modules": "${workspaceFolder:🔧 Backend}/modules", + "@common": "${workspaceFolder:🔧 Backend}/common", + "@config": "${workspaceFolder:🔧 Backend}/config", + "@utils": "${workspaceFolder:🔧 Backend}/utils", + "@entities": "${workspaceFolder:🔧 Backend}/entities", + "@dto": "${workspaceFolder:🔧 Backend}/dto", + + // Frontend paths (ไม่มี src) + "@": "${workspaceFolder:🎨 Frontend}", + "@/*": "${workspaceFolder:🎨 Frontend}/*", + "@components": "${workspaceFolder:🎨 Frontend}/components", + "@hooks": "${workspaceFolder:🎨 Frontend}/hooks", + "@utils": "${workspaceFolder:🎨 Frontend}/utils", + "@lib": "${workspaceFolder:🎨 Frontend}/lib", + "@types": "${workspaceFolder:🎨 Frontend}/types", + "@api": "${workspaceFolder:🎨 Frontend}/api", + "@styles": "${workspaceFolder:🎨 Frontend}/styles", + "@assets": "${workspaceFolder:🎨 Frontend}/assets", + "@store": "${workspaceFolder:🎨 Frontend}/store", + "@contexts": "${workspaceFolder:🎨 Frontend}/contexts" + }, + "path-intellisense.autoSlashAfterDirectory": true, + "path-intellisense.extensionOnImport": false, + "path-intellisense.showHiddenFiles": false, + + // ======================================== + // ERROR LENS + // ======================================== + + "errorLens.enabled": true, + "errorLens.enabledDiagnosticLevels": ["error", "warning"], + "errorLens.padding": "0 1ch", + "errorLens.messageTemplate": "$message", + "errorLens.messageEnabled": true, + + // ======================================== + // TAILWIND CSS + // ======================================== + + "tailwindCSS.emmetCompletions": true, + "tailwindCSS.colorDecorators": true, + "tailwindCSS.suggestions": true, + "tailwindCSS.includeLanguages": { + "typescript": "javascript", + "typescriptreact": "javascript" + }, + "tailwindCSS.experimental.classRegex": [ + ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"], + ["cn\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"], + "class[Nn]ame\\s*=\\s*['\"`]([^'\"`]*)['\"`]" + ], + + // ระบุที่ตั้งของ tailwind.config (ถ้ามี) + "tailwindCSS.experimental.configFile": { + "frontend/tailwind.config.js": "frontend/**", + "frontend/tailwind.config.ts": "frontend/**" + }, + + // ======================================== + // HEADWIND + // ======================================== + + "headwind.runOnSave": true, + + // ======================================== + // AUTO CLOSE/RENAME TAG + // ======================================== + + "auto-close-tag.activationOnLanguage": [ + "html", + "xml", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + + "auto-rename-tag.activationOnLanguage": [ + "html", + "xml", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + + // ======================================== + // BETTER COMMENTS + // ======================================== + + "better-comments.tags": [ + { + "tag": "!", + "color": "#FF2D00", + "strikethrough": false, + "backgroundColor": "transparent", + "bold": true + }, + { + "tag": "?", + "color": "#3498DB", + "strikethrough": false, + "backgroundColor": "transparent" + }, + { + "tag": "//", + "color": "#474747", + "strikethrough": true, + "backgroundColor": "transparent" + }, + { + "tag": "todo", + "color": "#FF8C00", + "strikethrough": false, + "backgroundColor": "transparent" + }, + { + "tag": "*", + "color": "#98C379", + "strikethrough": false, + "backgroundColor": "transparent" + } + ], + + // ======================================== + // TODO TREE + // ======================================== + + "todo-tree.general.tags": ["TODO", "FIXME", "BUG", "HACK", "NOTE", "XXX"], + "todo-tree.highlights.enabled": true, + "todo-tree.tree.showInExplorer": true, + "todo-tree.filtering.excludeGlobs": [ + "**/node_modules", + "**/dist", + "**/build", + "**/.next" + ], + "todo-tree.highlights.customHighlight": { + "TODO": { + "icon": "check", + "iconColour": "#FF8C00", + "foreground": "#FF8C00" + }, + "FIXME": { + "icon": "alert", + "iconColour": "#FF2D00", + "foreground": "#FF2D00" + }, + "BUG": { + "icon": "bug", + "iconColour": "#FF2D00", + "foreground": "#FF2D00" + }, + "NOTE": { + "icon": "note", + "iconColour": "#3498DB", + "foreground": "#3498DB" + } + }, + + // ======================================== + // GITLENS + // ======================================== + + "gitlens.statusBar.enabled": true, + "gitlens.currentLine.enabled": true, + "gitlens.currentLine.format": "${author}, ${agoOrDate}", + "gitlens.codeLens.enabled": true, + "gitlens.codeLens.authors.enabled": false, + "gitlens.hovers.enabled": true, + + // ======================================== + // GIT + // ======================================== + + "git.enabled": true, + "git.autofetch": true, + "git.autofetchPeriod": 180, + "git.confirmSync": false, + "git.enableSmartCommit": true, + "git.openRepositoryInParentFolders": "always", + + // ======================================== + // IMPORT COST + // ======================================== + + "importCost.showCalculatingDecoration": true, + "importCost.largePackageSize": 100, + "importCost.mediumPackageSize": 50, + "importCost.smallPackageSize": 20, + + // ======================================== + // JAVASCRIPT/TYPESCRIPT + // ======================================== + + "javascript.suggest.autoImports": true, + "javascript.updateImportsOnFileMove.enabled": "always", + "javascript.inlayHints.parameterNames.enabled": "all", + "javascript.inlayHints.functionLikeReturnTypes.enabled": true, + "javascript.preferences.importModuleSpecifier": "relative", + + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + "typescript.inlayHints.parameterNames.enabled": "all", + "typescript.inlayHints.functionLikeReturnTypes.enabled": true, + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.tsdk": "node_modules/typescript/lib", + + // ======================================== + // EMMET + // ======================================== + + "emmet.includeLanguages": { + "javascript": "javascriptreact", + "typescript": "typescriptreact" + }, + "emmet.triggerExpansionOnTab": true, + + // ======================================== + // FILES + // ======================================== + + "files.autoSave": "onFocusChange", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.encoding": "utf8", + "files.eol": "\n", + "files.associations": { + "*.css": "tailwindcss", + ".env*": "dotenv" + }, + + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/node_modules": true, + "**/.next": true, + "**/dist": true, + "**/build": true, + "**/.turbo": true, + "**/coverage": true + }, + + "files.watcherExclude": { + "**/.git/objects/**": true, + "**/node_modules/**": true, + "**/.next/**": true, + "**/dist/**": true, + "**/build/**": true + }, + + // ======================================== + // SEARCH + // ======================================== + + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/build": true, + "**/.next": true, + "**/coverage": true, + "**/yarn.lock": true, + "**/package-lock.json": true, + "**/pnpm-lock.yaml": true + }, + "search.useIgnoreFiles": true, + "search.smartCase": true, + + // ======================================== + // TERMINAL + // ======================================== + + "terminal.integrated.fontSize": 13, + "terminal.integrated.lineHeight": 1.2, + "terminal.integrated.smoothScrolling": true, + "terminal.integrated.defaultProfile.windows": "Git Bash", + "terminal.integrated.cwd": "${workspaceFolder}", + + // ======================================== + // WORKBENCH + // ======================================== + + "workbench.iconTheme": "material-icon-theme", + "workbench.activityBar.location": "default", + "workbench.tree.indent": 15, + "workbench.list.smoothScrolling": true, + "workbench.editor.enablePreview": false, + "workbench.startupEditor": "welcomePage", + + // ======================================== + // EXPLORER + // ======================================== + + "explorer.compactFolders": false, + "explorer.confirmDelete": true, + "explorer.confirmDragAndDrop": false, + "explorer.sortOrder": "type", + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.expand": false, + "explorer.fileNesting.patterns": { + "package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, .npmrc", + "tsconfig.json": "tsconfig.*.json", + ".env": ".env.*", + "docker-compose.yml": "docker-compose.*.yml, Dockerfile*", + "*.ts": "${capture}.test.ts, ${capture}.spec.ts", + "*.tsx": "${capture}.test.tsx, ${capture}.spec.tsx, ${capture}.module.css", + "*.js": "${capture}.test.js, ${capture}.spec.js", + "*.jsx": "${capture}.test.jsx, ${capture}.spec.jsx" + }, + + // ======================================== + // JEST + // ======================================== + + "jest.autoRun": "off", + "jest.showCoverageOnLoad": false, + + // ======================================== + // DOCKER + // ======================================== + + "docker.languageserver.formatter.ignoreMultilineInstructions": true, + + // ======================================== + // YAML + // ======================================== + + "yaml.schemas": { + "https://json.schemastore.org/github-workflow.json": ".github/workflows/*.{yml,yaml}", + "https://json.schemastore.org/docker-compose.json": "docker-compose*.{yml,yaml}" + }, + "yaml.format.enable": true, + "yaml.validate": true, + + // ======================================== + // REST CLIENT + // ======================================== + + "rest-client.timeoutinmilliseconds": 30000, + "rest-client.showResponseInDifferentTab": true, + "rest-client.environmentVariables": { + "$shared": { + "apiUrl": "http://localhost:3000" + }, + "development": { + "apiUrl": "http://localhost:3000" + }, + "production": { + "apiUrl": "https://api.yourdomain.com" + } + }, + + // ======================================== + // MATERIAL ICON THEME + // ======================================== + + "material-icon-theme.folders.theme": "specific", + "material-icon-theme.folders.associations": { + "hooks": "Custom", + "utils": "Helper", + "lib": "Library", + "components": "Components", + "api": "Api", + "dto": "Class", + "entities": "Database", + "modules": "Folder-Controllers", + "common": "Shared", + "config": "Config" + }, + + // ======================================== + // PERFORMANCE + // ======================================== + + "files.maxMemoryForLargeFilesMB": 4096, + "telemetry.telemetryLevel": "off", + "security.workspace.trust.untrustedFiles": "open" + }, + + // ======================================== + // LAUNCH CONFIGURATIONS + // ======================================== + + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "🔧 Debug Backend", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "start:debug"], + "cwd": "${workspaceFolder:🔧 Backend}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "skipFiles": ["/**"], + "sourceMaps": true, + "restart": true + }, + { + "name": "🎨 Debug Frontend", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder:🎨 Frontend}", + "sourceMapPathOverrides": { + "webpack:///./*": "${webRoot}/*" + } + }, + { + "name": "🧪 Debug Jest Tests (Backend)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "test:debug"], + "cwd": "${workspaceFolder:🔧 Backend}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "🧪 Debug Jest Tests (Frontend)", + "type": "node", + "request": "launch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "test:debug"], + "cwd": "${workspaceFolder:🎨 Frontend}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } + ], + "compounds": [ + { + "name": "🚀 Debug Full Stack", + "configurations": ["🔧 Debug Backend", "🎨 Debug Frontend"], + "stopAll": true + } + ] + }, + + // ======================================== + // TASKS + // ======================================== + + "tasks": { + "version": "2.0.0", + "tasks": [ + { + "label": "🔧 Start Backend Dev", + "type": "npm", + "script": "start:dev", + "path": "backend/", + "problemMatcher": [], + "presentation": { + "reveal": "always", + "panel": "dedicated", + "group": "dev" + } + }, + { + "label": "🎨 Start Frontend Dev", + "type": "npm", + "script": "dev", + "path": "frontend/", + "problemMatcher": [], + "presentation": { + "reveal": "always", + "panel": "dedicated", + "group": "dev" + } + }, + { + "label": "🚀 Start Full Stack", + "dependsOn": ["🔧 Start Backend Dev", "🎨 Start Frontend Dev"], + "problemMatcher": [] + }, + { + "label": "🧪 Run Backend Tests", + "type": "npm", + "script": "test", + "path": "backend/", + "problemMatcher": [] + }, + { + "label": "🧪 Run Frontend Tests", + "type": "npm", + "script": "test", + "path": "frontend/", + "problemMatcher": [] + }, + { + "label": "🏗️ Build Backend", + "type": "npm", + "script": "build", + "path": "backend/", + "problemMatcher": ["$tsc"], + "group": { + "kind": "build", + "isDefault": false + } + }, + { + "label": "🏗️ Build Frontend", + "type": "npm", + "script": "build", + "path": "frontend/", + "problemMatcher": ["$tsc"], + "group": { + "kind": "build", + "isDefault": false + } + }, + { + "label": "🔍 Lint Backend", + "type": "npm", + "script": "lint", + "path": "backend/", + "problemMatcher": ["$eslint-stylish"] + }, + { + "label": "🔍 Lint Frontend", + "type": "npm", + "script": "lint", + "path": "frontend/", + "problemMatcher": ["$eslint-stylish"] + }, + { + "label": "🐳 Docker Compose Up", + "type": "shell", + "command": "docker-compose up -d", + "problemMatcher": [] + }, + { + "label": "🐳 Docker Compose Down", + "type": "shell", + "command": "docker-compose down", + "problemMatcher": [] + } + ] + }, + + // ======================================== + // EXTENSIONS + // ======================================== + + "extensions": { + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "usernamehw.errorlens", + "yoavbls.pretty-typescript-errors", + "wix.vscode-import-cost", + "aaron-bond.better-comments", + "gruntfuggly.todo-tree", + "ashinzekene.nestjs", + "dsznajder.es7-react-js-snippets", + "orta.vscode-jest", + "bradlc.vscode-tailwindcss", + "heybourn.headwind", + "prisma.prisma", + "rangav.vscode-thunder-client", + "humao.rest-client", + "formulahendry.auto-close-tag", + "formulahendry.auto-rename-tag", + "ms-azuretools.vscode-docker", + "mtxr.sqltools", + "mongodb.mongodb-vscode", + "redhat.vscode-yaml", + "mikestead.dotenv", + "editorconfig.editorconfig", + "eamodio.gitlens", + "mhutchie.git-graph", + "vivaxy.vscode-conventional-commits", + "christian-kohler.path-intellisense", + "christian-kohler.npm-intellisense", + "pranaygp.vscode-css-peek", + "alefragnani.bookmarks", + "chakrounanas.turbo-console-log", + "wallabyjs.console-ninja", + "pkief.material-icon-theme", + "github.copilot" + ] + } +}