@qlover/create-app 0.7.14 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/configs/_common/.gitignore.template +6 -0
  3. package/dist/configs/_common/.prettierignore +17 -5
  4. package/dist/configs/_common/.vscode/settings.json +6 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/templates/next-app/.env.template +1 -1
  8. package/dist/templates/next-app/README.en.md +130 -0
  9. package/dist/templates/next-app/README.md +114 -20
  10. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  11. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  12. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  13. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  14. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  15. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  16. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  17. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  18. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  20. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  21. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  22. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  23. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  24. package/dist/templates/next-app/config/common.ts +22 -13
  25. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  26. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  27. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  28. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  29. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  30. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  31. package/dist/templates/next-app/docs/en/api.md +387 -0
  32. package/dist/templates/next-app/docs/en/component.md +544 -0
  33. package/dist/templates/next-app/docs/en/database.md +496 -0
  34. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  35. package/dist/templates/next-app/docs/en/env.md +563 -0
  36. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  37. package/dist/templates/next-app/docs/en/index.md +165 -0
  38. package/dist/templates/next-app/docs/en/page.md +457 -0
  39. package/dist/templates/next-app/docs/en/project-structure.md +176 -0
  40. package/dist/templates/next-app/docs/en/router.md +427 -0
  41. package/dist/templates/next-app/docs/en/theme.md +532 -0
  42. package/dist/templates/next-app/docs/en/validator.md +478 -0
  43. package/dist/templates/next-app/docs/zh/api.md +387 -0
  44. package/dist/templates/next-app/docs/zh/component.md +544 -0
  45. package/dist/templates/next-app/docs/zh/database.md +496 -0
  46. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  47. package/dist/templates/next-app/docs/zh/env.md +563 -0
  48. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  49. package/dist/templates/next-app/docs/zh/index.md +165 -0
  50. package/dist/templates/next-app/docs/zh/page.md +457 -0
  51. package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
  52. package/dist/templates/next-app/docs/zh/router.md +427 -0
  53. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  54. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  55. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  56. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  57. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  58. package/dist/templates/next-app/package.json +7 -3
  59. package/dist/templates/next-app/public/locales/en.json +172 -207
  60. package/dist/templates/next-app/public/locales/zh.json +172 -207
  61. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  62. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  63. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  64. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  65. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  66. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  67. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  68. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  69. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  70. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  71. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  72. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  73. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  74. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  75. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  76. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  77. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  78. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  79. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  80. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  81. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  82. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  83. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  84. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  85. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  86. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  87. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  88. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  89. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  90. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  91. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  92. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  93. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  94. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  95. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  96. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  97. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  98. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  99. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  100. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  101. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  102. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  103. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  104. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  105. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  106. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  107. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  108. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  109. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  110. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  111. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  112. package/dist/templates/react-app/.prettierignore +17 -0
  113. package/dist/templates/react-app/README.en.md +71 -54
  114. package/dist/templates/react-app/README.md +35 -18
  115. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  116. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  117. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  118. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  119. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  120. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  121. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  122. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  123. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  124. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  125. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  126. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  127. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  128. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  129. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  130. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  131. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  132. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  133. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  134. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  135. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  136. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  137. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  138. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  139. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  140. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  141. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  142. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  143. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  144. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  145. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  146. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  147. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  148. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  149. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  150. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  151. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  152. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  153. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  154. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  155. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  156. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  157. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  158. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  159. package/dist/templates/react-app/config/app.router.ts +66 -69
  160. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  161. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  162. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  163. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  164. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  165. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  166. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  167. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  168. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  169. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  170. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  171. package/dist/templates/react-app/config/theme.ts +14 -4
  172. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  173. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  174. package/dist/templates/react-app/docs/en/env.md +1132 -278
  175. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  176. package/dist/templates/react-app/docs/en/index.md +733 -104
  177. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  178. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  179. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  180. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  181. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  182. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  183. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  184. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  185. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  186. package/dist/templates/react-app/docs/en/store.md +1194 -184
  187. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  188. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  189. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  190. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  191. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  192. package/dist/templates/react-app/docs/zh/index.md +717 -104
  193. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  194. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  195. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  196. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  197. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  198. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  199. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  200. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  201. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  202. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  203. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  204. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  205. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  206. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  207. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  208. package/dist/templates/react-app/eslint.config.mjs +247 -0
  209. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  210. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  211. package/dist/templates/react-app/package.json +31 -3
  212. package/dist/templates/react-app/playwright.config.ts +79 -0
  213. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  214. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  215. package/dist/templates/react-app/src/App.tsx +15 -42
  216. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  217. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  219. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  220. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  221. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  222. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  223. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  224. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  225. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  226. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  227. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  228. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  229. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  230. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  231. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  232. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  233. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  234. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  235. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  236. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  237. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  238. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  239. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  240. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  241. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  242. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  243. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  244. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  245. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  246. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  247. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  248. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  249. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  250. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  251. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  252. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  253. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  254. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  255. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  256. package/dist/templates/react-app/src/core/globals.ts +9 -9
  257. package/dist/templates/react-app/src/main.tsx +4 -4
  258. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  259. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  260. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  261. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  262. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  263. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  264. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  265. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  266. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  267. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  268. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  269. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  270. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  271. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  272. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  273. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  277. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  285. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  286. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  287. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  288. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  289. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  290. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  291. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  292. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  293. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  294. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  295. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  296. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  297. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  298. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  299. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  300. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  301. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  302. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  303. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  304. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  305. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  306. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  307. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  308. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  309. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  310. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  311. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  312. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  313. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  314. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  315. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  316. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  317. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  318. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  321. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  322. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  323. package/dist/templates/react-app/tsconfig.json +8 -1
  324. package/dist/templates/react-app/tsconfig.node.json +1 -1
  325. package/dist/templates/react-app/tsconfig.test.json +3 -1
  326. package/dist/templates/react-app/vite.config.ts +50 -34
  327. package/package.json +2 -1
  328. package/dist/configs/react-app/eslint.config.js +0 -94
  329. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  330. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  331. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  332. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  333. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  334. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  335. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  336. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  337. package/dist/templates/next-app/docs/env.md +0 -94
  338. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  339. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  340. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  341. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  342. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  343. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  344. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  345. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  346. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  349. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  350. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  351. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  352. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  353. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  354. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  355. package/dist/templates/react-app/config/i18n.ts +0 -15
  356. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  357. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  358. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  359. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  360. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  361. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,478 @@
1
+ # Validator Development Guide
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [Validator Architecture Overview](#validator-architecture-overview)
6
+ 2. [Validator Interfaces and Abstraction Layer](#validator-interfaces-and-abstraction-layer)
7
+ 3. [Concrete Validator Implementation](#concrete-validator-implementation)
8
+ 4. [Validator Usage Examples](#validator-usage-examples)
9
+ 5. [Custom Validator Examples](#custom-validator-examples)
10
+ 6. [Best Practices and Extensions](#best-practices-and-extensions)
11
+
12
+ ## Validator Architecture Overview
13
+
14
+ ### 1. Overall Architecture
15
+
16
+ The project adopts a layered validator architecture design:
17
+
18
+ ```
19
+ Application Layer Validation Layer
20
+ ┌──────────────┐ ┌──────────────┐
21
+ │Business Service│ │Validator Interface│
22
+ ├──────────────┤ ├──────────────┤
23
+ │Param Processing│ ◄─────┤Validator Implement│
24
+ ├──────────────┤ ├──────────────┤
25
+ │Error Handling │ │Validation Rules│
26
+ └──────────────┘ └──────────────┘
27
+ ```
28
+
29
+ ### 2. Core Components
30
+
31
+ - **Validator Interface**: `ValidatorInterface`
32
+ - **Validator Implementation**: `LoginValidator`, `PaginationValidator`, etc.
33
+ - **Validation Rules**: Validation rules defined using `zod` library
34
+ - **Error Handling**: Unified error response format
35
+
36
+ ### 3. Validation Result Types
37
+
38
+ ```typescript
39
+ // Validation failure result
40
+ interface ValidationFaildResult {
41
+ path: PropertyKey[]; // Path of failed validation field
42
+ message: string; // Error message
43
+ }
44
+
45
+ // Validator interface
46
+ interface ValidatorInterface {
47
+ // Validate data and return result
48
+ validate(
49
+ data: unknown
50
+ ): Promise<void | ValidationFaildResult> | void | ValidationFaildResult;
51
+
52
+ // Validate data, return data if successful, throw error if failed
53
+ getThrow(data: unknown): unknown;
54
+ }
55
+ ```
56
+
57
+ ## Validator Interfaces and Abstraction Layer
58
+
59
+ ### 1. Base Validator Interface
60
+
61
+ ```typescript
62
+ export interface ValidatorInterface {
63
+ /**
64
+ * Validate data and return result
65
+ * @param data - Data to validate
66
+ * @returns void if validation passes, otherwise returns validation error
67
+ */
68
+ validate(
69
+ data: unknown
70
+ ): Promise<void | ValidationFaildResult> | void | ValidationFaildResult;
71
+
72
+ /**
73
+ * Validate data, return data if successful, throw error if failed
74
+ * @param data - Data to validate
75
+ * @returns Validated data
76
+ * @throws {ExecutorError} If data is invalid, includes validation error details
77
+ */
78
+ getThrow(data: unknown): unknown;
79
+ }
80
+ ```
81
+
82
+ ### 2. Validation Rule Definition
83
+
84
+ ```typescript
85
+ // Define validation rules using zod
86
+ const emailSchema = z.string().email({ message: V_EMAIL_INVALID });
87
+
88
+ const passwordSchema = z
89
+ .string()
90
+ .min(6, { message: V_PASSWORD_MIN_LENGTH })
91
+ .max(50, { message: V_PASSWORD_MAX_LENGTH })
92
+ .regex(/^\S+$/, { message: V_PASSWORD_SPECIAL_CHARS });
93
+
94
+ const pageSchema = z
95
+ .number()
96
+ .or(z.string())
97
+ .transform((val) => Number(val))
98
+ .refine((val) => val > 0, {
99
+ message: API_PAGE_INVALID
100
+ });
101
+ ```
102
+
103
+ ## Concrete Validator Implementation
104
+
105
+ ### 1. Login Validator
106
+
107
+ ```typescript
108
+ @injectable()
109
+ export class LoginValidator implements ValidatorInterface {
110
+ // Validate email
111
+ validateEmail(data: unknown): void | ValidationFaildResult {
112
+ const emailResult = emailSchema.safeParse(data);
113
+ if (!emailResult.success) {
114
+ return emailResult.error.issues[0];
115
+ }
116
+ }
117
+
118
+ // Validate password
119
+ validatePassword(data: unknown): void | ValidationFaildResult {
120
+ const passwordResult = passwordSchema.safeParse(data);
121
+ if (!passwordResult.success) {
122
+ return passwordResult.error.issues[0];
123
+ }
124
+ }
125
+
126
+ // Implement validate interface
127
+ validate(data: unknown): void | ValidationFaildResult {
128
+ if (typeof data !== 'object' || data === null) {
129
+ return {
130
+ path: ['form'],
131
+ message: V_LOGIN_PARAMS_REQUIRED
132
+ };
133
+ }
134
+
135
+ const { email, password } = data as Record<string, unknown>;
136
+
137
+ // Validate email
138
+ let validateResult = this.validateEmail(email);
139
+ if (validateResult != null) {
140
+ return validateResult;
141
+ }
142
+
143
+ // Validate password
144
+ validateResult = this.validatePassword(password);
145
+ if (validateResult != null) {
146
+ return validateResult;
147
+ }
148
+ }
149
+
150
+ // Implement getThrow interface
151
+ getThrow(data: unknown): LoginValidatorData {
152
+ const result = this.validate(data);
153
+ if (result == null) {
154
+ return data as LoginValidatorData;
155
+ }
156
+
157
+ const error: ExtendedExecutorError = new ExecutorError(result.message);
158
+ error.issues = [result];
159
+ throw error;
160
+ }
161
+ }
162
+ ```
163
+
164
+ ### 2. Pagination Validator
165
+
166
+ ```typescript
167
+ @injectable()
168
+ export class PaginationValidator implements ValidatorInterface {
169
+ protected defaultPageSize = 10;
170
+
171
+ validatePageSize(value: unknown): void | ValidationFaildResult {
172
+ const result = pageSchema.safeParse(value);
173
+ if (!result.success) {
174
+ return result.error.issues[0];
175
+ }
176
+ }
177
+
178
+ validate(data: unknown): void | ValidationFaildResult {
179
+ if (typeof data !== 'object' || data === null) {
180
+ return {
181
+ path: ['form'],
182
+ message: 'form is required'
183
+ };
184
+ }
185
+
186
+ return this.validatePageSize((data as Record<string, unknown>).page);
187
+ }
188
+
189
+ getThrow(data: unknown): PaginationInterface {
190
+ const result = this.validate(data);
191
+ if (result) {
192
+ throw new Error(result.message);
193
+ }
194
+
195
+ return { page: 1, pageSize: this.defaultPageSize };
196
+ }
197
+ }
198
+ ```
199
+
200
+ ## Validator Usage Examples
201
+
202
+ ### 1. Using in API Routes
203
+
204
+ ```typescript
205
+ export async function POST(req: NextRequest) {
206
+ const server = new BootstrapServer();
207
+
208
+ const result = await server.execNoError(async ({ parameters: { IOC } }) => {
209
+ // Get request data
210
+ const data = await req.json();
211
+
212
+ // Use validator to validate data
213
+ const loginValidator = IOC(LoginValidator);
214
+ const validatedData = loginValidator.getThrow(data);
215
+
216
+ // Use validated data
217
+ const userService = IOC(UserService);
218
+ return userService.login(validatedData);
219
+ });
220
+
221
+ if (result instanceof ExecutorError) {
222
+ return NextResponse.json(new AppErrorApi(result.id, result.message));
223
+ }
224
+
225
+ return NextResponse.json(new AppSuccessApi(result));
226
+ }
227
+ ```
228
+
229
+ ### 2. Using in Services
230
+
231
+ ```typescript
232
+ @injectable()
233
+ export class UserService {
234
+ constructor(
235
+ @inject(LoginValidator) private loginValidator: LoginValidator,
236
+ @inject(UserRepository) private userRepository: UserRepositoryInterface
237
+ ) {}
238
+
239
+ async validateAndCreateUser(data: unknown): Promise<User> {
240
+ // Validate data
241
+ const validatedData = this.loginValidator.getThrow(data);
242
+
243
+ // Use validated data
244
+ return this.userRepository.add(validatedData);
245
+ }
246
+ }
247
+ ```
248
+
249
+ ## Custom Validator Examples
250
+
251
+ ### 1. Create Custom Validation Rules
252
+
253
+ ```typescript
254
+ // Define custom validation rules
255
+ const phoneSchema = z
256
+ .string()
257
+ .regex(/^1[3-9]\d{9}$/, { message: 'Invalid phone number format' });
258
+
259
+ const addressSchema = z.object({
260
+ province: z.string().min(1, 'Province cannot be empty'),
261
+ city: z.string().min(1, 'City cannot be empty'),
262
+ detail: z.string().min(1, 'Detailed address cannot be empty')
263
+ });
264
+
265
+ // Create user info validator
266
+ @injectable()
267
+ export class UserInfoValidator implements ValidatorInterface {
268
+ validate(data: unknown): void | ValidationFaildResult {
269
+ if (typeof data !== 'object' || data === null) {
270
+ return {
271
+ path: ['form'],
272
+ message: 'Form data cannot be empty'
273
+ };
274
+ }
275
+
276
+ const { phone, address } = data as Record<string, unknown>;
277
+
278
+ // Validate phone number
279
+ const phoneResult = phoneSchema.safeParse(phone);
280
+ if (!phoneResult.success) {
281
+ return phoneResult.error.issues[0];
282
+ }
283
+
284
+ // Validate address
285
+ const addressResult = addressSchema.safeParse(address);
286
+ if (!addressResult.success) {
287
+ return addressResult.error.issues[0];
288
+ }
289
+ }
290
+
291
+ getThrow(data: unknown): UserInfoData {
292
+ const result = this.validate(data);
293
+ if (result) {
294
+ throw new ExecutorError(result.message);
295
+ }
296
+ return data as UserInfoData;
297
+ }
298
+ }
299
+ ```
300
+
301
+ ### 2. Combine Multiple Validators
302
+
303
+ ```typescript
304
+ @injectable()
305
+ export class UserProfileValidator implements ValidatorInterface {
306
+ constructor(
307
+ @inject(UserInfoValidator) private userInfoValidator: UserInfoValidator,
308
+ @inject(LoginValidator) private loginValidator: LoginValidator
309
+ ) {}
310
+
311
+ async validate(data: unknown): Promise<void | ValidationFaildResult> {
312
+ // Validate login information
313
+ const loginResult = this.loginValidator.validate(data);
314
+ if (loginResult) return loginResult;
315
+
316
+ // Validate user information
317
+ const userInfoResult = this.userInfoValidator.validate(data);
318
+ if (userInfoResult) return userInfoResult;
319
+ }
320
+
321
+ async getThrow(data: unknown): Promise<UserProfileData> {
322
+ const result = await this.validate(data);
323
+ if (result) {
324
+ throw new ExecutorError(result.message);
325
+ }
326
+ return data as UserProfileData;
327
+ }
328
+ }
329
+ ```
330
+
331
+ ## Best Practices and Extensions
332
+
333
+ ### 1. Validator Organization
334
+
335
+ ```typescript
336
+ // 1. Organize validators by feature modules
337
+ src / validators / user / LoginValidator.ts;
338
+ ProfileValidator.ts;
339
+ SettingsValidator.ts;
340
+ product / CreateValidator.ts;
341
+ UpdateValidator.ts;
342
+ order / PlaceOrderValidator.ts;
343
+ ```
344
+
345
+ ### 2. Validation Rule Reuse
346
+
347
+ ```typescript
348
+ // 1. Create shared validation rules
349
+ const commonRules = {
350
+ email: z.string().email({ message: 'Invalid email format' }),
351
+ phone: z
352
+ .string()
353
+ .regex(/^1[3-9]\d{9}$/, { message: 'Invalid phone number format' }),
354
+ password: z
355
+ .string()
356
+ .min(6, 'Password must be at least 6 characters')
357
+ .max(50, 'Password must be at most 50 characters')
358
+ .regex(/^\S+$/, 'Password cannot contain spaces')
359
+ };
360
+
361
+ // 2. Reuse in validators
362
+ export class UserValidator implements ValidatorInterface {
363
+ validate(data: unknown): void | ValidationFaildResult {
364
+ const schema = z.object({
365
+ email: commonRules.email,
366
+ password: commonRules.password,
367
+ phone: commonRules.phone.optional()
368
+ });
369
+
370
+ const result = schema.safeParse(data);
371
+ if (!result.success) {
372
+ return result.error.issues[0];
373
+ }
374
+ }
375
+ }
376
+ ```
377
+
378
+ ### 3. Enhanced Error Handling
379
+
380
+ ```typescript
381
+ // 1. Create validation error base class
382
+ export class ValidationError extends Error {
383
+ constructor(
384
+ public readonly path: PropertyKey[],
385
+ message: string
386
+ ) {
387
+ super(message);
388
+ this.name = 'ValidationError';
389
+ }
390
+ }
391
+
392
+ // 2. Create field validation error
393
+ export class FieldValidationError extends ValidationError {
394
+ constructor(
395
+ public readonly field: string,
396
+ message: string
397
+ ) {
398
+ super([field], message);
399
+ this.name = 'FieldValidationError';
400
+ }
401
+ }
402
+
403
+ // 3. Use in validators
404
+ export class EnhancedValidator implements ValidatorInterface {
405
+ getThrow(data: unknown): unknown {
406
+ const result = this.validate(data);
407
+ if (result) {
408
+ throw new FieldValidationError(result.path.join('.'), result.message);
409
+ }
410
+ return data;
411
+ }
412
+ }
413
+ ```
414
+
415
+ ### 4. Async Validation Support
416
+
417
+ ```typescript
418
+ @injectable()
419
+ export class AsyncValidator implements ValidatorInterface {
420
+ constructor(
421
+ @inject(UserRepository) private userRepository: UserRepositoryInterface
422
+ ) {}
423
+
424
+ async validate(data: unknown): Promise<void | ValidationFaildResult> {
425
+ // Basic validation
426
+ const basicResult = this.validateBasicFields(data);
427
+ if (basicResult) return basicResult;
428
+
429
+ // Async validation (e.g., check if email exists)
430
+ const { email } = data as { email: string };
431
+ const existingUser = await this.userRepository.getUserByEmail(email);
432
+
433
+ if (existingUser) {
434
+ return {
435
+ path: ['email'],
436
+ message: 'Email is already registered'
437
+ };
438
+ }
439
+ }
440
+
441
+ async getThrow(data: unknown): Promise<unknown> {
442
+ const result = await this.validate(data);
443
+ if (result) {
444
+ throw new ValidationError(result.path, result.message);
445
+ }
446
+ return data;
447
+ }
448
+ }
449
+ ```
450
+
451
+ ## Summary
452
+
453
+ The project's validator design follows these principles:
454
+
455
+ 1. **Interface Abstraction**:
456
+ - Clear validator interface definitions
457
+ - Unified validation result format
458
+ - Extensible validator implementation
459
+
460
+ 2. **Type Safety**:
461
+ - Use zod for type-safe validation rules
462
+ - TypeScript type definitions
463
+ - Runtime type checking
464
+
465
+ 3. **Error Handling**:
466
+ - Unified error response format
467
+ - Detailed error messages
468
+ - Error chain tracking
469
+
470
+ 4. **Extensibility**:
471
+ - Support for custom validation rules
472
+ - Support for validator composition
473
+ - Support for async validation
474
+
475
+ 5. **Best Practices**:
476
+ - Validation rule reuse
477
+ - Modular organization
478
+ - Enhanced error handling