@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
@@ -1,22 +1,22 @@
1
- import { type SyncStorageInterface } from '@qlover/fe-corekit';
2
- import type {
3
- UserApiLoginTransaction,
4
- UserInfo
5
- } from '@/base/apis/userApi/UserApiType';
1
+ import * as errKeys from '@config/Identifier/common/common.error';
2
+ import { IOCIdentifier } from '@config/IOCIdentifier';
6
3
  import {
7
4
  type UserAuthApiInterface,
8
5
  type UserAuthState,
9
6
  LoginResponseData,
10
7
  UserAuthStore
11
8
  } from '@qlover/corekit-bridge';
9
+ import { type SyncStorageInterface } from '@qlover/fe-corekit';
12
10
  import { inject, injectable } from 'inversify';
13
11
  import { UserApi } from '@/base/apis/userApi/UserApi';
12
+ import type {
13
+ UserApiLoginTransaction,
14
+ UserInfo
15
+ } from '@/base/apis/userApi/UserApiType';
14
16
  import { AppError } from '@/base/cases/AppError';
15
- import * as errKeys from '@config/Identifier/common.error';
16
- import { IOCIdentifier } from '@config/IOCIdentifier';
17
17
  import { AppConfig } from '../cases/AppConfig';
18
- import { UserServiceInterface } from '../port/UserServiceInterface';
19
18
  import { RouteServiceInterface } from '../port/RouteServiceInterface';
19
+ import { UserServiceInterface } from '../port/UserServiceInterface';
20
20
 
21
21
  export interface UserApiState extends UserAuthState<UserInfo> {}
22
22
 
@@ -1,10 +1,17 @@
1
1
  import type { TFunction } from 'i18next';
2
2
  import type { UseTranslationResponse } from 'react-i18next';
3
3
 
4
- export interface BasePageProvider {
5
- meta: RouteMeta;
4
+ export interface BasePageProvider<T extends Record<string, string>> {
5
+ meta: Omit<RouteMeta, 'i18nInterface'> & {
6
+ i18nInterface?: T;
7
+ };
6
8
  i18n: UseTranslationResponse<string, string>;
7
9
  t: TFunction<string, string>;
10
+ /**
11
+ * 已经翻译后的 i18n interface
12
+ */
13
+ i18nInterface: T;
14
+ tt: T;
8
15
  }
9
16
 
10
17
  type RouteCategory = 'main' | 'auth' | 'common';
@@ -32,4 +39,9 @@ export interface RouteMeta {
32
39
  * @default 'common'
33
40
  */
34
41
  localNamespace?: string;
42
+
43
+ /**
44
+ * The i18n interface of the route
45
+ */
46
+ i18nInterface?: Record<string, string>;
35
47
  }
@@ -1,4 +1,4 @@
1
- import * as feGlobals from '@/core/globals';
1
+ import type * as feGlobals from '@/core/globals';
2
2
  import type { browserGlobalsName } from '@config/common';
3
3
 
4
4
  declare global {
@@ -1,49 +1,14 @@
1
1
  // ! dont't import tsx, only ts file
2
- import type { AppConfig } from '@/base/cases/AppConfig';
3
- import type { IOCRegisterInterface } from '@qlover/corekit-bridge';
4
- import { createIOCFunction } from '@qlover/corekit-bridge';
5
- import { InversifyContainer } from '@/base/cases/InversifyContainer';
6
- import { IOCIdentifierMap } from '@config/IOCIdentifier';
7
-
8
- /**
9
- * IOC register options
10
- */
11
- export type IocRegisterOptions = {
12
- /**
13
- * The pathname of the current page
14
- */
15
- pathname: string;
16
-
17
- /**
18
- * The app config
19
- */
20
- appConfig: AppConfig;
21
- };
22
-
23
- /**
24
- * IOC container
25
- *
26
- * This is a alias of IOCContainerInterface, use it without care about the implementation.
27
- *
28
- * Need to achieve the effect: when the implementation class on the right side of the equal sign changes, the IOCContainer will change automatically
29
- */
30
- export type IOCContainer = InversifyContainer;
31
-
32
- /**
33
- * IOC register interface.
34
- *
35
- * This is shortcut interface, implement this interface, you can use any IOC container.
36
- *
37
- * Need to achieve the effect: when the implementation class on the right side of the equal sign changes, the IOCContainer will change automatically
38
- */
39
- export interface IOCRegister
40
- extends IOCRegisterInterface<IOCContainer, IocRegisterOptions> {}
2
+ import { clientIOC } from './clientIoc/ClientIOC';
41
3
 
42
4
  /**
43
5
  * IOC function
44
6
  *
45
7
  * This is the only and main exported content of the file
46
8
  *
9
+ * - This is a global singleton instance of ClientIOC, and it is equivalent to clientIOC
10
+ * - It is not recommended to use this global variable, but to recommend using the useIOC hook in the ui component
11
+ *
47
12
  * @example use A class
48
13
  * ```ts
49
14
  * const userService = IOC(UserService);
@@ -60,10 +25,4 @@ export interface IOCRegister
60
25
  * const logger = IOC(IOCIdentifier.Logger);
61
26
  * ```
62
27
  */
63
- export const IOC = createIOCFunction<IOCIdentifierMap>(
64
- /**
65
- * If not inversify, you can use any IOC container,
66
- * then replace the InversifyContainer with your own IOC container
67
- */
68
- new InversifyContainer()
69
- );
28
+ export const IOC = clientIOC.create();
@@ -1,16 +1,17 @@
1
- import {
2
- Bootstrap,
3
- IOCContainerInterface,
4
- IOCFunctionInterface
5
- } from '@qlover/corekit-bridge';
6
- import type { IOCIdentifierMap } from '@config/IOCIdentifier';
7
1
  import { envBlackList, envPrefix, browserGlobalsName } from '@config/common';
2
+ import { Bootstrap } from '@qlover/corekit-bridge';
3
+ import { isObject } from 'lodash';
4
+ import type { IOCInterface, IOCRegister } from '@/base/port/IOCInterface';
5
+ import type { IOCIdentifierMap } from '@config/IOCIdentifier';
8
6
  import * as globals from '../globals';
9
- import { IocRegisterImpl } from '../IocRegisterImpl';
10
7
  import { BootstrapsRegistry } from './BootstrapsRegistry';
11
- import { isObject } from 'lodash';
8
+ import type { BootstrapsRegistryInterface } from './BootstrapsRegistry';
9
+ import type {
10
+ IOCContainerInterface,
11
+ IOCFunctionInterface
12
+ } from '@qlover/corekit-bridge';
12
13
 
13
- export type BootstrapAppArgs = {
14
+ export type BootstrapClientArgs = {
14
15
  /**
15
16
  * 启动的根节点,通常是window
16
17
  */
@@ -19,15 +20,36 @@ export type BootstrapAppArgs = {
19
20
  * 启动的web地址
20
21
  */
21
22
  bootHref: string;
23
+
24
+ /**
25
+ * IOC容器对象
26
+ */
27
+ ioc: IOCInterface<IOCIdentifierMap, IOCContainerInterface>;
28
+
29
+ /**
30
+ * IOC注册器对象,用于注册IOC容器
31
+ *
32
+ * 可能在ioc create 中已经注册,这里可以额外注册
33
+ */
34
+ iocRegister?: IOCRegister;
35
+
22
36
  /**
23
- * IOC容器
37
+ * 注册器类,用于注册注册器
24
38
  */
25
- IOC: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>;
39
+ RegistryClass?: new (
40
+ ioc: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>
41
+ ) => BootstrapsRegistryInterface;
26
42
  };
27
43
 
28
- export class BootstrapApp {
29
- static async main(args: BootstrapAppArgs): Promise<BootstrapAppArgs> {
30
- const { root, bootHref, IOC } = args;
44
+ export class BootstrapClient {
45
+ static async main(args: BootstrapClientArgs): Promise<BootstrapClientArgs> {
46
+ const {
47
+ root,
48
+ bootHref,
49
+ ioc,
50
+ iocRegister,
51
+ RegistryClass = BootstrapsRegistry
52
+ } = args;
31
53
 
32
54
  if (!isObject(root)) {
33
55
  throw new Error('root is not an object');
@@ -35,12 +57,17 @@ export class BootstrapApp {
35
57
 
36
58
  const { logger, appConfig } = globals;
37
59
 
60
+ const IOC = ioc.create({
61
+ pathname: bootHref,
62
+ appConfig: appConfig
63
+ });
64
+
38
65
  const bootstrap = new Bootstrap({
39
66
  root,
40
67
  logger,
41
68
  ioc: {
42
69
  manager: IOC,
43
- register: new IocRegisterImpl({ pathname: bootHref, appConfig })
70
+ register: iocRegister
44
71
  },
45
72
  envOptions: {
46
73
  target: appConfig,
@@ -62,9 +89,9 @@ export class BootstrapApp {
62
89
  // init bootstrap
63
90
  await bootstrap.initialize();
64
91
 
65
- const bootstrapsRegistry = new BootstrapsRegistry(IOC);
92
+ const bootstrapsRegistry = new RegistryClass(IOC);
66
93
 
67
- await bootstrap.use(bootstrapsRegistry.register()).start();
94
+ await bootstrap.use(bootstrapsRegistry.register(IOC)).start();
68
95
  } catch (error) {
69
96
  logger.error(`${appConfig.appName} starup error:`, error);
70
97
  }
@@ -1,17 +1,24 @@
1
+ import { IOCIdentifier } from '@config/IOCIdentifier';
2
+ import { AiApiBootstarp } from '@/base/apis/AiApi';
3
+ import { FeApiBootstarp } from '@/base/apis/feApi/FeApiBootstarp';
4
+ import { UserApiBootstarp } from '@/base/apis/userApi/UserApiBootstarp';
5
+ import type { IOCIdentifierMap } from '@config/IOCIdentifier';
6
+ import { IocIdentifierTest } from './IocIdentifierTest';
7
+ import { printBootstrap } from './PrintBootstrap';
1
8
  import type {
2
9
  BootstrapExecutorPlugin,
3
10
  EnvConfigInterface,
4
11
  IOCContainerInterface,
5
12
  IOCFunctionInterface
6
13
  } from '@qlover/corekit-bridge';
7
- import { UserApiBootstarp } from '@/base/apis/userApi/UserApiBootstarp';
8
- import { FeApiBootstarp } from '@/base/apis/feApi/FeApiBootstarp';
9
- import { AiApiBootstarp } from '@/base/apis/AiApi';
10
- import { printBootstrap } from './PrintBootstrap';
11
- import { IOCIdentifier, IOCIdentifierMap } from '@config/IOCIdentifier';
12
- import { IocIdentifierTest } from './IocIdentifierTest';
13
14
 
14
- export class BootstrapsRegistry {
15
+ export interface BootstrapsRegistryInterface {
16
+ register(
17
+ ioc: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>
18
+ ): BootstrapExecutorPlugin[];
19
+ }
20
+
21
+ export class BootstrapsRegistry implements BootstrapsRegistryInterface {
15
22
  constructor(
16
23
  protected IOC: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>
17
24
  ) {}
@@ -1,5 +1,5 @@
1
1
  import { IOCIdentifier } from '@config/IOCIdentifier';
2
- import { BootstrapExecutorPlugin } from '@qlover/corekit-bridge';
2
+ import type { BootstrapExecutorPlugin } from '@qlover/corekit-bridge';
3
3
 
4
4
  export const IocIdentifierTest: BootstrapExecutorPlugin = {
5
5
  pluginName: 'IocIdentifierTest',
@@ -1,5 +1,5 @@
1
1
  import { browserGlobalsName } from '@config/common';
2
- import { BootstrapExecutorPlugin } from '@qlover/corekit-bridge';
2
+ import type { BootstrapExecutorPlugin } from '@qlover/corekit-bridge';
3
3
 
4
4
  export const printBootstrap: BootstrapExecutorPlugin = {
5
5
  pluginName: 'PrintBootstrap',
@@ -0,0 +1,40 @@
1
+ import {
2
+ createIOCFunction,
3
+ type IOCContainerInterface,
4
+ type IOCFunctionInterface
5
+ } from '@qlover/corekit-bridge';
6
+ import { InversifyContainer } from '@/base/cases/InversifyContainer';
7
+ import type { IOCInterface } from '@/base/port/IOCInterface';
8
+ import type { IOCIdentifierMap } from '@config/IOCIdentifier';
9
+ import { ClientIOCRegister } from './ClientIOCRegister';
10
+ import { appConfig } from '../globals';
11
+
12
+ export class ClientIOC
13
+ implements IOCInterface<IOCIdentifierMap, IOCContainerInterface>
14
+ {
15
+ protected ioc: IOCFunctionInterface<
16
+ IOCIdentifierMap,
17
+ IOCContainerInterface
18
+ > | null = null;
19
+
20
+ create(): IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface> {
21
+ if (this.ioc) {
22
+ return this.ioc;
23
+ }
24
+
25
+ this.ioc = createIOCFunction<IOCIdentifierMap>(new InversifyContainer());
26
+
27
+ // move to BootstrapClient
28
+ const register = new ClientIOCRegister({
29
+ // eslint-disable-next-line no-restricted-globals
30
+ pathname: window.location.pathname,
31
+ appConfig: appConfig
32
+ });
33
+
34
+ register.register(this.ioc.implemention!, this.ioc);
35
+
36
+ return this.ioc;
37
+ }
38
+ }
39
+
40
+ export const clientIOC = new ClientIOC();
@@ -1,30 +1,39 @@
1
- import type { IOCContainer, IOCRegister, IocRegisterOptions } from './IOC';
1
+ import { baseNoLocaleRoutes, baseRoutes } from '@config/app.router';
2
+ import { routerPrefix, useLocaleRoutes } from '@config/common';
3
+ import mockDataJson from '@config/feapi.mock.json';
4
+ import { IOCIdentifier as I } from '@config/IOCIdentifier';
5
+ import { themeConfig } from '@config/theme';
2
6
  import {
3
7
  ApiCatchPlugin,
4
8
  ApiMockPlugin,
5
9
  RequestCommonPlugin,
6
- ThemeService,
7
- type IOCManagerInterface
10
+ ThemeService
8
11
  } from '@qlover/corekit-bridge';
9
- import * as globals from './globals';
10
- import { IOCIdentifier as I } from '@config/IOCIdentifier';
11
- import mockDataJson from '@config/feapi.mock.json';
12
+ import { I18nKeyErrorPlugin } from '@/base/cases/I18nKeyErrorPlugin';
13
+ import { RequestStatusCatcher } from '@/base/cases/RequestStatusCatcher';
14
+ import type { IocRegisterOptions } from '@/base/port/IOCInterface';
15
+ import type { UserServiceInterface } from '@/base/port/UserServiceInterface';
12
16
  import { I18nService } from '@/base/services/I18nService';
13
- import { themeConfig } from '@config/theme';
14
- import { useLocaleRoutes } from '@config/common';
15
- import { baseNoLocaleRoutes, baseRoutes } from '@config/app.router';
16
- import { SyncStorageInterface } from '@qlover/fe-corekit';
17
+ import { ProcesserExecutor } from '@/base/services/ProcesserExecutor';
17
18
  import { RouteService } from '@/base/services/RouteService';
18
- import { RequestStatusCatcher } from '@/base/cases/RequestStatusCatcher';
19
19
  import { UserService } from '@/base/services/UserService';
20
- import { I18nKeyErrorPlugin } from '@/base/cases/I18nKeyErrorPlugin';
21
- import { ProcesserExecutor } from '@/base/services/ProcesserExecutor';
22
- import { NavigateBridge } from '@/uikit/bridges/NavigateBridge';
23
20
  import { ExecutorPageBridge } from '@/uikit/bridges/ExecutorPageBridge';
24
21
  import { JSONStoragePageBridge } from '@/uikit/bridges/JSONStoragePageBridge';
22
+ import { NavigateBridge } from '@/uikit/bridges/NavigateBridge';
25
23
  import { RequestPageBridge } from '@/uikit/bridges/RequestPageBridge';
24
+ import * as globals from '../globals';
25
+ import type {
26
+ ThemeServiceProps,
27
+ IOCManagerInterface,
28
+ IOCContainerInterface,
29
+ IOCRegisterInterface
30
+ } from '@qlover/corekit-bridge';
31
+ import type { SyncStorageInterface } from '@qlover/fe-corekit';
32
+ import type { LoggerInterface } from '@qlover/logger';
26
33
 
27
- export class IocRegisterImpl implements IOCRegister {
34
+ export class ClientIOCRegister
35
+ implements IOCRegisterInterface<IOCContainerInterface, IocRegisterOptions>
36
+ {
28
37
  constructor(protected options: IocRegisterOptions) {}
29
38
 
30
39
  /**
@@ -34,7 +43,7 @@ export class IocRegisterImpl implements IOCRegister {
34
43
  *
35
44
  * @param ioc - IOC container
36
45
  */
37
- protected registerGlobals(ioc: IOCContainer): void {
46
+ protected registerGlobals(ioc: IOCContainerInterface): void {
38
47
  const { appConfig } = this.options;
39
48
  const { dialogHandler, localStorageEncrypt, JSON, logger } = globals;
40
49
 
@@ -60,7 +69,7 @@ export class IocRegisterImpl implements IOCRegister {
60
69
  *
61
70
  * @param ioc
62
71
  */
63
- protected registerImplement(ioc: IOCContainer): void {
72
+ protected registerImplement(ioc: IOCContainerInterface): void {
64
73
  ioc.bind(I.I18nServiceInterface, new I18nService(this.options.pathname));
65
74
  ioc.bind(
66
75
  I.RouteServiceInterface,
@@ -70,14 +79,15 @@ export class IocRegisterImpl implements IOCRegister {
70
79
  {
71
80
  routes: useLocaleRoutes ? baseRoutes : baseNoLocaleRoutes,
72
81
  logger: ioc.get(I.Logger),
73
- hasLocalRoutes: useLocaleRoutes
82
+ hasLocalRoutes: useLocaleRoutes,
83
+ routerPrefix: routerPrefix
74
84
  }
75
85
  )
76
86
  );
77
87
  ioc.bind(
78
88
  I.ThemeService,
79
89
  new ThemeService({
80
- ...themeConfig,
90
+ ...(themeConfig as unknown as ThemeServiceProps),
81
91
  storage: ioc.get<SyncStorageInterface<string, string>>(I.LocalStorage)
82
92
  })
83
93
  );
@@ -91,14 +101,15 @@ export class IocRegisterImpl implements IOCRegister {
91
101
  ioc.bind(I.RequestPageBridgeInterface, ioc.get(RequestPageBridge));
92
102
  }
93
103
 
94
- protected registerCommon(ioc: IOCContainer): void {
104
+ protected registerCommon(ioc: IOCContainerInterface): void {
95
105
  const { appConfig } = this.options;
96
- const logger = ioc.get(I.Logger);
106
+ const logger = ioc.get<LoggerInterface>(I.Logger);
97
107
 
98
108
  const feApiRequestCommonPlugin = new RequestCommonPlugin({
99
109
  tokenPrefix: appConfig.openAiTokenPrefix,
100
110
  requiredToken: true,
101
- token: () => ioc.get(UserService).getToken()
111
+ token: () =>
112
+ ioc.get<UserServiceInterface>(I.UserServiceInterface).getToken()
102
113
  });
103
114
  const apiMockPlugin = new ApiMockPlugin(mockDataJson, logger);
104
115
  const apiCatchPlugin = new ApiCatchPlugin(
@@ -115,8 +126,8 @@ export class IocRegisterImpl implements IOCRegister {
115
126
  * @override
116
127
  */
117
128
  register(
118
- ioc: IOCContainer,
119
- _manager: IOCManagerInterface<IOCContainer>
129
+ ioc: IOCContainerInterface,
130
+ _manager: IOCManagerInterface<IOCContainerInterface>
120
131
  ): void {
121
132
  this.registerGlobals(ioc);
122
133
  this.registerCommon(ioc);
@@ -1,20 +1,20 @@
1
1
  // ! global variables, don't import any dependencies and don't have side effects
2
- import {
3
- Base64Serializer,
4
- JSONSerializer,
5
- ObjectStorage,
6
- SyncStorage,
7
- SyncStorageInterface
8
- } from '@qlover/fe-corekit';
2
+ import { loggerStyles } from '@config/common';
9
3
  import {
10
4
  ColorFormatter,
11
5
  ConsoleHandler,
12
6
  CookieStorage,
13
7
  Logger
14
8
  } from '@qlover/corekit-bridge';
15
- import { DialogHandler } from '@/base/cases/DialogHandler';
16
- import { loggerStyles } from '@config/common';
9
+ import {
10
+ Base64Serializer,
11
+ JSONSerializer,
12
+ ObjectStorage,
13
+ SyncStorage
14
+ } from '@qlover/fe-corekit';
17
15
  import { AppConfig } from '@/base/cases/AppConfig';
16
+ import { DialogHandler } from '@/base/cases/DialogHandler';
17
+ import type { SyncStorageInterface } from '@qlover/fe-corekit';
18
18
 
19
19
  export const appConfig = new AppConfig();
20
20
 
@@ -3,13 +3,13 @@ import 'reflect-metadata';
3
3
  import { StrictMode } from 'react';
4
4
  import { createRoot } from 'react-dom/client';
5
5
  import App from './App.tsx';
6
- import { BootstrapApp } from './core/bootstraps/BootstrapApp';
7
- import { IOC } from './core/IOC.ts';
6
+ import { BootstrapClient } from './core/bootstraps/BootstrapClient';
7
+ import { clientIOC } from './core/clientIoc/ClientIOC.ts';
8
8
 
9
- BootstrapApp.main({
9
+ BootstrapClient.main({
10
10
  root: window,
11
11
  bootHref: window.location.href,
12
- IOC: IOC
12
+ ioc: clientIOC
13
13
  });
14
14
 
15
15
  createRoot(document.getElementById('root')!).render(
@@ -1,11 +1,14 @@
1
+ import { PAGE_404_TITLE } from '@config/Identifier/common/common';
2
+ import { NOT_FOUND_COMPONENT } from '@config/Identifier/common/common.error';
1
3
  import { useBaseRoutePage } from '@/uikit/contexts/BaseRouteContext';
2
- import { PAGE_404_TITLE } from '@config/Identifier/common';
3
- import { NOT_FOUND_COMPONENT } from '@config/Identifier/common.error';
4
4
 
5
5
  export default function NotFound({ route }: { route?: string }) {
6
6
  const { t } = useBaseRoutePage();
7
7
  return (
8
- <div className="flex flex-col justify-center min-h-screen py-6 bg-background sm:py-12">
8
+ <div
9
+ data-testid="NotFound"
10
+ className="text-base bg-primary flex flex-col justify-center min-h-screen py-6 sm:py-12"
11
+ >
9
12
  <div className="relative py-3 mx-auto sm:max-w-xl">
10
13
  <h1 className="text-text text-2xl font-bold text-center">
11
14
  {route ? `${t(NOT_FOUND_COMPONENT)}: ${route}` : t(PAGE_404_TITLE)}
@@ -1,10 +1,13 @@
1
+ import { PAGE_500_TITLE } from '@config/Identifier/common/common';
1
2
  import { useBaseRoutePage } from '@/uikit/contexts/BaseRouteContext';
2
- import { PAGE_500_TITLE } from '@config/Identifier/common';
3
3
 
4
4
  export default function NotFound500() {
5
5
  const { t } = useBaseRoutePage();
6
6
  return (
7
- <div className="flex flex-col justify-center min-h-screen py-6 bg-background sm:py-12">
7
+ <div
8
+ data-testid="NotFound500"
9
+ className="text-base bg-primary flex flex-col justify-center min-h-screen py-6 sm:py-12"
10
+ >
8
11
  <div className="relative py-3 mx-auto sm:max-w-xl">
9
12
  <h1 className="text-text text-2xl font-bold text-center">
10
13
  {t(PAGE_500_TITLE)}
@@ -0,0 +1,5 @@
1
+ import { Navigate } from 'react-router-dom';
2
+
3
+ export default function NoRouteFound() {
4
+ return <Navigate data-testid="NoRouteFound" to="/404" replace />;
5
+ }
@@ -1,16 +1,19 @@
1
- import { IOC } from '@/core/IOC';
2
- import { Navigate, Outlet } from 'react-router-dom';
3
- import { useStore } from '@/uikit/hooks/useStore';
4
- import BaseHeader from '../../uikit/components/BaseHeader';
1
+ import { useStore } from '@brain-toolkit/react-kit/hooks/useStore';
5
2
  import { IOCIdentifier } from '@config/IOCIdentifier';
3
+ import { Navigate, Outlet } from 'react-router-dom';
4
+ import { useI18nGuard } from '@/uikit/hooks/useI18nGuard';
5
+ import { useIOC } from '@/uikit/hooks/useIOC';
6
+ import { BaseHeader } from '../../uikit/components/BaseHeader';
6
7
 
7
8
  export default function Layout() {
8
- const userService = IOC(IOCIdentifier.UserServiceInterface);
9
+ const userService = useIOC(IOCIdentifier.UserServiceInterface);
9
10
  useStore(userService.store);
10
11
 
12
+ useI18nGuard();
13
+
11
14
  // If user is authenticated, redirect to home page
12
15
  if (userService.isAuthenticated()) {
13
- return <Navigate to="/" replace />;
16
+ return <Navigate data-testid="Layout" to="/" replace />;
14
17
  }
15
18
 
16
19
  return (