@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,476 @@
1
+ # 验证器开发指南
2
+
3
+ ## 目录
4
+
5
+ 1. [验证器架构概述](#验证器架构概述)
6
+ 2. [验证器接口和抽象层](#验证器接口和抽象层)
7
+ 3. [具体验证器实现](#具体验证器实现)
8
+ 4. [验证器使用示例](#验证器使用示例)
9
+ 5. [自定义验证器示例](#自定义验证器示例)
10
+ 6. [最佳实践和扩展](#最佳实践和扩展)
11
+
12
+ ## 验证器架构概述
13
+
14
+ ### 1. 整体架构
15
+
16
+ 项目采用分层的验证器架构设计:
17
+
18
+ ```
19
+ 应用层 验证层
20
+ ┌──────────────┐ ┌──────────────┐
21
+ │ 业务服务 │ │ 验证器接口 │
22
+ ├──────────────┤ ├──────────────┤
23
+ │ 参数处理 │ ◄─────┤ 验证器实现 │
24
+ ├──────────────┤ ├──────────────┤
25
+ │ 错误处理 │ │ 验证规则 │
26
+ └──────────────┘ └──────────────┘
27
+ ```
28
+
29
+ ### 2. 核心组件
30
+
31
+ - **验证器接口**:`ValidatorInterface`
32
+ - **验证器实现**:`LoginValidator`, `PaginationValidator` 等
33
+ - **验证规则**:使用 `zod` 库定义的验证规则
34
+ - **错误处理**:统一的错误响应格式
35
+
36
+ ### 3. 验证结果类型
37
+
38
+ ```typescript
39
+ // 验证失败结果
40
+ interface ValidationFaildResult {
41
+ path: PropertyKey[]; // 验证失败的字段路径
42
+ message: string; // 错误消息
43
+ }
44
+
45
+ // 验证器接口
46
+ interface ValidatorInterface {
47
+ // 验证数据并返回结果
48
+ validate(
49
+ data: unknown
50
+ ): Promise<void | ValidationFaildResult> | void | ValidationFaildResult;
51
+
52
+ // 验证数据,成功返回数据,失败抛出错误
53
+ getThrow(data: unknown): unknown;
54
+ }
55
+ ```
56
+
57
+ ## 验证器接口和抽象层
58
+
59
+ ### 1. 基础验证器接口
60
+
61
+ ```typescript
62
+ export interface ValidatorInterface {
63
+ /**
64
+ * 验证数据并返回结果
65
+ * @param data - 要验证的数据
66
+ * @returns 如果验证通过返回 void,否则返回验证错误
67
+ */
68
+ validate(
69
+ data: unknown
70
+ ): Promise<void | ValidationFaildResult> | void | ValidationFaildResult;
71
+
72
+ /**
73
+ * 验证数据,成功返回数据,失败抛出错误
74
+ * @param data - 要验证的数据
75
+ * @returns 验证通过的数据
76
+ * @throws {ExecutorError} 如果数据无效,包含验证错误详情
77
+ */
78
+ getThrow(data: unknown): unknown;
79
+ }
80
+ ```
81
+
82
+ ### 2. 验证规则定义
83
+
84
+ ```typescript
85
+ // 使用 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
+ ## 具体验证器实现
104
+
105
+ ### 1. 登录验证器
106
+
107
+ ```typescript
108
+ @injectable()
109
+ export class LoginValidator implements ValidatorInterface {
110
+ // 验证邮箱
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
+ // 验证密码
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
+ // 实现验证接口
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
+ // 验证邮箱
138
+ let validateResult = this.validateEmail(email);
139
+ if (validateResult != null) {
140
+ return validateResult;
141
+ }
142
+
143
+ // 验证密码
144
+ validateResult = this.validatePassword(password);
145
+ if (validateResult != null) {
146
+ return validateResult;
147
+ }
148
+ }
149
+
150
+ // 实现 getThrow 接口
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. 分页验证器
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
+ ## 验证器使用示例
201
+
202
+ ### 1. 在 API 路由中使用
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
+ // 获取请求数据
210
+ const data = await req.json();
211
+
212
+ // 使用验证器验证数据
213
+ const loginValidator = IOC(LoginValidator);
214
+ const validatedData = loginValidator.getThrow(data);
215
+
216
+ // 使用验证后的数据
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. 在服务中使用
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
+ // 验证数据
241
+ const validatedData = this.loginValidator.getThrow(data);
242
+
243
+ // 使用验证后的数据
244
+ return this.userRepository.add(validatedData);
245
+ }
246
+ }
247
+ ```
248
+
249
+ ## 自定义验证器示例
250
+
251
+ ### 1. 创建自定义验证规则
252
+
253
+ ```typescript
254
+ // 定义自定义验证规则
255
+ const phoneSchema = z
256
+ .string()
257
+ .regex(/^1[3-9]\d{9}$/, { message: '手机号格式不正确' });
258
+
259
+ const addressSchema = z.object({
260
+ province: z.string().min(1, '省份不能为空'),
261
+ city: z.string().min(1, '城市不能为空'),
262
+ detail: z.string().min(1, '详细地址不能为空')
263
+ });
264
+
265
+ // 创建用户信息验证器
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: '表单数据不能为空'
273
+ };
274
+ }
275
+
276
+ const { phone, address } = data as Record<string, unknown>;
277
+
278
+ // 验证手机号
279
+ const phoneResult = phoneSchema.safeParse(phone);
280
+ if (!phoneResult.success) {
281
+ return phoneResult.error.issues[0];
282
+ }
283
+
284
+ // 验证地址
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. 组合多个验证器
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
+ // 验证登录信息
313
+ const loginResult = this.loginValidator.validate(data);
314
+ if (loginResult) return loginResult;
315
+
316
+ // 验证用户信息
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
+ ## 最佳实践和扩展
332
+
333
+ ### 1. 验证器组织
334
+
335
+ ```typescript
336
+ // 1. 按功能模块组织验证器
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. 验证规则复用
346
+
347
+ ```typescript
348
+ // 1. 创建共享验证规则
349
+ const commonRules = {
350
+ email: z.string().email({ message: '邮箱格式不正确' }),
351
+ phone: z.string().regex(/^1[3-9]\d{9}$/, { message: '手机号格式不正确' }),
352
+ password: z
353
+ .string()
354
+ .min(6, '密码至少6位')
355
+ .max(50, '密码最多50位')
356
+ .regex(/^\S+$/, '密码不能包含空格')
357
+ };
358
+
359
+ // 2. 在验证器中复用
360
+ export class UserValidator implements ValidatorInterface {
361
+ validate(data: unknown): void | ValidationFaildResult {
362
+ const schema = z.object({
363
+ email: commonRules.email,
364
+ password: commonRules.password,
365
+ phone: commonRules.phone.optional()
366
+ });
367
+
368
+ const result = schema.safeParse(data);
369
+ if (!result.success) {
370
+ return result.error.issues[0];
371
+ }
372
+ }
373
+ }
374
+ ```
375
+
376
+ ### 3. 错误处理增强
377
+
378
+ ```typescript
379
+ // 1. 创建验证错误基类
380
+ export class ValidationError extends Error {
381
+ constructor(
382
+ public readonly path: PropertyKey[],
383
+ message: string
384
+ ) {
385
+ super(message);
386
+ this.name = 'ValidationError';
387
+ }
388
+ }
389
+
390
+ // 2. 创建字段验证错误
391
+ export class FieldValidationError extends ValidationError {
392
+ constructor(
393
+ public readonly field: string,
394
+ message: string
395
+ ) {
396
+ super([field], message);
397
+ this.name = 'FieldValidationError';
398
+ }
399
+ }
400
+
401
+ // 3. 在验证器中使用
402
+ export class EnhancedValidator implements ValidatorInterface {
403
+ getThrow(data: unknown): unknown {
404
+ const result = this.validate(data);
405
+ if (result) {
406
+ throw new FieldValidationError(result.path.join('.'), result.message);
407
+ }
408
+ return data;
409
+ }
410
+ }
411
+ ```
412
+
413
+ ### 4. 异步验证支持
414
+
415
+ ```typescript
416
+ @injectable()
417
+ export class AsyncValidator implements ValidatorInterface {
418
+ constructor(
419
+ @inject(UserRepository) private userRepository: UserRepositoryInterface
420
+ ) {}
421
+
422
+ async validate(data: unknown): Promise<void | ValidationFaildResult> {
423
+ // 基本验证
424
+ const basicResult = this.validateBasicFields(data);
425
+ if (basicResult) return basicResult;
426
+
427
+ // 异步验证(例如检查邮箱是否已存在)
428
+ const { email } = data as { email: string };
429
+ const existingUser = await this.userRepository.getUserByEmail(email);
430
+
431
+ if (existingUser) {
432
+ return {
433
+ path: ['email'],
434
+ message: '该邮箱已被注册'
435
+ };
436
+ }
437
+ }
438
+
439
+ async getThrow(data: unknown): Promise<unknown> {
440
+ const result = await this.validate(data);
441
+ if (result) {
442
+ throw new ValidationError(result.path, result.message);
443
+ }
444
+ return data;
445
+ }
446
+ }
447
+ ```
448
+
449
+ ## 总结
450
+
451
+ 项目的验证器设计遵循以下原则:
452
+
453
+ 1. **接口抽象**:
454
+ - 清晰的验证器接口定义
455
+ - 统一的验证结果格式
456
+ - 可扩展的验证器实现
457
+
458
+ 2. **类型安全**:
459
+ - 使用 zod 提供类型安全的验证规则
460
+ - TypeScript 类型定义
461
+ - 运行时类型检查
462
+
463
+ 3. **错误处理**:
464
+ - 统一的错误响应格式
465
+ - 详细的错误信息
466
+ - 错误链路追踪
467
+
468
+ 4. **可扩展性**:
469
+ - 支持自定义验证规则
470
+ - 支持验证器组合
471
+ - 支持异步验证
472
+
473
+ 5. **最佳实践**:
474
+ - 验证规则复用
475
+ - 模块化组织
476
+ - 错误处理增强
@@ -5,18 +5,25 @@ import { i18nConfig } from '../config/i18n';
5
5
 
6
6
  export async function generateLocales() {
7
7
  const locales = i18nConfig.supportedLngs as unknown as string[];
8
- const options = readdirSync('./config/Identifier')
9
- .map((file) => ({
10
- file,
11
- name: file.replace('.ts', ''),
12
- path: join('./config/Identifier', file)
13
- }))
14
- .map(({ path }) => ({
15
- source: path,
16
- // You can use namespace
17
- // target: `./public/locales/{{lng}}/{{${name}}}.json`
18
- target: `./public/locales/{{lng}}.json`
19
- }));
8
+ const getAllTsFiles = (dir: string): string[] => {
9
+ const files: string[] = [];
10
+ const items = readdirSync(dir, { withFileTypes: true });
11
+
12
+ for (const item of items) {
13
+ const fullPath = join(dir, item.name);
14
+ if (item.isDirectory()) {
15
+ files.push(...getAllTsFiles(fullPath));
16
+ } else if (item.isFile() && item.name.endsWith('.ts')) {
17
+ files.push(fullPath);
18
+ }
19
+ }
20
+ return files;
21
+ };
22
+
23
+ const options = getAllTsFiles('./config/Identifier').map((path) => ({
24
+ source: path,
25
+ target: `./public/locales/{{lng}}.json`
26
+ }));
20
27
 
21
28
  const ts2Locale = new Ts2Locales(locales);
22
29
  for (const value of options) {
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ import { i18nKeySchema } from '@config/i18n/i18nKeyScheam';
3
+
4
+ export const localesSchema = z.object({
5
+ id: z.number(),
6
+ value: i18nKeySchema,
7
+ en: z.string(),
8
+ zh: z.string(),
9
+ description: z.string(),
10
+ namespace: z.string(),
11
+ created_at: z.union([z.string(), z.number()]), // Support both string (TIMESTAMPTZ) and number (Unix timestamp)
12
+ updated_at: z.union([z.string(), z.number()]) // Support both string (TIMESTAMPTZ) and number (Unix timestamp)
13
+ });
14
+
15
+ export type LocalesSchema = z.infer<typeof localesSchema>;
@@ -8,3 +8,14 @@ CREATE TABLE IF NOT EXISTS fe_users (
8
8
  created_at TIMESTAMPTZ DEFAULT NOW(),
9
9
  updated_at TIMESTAMPTZ DEFAULT NOW()
10
10
  );
11
+
12
+ CREATE TABLE IF NOT EXISTS next_app_locales (
13
+ id BIGSERIAL PRIMARY KEY,
14
+ value TEXT NOT NULL,
15
+ en TEXT NOT NULL,
16
+ zh TEXT NOT NULL,
17
+ description TEXT,
18
+ namesapce TEXT NOT NULL,
19
+ created_at TIMESTAMPTZ DEFAULT NOW(),
20
+ updated_at TIMESTAMPTZ DEFAULT NOW()
21
+ );
@@ -10,8 +10,8 @@
10
10
  "build:staging": "cross-env APP_ENV=staging next build --turbopack",
11
11
  "build:prod": "cross-env APP_ENV=production next build --turbopack",
12
12
  "start": "next start --port 3101",
13
- "lint": "eslint .",
14
- "lint:fix": "eslint . --ext .ts,.tsx --fix",
13
+ "lint": "eslint ./src ./config ./make ./migrations",
14
+ "lint:fix": "eslint ./src ./config ./make ./migrations --ext .ts,.tsx --fix",
15
15
  "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,scss,md}\"",
16
16
  "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,css,scss,md}\"",
17
17
  "fix": "npm run lint:fix && npm run format"
@@ -20,9 +20,11 @@
20
20
  "@ant-design/icons": "^6.0.0",
21
21
  "@ant-design/nextjs-registry": "^1.1.0",
22
22
  "@ant-design/v5-patch-for-react-19": "^1.0.3",
23
+ "@brain-toolkit/antd-blocks": "^0.0.1",
23
24
  "@brain-toolkit/antd-theme-override": "^0.0.3",
24
25
  "@brain-toolkit/bridge": "^0.0.1",
25
- "@qlover/corekit-bridge": "^1.6.4",
26
+ "@brain-toolkit/react-kit": "^0.1.0",
27
+ "@qlover/corekit-bridge": "^1.6.5",
26
28
  "@qlover/fe-corekit": "^2.1.0",
27
29
  "@qlover/slice-store-react": "^1.4.1",
28
30
  "@supabase/auth-helpers-nextjs": "^0.10.0",
@@ -31,6 +33,7 @@
31
33
  "@types/jsonwebtoken": "^9.0.10",
32
34
  "antd": "^5.27.1",
33
35
  "clsx": "^2.1.1",
36
+ "dayjs": "^1.11.18",
34
37
  "inversify": "^7.8.1",
35
38
  "jsonwebtoken": "^9.0.2",
36
39
  "lodash": "^4.17.21",
@@ -38,6 +41,7 @@
38
41
  "next-intl": "^4.3.5",
39
42
  "next-themes": "^0.4.6",
40
43
  "openai": "^5.23.0",
44
+ "p-limit": "^7.2.0",
41
45
  "react": "19.1.0",
42
46
  "react-dom": "19.1.0",
43
47
  "reflect-metadata": "^0.2.2",