@qlover/create-app 0.7.15 → 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 (340) hide show
  1. package/CHANGELOG.md +4 -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 +0 -1
  9. package/dist/templates/next-app/README.md +0 -1
  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/index.md +0 -1
  32. package/dist/templates/next-app/docs/en/project-structure.md +0 -1
  33. package/dist/templates/next-app/docs/zh/index.md +0 -1
  34. package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
  35. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  36. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  37. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  38. package/dist/templates/next-app/package.json +7 -3
  39. package/dist/templates/next-app/public/locales/en.json +172 -207
  40. package/dist/templates/next-app/public/locales/zh.json +172 -207
  41. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  42. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  43. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  44. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  45. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  46. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  47. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  48. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  49. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  50. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  51. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  52. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  53. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  54. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  55. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  56. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  57. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  58. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  59. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  60. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  61. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  62. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  63. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  64. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  65. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  66. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  67. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  68. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  69. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  70. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  71. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  72. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  73. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  74. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  75. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  76. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  77. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  78. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  79. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  80. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  81. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  82. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  83. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  84. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  85. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  86. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  87. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  88. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  89. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  90. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  91. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  92. package/dist/templates/react-app/.prettierignore +17 -0
  93. package/dist/templates/react-app/README.en.md +71 -54
  94. package/dist/templates/react-app/README.md +35 -18
  95. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  96. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  97. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  98. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  99. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  100. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  101. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  102. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  103. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  104. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  105. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  106. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  107. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  108. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  109. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  110. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  111. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  112. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  113. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  114. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  115. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  116. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  117. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  118. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  119. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  120. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  121. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  122. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  123. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  124. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  125. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  126. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  127. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  128. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  129. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  130. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  131. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  132. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  133. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  134. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  135. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  136. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  137. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  138. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  139. package/dist/templates/react-app/config/app.router.ts +66 -69
  140. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  141. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  142. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  143. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  144. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  145. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  146. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  147. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  148. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  149. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  150. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  151. package/dist/templates/react-app/config/theme.ts +14 -4
  152. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  153. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  154. package/dist/templates/react-app/docs/en/env.md +1132 -278
  155. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  156. package/dist/templates/react-app/docs/en/index.md +733 -104
  157. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  158. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  159. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  160. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  161. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  162. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  163. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  164. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  165. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  166. package/dist/templates/react-app/docs/en/store.md +1194 -184
  167. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  168. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  169. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  170. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  171. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  172. package/dist/templates/react-app/docs/zh/index.md +717 -104
  173. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  174. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  175. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  176. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  177. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  178. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  179. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  180. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  181. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  182. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  183. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  184. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  185. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  186. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  187. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  188. package/dist/templates/react-app/eslint.config.mjs +247 -0
  189. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  190. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  191. package/dist/templates/react-app/package.json +31 -3
  192. package/dist/templates/react-app/playwright.config.ts +79 -0
  193. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  194. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  195. package/dist/templates/react-app/src/App.tsx +15 -42
  196. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  197. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  198. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  199. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  200. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  201. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  202. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  203. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  204. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  205. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  206. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  207. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  208. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  209. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  210. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  211. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  212. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  213. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  214. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  215. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  216. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  217. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  218. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  219. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  220. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  221. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  222. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  223. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  224. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  225. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  226. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  227. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  228. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  229. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  230. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  231. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  232. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  233. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  234. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  235. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  236. package/dist/templates/react-app/src/core/globals.ts +9 -9
  237. package/dist/templates/react-app/src/main.tsx +4 -4
  238. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  239. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  240. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  241. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  242. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  243. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  244. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  245. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  246. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  247. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  248. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  249. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  250. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  251. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  252. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  253. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  254. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  255. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  256. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  257. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  258. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  259. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  260. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  261. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  262. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  263. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  264. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  265. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  266. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  267. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  268. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  269. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  270. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  271. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  272. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  273. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  274. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  275. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  276. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  277. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  278. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  279. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  280. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  281. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  282. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  283. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  284. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  285. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  286. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  287. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  288. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  289. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  290. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  291. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  292. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  293. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  294. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  295. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  296. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  297. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  298. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  299. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  300. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  301. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  302. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  303. package/dist/templates/react-app/tsconfig.json +8 -1
  304. package/dist/templates/react-app/tsconfig.node.json +1 -1
  305. package/dist/templates/react-app/tsconfig.test.json +3 -1
  306. package/dist/templates/react-app/vite.config.ts +50 -34
  307. package/package.json +2 -1
  308. package/dist/configs/react-app/eslint.config.js +0 -94
  309. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  310. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  311. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  312. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  313. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  314. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  315. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  316. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  317. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  318. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  319. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  320. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  321. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  322. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  323. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  324. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  325. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  326. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  327. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  328. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  329. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  330. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  331. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  332. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  333. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  334. package/dist/templates/react-app/config/i18n.ts +0 -15
  335. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  336. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  337. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  338. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  339. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  340. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,565 @@
1
+ # Playwright E2E 测试详细指南
2
+
3
+ 本指南包含了完整的 E2E 测试文档,包括测试架构、编写测试、调试技巧和最佳实践。
4
+
5
+ ## 📑 目录
6
+
7
+ 1. [测试架构](#测试架构)
8
+ 2. [编写测试](#编写测试)
9
+ 3. [Page Object Model](#page-object-model)
10
+ 4. [调试测试](#调试测试)
11
+ 5. [最佳实践](#最佳实践)
12
+ 6. [CI/CD 集成](#cicd-集成)
13
+ 7. [常见问题](#常见问题)
14
+
15
+ ## 测试架构
16
+
17
+ ### 目录结构
18
+
19
+ ```
20
+ e2e/
21
+ ├── fixtures/ # 自定义测试固件
22
+ ├── pages/ # Page Object Models
23
+ ├── tests/ # 测试规范
24
+ └── utils/ # 测试辅助工具
25
+ ```
26
+
27
+ ### 测试分类
28
+
29
+ #### 1. 功能测试
30
+
31
+ - **home.spec.ts**: 首页功能测试
32
+ - **navigation.spec.ts**: 导航和路由测试
33
+ - **auth.spec.ts**: 认证流程测试
34
+
35
+ #### 2. 质量测试
36
+
37
+ - **i18n.spec.ts**: 国际化和本地化测试
38
+ - **accessibility.spec.ts**: 可访问性测试
39
+ - **performance.spec.ts**: 性能和优化测试
40
+
41
+ ## 编写测试
42
+
43
+ ### 基础测试结构
44
+
45
+ ```typescript
46
+ import { test, expect } from '@playwright/test';
47
+
48
+ test.describe('功能名称', () => {
49
+ test.beforeEach(async ({ page }) => {
50
+ // 每个测试前的设置
51
+ await page.goto('/');
52
+ });
53
+
54
+ test('测试用例描述', async ({ page }) => {
55
+ // 测试步骤
56
+ await page.click('button');
57
+
58
+ // 断言
59
+ await expect(page.locator('.result')).toBeVisible();
60
+ });
61
+ });
62
+ ```
63
+
64
+ ### 使用自定义 Fixture
65
+
66
+ ```typescript
67
+ import { test, expect } from '../fixtures/base.fixture';
68
+
69
+ test('使用自定义 fixture', async ({ page }) => {
70
+ // 可以在这里使用扩展的 fixtures
71
+ });
72
+ ```
73
+
74
+ ### 选择器最佳实践
75
+
76
+ #### 推荐的选择器(按优先级)
77
+
78
+ 1. **角色选择器** - 最接近用户体验
79
+
80
+ ```typescript
81
+ await page.getByRole('button', { name: '提交' });
82
+ await page.getByRole('link', { name: '首页' });
83
+ await page.getByRole('textbox', { name: '用户名' });
84
+ ```
85
+
86
+ 2. **标签选择器** - 适用于表单元素
87
+
88
+ ```typescript
89
+ await page.getByLabel('电子邮件');
90
+ await page.getByLabel('密码');
91
+ ```
92
+
93
+ 3. **占位符选择器**
94
+
95
+ ```typescript
96
+ await page.getByPlaceholder('输入您的邮箱');
97
+ ```
98
+
99
+ 4. **文本选择器**
100
+
101
+ ```typescript
102
+ await page.getByText('欢迎回来');
103
+ ```
104
+
105
+ 5. **测试ID选择器** - 最稳定
106
+
107
+ ```typescript
108
+ await page.getByTestId('submit-button');
109
+ ```
110
+
111
+ #### 避免使用的选择器
112
+
113
+ ```typescript
114
+ // ❌ CSS 类名 - 容易变化
115
+ await page.locator('.btn-primary');
116
+
117
+ // ❌ CSS ID - 可能不唯一
118
+ await page.locator('#submit');
119
+
120
+ // ❌ XPath - 难以维护
121
+ await page.locator('//div[@class="container"]/button[1]');
122
+ ```
123
+
124
+ ## Page Object Model
125
+
126
+ ### 创建 Page Object
127
+
128
+ ```typescript
129
+ import { Page, Locator } from '@playwright/test';
130
+ import { BasePage } from './BasePage';
131
+
132
+ export class MyPage extends BasePage {
133
+ readonly heading: Locator;
134
+ readonly submitButton: Locator;
135
+
136
+ constructor(page: Page) {
137
+ super(page);
138
+ this.heading = page.locator('h1');
139
+ this.submitButton = page.getByRole('button', { name: '提交' });
140
+ }
141
+
142
+ async navigate() {
143
+ await this.goto('/my-page', 'zh');
144
+ await this.waitForReady();
145
+ }
146
+
147
+ async submit() {
148
+ await this.submitButton.click();
149
+ await this.page.waitForLoadState('networkidle');
150
+ }
151
+ }
152
+ ```
153
+
154
+ ### 使用 Page Object
155
+
156
+ ```typescript
157
+ import { test, expect } from '../fixtures/base.fixture';
158
+ import { MyPage } from '../pages/MyPage';
159
+
160
+ test('使用 Page Object', async ({ page }) => {
161
+ const myPage = new MyPage(page);
162
+ await myPage.navigate();
163
+ await myPage.submit();
164
+ await expect(myPage.heading).toContainText('成功');
165
+ });
166
+ ```
167
+
168
+ ## 调试测试
169
+
170
+ ### 1. UI 模式 (推荐)
171
+
172
+ 最强大的调试工具:
173
+
174
+ ```bash
175
+ npm run test:e2e:ui
176
+ ```
177
+
178
+ 功能:
179
+
180
+ - 时间旅行调试
181
+ - 查看每个步骤的 DOM 快照
182
+ - 网络请求日志
183
+ - 测试代码高亮
184
+ - 实时编辑选择器
185
+
186
+ ### 2. 调试模式
187
+
188
+ 逐步执行测试:
189
+
190
+ ```bash
191
+ npm run test:e2e:debug
192
+ ```
193
+
194
+ 在代码中添加断点:
195
+
196
+ ```typescript
197
+ test('调试示例', async ({ page }) => {
198
+ await page.goto('/');
199
+ await page.pause(); // 暂停执行
200
+ // ... 其他代码
201
+ });
202
+ ```
203
+
204
+ ### 3. Trace Viewer
205
+
206
+ 查看失败测试的 trace:
207
+
208
+ ```bash
209
+ npx playwright show-trace test-results/path/to/trace.zip
210
+ ```
211
+
212
+ ### 4. 截图和视频
213
+
214
+ 自动捕获(已配置):
215
+
216
+ - 失败时自动截图
217
+ - 失败时保留视频
218
+ - 重试时记录 trace
219
+
220
+ 手动截图:
221
+
222
+ ```typescript
223
+ await page.screenshot({ path: 'screenshot.png' });
224
+ await page.screenshot({ path: 'full-page.png', fullPage: true });
225
+ ```
226
+
227
+ ### 5. 控制台日志
228
+
229
+ 查看浏览器控制台:
230
+
231
+ ```typescript
232
+ page.on('console', (msg) => console.log(msg.text()));
233
+ page.on('pageerror', (err) => console.log(err.message));
234
+ ```
235
+
236
+ ## 最佳实践
237
+
238
+ ### 1. 等待策略
239
+
240
+ #### ✅ 使用自动等待
241
+
242
+ ```typescript
243
+ // Playwright 自动等待元素可见和可操作
244
+ await page.click('button');
245
+ await expect(page.locator('.result')).toBeVisible();
246
+ ```
247
+
248
+ #### ❌ 避免固定延迟
249
+
250
+ ```typescript
251
+ // 不推荐
252
+ await page.waitForTimeout(3000);
253
+
254
+ // 推荐
255
+ await page.waitForLoadState('networkidle');
256
+ await page.waitForSelector('.loaded');
257
+ ```
258
+
259
+ ### 2. 测试隔离
260
+
261
+ 每个测试应该独立:
262
+
263
+ ```typescript
264
+ test.describe('测试组', () => {
265
+ test.beforeEach(async ({ page }) => {
266
+ // 重置状态
267
+ await page.goto('/');
268
+ // 清除存储
269
+ await page.context().clearCookies();
270
+ });
271
+
272
+ test('测试 1', async ({ page }) => {
273
+ // 不依赖其他测试
274
+ });
275
+
276
+ test('测试 2', async ({ page }) => {
277
+ // 独立运行
278
+ });
279
+ });
280
+ ```
281
+
282
+ ### 3. 断言最佳实践
283
+
284
+ ```typescript
285
+ // ✅ 使用 web-first 断言(自动重试)
286
+ await expect(page.locator('.status')).toHaveText('成功');
287
+ await expect(page).toHaveURL(/dashboard/);
288
+
289
+ // ❌ 避免非重试断言
290
+ const text = await page.locator('.status').textContent();
291
+ expect(text).toBe('成功'); // 不会重试
292
+ ```
293
+
294
+ ### 4. 测试数据管理
295
+
296
+ ```typescript
297
+ // 使用常量
298
+ const TEST_USER = {
299
+ username: 'testuser',
300
+ password: 'password123'
301
+ };
302
+
303
+ // 使用工具函数生成测试数据
304
+ import { generateTestUser } from '../utils/test-data';
305
+
306
+ test('注册测试', async ({ page }) => {
307
+ const user = generateTestUser();
308
+ // 使用生成的数据
309
+ });
310
+ ```
311
+
312
+ ### 5. 处理异步操作
313
+
314
+ ```typescript
315
+ // 等待网络请求
316
+ await Promise.all([
317
+ page.waitForResponse((resp) => resp.url().includes('/api/data')),
318
+ page.click('button')
319
+ ]);
320
+
321
+ // 等待导航
322
+ await Promise.all([
323
+ page.waitForNavigation(),
324
+ page.click('a[href="/next-page"]')
325
+ ]);
326
+ ```
327
+
328
+ ## CI/CD 集成
329
+
330
+ ### GitHub Actions 配置
331
+
332
+ 已包含的 `.github/workflows/playwright.yml` 提供:
333
+
334
+ - 多浏览器矩阵测试
335
+ - 自动安装依赖
336
+ - 并行执行
337
+ - 测试报告上传
338
+ - 失败时的调试信息
339
+
340
+ ### 环境变量
341
+
342
+ ```bash
343
+ # 设置基础 URL
344
+ PLAYWRIGHT_BASE_URL=http://localhost:3000 npm run test:e2e
345
+
346
+ # CI 模式
347
+ CI=true npm run test:e2e
348
+ ```
349
+
350
+ ### 配置 CI 优化
351
+
352
+ 在 `playwright.config.ts` 中:
353
+
354
+ ```typescript
355
+ export default defineConfig({
356
+ // CI 模式下重试失败的测试
357
+ retries: process.env.CI ? 2 : 0,
358
+
359
+ // CI 模式下禁用并行
360
+ workers: process.env.CI ? 1 : undefined,
361
+
362
+ // CI 模式下必须通过所有测试
363
+ forbidOnly: !!process.env.CI
364
+ });
365
+ ```
366
+
367
+ ## 常见问题
368
+
369
+ ### Q: 测试超时怎么办?
370
+
371
+ **A:** 增加超时时间或检查原因:
372
+
373
+ ```typescript
374
+ // 全局增加超时
375
+ test.setTimeout(60000);
376
+
377
+ // 单个测试增加
378
+ test('慢速测试', async ({ page }) => {
379
+ test.setTimeout(120000);
380
+ // ...
381
+ });
382
+
383
+ // 检查是否是网络问题
384
+ await page.goto('/', { waitUntil: 'networkidle' });
385
+ ```
386
+
387
+ ### Q: 元素找不到?
388
+
389
+ **A:** 使用调试工具:
390
+
391
+ ```bash
392
+ # 使用 UI 模式查看
393
+ npm run test:e2e:ui
394
+
395
+ # 使用选择器生成器
396
+ npx playwright codegen http://localhost:3200
397
+ ```
398
+
399
+ ### Q: 测试不稳定(flaky)?
400
+
401
+ **A:** 常见原因和解决方案:
402
+
403
+ 1. **时序问题**
404
+
405
+ ```typescript
406
+ // 等待元素稳定
407
+ await expect(page.locator('.element')).toBeVisible();
408
+ await expect(page.locator('.element')).toHaveText('expected');
409
+ ```
410
+
411
+ 2. **动画和过渡**
412
+
413
+ ```typescript
414
+ // 等待动画完成
415
+ await page.waitForLoadState('networkidle');
416
+ ```
417
+
418
+ 3. **竞态条件**
419
+
420
+ ```typescript
421
+ // 使用 Promise.all 等待多个操作
422
+ await Promise.all([page.waitForResponse('/api/data'), page.click('button')]);
423
+ ```
424
+
425
+ ### Q: 如何处理弹窗和对话框?
426
+
427
+ **A:** 监听和处理:
428
+
429
+ ```typescript
430
+ // 处理 alert
431
+ page.on('dialog', (dialog) => dialog.accept());
432
+
433
+ // 处理确认框
434
+ page.on('dialog', async (dialog) => {
435
+ console.log(dialog.message());
436
+ await dialog.accept();
437
+ });
438
+
439
+ // 新窗口
440
+ const [newPage] = await Promise.all([
441
+ context.waitForEvent('page'),
442
+ page.click('a[target="_blank"]')
443
+ ]);
444
+ ```
445
+
446
+ ### Q: 如何测试文件上传?
447
+
448
+ **A:** 使用 setInputFiles:
449
+
450
+ ```typescript
451
+ await page.setInputFiles('input[type="file"]', 'path/to/file.pdf');
452
+
453
+ // 多文件
454
+ await page.setInputFiles('input[type="file"]', ['file1.pdf', 'file2.pdf']);
455
+ ```
456
+
457
+ ### Q: 如何测试拖放?
458
+
459
+ **A:** 使用 dragTo:
460
+
461
+ ```typescript
462
+ await page.locator('.draggable').dragTo(page.locator('.drop-zone'));
463
+ ```
464
+
465
+ ## 进阶主题
466
+
467
+ ### 测试钩子和配置
468
+
469
+ ```typescript
470
+ // 全局设置
471
+ test.beforeAll(async () => {
472
+ // 所有测试前运行一次
473
+ });
474
+
475
+ test.afterAll(async () => {
476
+ // 所有测试后运行一次
477
+ });
478
+
479
+ test.beforeEach(async ({ page }) => {
480
+ // 每个测试前运行
481
+ });
482
+
483
+ test.afterEach(async ({ page }) => {
484
+ // 每个测试后运行
485
+ });
486
+ ```
487
+
488
+ ### 自定义 Fixtures
489
+
490
+ 在 `e2e/fixtures/base.fixture.ts` 中添加:
491
+
492
+ ```typescript
493
+ export const test = base.extend({
494
+ authenticatedPage: async ({ page }, use) => {
495
+ // 执行登录
496
+ await page.goto('/login');
497
+ await page.fill('[name="username"]', 'user');
498
+ await page.fill('[name="password"]', 'pass');
499
+ await page.click('button[type="submit"]');
500
+ await page.waitForURL('/dashboard');
501
+
502
+ // 提供给测试使用
503
+ await use(page);
504
+
505
+ // 清理(可选)
506
+ await page.close();
507
+ }
508
+ });
509
+ ```
510
+
511
+ 使用自定义 fixture:
512
+
513
+ ```typescript
514
+ test('需要认证的测试', async ({ authenticatedPage }) => {
515
+ // authenticatedPage 已经登录
516
+ await expect(authenticatedPage).toHaveURL('/dashboard');
517
+ });
518
+ ```
519
+
520
+ ### 测试标记和过滤
521
+
522
+ ```typescript
523
+ // 标记测试
524
+ test('快速测试', { tag: '@fast' }, async ({ page }) => {
525
+ // ...
526
+ });
527
+
528
+ test('慢速测试', { tag: '@slow' }, async ({ page }) => {
529
+ // ...
530
+ });
531
+ ```
532
+
533
+ 运行特定标记:
534
+
535
+ ```bash
536
+ npx playwright test --grep @fast
537
+ npx playwright test --grep-invert @slow
538
+ ```
539
+
540
+ ## 资源和链接
541
+
542
+ ### 项目文档
543
+
544
+ - [快速入门](./quickstart.md)
545
+ - [设置完成](./setup-complete.md)
546
+ - [安装摘要](./installation-summary.md)
547
+ - [E2E README](../../e2e/README.md)
548
+
549
+ ### 官方资源
550
+
551
+ - [Playwright 文档](https://playwright.dev/)
552
+ - [API 参考](https://playwright.dev/docs/api/class-playwright)
553
+ - [最佳实践](https://playwright.dev/docs/best-practices)
554
+ - [选择器指南](https://playwright.dev/docs/selectors)
555
+ - [调试指南](https://playwright.dev/docs/debug)
556
+
557
+ ### 社区资源
558
+
559
+ - [Playwright GitHub](https://github.com/microsoft/playwright)
560
+ - [Discord 社区](https://discord.gg/playwright)
561
+ - [Stack Overflow](https://stackoverflow.com/questions/tagged/playwright)
562
+
563
+ ---
564
+
565
+ 编写测试愉快!如有问题,请参考相关文档或访问 Playwright 官方文档。