Files
lcbp3/lcbp3.code-workspace
admin 8f4b28519d
Some checks failed
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled
251202:1300
2025-12-02 13:26:05 +07:00

935 lines
30 KiB
Plaintext

{
"folders": [
{ "name": "🎯 Root", "path": "./" },
{ "name": "🔧 Backend", "path": "./backend" },
{ "name": "🎨 Frontend", "path": "./frontend" },
{ "name": "🗓️ docs", "path": "./docs" },
{ "name": "🔗 specs", "path": "./specs" }
],
"settings": {
// ========================================
// EDITOR SETTINGS
// ========================================
"editor.fontSize": 15,
"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": "dbaeumer.vscode-eslint"
},
"[sql]": {
"editor.tabSize": 2,
"editor.insertSpaces": true
},
"sqltools.codelensLanguages": ["sql"],
"sqltools.format": {
"language": "sql",
"params": {
"keywordCase": "upper", // ทำให้ INSERT, VALUES เป็นตัวใหญ่
"tabWidth": 2, // เยื้อง 3 ช่องว่าง (ปรับจาก 4 เป็น 3 เพื่อ match ตัวอย่าง)
"expressionWidth": 80, // ความยาวสูงสุดต่อบรรทัดก่อนตีบรรทัดใหม่ (ป้องกันคอลัมน์แยกบรรทัด)
"reservedWordCase": "upper", // ทำให้คำสงวนเป็นตัวใหญ่
"linesBetweenQueries": 1,
"logicalOperatorNewline": "before",
"aliasAs": "before",
"commaPosition": "after",
"linesAroundComments": 0,
"tabulateAlias": false,
"newlineBeforeSemicolon": false
}
},
"sqltools.formatOnSave": true,
"sqltools.formatOnSaveLanguage": "sql",
// ========================================
// CODE ACTION ON SAVE
// ========================================
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
// "source.fixAll.eslint": "explicit"
"source.organizeImports": "explicit",
"source.addMissingImports": "explicit"
},
// ========================================
// PRETTIER SETTINGS .prettierrc
// ========================================
// ========================================
// ESLINT SETTINGS
// ========================================
"eslint.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"eslint.alwaysShowStatus": true,
"eslint.format.enable": false,
"eslint.lintTask.enable": true,
"eslint.workingDirectories": ["./backend", "./frontend"],
// ========================================
// PATH INTELLISENSE - ไม่มี src folder
// ========================================
"path-intellisense.mappings": {
// Backend paths
"@backend": "${workspaceFolder:🔧 Backend (NestJS)}/src",
"@backend/*": "${workspaceFolder:🔧 Backend (NestJS)}/src/*",
"@modules": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules",
"@common": "${workspaceFolder:🔧 Backend (NestJS)}/src/common",
"@config": "${workspaceFolder:🔧 Backend (NestJS)}/src/common/config",
"@circulation": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/circulation",
"@correspondence": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/correspondence",
"@document-numbering": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/document-numbering",
"@drawing": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/drawing",
"@json-schema": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/json-schema",
"@master": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/master",
"@monitoring": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/monitoring",
"@notification": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/notification",
"@project": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/project",
"@rfa": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/rfa",
"@search": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/search",
"@transmittal": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/transmittal",
"@users": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/users",
"@workflow-engine": "${workspaceFolder:🔧 Backend (NestJS)}/src/modules/workflow-engine",
// Frontend paths (ไม่มี src)
"@": "${workspaceFolder:🎨 Frontend (React/Next.js)}/app",
"@/*": "${workspaceFolder:🎨 Frontend (React/Next.js)}/app/*",
"@app": "${workspaceFolder:🎨 Frontend (React/Next.js)}/app",
"@components": "${workspaceFolder:🎨 Frontend (React/Next.js)}/components",
"@config": "${workspaceFolder:🎨 Frontend (React/Next.js)}/config",
"@lib": "${workspaceFolder:🎨 Frontend (React/Next.js)}/lib",
"@hooks": "${workspaceFolder:🎨 Frontend (React/Next.js)}/app/hooks",
"@utils": "${workspaceFolder:🎨 Frontend (React/Next.js)}/utils",
"@providers": "${workspaceFolder:🎨 Frontend (React/Next.js)}/providers",
"@public": "${workspaceFolder:🎨 Frontend (React/Next.js)}/public",
"@styles": "${workspaceFolder:🎨 Frontend (React/Next.js)}/styles",
"@types": "${workspaceFolder:🎨 Frontend (React/Next.js)}/types",
"@api": "${workspaceFolder:🎨 Frontend (React/Next.js)}/app/api"
},
"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": {
//"backend/tailwind.config.js": "backend/**",
"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",
"[ ]",
"[x]"
],
"todo-tree.highlights.enabled": true,
"todo-tree.tree.showScanModeButton": 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"
},
"HACK": {
"icon": "tools",
"iconColour": "#FFA500",
"foreground": "#FFA500"
}
},
// ========================================
// GITLENS
// ========================================
"gitlens.statusBar.enabled": true,
"gitlens.currentLine.enabled": true,
"gitlens.currentLine.format": "${author}, ${agoOrDate}",
"gitlens.codeLens.enabled": true,
"gitlens.codeLens.authors.enabled": false,
"gitlens.codeLens.recentChange.enabled": true,
"gitlens.hovers.enabled": true,
"gitlens.blame.format": "${author|10} ${agoOrDate|14-}",
"gitlens.blame.highlight.enabled": false,
"gitlens.views.repositories.location": "scm",
"gitlens.views.fileHistory.location": "explorer",
"gitlens.views.lineHistory.location": "explorer",
// ========================================
// GIT
// ========================================
"git.enabled": true,
"git.autofetch": true,
"git.autofetchPeriod": 180,
"git.confirmSync": false,
"git.enableSmartCommit": true,
"git.postCommitCommand": "none",
"git.untrackedChanges": "separate",
"git.openRepositoryInParentFolders": "always",
// ========================================
// IMPORT COST
// ========================================
"importCost.showCalculatingDecoration": true,
"importCost.largePackageSize": 100,
"importCost.mediumPackageSize": 50,
"importCost.smallPackageSize": 20,
"importCost.largePackageColor": "#FF2D00",
"importCost.mediumPackageColor": "#FF8C00",
"importCost.smallPackageColor": "#98C379",
// ========================================
// JAVASCRIPT/TYPESCRIPT
// ========================================
"javascript.suggest.autoImports": true,
"javascript.updateImportsOnFileMove.enabled": "always",
"javascript.inlayHints.parameterNames.enabled": "all",
"javascript.inlayHints.functionLikeReturnTypes.enabled": true,
"javascript.inlayHints.variableTypes.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.inlayHints.variableTypes.enabled": false,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.preferences.importModuleSpecifier": "relative",
"typescript.tsdk": "node_modules/typescript/lib",
// ========================================
// EMMET
// ========================================
"emmet.includeLanguages": {
"javascript": "javascriptreact",
"typescript": "typescriptreact"
},
"emmet.triggerExpansionOnTab": true,
"emmet.showSuggestionsAsSnippets": true,
// ========================================
// FILES
// ========================================
//"files.autoSave": "onFocusChange",
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"files.encoding": "utf8",
"files.eol": "\n",
"files.associations": {
"*.css": "tailwindcss",
".env*": "dotenv",
"*.md": "markdown"
},
"files.exclude": {
"**/.git": true,
"**/.DS_Store": true,
"**/node_modules": true,
"**/.next": true,
"**/dist": true,
"**/build": true,
"**/.turbo": true,
"**/coverage": true,
"**/.nyc_output": true,
"**/*.log": true
},
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/node_modules/**": true,
"**/.next/**": true,
"**/dist/**": true,
"**/build/**": true,
"**/.turbo/**": true
},
// ========================================
// SEARCH
// ========================================
"search.exclude": {
"**/node_modules": true,
"**/dist": true,
"**/build": true,
"**/.next": true,
"**/.turbo": true,
"**/coverage": true,
"**/.nyc_output": true,
"**/yarn.lock": true,
"**/package-lock.json": true,
"**/pnpm-lock.yaml": true,
"**/*.log": true
},
"search.followSymlinks": false,
"search.useIgnoreFiles": true,
"search.smartCase": true,
// ========================================
// TERMINAL
// ========================================
"terminal.integrated.fontSize": 15,
"terminal.integrated.lineHeight": 1.2,
"terminal.integrated.smoothScrolling": true,
"terminal.integrated.cursorBlinking": true,
"terminal.integrated.fontFamily": "MesloLGS NF, Consolas, monospace",
"terminal.integrated.profiles.windows": {
"PowerShell-7": {
"path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
"icon": "terminal-powershell"
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell-7",
"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.editor.limit.enabled": true,
"workbench.editor.limit.value": 10,
"workbench.startupEditor": "welcomePage",
"workbench.colorCustomizations": {
"[One Dark Pro]": {
"activityBarBadge.background": "#FF8C00",
"list.activeSelectionForeground": "#FF8C00",
"list.inactiveSelectionForeground": "#FF8C00",
"list.highlightForeground": "#FF8C00",
"scrollbarSlider.activeBackground": "#FF8C0050",
"editorSuggestWidget.highlightForeground": "#FF8C00",
"textLink.foreground": "#FF8C00"
}
},
// ========================================
// 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"
},
// ========================================
// BREADCRUMBS
// ========================================
"breadcrumbs.enabled": true,
"breadcrumbs.filePath": "on",
"breadcrumbs.symbolPath": "on",
// ========================================
// JEST
// ========================================
// เปิดใช้งาน Jest extension
"jest.enable": true,
// ปิดการเปิด Terminal ตอนเปิด VS Code
"jest.showTerminalOnLaunch": false,
// ปิดการเปิด Terminal ตอนรันเทสต์
"jest.showTerminalOnTestRun": false,
// ให้รัน Jest ใน background โดยไม่ต้องเปิด terminal
"jest.runInWorkspace": true,
// แสดงผลลัพธ์เทสต์ใน editor (inline)
"jest.showInlineError": true,
// ใช้ watch mode สำหรับการรันเทสต์อัตโนมัติเมื่อไฟล์เปลี่ยน
"jest.runMode": "watch",
// กำหนด path ของ Jest ถ้าใช้ local install
"jest.pathToJest": "node_modules/.bin/jest",
// กำหนด config ของ Jest ถ้ามีไฟล์ jest.config.js
"jest.pathToConfig": "jest.config.js",
"jest.disabledWorkspaceFolders": ["🎯 Root", "🗓️ docs", "🔗 specs"],
// ========================================
// DOCKER
// ========================================
"docker.languageserver.formatter.ignoreMultilineInstructions": true,
"docker.showStartPage": false,
// ========================================
// YAML
// ========================================
"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}",
"https://json.schemastore.org/docker-compose.json": "docker-compose*.{yml,yaml}"
},
"yaml.format.enable": true,
"yaml.format.singleQuote": false,
"yaml.format.bracketSpacing": true,
"yaml.validate": true,
"yaml.hover": true,
"yaml.completion": 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://lcbp3.nap-dms.work"
}
},
// ========================================
// CONSOLE NINJA
// ========================================
"console-ninja.featureSet": "Community",
"console-ninja.toolsToEnableSupportAutomaticallyFor": {
"live-server-extension": true,
"live-preview-extension": true
},
// ========================================
// MATERIAL ICON THEME
// ========================================
"material-icon-theme.folders.theme": "specific",
"material-icon-theme.folders.color": "#90a4ae",
"material-icon-theme.files.associations": {
"*.env.local": "Tune",
"*.env.development": "Tune",
"*.env.production": "Tune",
"docker-compose.*.yml": "Docker"
},
"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"
},
// ========================================
// NPM INTELLISENSE
// ========================================
"npm-intellisense.importES6": true,
"npm-intellisense.importQuotes": "'",
"npm-intellisense.importLinebreak": ";\n",
"npm-intellisense.importDeclarationType": "const",
// ========================================
// PERFORMANCE
// ========================================
"files.maxMemoryForLargeFilesMB": 4096,
"telemetry.telemetryLevel": "off",
"security.workspace.trust.untrustedFiles": "open",
"extensions.ignoreRecommendations": false,
// ========================================
// DEBUGGING
// ========================================
"debug.console.fontSize": 13,
"debug.console.lineHeight": 1.2,
"debug.internalConsoleOptions": "openOnSessionStart",
"debug.openDebug": "openOnDebugBreak",
"debug.showBreakpointsInOverviewRuler": true,
"prettier.configPath": "./.prettierrc",
"sqltools.connections": [
{
"name": "MariaDB",
"server": "localhost",
"port": 3306,
"user": "root",
"password": "",
"database": "lcbp3"
}
]
},
// ========================================
// 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": ["<node_internals>/**"],
"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": []
},
{
"label": "Start Backend",
"type": "shell",
"command": "npm run start:dev",
"options": {
"cwd": "${workspaceFolder:🔧 Backend}"
},
"presentation": {
"panel": "dedicated",
"group": "dev",
"reveal": "always"
}
},
// 1. Task หลักที่จะรันอัตโนมัติเมื่อเปิดโปรแกรม
{
"label": "🚀 Setup Workspace",
"dependsOn": ["🔧 PS: Backend", "🎨 PS: Frontend"], // สั่งให้รัน 2 task ย่อย
"runOptions": {
"runOn": "folderOpen" // <--- คำสั่งศักดิ์สิทธิ์: รันทันทีที่เปิด VS Code
},
"presentation": {
"reveal": "never" // ไม่ต้องโชว์หน้าต่างของตัวคุมหลัก
},
"problemMatcher": []
},
// 2. Task ย่อย: เปิด Terminal ที่ Backend
{
"label": "🔧 PS: Backend",
"type": "shell",
"command": "powershell", // สั่งเปิด PowerShell ค้างไว้
"options": {
"cwd": "${workspaceFolder:🔧 Backend}" // cd เข้า folder นี้
},
"isBackground": true, // บอก VS Code ว่าไม่ต้องรอให้จบ (รันค้างไว้เลย)
"problemMatcher": [],
"presentation": {
"group": "workspace-terminals", // จัดกลุ่มเดียวกัน
"reveal": "always",
"panel": "dedicated", // แยก Tab ให้ชัดเจน
"focus": false // ไม่ต้องแย่ง Focus ทันที
}
},
// 3. Task ย่อย: เปิด Terminal ที่ Frontend
{
"label": "🎨 PS: Frontend",
"type": "shell",
"command": "powershell",
"options": {
"cwd": "${workspaceFolder:🎨 Frontend}" // cd เข้า folder นี้
},
"isBackground": true,
"problemMatcher": [],
"presentation": {
"group": "workspace-terminals",
"reveal": "always",
"panel": "dedicated",
"focus": true // ให้ Focus ที่อันนี้เป็นอันสุดท้าย (พร้อมพิมพ์)
}
}
]
},
// ========================================
// 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",
"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",
"inferrinizzard.prettier-sql-vscode"
]
}
}