@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,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BootstrapClient test-suite
|
|
3
|
+
*
|
|
4
|
+
* Coverage:
|
|
5
|
+
* 1. main method – Bootstrap client main flow tests
|
|
6
|
+
* 2. parameter validation – Input parameter validation tests
|
|
7
|
+
* 3. error handling – Error handling tests
|
|
8
|
+
* 4. integration – Bootstrap flow integration tests
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { testIOC } from '@__tests__/__mocks__/testIOC/TestIOC';
|
|
12
|
+
import { I, type IOCIdentifierMap } from '@config/IOCIdentifier';
|
|
13
|
+
import type { BootstrapClientArgs } from '@/core/bootstraps/BootstrapClient';
|
|
14
|
+
import { BootstrapClient } from '@/core/bootstraps/BootstrapClient';
|
|
15
|
+
import type { BootstrapsRegistryInterface } from '@/core/bootstraps/BootstrapsRegistry';
|
|
16
|
+
import * as globals from '@/core/globals';
|
|
17
|
+
import type {
|
|
18
|
+
BootstrapExecutorPlugin,
|
|
19
|
+
IOCContainerInterface,
|
|
20
|
+
IOCFunctionInterface
|
|
21
|
+
} from '@qlover/corekit-bridge';
|
|
22
|
+
import type { ExecutorPlugin } from '@qlover/fe-corekit';
|
|
23
|
+
|
|
24
|
+
describe('BootstrapClient', () => {
|
|
25
|
+
describe('bootstrap start flow', () => {
|
|
26
|
+
const mockRoot = {
|
|
27
|
+
location: { href: 'http://localhost:3000/en' }
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const testBootstrapPlugin: BootstrapExecutorPlugin = {
|
|
31
|
+
pluginName: 'test-bootstrap-1',
|
|
32
|
+
onExec: vi.fn().mockResolvedValue(undefined)
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
it('should bootstrap real strapup flow', async () => {
|
|
36
|
+
// 将 mock 函数提取出来,以便验证是否被调用
|
|
37
|
+
const mockRegister = vi.fn().mockReturnValue([testBootstrapPlugin]);
|
|
38
|
+
|
|
39
|
+
class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
|
|
40
|
+
register = mockRegister;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const args: BootstrapClientArgs = {
|
|
44
|
+
root: mockRoot,
|
|
45
|
+
bootHref: mockRoot.location.href,
|
|
46
|
+
ioc: testIOC,
|
|
47
|
+
RegistryClass: TestBootstrapsRegistry
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const result = await BootstrapClient.main(args);
|
|
51
|
+
|
|
52
|
+
expect(result).toEqual(args);
|
|
53
|
+
expect(globals.logger.info).toHaveBeenCalledWith('bootstrap start...');
|
|
54
|
+
expect(testBootstrapPlugin.onExec).toHaveBeenCalled();
|
|
55
|
+
// 验证 register 方法是否被调用
|
|
56
|
+
expect(mockRegister).toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should handle bootstrap I18nService', async () => {
|
|
60
|
+
// 将 mock 函数提取出来,以便验证是否被调用
|
|
61
|
+
const mockRegister = vi
|
|
62
|
+
.fn()
|
|
63
|
+
.mockImplementationOnce(
|
|
64
|
+
(
|
|
65
|
+
ioc: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>
|
|
66
|
+
) => {
|
|
67
|
+
// TestIocRegister 中已经注册了,无法bind
|
|
68
|
+
return [ioc.get(I.I18nServiceInterface)];
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
|
|
73
|
+
register = mockRegister;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const args: BootstrapClientArgs = {
|
|
77
|
+
root: mockRoot,
|
|
78
|
+
bootHref: mockRoot.location.href,
|
|
79
|
+
ioc: testIOC,
|
|
80
|
+
RegistryClass: TestBootstrapsRegistry
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
await BootstrapClient.main(args);
|
|
84
|
+
|
|
85
|
+
const ioc = testIOC.getIoc();
|
|
86
|
+
expect(mockRegister).toBeCalled();
|
|
87
|
+
expect(ioc).toBeDefined();
|
|
88
|
+
|
|
89
|
+
const i18nService = ioc!.get(I.I18nServiceInterface);
|
|
90
|
+
expect(i18nService).toBeDefined();
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
expect(i18nService.pathname).toBe(args.bootHref);
|
|
93
|
+
|
|
94
|
+
// mock i18n set language to en
|
|
95
|
+
i18nService.emit({ ...i18nService.state, language: 'en' });
|
|
96
|
+
|
|
97
|
+
expect(i18nService.state.language).toBe('en');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should handle bootstrap UserApiBootstarp', async () => {
|
|
101
|
+
const mockUserService: ExecutorPlugin = {
|
|
102
|
+
pluginName: 'TestUserService',
|
|
103
|
+
onBefore: vi.fn().mockResolvedValue(undefined)
|
|
104
|
+
};
|
|
105
|
+
// 将 mock 函数提取出来,以便验证是否被调用
|
|
106
|
+
const mockRegister = vi
|
|
107
|
+
.fn()
|
|
108
|
+
.mockImplementationOnce(
|
|
109
|
+
(
|
|
110
|
+
ioc: IOCFunctionInterface<IOCIdentifierMap, IOCContainerInterface>
|
|
111
|
+
) => {
|
|
112
|
+
return [ioc.get(I.UserServiceInterface)];
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
class TestBootstrapsRegistry implements BootstrapsRegistryInterface {
|
|
117
|
+
register = mockRegister;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const args: BootstrapClientArgs = {
|
|
121
|
+
root: mockRoot,
|
|
122
|
+
bootHref: mockRoot.location.href,
|
|
123
|
+
ioc: testIOC,
|
|
124
|
+
iocRegister: {
|
|
125
|
+
register: vi
|
|
126
|
+
.fn()
|
|
127
|
+
.mockImplementationOnce(
|
|
128
|
+
(
|
|
129
|
+
ioc: IOCFunctionInterface<
|
|
130
|
+
IOCIdentifierMap,
|
|
131
|
+
IOCContainerInterface
|
|
132
|
+
>
|
|
133
|
+
) => {
|
|
134
|
+
ioc.bind(I.UserServiceInterface, mockUserService as any);
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
},
|
|
138
|
+
RegistryClass: TestBootstrapsRegistry
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
await BootstrapClient.main(args);
|
|
142
|
+
const ioc = testIOC.getIoc();
|
|
143
|
+
expect(ioc).toBeDefined();
|
|
144
|
+
|
|
145
|
+
const userService = ioc!.get(I.UserServiceInterface);
|
|
146
|
+
|
|
147
|
+
expect(userService).toBeDefined();
|
|
148
|
+
expect(userService).toEqual(mockUserService);
|
|
149
|
+
expect(userService.pluginName).toBe('TestUserService');
|
|
150
|
+
expect(userService.onBefore).toBeCalled();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BootstrapApp } from '@/core/bootstraps/BootstrapApp';
|
|
3
|
-
import type { BootstrapAppArgs } from '@/core/bootstraps/BootstrapApp';
|
|
1
|
+
import { browserGlobalsName } from '@config/common';
|
|
4
2
|
import { createIOCFunction } from '@qlover/corekit-bridge';
|
|
3
|
+
import { InversifyContainer } from '@/base/cases/InversifyContainer';
|
|
4
|
+
import { BootstrapClient } from '@/core/bootstraps/BootstrapClient';
|
|
5
|
+
import type { BootstrapClientArgs } from '@/core/bootstraps/BootstrapClient';
|
|
5
6
|
import type { IOCIdentifierMap } from '@config/IOCIdentifier';
|
|
6
7
|
import { name, version } from '../../../../package.json';
|
|
7
|
-
import { browserGlobalsName } from '@config/common';
|
|
8
8
|
|
|
9
9
|
// Mock IocRegisterImpl to properly handle registration
|
|
10
10
|
vi.mock('@/core/registers/IocRegisterImpl', () => ({
|
|
@@ -25,7 +25,7 @@ vi.mock('@/core/bootstraps/BootstrapsRegistry', () => ({
|
|
|
25
25
|
}));
|
|
26
26
|
|
|
27
27
|
describe('BootstrapApp', () => {
|
|
28
|
-
let mockArgs:
|
|
28
|
+
let mockArgs: BootstrapClientArgs;
|
|
29
29
|
let mockIOC: ReturnType<typeof createIOCFunction<IOCIdentifierMap>>;
|
|
30
30
|
|
|
31
31
|
beforeEach(() => {
|
|
@@ -40,13 +40,15 @@ describe('BootstrapApp', () => {
|
|
|
40
40
|
mockArgs = {
|
|
41
41
|
root: {},
|
|
42
42
|
bootHref: 'http://localhost:3000',
|
|
43
|
-
|
|
43
|
+
ioc: {
|
|
44
|
+
create: vi.fn().mockReturnValue(mockIOC)
|
|
45
|
+
}
|
|
44
46
|
};
|
|
45
47
|
});
|
|
46
48
|
|
|
47
49
|
describe('main', () => {
|
|
48
50
|
it('should initialize bootstrap successfully', async () => {
|
|
49
|
-
const result = await
|
|
51
|
+
const result = await BootstrapClient.main(mockArgs);
|
|
50
52
|
|
|
51
53
|
expect(result.bootHref).toBe('http://localhost:3000');
|
|
52
54
|
// default inject env,globals var, ioc
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
2
1
|
import { readFileSync, existsSync } from 'fs';
|
|
3
2
|
import { join } from 'path';
|
|
4
3
|
|
|
@@ -41,7 +40,7 @@ describe('main.tsx Integration Tests', () => {
|
|
|
41
40
|
|
|
42
41
|
// Check if it contains necessary imports
|
|
43
42
|
expect(content).toContain('import');
|
|
44
|
-
expect(content).toContain('
|
|
43
|
+
expect(content).toContain('BootstrapClient');
|
|
45
44
|
expect(content).toContain('createRoot');
|
|
46
45
|
});
|
|
47
46
|
|
|
@@ -51,11 +50,11 @@ describe('main.tsx Integration Tests', () => {
|
|
|
51
50
|
expect(existsSync(appPath)).toBe(true);
|
|
52
51
|
});
|
|
53
52
|
|
|
54
|
-
it('should have
|
|
55
|
-
// Test if
|
|
53
|
+
it('should have BootstrapClient.ts file', () => {
|
|
54
|
+
// Test if BootstrapClient.ts file exists
|
|
56
55
|
const bootstrapPath = join(
|
|
57
56
|
process.cwd(),
|
|
58
|
-
'src/core/bootstraps/
|
|
57
|
+
'src/core/bootstraps/BootstrapClient.ts'
|
|
59
58
|
);
|
|
60
59
|
expect(existsSync(bootstrapPath)).toBe(true);
|
|
61
60
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BootstrapClient } from '@/core/bootstraps/BootstrapClient';
|
|
2
2
|
|
|
3
3
|
// Mock BootstrapApp
|
|
4
|
-
vi.mock('@/core/bootstraps/
|
|
5
|
-
|
|
4
|
+
vi.mock('@/core/bootstraps/BootstrapClient', () => ({
|
|
5
|
+
BootstrapClient: {
|
|
6
6
|
main: vi.fn()
|
|
7
7
|
}
|
|
8
8
|
}));
|
|
@@ -33,7 +33,7 @@ describe('main.tsx', () => {
|
|
|
33
33
|
describe('BootstrapApp initialization', () => {
|
|
34
34
|
it('should call BootstrapApp.main()', async () => {
|
|
35
35
|
await import('@/main');
|
|
36
|
-
expect(
|
|
36
|
+
expect(BootstrapClient.main).toHaveBeenCalledTimes(1);
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
39
|
|
|
@@ -1,86 +1,95 @@
|
|
|
1
|
+
import { BootstrapTest } from '@__mocks__/BootstrapTest';
|
|
2
|
+
import { TestApp } from '@__mocks__/components';
|
|
3
|
+
import { I } from '@config/IOCIdentifier';
|
|
1
4
|
import { render, screen } from '@testing-library/react';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
+
import type { IOCRegister } from '@/base/port/IOCInterface';
|
|
6
|
+
import { UserService } from '@/base/services/UserService';
|
|
7
|
+
import { BaseHeader } from '@/uikit/components/BaseHeader';
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (key === 'AppConfig') {
|
|
12
|
-
return { appName: 'Test App' };
|
|
13
|
-
}
|
|
14
|
-
if (key === PublicAssetsPath) {
|
|
15
|
-
return mockPublicAssetsPath;
|
|
16
|
-
}
|
|
17
|
-
return {};
|
|
18
|
-
})
|
|
19
|
-
}));
|
|
20
|
-
|
|
21
|
-
// Mock child components
|
|
22
|
-
vi.mock('@/uikit/components/ThemeSwitcher', () => ({
|
|
23
|
-
default: () => <div data-testid="theme-switcher">Theme Switcher</div>
|
|
24
|
-
}));
|
|
25
|
-
|
|
26
|
-
interface LocaleLinkProps {
|
|
27
|
-
children: React.ReactNode;
|
|
28
|
-
href: string;
|
|
29
|
-
className?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
vi.mock('@/uikit/components/LocaleLink', () => ({
|
|
33
|
-
default: ({ children, href, className }: LocaleLinkProps) => (
|
|
34
|
-
<a href={href} className={className} data-testid="locale-link">
|
|
35
|
-
{children}
|
|
36
|
-
</a>
|
|
37
|
-
)
|
|
38
|
-
}));
|
|
39
|
-
|
|
40
|
-
vi.mock('@/uikit/components/LanguageSwitcher', () => ({
|
|
41
|
-
default: () => <div data-testid="language-switcher">Language Switcher</div>
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
vi.mock('@/uikit/components/LogoutButton', () => ({
|
|
45
|
-
default: () => <div data-testid="logout-button">Logout</div>
|
|
46
|
-
}));
|
|
9
|
+
const BaseHeaderRegister: IOCRegister = {
|
|
10
|
+
register(ioc): void {
|
|
11
|
+
ioc.bind(I.UserServiceInterface, ioc.get(UserService));
|
|
12
|
+
}
|
|
13
|
+
};
|
|
47
14
|
|
|
48
15
|
describe('BaseHeader', () => {
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
await BootstrapTest.main({
|
|
18
|
+
root: globalThis,
|
|
19
|
+
bootHref: 'http://localhost:3000/en/test',
|
|
20
|
+
iocRegister: BaseHeaderRegister
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
49
24
|
it('renders header with correct structure', () => {
|
|
50
|
-
render(
|
|
51
|
-
|
|
25
|
+
render(
|
|
26
|
+
<TestApp>
|
|
27
|
+
<BaseHeader />
|
|
28
|
+
</TestApp>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
const header = screen.getByTestId('BaseHeader');
|
|
32
|
+
expect(header).toBeDefined();
|
|
52
33
|
});
|
|
53
34
|
|
|
54
35
|
it('renders logo and app name correctly', () => {
|
|
55
|
-
render(
|
|
56
|
-
|
|
57
|
-
|
|
36
|
+
render(
|
|
37
|
+
<TestApp>
|
|
38
|
+
<BaseHeader />
|
|
39
|
+
</TestApp>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const logo = screen.getByTestId('BaseHeader-logo');
|
|
43
|
+
const appName = screen.getByTestId('BaseHeader-app-name');
|
|
58
44
|
|
|
59
45
|
expect(logo).toBeDefined();
|
|
60
|
-
expect(logo.getAttribute('src')).toBe('/logo.svg');
|
|
61
46
|
expect(logo.getAttribute('alt')).toBe('logo');
|
|
62
47
|
expect(appName).toBeDefined();
|
|
63
|
-
expect(appName.textContent).
|
|
48
|
+
expect(appName.textContent).toBeTruthy();
|
|
64
49
|
});
|
|
65
50
|
|
|
66
51
|
it('renders theme and language switchers', () => {
|
|
67
|
-
render(
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
render(
|
|
53
|
+
<TestApp>
|
|
54
|
+
<BaseHeader />
|
|
55
|
+
</TestApp>
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// Note: These components render as Ant Design Select components
|
|
59
|
+
// We can verify they exist by checking for their parent containers
|
|
60
|
+
const header = screen.getByTestId('BaseHeader');
|
|
61
|
+
expect(header).toBeDefined();
|
|
62
|
+
// The actual Select components might not have data-testid in production code
|
|
70
63
|
});
|
|
71
64
|
|
|
72
65
|
it('renders logout button when showLogoutButton is true', () => {
|
|
73
|
-
render(
|
|
74
|
-
|
|
66
|
+
render(
|
|
67
|
+
<TestApp>
|
|
68
|
+
<BaseHeader showLogoutButton />
|
|
69
|
+
</TestApp>
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const logoutButton = screen.getByTestId('LogoutButton');
|
|
73
|
+
expect(logoutButton).toBeDefined();
|
|
75
74
|
});
|
|
76
75
|
|
|
77
76
|
it('does not render logout button when showLogoutButton is false', () => {
|
|
78
|
-
render(
|
|
79
|
-
|
|
77
|
+
render(
|
|
78
|
+
<TestApp>
|
|
79
|
+
<BaseHeader showLogoutButton={false} />
|
|
80
|
+
</TestApp>
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
expect(screen.queryByTestId('LogoutButton')).toBeNull();
|
|
80
84
|
});
|
|
81
85
|
|
|
82
86
|
it('renders home link correctly', () => {
|
|
83
|
-
render(
|
|
87
|
+
render(
|
|
88
|
+
<TestApp>
|
|
89
|
+
<BaseHeader />
|
|
90
|
+
</TestApp>
|
|
91
|
+
);
|
|
92
|
+
|
|
84
93
|
const link = screen.getByTestId('locale-link');
|
|
85
94
|
expect(link).toBeDefined();
|
|
86
95
|
expect(link.getAttribute('href')).toBe('/');
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type * as CorekitBridge from '@qlover/corekit-bridge';
|
|
2
|
-
import type * as FeCorekit from '@qlover/fe-corekit';
|
|
3
|
-
import type * as Logger from '@qlover/logger';
|
|
4
|
-
import type { DialogHandler } from '@/base/cases/DialogHandler';
|
|
5
1
|
import type { AppConfig } from '@/base/cases/AppConfig';
|
|
2
|
+
import type { DialogHandler } from '@/base/cases/DialogHandler';
|
|
3
|
+
import type { I18nKeyErrorPlugin } from '@/base/cases/I18nKeyErrorPlugin';
|
|
6
4
|
import type { RequestStatusCatcher } from '@/base/cases/RequestStatusCatcher';
|
|
5
|
+
import type { ExecutorPageBridgeInterface } from '@/base/port/ExecutorPageBridgeInterface';
|
|
6
|
+
import type { JSONStoragePageBridgeInterface } from '@/base/port/JSONStoragePageBridgeInterface';
|
|
7
|
+
import type { RequestPageBridgeInterface } from '@/base/port/RequestPageBridgeInterface';
|
|
7
8
|
import type { I18nService } from '@/base/services/I18nService';
|
|
8
9
|
import type { ProcesserExecutor } from '@/base/services/ProcesserExecutor';
|
|
9
10
|
import type { RouteService } from '@/base/services/RouteService';
|
|
10
11
|
import type { UserService } from '@/base/services/UserService';
|
|
11
|
-
import type
|
|
12
|
-
import type
|
|
13
|
-
import type
|
|
14
|
-
import type { RequestPageBridgeInterface } from '@/base/port/RequestPageBridgeInterface';
|
|
12
|
+
import type * as CorekitBridge from '@qlover/corekit-bridge';
|
|
13
|
+
import type * as FeCorekit from '@qlover/fe-corekit';
|
|
14
|
+
import type * as Logger from '@qlover/logger';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* IOC identifier
|
package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts}
RENAMED
|
@@ -3,32 +3,32 @@
|
|
|
3
3
|
* @localZh 本地未找到 user token
|
|
4
4
|
* @localEn Local no user token
|
|
5
5
|
*/
|
|
6
|
-
export const LOCAL_NO_USER_TOKEN = '
|
|
6
|
+
export const LOCAL_NO_USER_TOKEN = 'common:no.user.token';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* @description 全局未找到 window
|
|
10
10
|
* @localZh 全局未找到 window
|
|
11
11
|
* @localEn Global no window
|
|
12
12
|
*/
|
|
13
|
-
export const GLOBAL_NO_WINDOW = '
|
|
13
|
+
export const GLOBAL_NO_WINDOW = 'common:global.no.window';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @description 必须在 PageProvider 中使用
|
|
17
17
|
* @localZh 必须在 PageProvider 中使用
|
|
18
18
|
* @localEn Must be used in PageProvider
|
|
19
19
|
*/
|
|
20
|
-
export const WITHIN_PAGE_PROVIDER = '
|
|
20
|
+
export const WITHIN_PAGE_PROVIDER = 'common:within.page.provider';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* @description 响应内容没有 token 值
|
|
24
24
|
* @localZh 响应内容没有 token 值
|
|
25
25
|
* @localEn Response not token value
|
|
26
26
|
*/
|
|
27
|
-
export const RES_NO_TOKEN = '
|
|
27
|
+
export const RES_NO_TOKEN = 'common:response.no.token';
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* @description 未找到组件
|
|
31
31
|
* @localZh 未找到组件
|
|
32
32
|
* @localEn Not found component
|
|
33
33
|
*/
|
|
34
|
-
export const NOT_FOUND_COMPONENT = '
|
|
34
|
+
export const NOT_FOUND_COMPONENT = 'common:not.found.component';
|
|
@@ -3,60 +3,60 @@
|
|
|
3
3
|
* @localZh 默认主题
|
|
4
4
|
* @localEn Default Theme
|
|
5
5
|
*/
|
|
6
|
-
export const HEADER_THEME_DEFAULT = '
|
|
6
|
+
export const HEADER_THEME_DEFAULT = 'common:theme.default';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* @description Theme switcher dark theme label
|
|
10
10
|
* @localZh 暗色主题
|
|
11
11
|
* @localEn Dark Theme
|
|
12
12
|
*/
|
|
13
|
-
export const HEADER_THEME_DARK = '
|
|
13
|
+
export const HEADER_THEME_DARK = 'common:theme.dark';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @description Theme switcher pink theme label
|
|
17
17
|
* @localZh 粉色主题
|
|
18
18
|
* @localEn Pink Theme
|
|
19
19
|
*/
|
|
20
|
-
export const HEADER_THEME_PINK = '
|
|
20
|
+
export const HEADER_THEME_PINK = 'common:theme.pink';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* @description logout dialog title
|
|
24
24
|
* @localZh 登出
|
|
25
25
|
* @localEn Logout
|
|
26
26
|
*/
|
|
27
|
-
export const AUTH_LOGOUT_DIALOG_TITLE = '
|
|
27
|
+
export const AUTH_LOGOUT_DIALOG_TITLE = 'common:logout.dialog.title';
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* @description logout dialog content
|
|
31
31
|
* @localZh 确定要登出吗?
|
|
32
32
|
* @localEn Are you sure you want to logout?
|
|
33
33
|
*/
|
|
34
|
-
export const AUTH_LOGOUT_DIALOG_CONTENT = '
|
|
34
|
+
export const AUTH_LOGOUT_DIALOG_CONTENT = 'common:logout.dialog.content';
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* @description 404 page title
|
|
38
38
|
* @localZh 404 页面未找到
|
|
39
39
|
* @localEn 404 Page Not Found
|
|
40
40
|
*/
|
|
41
|
-
export const PAGE_404_TITLE = '
|
|
41
|
+
export const PAGE_404_TITLE = 'common:404.title';
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* @description 404 page description
|
|
45
45
|
* @localZh 404 页面描述
|
|
46
46
|
* @localEn 404 Page Description
|
|
47
47
|
*/
|
|
48
|
-
export const PAGE_404_DESCRIPTION = '
|
|
48
|
+
export const PAGE_404_DESCRIPTION = 'common:404.description';
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* @description 500 page title
|
|
52
52
|
* @localZh 500 页面错误
|
|
53
53
|
* @localEn 500 Page Error
|
|
54
54
|
*/
|
|
55
|
-
export const PAGE_500_TITLE = '
|
|
55
|
+
export const PAGE_500_TITLE = 'common:500.title';
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
58
|
* @description 500 page description
|
|
59
59
|
* @localZh 500 页面描述
|
|
60
60
|
* @localEn 500 Page Description
|
|
61
61
|
*/
|
|
62
|
-
export const PAGE_500_DESCRIPTION = '
|
|
62
|
+
export const PAGE_500_DESCRIPTION = 'common:500.description';
|
|
@@ -1,10 +1,2 @@
|
|
|
1
1
|
export * from './common';
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './page.about';
|
|
4
|
-
export * from './page.executor';
|
|
5
|
-
export * from './page.home';
|
|
6
|
-
export * from './page.identifiter';
|
|
7
|
-
export * from './page.jsonStorage';
|
|
8
|
-
export * from './page.login';
|
|
9
|
-
export * from './page.register';
|
|
10
|
-
export * from './page.request';
|
|
2
|
+
export * from './pages';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './page.about';
|
|
2
|
+
export * from './page.executor';
|
|
3
|
+
export * from './page.home';
|
|
4
|
+
export * from './page.identifiter';
|
|
5
|
+
export * from './page.jsonStorage';
|
|
6
|
+
export * from './page.login';
|
|
7
|
+
export * from './page.register';
|
|
8
|
+
export * from './page.request';
|