Ver Fonte

๐Ÿ“ docs(architecture): update source tree and testing strategy documentation

- add version 3.2 to source-tree.md with infrastructure and business module packages
- restructure source tree documentation to reflect new modular architecture
- update integration guide with new package architecture hierarchy
- update testing-strategy.md to version 2.8 with modular package testing approach
- add package test architecture section detailing layered testing strategy
- update test location paths for all package types
- modify CI/CD configuration examples for modular package testing
- update local development test commands for new package structure
- add shared-test-util to testing dependencies

๐Ÿ“ docs(testing): enhance testing strategy with package-specific details

- define clear testing scope for infrastructure vs business module packages
- update test pyramid strategy with package-specific locations
- add detailed GitHub Actions workflow examples for modular testing
- enhance test examples with package-specific import paths
- update test commands for individual package testing
- add package-specific coverage reporting instructions
- update version history with latest changes to testing documentation
yourname hรก 3 semanas atrรกs
pai
commit
d9ad385a6c
2 ficheiros alterados com 219 adiรงรตes e 111 exclusรตes
  1. 123 85
      docs/architecture/source-tree.md
  2. 96 26
      docs/architecture/testing-strategy.md

+ 123 - 85
docs/architecture/source-tree.md

@@ -3,6 +3,7 @@
 ## ็‰ˆๆœฌไฟกๆฏ
 | ็‰ˆๆœฌ | ๆ—ฅๆœŸ | ๆ่ฟฐ | ไฝœ่€… |
 |------|------|------|------|
+| 3.2 | 2025-11-11 | ๆ›ดๆ–ฐๅŒ…็ป“ๆž„๏ผŒๆทปๅŠ ๅŸบ็ก€่ฎพๆ–ฝๅ’ŒไธšๅŠกๆจกๅ—ๅŒ… | Winston |
 | 3.1 | 2025-11-09 | ๆ›ดๆ–ฐๆต‹่ฏ•็ป“ๆž„๏ผŒๆธ…็†้‡ๅคๆต‹่ฏ•ๆ–‡ไปถ | James |
 | 3.0 | 2025-10-22 | ๆ›ดๆ–ฐไธบ monorepo ็ป“ๆž„๏ผŒๆทปๅŠ  packages/server | Winston |
 
@@ -52,79 +53,111 @@ d8d-mini-starter/
 โ”‚   โ”‚   โ””โ”€โ”€ prod.ts             # ็”Ÿไบง็Žฏๅขƒ้…็ฝฎ
 โ”‚   โ””โ”€โ”€ package.json
 โ”œโ”€โ”€ packages/                   # ๅ…ฑไบซๅŒ…
-โ”‚   โ””โ”€โ”€ server/                 # APIๆœๅŠกๅ™จๅŒ… (@d8d/server)
+โ”‚   โ”œโ”€โ”€ server/                 # APIๆœๅŠกๅ™จๅŒ… (@d8d/server) - ้‡ๆž„ๅŽ
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ api.ts                          # API่ทฏ็”ฑๅฏผๅ‡บ
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.ts                        # ๆœๅŠกๅ™จๅ…ฅๅฃ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ shared-types/           # ๅ…ฑไบซ็ฑปๅž‹ๅฎšไน‰ (@d8d/shared-types)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.ts                        # ็ฑปๅž‹ๅฎšไน‰ๅฏผๅ‡บ
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ shared-utils/           # ๅ…ฑไบซๅทฅๅ…ทๅ‡ฝๆ•ฐ (@d8d/shared-utils)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ utils/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ jwt.util.ts                 # JWTๅทฅๅ…ท
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ errorHandler.ts             # ้”™่ฏฏๅค„็†
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ parseWithAwait.ts           # ๅผ‚ๆญฅ่งฃๆž
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ logger.ts                   # ๆ—ฅๅฟ—ๅทฅๅ…ท
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ redis.util.ts               # Redisไผš่ฏ็ฎก็†
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ data-source.ts                  # ๆ•ฐๆฎๅบ“่ฟžๆŽฅ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ shared-crud/            # ้€š็”จCRUDๅŸบ็ก€่ฎพๆ–ฝ (@d8d/shared-crud)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ services/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ generic-crud.service.ts     # ้€š็”จCRUDๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ concrete-crud.service.ts    # ๅ…ทไฝ“CRUDๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ routes/
+โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ generic-crud.routes.ts      # ้€š็”จCRUD่ทฏ็”ฑ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ shared-test-util/       # ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝ (@d8d/shared-test-util)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ integration-test-db.ts          # ้›†ๆˆๆต‹่ฏ•ๆ•ฐๆฎๅบ“ๅทฅๅ…ท
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ integration-test-utils.ts       # ้›†ๆˆๆต‹่ฏ•ๆ–ญ่จ€ๅทฅๅ…ท
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ user-module/            # ็”จๆˆท็ฎก็†ๆจกๅ— (@d8d/user-module)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ entities/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ user.entity.ts              # ็”จๆˆทๅฎžไฝ“
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ role.entity.ts              # ่ง’่‰ฒๅฎžไฝ“
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ services/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ user.service.ts             # ็”จๆˆทๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ role.service.ts             # ่ง’่‰ฒๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ schemas/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ user.schema.ts              # ็”จๆˆทSchema
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ role.schema.ts              # ่ง’่‰ฒSchema
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ routes/
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ user.routes.ts              # ็”จๆˆท่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ role.routes.ts              # ่ง’่‰ฒ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ custom.routes.ts            # ่‡ชๅฎšไน‰่ทฏ็”ฑ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ auth-module/            # ่ฎค่ฏ็ฎก็†ๆจกๅ— (@d8d/auth-module)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ services/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ auth.service.ts             # ่ฎค่ฏๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ mini-auth.service.ts        # ๅฐ็จ‹ๅบ่ฎค่ฏๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ schemas/
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ auth.schema.ts              # ่ฎค่ฏSchema
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ routes/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ login.route.ts              # ็™ปๅฝ•่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ register.route.ts           # ๆณจๅ†Œ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ mini-login.route.ts         # ๅฐ็จ‹ๅบ็™ปๅฝ•่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ phone-decrypt.route.ts      # ๆ‰‹ๆœบๅท่งฃๅฏ†่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ me.route.ts                 # ่Žทๅ–็”จๆˆทไฟกๆฏ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ update-me.route.ts          # ๆ›ดๆ–ฐ็”จๆˆทไฟกๆฏ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ logout.route.ts             # ็™ปๅ‡บ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ sso-verify.route.ts         # SSO้ชŒ่ฏ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ middleware/
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ auth.middleware.ts          # ่ฎค่ฏไธญ้—ดไปถ
+โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ index.ts                    # ไธญ้—ดไปถๅฏผๅ‡บ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ”œโ”€โ”€ file-module/            # ๆ–‡ไปถ็ฎก็†ๆจกๅ— (@d8d/file-module)
+โ”‚   โ”‚   โ”œโ”€โ”€ src/
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ entities/
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ file.entity.ts              # ๆ–‡ไปถๅฎžไฝ“
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ services/
+โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ file.service.ts             # ๆ–‡ไปถๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ minio.service.ts            # MinIOๆœๅŠก
+โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ schemas/
+โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ file.schema.ts              # ๆ–‡ไปถSchema
+โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ routes/
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ upload-policy/post.ts       # ไธŠไผ ็ญ–็•ฅ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ multipart-policy/post.ts    # ๅคš้ƒจๅˆ†ไธŠไผ ็ญ–็•ฅ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚       โ”œโ”€โ”€ multipart-complete/post.ts  # ๅฎŒๆˆๅคš้ƒจๅˆ†ไธŠไผ ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ [id]/
+โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ get.ts                  # ่Žทๅ–ๆ–‡ไปถ่ฏฆๆƒ…่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ get-url.ts              # ่Žทๅ–ๆ–‡ไปถURL่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚           โ”œโ”€โ”€ download.ts             # ๆ–‡ไปถไธ‹่ฝฝ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”‚           โ””โ”€โ”€ delete.ts               # ๅˆ ้™คๆ–‡ไปถ่ทฏ็”ฑ
+โ”‚   โ”‚   โ”œโ”€โ”€ tests/
+โ”‚   โ”‚   โ””โ”€โ”€ package.json
+โ”‚   โ””โ”€โ”€ geo-areas/              # ๅœฐๅŒบๆจกๅ— (@d8d/geo-areas)
 โ”‚       โ”œโ”€โ”€ src/
-โ”‚       โ”‚   โ”œโ”€โ”€ api/            # API่ทฏ็”ฑ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ auth/       # ่ฎค่ฏ็›ธๅ…ณ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ index.ts                 # ่ฎค่ฏ่ทฏ็”ฑๅ…ฅๅฃ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ login/post.ts            # ็™ปๅฝ•ๆŽฅๅฃ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ logout.ts                # ็™ปๅ‡บๆŽฅๅฃ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ me/get.ts                # ่Žทๅ–็”จๆˆทไฟกๆฏ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ me/put.ts                # ๆ›ดๆ–ฐ็”จๆˆทไฟกๆฏ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ mini-login/post.ts       # ๅฐ็จ‹ๅบ็™ปๅฝ•
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ register/create.ts       # ๆณจๅ†ŒๆŽฅๅฃ
-โ”‚       โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ sso-verify.ts            # SSO้ชŒ่ฏ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ files/      # ๆ–‡ไปถ็ฎก็†
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ [id]/delete.ts           # ๅˆ ้™คๆ–‡ไปถ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ [id]/download.ts         # ไธ‹่ฝฝๆ–‡ไปถ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ [id]/get-url.ts          # ่Žทๅ–ๆ–‡ไปถURL
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ index.ts                 # ๆ–‡ไปถๅˆ—่กจ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ multipart-complete/post.ts # ๅฎŒๆˆๅˆ†็‰‡ไธŠไผ 
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ multipart-policy/post.ts # ๅˆ†็‰‡ไธŠไผ ็ญ–็•ฅ
-โ”‚       โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ upload-policy/post.ts    # ไธŠไผ ็ญ–็•ฅ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ roles/index.ts               # ่ง’่‰ฒ็ฎก็†
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ users/index.ts               # ็”จๆˆท็ฎก็†
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ users/custom.ts              # ่‡ชๅฎšไน‰็”จๆˆทๆŽฅๅฃ
-โ”‚       โ”‚   โ”œโ”€โ”€ modules/        # ไธšๅŠกๆจกๅ—
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ auth/       # ่ฎค่ฏๆจกๅ—
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ auth.service.ts          # ่ฎค่ฏๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ mini-auth.service.ts     # ๅฐ็จ‹ๅบ่ฎค่ฏๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ files/      # ๆ–‡ไปถๆจกๅ—
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ file.entity.ts           # ๆ–‡ไปถๅฎžไฝ“
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ file.schema.ts           # ๆ–‡ไปถๆจกๅผ
-โ”‚       โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ file.service.ts          # ๆ–‡ไปถๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ minio.service.ts         # MinIOๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ users/      # ็”จๆˆทๆจกๅ—
-โ”‚       โ”‚   โ”‚       โ”œโ”€โ”€ role.entity.ts           # ่ง’่‰ฒๅฎžไฝ“
-โ”‚       โ”‚   โ”‚       โ”œโ”€โ”€ role.schema.ts           # ่ง’่‰ฒๆจกๅผ
-โ”‚       โ”‚   โ”‚       โ”œโ”€โ”€ role.service.ts          # ่ง’่‰ฒๆœๅŠก
-โ”‚       โ”‚   โ”‚       โ”œโ”€โ”€ user.entity.ts           # ็”จๆˆทๅฎžไฝ“
-โ”‚       โ”‚   โ”‚       โ”œโ”€โ”€ user.schema.ts           # ็”จๆˆทๆจกๅผ
-โ”‚       โ”‚   โ”‚       โ””โ”€โ”€ user.service.ts          # ็”จๆˆทๆœๅŠก
-โ”‚       โ”‚   โ”œโ”€โ”€ middleware/     # ไธญ้—ดไปถ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ auth.middleware.ts           # ่ฎค่ฏไธญ้—ดไปถ
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ permission.middleware.ts     # ๆƒ้™ไธญ้—ดไปถ
-โ”‚       โ”‚   โ”œโ”€โ”€ share/          # ๅ…ฑไบซ็ฑปๅž‹
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ types.ts                     # ๅ…ฑไบซ็ฑปๅž‹ๅฎšไน‰
-โ”‚       โ”‚   โ”œโ”€โ”€ types/          # ็ฑปๅž‹ๅฎšไน‰
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ context.ts                   # ไธŠไธ‹ๆ–‡็ฑปๅž‹
-โ”‚       โ”‚   โ”œโ”€โ”€ utils/          # ๅทฅๅ…ทๅ‡ฝๆ•ฐ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ backup.ts                    # ๆ•ฐๆฎๅบ“ๅค‡ไปฝ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ concrete-crud.service.ts     # ๅ…ทไฝ“CRUDๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ errorHandler.ts              # ้”™่ฏฏๅค„็†
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ generic-crud.routes.ts       # ้€š็”จCRUD่ทฏ็”ฑ
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ generic-crud.service.ts      # ้€š็”จCRUDๆœๅŠก
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ jwt.util.ts                  # JWTๅทฅๅ…ท
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ logger.ts                    # ๆ—ฅๅฟ—ๅทฅๅ…ท
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ parseWithAwait.ts            # ๅผ‚ๆญฅ่งฃๆž
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ restore.ts                   # ๆ•ฐๆฎๅบ“ๆขๅค
-โ”‚       โ”‚   โ”œโ”€โ”€ data-source.ts                   # ๆ•ฐๆฎๅบ“่ฟžๆŽฅ
-โ”‚       โ”‚   โ””โ”€โ”€ index.ts                         # ๆœๅŠกๅ™จๅ…ฅๅฃ
-โ”‚       โ”œโ”€โ”€ tests/              # ๆœๅŠกๅ™จๆต‹่ฏ•
-โ”‚       โ”‚   โ”œโ”€โ”€ integration/    # ้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ auth.integration.test.ts      # ่ฎค่ฏ้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ backup.integration.test.ts    # ๅค‡ไปฝ้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ files.integration.test.ts     # ๆ–‡ไปถ้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ minio.integration.test.ts     # MinIO้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ users.integration.test.ts     # ็”จๆˆท้›†ๆˆๆต‹่ฏ•
-โ”‚       โ”‚   โ””โ”€โ”€ unit/           # ๅ•ๅ…ƒๆต‹่ฏ•
-โ”‚       โ”‚       โ”œโ”€โ”€ modules/    # ไธšๅŠกๆจกๅ—ๆต‹่ฏ•
-โ”‚       โ”‚       โ”‚   โ”œโ”€โ”€ file.service.test.ts      # ๆ–‡ไปถๆœๅŠกๆต‹่ฏ•
-โ”‚       โ”‚       โ”‚   โ”œโ”€โ”€ minio.service.test.ts     # MinIOๆœๅŠกๆต‹่ฏ•
-โ”‚       โ”‚       โ”‚   โ””โ”€โ”€ user.service.test.ts      # ็”จๆˆทๆœๅŠกๆต‹่ฏ•
-โ”‚       โ”‚       โ””โ”€โ”€ utils/      # ๅทฅๅ…ทๅ‡ฝๆ•ฐๆต‹่ฏ•
-โ”‚       โ”‚           โ”œโ”€โ”€ backup.test.ts            # ๅค‡ไปฝๅทฅๅ…ทๆต‹่ฏ•
-โ”‚       โ”‚           โ””โ”€โ”€ restore.test.ts           # ๆขๅคๅทฅๅ…ทๆต‹่ฏ•
+โ”‚       โ”‚   โ”œโ”€โ”€ modules/areas/
+โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ area.entity.ts              # ๅœฐๅŒบๅฎžไฝ“
+โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ area.service.ts             # ๅœฐๅŒบๆœๅŠก
+โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ area.schema.ts              # ๅœฐๅŒบSchema
+โ”‚       โ”‚   โ”œโ”€โ”€ api/
+โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ areas/index.ts              # ๅ…ฌๅ…ฑๅœฐๅŒบAPI
+โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ admin/areas/index.ts        # ็ฎก็†ๅœฐๅŒบAPI
+โ”‚       โ”‚   โ””โ”€โ”€ index.ts                        # ๅŒ…ๅ…ฅๅฃ
+โ”‚       โ”œโ”€โ”€ tests/
 โ”‚       โ””โ”€โ”€ package.json
 โ”œโ”€โ”€ web/                        # Webๅบ”็”จ (Hono + React SSR)
 โ”‚   โ”œโ”€โ”€ src/
@@ -185,26 +218,31 @@ d8d-mini-starter/
 
 ## ้›†ๆˆๆŒ‡ๅ—
 - **ๆ–‡ไปถๅ‘ฝๅ**: ไฟๆŒ็Žฐๆœ‰kebab-caseๅ‘ฝๅ็บฆๅฎš
-- **้กน็›ฎ็ป“ๆž„**: ้‡‡็”จmonorepoๆจกๅผ๏ผŒๅŒ…ๅซๅฐ็จ‹ๅบ(mini)ใ€Webๅบ”็”จ(web)ๅ’Œๅ…ฑไบซๆœๅŠกๅ™จๅŒ…(packages/server)
+- **้กน็›ฎ็ป“ๆž„**: ้‡‡็”จmonorepoๆจกๅผ๏ผŒๅŒ…ๅซๅฐ็จ‹ๅบ(mini)ใ€Webๅบ”็”จ(web)ๅ’Œๆจกๅ—ๅŒ–ๅŒ…ๆžถๆž„
 - **ๅŒ…็ฎก็†**: ไฝฟ็”จpnpm workspace็ฎก็†ๅคšๅŒ…ไพ่ต–ๅ…ณ็ณป
 - **ๅฐ็จ‹ๅบๆžถๆž„**: ๅŸบไบŽTaroๆก†ๆžถ๏ผŒๆ”ฏๆŒๅคšๅนณๅฐ๏ผˆๅพฎไฟกๅฐ็จ‹ๅบใ€H5็ญ‰๏ผ‰
 - **Webๅบ”็”จๆžถๆž„**: ๅŸบไบŽHono + React SSR๏ผŒไฝฟ็”จshadcn/ui็ป„ไปถๅบ“
-- **APIๆœๅŠกๅ™จ**: ็‹ฌ็ซ‹็š„`@d8d/server`ๅŒ…๏ผŒๅŸบไบŽHonoๆก†ๆžถ๏ผŒๆไพ›RESTful API
+- **ๆจกๅ—ๅŒ–ๆžถๆž„**: ้‡‡็”จๅˆ†ๅฑ‚ๅŒ…็ป“ๆž„๏ผŒๆ”ฏๆŒๆŒ‰้œ€ๅฎ‰่ฃ…ๅ’Œ็‹ฌ็ซ‹ๅผ€ๅ‘
+- **APIๆœๅŠกๅ™จ**: ้‡ๆž„ๅŽ็š„`@d8d/server`ๅŒ…๏ผŒๅŸบไบŽๆจกๅ—ๅŒ–ๆžถๆž„๏ผŒๆไพ›RESTful API
 - **API่ฎพ่ฎก**: ไฝฟ็”จHonoๆก†ๆžถ๏ผŒRESTful API่ฎพ่ฎก๏ผŒๆ”ฏๆŒๆ–‡ไปถๅˆ†็‰‡ไธŠไผ 
 - **ๆ•ฐๆฎๅบ“**: ไฝฟ็”จPostgreSQL + TypeORM
 - **ๅญ˜ๅ‚จ**: ไฝฟ็”จMinIO่ฟ›่กŒๆ–‡ไปถๅญ˜ๅ‚จ
+- **ๅŒ…ๆžถๆž„ๅฑ‚ๆฌก**:
+  - **ๅŸบ็ก€่ฎพๆ–ฝๅฑ‚**: shared-types โ†’ shared-utils โ†’ shared-crud
+  - **ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝ**: shared-test-util
+  - **ไธšๅŠกๆจกๅ—ๅฑ‚**: user-module โ†’ auth-module โ†’ file-module โ†’ geo-areas
+  - **ๅบ”็”จๅฑ‚**: server (้‡ๆž„ๅŽ)
 - **ๆต‹่ฏ•็ป“ๆž„**:
-  - **packages/server**: ็‹ฌ็ซ‹็š„ๆœๅŠกๅ™จๆต‹่ฏ•
-    - ๅ•ๅ…ƒๆต‹่ฏ•ไฝไบŽ`packages/server/tests/unit/`
-    - ้›†ๆˆๆต‹่ฏ•ไฝไบŽ`packages/server/tests/integration/`
-  - **web**: Webๅบ”็”จๆต‹่ฏ•
-    - ๅ•ๅ…ƒๆต‹่ฏ•ไฝไบŽ`web/tests/unit/`
-    - ้›†ๆˆๆต‹่ฏ•ไฝไบŽ`web/tests/integration/`
-    - E2Eๆต‹่ฏ•ไฝไบŽ`web/tests/e2e/` (Playwright)
+  - **ๅŸบ็ก€่ฎพๆ–ฝๅŒ…**: ๆฏไธชๅŒ…็‹ฌ็ซ‹็š„ๅ•ๅ…ƒๆต‹่ฏ•ๅ’Œ้›†ๆˆๆต‹่ฏ•
+  - **ไธšๅŠกๆจกๅ—ๅŒ…**: ๆฏไธชๆจกๅ—ๅŒ…ๅซๅฎŒๆ•ด็š„ๆต‹่ฏ•ๅฅ—ไปถ
+  - **serverๅŒ…**: ้›†ๆˆๆต‹่ฏ•้ชŒ่ฏๆจกๅ—้—ดๅไฝœ
+  - **webๅบ”็”จ**: ็ป„ไปถๆต‹่ฏ•ใ€้›†ๆˆๆต‹่ฏ•ๅ’ŒE2Eๆต‹่ฏ•
 - **ๅผ€ๅ‘็Žฏๅขƒ**: ๅคšๅ…ซๅคšไบ‘็ซฏๅผ€ๅ‘ๅฎนๅ™จ๏ผŒๅŒ…ๅซNode.js 20.19.2ใ€PostgreSQL 17ใ€Redis 7ใ€MinIO
 - **ๆž„ๅปบๅทฅๅ…ท**: ไฝฟ็”จVite + pnpm๏ผŒๆ”ฏๆŒSSRๆž„ๅปบ
 - **ๆžถๆž„ไผ˜ๅŠฟ**:
-  - ๆœๅŠกๅ™จไปฃ็ ๅฏ็‹ฌ็ซ‹้ƒจ็ฝฒๅ’Œๆต‹่ฏ•
-  - ๅ‰็ซฏๅ’ŒๅŽ็ซฏๅฏ็‹ฌ็ซ‹ๅผ€ๅ‘
-  - ๅ…ฑไบซ็ฑปๅž‹ๅฎšไน‰ๅ‡ๅฐ‘้‡ๅคไปฃ็ 
-  - ็ปŸไธ€็š„้”™่ฏฏๅค„็†ๅ’Œไธญ้—ดไปถ
+  - ๆธ…ๆ™ฐ็š„ๆจกๅ—่พน็•Œๅ’Œ่Œ่ดฃๅˆ†็ฆป
+  - ๆ”ฏๆŒๆŒ‰้œ€ๅฎ‰่ฃ…๏ผŒๅ‡ๅฐ‘ๅŒ…ไฝ“็งฏ
+  - ๅŸบ็ก€่ฎพๆ–ฝๅ’ŒไธšๅŠก้€ป่พ‘ๅˆ†็ฆป
+  - ็ปŸไธ€็š„ๆต‹่ฏ•ๆจกๅผๅ’Œๅทฅๅ…ท
+  - ๆ›ดๅฅฝ็š„ไปฃ็ ๅค็”จๅ’Œ็ปดๆŠคๆ€ง
+  - ็‹ฌ็ซ‹็š„ๅŒ…็‰ˆๆœฌ็ฎก็†

+ 96 - 26
docs/architecture/testing-strategy.md

@@ -3,6 +3,7 @@
 ## ็‰ˆๆœฌไฟกๆฏ
 | ็‰ˆๆœฌ | ๆ—ฅๆœŸ | ๆ่ฟฐ | ไฝœ่€… |
 |------|------|------|------|
+| 2.8 | 2025-11-11 | ๆ›ดๆ–ฐๅŒ…ๆต‹่ฏ•็ป“ๆž„๏ผŒๆทปๅŠ ๆจกๅ—ๅŒ–ๅŒ…ๆต‹่ฏ•็ญ–็•ฅ | Winston |
 | 2.7 | 2025-11-09 | ๆ›ดๆ–ฐไธบmonorepoๆต‹่ฏ•ๆžถๆž„๏ผŒๆธ…็†้‡ๅคๆต‹่ฏ•ๆ–‡ไปถ | James |
 | 2.6 | 2025-10-15 | ๅฎŒๆˆ้—็•™ๆต‹่ฏ•ๆ–‡ไปถ่ฟ็งปๅˆฐ็ปŸไธ€็š„tests็›ฎๅฝ•็ป“ๆž„ | Winston |
 | 2.5 | 2025-10-14 | ๆ›ดๆ–ฐๆต‹่ฏ•ๆ–‡ไปถไฝ็ฝฎๅˆฐ็ปŸไธ€็š„tests็›ฎๅฝ•็ป“ๆž„ | Claude |
@@ -12,12 +13,22 @@
 
 ๆœฌๆ–‡ๆกฃๅฎšไน‰ไบ†D8D Starter้กน็›ฎ็š„ๅฎŒๆ•ดๆต‹่ฏ•็ญ–็•ฅ๏ผŒๅŸบไบŽmonorepoๆžถๆž„ๅ’Œ็Žฐๆœ‰็š„ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝใ€‚ๆต‹่ฏ•็ญ–็•ฅ้ตๅพชๆต‹่ฏ•้‡‘ๅญ—ๅก”ๆจกๅž‹๏ผŒ็กฎไฟไปฃ็ ่ดจ้‡ใ€ๅŠŸ่ƒฝ็จณๅฎšๆ€งๅ’Œ็ณป็ปŸๅฏ้ ๆ€งใ€‚
 
-### ๆต‹่ฏ•ๆžถๆž„ๆ›ดๆ–ฐ (v2.7)
+### ๆต‹่ฏ•ๆžถๆž„ๆ›ดๆ–ฐ (v2.8)
 
-้กน็›ฎๅทฒ้‡ๆž„ไธบmonorepo็ป“ๆž„๏ผŒๆต‹่ฏ•ๆžถๆž„็›ธๅบ”่ฐƒๆ•ดไธบ๏ผš
-- **packages/server**: ็‹ฌ็ซ‹็š„APIๆœๅŠกๅ™จๅŒ…๏ผŒๅŒ…ๅซๅ•ๅ…ƒๆต‹่ฏ•ๅ’Œ้›†ๆˆๆต‹่ฏ•
+้กน็›ฎๅทฒ้‡ๆž„ไธบๆจกๅ—ๅŒ–ๅŒ…ๆžถๆž„๏ผŒๆต‹่ฏ•ๆžถๆž„็›ธๅบ”่ฐƒๆ•ดไธบ๏ผš
+- **ๅŸบ็ก€่ฎพๆ–ฝๅŒ…**: shared-typesใ€shared-utilsใ€shared-crudใ€shared-test-util
+- **ไธšๅŠกๆจกๅ—ๅŒ…**: user-moduleใ€auth-moduleใ€file-moduleใ€geo-areas
+- **ๅบ”็”จๅฑ‚**: server (้‡ๆž„ๅŽ)๏ผŒๅŒ…ๅซๆจกๅ—้›†ๆˆๆต‹่ฏ•
 - **web**: Webๅบ”็”จ๏ผŒๅŒ…ๅซ็ป„ไปถๆต‹่ฏ•ใ€้›†ๆˆๆต‹่ฏ•ๅ’ŒE2Eๆต‹่ฏ•
-- **CI/CD**: ็‹ฌ็ซ‹็š„ๅทฅไฝœๆตๅˆ†ๅˆซๅค„็†serverๅ’Œweb็š„ๆต‹่ฏ•
+- **CI/CD**: ็‹ฌ็ซ‹็š„ๅทฅไฝœๆตๅˆ†ๅˆซๅค„็†ๅ„ๅŒ…็š„ๆต‹่ฏ•
+
+### ๅŒ…ๆต‹่ฏ•ๆžถๆž„ (v2.8)
+
+้กน็›ฎ้‡‡็”จๅˆ†ๅฑ‚ๆต‹่ฏ•ๆžถๆž„๏ผŒๆฏไธชๅŒ…็‹ฌ็ซ‹ๆต‹่ฏ•๏ผš
+- **ๅŸบ็ก€่ฎพๆ–ฝๅŒ…**: ็บฏๅ•ๅ…ƒๆต‹่ฏ•๏ผŒไธไพ่ต–ๅค–้ƒจๆœๅŠก
+- **ไธšๅŠกๆจกๅ—ๅŒ…**: ๅ•ๅ…ƒๆต‹่ฏ• + ้›†ๆˆๆต‹่ฏ•๏ผŒ้ชŒ่ฏๆจกๅ—ๅŠŸ่ƒฝ
+- **ๅบ”็”จๅฑ‚**: ้›†ๆˆๆต‹่ฏ•๏ผŒ้ชŒ่ฏๆจกๅ—้—ดๅไฝœ
+- **ๅ…ฑไบซๆต‹่ฏ•ๅทฅๅ…ท**: shared-test-util ๆไพ›็ปŸไธ€็š„ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝ
 
 ## ๆต‹่ฏ•้‡‘ๅญ—ๅก”็ญ–็•ฅ
 
@@ -25,8 +36,10 @@
 - **่Œƒๅ›ด**: ๅ•ไธชๅ‡ฝๆ•ฐใ€็ฑปๆˆ–็ป„ไปถ
 - **็›ฎๆ ‡**: ้ชŒ่ฏ็‹ฌ็ซ‹ๅ•ๅ…ƒ็š„correctness
 - **ไฝ็ฝฎ**:
-  - `packages/server/tests/unit/**/*.test.ts` (ๆœๅŠกๅ™จๅ•ๅ…ƒๆต‹่ฏ•)
-  - `web/tests/unit/**/*.test.{ts,tsx}` (Web็ป„ไปถๅ•ๅ…ƒๆต‹่ฏ•)
+  - **ๅŸบ็ก€่ฎพๆ–ฝๅŒ…**: `packages/shared-*/tests/unit/**/*.test.ts`
+  - **ไธšๅŠกๆจกๅ—ๅŒ…**: `packages/*-module/tests/unit/**/*.test.ts`
+  - **serverๅŒ…**: `packages/server/tests/unit/**/*.test.ts`
+  - **webๅบ”็”จ**: `web/tests/unit/**/*.test.{ts,tsx}`
 - **ๆก†ๆžถ**: Vitest
 - **่ฆ†็›–็އ็›ฎๆ ‡**: โ‰ฅ 80%
 - **ๆ‰ง่กŒ้ข‘็އ**: ๆฏๆฌกไปฃ็ ๅ˜ๆ›ด
@@ -35,9 +48,10 @@
 - **่Œƒๅ›ด**: ๅคšไธช็ป„ไปถ/ๆœๅŠกๅไฝœ
 - **็›ฎๆ ‡**: ้ชŒ่ฏๆจกๅ—้—ด้›†ๆˆๅ’Œไบคไบ’
 - **ไฝ็ฝฎ**:
-  - `packages/server/tests/integration/**/*.test.ts` (ๆœๅŠกๅ™จ้›†ๆˆๆต‹่ฏ•)
-  - `web/tests/integration/**/*.test.{ts,tsx}` (Web้›†ๆˆๆต‹่ฏ•)
-- **ๆก†ๆžถ**: Vitest + Testing Library + hono/testing
+  - **ไธšๅŠกๆจกๅ—ๅŒ…**: `packages/*-module/tests/integration/**/*.test.ts`
+  - **serverๅŒ…**: `packages/server/tests/integration/**/*.test.ts` (ๆจกๅ—้›†ๆˆๆต‹่ฏ•)
+  - **webๅบ”็”จ**: `web/tests/integration/**/*.test.{ts,tsx}`
+- **ๆก†ๆžถ**: Vitest + Testing Library + hono/testing + shared-test-util
 - **่ฆ†็›–็އ็›ฎๆ ‡**: โ‰ฅ 60%
 - **ๆ‰ง่กŒ้ข‘็އ**: ๆฏๆฌกAPIๅ˜ๆ›ด
 
@@ -84,11 +98,36 @@ export default defineConfig({
 
 ### CI/CD็Žฏๅขƒ
 ```yaml
-# GitHub Actions ๆต‹่ฏ•้…็ฝฎ (Monorepoๆžถๆž„)
+# GitHub Actions ๆต‹่ฏ•้…็ฝฎ (ๆจกๅ—ๅŒ–ๅŒ…ๆžถๆž„)
 name: Test Pipeline
 
 jobs:
-  server-tests:
+  # ๅŸบ็ก€่ฎพๆ–ฝๅŒ…ๆต‹่ฏ•
+  shared-packages-tests:
+    runs-on: ubuntu-latest
+    steps:
+      - run: cd packages/shared-types && pnpm test
+      - run: cd packages/shared-utils && pnpm test
+      - run: cd packages/shared-crud && pnpm test
+      - run: cd packages/shared-test-util && pnpm test
+
+  # ไธšๅŠกๆจกๅ—ๅŒ…ๆต‹่ฏ•
+  business-modules-tests:
+    runs-on: ubuntu-latest
+    services:
+      postgres:
+        image: postgres:17
+        env:
+          POSTGRES_PASSWORD: test_password
+          POSTGRES_DB: test_d8dai
+    steps:
+      - run: cd packages/user-module && pnpm test
+      - run: cd packages/auth-module && pnpm test
+      - run: cd packages/file-module && pnpm test
+      - run: cd packages/geo-areas && pnpm test
+
+  # ๆœๅŠกๅ™จ้›†ๆˆๆต‹่ฏ•
+  server-integration-tests:
     runs-on: ubuntu-latest
     services:
       postgres:
@@ -97,9 +136,9 @@ jobs:
           POSTGRES_PASSWORD: test_password
           POSTGRES_DB: test_d8dai
     steps:
-      - run: cd packages/server && pnpm test:unit
-      - run: cd packages/server && pnpm test:integration
+      - run: cd packages/server && pnpm test
 
+  # Webๅบ”็”จๆต‹่ฏ•
   web-integration-tests:
     runs-on: ubuntu-latest
     services:
@@ -171,40 +210,67 @@ const inactiveUser = createTestUser({ active: false });
 
 ### ๆœฌๅœฐๅผ€ๅ‘ๆต‹่ฏ•
 
-#### packages/server
+#### ๅŸบ็ก€่ฎพๆ–ฝๅŒ…
 ```bash
-# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
-pnpm test
+# ่ฟ่กŒๆ‰€ๆœ‰ๅŸบ็ก€่ฎพๆ–ฝๅŒ…ๆต‹่ฏ•
+cd packages/shared-types && pnpm test
+cd packages/shared-utils && pnpm test
+cd packages/shared-crud && pnpm test
+cd packages/shared-test-util && pnpm test
+
+# ็”Ÿๆˆ่ฆ†็›–็އๆŠฅๅ‘Š
+cd packages/shared-utils && pnpm test:coverage
+```
+
+#### ไธšๅŠกๆจกๅ—ๅŒ…
+```bash
+# ่ฟ่กŒๆ‰€ๆœ‰ไธšๅŠกๆจกๅ—ๅŒ…ๆต‹่ฏ•
+cd packages/user-module && pnpm test
+cd packages/auth-module && pnpm test
+cd packages/file-module && pnpm test
+cd packages/geo-areas && pnpm test
 
 # ่ฟ่กŒๅ•ๅ…ƒๆต‹่ฏ•
-pnpm test:unit
+cd packages/user-module && pnpm test:unit
+
+# ่ฟ่กŒ้›†ๆˆๆต‹่ฏ•
+cd packages/auth-module && pnpm test:integration
+
+# ็”Ÿๆˆ่ฆ†็›–็އๆŠฅๅ‘Š
+cd packages/user-module && pnpm test:coverage
+```
+
+#### serverๅŒ…
+```bash
+# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
+cd packages/server && pnpm test
 
 # ่ฟ่กŒ้›†ๆˆๆต‹่ฏ•
-pnpm test:integration
+cd packages/server && pnpm test:integration
 
 # ็”Ÿๆˆ่ฆ†็›–็އๆŠฅๅ‘Š
-pnpm test:coverage
+cd packages/server && pnpm test:coverage
 ```
 
-#### web
+#### webๅบ”็”จ
 ```bash
 # ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
-pnpm test
+cd web && pnpm test
 
 # ่ฟ่กŒๅ•ๅ…ƒๆต‹่ฏ•
-pnpm test:unit
+cd web && pnpm test:unit
 
 # ่ฟ่กŒ้›†ๆˆๆต‹่ฏ•
-pnpm test:integration
+cd web && pnpm test:integration
 
 # ่ฟ่กŒ็ป„ไปถๆต‹่ฏ•
-pnpm test:components
+cd web && pnpm test:components
 
 # ่ฟ่กŒE2Eๆต‹่ฏ•
-pnpm test:e2e:chromium
+cd web && pnpm test:e2e:chromium
 
 # ็”Ÿๆˆ่ฆ†็›–็އๆŠฅๅ‘Š
-pnpm test:coverage
+cd web && pnpm test:coverage
 ```
 
 ### CI/CDๆตๆฐด็บฟๆต‹่ฏ•
@@ -322,10 +388,14 @@ describe('UserService', () => {
 - **Testing Library**: 16.3.0
 - **Playwright**: 1.55.0
 - **hono/testing**: ๅ†…็ฝฎ๏ผˆHono 4.8.5๏ผ‰
+- **shared-test-util**: 1.0.0 (ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝๅŒ…)
+- **TypeORM**: 0.3.20 (ๆ•ฐๆฎๅบ“ๆต‹่ฏ•)
+- **Redis**: 7.0.0 (ไผš่ฏ็ฎก็†ๆต‹่ฏ•)
 
 ### ๆ›ดๆ–ฐๆ—ฅๅฟ—
 | ๆ—ฅๆœŸ | ็‰ˆๆœฌ | ๆ่ฟฐ |
 |------|------|------|
+| 2025-11-11 | 2.8 | ๆ›ดๆ–ฐๅŒ…ๆต‹่ฏ•็ป“ๆž„๏ผŒๆทปๅŠ ๆจกๅ—ๅŒ–ๅŒ…ๆต‹่ฏ•็ญ–็•ฅ |
 | 2025-11-09 | 2.7 | ๆ›ดๆ–ฐไธบmonorepoๆต‹่ฏ•ๆžถๆž„๏ผŒๆธ…็†้‡ๅคๆต‹่ฏ•ๆ–‡ไปถ |
 | 2025-10-15 | 2.6 | ๅฎŒๆˆ้—็•™ๆต‹่ฏ•ๆ–‡ไปถ่ฟ็งปๅˆฐ็ปŸไธ€็š„tests็›ฎๅฝ•็ป“ๆž„ |
 | 2025-10-14 | 2.5 | ้‡ๆž„ๆต‹่ฏ•ๆ–‡ไปถ็ป“ๆž„๏ผŒ็ปŸไธ€ๅˆฐtests็›ฎๅฝ• |