@qlover/create-app 0.7.15 → 0.9.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 (363) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/configs/_common/.github/workflows/general-check.yml +1 -1
  3. package/dist/configs/_common/.github/workflows/release.yml +2 -2
  4. package/dist/configs/_common/.gitignore.template +6 -0
  5. package/dist/configs/_common/.prettierignore +17 -5
  6. package/dist/configs/_common/.vscode/settings.json +6 -1
  7. package/dist/index.cjs +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/templates/next-app/.env.template +1 -1
  10. package/dist/templates/next-app/README.en.md +0 -1
  11. package/dist/templates/next-app/README.md +0 -1
  12. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  13. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  14. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  15. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  16. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  17. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  18. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  20. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  21. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  22. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  23. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  24. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  25. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  26. package/dist/templates/next-app/config/common.ts +22 -13
  27. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  28. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  29. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  30. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  31. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  32. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  33. package/dist/templates/next-app/docs/en/index.md +0 -1
  34. package/dist/templates/next-app/docs/en/project-structure.md +0 -1
  35. package/dist/templates/next-app/docs/zh/index.md +0 -1
  36. package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
  37. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  38. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  39. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  40. package/dist/templates/next-app/package.json +7 -3
  41. package/dist/templates/next-app/public/locales/en.json +172 -207
  42. package/dist/templates/next-app/public/locales/zh.json +172 -207
  43. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  44. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  45. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  46. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  47. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  48. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  49. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  50. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  51. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  52. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  53. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  54. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  55. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  56. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  57. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  58. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  59. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  60. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  61. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  62. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  63. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  64. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  65. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  66. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  67. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  68. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  69. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  70. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  71. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  72. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  73. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  74. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  75. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  76. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  77. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  78. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  79. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  80. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  81. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  82. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  83. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  84. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  85. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  86. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  87. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  88. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  89. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  90. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  91. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  92. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  93. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  94. package/dist/templates/react-app/.prettierignore +17 -0
  95. package/dist/templates/react-app/README.en.md +71 -54
  96. package/dist/templates/react-app/README.md +35 -18
  97. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  98. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  99. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  100. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  101. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  102. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  103. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  104. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  105. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  106. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  107. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  108. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  109. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  110. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  111. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  112. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  113. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  114. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  115. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  116. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  117. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  118. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  119. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  120. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  121. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  122. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  123. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  124. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  125. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  126. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  127. package/dist/templates/react-app/__tests__/src/uikit/components/chatMessage/ChatRoot.test.tsx +274 -0
  128. package/dist/templates/react-app/config/IOCIdentifier.ts +11 -8
  129. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  130. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  131. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  132. package/dist/templates/react-app/config/Identifier/components/component.chatMessage.ts +56 -0
  133. package/dist/templates/react-app/config/Identifier/components/component.messageBaseList.ts +103 -0
  134. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  135. package/dist/templates/react-app/config/Identifier/pages/index.ts +9 -0
  136. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  137. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  138. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  139. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  140. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  141. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  142. package/dist/templates/react-app/config/Identifier/pages/page.message.ts +20 -0
  143. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  144. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  145. package/dist/templates/react-app/config/app.router.ts +81 -61
  146. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  147. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  148. package/dist/templates/react-app/config/i18n/chatMessageI18n.ts +17 -0
  149. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  150. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  151. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  152. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  153. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  154. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  155. package/dist/templates/react-app/config/i18n/messageBaseListI18n.ts +22 -0
  156. package/dist/templates/react-app/config/i18n/messageI18n.ts +14 -0
  157. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  158. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  159. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  160. package/dist/templates/react-app/config/theme.ts +14 -4
  161. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  162. package/dist/templates/react-app/docs/en/components/chat-message-component.md +314 -0
  163. package/dist/templates/react-app/docs/en/components/chat-message-refactor.md +270 -0
  164. package/dist/templates/react-app/docs/en/components/message-base-list-component.md +172 -0
  165. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  166. package/dist/templates/react-app/docs/en/env.md +1132 -278
  167. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  168. package/dist/templates/react-app/docs/en/index.md +733 -104
  169. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  170. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  171. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  172. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  173. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  174. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  175. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  176. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  177. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  178. package/dist/templates/react-app/docs/en/store.md +1194 -184
  179. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  180. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  181. package/dist/templates/react-app/docs/zh/components/chat-message-component.md +314 -0
  182. package/dist/templates/react-app/docs/zh/components/chat-message-refactor.md +270 -0
  183. package/dist/templates/react-app/docs/zh/components/message-base-list-component.md +172 -0
  184. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  185. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  186. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  187. package/dist/templates/react-app/docs/zh/index.md +717 -104
  188. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  189. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  190. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  191. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  192. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  193. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  194. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  195. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  196. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  197. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  198. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  199. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  200. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  201. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  202. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  203. package/dist/templates/react-app/eslint.config.mjs +247 -0
  204. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  205. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  206. package/dist/templates/react-app/package.json +31 -3
  207. package/dist/templates/react-app/playwright.config.ts +79 -0
  208. package/dist/templates/react-app/public/locales/en/common.json +233 -179
  209. package/dist/templates/react-app/public/locales/zh/common.json +233 -179
  210. package/dist/templates/react-app/src/App.tsx +15 -42
  211. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  212. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  213. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  214. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  215. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  216. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  217. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  219. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  220. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  221. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  222. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  223. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  224. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  225. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  226. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  227. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  228. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  229. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  230. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  231. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  232. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  233. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  234. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  235. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  236. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  237. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  238. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  239. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  240. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  241. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  242. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  243. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  244. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  245. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  246. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  247. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  248. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  249. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  250. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  251. package/dist/templates/react-app/src/core/globals.ts +9 -9
  252. package/dist/templates/react-app/src/main.tsx +4 -4
  253. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  254. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  255. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  256. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  257. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  258. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  259. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  260. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  261. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  262. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  263. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  264. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  265. package/dist/templates/react-app/src/pages/base/MessagePage.tsx +40 -0
  266. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  267. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  268. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  269. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  270. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  271. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  272. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  273. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  277. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  285. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  286. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  287. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  288. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  289. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  290. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  291. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  292. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  293. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  294. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  295. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  296. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  297. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  298. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  299. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  300. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  301. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  302. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  303. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  304. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  305. package/dist/templates/react-app/src/uikit/components/MessageBaseList.tsx +240 -0
  306. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  307. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  308. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  309. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  310. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  311. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatMessageBridge.ts +176 -0
  312. package/dist/templates/react-app/src/uikit/components/chatMessage/ChatRoot.tsx +21 -0
  313. package/dist/templates/react-app/src/uikit/components/chatMessage/FocusBar.tsx +106 -0
  314. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageApi.ts +271 -0
  315. package/dist/templates/react-app/src/uikit/components/chatMessage/MessageItem.tsx +102 -0
  316. package/dist/templates/react-app/src/uikit/components/chatMessage/MessagesList.tsx +86 -0
  317. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  318. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  321. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  322. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  323. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  324. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  325. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  326. package/dist/templates/react-app/tsconfig.json +8 -1
  327. package/dist/templates/react-app/tsconfig.node.json +1 -1
  328. package/dist/templates/react-app/tsconfig.test.json +3 -1
  329. package/dist/templates/react-app/vite.config.ts +50 -34
  330. package/package.json +2 -1
  331. package/dist/configs/react-app/eslint.config.js +0 -94
  332. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  333. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  334. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  335. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  336. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  337. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  338. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  339. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  340. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  341. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  342. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  343. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  344. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  345. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  346. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  349. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  350. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  351. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  352. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  353. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  354. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  355. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  356. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  357. package/dist/templates/react-app/config/i18n.ts +0 -15
  358. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  359. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  360. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  361. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  362. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  363. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,20 @@
1
+ import { ResourceStore } from '@qlover/corekit-bridge';
2
+ import { inject, injectable } from 'inversify';
3
+ import { ResourceService } from '@/base/services/ResourceService';
4
+ import type { LocalesSchema } from '@migrations/schema/LocalesSchema';
5
+ import { AdminLocalesApi } from './adminApi/AdminLocalesApi';
6
+ import { ResourceState } from '../cases/ResourceState';
7
+
8
+ @injectable()
9
+ export class AdminLocalesService extends ResourceService<
10
+ LocalesSchema,
11
+ ResourceStore<ResourceState>
12
+ > {
13
+ constructor(
14
+ @inject(AdminLocalesApi)
15
+ protected adminLocalesApi: AdminLocalesApi
16
+ ) {
17
+ const store = new ResourceStore(() => new ResourceState());
18
+ super('admin_locales', store, adminLocalesApi);
19
+ }
20
+ }
@@ -0,0 +1,26 @@
1
+ import { ResourceEvent } from '@brain-toolkit/antd-blocks/resourceTable/ResourceEvent';
2
+ import type { ResourceService } from './ResourceService';
3
+ import type { DialogHandlerOptions } from '../cases/DialogHandler';
4
+ import type { ResourceState } from '../cases/ResourceState';
5
+ import type { ResourceTableEventCommonParams } from '@brain-toolkit/antd-blocks';
6
+ import type { UIDialogInterface, ResourceStore } from '@qlover/corekit-bridge';
7
+ import type { FormInstance } from 'antd';
8
+
9
+ export class AdminPageEvent extends ResourceEvent {
10
+ constructor(
11
+ namespace: string,
12
+ resource: ResourceService<unknown, ResourceStore<ResourceState>>,
13
+ schemaFormRef?: FormInstance<unknown>,
14
+ protected uiDialog?: UIDialogInterface<DialogHandlerOptions>
15
+ ) {
16
+ super(namespace, resource, undefined, schemaFormRef);
17
+ }
18
+
19
+ override onDeleted(_params: ResourceTableEventCommonParams): void {
20
+ this.uiDialog?.confirm({
21
+ title: 'Confirm Delete',
22
+ content: 'Are you sure you want to delete this item?',
23
+ onOk: () => this.actionDelete(_params)
24
+ });
25
+ }
26
+ }
@@ -0,0 +1,42 @@
1
+ import { RequestState, type LifecycleInterface } from '@qlover/corekit-bridge';
2
+ import type { ResourceService } from '@/base/services/ResourceService';
3
+
4
+ export class AdminPageScheduler implements LifecycleInterface {
5
+ /**
6
+ * @override
7
+ */
8
+ async created(parmas: {
9
+ resource: ResourceService<unknown>;
10
+ }): Promise<unknown> {
11
+ const { resource } = parmas;
12
+ const store = resource.getStore();
13
+
14
+ store.changeInitState(new RequestState(true));
15
+
16
+ try {
17
+ const result = await resource.search(store.state.searchParams);
18
+
19
+ store.changeInitState(new RequestState(false, result).end());
20
+ return result;
21
+ } catch (error) {
22
+ store.changeInitState(new RequestState(false, null, error).end());
23
+
24
+ return error;
25
+ }
26
+ }
27
+
28
+ /**
29
+ * @override
30
+ */
31
+ destroyed(parmas: { resource: ResourceService<unknown> }): void {
32
+ const { resource } = parmas;
33
+ const store = resource.getStore();
34
+
35
+ store.reset();
36
+ }
37
+
38
+ /**
39
+ * @override
40
+ */
41
+ updated(): void {}
42
+ }
@@ -0,0 +1,122 @@
1
+ import {
2
+ RequestState,
3
+ type ResourceStore,
4
+ type ResourceStateInterface,
5
+ type ResourceServiceInterface,
6
+ type ResourceInterface,
7
+ type ResourceQuery
8
+ } from '@qlover/corekit-bridge';
9
+ import type { AppApiResponse } from '@/base/services/appApi/AppApiRequester';
10
+ import type { PaginationInterface } from '@/server/port/PaginationInterface';
11
+
12
+ export class ResourceService<
13
+ T,
14
+ Store extends
15
+ ResourceStore<ResourceStateInterface> = ResourceStore<ResourceStateInterface>
16
+ > implements ResourceServiceInterface<T>
17
+ {
18
+ readonly unionKey: string = 'id';
19
+
20
+ constructor(
21
+ readonly serviceName: string,
22
+ readonly store: Store,
23
+ readonly resourceApi: ResourceInterface<T>
24
+ ) {}
25
+
26
+ getStore(): Store {
27
+ return this.store;
28
+ }
29
+
30
+ /**
31
+ * @override
32
+ */
33
+ async created(): Promise<unknown> {
34
+ this.store.changeInitState(new RequestState(true));
35
+
36
+ try {
37
+ const result = await this.search(this.store.state.searchParams);
38
+
39
+ this.store.changeInitState(new RequestState(false, result).end());
40
+ return result;
41
+ } catch (error) {
42
+ this.store.changeInitState(new RequestState(false, null, error).end());
43
+
44
+ return error;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @override
50
+ */
51
+ destroyed(): void {
52
+ this.store.reset();
53
+ }
54
+
55
+ /**
56
+ * @override
57
+ */
58
+ updated(): void {}
59
+
60
+ async search(
61
+ params: Partial<ResourceQuery>
62
+ ): Promise<PaginationInterface<T>> {
63
+ this.store.changeListState(
64
+ new RequestState(true, this.store.state.listState.result)
65
+ );
66
+
67
+ try {
68
+ const response = (await this.resourceApi.search(
69
+ Object.assign({}, this.store.state.searchParams, params)
70
+ )) as AppApiResponse<ResourceQuery, PaginationInterface<T>>;
71
+
72
+ if (response.data.success) {
73
+ const resultData = response.data.data as PaginationInterface<T>;
74
+ this.store.changeListState(new RequestState(false, resultData).end());
75
+ return resultData;
76
+ }
77
+
78
+ this.store.changeListState(
79
+ new RequestState(false, null, response.data.message).end()
80
+ );
81
+ } catch (error) {
82
+ this.store.changeListState(new RequestState(false, null, error).end());
83
+ }
84
+
85
+ return this.store.state.listState.result! as PaginationInterface<T>;
86
+ }
87
+
88
+ refresh(): Promise<unknown> {
89
+ return this.search(this.store.state.searchParams);
90
+ }
91
+
92
+ async update(data: Partial<T>): Promise<unknown> {
93
+ const result = await this.resourceApi.update(data);
94
+
95
+ // 更新本地列表数据
96
+ const listResult = this.store.state.listState
97
+ .result as PaginationInterface<T>;
98
+ if (listResult && listResult.list) {
99
+ const updatedData = listResult.list.map((item) =>
100
+ (item as Record<string, unknown>)[this.unionKey] ===
101
+ (data as Record<string, unknown>)[this.unionKey]
102
+ ? { ...item, ...data }
103
+ : item
104
+ );
105
+ this.store.changeListState(
106
+ new RequestState(false, { ...listResult, list: updatedData })
107
+ );
108
+ }
109
+
110
+ return result;
111
+ }
112
+
113
+ create(data: T): Promise<unknown> {
114
+ return this.resourceApi.create(data);
115
+ }
116
+ remove(data: T): Promise<unknown> {
117
+ return this.resourceApi.remove(data);
118
+ }
119
+ export(data: T): Promise<unknown> {
120
+ return this.resourceApi.export(data);
121
+ }
122
+ }
@@ -0,0 +1,104 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import type { PaginationInterface } from '@/server/port/PaginationInterface';
3
+ import type { LocalesSchema } from '@migrations/schema/LocalesSchema';
4
+ import type { LocaleType } from '@config/i18n';
5
+ import {
6
+ AppApiRequester,
7
+ type AppApiConfig,
8
+ type AppApiTransaction
9
+ } from '../appApi/AppApiRequester';
10
+ import type { ResourceInterface, ResourceQuery } from '@qlover/corekit-bridge';
11
+ import type { RequestTransaction } from '@qlover/fe-corekit';
12
+
13
+ export type AdminLocalesListTransaction = AppApiTransaction<
14
+ ResourceQuery,
15
+ PaginationInterface<unknown>
16
+ >;
17
+
18
+ export type AdminLocalesUpdateTransaction = AppApiTransaction<
19
+ Partial<LocalesSchema>,
20
+ LocalesSchema
21
+ >;
22
+
23
+ @injectable()
24
+ export class AdminLocalesApi implements ResourceInterface<LocalesSchema> {
25
+ constructor(
26
+ @inject(AppApiRequester)
27
+ protected client: RequestTransaction<AppApiConfig>
28
+ ) {}
29
+
30
+ /**
31
+ * @override
32
+ */
33
+ create(data: LocalesSchema): Promise<unknown> {
34
+ return this.client.request<AdminLocalesListTransaction>({
35
+ url: '/admin/locales/create',
36
+ method: 'POST',
37
+ data: data as unknown as Record<string, unknown>
38
+ });
39
+ }
40
+
41
+ /**
42
+ * @override
43
+ */
44
+ remove(data: Partial<LocalesSchema>): Promise<unknown> {
45
+ return this.client.request<AdminLocalesListTransaction>({
46
+ url: '/admin/locales',
47
+ method: 'DELETE',
48
+ data: data as unknown as Record<string, unknown>
49
+ });
50
+ }
51
+
52
+ /**
53
+ * @override
54
+ */
55
+ search(
56
+ params: ResourceQuery
57
+ ): Promise<AdminLocalesListTransaction['response']> {
58
+ return this.client.request<AdminLocalesListTransaction>({
59
+ url: '/admin/locales',
60
+ method: 'GET',
61
+ params: params as unknown as Record<string, unknown>
62
+ });
63
+ }
64
+
65
+ /**
66
+ * @override
67
+ */
68
+ export(data: LocalesSchema): Promise<unknown> {
69
+ return this.client.request<AdminLocalesListTransaction>({
70
+ url: '/admin/locales',
71
+ method: 'GET',
72
+ data: data as unknown as Record<string, unknown>
73
+ });
74
+ }
75
+
76
+ /**
77
+ * @override
78
+ */
79
+ update(
80
+ data: Partial<LocalesSchema>
81
+ ): Promise<AdminLocalesUpdateTransaction['response']> {
82
+ return this.client.request<AdminLocalesUpdateTransaction>({
83
+ url: `/admin/locales/update`,
84
+ method: 'POST',
85
+ data
86
+ });
87
+ }
88
+
89
+ import(data: {
90
+ [key in LocaleType]?: File;
91
+ }): Promise<unknown> {
92
+ const formdata = new FormData();
93
+ for (const [key, value] of Object.entries(data)) {
94
+ formdata.append(key, value);
95
+ }
96
+
97
+ return this.client.request({
98
+ url: '/admin/locales/import',
99
+ method: 'POST',
100
+ data: formdata,
101
+ responseType: 'formdata'
102
+ });
103
+ }
104
+ }
@@ -1,27 +1,28 @@
1
1
  import { inject, injectable } from 'inversify';
2
- import type { AdminPageListParams } from '@/base/port/AdminPageInterface';
3
2
  import type { PaginationInterface } from '@/server/port/PaginationInterface';
3
+ import type { UserSchema } from '@migrations/schema/UserSchema';
4
4
  import {
5
5
  AppApiRequester,
6
6
  type AppApiConfig,
7
7
  type AppApiTransaction
8
8
  } from '../appApi/AppApiRequester';
9
+ import type { ResourceInterface, ResourceQuery } from '@qlover/corekit-bridge';
9
10
  import type { RequestTransaction } from '@qlover/fe-corekit';
10
11
 
11
12
  export type AdminUserListTransaction = AppApiTransaction<
12
- AdminPageListParams,
13
+ ResourceQuery,
13
14
  PaginationInterface<unknown>
14
15
  >;
15
16
 
16
17
  @injectable()
17
- export class AdminUserApi {
18
+ export class AdminUserApi implements ResourceInterface<UserSchema> {
18
19
  constructor(
19
20
  @inject(AppApiRequester)
20
21
  protected client: RequestTransaction<AppApiConfig>
21
22
  ) {}
22
23
 
23
- async getUserList(
24
- params: AdminPageListParams
24
+ async search(
25
+ params: AdminUserListTransaction['request']
25
26
  ): Promise<AdminUserListTransaction['response']> {
26
27
  const response = await this.client.request<AdminUserListTransaction>({
27
28
  url: '/admin/users',
@@ -31,4 +32,36 @@ export class AdminUserApi {
31
32
 
32
33
  return response;
33
34
  }
35
+
36
+ create(data: UserSchema): Promise<unknown> {
37
+ return this.client.request<AdminUserListTransaction>({
38
+ url: '/admin/users',
39
+ method: 'POST',
40
+ data: data as unknown as Record<string, unknown>
41
+ });
42
+ }
43
+
44
+ remove(data: UserSchema): Promise<unknown> {
45
+ return this.client.request<AdminUserListTransaction>({
46
+ url: '/admin/users',
47
+ method: 'DELETE',
48
+ data: data as unknown as Record<string, unknown>
49
+ });
50
+ }
51
+
52
+ update(data: UserSchema): Promise<unknown> {
53
+ return this.client.request<AdminUserListTransaction>({
54
+ url: '/admin/users',
55
+ method: 'PUT',
56
+ data: data as unknown as Record<string, unknown>
57
+ });
58
+ }
59
+
60
+ export(data: UserSchema): Promise<unknown> {
61
+ return this.client.request<AdminUserListTransaction>({
62
+ url: '/admin/users',
63
+ method: 'GET',
64
+ data: data as unknown as Record<string, unknown>
65
+ });
66
+ }
34
67
  }
@@ -58,7 +58,7 @@ export class AppApiPlugin implements ExecutorPlugin {
58
58
  const json = await this.getResponseJson(response);
59
59
 
60
60
  if (this.isAppApiErrorInterface(json)) {
61
- const newError = new ExecutorError(json.message || json.id);
61
+ const newError = new ExecutorError(json.id, json.message);
62
62
  // context.error = newError;
63
63
  return newError;
64
64
  }
@@ -1,6 +1,7 @@
1
1
  // src/i18n/request.ts
2
2
 
3
3
  import { getRequestConfig } from 'next-intl/server';
4
+ import { useApiLocales } from '@config/common';
4
5
  import { routing, type Locale } from './routing';
5
6
 
6
7
  // Export a function to configure next-intl on each request (server-side)
@@ -13,9 +14,37 @@ export default getRequestConfig(async ({ requestLocale }) => {
13
14
  locale = routing.defaultLocale;
14
15
  }
15
16
 
17
+ // use api locales
18
+ if (useApiLocales) {
19
+ const app_host = process.env.APP_HOST;
20
+ const localeUrl = `${app_host}/api/locales/json?locale=${locale}`;
21
+ const response = await fetch(localeUrl);
22
+ const data = await response.json();
23
+ return {
24
+ locale,
25
+ messages: data,
26
+ // 将 MISSING_MESSAGE 错误转换为警告
27
+ onError: (error) => {
28
+ if (error.message.includes('MISSING_MESSAGE')) {
29
+ console.warn(`[i18n] Missing translation: ${error.message}`);
30
+ return error.key; // 返回 key 作为 fallback 文本
31
+ }
32
+ throw error; // 其他错误仍然抛出
33
+ }
34
+ };
35
+ }
36
+
16
37
  // Dynamically import the translation messages for the selected locale
17
38
  return {
18
39
  locale,
19
- messages: (await import(`../../public/locales/${locale}.json`)).default
40
+ messages: (await import(`../../public/locales/${locale}.json`)).default,
41
+ // 将 MISSING_MESSAGE 错误转换为警告
42
+ onError: (error) => {
43
+ if (error.message.includes('MISSING_MESSAGE')) {
44
+ console.warn(`[i18n] Missing translation: ${error.message}`);
45
+ return error.key; // 返回 key 作为 fallback 文本
46
+ }
47
+ throw error; // 其他错误仍然抛出
48
+ }
20
49
  };
21
50
  });
@@ -1,5 +1,6 @@
1
1
  import { notFound } from 'next/navigation';
2
2
  import { getMessages, getTranslations } from 'next-intl/server';
3
+ import { TranslateI18nInterface } from '@/base/cases/TranslateI18nInterface';
3
4
  import { i18nConfig } from '@config/i18n';
4
5
  import type { LocaleType, PageI18nInterface } from '@config/i18n';
5
6
  import type { ParamsHandlerInterface as ParamsHandlerInterface } from './port/ParamsHandlerInterface';
@@ -60,15 +61,6 @@ export class PageParams implements ParamsHandlerInterface {
60
61
  namespace: namespace
61
62
  });
62
63
 
63
- const result = Object.fromEntries(
64
- Object.entries(i18nInterface).map(([key, value]) => {
65
- if (typeof value === 'string') {
66
- return [key, t(value)];
67
- }
68
- return [key, value];
69
- })
70
- ) as T;
71
-
72
- return result;
64
+ return TranslateI18nInterface.translate<T>(i18nInterface, t);
73
65
  }
74
66
  }
@@ -4,12 +4,15 @@ export type Where = [string, WhereOperation, string | number];
4
4
  export interface BridgeEvent {
5
5
  table: string;
6
6
  fields?: string | string[];
7
+ orderBy?: BridgeOrderBy;
7
8
  where?: Where[];
8
9
  data?: unknown;
9
10
  page?: number;
10
11
  pageSize?: number;
11
12
  }
12
13
 
14
+ export type BridgeOrderBy = [string, 0 | 1]; // 0: asc, 1: desc
15
+
13
16
  export interface PaginationInfo {
14
17
  total: number;
15
18
  page: number;
@@ -19,12 +22,14 @@ export interface PaginationInfo {
19
22
  export interface DBBridgeResponse<T> {
20
23
  error?: unknown;
21
24
  data: T;
25
+ count?: number;
22
26
  pagination?: PaginationInfo;
23
27
  }
24
28
 
25
29
  export interface DBBridgeInterface {
26
30
  add(event: BridgeEvent): Promise<DBBridgeResponse<unknown>>;
27
31
  update(event: BridgeEvent): Promise<DBBridgeResponse<unknown>>;
32
+ upsert(event: BridgeEvent): Promise<DBBridgeResponse<unknown>>;
28
33
  delete(event: BridgeEvent): Promise<DBBridgeResponse<unknown>>;
29
34
  get(event: BridgeEvent): Promise<DBBridgeResponse<unknown>>;
30
35
  pagination(event: BridgeEvent): Promise<DBBridgeResponse<unknown[]>>;
@@ -1,4 +1,5 @@
1
1
  import type { PaginationInterface } from '@/server/port/PaginationInterface';
2
+ import type { BridgeOrderBy } from './DBBridgeInterface';
2
3
 
3
4
  export interface DBTableInterface {
4
5
  readonly name: string;
@@ -6,5 +7,6 @@ export interface DBTableInterface {
6
7
  pagination<T = unknown>(params: {
7
8
  page: number;
8
9
  pageSize: number;
10
+ orderBy?: BridgeOrderBy;
9
11
  }): Promise<PaginationInterface<T>>;
10
12
  }
@@ -0,0 +1,43 @@
1
+ import type { DBTableInterface } from '@/server/port/DBTableInterface';
2
+ import type { LocalesSchema } from '@migrations/schema/LocalesSchema';
3
+ import type { BridgeOrderBy } from './DBBridgeInterface';
4
+
5
+ export interface UpsertChunkResult {
6
+ success: boolean;
7
+ chunkIndex: number;
8
+ inputData: Partial<LocalesSchema>[]; // Original data sent to upsert
9
+ returnedData?: LocalesSchema[]; // Actual data returned from database
10
+ affectedCount?: number; // Number of rows affected
11
+ error?: string;
12
+ }
13
+
14
+ export interface UpsertResult {
15
+ totalCount: number; // Total items attempted
16
+ successCount: number; // Successfully upserted items
17
+ failureCount: number; // Failed items
18
+ successChunks: UpsertChunkResult[];
19
+ failureChunks: UpsertChunkResult[];
20
+ allReturnedData: LocalesSchema[]; // All successfully upserted data combined
21
+ }
22
+
23
+ export interface LocalesRepositoryInterface extends DBTableInterface {
24
+ getLocales(
25
+ localeName: string,
26
+ orderBy?: BridgeOrderBy
27
+ ): Promise<LocalesSchema[]>;
28
+
29
+ add(params: LocalesSchema): Promise<LocalesSchema[] | null>;
30
+
31
+ updateById(
32
+ id: number,
33
+ params: Partial<Omit<LocalesSchema, 'id' | 'created_at'>>
34
+ ): Promise<void>;
35
+
36
+ upsert(
37
+ params: Partial<LocalesSchema>[],
38
+ options?: {
39
+ chunkSize?: number;
40
+ concurrency?: number;
41
+ }
42
+ ): Promise<UpsertResult>;
43
+ }