867 lines
28 KiB
Plaintext
867 lines
28 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": 16,
|
|
"editor.tabSize": 2,
|
|
"editor.lineHeight": 1.6,
|
|
"editor.rulers": [80, 120],
|
|
"editor.minimap.enabled": true,
|
|
"editor.minimap.sectionHeaderFontSize": 14,
|
|
"editor.renderWhitespace": "selection",
|
|
// "editor.renderWhitespace": "boundary",
|
|
"editor.renderControlCharacters": true,
|
|
"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.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": "yzhang.markdown-all-in-one",
|
|
"editor.wordWrap": "on"
|
|
},
|
|
"[yaml]": {
|
|
"editor.defaultFormatter": "redhat.vscode-yaml"
|
|
},
|
|
"[dockerfile]": {
|
|
"editor.defaultFormatter": "ms-azuretools.vscode-containers"
|
|
},
|
|
"[sql]": {
|
|
"editor.defaultFormatter": "mtxr.sqltools",
|
|
"editor.tabSize": 2,
|
|
"editor.insertSpaces": true,
|
|
"editor.detectIndentation": false,
|
|
"editor.wordWrap": "off",
|
|
"editor.formatOnSave": true
|
|
},
|
|
"sqltools.format": {
|
|
"indent": " ", // 2 spaces
|
|
"indentStyle": "space", // ใช้ space แทน tab
|
|
"tabSize": 2,
|
|
"reservedWordCase": "upper", // คำสงวนเป็นตัวพิมพ์ใหญ่ SELECT, FROM, WHERE
|
|
"dataTypeCase": "lower", // varchar, int, datetime
|
|
"functionCase": "lower", // count(), sum(), date_format()
|
|
// Spacing and Lines
|
|
"linesBetweenQueries": 2, // เว้นบรรทัดระหว่าง query
|
|
"denseOperators": true,
|
|
"spaceAroundOperators": false,
|
|
// Comma Style
|
|
"commaPosition": "after", // ใส่ comma หลังคอลัมน์
|
|
"newlineBeforeComma": false,
|
|
"newlineAfterComma": false,
|
|
// Parentheses Style
|
|
"newlineBeforeOpenParen": false,
|
|
"newlineAfterOpenParen": false,
|
|
"newlineBeforeCloseParen": false,
|
|
"newlineAfterCloseParen": false,
|
|
// Width Control
|
|
"expressionWidth": 120,
|
|
"wrapLength": 120,
|
|
// Other Styles
|
|
"compact": true, // ไม่ย่อโค้ดให้แน่นเกินไป
|
|
"uppercaseKeywords": true,
|
|
"newlineBeforeSemicolon": false
|
|
},
|
|
// ป้องกัน extension อื่นมายุ่ง
|
|
|
|
// ========================================
|
|
// CODE ACTION ON SAVE
|
|
// ========================================
|
|
|
|
"editor.codeActionsOnSave": {
|
|
"source.fixAll": "explicit",
|
|
"source.fixAll.prettier": "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}/src",
|
|
"@backend/*": "${workspaceFolder:🔧 Backend}/src/*",
|
|
"@modules": "${workspaceFolder:🔧 Backend}/src/modules",
|
|
"@common": "${workspaceFolder:🔧 Backend}/src/common",
|
|
"@config": "${workspaceFolder:🔧 Backend}/src/common/config",
|
|
"@circulation": "${workspaceFolder:🔧 Backend}/src/modules/circulation",
|
|
"@correspondence": "${workspaceFolder:🔧 Backend}/src/modules/correspondence",
|
|
"@document-numbering": "${workspaceFolder:🔧 Backend}/src/modules/document-numbering",
|
|
"@drawing": "${workspaceFolder:🔧 Backend}/src/modules/drawing",
|
|
"@json-schema": "${workspaceFolder:🔧 Backend}/src/modules/json-schema",
|
|
"@master": "${workspaceFolder:🔧 Backend}/src/modules/master",
|
|
"@monitoring": "${workspaceFolder:🔧 Backend}/src/modules/monitoring",
|
|
"@notification": "${workspaceFolder:🔧 Backend}/src/modules/notification",
|
|
"@project": "${workspaceFolder:🔧 Backend}/src/modules/project",
|
|
"@rfa": "${workspaceFolder:🔧 Backend}/src/modules/rfa",
|
|
"@search": "${workspaceFolder:🔧 Backend}/src/modules/search",
|
|
"@transmittal": "${workspaceFolder:🔧 Backend}/src/modules/transmittal",
|
|
"@users": "${workspaceFolder:🔧 Backend}/src/modules/users",
|
|
"@workflow-engine": "${workspaceFolder:🔧 Backend}/src/modules/workflow-engine",
|
|
|
|
// Frontend paths (ไม่มี src)
|
|
"@": "${workspaceFolder:🎨 Frontend}/app",
|
|
"@/*": "${workspaceFolder:🎨 Frontend}/app/*",
|
|
"@app": "${workspaceFolder:🎨 Frontend}/app",
|
|
"@components": "${workspaceFolder:🎨 Frontend}/components",
|
|
"@fe-config": "${workspaceFolder:🎨 Frontend}/config",
|
|
"@lib": "${workspaceFolder:🎨 Frontend}/lib",
|
|
"@hooks": "${workspaceFolder:🎨 Frontend}/app/hooks",
|
|
"@utils": "${workspaceFolder:🎨 Frontend}/utils",
|
|
"@providers": "${workspaceFolder:🎨 Frontend}/providers",
|
|
"@public": "${workspaceFolder:🎨 Frontend}/public",
|
|
"@styles": "${workspaceFolder:🎨 Frontend}/styles",
|
|
"@types": "${workspaceFolder:🎨 Frontend}/types",
|
|
"@api": "${workspaceFolder:🎨 Frontend}/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", // ✅ ใช้ relative path
|
|
// ========================================
|
|
// 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.autoGuessEncoding": true,
|
|
"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.copyOnSelection": true,
|
|
"terminal.integrated.tabs.defaultColor": "terminal.ansiBlue",
|
|
"terminal.integrated.defaultProfile.windows": "PowerShell-7",
|
|
"terminal.integrated.profiles.windows": {
|
|
"PowerShell-7": {
|
|
"path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
|
|
"icon": "terminal-powershell"
|
|
}
|
|
},
|
|
|
|
// ========================================
|
|
// WORKBENCH
|
|
// ========================================
|
|
|
|
"workbench.iconTheme": "material-icon-theme",
|
|
"workbench.activityBar.location": "default",
|
|
"workbench.sideBar.location": "left",
|
|
"workbench.view.alwaysShowHeaderActions": true,
|
|
"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.view.showQuietly": {
|
|
"workbench.panel.output": false
|
|
},
|
|
// ========================================
|
|
// 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",
|
|
|
|
"jest.disabledWorkspaceFolders": ["🎯 Root", "🗓️ docs", "🔗 specs", "🎨 Frontend"],
|
|
|
|
// ========================================
|
|
// 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"
|
|
}
|
|
},
|
|
|
|
// ========================================
|
|
// 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": 14,
|
|
"debug.console.fontFamily": "Consolas, 'Courier New', monospace",
|
|
"debug.console.lineHeight": 20,
|
|
"debug.console.wordWrap": false,
|
|
"debug.internalConsoleOptions": "openOnSessionStart",
|
|
"debug.openDebug": "openOnDebugBreak",
|
|
"debug.showBreakpointsInOverviewRuler": true,
|
|
"prettier.configPath": "./.prettierrc",
|
|
"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",
|
|
"password": "",
|
|
"askForPassword": true // ✅ ปลอดภัยกว่า
|
|
}
|
|
],
|
|
"database-client.variableIndicator": [":", "$"],
|
|
"geminicodeassist.rules": "ใช้ภาษาไทยในการโต้ตอบ\n\n\n\n",
|
|
"geminicodeassist.verboseLogging": true,
|
|
"liveServer.settings.multiRootWorkspaceName": "🎯 Root",
|
|
"vitest.commandLine": "npm run test --",
|
|
"vitest.enable": true,
|
|
"yaml.maxItemsComputed": 6000
|
|
},
|
|
// ========================================
|
|
// LAUNCH CONFIGURATIONS
|
|
// ========================================
|
|
"launch": {
|
|
"version": "0.2.0",
|
|
"configurations": [
|
|
{
|
|
"name": "🔧 Debug Backend (NestJS)",
|
|
"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 (Next.js)",
|
|
"type": "node",
|
|
"request": "launch",
|
|
"cwd": "${workspaceFolder:🎨 Frontend}",
|
|
"runtimeExecutable": "npm",
|
|
"runtimeArgs": ["run", "dev"],
|
|
"serverReadyAction": {
|
|
"pattern": "- Local:.+(https?://\\S+)",
|
|
"uriFormat": "%s",
|
|
"action": "debugWithChrome"
|
|
}
|
|
},
|
|
{
|
|
"name": "🧪 Debug Backend Tests (Jest)",
|
|
"type": "node",
|
|
"request": "launch",
|
|
"runtimeExecutable": "npm",
|
|
"runtimeArgs": ["run", "test:debug"],
|
|
"cwd": "${workspaceFolder:🔧 Backend}",
|
|
"console": "integratedTerminal"
|
|
},
|
|
{
|
|
"name": "🧪 Debug Frontend Tests (Vitest)",
|
|
"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 (NestJS)", "🎨 Debug Frontend (Next.js)"],
|
|
"stopAll": true
|
|
}
|
|
]
|
|
},
|
|
// ========================================
|
|
// TASKS
|
|
// ========================================
|
|
"tasks": {
|
|
"version": "2.0.0",
|
|
"tasks": [
|
|
{
|
|
"label": "🔧 Start Backend Dev",
|
|
"type": "shell",
|
|
"command": "npm run start:dev",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🔧 Backend}"
|
|
},
|
|
"problemMatcher": [],
|
|
"isBackground": true,
|
|
"presentation": {
|
|
"reveal": "always",
|
|
"panel": "dedicated",
|
|
"group": "dev"
|
|
}
|
|
},
|
|
{
|
|
"label": "🎨 Start Frontend Dev",
|
|
"type": "shell",
|
|
"command": "npm run dev",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🎨 Frontend}"
|
|
},
|
|
"problemMatcher": [],
|
|
"isBackground": true,
|
|
"presentation": {
|
|
"reveal": "always",
|
|
"panel": "dedicated",
|
|
"group": "dev"
|
|
}
|
|
},
|
|
{
|
|
"label": "🚀 Start Full Stack",
|
|
"dependsOn": ["🔧 Start Backend Dev", "🎨 Start Frontend Dev"],
|
|
"problemMatcher": []
|
|
},
|
|
{
|
|
"label": "🧪 Run Backend Tests",
|
|
"type": "shell",
|
|
"command": "npm run test",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🔧 Backend}"
|
|
},
|
|
"problemMatcher": []
|
|
},
|
|
{
|
|
"label": "🧪 Run Frontend Tests",
|
|
"type": "shell",
|
|
"command": "npm run test",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🎨 Frontend}"
|
|
},
|
|
"problemMatcher": []
|
|
},
|
|
{
|
|
"label": "🧪 Watch Backend Tests",
|
|
"type": "shell",
|
|
"command": "npm run test:watch",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🔧 Backend}"
|
|
},
|
|
"problemMatcher": [],
|
|
"isBackground": true
|
|
},
|
|
{
|
|
"label": "🧪 Watch Frontend Tests",
|
|
"type": "shell",
|
|
"command": "npm run test:watch",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🎨 Frontend}"
|
|
},
|
|
"problemMatcher": [],
|
|
"isBackground": true
|
|
},
|
|
{
|
|
"label": "🏗️ Build Backend",
|
|
"type": "shell",
|
|
"command": "npm run build",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🔧 Backend}"
|
|
},
|
|
"problemMatcher": ["$tsc"],
|
|
"group": {
|
|
"kind": "build",
|
|
"isDefault": false
|
|
}
|
|
},
|
|
{
|
|
"label": "🏗️ Build Frontend",
|
|
"type": "shell",
|
|
"command": "npm run build",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🎨 Frontend}"
|
|
},
|
|
"problemMatcher": ["$tsc"],
|
|
"group": {
|
|
"kind": "build",
|
|
"isDefault": false
|
|
}
|
|
},
|
|
{
|
|
"label": "🔍 Lint Backend",
|
|
"type": "shell",
|
|
"command": "npm run lint",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🔧 Backend}"
|
|
},
|
|
"problemMatcher": ["$eslint-stylish"]
|
|
},
|
|
{
|
|
"label": "🔍 Lint Frontend",
|
|
"type": "shell",
|
|
"command": "npm run lint",
|
|
"options": {
|
|
"cwd": "${workspaceFolder:🎨 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": []
|
|
}
|
|
]
|
|
}
|
|
}
|