@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.
- package/CHANGELOG.md +4 -0
- package/dist/configs/_common/.gitignore.template +6 -0
- package/dist/configs/_common/.prettierignore +17 -5
- package/dist/configs/_common/.vscode/settings.json +6 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/templates/next-app/.env.template +1 -1
- package/dist/templates/next-app/README.en.md +0 -1
- package/dist/templates/next-app/README.md +0 -1
- package/dist/templates/next-app/config/Identifier/api.ts +5 -5
- package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
- package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
- package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
- package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
- package/dist/templates/next-app/config/Identifier/index.ts +2 -12
- package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
- package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
- package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
- package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
- package/dist/templates/next-app/config/adminNavs.ts +19 -0
- package/dist/templates/next-app/config/common.ts +22 -13
- package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
- package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
- package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
- package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
- package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
- package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
- package/dist/templates/next-app/docs/en/index.md +0 -1
- package/dist/templates/next-app/docs/en/project-structure.md +0 -1
- package/dist/templates/next-app/docs/zh/index.md +0 -1
- package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
- package/dist/templates/next-app/make/generateLocales.ts +19 -12
- package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
- package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
- package/dist/templates/next-app/package.json +7 -3
- package/dist/templates/next-app/public/locales/en.json +172 -207
- package/dist/templates/next-app/public/locales/zh.json +172 -207
- package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
- package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
- package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
- package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
- package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
- package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
- package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
- package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
- package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
- package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
- package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
- package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
- package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
- package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
- package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
- package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
- package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
- package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
- package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
- package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
- package/dist/templates/next-app/src/i18n/request.ts +30 -1
- package/dist/templates/next-app/src/server/PageParams.ts +2 -10
- package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
- package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
- package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
- package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
- package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
- package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
- package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
- package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
- package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
- package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
- package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
- package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
- package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
- package/dist/templates/react-app/.prettierignore +17 -0
- package/dist/templates/react-app/README.en.md +71 -54
- package/dist/templates/react-app/README.md +35 -18
- package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
- package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
- package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
- package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
- package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
- package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
- package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
- package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
- package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
- package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
- package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
- package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
- package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
- package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
- package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
- package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
- package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
- package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
- package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
- package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
- package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
- package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
- package/dist/templates/react-app/config/Identifier/index.ts +1 -9
- package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
- package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
- package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
- package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
- package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
- package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
- package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
- package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
- package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
- package/dist/templates/react-app/config/app.router.ts +66 -69
- package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
- package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
- package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
- package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
- package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
- package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
- package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
- package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
- package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
- package/dist/templates/react-app/config/theme.ts +14 -4
- package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/en/env.md +1132 -278
- package/dist/templates/react-app/docs/en/i18n.md +858 -147
- package/dist/templates/react-app/docs/en/index.md +733 -104
- package/dist/templates/react-app/docs/en/ioc.md +1228 -287
- package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/en/store.md +1194 -184
- package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
- package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/zh/env.md +1132 -275
- package/dist/templates/react-app/docs/zh/i18n.md +858 -147
- package/dist/templates/react-app/docs/zh/index.md +717 -104
- package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
- package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/zh/store.md +1192 -184
- package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
- package/dist/templates/react-app/e2e/App.spec.ts +319 -0
- package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
- package/dist/templates/react-app/e2e/main.spec.ts +20 -0
- package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
- package/dist/templates/react-app/eslint.config.mjs +247 -0
- package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
- package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
- package/dist/templates/react-app/package.json +31 -3
- package/dist/templates/react-app/playwright.config.ts +79 -0
- package/dist/templates/react-app/public/locales/en/common.json +190 -179
- package/dist/templates/react-app/public/locales/zh/common.json +190 -179
- package/dist/templates/react-app/src/App.tsx +15 -42
- package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
- package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
- package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
- package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
- package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
- package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
- package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
- package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
- package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
- package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
- package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
- package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
- package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
- package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
- package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
- package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
- package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
- package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
- package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
- package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
- package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
- package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
- package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
- package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
- package/dist/templates/react-app/src/base/types/Page.ts +14 -2
- package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
- package/dist/templates/react-app/src/core/IOC.ts +5 -46
- package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
- package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
- package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
- package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
- package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
- package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
- package/dist/templates/react-app/src/core/globals.ts +9 -9
- package/dist/templates/react-app/src/main.tsx +4 -4
- package/dist/templates/react-app/src/pages/404.tsx +6 -3
- package/dist/templates/react-app/src/pages/500.tsx +5 -2
- package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
- package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
- package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
- package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
- package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
- package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
- package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
- package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
- package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
- package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
- package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
- package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
- package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
- package/dist/templates/react-app/src/styles/css/page.css +4 -3
- package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
- package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
- package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
- package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
- package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
- package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
- package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
- package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
- package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
- package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
- package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
- package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
- package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
- package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
- package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
- package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
- package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
- package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
- package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
- package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
- package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
- package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
- package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
- package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
- package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
- package/dist/templates/react-app/tsconfig.e2e.json +21 -0
- package/dist/templates/react-app/tsconfig.json +8 -1
- package/dist/templates/react-app/tsconfig.node.json +1 -1
- package/dist/templates/react-app/tsconfig.test.json +3 -1
- package/dist/templates/react-app/vite.config.ts +50 -34
- package/package.json +2 -1
- package/dist/configs/react-app/eslint.config.js +0 -94
- package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
- package/dist/templates/next-app/config/Identifier/common.ts +0 -69
- package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
- package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
- package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
- package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
- package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
- package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
- package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
- package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
- package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
- package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
- package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
- package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
- package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
- package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
- package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
- package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
- package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
- package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
- package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
- package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/react-app/config/i18n.ts +0 -15
- package/dist/templates/react-app/docs/en/project-structure.md +0 -434
- package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
- package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
- package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
# E2E Testing with Playwright
|
|
2
|
+
|
|
3
|
+
This directory contains end-to-end (E2E) tests for the React application using [Playwright](https://playwright.dev/).
|
|
4
|
+
|
|
5
|
+
## 📁 Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
e2e/
|
|
9
|
+
├── fixtures/ # Custom test fixtures
|
|
10
|
+
│ └── base.fixture.ts
|
|
11
|
+
├── pages/ # Page Object Models
|
|
12
|
+
│ ├── BasePage.ts
|
|
13
|
+
│ ├── HomePage.ts
|
|
14
|
+
│ └── LoginPage.ts
|
|
15
|
+
├── tests/ # Test files
|
|
16
|
+
│ ├── home.spec.ts
|
|
17
|
+
│ ├── navigation.spec.ts
|
|
18
|
+
│ ├── auth.spec.ts
|
|
19
|
+
│ ├── i18n.spec.ts
|
|
20
|
+
│ ├── accessibility.spec.ts
|
|
21
|
+
│ └── performance.spec.ts
|
|
22
|
+
└── utils/ # Test utilities
|
|
23
|
+
└── test-helpers.ts
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 🚀 Getting Started
|
|
27
|
+
|
|
28
|
+
### Installation
|
|
29
|
+
|
|
30
|
+
First, install Playwright and its dependencies:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Install Playwright
|
|
34
|
+
npm install -D @playwright/test playwright
|
|
35
|
+
|
|
36
|
+
# Install browsers (this may take a few minutes)
|
|
37
|
+
npx playwright install
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Running Tests
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Run all E2E tests
|
|
44
|
+
npm run test:e2e
|
|
45
|
+
|
|
46
|
+
# Run tests in UI mode (interactive)
|
|
47
|
+
npm run test:e2e:ui
|
|
48
|
+
|
|
49
|
+
# Run tests in headed mode (see browser)
|
|
50
|
+
npm run test:e2e:headed
|
|
51
|
+
|
|
52
|
+
# Run tests in debug mode
|
|
53
|
+
npm run test:e2e:debug
|
|
54
|
+
|
|
55
|
+
# Run tests for specific browser
|
|
56
|
+
npm run test:e2e:chromium
|
|
57
|
+
npm run test:e2e:firefox
|
|
58
|
+
npm run test:e2e:webkit
|
|
59
|
+
|
|
60
|
+
# View test report
|
|
61
|
+
npm run test:e2e:report
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Running Specific Tests
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Run a specific test file
|
|
68
|
+
npx playwright test e2e/tests/home.spec.ts
|
|
69
|
+
|
|
70
|
+
# Run tests matching a pattern
|
|
71
|
+
npx playwright test e2e/tests/auth
|
|
72
|
+
|
|
73
|
+
# Run a specific test by name
|
|
74
|
+
npx playwright test -g "should load and display home page"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 📝 Test Categories
|
|
78
|
+
|
|
79
|
+
### 1. Home Page Tests (`home.spec.ts`)
|
|
80
|
+
|
|
81
|
+
- Page loading and rendering
|
|
82
|
+
- Navigation menu functionality
|
|
83
|
+
- Responsive design testing
|
|
84
|
+
- Locale handling
|
|
85
|
+
|
|
86
|
+
### 2. Navigation Tests (`navigation.spec.ts`)
|
|
87
|
+
|
|
88
|
+
- Inter-page navigation
|
|
89
|
+
- 404 page handling
|
|
90
|
+
- Browser back/forward navigation
|
|
91
|
+
- State persistence during navigation
|
|
92
|
+
|
|
93
|
+
### 3. Authentication Tests (`auth.spec.ts`)
|
|
94
|
+
|
|
95
|
+
- Login form validation
|
|
96
|
+
- Form submission
|
|
97
|
+
- Navigation to register page
|
|
98
|
+
- Keyboard navigation support
|
|
99
|
+
|
|
100
|
+
### 4. Internationalization Tests (`i18n.spec.ts`)
|
|
101
|
+
|
|
102
|
+
- Locale switching
|
|
103
|
+
- Translation coverage
|
|
104
|
+
- Locale persistence
|
|
105
|
+
- Invalid locale handling
|
|
106
|
+
|
|
107
|
+
### 5. Accessibility Tests (`accessibility.spec.ts`)
|
|
108
|
+
|
|
109
|
+
- Document structure
|
|
110
|
+
- Heading hierarchy
|
|
111
|
+
- Alt text for images
|
|
112
|
+
- Form labels
|
|
113
|
+
- Keyboard navigation
|
|
114
|
+
- ARIA roles
|
|
115
|
+
|
|
116
|
+
### 6. Performance Tests (`performance.spec.ts`)
|
|
117
|
+
|
|
118
|
+
- Page load time
|
|
119
|
+
- First Contentful Paint
|
|
120
|
+
- Bundle size
|
|
121
|
+
- Lazy loading
|
|
122
|
+
- Memory leak detection
|
|
123
|
+
|
|
124
|
+
## 🏗️ Writing Tests
|
|
125
|
+
|
|
126
|
+
### Using Page Object Model
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { test, expect } from '../fixtures/base.fixture';
|
|
130
|
+
import { HomePage } from '../pages/HomePage';
|
|
131
|
+
|
|
132
|
+
test('example test', async ({ page }) => {
|
|
133
|
+
const homePage = new HomePage(page);
|
|
134
|
+
await homePage.navigate('zh');
|
|
135
|
+
await expect(homePage.mainContent).toBeVisible();
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Using Test Helpers
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { waitForAppReady, navigateToLocalePath } from '../utils/test-helpers';
|
|
143
|
+
|
|
144
|
+
test('example with helpers', async ({ page }) => {
|
|
145
|
+
await navigateToLocalePath(page, '/about', 'en');
|
|
146
|
+
await waitForAppReady(page);
|
|
147
|
+
// ... rest of test
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Custom Fixtures
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// In fixtures/base.fixture.ts
|
|
155
|
+
export const test = base.extend({
|
|
156
|
+
authenticatedPage: async ({ page }, use) => {
|
|
157
|
+
// Setup authenticated state
|
|
158
|
+
await page.goto('/login');
|
|
159
|
+
// ... perform login
|
|
160
|
+
await use(page);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 🔧 Configuration
|
|
166
|
+
|
|
167
|
+
Test configuration is located in `playwright.config.ts` at the project root.
|
|
168
|
+
|
|
169
|
+
Key settings:
|
|
170
|
+
|
|
171
|
+
- **Base URL**: `http://localhost:3200` (automatically starts dev server)
|
|
172
|
+
- **Browsers**: Chromium, Firefox, WebKit, Mobile Chrome, Mobile Safari
|
|
173
|
+
- **Reporters**: HTML, JSON, List
|
|
174
|
+
- **Retry**: 2 times on CI, 0 times locally
|
|
175
|
+
- **Screenshots**: On failure
|
|
176
|
+
- **Videos**: Retained on failure
|
|
177
|
+
- **Traces**: On first retry
|
|
178
|
+
|
|
179
|
+
## 📊 Test Reports
|
|
180
|
+
|
|
181
|
+
After running tests, view the HTML report:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
npm run test:e2e:report
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Or open the report file directly:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
open playwright-report/index.html
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 🐛 Debugging Tests
|
|
194
|
+
|
|
195
|
+
### Debug Mode
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npm run test:e2e:debug
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
This opens the Playwright Inspector where you can:
|
|
202
|
+
|
|
203
|
+
- Step through tests
|
|
204
|
+
- See browser actions
|
|
205
|
+
- Inspect selectors
|
|
206
|
+
- View console logs
|
|
207
|
+
|
|
208
|
+
### VS Code Extension
|
|
209
|
+
|
|
210
|
+
Install the [Playwright Test for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) extension for:
|
|
211
|
+
|
|
212
|
+
- Running tests from the editor
|
|
213
|
+
- Setting breakpoints
|
|
214
|
+
- Viewing test results inline
|
|
215
|
+
|
|
216
|
+
### Trace Viewer
|
|
217
|
+
|
|
218
|
+
If a test fails, traces are automatically recorded. View them with:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
npx playwright show-trace test-results/path-to-trace.zip
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 📸 Screenshots
|
|
225
|
+
|
|
226
|
+
Screenshots are automatically captured on test failure. Manual screenshots can be taken using:
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
await page.screenshot({ path: 'e2e/screenshots/my-screenshot.png' });
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Or using the helper:
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { takeScreenshot } from '../utils/test-helpers';
|
|
236
|
+
|
|
237
|
+
await takeScreenshot(page, 'my-screenshot');
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## 🌍 Environment Variables
|
|
241
|
+
|
|
242
|
+
- `PLAYWRIGHT_BASE_URL`: Override the base URL (default: `http://localhost:3200`)
|
|
243
|
+
- `CI`: Set to enable CI-specific settings (retries, parallel execution)
|
|
244
|
+
|
|
245
|
+
Example:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
PLAYWRIGHT_BASE_URL=http://localhost:3000 npm run test:e2e
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## 🔄 Continuous Integration
|
|
252
|
+
|
|
253
|
+
### GitHub Actions
|
|
254
|
+
|
|
255
|
+
A sample GitHub Actions workflow is provided in `.github/workflows/playwright.yml`.
|
|
256
|
+
|
|
257
|
+
The workflow:
|
|
258
|
+
|
|
259
|
+
1. Installs dependencies
|
|
260
|
+
2. Installs Playwright browsers
|
|
261
|
+
3. Runs tests
|
|
262
|
+
4. Uploads test reports as artifacts
|
|
263
|
+
|
|
264
|
+
## 📚 Best Practices
|
|
265
|
+
|
|
266
|
+
1. **Use Page Object Models** for reusable page interactions
|
|
267
|
+
2. **Use meaningful test names** that describe what is being tested
|
|
268
|
+
3. **Avoid hard-coded waits** - use Playwright's auto-waiting
|
|
269
|
+
4. **Test user journeys** not implementation details
|
|
270
|
+
5. **Keep tests isolated** - each test should be independent
|
|
271
|
+
6. **Use data-testid** attributes for stable selectors
|
|
272
|
+
7. **Test accessibility** alongside functionality
|
|
273
|
+
8. **Monitor performance** with performance tests
|
|
274
|
+
|
|
275
|
+
## 🔗 Useful Links
|
|
276
|
+
|
|
277
|
+
- [Playwright Documentation](https://playwright.dev/)
|
|
278
|
+
- [Playwright Best Practices](https://playwright.dev/docs/best-practices)
|
|
279
|
+
- [Playwright API Reference](https://playwright.dev/docs/api/class-playwright)
|
|
280
|
+
- [Playwright Selectors](https://playwright.dev/docs/selectors)
|
|
281
|
+
- [Playwright Assertions](https://playwright.dev/docs/test-assertions)
|
|
282
|
+
|
|
283
|
+
## 🆘 Troubleshooting
|
|
284
|
+
|
|
285
|
+
### Tests timing out
|
|
286
|
+
|
|
287
|
+
- Increase timeout in `playwright.config.ts`
|
|
288
|
+
- Check if the dev server is running
|
|
289
|
+
- Ensure no network issues
|
|
290
|
+
|
|
291
|
+
### Selector not found
|
|
292
|
+
|
|
293
|
+
- Use Playwright Inspector to debug selectors
|
|
294
|
+
- Check if element is in a frame or shadow DOM
|
|
295
|
+
- Verify the element exists in the DOM
|
|
296
|
+
|
|
297
|
+
### Flaky tests
|
|
298
|
+
|
|
299
|
+
- Avoid hardcoded waits - use `waitFor*` methods
|
|
300
|
+
- Ensure proper cleanup between tests
|
|
301
|
+
- Check for race conditions
|
|
302
|
+
- Use `test.describe.serial` for dependent tests
|
|
303
|
+
|
|
304
|
+
### Browser installation issues
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
# Reinstall browsers
|
|
308
|
+
npx playwright install --force
|
|
309
|
+
|
|
310
|
+
# Install browser dependencies (Linux)
|
|
311
|
+
npx playwright install-deps
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
## 💡 Tips
|
|
315
|
+
|
|
316
|
+
1. Use `--ui` mode for developing tests interactively
|
|
317
|
+
2. Use `--debug` mode to step through failing tests
|
|
318
|
+
3. Use `--headed` mode to see what the browser is doing
|
|
319
|
+
4. Use `--trace on` to record traces for all tests
|
|
320
|
+
5. Use `--project` to run tests on specific browsers
|
|
321
|
+
6. Use grep patterns to run specific tests: `-g "pattern"`
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Playwright E2E Testing Documentation (English)
|
|
2
|
+
|
|
3
|
+
> This directory contains all Playwright E2E testing related documentation in English
|
|
4
|
+
|
|
5
|
+
## 📚 Documentation List
|
|
6
|
+
|
|
7
|
+
- **[Overview](./overview.md)** - Feature highlights and quick introduction
|
|
8
|
+
- **[Quick Start Guide](./quickstart.md)** ⭐ Recommended for beginners
|
|
9
|
+
- **[Detailed Testing Guide](./testing-guide.md)** - Complete testing reference manual
|
|
10
|
+
- **[Setup Complete Guide](./setup-complete.md)** - Configuration and troubleshooting
|
|
11
|
+
- **[Installation Summary](./installation-summary.md)** - Installation details and project statistics
|
|
12
|
+
- **[E2E Tests Documentation](./e2e-tests.md)** - E2E directory structure guide
|
|
13
|
+
- **[Reorganization Notes](./reorganization-notes.md)** - Documentation reorganization details
|
|
14
|
+
|
|
15
|
+
## 🔗 Related Links
|
|
16
|
+
|
|
17
|
+
- [中文文档](../../zh/playwright/) - Chinese Documentation
|
|
18
|
+
- [Back to Documentation Home](../../README.md)
|
|
19
|
+
- [English Documentation Index](../index.md) - Back to English docs
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# 🎯 Playwright E2E 测试安装总结
|
|
2
|
+
|
|
3
|
+
## ✅ 已完成的工作
|
|
4
|
+
|
|
5
|
+
### 1. 核心配置文件 (5 个)
|
|
6
|
+
|
|
7
|
+
| 文件 | 说明 | 状态 |
|
|
8
|
+
| ----------------------- | ---------------------------------------------- | ---- |
|
|
9
|
+
| `playwright.config.ts` | Playwright 主配置(多浏览器、自动启动服务器) | ✅ |
|
|
10
|
+
| `tsconfig.e2e.json` | E2E 测试的 TypeScript 配置 | ✅ |
|
|
11
|
+
| `.eslintignore` | ESLint 忽略规则(包含 e2e 和 playwright 文件) | ✅ |
|
|
12
|
+
| `.vscode/settings.json` | VS Code Playwright 配置 | ✅ |
|
|
13
|
+
| `.gitignore` | 更新了测试报告和截图目录 | ✅ |
|
|
14
|
+
|
|
15
|
+
### 2. E2E 测试文件 (12 个)
|
|
16
|
+
|
|
17
|
+
#### Fixtures (1 个)
|
|
18
|
+
|
|
19
|
+
- ✅ `e2e/fixtures/base.fixture.ts` - 自定义测试固件基类
|
|
20
|
+
|
|
21
|
+
#### Page Objects (3 个)
|
|
22
|
+
|
|
23
|
+
- ✅ `e2e/pages/BasePage.ts` - 基础页面对象模型
|
|
24
|
+
- ✅ `e2e/pages/HomePage.ts` - 首页 POM
|
|
25
|
+
- ✅ `e2e/pages/LoginPage.ts` - 登录页 POM
|
|
26
|
+
|
|
27
|
+
#### 测试规范 (7 个)
|
|
28
|
+
|
|
29
|
+
- ✅ `e2e/example.spec.ts` - 验证 Playwright 设置的示例测试
|
|
30
|
+
- ✅ `e2e/tests/home.spec.ts` - 首页功能测试(6 个测试用例)
|
|
31
|
+
- ✅ `e2e/tests/navigation.spec.ts` - 导航和路由测试(5 个测试用例)
|
|
32
|
+
- ✅ `e2e/tests/auth.spec.ts` - 认证流程测试(8 个测试用例)
|
|
33
|
+
- ✅ `e2e/tests/i18n.spec.ts` - 国际化测试(6 个测试用例)
|
|
34
|
+
- ✅ `e2e/tests/accessibility.spec.ts` - 可访问性测试(10 个测试用例)
|
|
35
|
+
- ✅ `e2e/tests/performance.spec.ts` - 性能测试(8 个测试用例)
|
|
36
|
+
|
|
37
|
+
#### 工具函数 (1 个)
|
|
38
|
+
|
|
39
|
+
- ✅ `e2e/utils/test-helpers.ts` - 测试辅助函数库
|
|
40
|
+
|
|
41
|
+
**总计**: 43+ 个测试用例,覆盖功能、质量、性能和可访问性
|
|
42
|
+
|
|
43
|
+
### 3. 文档文件 (7 个)
|
|
44
|
+
|
|
45
|
+
| 文件 | 说明 | 语言 |
|
|
46
|
+
| ----------------------------------------- | --------------------------- | ------- |
|
|
47
|
+
| `docs/playwright/quickstart.md` | 快速入门指南 | 中文 |
|
|
48
|
+
| `docs/playwright/setup-complete.md` | 设置完成指南 | 中文 |
|
|
49
|
+
| `docs/playwright/installation-summary.md` | 安装总结(本文档) | 中文 |
|
|
50
|
+
| `docs/playwright/testing-guide.md` | 详细测试指南 | 中文 |
|
|
51
|
+
| `docs/zh/playwright-testing.md` | Playwright 测试概述 | 中文 |
|
|
52
|
+
| `docs/en/playwright-testing.md` | Playwright Testing Overview | English |
|
|
53
|
+
| `e2e/README.md` | E2E 目录文档 | English |
|
|
54
|
+
|
|
55
|
+
### 4. CI/CD 配置 (1 个)
|
|
56
|
+
|
|
57
|
+
- ✅ `.github/workflows/playwright.yml` - GitHub Actions 工作流
|
|
58
|
+
- 多浏览器矩阵测试
|
|
59
|
+
- 自动上传测试报告
|
|
60
|
+
- 失败时上传截图和视频
|
|
61
|
+
- 合并测试报告
|
|
62
|
+
|
|
63
|
+
### 5. 更新的项目文件 (2 个)
|
|
64
|
+
|
|
65
|
+
#### `package.json`
|
|
66
|
+
|
|
67
|
+
添加了 8 个新的 npm 脚本:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
"test:e2e": "playwright test",
|
|
71
|
+
"test:e2e:ui": "playwright test --ui",
|
|
72
|
+
"test:e2e:headed": "playwright test --headed",
|
|
73
|
+
"test:e2e:debug": "playwright test --debug",
|
|
74
|
+
"test:e2e:chromium": "playwright test --project=chromium",
|
|
75
|
+
"test:e2e:firefox": "playwright test --project=firefox",
|
|
76
|
+
"test:e2e:webkit": "playwright test --project=webkit",
|
|
77
|
+
"test:e2e:report": "playwright show-report playwright-report"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### `eslint.config.mjs`
|
|
81
|
+
|
|
82
|
+
- 添加了 `tsconfig.e2e.json` 到 parser options
|
|
83
|
+
- 添加了 `playwright-report/` 和 `.playwright/` 到 ignores
|
|
84
|
+
- 添加了 `playwright.config.*` 到 ignores
|
|
85
|
+
- 添加了 `e2e/**` 到 ignores
|
|
86
|
+
|
|
87
|
+
## 📊 项目统计
|
|
88
|
+
|
|
89
|
+
- **配置文件**: 5 个
|
|
90
|
+
- **测试文件**: 12 个
|
|
91
|
+
- **文档文件**: 7 个
|
|
92
|
+
- **测试用例**: 43+ 个
|
|
93
|
+
- **Page Objects**: 3 个
|
|
94
|
+
- **测试工具函数**: 8+ 个
|
|
95
|
+
- **npm 脚本**: 8 个
|
|
96
|
+
- **支持的浏览器**: 5 个(Chromium, Firefox, WebKit, Mobile Chrome, Mobile Safari)
|
|
97
|
+
|
|
98
|
+
## 🎯 测试覆盖范围
|
|
99
|
+
|
|
100
|
+
### 功能测试
|
|
101
|
+
|
|
102
|
+
- ✅ 页面加载和渲染
|
|
103
|
+
- ✅ 导航和路由
|
|
104
|
+
- ✅ 表单验证和提交
|
|
105
|
+
- ✅ 用户交互
|
|
106
|
+
- ✅ 404 错误处理
|
|
107
|
+
|
|
108
|
+
### 质量测试
|
|
109
|
+
|
|
110
|
+
- ✅ 国际化 (i18n)
|
|
111
|
+
- ✅ 语言切换
|
|
112
|
+
- ✅ 响应式设计
|
|
113
|
+
- ✅ 移动端兼容性
|
|
114
|
+
|
|
115
|
+
### 可访问性测试
|
|
116
|
+
|
|
117
|
+
- ✅ ARIA 角色和属性
|
|
118
|
+
- ✅ 键盘导航
|
|
119
|
+
- ✅ 屏幕阅读器支持
|
|
120
|
+
- ✅ 语义化 HTML
|
|
121
|
+
- ✅ 表单标签
|
|
122
|
+
- ✅ 图片替代文本
|
|
123
|
+
|
|
124
|
+
### 性能测试
|
|
125
|
+
|
|
126
|
+
- ✅ 页面加载时间
|
|
127
|
+
- ✅ First Contentful Paint (FCP)
|
|
128
|
+
- ✅ Time to Interactive (TTI)
|
|
129
|
+
- ✅ 包大小监控
|
|
130
|
+
- ✅ 懒加载验证
|
|
131
|
+
- ✅ 内存泄漏检测
|
|
132
|
+
- ✅ 图片优化检查
|
|
133
|
+
|
|
134
|
+
## 🚀 下一步行动清单
|
|
135
|
+
|
|
136
|
+
### 必需步骤
|
|
137
|
+
|
|
138
|
+
- [ ] **修复 npm 权限**
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
sudo chown -R $(id -u):$(id -g) "$HOME/.npm"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- [ ] **安装 Playwright**
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npm install -D @playwright/test playwright
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
- [ ] **安装浏览器**
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx playwright install
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- [ ] **运行示例测试**
|
|
157
|
+
```bash
|
|
158
|
+
npm run test:e2e -- e2e/example.spec.ts
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 推荐步骤
|
|
162
|
+
|
|
163
|
+
- [ ] **安装 VS Code 扩展**
|
|
164
|
+
- [Playwright Test for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright)
|
|
165
|
+
|
|
166
|
+
- [ ] **清除 ESLint 缓存**(如果有 linting 错误)
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
rm -rf .eslintcache
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
- [ ] **熟悉 UI 模式**
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
npm run test:e2e:ui
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- [ ] **查看测试报告**
|
|
179
|
+
```bash
|
|
180
|
+
npm run test:e2e:report
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 可选步骤
|
|
184
|
+
|
|
185
|
+
- [ ] **配置 CI/CD**
|
|
186
|
+
- GitHub Actions 配置已准备好
|
|
187
|
+
- 只需推送到 GitHub 即可自动运行
|
|
188
|
+
|
|
189
|
+
- [ ] **编写自定义测试**
|
|
190
|
+
- 基于你的应用特定功能
|
|
191
|
+
- 使用提供的 Page Objects 作为模板
|
|
192
|
+
|
|
193
|
+
- [ ] **配置测试覆盖率**
|
|
194
|
+
- 添加代码覆盖率工具
|
|
195
|
+
- 监控测试覆盖率
|
|
196
|
+
|
|
197
|
+
## 📁 完整的项目结构
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
react-app/
|
|
201
|
+
├── .github/
|
|
202
|
+
│ └── workflows/
|
|
203
|
+
│ └── playwright.yml # CI/CD 配置
|
|
204
|
+
├── .vscode/
|
|
205
|
+
│ └── settings.json # VS Code 配置
|
|
206
|
+
├── docs/
|
|
207
|
+
│ ├── playwright/ # Playwright 文档目录
|
|
208
|
+
│ │ ├── quickstart.md # 快速入门
|
|
209
|
+
│ │ ├── setup-complete.md # 设置完成指南
|
|
210
|
+
│ │ ├── installation-summary.md # 安装摘要
|
|
211
|
+
│ │ └── testing-guide.md # 详细测试指南
|
|
212
|
+
│ ├── en/
|
|
213
|
+
│ │ └── playwright-testing.md # 英文概述
|
|
214
|
+
│ └── zh/
|
|
215
|
+
│ └── playwright-testing.md # 中文概述
|
|
216
|
+
├── e2e/ # E2E 测试根目录
|
|
217
|
+
│ ├── fixtures/
|
|
218
|
+
│ │ └── base.fixture.ts # 测试固件
|
|
219
|
+
│ ├── pages/ # Page Object Models
|
|
220
|
+
│ │ ├── BasePage.ts
|
|
221
|
+
│ │ ├── HomePage.ts
|
|
222
|
+
│ │ └── LoginPage.ts
|
|
223
|
+
│ ├── tests/ # 测试规范
|
|
224
|
+
│ │ ├── accessibility.spec.ts
|
|
225
|
+
│ │ ├── auth.spec.ts
|
|
226
|
+
│ │ ├── home.spec.ts
|
|
227
|
+
│ │ ├── i18n.spec.ts
|
|
228
|
+
│ │ ├── navigation.spec.ts
|
|
229
|
+
│ │ └── performance.spec.ts
|
|
230
|
+
│ ├── utils/
|
|
231
|
+
│ │ └── test-helpers.ts # 工具函数
|
|
232
|
+
│ ├── example.spec.ts # 示例测试
|
|
233
|
+
│ └── README.md # E2E 文档
|
|
234
|
+
├── .eslintignore # ESLint 忽略规则
|
|
235
|
+
├── .gitignore # Git 忽略规则
|
|
236
|
+
├── playwright.config.ts # Playwright 配置
|
|
237
|
+
├── tsconfig.e2e.json # E2E TypeScript 配置
|
|
238
|
+
└── package.json # 更新的依赖和脚本
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## 🎨 特性亮点
|
|
242
|
+
|
|
243
|
+
### 1. 完整的测试架构
|
|
244
|
+
|
|
245
|
+
- Page Object Model 设计模式
|
|
246
|
+
- 自定义 fixtures
|
|
247
|
+
- 可重用的测试工具函数
|
|
248
|
+
- 结构化的测试组织
|
|
249
|
+
|
|
250
|
+
### 2. 多浏览器支持
|
|
251
|
+
|
|
252
|
+
- Desktop: Chromium, Firefox, WebKit
|
|
253
|
+
- Mobile: Chrome (Pixel 5), Safari (iPhone 12)
|
|
254
|
+
- 并行执行测试
|
|
255
|
+
|
|
256
|
+
### 3. 开发者友好
|
|
257
|
+
|
|
258
|
+
- 交互式 UI 模式
|
|
259
|
+
- 调试模式
|
|
260
|
+
- 自动截图和视频
|
|
261
|
+
- 详细的测试报告
|
|
262
|
+
|
|
263
|
+
### 4. CI/CD 就绪
|
|
264
|
+
|
|
265
|
+
- GitHub Actions 配置
|
|
266
|
+
- 自动化测试执行
|
|
267
|
+
- 测试报告上传
|
|
268
|
+
- 失败时的调试信息
|
|
269
|
+
|
|
270
|
+
### 5. 全面的文档
|
|
271
|
+
|
|
272
|
+
- 集中式文档管理
|
|
273
|
+
- 快速入门指南
|
|
274
|
+
- 详细的 API 文档
|
|
275
|
+
- 最佳实践指南
|
|
276
|
+
|
|
277
|
+
## 🔍 快速验证
|
|
278
|
+
|
|
279
|
+
运行以下命令验证安装:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# 1. 检查 Playwright 配置
|
|
283
|
+
cat playwright.config.ts
|
|
284
|
+
|
|
285
|
+
# 2. 列出所有测试文件
|
|
286
|
+
find e2e -name "*.spec.ts"
|
|
287
|
+
|
|
288
|
+
# 3. 检查 npm 脚本
|
|
289
|
+
npm run | grep test:e2e
|
|
290
|
+
|
|
291
|
+
# 4. 查看文档结构
|
|
292
|
+
ls -R docs/playwright/
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## 📞 获取帮助
|
|
296
|
+
|
|
297
|
+
如果遇到问题,请查看:
|
|
298
|
+
|
|
299
|
+
1. **快速入门**: [docs/playwright/quickstart.md](./quickstart.md)
|
|
300
|
+
2. **设置指南**: [docs/playwright/setup-complete.md](./setup-complete.md)
|
|
301
|
+
3. **测试指南**: [docs/playwright/testing-guide.md](./testing-guide.md)
|
|
302
|
+
4. **E2E 文档**: [e2e/README.md](../../e2e/README.md)
|
|
303
|
+
5. **官方文档**: https://playwright.dev/
|
|
304
|
+
|
|
305
|
+
## 🎉 总结
|
|
306
|
+
|
|
307
|
+
你现在拥有一个完整的、生产就绪的 Playwright E2E 测试套件!
|
|
308
|
+
|
|
309
|
+
**包含**:
|
|
310
|
+
|
|
311
|
+
- ✅ 43+ 个预定义测试用例
|
|
312
|
+
- ✅ 5 个浏览器支持
|
|
313
|
+
- ✅ Page Object Models
|
|
314
|
+
- ✅ 测试工具函数
|
|
315
|
+
- ✅ CI/CD 集成
|
|
316
|
+
- ✅ 集中式文档管理
|
|
317
|
+
|
|
318
|
+
**文档位置**:
|
|
319
|
+
|
|
320
|
+
- 所有 Playwright 文档位于 `docs/playwright/` 目录
|
|
321
|
+
- 中英文概述位于 `docs/zh/` 和 `docs/en/`
|
|
322
|
+
- E2E 目录文档位于 `e2e/README.md`
|
|
323
|
+
|
|
324
|
+
**下一步**: 安装依赖并运行你的第一个测试!
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
npm install -D @playwright/test playwright
|
|
328
|
+
npx playwright install
|
|
329
|
+
npm run test:e2e:ui
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
祝测试愉快!🚀
|