chore: setup husky, lint-staged and ci pipeline (infrastructure)
This commit is contained in:
@@ -0,0 +1,62 @@
|
|||||||
|
name: CI Pipeline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main, develop]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 📥 Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 🟢 Setup Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
|
||||||
|
- name: 📦 Install pnpm
|
||||||
|
run: npm install -g pnpm
|
||||||
|
|
||||||
|
- name: 📦 Install deps
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
# 🔴 LINT
|
||||||
|
- name: 🧹 Lint
|
||||||
|
run: pnpm lint
|
||||||
|
|
||||||
|
# 🔴 UUID CHECK
|
||||||
|
- name: 🔍 UUID misuse check
|
||||||
|
run: |
|
||||||
|
if grep -r --include="*.ts" --include="*.tsx" "parseInt(.*uuid" .; then
|
||||||
|
echo "❌ UUID misuse detected"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 🔴 console.log CHECK
|
||||||
|
- name: 🔍 console.log check
|
||||||
|
run: |
|
||||||
|
if grep -r --include="*.ts" --include="*.tsx" "console.log" .; then
|
||||||
|
echo "❌ console.log detected"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 🧪 TEST (Need to make sure tests run in root or individually)
|
||||||
|
- name: 🧪 Run Backend Tests
|
||||||
|
run: cd backend && pnpm test
|
||||||
|
|
||||||
|
- name: 🧪 Run Frontend Tests
|
||||||
|
run: cd frontend && pnpm test
|
||||||
|
|
||||||
|
# 🏗️ BUILD
|
||||||
|
- name: 🏗️ Build Backend
|
||||||
|
run: cd backend && pnpm build
|
||||||
|
|
||||||
|
- name: 🏗️ Build Frontend
|
||||||
|
run: cd frontend && pnpm build
|
||||||
|
|
||||||
|
- name: ✅ Done
|
||||||
|
run: echo "CI Passed"
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
echo "🔍 Running pre-commit checks..."
|
||||||
|
|
||||||
|
# 1. Run lint-staged (Fast, only staged files)
|
||||||
|
pnpm lint-staged
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "❌ Lint failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Additional Global Safety Checks (Per t2.md) - Optimized for staged files
|
||||||
|
staged_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ts|tsx|js|jsx)$')
|
||||||
|
|
||||||
|
if [ -n "$staged_files" ]; then
|
||||||
|
# UUID misuse check
|
||||||
|
grep "parseInt(.*uuid" $staged_files && {
|
||||||
|
echo "❌ UUID misuse detected (parseInt) in staged files"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# console.log check
|
||||||
|
grep "console.log" $staged_files && {
|
||||||
|
echo "❌ console.log is not allowed in staged files"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Pre-commit passed"
|
||||||
@@ -26,10 +26,22 @@ export default tseslint.config(
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
rules: {
|
rules: {
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
'@typescript-eslint/no-explicit-any': 'error',
|
||||||
'@typescript-eslint/no-floating-promises': 'warn',
|
'@typescript-eslint/no-floating-promises': 'error',
|
||||||
'@typescript-eslint/no-unsafe-argument': 'warn',
|
'@typescript-eslint/no-unsafe-argument': 'error',
|
||||||
"prettier/prettier": ["error", { endOfLine: "auto" }],
|
'no-console': 'error',
|
||||||
|
'prettier/prettier': ['error', { endOfLine: 'auto' }],
|
||||||
|
'no-restricted-syntax': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
selector: "CallExpression[callee.name='parseInt']",
|
||||||
|
message: '❌ parseInt() is forbidden (UUID risk)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
selector: "UnaryExpression[operator='+']",
|
||||||
|
message: '❌ +value is forbidden (UUID risk)',
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ const eslintConfig = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
"no-console": "warn",
|
"no-console": "error",
|
||||||
"no-unused-vars": "warn",
|
"no-unused-vars": "error",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -44,16 +44,27 @@ const eslintConfig = [
|
|||||||
"react-hooks": reactHooksPlugin,
|
"react-hooks": reactHooksPlugin,
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
"no-console": "warn",
|
"no-console": "error",
|
||||||
"no-unused-vars": "off",
|
"no-unused-vars": "off",
|
||||||
"no-undef": "off",
|
"no-undef": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "warn",
|
"@typescript-eslint/no-explicit-any": "error",
|
||||||
"@typescript-eslint/no-unused-vars": ["warn", {
|
"@typescript-eslint/no-unused-vars": ["error", {
|
||||||
argsIgnorePattern: "^_",
|
argsIgnorePattern: "^_",
|
||||||
varsIgnorePattern: "^_",
|
varsIgnorePattern: "^_",
|
||||||
}],
|
}],
|
||||||
"react-hooks/rules-of-hooks": "error",
|
"react-hooks/rules-of-hooks": "error",
|
||||||
"react-hooks/exhaustive-deps": "warn",
|
"react-hooks/exhaustive-deps": "warn",
|
||||||
|
'no-restricted-syntax': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
selector: "CallExpression[callee.name='parseInt']",
|
||||||
|
message: '❌ parseInt() is forbidden (UUID risk)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
selector: "UnaryExpression[operator='+']",
|
||||||
|
message: '❌ +value is forbidden (UUID risk)',
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// Ignore config files and build outputs
|
// Ignore config files and build outputs
|
||||||
|
|||||||
+14
-2
@@ -10,7 +10,10 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"start:mcp": "node ./scripts/start-mcp.js"
|
"start:mcp": "node ./scripts/start-mcp.js",
|
||||||
|
"prepare": "husky",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"lint:fix": "eslint . --fix"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -20,6 +23,15 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
|
"devDependencies": {
|
||||||
|
"husky": "^9.1.7",
|
||||||
|
"lint-staged": "^15.4.3"
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*.{ts,tsx,js}": [
|
||||||
|
"eslint --fix"
|
||||||
|
]
|
||||||
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"fast-xml-parser": "^5.3.5",
|
"fast-xml-parser": "^5.3.5",
|
||||||
@@ -43,8 +55,8 @@
|
|||||||
"minimatch@<3.1.4": ">=3.1.4",
|
"minimatch@<3.1.4": ">=3.1.4",
|
||||||
"multer@<2.1.0": ">=2.1.0",
|
"multer@<2.1.0": ">=2.1.0",
|
||||||
"serialize-javascript@<=7.0.2": ">=7.0.3",
|
"serialize-javascript@<=7.0.2": ">=7.0.3",
|
||||||
"ajv@<6.14.0": ">=6.14.0",
|
|
||||||
"ajv@>=7.0.0-alpha.0 <8.18.0": ">=8.18.0",
|
"ajv@>=7.0.0-alpha.0 <8.18.0": ">=8.18.0",
|
||||||
|
"eslint>ajv": "6.14.0",
|
||||||
"qs@<6.14.1": ">=6.14.1",
|
"qs@<6.14.1": ">=6.14.1",
|
||||||
"multer@<2.1.1": ">=2.1.1",
|
"multer@<2.1.1": ">=2.1.1",
|
||||||
"dompurify@>=3.1.3 <=3.3.1": ">=3.3.2",
|
"dompurify@>=3.1.3 <=3.3.1": ">=3.3.2",
|
||||||
|
|||||||
Generated
+235
-9
@@ -26,8 +26,8 @@ overrides:
|
|||||||
minimatch@<3.1.4: '>=3.1.4'
|
minimatch@<3.1.4: '>=3.1.4'
|
||||||
multer@<2.1.0: '>=2.1.0'
|
multer@<2.1.0: '>=2.1.0'
|
||||||
serialize-javascript@<=7.0.2: '>=7.0.3'
|
serialize-javascript@<=7.0.2: '>=7.0.3'
|
||||||
ajv@<6.14.0: '>=6.14.0'
|
|
||||||
ajv@>=7.0.0-alpha.0 <8.18.0: '>=8.18.0'
|
ajv@>=7.0.0-alpha.0 <8.18.0: '>=8.18.0'
|
||||||
|
eslint>ajv: 6.14.0
|
||||||
qs@<6.14.1: '>=6.14.1'
|
qs@<6.14.1: '>=6.14.1'
|
||||||
multer@<2.1.1: '>=2.1.1'
|
multer@<2.1.1: '>=2.1.1'
|
||||||
dompurify@>=3.1.3 <=3.3.1: '>=3.3.2'
|
dompurify@>=3.1.3 <=3.3.1: '>=3.3.2'
|
||||||
@@ -41,7 +41,14 @@ overrides:
|
|||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
.: {}
|
.:
|
||||||
|
devDependencies:
|
||||||
|
husky:
|
||||||
|
specifier: ^9.1.7
|
||||||
|
version: 9.1.7
|
||||||
|
lint-staged:
|
||||||
|
specifier: ^15.4.3
|
||||||
|
version: 15.5.2
|
||||||
|
|
||||||
backend:
|
backend:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4168,7 +4175,7 @@ packages:
|
|||||||
ajv-keywords@3.5.2:
|
ajv-keywords@3.5.2:
|
||||||
resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
|
resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
ajv: '>=6.14.0'
|
ajv: ^6.9.1
|
||||||
|
|
||||||
ajv-keywords@5.1.0:
|
ajv-keywords@5.1.0:
|
||||||
resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
|
resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
|
||||||
@@ -4192,6 +4199,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
|
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
ansi-escapes@7.3.0:
|
||||||
|
resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
ansi-regex@5.0.1:
|
ansi-regex@5.0.1:
|
||||||
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -4633,6 +4644,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
|
resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
|
||||||
engines: {node: 10.* || >= 12.*}
|
engines: {node: 10.* || >= 12.*}
|
||||||
|
|
||||||
|
cli-truncate@4.0.0:
|
||||||
|
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
cli-width@4.1.0:
|
cli-width@4.1.0:
|
||||||
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
|
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
@@ -4699,6 +4714,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
|
resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
colorette@2.0.20:
|
||||||
|
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
|
||||||
|
|
||||||
colors@1.4.0:
|
colors@1.4.0:
|
||||||
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
|
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
|
||||||
engines: {node: '>=0.1.90'}
|
engines: {node: '>=0.1.90'}
|
||||||
@@ -4707,6 +4725,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
|
commander@13.1.0:
|
||||||
|
resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
commander@14.0.2:
|
commander@14.0.2:
|
||||||
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
|
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
|
||||||
engines: {node: '>=20'}
|
engines: {node: '>=20'}
|
||||||
@@ -5132,6 +5154,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
|
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
environment@1.1.0:
|
||||||
|
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
error-ex@1.3.4:
|
error-ex@1.3.4:
|
||||||
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
|
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
|
||||||
|
|
||||||
@@ -5356,6 +5382,9 @@ packages:
|
|||||||
event-stream@4.0.1:
|
event-stream@4.0.1:
|
||||||
resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==}
|
resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==}
|
||||||
|
|
||||||
|
eventemitter3@5.0.4:
|
||||||
|
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
|
||||||
|
|
||||||
events@3.3.0:
|
events@3.3.0:
|
||||||
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
|
||||||
engines: {node: '>=0.8.x'}
|
engines: {node: '>=0.8.x'}
|
||||||
@@ -5368,6 +5397,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
execa@8.0.1:
|
||||||
|
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
|
||||||
|
engines: {node: '>=16.17'}
|
||||||
|
|
||||||
exit-x@0.2.2:
|
exit-x@0.2.2:
|
||||||
resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==}
|
resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
@@ -5607,6 +5640,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
get-stream@8.0.1:
|
||||||
|
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
|
||||||
|
engines: {node: '>=16'}
|
||||||
|
|
||||||
get-symbol-description@1.1.0:
|
get-symbol-description@1.1.0:
|
||||||
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
|
resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -5763,6 +5800,15 @@ packages:
|
|||||||
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
|
||||||
engines: {node: '>=10.17.0'}
|
engines: {node: '>=10.17.0'}
|
||||||
|
|
||||||
|
human-signals@5.0.0:
|
||||||
|
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
|
||||||
|
engines: {node: '>=16.17.0'}
|
||||||
|
|
||||||
|
husky@9.1.7:
|
||||||
|
resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
i18next@25.5.3:
|
i18next@25.5.3:
|
||||||
resolution: {integrity: sha512-joFqorDeQ6YpIXni944upwnuHBf5IoPMuqAchGVeQLdWC2JOjxgM9V8UGLhNIIH/Q8QleRxIi0BSRQehSrDLcg==}
|
resolution: {integrity: sha512-joFqorDeQ6YpIXni944upwnuHBf5IoPMuqAchGVeQLdWC2JOjxgM9V8UGLhNIIH/Q8QleRxIi0BSRQehSrDLcg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -5888,6 +5934,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
is-fullwidth-code-point@4.0.0:
|
||||||
|
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
is-fullwidth-code-point@5.1.0:
|
||||||
|
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
is-generator-fn@2.1.0:
|
is-generator-fn@2.1.0:
|
||||||
resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
|
resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -5949,6 +6003,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
|
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
is-stream@3.0.0:
|
||||||
|
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
|
||||||
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
||||||
is-string@1.1.1:
|
is-string@1.1.1:
|
||||||
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
|
resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -6361,6 +6419,15 @@ packages:
|
|||||||
lines-and-columns@1.2.4:
|
lines-and-columns@1.2.4:
|
||||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||||
|
|
||||||
|
lint-staged@15.5.2:
|
||||||
|
resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==}
|
||||||
|
engines: {node: '>=18.12.0'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
listr2@8.3.3:
|
||||||
|
resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==}
|
||||||
|
engines: {node: '>=18.0.0'}
|
||||||
|
|
||||||
load-esm@1.0.3:
|
load-esm@1.0.3:
|
||||||
resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
|
resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
|
||||||
engines: {node: '>=13.2.0'}
|
engines: {node: '>=13.2.0'}
|
||||||
@@ -6424,6 +6491,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
|
resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
log-update@6.1.0:
|
||||||
|
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
logform@2.7.0:
|
logform@2.7.0:
|
||||||
resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
|
resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
|
||||||
engines: {node: '>= 12.0.0'}
|
engines: {node: '>= 12.0.0'}
|
||||||
@@ -6580,6 +6651,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
mimic-fn@4.0.0:
|
||||||
|
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
mimic-function@5.0.1:
|
mimic-function@5.0.1:
|
||||||
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
|
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -6765,6 +6840,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
|
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
npm-run-path@5.3.0:
|
||||||
|
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
|
||||||
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
||||||
nth-check@2.1.1:
|
nth-check@2.1.1:
|
||||||
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
|
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
|
||||||
|
|
||||||
@@ -6832,6 +6911,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
onetime@6.0.0:
|
||||||
|
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
onetime@7.0.0:
|
onetime@7.0.0:
|
||||||
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
|
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -6945,6 +7028,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
path-key@4.0.0:
|
||||||
|
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
path-parse@1.0.7:
|
path-parse@1.0.7:
|
||||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||||
|
|
||||||
@@ -6987,6 +7074,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
|
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
pidtree@0.6.0:
|
||||||
|
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
|
||||||
|
engines: {node: '>=0.10'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
pify@2.3.0:
|
pify@2.3.0:
|
||||||
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
|
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
@@ -7319,6 +7411,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
||||||
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
||||||
|
|
||||||
|
rfdc@1.4.1:
|
||||||
|
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
|
||||||
|
|
||||||
rollup@4.59.0:
|
rollup@4.59.0:
|
||||||
resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
|
resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
|
||||||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||||
@@ -7478,6 +7573,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
slice-ansi@5.0.0:
|
||||||
|
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
slice-ansi@7.1.2:
|
||||||
|
resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
socket.io-adapter@2.5.5:
|
socket.io-adapter@2.5.5:
|
||||||
resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==}
|
resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==}
|
||||||
|
|
||||||
@@ -7576,6 +7679,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
|
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
|
||||||
|
string-argv@0.3.2:
|
||||||
|
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
|
||||||
|
engines: {node: '>=0.6.19'}
|
||||||
|
|
||||||
string-length@4.0.2:
|
string-length@4.0.2:
|
||||||
resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
|
resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -7638,6 +7745,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
|
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
strip-final-newline@3.0.0:
|
||||||
|
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
strip-indent@3.0.0:
|
strip-indent@3.0.0:
|
||||||
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
|
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -8380,6 +8491,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
|
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
wrap-ansi@9.0.2:
|
||||||
|
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
wrappy@1.0.2:
|
wrappy@1.0.2:
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
|
||||||
@@ -10125,7 +10240,7 @@ snapshots:
|
|||||||
|
|
||||||
'@eslint/eslintrc@3.3.1':
|
'@eslint/eslintrc@3.3.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv: 8.18.0
|
ajv: 6.14.0
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
espree: 10.4.0
|
espree: 10.4.0
|
||||||
globals: 14.0.0
|
globals: 14.0.0
|
||||||
@@ -12788,9 +12903,9 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
ajv: 8.18.0
|
ajv: 8.18.0
|
||||||
|
|
||||||
ajv-keywords@3.5.2(ajv@8.18.0):
|
ajv-keywords@3.5.2(ajv@6.14.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv: 8.18.0
|
ajv: 6.14.0
|
||||||
|
|
||||||
ajv-keywords@5.1.0(ajv@8.18.0):
|
ajv-keywords@5.1.0(ajv@8.18.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -12821,6 +12936,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
type-fest: 0.21.3
|
type-fest: 0.21.3
|
||||||
|
|
||||||
|
ansi-escapes@7.3.0:
|
||||||
|
dependencies:
|
||||||
|
environment: 1.1.0
|
||||||
|
|
||||||
ansi-regex@5.0.1: {}
|
ansi-regex@5.0.1: {}
|
||||||
|
|
||||||
ansi-regex@6.2.2: {}
|
ansi-regex@6.2.2: {}
|
||||||
@@ -13337,6 +13456,11 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@colors/colors': 1.5.0
|
'@colors/colors': 1.5.0
|
||||||
|
|
||||||
|
cli-truncate@4.0.0:
|
||||||
|
dependencies:
|
||||||
|
slice-ansi: 5.0.0
|
||||||
|
string-width: 7.2.0
|
||||||
|
|
||||||
cli-width@4.1.0: {}
|
cli-width@4.1.0: {}
|
||||||
|
|
||||||
client-only@0.0.1: {}
|
client-only@0.0.1: {}
|
||||||
@@ -13394,12 +13518,16 @@ snapshots:
|
|||||||
color-convert: 3.1.3
|
color-convert: 3.1.3
|
||||||
color-string: 2.1.4
|
color-string: 2.1.4
|
||||||
|
|
||||||
|
colorette@2.0.20: {}
|
||||||
|
|
||||||
colors@1.4.0: {}
|
colors@1.4.0: {}
|
||||||
|
|
||||||
combined-stream@1.0.8:
|
combined-stream@1.0.8:
|
||||||
dependencies:
|
dependencies:
|
||||||
delayed-stream: 1.0.0
|
delayed-stream: 1.0.0
|
||||||
|
|
||||||
|
commander@13.1.0: {}
|
||||||
|
|
||||||
commander@14.0.2: {}
|
commander@14.0.2: {}
|
||||||
|
|
||||||
commander@2.20.3: {}
|
commander@2.20.3: {}
|
||||||
@@ -13778,6 +13906,8 @@ snapshots:
|
|||||||
|
|
||||||
env-paths@2.2.1: {}
|
env-paths@2.2.1: {}
|
||||||
|
|
||||||
|
environment@1.1.0: {}
|
||||||
|
|
||||||
error-ex@1.3.4:
|
error-ex@1.3.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish: 0.2.1
|
is-arrayish: 0.2.1
|
||||||
@@ -14104,7 +14234,7 @@ snapshots:
|
|||||||
'@humanwhocodes/module-importer': 1.0.1
|
'@humanwhocodes/module-importer': 1.0.1
|
||||||
'@humanwhocodes/retry': 0.4.3
|
'@humanwhocodes/retry': 0.4.3
|
||||||
'@types/estree': 1.0.8
|
'@types/estree': 1.0.8
|
||||||
ajv: 8.18.0
|
ajv: 6.14.0
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@@ -14169,6 +14299,8 @@ snapshots:
|
|||||||
stream-combiner: 0.2.2
|
stream-combiner: 0.2.2
|
||||||
through: 2.3.8
|
through: 2.3.8
|
||||||
|
|
||||||
|
eventemitter3@5.0.4: {}
|
||||||
|
|
||||||
events@3.3.0: {}
|
events@3.3.0: {}
|
||||||
|
|
||||||
execa@4.1.0:
|
execa@4.1.0:
|
||||||
@@ -14195,6 +14327,18 @@ snapshots:
|
|||||||
signal-exit: 3.0.7
|
signal-exit: 3.0.7
|
||||||
strip-final-newline: 2.0.0
|
strip-final-newline: 2.0.0
|
||||||
|
|
||||||
|
execa@8.0.1:
|
||||||
|
dependencies:
|
||||||
|
cross-spawn: 7.0.6
|
||||||
|
get-stream: 8.0.1
|
||||||
|
human-signals: 5.0.0
|
||||||
|
is-stream: 3.0.0
|
||||||
|
merge-stream: 2.0.0
|
||||||
|
npm-run-path: 5.3.0
|
||||||
|
onetime: 6.0.0
|
||||||
|
signal-exit: 4.1.0
|
||||||
|
strip-final-newline: 3.0.0
|
||||||
|
|
||||||
exit-x@0.2.2: {}
|
exit-x@0.2.2: {}
|
||||||
|
|
||||||
expect-type@1.3.0: {}
|
expect-type@1.3.0: {}
|
||||||
@@ -14487,6 +14631,8 @@ snapshots:
|
|||||||
|
|
||||||
get-stream@6.0.1: {}
|
get-stream@6.0.1: {}
|
||||||
|
|
||||||
|
get-stream@8.0.1: {}
|
||||||
|
|
||||||
get-symbol-description@1.1.0:
|
get-symbol-description@1.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bound: 1.0.4
|
call-bound: 1.0.4
|
||||||
@@ -14654,6 +14800,10 @@ snapshots:
|
|||||||
|
|
||||||
human-signals@2.1.0: {}
|
human-signals@2.1.0: {}
|
||||||
|
|
||||||
|
human-signals@5.0.0: {}
|
||||||
|
|
||||||
|
husky@9.1.7: {}
|
||||||
|
|
||||||
i18next@25.5.3(typescript@5.9.3):
|
i18next@25.5.3(typescript@5.9.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.28.4
|
'@babel/runtime': 7.28.4
|
||||||
@@ -14779,6 +14929,12 @@ snapshots:
|
|||||||
|
|
||||||
is-fullwidth-code-point@3.0.0: {}
|
is-fullwidth-code-point@3.0.0: {}
|
||||||
|
|
||||||
|
is-fullwidth-code-point@4.0.0: {}
|
||||||
|
|
||||||
|
is-fullwidth-code-point@5.1.0:
|
||||||
|
dependencies:
|
||||||
|
get-east-asian-width: 1.4.0
|
||||||
|
|
||||||
is-generator-fn@2.1.0: {}
|
is-generator-fn@2.1.0: {}
|
||||||
|
|
||||||
is-generator-function@1.1.2:
|
is-generator-function@1.1.2:
|
||||||
@@ -14829,6 +14985,8 @@ snapshots:
|
|||||||
|
|
||||||
is-stream@2.0.1: {}
|
is-stream@2.0.1: {}
|
||||||
|
|
||||||
|
is-stream@3.0.0: {}
|
||||||
|
|
||||||
is-string@1.1.1:
|
is-string@1.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bound: 1.0.4
|
call-bound: 1.0.4
|
||||||
@@ -15433,6 +15591,30 @@ snapshots:
|
|||||||
|
|
||||||
lines-and-columns@1.2.4: {}
|
lines-and-columns@1.2.4: {}
|
||||||
|
|
||||||
|
lint-staged@15.5.2:
|
||||||
|
dependencies:
|
||||||
|
chalk: 5.6.2
|
||||||
|
commander: 13.1.0
|
||||||
|
debug: 4.4.3
|
||||||
|
execa: 8.0.1
|
||||||
|
lilconfig: 3.1.3
|
||||||
|
listr2: 8.3.3
|
||||||
|
micromatch: 4.0.8
|
||||||
|
pidtree: 0.6.0
|
||||||
|
string-argv: 0.3.2
|
||||||
|
yaml: 2.8.2
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
|
listr2@8.3.3:
|
||||||
|
dependencies:
|
||||||
|
cli-truncate: 4.0.0
|
||||||
|
colorette: 2.0.20
|
||||||
|
eventemitter3: 5.0.4
|
||||||
|
log-update: 6.1.0
|
||||||
|
rfdc: 1.4.1
|
||||||
|
wrap-ansi: 9.0.2
|
||||||
|
|
||||||
load-esm@1.0.3: {}
|
load-esm@1.0.3: {}
|
||||||
|
|
||||||
loader-runner@4.3.1: {}
|
loader-runner@4.3.1: {}
|
||||||
@@ -15481,6 +15663,14 @@ snapshots:
|
|||||||
chalk: 5.6.2
|
chalk: 5.6.2
|
||||||
is-unicode-supported: 1.3.0
|
is-unicode-supported: 1.3.0
|
||||||
|
|
||||||
|
log-update@6.1.0:
|
||||||
|
dependencies:
|
||||||
|
ansi-escapes: 7.3.0
|
||||||
|
cli-cursor: 5.0.0
|
||||||
|
slice-ansi: 7.1.2
|
||||||
|
strip-ansi: 7.1.2
|
||||||
|
wrap-ansi: 9.0.2
|
||||||
|
|
||||||
logform@2.7.0:
|
logform@2.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@colors/colors': 1.6.0
|
'@colors/colors': 1.6.0
|
||||||
@@ -15595,6 +15785,8 @@ snapshots:
|
|||||||
|
|
||||||
mimic-fn@2.1.0: {}
|
mimic-fn@2.1.0: {}
|
||||||
|
|
||||||
|
mimic-fn@4.0.0: {}
|
||||||
|
|
||||||
mimic-function@5.0.1: {}
|
mimic-function@5.0.1: {}
|
||||||
|
|
||||||
min-indent@1.0.1: {}
|
min-indent@1.0.1: {}
|
||||||
@@ -15771,6 +15963,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
path-key: 3.1.1
|
path-key: 3.1.1
|
||||||
|
|
||||||
|
npm-run-path@5.3.0:
|
||||||
|
dependencies:
|
||||||
|
path-key: 4.0.0
|
||||||
|
|
||||||
nth-check@2.1.1:
|
nth-check@2.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
boolbase: 1.0.0
|
boolbase: 1.0.0
|
||||||
@@ -15845,6 +16041,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mimic-fn: 2.1.0
|
mimic-fn: 2.1.0
|
||||||
|
|
||||||
|
onetime@6.0.0:
|
||||||
|
dependencies:
|
||||||
|
mimic-fn: 4.0.0
|
||||||
|
|
||||||
onetime@7.0.0:
|
onetime@7.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
mimic-function: 5.0.1
|
mimic-function: 5.0.1
|
||||||
@@ -15976,6 +16176,8 @@ snapshots:
|
|||||||
|
|
||||||
path-key@3.1.1: {}
|
path-key@3.1.1: {}
|
||||||
|
|
||||||
|
path-key@4.0.0: {}
|
||||||
|
|
||||||
path-parse@1.0.7: {}
|
path-parse@1.0.7: {}
|
||||||
|
|
||||||
path-scurry@1.11.1:
|
path-scurry@1.11.1:
|
||||||
@@ -16008,6 +16210,8 @@ snapshots:
|
|||||||
|
|
||||||
picomatch@4.0.3: {}
|
picomatch@4.0.3: {}
|
||||||
|
|
||||||
|
pidtree@0.6.0: {}
|
||||||
|
|
||||||
pify@2.3.0: {}
|
pify@2.3.0: {}
|
||||||
|
|
||||||
pirates@4.0.7: {}
|
pirates@4.0.7: {}
|
||||||
@@ -16342,6 +16546,8 @@ snapshots:
|
|||||||
|
|
||||||
reusify@1.1.0: {}
|
reusify@1.1.0: {}
|
||||||
|
|
||||||
|
rfdc@1.4.1: {}
|
||||||
|
|
||||||
rollup@4.59.0:
|
rollup@4.59.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.8
|
'@types/estree': 1.0.8
|
||||||
@@ -16431,8 +16637,8 @@ snapshots:
|
|||||||
schema-utils@3.3.0:
|
schema-utils@3.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/json-schema': 7.0.15
|
'@types/json-schema': 7.0.15
|
||||||
ajv: 8.18.0
|
ajv: 6.14.0
|
||||||
ajv-keywords: 3.5.2(ajv@8.18.0)
|
ajv-keywords: 3.5.2(ajv@6.14.0)
|
||||||
|
|
||||||
schema-utils@4.3.3:
|
schema-utils@4.3.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -16600,6 +16806,16 @@ snapshots:
|
|||||||
|
|
||||||
slash@3.0.0: {}
|
slash@3.0.0: {}
|
||||||
|
|
||||||
|
slice-ansi@5.0.0:
|
||||||
|
dependencies:
|
||||||
|
ansi-styles: 6.2.3
|
||||||
|
is-fullwidth-code-point: 4.0.0
|
||||||
|
|
||||||
|
slice-ansi@7.1.2:
|
||||||
|
dependencies:
|
||||||
|
ansi-styles: 6.2.3
|
||||||
|
is-fullwidth-code-point: 5.1.0
|
||||||
|
|
||||||
socket.io-adapter@2.5.5:
|
socket.io-adapter@2.5.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.7
|
debug: 4.3.7
|
||||||
@@ -16697,6 +16913,8 @@ snapshots:
|
|||||||
|
|
||||||
streamsearch@1.1.0: {}
|
streamsearch@1.1.0: {}
|
||||||
|
|
||||||
|
string-argv@0.3.2: {}
|
||||||
|
|
||||||
string-length@4.0.2:
|
string-length@4.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
char-regex: 1.0.2
|
char-regex: 1.0.2
|
||||||
@@ -16788,6 +17006,8 @@ snapshots:
|
|||||||
|
|
||||||
strip-final-newline@2.0.0: {}
|
strip-final-newline@2.0.0: {}
|
||||||
|
|
||||||
|
strip-final-newline@3.0.0: {}
|
||||||
|
|
||||||
strip-indent@3.0.0:
|
strip-indent@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
min-indent: 1.0.1
|
min-indent: 1.0.1
|
||||||
@@ -17547,6 +17767,12 @@ snapshots:
|
|||||||
string-width: 5.1.2
|
string-width: 5.1.2
|
||||||
strip-ansi: 7.1.2
|
strip-ansi: 7.1.2
|
||||||
|
|
||||||
|
wrap-ansi@9.0.2:
|
||||||
|
dependencies:
|
||||||
|
ansi-styles: 6.2.3
|
||||||
|
string-width: 7.2.0
|
||||||
|
strip-ansi: 7.1.2
|
||||||
|
|
||||||
wrappy@1.0.2: {}
|
wrappy@1.0.2: {}
|
||||||
|
|
||||||
write-file-atomic@5.0.1:
|
write-file-atomic@5.0.1:
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
จัดให้ครบแบบ “ใช้ได้จริงใน repo คุณทันที” — ทั้ง **ESLint + Pre-commit + CI (Gitea)**
|
|
||||||
ผมจะเขียนให้ **สอดคล้องกับ `.windsurfrules v2`** และ enforce ได้จริง 🔥
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# 1️⃣ 🧹 ESLint Config (Production Enforcement)
|
# 1️⃣ 🧹 ESLint Config (Production Enforcement)
|
||||||
|
|
||||||
## 📁 `eslint.config.mjs` (root)
|
## 📁 `eslint.config.mjs` (root)
|
||||||
|
|||||||
@@ -1,18 +1,29 @@
|
|||||||
# NAP-DMS Project Context & Rules
|
# NAP-DMS Project Context & Rules
|
||||||
# For: Windsurf Cascade (and compatible: Codex CLI, opencode, Amp, Amazon Q, AGENTS.md tools)
|
# For: Windsurf Cascade (and compatible: Codex CLI, opencode, Amp, Amazon Q, AGENTS.md tools)
|
||||||
# Version: 1.8.2 (Enhanced) | Last synced from repo: 2026-03-21
|
# Version: 1.8.1 (Enhanced) | Last synced from repo: 2026-03-21
|
||||||
# Repo: https://git.np-dms.work/np-dms/lcbp3
|
# Repo: [https://git.np-dms.work/np-dms/lcbp3](https://git.np-dms.work/np-dms/lcbp3)
|
||||||
|
|
||||||
---
|
---
|
||||||
## 🧠 Role & Persona
|
## 🧠 Role & Persona
|
||||||
Act as a **Senior Full Stack Developer** expert in **NestJS**, **Next.js**, and **TypeScript**.
|
Act as a **Senior Full Stack Developer** specialized in:
|
||||||
|
* NestJS, Next.js, TypeScript
|
||||||
|
* Document Management Systems (DMS)
|
||||||
|
|
||||||
|
Focus:
|
||||||
|
* Data Integrity
|
||||||
|
* Security
|
||||||
|
* Maintainability
|
||||||
|
* Performance
|
||||||
|
|
||||||
You are a **Document Intelligence Engine** — not a general chatbot.
|
You are a **Document Intelligence Engine** — not a general chatbot.
|
||||||
You value **Data Integrity**, **Security**, and **Clean Architecture**.
|
You value **Data Integrity**, **Security**, and **Clean Architecture**.
|
||||||
Every response must be **precise**, **spec-compliant**, and **production-ready**.
|
Every response must be **precise**, **spec-compliant**, and **production-ready**.
|
||||||
|
|
||||||
---
|
---
|
||||||
## 🏗️ Project Overview
|
## 🏗️ Project Overview
|
||||||
**LCBP3-DMS (Laem Chabang Port Phase 3 - Document Management System)**
|
**LCBP3-DMS (Laem Chabang Port Phase 3 - Document Management System)**
|
||||||
ระบบบริหารจัดการเอกสารโครงการก่อสร้างท่าเรือแหลมฉบังระยะที่ 3
|
ระบบบริหารจัดการเอกสารโครงการก่อสร้างท่าเรือแหลมฉบังระยะที่ 3
|
||||||
**Version:** 1.8.2 (Enhanced) | **Status:** UAT In Progress, Security Hardened (2026-03-19)
|
**Version:** 1.8.1 (Enhanced) | **Status:** UAT In Progress, Security Hardened (2026-03-19)
|
||||||
| Area | Status | Notes |
|
| Area | Status | Notes |
|
||||||
| ------------- | ---------------------- | ------------------------------------------------------ |
|
| ------------- | ---------------------- | ------------------------------------------------------ |
|
||||||
| Backend | ✅ Production Ready | NestJS 11, Express v5, 0 Vulnerabilities |
|
| Backend | ✅ Production Ready | NestJS 11, Express v5, 0 Vulnerabilities |
|
||||||
|
|||||||
@@ -0,0 +1,389 @@
|
|||||||
|
# NAP-DMS Project Context & Rules (Optimized)
|
||||||
|
|
||||||
|
# Version: 2.0.0 (Production Optimized)
|
||||||
|
|
||||||
|
# Repo: [https://git.np-dms.work/np-dms/lcbp3](https://git.np-dms.work/np-dms/lcbp3)
|
||||||
|
|
||||||
|
# Last Updated: 2026-03-21
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Role & Persona
|
||||||
|
|
||||||
|
Act as a **Senior Full Stack Developer** specialized in:
|
||||||
|
|
||||||
|
* NestJS, Next.js, TypeScript
|
||||||
|
* Document Management Systems (DMS)
|
||||||
|
|
||||||
|
Focus:
|
||||||
|
|
||||||
|
* Data Integrity
|
||||||
|
* Security
|
||||||
|
* Maintainability
|
||||||
|
* Performance
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧭 Rule Enforcement Levels (NEW 🔥)
|
||||||
|
|
||||||
|
## 🔴 Tier 1 — CRITICAL (CI BLOCKER)
|
||||||
|
|
||||||
|
Must be enforced automatically (CI/CD + runtime):
|
||||||
|
|
||||||
|
* Security (Auth, RBAC, Validation)
|
||||||
|
* UUID Strategy (ADR-019)
|
||||||
|
* Database correctness
|
||||||
|
* File upload security
|
||||||
|
* AI validation boundary
|
||||||
|
* Forbidden patterns (any, console.log, UUID misuse)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟡 Tier 2 — IMPORTANT (CODE REVIEW)
|
||||||
|
|
||||||
|
* Architecture patterns
|
||||||
|
* Testing coverage
|
||||||
|
* Caching
|
||||||
|
* Naming conventions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟢 Tier 3 — GUIDELINES
|
||||||
|
|
||||||
|
* Code style
|
||||||
|
* Comments language
|
||||||
|
* Minor optimizations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🆔 UUID Strategy (ADR-019) — MANDATORY
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
* DB Primary Key: INT (internal only)
|
||||||
|
* Public API: UUIDv7 (string)
|
||||||
|
|
||||||
|
## ❌ Forbidden
|
||||||
|
|
||||||
|
* parseInt(uuid)
|
||||||
|
* Number(uuid)
|
||||||
|
* +uuid
|
||||||
|
|
||||||
|
## ✅ Validation
|
||||||
|
|
||||||
|
Backend:
|
||||||
|
|
||||||
|
* @IsUUID()
|
||||||
|
|
||||||
|
Frontend:
|
||||||
|
|
||||||
|
* z.string().uuid()
|
||||||
|
|
||||||
|
## 🔴 CI Enforcement
|
||||||
|
|
||||||
|
* grep: `parseInt\(.*uuid`
|
||||||
|
* fail build if found
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🛡️ Security Rules (Optimized)
|
||||||
|
|
||||||
|
## 🔴 Validation (MANDATORY)
|
||||||
|
|
||||||
|
* Backend: class-validator
|
||||||
|
* Frontend: Zod
|
||||||
|
* Reject ALL invalid input
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 Idempotency (Selective)
|
||||||
|
|
||||||
|
Apply ONLY to:
|
||||||
|
|
||||||
|
* Document creation
|
||||||
|
* File upload commit
|
||||||
|
* Numbering system
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 File Upload Policy
|
||||||
|
|
||||||
|
* Allowed: PDF, DWG, DOCX, XLSX, ZIP
|
||||||
|
* Max: 50MB
|
||||||
|
* ClamAV scan REQUIRED
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 Auth & RBAC
|
||||||
|
|
||||||
|
* JWT + CASL
|
||||||
|
* All protected routes MUST use guards
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🤖 AI Rules (ADR-018) — ENFORCED
|
||||||
|
|
||||||
|
## 🔴 AI Validation Layer
|
||||||
|
|
||||||
|
ALL AI outputs MUST:
|
||||||
|
|
||||||
|
1. Match Zod schema
|
||||||
|
2. Pass strict validation
|
||||||
|
3. Reject if invalid
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const parsed = schema.safeParse(aiOutput);
|
||||||
|
if (!parsed.success) throw new Error("Invalid AI output");
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Log input/output (Audit)
|
||||||
|
|
||||||
|
## ❌ Forbidden
|
||||||
|
|
||||||
|
* AI direct DB access
|
||||||
|
* AI writing to storage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧱 Database Rules (ADR-009)
|
||||||
|
|
||||||
|
* NO TypeORM migrations
|
||||||
|
* Modify SQL schema directly
|
||||||
|
* NEVER invent tables/columns
|
||||||
|
|
||||||
|
## 🔴 Performance Rules
|
||||||
|
|
||||||
|
* All FK columns MUST be indexed
|
||||||
|
* UUID columns MUST be indexed
|
||||||
|
* Use pagination (take/skip)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧩 Architecture Rules
|
||||||
|
|
||||||
|
## Backend (NestJS)
|
||||||
|
|
||||||
|
* Modular structure
|
||||||
|
* Business logic ONLY in services
|
||||||
|
* Controllers = thin layer
|
||||||
|
* Use transactions for multi-step operations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend (Next.js)
|
||||||
|
|
||||||
|
* App Router
|
||||||
|
* TanStack Query = server state
|
||||||
|
* Zustand = client state
|
||||||
|
* React Hook Form + Zod = forms
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ⚡ Development Flow (Optimized)
|
||||||
|
|
||||||
|
## 🔴 Critical Work (DB / API / Workflow)
|
||||||
|
|
||||||
|
MUST:
|
||||||
|
|
||||||
|
1. Check schema
|
||||||
|
2. Check ADR
|
||||||
|
3. Check edge cases
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟡 Normal Work (UI / feature)
|
||||||
|
|
||||||
|
* Follow existing patterns
|
||||||
|
* No full spec reading required
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟢 Quick Fix
|
||||||
|
|
||||||
|
* Fix directly
|
||||||
|
* Add minimal test if needed
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧪 Testing Policy (Realistic)
|
||||||
|
|
||||||
|
## 🔴 MUST
|
||||||
|
|
||||||
|
* Critical modules: 80%
|
||||||
|
* API: happy path + 1 edge case
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟡 SHOULD
|
||||||
|
|
||||||
|
* Other modules: 60–70%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟢 OPTIONAL
|
||||||
|
|
||||||
|
* UI components
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🤖 Automation Enforcement (NEW 🔥)
|
||||||
|
|
||||||
|
## CI Checks (MANDATORY)
|
||||||
|
|
||||||
|
* ESLint (no any, no console.log)
|
||||||
|
* UUID misuse detection
|
||||||
|
* Build must pass
|
||||||
|
* Coverage threshold
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pre-commit Hooks
|
||||||
|
|
||||||
|
* Prettier format
|
||||||
|
* Lint fix
|
||||||
|
* Block console.log
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Static Scan (grep)
|
||||||
|
|
||||||
|
* parseInt(uuid)
|
||||||
|
* req: any
|
||||||
|
* console.log
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🚫 Forbidden Actions
|
||||||
|
|
||||||
|
* SQL triggers for business logic
|
||||||
|
* TypeORM migrations
|
||||||
|
* Exposing INT IDs in API
|
||||||
|
* any type
|
||||||
|
* console.log
|
||||||
|
* UUID misuse
|
||||||
|
* Direct DB access from AI
|
||||||
|
* Inline notifications (use queue)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧾 Data Integrity Rules (NEW 🔥)
|
||||||
|
|
||||||
|
## 🔴 Transactions
|
||||||
|
|
||||||
|
All multi-step DB operations MUST use transactions
|
||||||
|
|
||||||
|
## 🔴 Audit Log
|
||||||
|
|
||||||
|
All CREATE / UPDATE / DELETE MUST log
|
||||||
|
|
||||||
|
## 🔴 Soft Delete
|
||||||
|
|
||||||
|
Use `deleted_at` for business data
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ⚡ Performance Guidelines
|
||||||
|
|
||||||
|
* Use Redis cache (cache-aside)
|
||||||
|
* Invalidate cache on update
|
||||||
|
* Avoid N+1 queries
|
||||||
|
* Use select fields only
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🌐 i18n Rules
|
||||||
|
|
||||||
|
* No hardcoded text
|
||||||
|
* Use i18n keys
|
||||||
|
* Support Thai (primary)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧾 Git Rules
|
||||||
|
|
||||||
|
## Commit Format
|
||||||
|
|
||||||
|
feat(scope): description
|
||||||
|
fix(scope): description
|
||||||
|
|
||||||
|
## Branch Naming
|
||||||
|
|
||||||
|
feature/*
|
||||||
|
fix/*
|
||||||
|
refactor/*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ✅ Quick Checklist (Before Commit)
|
||||||
|
|
||||||
|
* [ ] No UUID misuse
|
||||||
|
* [ ] No any types
|
||||||
|
* [ ] No console.log
|
||||||
|
* [ ] Validation implemented
|
||||||
|
* [ ] Tests pass
|
||||||
|
* [ ] Build passes
|
||||||
|
* [ ] Security rules checked
|
||||||
|
* [ ] Transactions used (if needed)
|
||||||
|
* [ ] Audit log added
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🚀 Summary
|
||||||
|
|
||||||
|
This version is:
|
||||||
|
|
||||||
|
* ✅ Enforceable (CI-driven)
|
||||||
|
* ✅ Developer-friendly
|
||||||
|
* ✅ Production-ready
|
||||||
|
* ✅ Scalable
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Version History
|
||||||
|
|
||||||
|
* v2.0.0 — Production optimized (reduced friction, added enforcement)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🔥 สิ่งที่คุณได้จาก v2 นี้
|
||||||
|
|
||||||
|
### ✅ ดีขึ้นทันที
|
||||||
|
|
||||||
|
* Dev เร็วขึ้น ~30–50%
|
||||||
|
* Bug critical (UUID) แทบหาย
|
||||||
|
* Review ง่ายขึ้น
|
||||||
|
* Enforce ได้จริง (ไม่ใช่แค่ guideline)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🚀 Step ถัดไป (สำคัญมาก)
|
||||||
|
|
||||||
|
ถ้าจะให้ “โคตรเทพจริง” ทำต่อ 3 อย่างนี้:
|
||||||
|
|
||||||
|
## 1. ESLint Rule จริง (ผมเขียนให้ได้)
|
||||||
|
|
||||||
|
* detect UUID misuse
|
||||||
|
* block `any`
|
||||||
|
* block `console.log`
|
||||||
|
|
||||||
|
## 2. Git Hook
|
||||||
|
|
||||||
|
* pre-commit auto check
|
||||||
|
|
||||||
|
## 3. CI Pipeline
|
||||||
|
|
||||||
|
* fail ทันทีถ้าผิด rules
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 👉 ถัดไปเลือกได้เลย
|
||||||
|
|
||||||
|
พิมพ์มา:
|
||||||
|
|
||||||
|
* `eslint config` → ผมจัด config production ให้
|
||||||
|
* `pre-commit hook` → ผมทำ hook script ให้
|
||||||
|
* `ci pipeline` → ผมออกแบบ pipeline (Gitea Actions)
|
||||||
|
|
||||||
|
เอาให้ระบบคุณ “ระดับบริษัทใหญ่จริง” ได้เลย 👍
|
||||||
Reference in New Issue
Block a user