@qlover/create-app 0.7.14 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/configs/_common/.gitignore.template +6 -0
  3. package/dist/configs/_common/.prettierignore +17 -5
  4. package/dist/configs/_common/.vscode/settings.json +6 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/templates/next-app/.env.template +1 -1
  8. package/dist/templates/next-app/README.en.md +130 -0
  9. package/dist/templates/next-app/README.md +114 -20
  10. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  11. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  12. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  13. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  14. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  15. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  16. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  17. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  18. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  20. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  21. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  22. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  23. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  24. package/dist/templates/next-app/config/common.ts +22 -13
  25. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  26. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  27. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  28. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  29. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  30. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  31. package/dist/templates/next-app/docs/en/api.md +387 -0
  32. package/dist/templates/next-app/docs/en/component.md +544 -0
  33. package/dist/templates/next-app/docs/en/database.md +496 -0
  34. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  35. package/dist/templates/next-app/docs/en/env.md +563 -0
  36. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  37. package/dist/templates/next-app/docs/en/index.md +165 -0
  38. package/dist/templates/next-app/docs/en/page.md +457 -0
  39. package/dist/templates/next-app/docs/en/project-structure.md +176 -0
  40. package/dist/templates/next-app/docs/en/router.md +427 -0
  41. package/dist/templates/next-app/docs/en/theme.md +532 -0
  42. package/dist/templates/next-app/docs/en/validator.md +478 -0
  43. package/dist/templates/next-app/docs/zh/api.md +387 -0
  44. package/dist/templates/next-app/docs/zh/component.md +544 -0
  45. package/dist/templates/next-app/docs/zh/database.md +496 -0
  46. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  47. package/dist/templates/next-app/docs/zh/env.md +563 -0
  48. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  49. package/dist/templates/next-app/docs/zh/index.md +165 -0
  50. package/dist/templates/next-app/docs/zh/page.md +457 -0
  51. package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
  52. package/dist/templates/next-app/docs/zh/router.md +427 -0
  53. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  54. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  55. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  56. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  57. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  58. package/dist/templates/next-app/package.json +7 -3
  59. package/dist/templates/next-app/public/locales/en.json +172 -207
  60. package/dist/templates/next-app/public/locales/zh.json +172 -207
  61. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  62. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  63. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  64. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  65. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  66. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  67. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  68. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  69. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  70. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  71. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  72. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  73. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  74. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  75. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  76. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  77. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  78. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  79. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  80. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  81. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  82. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  83. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  84. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  85. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  86. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  87. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  88. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  89. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  90. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  91. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  92. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  93. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  94. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  95. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  96. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  97. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  98. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  99. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  100. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  101. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  102. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  103. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  104. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  105. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  106. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  107. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  108. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  109. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  110. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  111. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  112. package/dist/templates/react-app/.prettierignore +17 -0
  113. package/dist/templates/react-app/README.en.md +71 -54
  114. package/dist/templates/react-app/README.md +35 -18
  115. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  116. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  117. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  118. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  119. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  120. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  121. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  122. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  123. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  124. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  125. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  126. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  127. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  128. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  129. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  130. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  131. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  132. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  133. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  134. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  135. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  136. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  137. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  138. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  139. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  140. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  141. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  142. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  143. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  144. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  145. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  146. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  147. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  148. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  149. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  150. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  151. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  152. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  153. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  154. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  155. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  156. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  157. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  158. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  159. package/dist/templates/react-app/config/app.router.ts +66 -69
  160. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  161. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  162. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  163. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  164. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  165. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  166. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  167. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  168. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  169. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  170. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  171. package/dist/templates/react-app/config/theme.ts +14 -4
  172. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  173. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  174. package/dist/templates/react-app/docs/en/env.md +1132 -278
  175. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  176. package/dist/templates/react-app/docs/en/index.md +733 -104
  177. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  178. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  179. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  180. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  181. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  182. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  183. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  184. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  185. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  186. package/dist/templates/react-app/docs/en/store.md +1194 -184
  187. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  188. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  189. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  190. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  191. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  192. package/dist/templates/react-app/docs/zh/index.md +717 -104
  193. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  194. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  195. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  196. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  197. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  198. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  199. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  200. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  201. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  202. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  203. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  204. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  205. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  206. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  207. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  208. package/dist/templates/react-app/eslint.config.mjs +247 -0
  209. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  210. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  211. package/dist/templates/react-app/package.json +31 -3
  212. package/dist/templates/react-app/playwright.config.ts +79 -0
  213. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  214. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  215. package/dist/templates/react-app/src/App.tsx +15 -42
  216. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  217. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  219. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  220. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  221. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  222. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  223. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  224. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  225. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  226. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  227. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  228. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  229. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  230. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  231. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  232. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  233. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  234. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  235. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  236. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  237. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  238. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  239. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  240. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  241. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  242. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  243. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  244. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  245. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  246. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  247. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  248. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  249. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  250. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  251. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  252. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  253. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  254. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  255. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  256. package/dist/templates/react-app/src/core/globals.ts +9 -9
  257. package/dist/templates/react-app/src/main.tsx +4 -4
  258. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  259. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  260. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  261. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  262. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  263. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  264. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  265. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  266. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  267. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  268. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  269. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  270. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  271. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  272. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  273. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  277. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  285. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  286. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  287. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  288. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  289. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  290. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  291. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  292. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  293. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  294. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  295. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  296. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  297. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  298. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  299. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  300. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  301. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  302. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  303. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  304. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  305. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  306. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  307. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  308. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  309. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  310. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  311. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  312. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  313. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  314. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  315. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  316. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  317. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  318. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  321. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  322. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  323. package/dist/templates/react-app/tsconfig.json +8 -1
  324. package/dist/templates/react-app/tsconfig.node.json +1 -1
  325. package/dist/templates/react-app/tsconfig.test.json +3 -1
  326. package/dist/templates/react-app/vite.config.ts +50 -34
  327. package/package.json +2 -1
  328. package/dist/configs/react-app/eslint.config.js +0 -94
  329. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  330. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  331. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  332. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  333. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  334. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  335. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  336. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  337. package/dist/templates/next-app/docs/env.md +0 -94
  338. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  339. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  340. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  341. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  342. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  343. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  344. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  345. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  346. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  349. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  350. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  351. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  352. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  353. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  354. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  355. package/dist/templates/react-app/config/i18n.ts +0 -15
  356. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  357. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  358. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  359. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  360. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  361. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { COMMON_I18N_KEY_INVALID } from '@config/Identifier';
3
+
4
+ /**
5
+ * 用于校验 i18n 键的格式
6
+ *
7
+ * 冒号分隔命名空间和键
8
+ *
9
+ * @example
10
+ * ```
11
+ * "namespace:key1"
12
+ * "namespace:key_2"
13
+ * "namespace:key_2__3"
14
+ * "namespace_1:key_2__3__4"
15
+ * ```
16
+ */
17
+ export const i18nKeySchema = z
18
+ .string()
19
+ .regex(
20
+ /^[a-zA-Z][a-zA-Z0-9_-]*:[a-zA-Z][a-zA-Z0-9_-]*$/,
21
+ COMMON_I18N_KEY_INVALID
22
+ );
23
+
24
+ export type I18nKeySchema = z.infer<typeof i18nKeySchema>;
25
+
26
+ export function splitI18nKey(source: string): {
27
+ namespace: string;
28
+ key: string;
29
+ } {
30
+ const [namespace, key] = source.split(':');
31
+ return { namespace, key };
32
+ }
33
+
34
+ export function joinI18nKey(namespace: string, ...key: string[]): string {
35
+ return `${namespace}:${key.join('__')}`;
36
+ }
@@ -1,4 +1,4 @@
1
- import * as i18nKeys from '../Identifier/page.login';
1
+ import * as i18nKeys from '../Identifier/pages/page.login';
2
2
 
3
3
  /**
4
4
  * Login page i18n interface
@@ -16,27 +16,27 @@ export const loginI18n = Object.freeze({
16
16
  keywords: i18nKeys.PAGE_LOGIN_KEYWORDS,
17
17
 
18
18
  // login page
19
- welcome: i18nKeys.LOGIN_WELCOME,
20
- subtitle: i18nKeys.LOGIN_SUBTITLE,
21
- feature_ai_paths: i18nKeys.LOGIN_FEATURE_AI_PATHS,
22
- feature_smart_recommendations: i18nKeys.LOGIN_FEATURE_SMART_RECOMMENDATIONS,
23
- feature_progress_tracking: i18nKeys.LOGIN_FEATURE_PROGRESS_TRACKING,
19
+ welcome: i18nKeys.PAGE_LOGIN_WELCOME,
20
+ subtitle: i18nKeys.PAGE_LOGIN_SUBTITLE,
21
+ feature_ai_paths: i18nKeys.PAGE_LOGIN_FEATURE_AI_PATHS,
22
+ feature_smart_recommendations: i18nKeys.PAGE_LOGIN_FEATURE_SMART,
23
+ feature_progress_tracking: i18nKeys.PAGE_LOGIN_TRACKING,
24
24
 
25
25
  // login form
26
- emailRequired: i18nKeys.LOGIN_EMAIL_REQUIRED,
27
- email: i18nKeys.LOGIN_EMAIL,
28
- emailTitle: i18nKeys.LOGIN_EMAIL_TITLE,
29
- passwordRequired: i18nKeys.LOGIN_PASSWORD_REQUIRED,
30
- password: i18nKeys.LOGIN_PASSWORD,
31
- passwordTitle: i18nKeys.LOGIN_PASSWORD_TITLE,
32
- forgotPasswordTitle: i18nKeys.LOGIN_FORGOT_PASSWORD_TITLE,
33
- forgotPassword: i18nKeys.LOGIN_FORGOT_PASSWORD,
34
- buttonTitle: i18nKeys.LOGIN_BUTTON_TITLE,
35
- button: i18nKeys.LOGIN_BUTTON,
36
- continueWith: i18nKeys.LOGIN_CONTINUE_WITH,
37
- withGoogleTitle: i18nKeys.LOGIN_WITH_GOOGLE_TITLE,
38
- withGoogle: i18nKeys.LOGIN_WITH_GOOGLE,
39
- noAccount: i18nKeys.LOGIN_NO_ACCOUNT,
40
- createAccountTitle: i18nKeys.LOGIN_CREATE_ACCOUNT_TITLE,
41
- createAccount: i18nKeys.LOGIN_CREATE_ACCOUNT
26
+ emailRequired: i18nKeys.PAGE_LOGIN_EMAIL_REQUIRED,
27
+ email: i18nKeys.PAGE_LOGIN_EMAIL,
28
+ emailTitle: i18nKeys.PAGE_LOGIN_EMAIL2,
29
+ passwordRequired: i18nKeys.PAGE_LOGIN_PASSWORD_REQUIRED,
30
+ password: i18nKeys.PAGE_LOGIN_PASSWORD,
31
+ passwordTitle: i18nKeys.PAGE_LOGIN_PASSWORD2,
32
+ forgotPasswordTitle: i18nKeys.PAGE_LOGIN_FORGOT_PASSWORD2,
33
+ forgotPassword: i18nKeys.PAGE_LOGIN_FORGOT_PASSWORD,
34
+ buttonTitle: i18nKeys.PAGE_LOGIN_BUTTON,
35
+ button: i18nKeys.PAGE_LOGIN_BUTTON,
36
+ continueWith: i18nKeys.PAGE_LOGIN_CONTINUE_WITH,
37
+ withGoogleTitle: i18nKeys.PAGE_LOGIN_WITH_GOOGLE2,
38
+ withGoogle: i18nKeys.PAGE_LOGIN_WITH_GOOGLE,
39
+ noAccount: i18nKeys.PAGE_LOGIN_NO_ACCOUNT,
40
+ createAccountTitle: i18nKeys.PAGE_LOGIN_CREATE_ACCOUNT2,
41
+ createAccount: i18nKeys.PAGE_LOGIN_CREATE_ACCOUNT
42
42
  });
@@ -1,4 +1,4 @@
1
- import * as i18nKeys from '../Identifier/page.register';
1
+ import * as i18nKeys from '../Identifier/pages/page.register';
2
2
 
3
3
  /**
4
4
  * Register page i18n interface
@@ -16,29 +16,28 @@ export const register18n = Object.freeze({
16
16
  keywords: i18nKeys.PAGE_REGISTER_KEYWORDS,
17
17
 
18
18
  // register page
19
- welcome: i18nKeys.REGISTER_WELCOME,
20
- subtitle: i18nKeys.REGISTER_SUBTITLE,
21
- feature_ai_paths: i18nKeys.REGISTER_FEATURE_AI_PATHS,
22
- feature_smart_recommendations:
23
- i18nKeys.REGISTER_FEATURE_SMART_RECOMMENDATIONS,
24
- feature_progress_tracking: i18nKeys.REGISTER_FEATURE_PROGRESS_TRACKING,
19
+ welcome: i18nKeys.PAGE_REGISTER_WELCOME,
20
+ subtitle: i18nKeys.PAGE_REGISTER_SUBTITLE,
21
+ feature_ai_paths: i18nKeys.PAGE_REGISTER_AI_PATHS,
22
+ feature_smart_recommendations: i18nKeys.PAGE_REGISTER_RECOMMENDATIONS,
23
+ feature_progress_tracking: i18nKeys.PAGE_REGISTER_TRACKING,
25
24
 
26
25
  // register form
27
- username: i18nKeys.REGISTER_USERNAME,
28
- username_required: i18nKeys.REGISTER_USERNAME_REQUIRED,
29
- email: i18nKeys.REGISTER_EMAIL,
30
- email_required: i18nKeys.REGISTER_EMAIL_REQUIRED,
31
- password: i18nKeys.REGISTER_PASSWORD,
32
- password_required: i18nKeys.REGISTER_PASSWORD_REQUIRED,
33
- confirm_password_required: i18nKeys.REGISTER_CONFIRM_PASSWORD_REQUIRED,
34
- password_mismatch: i18nKeys.REGISTER_PASSWORD_MISMATCH,
35
- button: i18nKeys.REGISTER_BUTTON,
36
- terms_prefix: i18nKeys.REGISTER_TERMS_PREFIX,
37
- terms_link: i18nKeys.REGISTER_TERMS_LINK,
38
- terms_and: i18nKeys.REGISTER_TERMS_AND,
39
- privacy_link: i18nKeys.REGISTER_PRIVACY_LINK,
40
- have_account: i18nKeys.REGISTER_HAVE_ACCOUNT,
41
- confirm_password: i18nKeys.REGISTER_CONFIRM_PASSWORD,
42
- terms_required: i18nKeys.REGISTER_TERMS_REQUIRED,
43
- login_link: i18nKeys.REGISTER_LOGIN_LINK
26
+ username: i18nKeys.PAGE_REGISTER_USERNAME,
27
+ username_required: i18nKeys.PAGE_REGISTER_USERNAME_REQUIRED,
28
+ email: i18nKeys.PAGE_REGISTER_EMAIL,
29
+ email_required: i18nKeys.PAGE_REGISTER_EMAIL_REQUIRED,
30
+ password: i18nKeys.PAGE_REGISTER_PASSWORD,
31
+ password_required: i18nKeys.PAGE_REGISTER_PASSWORD_REQUIRED,
32
+ confirm_password_required: i18nKeys.PAGE_REGISTER_CONFIRM_PASSWORD_REQUIRED,
33
+ password_mismatch: i18nKeys.PAGE_REGISTER_PASSWORD_MISMATCH,
34
+ button: i18nKeys.PAGE_REGISTER_BUTTON,
35
+ terms_prefix: i18nKeys.PAGE_REGISTER_TERMS_PREFIX,
36
+ terms_link: i18nKeys.PAGE_REGISTER_TERMS_LINK,
37
+ terms_and: i18nKeys.PAGE_REGISTER_TERMS_AND,
38
+ privacy_link: i18nKeys.PAGE_REGISTER_PRIVACY_LINK,
39
+ have_account: i18nKeys.PAGE_REGISTER_HAVE_ACCOUNT,
40
+ confirm_password: i18nKeys.PAGE_REGISTER_CONFIRM_PASSWORD,
41
+ terms_required: i18nKeys.PAGE_REGISTER_TERMS_REQUIRED,
42
+ login_link: i18nKeys.PAGE_REGISTER_LOGIN_LINK
44
43
  });
@@ -0,0 +1,387 @@
1
+ # API Development Guide
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [API Architecture Overview](#api-architecture-overview)
6
+ 2. [Client-Side API Implementation](#client-side-api-implementation)
7
+ 3. [Server-Side API Implementation](#server-side-api-implementation)
8
+ 4. [Error Handling and Validation](#error-handling-and-validation)
9
+ 5. [Best Practices and Examples](#best-practices-and-examples)
10
+
11
+ ## API Architecture Overview
12
+
13
+ ### 1. Overall Architecture
14
+
15
+ The project adopts a layered API architecture design:
16
+
17
+ ```
18
+ Client Layer Server Layer
19
+ ┌──────────────┐ ┌──────────────┐
20
+ │ API Interface│ │ API Routes │
21
+ ├──────────────┤ ├──────────────┤
22
+ │ API Services │ HTTP │ Service │
23
+ ├──────────────┤ Requests ├──────────────┤
24
+ │API Requester │ ◄──────► │ Validation │
25
+ ├──────────────┤ ├──────────────┤
26
+ │Plugin System │ │ Data Layer │
27
+ └──────────────┘ └──────────────┘
28
+ ```
29
+
30
+ ### 2. Core Components
31
+
32
+ - **Interface Definitions**: `AppApiInterface`, `AppUserApiInterface`, etc.
33
+ - **Request Clients**: `AppApiRequester`, `AdminApiRequester`
34
+ - **Service Implementations**: `AppUserApi`, `AdminUserApi`, etc.
35
+ - **Plugin System**: `AppApiPlugin`, `RequestEncryptPlugin`, etc.
36
+
37
+ ### 3. Unified Response Format
38
+
39
+ ```typescript
40
+ // Success response
41
+ interface AppApiSuccessInterface<T = unknown> {
42
+ success: true;
43
+ data?: T;
44
+ }
45
+
46
+ // Error response
47
+ interface AppApiErrorInterface {
48
+ success: false;
49
+ id: string;
50
+ message?: string;
51
+ }
52
+
53
+ // Unified response type
54
+ type AppApiResult<T = unknown> =
55
+ | AppApiSuccessInterface<T>
56
+ | AppApiErrorInterface;
57
+ ```
58
+
59
+ ## Client-Side API Implementation
60
+
61
+ ### 1. API Requester
62
+
63
+ ```typescript
64
+ @injectable()
65
+ export class AppApiRequester extends RequestTransaction<AppApiConfig> {
66
+ constructor(
67
+ @inject(FetchAbortPlugin) protected abortPlugin: FetchAbortPlugin
68
+ ) {
69
+ super(
70
+ new RequestAdapterFetch({
71
+ baseURL: '/api',
72
+ responseType: 'json'
73
+ })
74
+ );
75
+ }
76
+ }
77
+ ```
78
+
79
+ ### 2. API Service Implementation
80
+
81
+ ```typescript
82
+ @injectable()
83
+ export class AppUserApi implements AppUserApiInterface {
84
+ constructor(
85
+ @inject(AppApiRequester)
86
+ protected client: RequestTransaction<AppApiConfig>
87
+ ) {}
88
+
89
+ async login(params: UserApiLoginTransaction['data']): Promise<AppApiResult> {
90
+ const response = await this.client.request<UserApiLoginTransaction>({
91
+ url: '/user/login',
92
+ method: 'POST',
93
+ data: params,
94
+ encryptProps: 'password' // Automatically encrypt password field
95
+ });
96
+
97
+ return response.data;
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### 3. API Plugin System
103
+
104
+ ```typescript
105
+ export class AppUserApiBootstrap implements BootstrapExecutorPlugin {
106
+ onBefore({ parameters: { ioc } }: BootstrapContext): void {
107
+ const appUserApi = ioc.get<AppApiRequester>(AppApiRequester);
108
+
109
+ // Register plugins
110
+ appUserApi.usePlugin(new FetchURLPlugin());
111
+ appUserApi.usePlugin(new RequestEncryptPlugin(ioc.get(StringEncryptor)));
112
+ appUserApi.usePlugin(
113
+ new RequestCommonPlugin({
114
+ requestDataSerializer: this.requestDataSerializer.bind(this)
115
+ })
116
+ );
117
+ appUserApi.usePlugin(new AppApiPlugin(ioc.get(I.Logger)));
118
+ appUserApi.usePlugin(ioc.get(DialogErrorPlugin));
119
+ }
120
+ }
121
+ ```
122
+
123
+ ## Server-Side API Implementation
124
+
125
+ ### 1. API Route Handling
126
+
127
+ ```typescript
128
+ // app/api/admin/users/route.ts
129
+ export async function GET(req: NextRequest) {
130
+ const server = new BootstrapServer();
131
+
132
+ const result = await server
133
+ .use(new AdminAuthPlugin()) // Use authentication plugin
134
+ .execNoError(async ({ parameters: { IOC } }) => {
135
+ // 1. Parameter validation
136
+ const searchParams = Object.fromEntries(
137
+ req.nextUrl.searchParams.entries()
138
+ );
139
+ const paginationParams = IOC(PaginationValidator).getThrow(searchParams);
140
+
141
+ // 2. Call service
142
+ const apiUserService = IOC(ApiUserService);
143
+ const result = await apiUserService.getUsers({
144
+ page: paginationParams.page,
145
+ pageSize: paginationParams.pageSize
146
+ });
147
+
148
+ return result;
149
+ });
150
+
151
+ // 3. Error handling
152
+ if (result instanceof ExecutorError) {
153
+ return NextResponse.json(new AppErrorApi(result.id, result.message), {
154
+ status: 400
155
+ });
156
+ }
157
+
158
+ // 4. Success response
159
+ return NextResponse.json(new AppSuccessApi(result));
160
+ }
161
+ ```
162
+
163
+ ### 2. Service Layer Implementation
164
+
165
+ ```typescript
166
+ @injectable()
167
+ export class ApiUserService {
168
+ constructor(
169
+ @inject(IOCIdentifier.UserRepository)
170
+ private userRepository: UserRepositoryInterface
171
+ ) {}
172
+
173
+ async getUsers(params: PaginationInterface): Promise<PaginationResult<User>> {
174
+ return this.userRepository.findUsers(params);
175
+ }
176
+ }
177
+ ```
178
+
179
+ ### 3. Authentication and Middleware
180
+
181
+ ```typescript
182
+ export class AdminAuthPlugin implements BootstrapExecutorPlugin {
183
+ async onBefore(context: BootstrapContext): Promise<void> {
184
+ const { IOC } = context.parameters;
185
+ const serverAuth = IOC(ServerAuth);
186
+
187
+ // Verify admin permissions
188
+ await serverAuth.verifyAdmin();
189
+ }
190
+ }
191
+ ```
192
+
193
+ ## Error Handling and Validation
194
+
195
+ ### 1. Error Response
196
+
197
+ ```typescript
198
+ export class AppErrorApi implements AppApiErrorInterface {
199
+ success = false as const;
200
+
201
+ constructor(
202
+ public id: string,
203
+ public message?: string
204
+ ) {}
205
+ }
206
+
207
+ export class AppSuccessApi<T = unknown> implements AppApiSuccessInterface<T> {
208
+ success = true as const;
209
+
210
+ constructor(public data?: T) {}
211
+ }
212
+ ```
213
+
214
+ ### 2. Parameter Validation
215
+
216
+ ```typescript
217
+ @injectable()
218
+ export class PaginationValidator implements ValidatorInterface {
219
+ validate(data: unknown): ValidationResult {
220
+ // Implement validation logic
221
+ const errors: ValidationError[] = [];
222
+
223
+ if (!this.isValidPageNumber(data.page)) {
224
+ errors.push({ field: 'page', message: 'Invalid page number' });
225
+ }
226
+
227
+ return {
228
+ valid: errors.length === 0,
229
+ errors
230
+ };
231
+ }
232
+
233
+ getThrow(data: unknown): PaginationInterface {
234
+ const result = this.validate(data);
235
+ if (!result.valid) {
236
+ throw new ValidationError(result.errors);
237
+ }
238
+ return data as PaginationInterface;
239
+ }
240
+ }
241
+ ```
242
+
243
+ ## Best Practices and Examples
244
+
245
+ ### 1. API Interface Definition
246
+
247
+ ```typescript
248
+ // 1. Define interface
249
+ interface UserApiInterface {
250
+ login(params: LoginParams): Promise<AppApiResult<LoginResult>>;
251
+ logout(): Promise<AppApiResult<void>>;
252
+ }
253
+
254
+ // 2. Implement interface
255
+ @injectable()
256
+ class UserApi implements UserApiInterface {
257
+ constructor(
258
+ @inject(AppApiRequester)
259
+ private client: AppApiRequester
260
+ ) {}
261
+
262
+ async login(params: LoginParams): Promise<AppApiResult<LoginResult>> {
263
+ // Implement login logic
264
+ }
265
+
266
+ async logout(): Promise<AppApiResult<void>> {
267
+ // Implement logout logic
268
+ }
269
+ }
270
+ ```
271
+
272
+ ### 2. Error Handling Best Practices
273
+
274
+ ```typescript
275
+ // 1. Use unified error handling
276
+ try {
277
+ const result = await userApi.login(params);
278
+ if (!result.success) {
279
+ // Handle business error
280
+ handleBusinessError(result);
281
+ return;
282
+ }
283
+ // Handle success response
284
+ handleSuccess(result.data);
285
+ } catch (error) {
286
+ // Handle network errors etc.
287
+ handleNetworkError(error);
288
+ }
289
+
290
+ // 2. Use error plugin
291
+ class DialogErrorPlugin implements ExecutorPlugin {
292
+ onError(error: Error, context: ExecutorContext): void {
293
+ // Show error dialog
294
+ this.dialogHandler.showError({
295
+ title: 'Error',
296
+ content: error.message
297
+ });
298
+ }
299
+ }
300
+ ```
301
+
302
+ ### 3. API Testing Example
303
+
304
+ ```typescript
305
+ describe('UserApi', () => {
306
+ let userApi: UserApi;
307
+ let mockClient: jest.Mocked<AppApiRequester>;
308
+
309
+ beforeEach(() => {
310
+ mockClient = {
311
+ request: jest.fn()
312
+ } as any;
313
+ userApi = new UserApi(mockClient);
314
+ });
315
+
316
+ it('should handle login success', async () => {
317
+ const mockResponse = {
318
+ success: true,
319
+ data: { token: 'test-token' }
320
+ };
321
+ mockClient.request.mockResolvedValue({ data: mockResponse });
322
+
323
+ const result = await userApi.login({
324
+ email: 'test@example.com',
325
+ password: 'password'
326
+ });
327
+
328
+ expect(result).toEqual(mockResponse);
329
+ expect(mockClient.request).toHaveBeenCalledWith({
330
+ url: '/user/login',
331
+ method: 'POST',
332
+ data: {
333
+ email: 'test@example.com',
334
+ password: 'password'
335
+ },
336
+ encryptProps: 'password'
337
+ });
338
+ });
339
+ });
340
+ ```
341
+
342
+ ### 4. API Documentation Generation
343
+
344
+ Use TypeScript types and comments to generate API documentation:
345
+
346
+ ```typescript
347
+ /**
348
+ * User login API
349
+ * @param params - Login parameters
350
+ * @param params.email - User email
351
+ * @param params.password - User password (will be automatically encrypted)
352
+ * @returns Login result containing user token
353
+ * @throws {ValidationError} When parameter validation fails
354
+ * @throws {AuthError} When authentication fails
355
+ */
356
+ async login(params: LoginParams): Promise<AppApiResult<LoginResult>>;
357
+ ```
358
+
359
+ ## Summary
360
+
361
+ The project's API design follows these principles:
362
+
363
+ 1. **Layered Architecture**:
364
+ - Clear interface definitions
365
+ - Service layer implements business logic
366
+ - Unified request handling
367
+ - Plugin-based feature extension
368
+
369
+ 2. **Type Safety**:
370
+ - Complete TypeScript type definitions
371
+ - Runtime parameter validation
372
+ - Compile-time type checking
373
+
374
+ 3. **Error Handling**:
375
+ - Unified error response format
376
+ - Plugin-based error handling
377
+ - Complete error tracking
378
+
379
+ 4. **Extensibility**:
380
+ - Plugin system supports feature extension
381
+ - Dependency injection achieves loose coupling
382
+ - Middleware supports cross-cutting concerns
383
+
384
+ 5. **Security**:
385
+ - Automatic parameter encryption
386
+ - Unified authentication mechanism
387
+ - Parameter validation and sanitization