From fc000c1dc17bf3111e8bb0e41b8cd32fb641c9f9 Mon Sep 17 00:00:00 2001 From: Alex Lee <3076438032@qq.com> Date: Wed, 14 Oct 2026 15:11:30 +0800 Subject: [PATCH] refactor(applaunchpad): remove extracted application code (#7352) * refactor(applaunchpad): remove extracted application code * chore(frontend): clean up applaunchpad extraction leftovers --- .github/workflows/frontends.yml | 5 - frontend/Makefile | 1 - frontend/README.md | 1 - frontend/i18n.md | 1 - frontend/package.json | 1 - frontend/pnpm-lock.yaml | 4058 ----------------- frontend/providers/applaunchpad/.dockerignore | 10 - .../providers/applaunchpad/.eslintrc.json | 6 - frontend/providers/applaunchpad/.gitignore | 44 - .../providers/applaunchpad/.prettierignore | 4 - .../providers/applaunchpad/.prettierrc.js | 20 - .../applaunchpad/.vscode/settings.json | 17 - frontend/providers/applaunchpad/Makefile | 29 - frontend/providers/applaunchpad/README.md | 61 - ...etwork-configuration-table-layout.test.tsx | 131 - .../__tests__/unit/api/app.test.ts | 58 - .../unit/pages/api/checkReady.test.ts | 105 - .../api/platform/authDomainChallenge.test.ts | 523 --- .../unit/pages/api/v1alpha/createApp.test.ts | 108 - .../unit/pages/api/v2alpha/docs.test.ts | 31 - .../app/network-service-identity.test.tsx | 148 - .../services/backend/acs-cdn-actions.test.ts | 133 - .../unit/services/dns-resolver.fixture.ts | 1511 ------ .../unit/services/dns-resolver.test.ts | 962 ---- .../__tests__/unit/store/app.test.ts | 140 - .../unit/types/appNameRequestSchema.test.ts | 40 - .../unit/types/request_schema.test.ts | 128 - .../__tests__/unit/utils/adapt.test.ts | 72 - .../unit/utils/appNameValidation.test.ts | 84 - .../unit/utils/deployYaml2Json.test.ts | 169 - .../__tests__/unit/utils/dotenvEnv.test.ts | 197 - .../__tests__/unit/utils/network-url.test.ts | 66 - .../__tests__/unit/utils/pod.test.ts | 22 - .../__tests__/unit/utils/resource.test.ts | 14 - .../unit/utils/resourceQuantity.test.ts | 79 - .../unit/utils/storage-usage.test.ts | 96 - .../__tests__/unit/utils/timeRange.test.ts | 111 - .../__tests__/unit/utils/tools.test.ts | 103 - .../applaunchpad/data/config.example.yaml | 67 - .../providers/applaunchpad/deploy/Kubefile | 15 - .../applaunchpad-frontend-entrypoint.sh | 86 - .../charts/applaunchpad-frontend/Chart.yaml | 6 - .../applaunchpad-frontend-values.yaml | 12 - .../templates/_helpers.tpl | 111 - .../applaunchpad-frontend/templates/app.yaml | 19 - .../templates/configmap.yaml | 70 - .../templates/deployment.yaml | 57 - .../templates/ingress.yaml | 58 - .../templates/service.yaml | 16 - .../charts/applaunchpad-frontend/values.yaml | 67 - .../applaunchpad/deploy/images/shim/images | 1 - frontend/providers/applaunchpad/global.d.ts | 7 - frontend/providers/applaunchpad/i18nrc.json | 8 - .../applaunchpad/next-i18next.config.js | 13 - .../providers/applaunchpad/next.config.js | 40 - frontend/providers/applaunchpad/package.json | 109 - .../providers/applaunchpad/postcss.config.mjs | 9 - .../providers/applaunchpad/public/favicon.ico | Bin 4286 -> 0 bytes .../applaunchpad/public/guide-image.png | Bin 34218 -> 0 bytes .../applaunchpad/public/images/list-empty.svg | 224 - .../public/images/no_errors_found.svg | 6 - .../public/locales/en/common.json | 517 --- .../public/locales/zh/common.json | 517 --- .../providers/applaunchpad/public/logo.svg | 24 - .../applaunchpad/public/openapi.json | 579 --- .../providers/applaunchpad/src/api/app.ts | 199 - .../applaunchpad/src/api/kubeFile.ts | 53 - .../applaunchpad/src/api/params.d.ts | 8 - .../applaunchpad/src/api/platform.ts | 47 - .../providers/applaunchpad/src/api/tools.ts | 13 - .../src/components/AdvancedSelect/index.tsx | 208 - .../src/components/AppStatusTag/index.tsx | 32 - .../src/components/BaseTable/SwitchPage.tsx | 158 - .../src/components/BaseTable/index.tsx | 104 - .../src/components/ButtonGroup/index.tsx | 40 - .../src/components/DatePicker/index.tsx | 568 --- .../src/components/ErrorModal.tsx | 71 - .../src/components/FormControl/index.tsx | 29 - .../src/components/GPUItem/index.tsx | 34 - .../src/components/Icon/icons/analyze.svg | 1 - .../src/components/Icon/icons/appType.svg | 1 - .../src/components/Icon/icons/arrowLeft.svg | 3 - .../src/components/Icon/icons/arrowRight.svg | 3 - .../src/components/Icon/icons/calendar.svg | 3 - .../src/components/Icon/icons/change.svg | 5 - .../src/components/Icon/icons/chart.svg | 4 - .../components/Icon/icons/configMap-color.svg | 11 - .../src/components/Icon/icons/configMap.svg | 11 - .../src/components/Icon/icons/container.svg | 5 - .../src/components/Icon/icons/continue.svg | 3 - .../src/components/Icon/icons/copy.svg | 3 - .../src/components/Icon/icons/delete.svg | 3 - .../src/components/Icon/icons/deployMode.svg | 1 - .../src/components/Icon/icons/detail.svg | 3 - .../src/components/Icon/icons/download.svg | 3 - .../src/components/Icon/icons/edit.svg | 5 - .../src/components/Icon/icons/emptyChart.svg | 10 - .../src/components/Icon/icons/enlarge.svg | 3 - .../src/components/Icon/icons/export.svg | 5 - .../src/components/Icon/icons/file.svg | 3 - .../components/Icon/icons/file/csv-color.svg | 8 - .../src/components/Icon/icons/file/csv.svg | 7 - .../Icon/icons/file/defaul-color.svg | 3 - .../components/Icon/icons/file/default.svg | 3 - .../Icon/icons/file/folder-color.svg | 3 - .../Icon/icons/file/folder-line.svg | 3 - .../src/components/Icon/icons/file/folder.svg | 3 - .../Icon/icons/file/html2-color.svg | 7 - .../src/components/Icon/icons/file/html2.svg | 7 - .../components/Icon/icons/file/pdf-color.svg | 11 - .../src/components/Icon/icons/file/pdf.svg | 11 - .../components/Icon/icons/file/png-color.svg | 4 - .../src/components/Icon/icons/file/png.svg | 4 - .../components/Icon/icons/file/txt-color.svg | 3 - .../src/components/Icon/icons/file/txt.svg | 3 - .../components/Icon/icons/file/yaml-color.svg | 4 - .../src/components/Icon/icons/file/yaml.svg | 4 - .../src/components/Icon/icons/formInfo.svg | 3 - .../src/components/Icon/icons/gift.svg | 10 - .../Icon/icons/gpu/nvidia-green.svg | 1 - .../src/components/Icon/icons/gpu/nvidia.svg | 1 - .../src/components/Icon/icons/hardDrive.svg | 3 - .../src/components/Icon/icons/help.svg | 3 - .../src/components/Icon/icons/home.svg | 3 - .../src/components/Icon/icons/listen.svg | 1 - .../src/components/Icon/icons/loading.svg | 10 - .../src/components/Icon/icons/log.svg | 3 - .../src/components/Icon/icons/logo.svg | 3 - .../src/components/Icon/icons/monitor.svg | 4 - .../src/components/Icon/icons/more.svg | 1 - .../src/components/Icon/icons/network.svg | 3 - .../src/components/Icon/icons/noEvents.svg | 1 - .../src/components/Icon/icons/pause.svg | 4 - .../src/components/Icon/icons/plus.svg | 3 - .../src/components/Icon/icons/podList.svg | 1 - .../src/components/Icon/icons/pods.svg | 6 - .../src/components/Icon/icons/refresh.svg | 5 - .../src/components/Icon/icons/rename.svg | 4 - .../src/components/Icon/icons/restart.svg | 3 - .../src/components/Icon/icons/search.svg | 3 - .../src/components/Icon/icons/settings.svg | 4 - .../src/components/Icon/icons/start.svg | 3 - .../src/components/Icon/icons/statusicon.svg | 1 - .../src/components/Icon/icons/store-color.svg | 4 - .../src/components/Icon/icons/store.svg | 4 - .../src/components/Icon/icons/target.svg | 10 - .../src/components/Icon/icons/terminal.svg | 5 - .../src/components/Icon/icons/to.svg | 4 - .../src/components/Icon/icons/upload.svg | 11 - .../src/components/Icon/icons/upperRight.svg | 3 - .../src/components/Icon/icons/warning.svg | 10 - .../src/components/Icon/index.tsx | 99 - .../src/components/LangSelect/index.tsx | 60 - .../src/components/LogBarChart/index.tsx | 255 -- .../src/components/Monitor/Header.tsx | 178 - .../src/components/Monitor/Time.tsx | 9 - .../src/components/MonitorChart/index.tsx | 597 --- .../src/components/PodLineChart/index.tsx | 217 - .../src/components/PodPieChart/index.tsx | 107 - .../src/components/TruncateTooltip/index.tsx | 52 - .../src/components/YamlCode/hljs.ts | 123 - .../src/components/YamlCode/index.module.scss | 6 - .../src/components/YamlCode/index.tsx | 48 - .../app/detail/index/AdvancedInfo.tsx | 331 -- .../app/detail/index/AppBaseInfo.tsx | 190 - .../app/detail/index/AppMainInfo.tsx | 385 -- .../app/detail/index/ConfigMapDetailModal.tsx | 60 - .../components/app/detail/index/DelModal.tsx | 168 - .../components/app/detail/index/Header.tsx | 190 - .../components/app/detail/index/ICPStatus.tsx | 48 - .../components/app/detail/index/LogsModal.tsx | 264 -- .../app/detail/index/MonitorModal.tsx | 44 - .../index/NetworkConfigurationTable.tsx | 185 - .../app/detail/index/PodDetailModal.tsx | 531 --- .../app/detail/index/PodFileModal.tsx | 899 ---- .../src/components/app/detail/index/Pods.tsx | 355 -- .../app/detail/index/UpdateModal.tsx | 64 - .../src/components/app/detail/index/empty.tsx | 15 - .../app/detail/index/index.module.scss | 100 - .../src/components/app/detail/logs/Filter.tsx | 199 - .../src/components/app/detail/logs/Header.tsx | 164 - .../components/app/detail/logs/LogCounts.tsx | 80 - .../components/app/detail/logs/LogTable.tsx | 243 - .../src/components/apps/appList.tsx | 609 --- .../src/components/apps/empty.tsx | 27 - .../components/apps/list/columns/Actions.tsx | 88 - .../src/components/apps/list/columns/CPU.tsx | 31 - .../apps/list/columns/CreateTime.tsx | 13 - .../src/components/apps/list/columns/GPU.tsx | 22 - .../components/apps/list/columns/Memory.tsx | 31 - .../src/components/apps/list/columns/Name.tsx | 57 - .../components/apps/list/columns/Replicas.tsx | 31 - .../components/apps/list/columns/Status.tsx | 24 - .../components/apps/list/columns/Storage.tsx | 25 - .../src/components/apps/list/columns/index.ts | 9 - .../src/components/layouts/DetailLayout.tsx | 110 - .../src/components/layouts/Sidebar.tsx | 100 - frontend/providers/applaunchpad/src/config.ts | 19 - .../applaunchpad/src/constants/account.ts | 8 - .../applaunchpad/src/constants/app.ts | 113 - .../applaunchpad/src/constants/editApp.ts | 87 - .../applaunchpad/src/constants/monitor.ts | 85 - .../applaunchpad/src/constants/theme.ts | 24 - .../applaunchpad/src/hooks/driver.tsx | 324 -- .../applaunchpad/src/hooks/useAppOperation.ts | 167 - .../src/hooks/useClientAppConfig.ts | 8 - .../src/hooks/useClientSideValue.tsx | 11 - .../applaunchpad/src/hooks/useConfirm.tsx | 69 - .../applaunchpad/src/hooks/useLoading.tsx | 38 - .../applaunchpad/src/hooks/useRequest.tsx | 36 - .../applaunchpad/src/hooks/useScreen.ts | 25 - .../applaunchpad/src/hooks/useSelectFile.tsx | 34 - .../applaunchpad/src/hooks/useToast.ts | 37 - .../applaunchpad/src/instrumentation.ts | 39 - .../providers/applaunchpad/src/mock/apps.ts | 346 -- .../providers/applaunchpad/src/pages/404.tsx | 13 - .../providers/applaunchpad/src/pages/_app.tsx | 361 -- .../applaunchpad/src/pages/_document.tsx | 22 - .../applaunchpad/src/pages/api-docs.tsx | 30 - .../applaunchpad-domain-challenge/[token].ts | 97 - .../applaunchpad/src/pages/api/applyApp.ts | 62 - .../applaunchpad/src/pages/api/checkReady.ts | 101 - .../applaunchpad/src/pages/api/delApp.ts | 148 - .../src/pages/api/getAppByAppName.ts | 113 - .../src/pages/api/getAppPodsByAppName.ts | 43 - .../applaunchpad/src/pages/api/getApps.ts | 64 - .../src/pages/api/getPodEvents.ts | 37 - .../src/pages/api/getPodEventsAnalyses.ts | 155 - .../applaunchpad/src/pages/api/getPodLogs.ts | 140 - .../src/pages/api/getPodsMetrics.ts | 44 - .../src/pages/api/guide/checkTask.ts | 53 - .../src/pages/api/guide/getTasks.ts | 67 - .../src/pages/api/kubeFileSystem/download.ts | 31 - .../src/pages/api/kubeFileSystem/ls.ts | 30 - .../src/pages/api/kubeFileSystem/mkdir.ts | 29 - .../src/pages/api/kubeFileSystem/mv.ts | 30 - .../src/pages/api/kubeFileSystem/rm.ts | 29 - .../src/pages/api/kubeFileSystem/touch.ts | 29 - .../src/pages/api/kubeFileSystem/upload.ts | 72 - .../src/pages/api/log/queryLogs.ts | 113 - .../src/pages/api/log/queryPodList.ts | 92 - .../src/pages/api/monitor/getMonitorData.ts | 163 - .../src/pages/api/monitor/getMonitorDataV2.ts | 133 - .../api/monitor/getNetworkMonitorData.ts | 206 - .../applaunchpad/src/pages/api/pauseApp.ts | 66 - .../src/pages/api/platform/authCname.ts | 35 - .../pages/api/platform/authDomainChallenge.ts | 661 --- .../src/pages/api/platform/checkIcpReg.ts | 40 - .../src/pages/api/platform/checkPermission.ts | 69 - .../pages/api/platform/getClientAppConfig.ts | 46 - .../src/pages/api/platform/resourcePrice.ts | 90 - .../applaunchpad/src/pages/api/remark.ts | 74 - .../applaunchpad/src/pages/api/restartApp.ts | 85 - .../applaunchpad/src/pages/api/restartPod.ts | 26 - .../applaunchpad/src/pages/api/startApp.ts | 66 - .../applaunchpad/src/pages/api/updateApp.ts | 417 -- .../src/pages/api/v1/app/[name]/configmap.ts | 154 - .../src/pages/api/v1/app/[name]/index.ts | 1048 ----- .../src/pages/api/v1/app/[name]/pause.ts | 40 - .../src/pages/api/v1/app/[name]/restart.ts | 47 - .../src/pages/api/v1/app/[name]/start.ts | 40 - .../src/pages/api/v1/app/[name]/storage.ts | 283 -- .../src/pages/api/v1/app/index.ts | 76 - .../applaunchpad/src/pages/api/v1/openapi.ts | 15 - .../src/pages/api/v1alpha/createApp.ts | 40 - .../src/pages/api/v1alpha/delAppByName.ts | 26 - .../src/pages/api/v1alpha/getAppByAppName.ts | 36 - .../pages/api/v1alpha/getAppPodsByAppName.ts | 42 - .../src/pages/api/v1alpha/getApps.ts | 17 - .../src/pages/api/v1alpha/getPodsMetrics.ts | 25 - .../src/pages/api/v1alpha/updateReplica.ts | 213 - .../pages/api/v2alpha/apps/[name]/index.ts | 1081 ----- .../pages/api/v2alpha/apps/[name]/pause.ts | 78 - .../pages/api/v2alpha/apps/[name]/restart.ts | 70 - .../pages/api/v2alpha/apps/[name]/start.ts | 77 - .../pages/api/v2alpha/apps/[name]/storage.ts | 284 -- .../src/pages/api/v2alpha/apps/index.ts | 105 - .../src/pages/api/v2alpha/docs.ts | 29 - .../src/pages/api/v2alpha/k8sContext.ts | 214 - .../src/pages/api/v2alpha/openapi.ts | 18 - .../src/pages/app/detail/advanced.tsx | 29 - .../src/pages/app/detail/index.tsx | 69 - .../src/pages/app/detail/logs.tsx | 396 -- .../src/pages/app/detail/monitor.tsx | 826 ---- .../app/edit/components/ConfigmapModal.tsx | 145 - .../app/edit/components/CustomAccessModal.tsx | 462 -- .../edit/components/DomainNotBoundModal.tsx | 67 - .../pages/app/edit/components/EditEnvs.tsx | 120 - .../pages/app/edit/components/ErrorModal.tsx | 76 - .../src/pages/app/edit/components/Form.tsx | 1457 ------ .../src/pages/app/edit/components/Header.tsx | 147 - .../app/edit/components/NetworkSection.tsx | 546 --- .../pages/app/edit/components/PriceBox.tsx | 128 - .../pages/app/edit/components/QuotaBox.tsx | 91 - .../pages/app/edit/components/StoreModal.tsx | 247 - .../src/pages/app/edit/components/Yaml.tsx | 143 - .../app/edit/components/index.module.scss | 51 - .../applaunchpad/src/pages/app/edit/index.tsx | 650 --- .../providers/applaunchpad/src/pages/apps.tsx | 156 - .../applaunchpad/src/pages/doc/v2alpha.tsx | 30 - .../applaunchpad/src/pages/icons.tsx | 51 - .../applaunchpad/src/pages/redirect.tsx | 70 - .../src/services/backend/acsApiClient.ts | 220 - .../src/services/backend/acsCdnActions.ts | 73 - .../src/services/backend/appService.ts | 984 ---- .../applaunchpad/src/services/backend/auth.ts | 39 - .../applaunchpad/src/services/backend/gpu.ts | 55 - .../src/services/backend/index.ts | 27 - .../src/services/backend/kubernetes.ts | 244 - .../src/services/backend/middleware.ts | 55 - .../src/services/backend/response.ts | 48 - .../applaunchpad/src/services/dns-resolver.ts | 953 ---- .../applaunchpad/src/services/kubernet.ts | 5 - .../applaunchpad/src/services/logFetch.ts | 27 - .../applaunchpad/src/services/monitorFetch.ts | 27 - .../src/services/monitorFetchV2.ts | 111 - .../src/services/networkMonitorFetch.ts | 125 - .../applaunchpad/src/services/request.ts | 96 - .../applaunchpad/src/services/streamFetch.ts | 67 - .../providers/applaunchpad/src/store/app.ts | 217 - .../providers/applaunchpad/src/store/date.ts | 33 - .../applaunchpad/src/store/global.ts | 53 - .../providers/applaunchpad/src/store/guide.ts | 38 - .../applaunchpad/src/store/logStore.ts | 72 - .../providers/applaunchpad/src/store/user.ts | 43 - .../applaunchpad/src/styles/global.scss | 111 - .../applaunchpad/src/styles/reset.scss | 136 - .../applaunchpad/src/styles/tailwind.css | 276 -- .../providers/applaunchpad/src/types/app.d.ts | 245 - .../applaunchpad/src/types/config.ts | 200 - .../applaunchpad/src/types/i18next.d.ts | 9 - .../providers/applaunchpad/src/types/index.ts | 10 - .../applaunchpad/src/types/monitor.d.ts | 49 - .../applaunchpad/src/types/openapi.ts | 442 -- .../applaunchpad/src/types/request_schema.ts | 663 --- .../applaunchpad/src/types/response.ts | 33 - .../applaunchpad/src/types/schema.ts | 294 -- .../applaunchpad/src/types/user.d.ts | 64 - .../applaunchpad/src/types/v2alpha/error.ts | 384 -- .../applaunchpad/src/types/v2alpha/openapi.ts | 1822 -------- .../src/types/v2alpha/request_schema.ts | 659 --- .../applaunchpad/src/types/v2alpha/schema.ts | 276 -- .../providers/applaunchpad/src/utils/adapt.ts | 630 --- .../src/utils/appNameValidation.ts | 54 - .../applaunchpad/src/utils/cookieUtils.ts | 15 - .../applaunchpad/src/utils/deployYaml2Json.ts | 638 --- .../applaunchpad/src/utils/dotenvEnv.ts | 73 - .../src/utils/hydrateLegacyAppForm.ts | 73 - .../providers/applaunchpad/src/utils/i18n.ts | 12 - .../applaunchpad/src/utils/kubeFileSystem.ts | 413 -- .../applaunchpad/src/utils/network-url.ts | 62 - .../applaunchpad/src/utils/pauseResume.ts | 118 - .../providers/applaunchpad/src/utils/pod.ts | 4 - .../src/utils/resourceQuantity.ts | 84 - .../applaunchpad/src/utils/storage-usage.ts | 145 - .../applaunchpad/src/utils/timeRange.ts | 185 - .../providers/applaunchpad/src/utils/tools.ts | 534 --- .../providers/applaunchpad/src/utils/touch.ts | 0 .../providers/applaunchpad/src/utils/user.ts | 38 - frontend/providers/applaunchpad/tsconfig.json | 26 - .../providers/applaunchpad/vitest.config.mts | 78 - frontend/providers/license/README.md | 2 +- 362 files changed, 1 insertion(+), 49384 deletions(-) delete mode 100644 frontend/providers/applaunchpad/.dockerignore delete mode 100644 frontend/providers/applaunchpad/.eslintrc.json delete mode 100644 frontend/providers/applaunchpad/.gitignore delete mode 100644 frontend/providers/applaunchpad/.prettierignore delete mode 100644 frontend/providers/applaunchpad/.prettierrc.js delete mode 100644 frontend/providers/applaunchpad/.vscode/settings.json delete mode 100644 frontend/providers/applaunchpad/Makefile delete mode 100644 frontend/providers/applaunchpad/README.md delete mode 100644 frontend/providers/applaunchpad/__tests__/components/network-configuration-table-layout.test.tsx delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/api/app.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/pages/api/checkReady.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/pages/api/platform/authDomainChallenge.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/pages/api/v1alpha/createApp.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/pages/api/v2alpha/docs.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/pages/app/network-service-identity.test.tsx delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/services/backend/acs-cdn-actions.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/services/dns-resolver.fixture.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/services/dns-resolver.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/store/app.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/types/appNameRequestSchema.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/types/request_schema.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/adapt.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/appNameValidation.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/deployYaml2Json.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/dotenvEnv.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/network-url.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/pod.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/resource.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/resourceQuantity.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/storage-usage.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/timeRange.test.ts delete mode 100644 frontend/providers/applaunchpad/__tests__/unit/utils/tools.test.ts delete mode 100644 frontend/providers/applaunchpad/data/config.example.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/Kubefile delete mode 100755 frontend/providers/applaunchpad/deploy/applaunchpad-frontend-entrypoint.sh delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/Chart.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/applaunchpad-frontend-values.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/_helpers.tpl delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/app.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/configmap.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/deployment.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/ingress.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/templates/service.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/charts/applaunchpad-frontend/values.yaml delete mode 100644 frontend/providers/applaunchpad/deploy/images/shim/images delete mode 100644 frontend/providers/applaunchpad/global.d.ts delete mode 100644 frontend/providers/applaunchpad/i18nrc.json delete mode 100644 frontend/providers/applaunchpad/next-i18next.config.js delete mode 100644 frontend/providers/applaunchpad/next.config.js delete mode 100644 frontend/providers/applaunchpad/package.json delete mode 100644 frontend/providers/applaunchpad/postcss.config.mjs delete mode 100644 frontend/providers/applaunchpad/public/favicon.ico delete mode 100644 frontend/providers/applaunchpad/public/guide-image.png delete mode 100644 frontend/providers/applaunchpad/public/images/list-empty.svg delete mode 100644 frontend/providers/applaunchpad/public/images/no_errors_found.svg delete mode 100644 frontend/providers/applaunchpad/public/locales/en/common.json delete mode 100644 frontend/providers/applaunchpad/public/locales/zh/common.json delete mode 100644 frontend/providers/applaunchpad/public/logo.svg delete mode 100644 frontend/providers/applaunchpad/public/openapi.json delete mode 100644 frontend/providers/applaunchpad/src/api/app.ts delete mode 100644 frontend/providers/applaunchpad/src/api/kubeFile.ts delete mode 100644 frontend/providers/applaunchpad/src/api/params.d.ts delete mode 100644 frontend/providers/applaunchpad/src/api/platform.ts delete mode 100644 frontend/providers/applaunchpad/src/api/tools.ts delete mode 100644 frontend/providers/applaunchpad/src/components/AdvancedSelect/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/AppStatusTag/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/BaseTable/SwitchPage.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/BaseTable/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/ButtonGroup/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/DatePicker/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/ErrorModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/FormControl/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/GPUItem/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/analyze.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/appType.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/arrowLeft.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/arrowRight.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/calendar.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/change.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/chart.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/configMap-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/configMap.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/container.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/continue.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/copy.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/delete.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/deployMode.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/detail.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/download.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/edit.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/emptyChart.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/enlarge.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/export.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/csv-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/csv.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/defaul-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/default.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-line.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/folder.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/html2-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/html2.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/png-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/png.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/txt-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/txt.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/formInfo.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/gift.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia-green.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/hardDrive.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/help.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/home.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/listen.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/loading.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/log.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/logo.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/monitor.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/more.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/network.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/noEvents.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/pause.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/plus.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/podList.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/pods.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/refresh.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/rename.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/restart.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/search.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/settings.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/start.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/statusicon.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/store-color.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/store.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/target.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/terminal.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/to.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/upload.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/upperRight.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/icons/warning.svg delete mode 100644 frontend/providers/applaunchpad/src/components/Icon/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/LangSelect/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/LogBarChart/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/Monitor/Header.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/Monitor/Time.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/MonitorChart/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/PodLineChart/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/PodPieChart/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/TruncateTooltip/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/YamlCode/hljs.ts delete mode 100644 frontend/providers/applaunchpad/src/components/YamlCode/index.module.scss delete mode 100644 frontend/providers/applaunchpad/src/components/YamlCode/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/AdvancedInfo.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/AppBaseInfo.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/AppMainInfo.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/ConfigMapDetailModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/DelModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/Header.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/ICPStatus.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/LogsModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/MonitorModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/NetworkConfigurationTable.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/PodDetailModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/PodFileModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/Pods.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/UpdateModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/empty.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/index/index.module.scss delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/logs/Filter.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/logs/Header.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/logs/LogCounts.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/app/detail/logs/LogTable.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/appList.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/empty.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Actions.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/CPU.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/CreateTime.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/GPU.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Memory.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Name.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Replicas.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Status.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/Storage.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/apps/list/columns/index.ts delete mode 100644 frontend/providers/applaunchpad/src/components/layouts/DetailLayout.tsx delete mode 100644 frontend/providers/applaunchpad/src/components/layouts/Sidebar.tsx delete mode 100644 frontend/providers/applaunchpad/src/config.ts delete mode 100644 frontend/providers/applaunchpad/src/constants/account.ts delete mode 100644 frontend/providers/applaunchpad/src/constants/app.ts delete mode 100644 frontend/providers/applaunchpad/src/constants/editApp.ts delete mode 100644 frontend/providers/applaunchpad/src/constants/monitor.ts delete mode 100644 frontend/providers/applaunchpad/src/constants/theme.ts delete mode 100644 frontend/providers/applaunchpad/src/hooks/driver.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useAppOperation.ts delete mode 100644 frontend/providers/applaunchpad/src/hooks/useClientAppConfig.ts delete mode 100644 frontend/providers/applaunchpad/src/hooks/useClientSideValue.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useConfirm.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useLoading.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useRequest.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useScreen.ts delete mode 100644 frontend/providers/applaunchpad/src/hooks/useSelectFile.tsx delete mode 100644 frontend/providers/applaunchpad/src/hooks/useToast.ts delete mode 100644 frontend/providers/applaunchpad/src/instrumentation.ts delete mode 100644 frontend/providers/applaunchpad/src/mock/apps.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/404.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/_app.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/_document.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/api-docs.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/api/.well-known/applaunchpad-domain-challenge/[token].ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/applyApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/checkReady.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/delApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getAppByAppName.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getAppPodsByAppName.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getApps.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getPodEvents.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getPodEventsAnalyses.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getPodLogs.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/getPodsMetrics.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/guide/checkTask.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/guide/getTasks.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/download.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/ls.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/mkdir.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/mv.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/rm.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/touch.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/kubeFileSystem/upload.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/log/queryLogs.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/log/queryPodList.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/monitor/getMonitorData.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/monitor/getMonitorDataV2.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/monitor/getNetworkMonitorData.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/pauseApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/authCname.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/authDomainChallenge.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/checkIcpReg.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/checkPermission.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/getClientAppConfig.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/platform/resourcePrice.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/remark.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/restartApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/restartPod.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/startApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/updateApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/configmap.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/index.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/pause.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/restart.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/start.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/[name]/storage.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/app/index.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1/openapi.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/createApp.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/delAppByName.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/getAppByAppName.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/getAppPodsByAppName.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/getApps.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/getPodsMetrics.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v1alpha/updateReplica.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/[name]/index.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/[name]/pause.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/[name]/restart.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/[name]/start.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/[name]/storage.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/apps/index.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/docs.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/k8sContext.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/api/v2alpha/openapi.ts delete mode 100644 frontend/providers/applaunchpad/src/pages/app/detail/advanced.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/detail/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/detail/logs.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/detail/monitor.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/ConfigmapModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/CustomAccessModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/DomainNotBoundModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/EditEnvs.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/ErrorModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/Form.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/Header.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/NetworkSection.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/PriceBox.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/QuotaBox.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/StoreModal.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/Yaml.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/components/index.module.scss delete mode 100644 frontend/providers/applaunchpad/src/pages/app/edit/index.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/apps.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/doc/v2alpha.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/icons.tsx delete mode 100644 frontend/providers/applaunchpad/src/pages/redirect.tsx delete mode 100644 frontend/providers/applaunchpad/src/services/backend/acsApiClient.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/acsCdnActions.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/appService.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/auth.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/gpu.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/index.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/kubernetes.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/middleware.ts delete mode 100644 frontend/providers/applaunchpad/src/services/backend/response.ts delete mode 100644 frontend/providers/applaunchpad/src/services/dns-resolver.ts delete mode 100644 frontend/providers/applaunchpad/src/services/kubernet.ts delete mode 100644 frontend/providers/applaunchpad/src/services/logFetch.ts delete mode 100644 frontend/providers/applaunchpad/src/services/monitorFetch.ts delete mode 100644 frontend/providers/applaunchpad/src/services/monitorFetchV2.ts delete mode 100644 frontend/providers/applaunchpad/src/services/networkMonitorFetch.ts delete mode 100644 frontend/providers/applaunchpad/src/services/request.ts delete mode 100644 frontend/providers/applaunchpad/src/services/streamFetch.ts delete mode 100644 frontend/providers/applaunchpad/src/store/app.ts delete mode 100644 frontend/providers/applaunchpad/src/store/date.ts delete mode 100644 frontend/providers/applaunchpad/src/store/global.ts delete mode 100644 frontend/providers/applaunchpad/src/store/guide.ts delete mode 100644 frontend/providers/applaunchpad/src/store/logStore.ts delete mode 100644 frontend/providers/applaunchpad/src/store/user.ts delete mode 100644 frontend/providers/applaunchpad/src/styles/global.scss delete mode 100644 frontend/providers/applaunchpad/src/styles/reset.scss delete mode 100644 frontend/providers/applaunchpad/src/styles/tailwind.css delete mode 100644 frontend/providers/applaunchpad/src/types/app.d.ts delete mode 100644 frontend/providers/applaunchpad/src/types/config.ts delete mode 100644 frontend/providers/applaunchpad/src/types/i18next.d.ts delete mode 100644 frontend/providers/applaunchpad/src/types/index.ts delete mode 100644 frontend/providers/applaunchpad/src/types/monitor.d.ts delete mode 100644 frontend/providers/applaunchpad/src/types/openapi.ts delete mode 100644 frontend/providers/applaunchpad/src/types/request_schema.ts delete mode 100644 frontend/providers/applaunchpad/src/types/response.ts delete mode 100644 frontend/providers/applaunchpad/src/types/schema.ts delete mode 100644 frontend/providers/applaunchpad/src/types/user.d.ts delete mode 100644 frontend/providers/applaunchpad/src/types/v2alpha/error.ts delete mode 100644 frontend/providers/applaunchpad/src/types/v2alpha/openapi.ts delete mode 100644 frontend/providers/applaunchpad/src/types/v2alpha/request_schema.ts delete mode 100644 frontend/providers/applaunchpad/src/types/v2alpha/schema.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/adapt.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/appNameValidation.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/cookieUtils.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/deployYaml2Json.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/dotenvEnv.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/hydrateLegacyAppForm.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/i18n.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/kubeFileSystem.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/network-url.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/pauseResume.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/pod.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/resourceQuantity.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/storage-usage.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/timeRange.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/tools.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/touch.ts delete mode 100644 frontend/providers/applaunchpad/src/utils/user.ts delete mode 100644 frontend/providers/applaunchpad/tsconfig.json delete mode 100644 frontend/providers/applaunchpad/vitest.config.mts diff --git a/.github/workflows/frontends.yml b/.github/workflows/frontends.yml index d2c8d56a9..d6d73de27 100644 --- a/.github/workflows/frontends.yml +++ b/.github/workflows/frontends.yml @@ -84,8 +84,6 @@ jobs: - '.github/workflows/frontends.yml' license: - 'frontend/providers/license/**' - applaunchpad: - - 'frontend/providers/applaunchpad/**' costcenter: - 'frontend/providers/costcenter/**' desktop: @@ -98,7 +96,6 @@ jobs: FORCE_ALL: ${{ inputs.force_all }} EVENT_NAME: ${{ github.event_name }} LICENSE_CHANGED: ${{ steps.filter.outputs.license }} - APPLAUNCHPAD_CHANGED: ${{ steps.filter.outputs.applaunchpad }} COSTCENTER_CHANGED: ${{ steps.filter.outputs.costcenter }} DESKTOP_CHANGED: ${{ steps.filter.outputs.desktop }} run: | @@ -111,14 +108,12 @@ jobs: "$EVENT_NAME" == "workflow_dispatch" ]]; then modules=( "providers/license" - "providers/applaunchpad" "providers/costcenter" "desktop" ) else # Only build changed modules [[ "$LICENSE_CHANGED" == "true" ]] && modules+=("providers/license") - [[ "$APPLAUNCHPAD_CHANGED" == "true" ]] && modules+=("providers/applaunchpad") [[ "$COSTCENTER_CHANGED" == "true" ]] && modules+=("providers/costcenter") [[ "$DESKTOP_CHANGED" == "true" ]] && modules+=("desktop") fi diff --git a/frontend/Makefile b/frontend/Makefile index d72014a05..c249be05e 100644 --- a/frontend/Makefile +++ b/frontend/Makefile @@ -16,7 +16,6 @@ endif buildTargets := \ desktop \ providers/costcenter \ - providers/applaunchpad \ providers/imagehub \ providers/license diff --git a/frontend/README.md b/frontend/README.md index 87e6478df..26a8da339 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -36,7 +36,6 @@ You can either run apps in workspace root or in specific app's directory. pnpm dev-desktop # Run specific provider app -pnpm dev-app # applaunchpad pnpm dev-cost # costcenter pnpm dev-template # template diff --git a/frontend/i18n.md b/frontend/i18n.md index 867eab981..0245d1b3d 100644 --- a/frontend/i18n.md +++ b/frontend/i18n.md @@ -62,7 +62,6 @@ export default staticContent; ### Translation File Paths - Desktop: [Desktop Translation Files](./desktop/public/locales) -- App Launchpad: [App Launchpad Translation Files](./providers/applaunchpad/public/locales) - Cost Center: [Cost Center Translation Files](./providers/costcenter/public/locales) - Cron Jobs: [Cron Jobs Translation Files](./providers/cronjob/public/locales) - Cloud Server: [Cloud Server Translation Files](./providers/cloudserver/public/locales) diff --git a/frontend/package.json b/frontend/package.json index 413971929..f569230ff 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,6 @@ "scripts": { "preinstall": "npx only-allow pnpm", "dev-desktop": "pnpm -r --filter ./desktop run dev", - "dev-app": "pnpm -r --filter ./providers/applaunchpad run dev", "dev-cost": "pnpm -r --filter ./providers/costcenter run dev", "dev-license": "pnpm -r --filter ./providers/license run dev", "gen:theme-typings": "pnpm chakra-cli tokens packages/ui/src/theme/theme.ts --out node_modules/.pnpm/node_modules/@chakra-ui/styled-system/dist/theming.types.d.ts", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index d673f7892..264db8a94 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -718,265 +718,6 @@ importers: specifier: ^5.2.2 version: 5.2.2 - providers/applaunchpad: - dependencies: - '@chakra-ui/anatomy': - specifier: ^2.2.1 - version: 2.2.2 - '@chakra-ui/icons': - specifier: ^2.1.1 - version: 2.1.1(@chakra-ui/system@2.6.2)(react@18.3.1) - '@chakra-ui/next-js': - specifier: ^2.1.5 - version: 2.2.0(@chakra-ui/react@2.8.2)(@emotion/react@11.11.1)(next@14.2.35)(react@18.3.1) - '@chakra-ui/react': - specifier: ^2.8.1 - version: 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.3.27)(framer-motion@10.16.5)(react-dom@18.3.1)(react@18.3.1) - '@chakra-ui/system': - specifier: ^2.6.1 - version: 2.6.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.3.1) - '@emotion/react': - specifier: ^11.11.1 - version: 11.11.1(@types/react@18.3.27)(react@18.3.1) - '@emotion/styled': - specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.3.27)(react@18.3.1) - '@kubernetes/client-node': - specifier: ^0.18.1 - version: 0.18.1 - '@scalar/api-reference-react': - specifier: ^0.8.36 - version: 0.8.36(axios@1.6.2)(nprogress@0.2.0)(react@18.3.1)(tailwindcss@4.1.18)(typescript@5.2.2) - '@sealos/driver': - specifier: workspace:^ - version: link:../../packages/driver - '@sealos/gtm': - specifier: workspace:^ - version: link:../../packages/gtm - '@sealos/shadcn-ui': - specifier: workspace:^ - version: link:../../packages/shadcn-ui - '@sealos/shared': - specifier: workspace:^ - version: link:../../packages/shared - '@sealos/ui': - specifier: workspace:^ - version: link:../../packages/ui - '@tanstack/react-query': - specifier: ^4.35.3 - version: 4.36.1(react-dom@18.3.1)(react@18.3.1) - '@tanstack/react-table': - specifier: ^8.10.7 - version: 8.10.7(react-dom@18.3.1)(react@18.3.1) - '@types/jsonwebtoken': - specifier: ^9.0.3 - version: 9.0.5 - ansi_up: - specifier: ^5.2.1 - version: 5.2.1 - axios: - specifier: ^1.5.1 - version: 1.6.2 - base64-stream: - specifier: ^1.0.0 - version: 1.0.0 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - decimal.js: - specifier: ^10.4.3 - version: 10.4.3 - dns: - specifier: ^0.2.2 - version: 0.2.2 - dns-packet: - specifier: ^5.6.1 - version: 5.6.1 - echarts: - specifier: ^5.4.3 - version: 5.4.3 - fast-json-patch: - specifier: ^3.1.1 - version: 3.1.1 - formidable: - specifier: ^3.5.1 - version: 3.5.1 - framer-motion: - specifier: ^10.16.4 - version: 10.16.5(react-dom@18.3.1)(react@18.3.1) - i18next: - specifier: ^23.11.5 - version: 23.12.1 - immer: - specifier: ^9.0.21 - version: 9.0.21 - js-base64: - specifier: ^3.7.7 - version: 3.7.7 - js-cookie: - specifier: ^3.0.5 - version: 3.0.5 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jszip: - specifier: ^3.10.1 - version: 3.10.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lucide-react: - specifier: ^0.476.0 - version: 0.476.0(react@18.3.1) - nanoid: - specifier: ^4.0.2 - version: 4.0.2 - next: - specifier: 14.2.35 - version: 14.2.35(@babel/core@7.28.5)(@playwright/test@1.59.1)(react-dom@18.3.1)(react@18.3.1)(sass@1.69.5) - next-i18next: - specifier: ^15.3.0 - version: 15.3.0(i18next@23.12.1)(next@14.2.35)(react-i18next@14.1.2)(react@18.3.1) - nprogress: - specifier: ^0.2.0 - version: 0.2.0 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - react: - specifier: 18.3.1 - version: 18.3.1 - react-day-picker: - specifier: ^9.11.1 - version: 9.11.1(react@18.3.1) - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) - react-hook-form: - specifier: ^7.46.2 - version: 7.48.2(react@18.3.1) - react-i18next: - specifier: ^14.1.2 - version: 14.1.2(i18next@23.12.1)(react-dom@18.3.1)(react@18.3.1) - react-markdown: - specifier: ^8.0.7 - version: 8.0.7(@types/react@18.3.27)(react@18.3.1) - react-syntax-highlighter: - specifier: ^15.5.0 - version: 15.5.0(react@18.3.1) - sass: - specifier: ^1.68.0 - version: 1.69.5 - sealos-desktop-sdk: - specifier: workspace:* - version: link:../../packages/client-sdk - sonner: - specifier: ^2.0.0 - version: 2.0.7(react-dom@18.3.1)(react@18.3.1) - typescript: - specifier: ^5.2.2 - version: 5.2.2 - zod: - specifier: ^4.3.5 - version: 4.3.5 - zod-openapi: - specifier: ^4.2.4 - version: 4.2.4(zod@4.3.5) - zustand: - specifier: ^4.4.1 - version: 4.4.7(@types/react@18.3.27)(immer@9.0.21)(react@18.3.1) - devDependencies: - '@svgr/webpack': - specifier: ^6.5.1 - version: 6.5.1 - '@tailwindcss/postcss': - specifier: ^4.1.10 - version: 4.1.18 - '@testing-library/dom': - specifier: ^10.4.1 - version: 10.4.1 - '@testing-library/react': - specifier: ^14.0.0 - version: 14.1.2(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) - '@types/base64-stream': - specifier: ^1.0.5 - version: 1.0.5 - '@types/dns-packet': - specifier: ^5.6.5 - version: 5.6.5 - '@types/formidable': - specifier: ^3.4.5 - version: 3.4.5 - '@types/js-cookie': - specifier: ^3.0.4 - version: 3.0.6 - '@types/js-yaml': - specifier: ^4.0.6 - version: 4.0.9 - '@types/lodash': - specifier: ^4.14.199 - version: 4.14.202 - '@types/node': - specifier: 18.13.0 - version: 18.13.0 - '@types/nprogress': - specifier: ^0.2.1 - version: 0.2.3 - '@types/react': - specifier: 18.3.27 - version: 18.3.27 - '@types/react-dom': - specifier: 18.3.7 - version: 18.3.7(@types/react@18.3.27) - '@types/react-syntax-highlighter': - specifier: ^15.5.7 - version: 15.5.10 - '@vitejs/plugin-react': - specifier: ^5.1.1 - version: 5.1.1(vite@7.2.6) - '@vitest/browser': - specifier: 4.0.15 - version: 4.0.15(vite@7.2.6)(vitest@4.0.15) - '@vitest/browser-playwright': - specifier: 4.0.15 - version: 4.0.15(playwright@1.59.1)(vite@7.2.6)(vitest@4.0.15) - '@vitest/ui': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.15) - eslint: - specifier: 8.33.0 - version: 8.33.0 - eslint-config-next: - specifier: 13.5.9 - version: 13.5.9(eslint@8.33.0)(typescript@5.2.2) - geist: - specifier: ^1.4.2 - version: 1.4.2(next@14.2.35) - jsdom: - specifier: ^27.2.0 - version: 27.2.0 - svg-inline-loader: - specifier: ^0.8.2 - version: 0.8.2 - tailwindcss: - specifier: ^4.1.10 - version: 4.1.18 - vite-tsconfig-paths: - specifier: ^5.1.4 - version: 5.1.4(typescript@5.2.2)(vite@7.2.6) - vitest: - specifier: ^4.0.12 - version: 4.0.15(@types/node@18.13.0)(@vitest/browser-playwright@4.0.15)(@vitest/ui@4.0.12)(jsdom@27.2.0)(sass@1.69.5) - webpack-bundle-analyzer: - specifier: ^4.9.1 - version: 4.10.1 - providers/costcenter: dependencies: '@alicloud/dysmsapi20170525': @@ -1372,10 +1113,6 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@acemir/cssom@0.9.24: - resolution: {integrity: sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==} - dev: true - /@alicloud/captcha20230305@1.1.3: resolution: {integrity: sha512-AUyW7z6xgtC+Khp0BuzerirKLuxCQcovwcsvXPUib5kCxsrKvWuVWrGyTHP9rIpA1pE9ijOlDw8domtgPlY/KQ==} dependencies: @@ -1500,30 +1237,6 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: false - /@asamuzakjp/css-color@4.1.0: - resolution: {integrity: sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==} - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.4 - dev: true - - /@asamuzakjp/dom-selector@6.7.5: - resolution: {integrity: sha512-Eks6dY8zau4m4wNRQjRVaKQRTalNcPcBvU1ZQ35w5kKRk1gUeNCkVLsRiATurjASTp3TKM4H10wsI50nx3NZdw==} - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.1.0 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.4 - dev: true - - /@asamuzakjp/nwsapi@2.3.9: - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - dev: true - /@babel/code-frame@7.23.4: resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} engines: {node: '>=6.9.0'} @@ -4060,171 +3773,6 @@ packages: '@chakra-ui/system': 2.6.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.3.1) react: 18.3.1 - /@codemirror/autocomplete@6.18.6: - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - dev: false - - /@codemirror/commands@6.8.1: - resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - dev: false - - /@codemirror/lang-css@6.3.1: - resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/css': 1.1.11 - dev: false - - /@codemirror/lang-html@6.4.9: - resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-css': 6.3.1 - '@codemirror/lang-javascript': 6.2.3 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/css': 1.1.11 - '@lezer/html': 1.3.10 - dev: false - - /@codemirror/lang-javascript@6.2.3: - resolution: {integrity: sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/lint': 6.8.5 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/javascript': 1.5.1 - dev: false - - /@codemirror/lang-json@6.0.1: - resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/json': 1.0.3 - dev: false - - /@codemirror/lang-xml@6.1.0: - resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/xml': 1.0.6 - dev: false - - /@codemirror/lang-yaml@6.1.2: - resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - '@lezer/yaml': 1.0.3 - dev: false - - /@codemirror/language@6.11.0: - resolution: {integrity: sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==} - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - style-mod: 4.1.2 - dev: false - - /@codemirror/lint@6.8.5: - resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - crelt: 1.0.6 - dev: false - - /@codemirror/state@6.5.2: - resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} - dependencies: - '@marijn/find-cluster-break': 1.0.2 - dev: false - - /@codemirror/view@6.36.6: - resolution: {integrity: sha512-uxugGLet+Nzp0Jcit8Hn3LypM8ioMLKTsdf8FRoT3HWvZtb9GhaWMe0Cc15rz90Ljab4YFJiAulmIVB74OY0IQ==} - dependencies: - '@codemirror/state': 6.5.2 - style-mod: 4.1.2 - w3c-keyname: 2.2.8 - dev: false - - /@csstools/color-helpers@5.1.0: - resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} - engines: {node: '>=18'} - dev: true - - /@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - dev: true - - /@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4): - resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5)(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - dev: true - - /@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4): - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 - dependencies: - '@csstools/css-tokenizer': 3.0.4 - dev: true - - /@csstools/css-syntax-patches-for-csstree@1.0.20: - resolution: {integrity: sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==} - engines: {node: '>=18'} - dev: true - - /@csstools/css-tokenizer@3.0.4: - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - dev: true - /@date-fns/tz@1.4.1: resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} dev: false @@ -4911,12 +4459,6 @@ packages: '@floating-ui/utils': 0.2.9 dev: false - /@floating-ui/core@1.7.3: - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - dependencies: - '@floating-ui/utils': 0.2.10 - dev: false - /@floating-ui/dom@1.6.13: resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} dependencies: @@ -4924,13 +4466,6 @@ packages: '@floating-ui/utils': 0.2.9 dev: false - /@floating-ui/dom@1.7.4: - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.10 - dev: false - /@floating-ui/react-dom@2.1.3(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} peerDependencies: @@ -4942,44 +4477,10 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@floating-ui/utils@0.2.10: - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - dev: false - /@floating-ui/utils@0.2.9: resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} dev: false - /@floating-ui/vue@1.1.9(vue@3.5.29): - resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} - dependencies: - '@floating-ui/dom': 1.7.4 - '@floating-ui/utils': 0.2.10 - vue-demi: 0.14.10(vue@3.5.29) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@headlessui/tailwindcss@0.2.2(tailwindcss@4.1.18): - resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} - engines: {node: '>=10'} - peerDependencies: - tailwindcss: ^3.0 || ^4.0 - dependencies: - tailwindcss: 4.1.18 - dev: false - - /@headlessui/vue@1.7.23(vue@3.5.29): - resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} - engines: {node: '>=10'} - peerDependencies: - vue: ^3.2.0 - dependencies: - '@tanstack/vue-virtual': 3.13.6(vue@3.5.29) - vue: 3.5.29(typescript@5.2.2) - dev: false - /@hookform/resolvers@3.9.0(react-hook-form@7.48.2): resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==} peerDependencies: @@ -5022,18 +4523,6 @@ packages: deprecated: Use @eslint/object-schema instead dev: true - /@internationalized/date@3.8.0: - resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==} - dependencies: - '@swc/helpers': 0.5.5 - dev: false - - /@internationalized/number@3.6.1: - resolution: {integrity: sha512-UVsb4bCwbL944E0SX50CHFtWEeZ2uB5VozZ5yDXJdq6iPZsZO5p+bjVMZh2GxHf4Bs/7xtDCcPwEa2NU9DaG/g==} - dependencies: - '@swc/helpers': 0.5.5 - dev: false - /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -5180,78 +4669,6 @@ packages: - bufferutil - utf-8-validate - /@leichtgewicht/ip-codec@2.0.5: - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - dev: false - - /@lezer/common@1.2.3: - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} - dev: false - - /@lezer/css@1.1.11: - resolution: {integrity: sha512-FuAnusbLBl1SEAtfN8NdShxYJiESKw9LAFysfea1T96jD3ydBn12oYjaSG1a04BQRIUd93/0D8e5CV1cUMkmQg==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@lezer/highlight@1.2.1: - resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} - dependencies: - '@lezer/common': 1.2.3 - dev: false - - /@lezer/html@1.3.10: - resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@lezer/javascript@1.5.1: - resolution: {integrity: sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@lezer/json@1.0.3: - resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@lezer/lr@1.4.2: - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} - dependencies: - '@lezer/common': 1.2.3 - dev: false - - /@lezer/xml@1.0.6: - resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@lezer/yaml@1.0.3: - resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - dev: false - - /@marijn/find-cluster-break@1.0.2: - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - dev: false - /@marsidev/react-turnstile@1.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-X7bP9ZYutDd+E+klPYF+/BJHqEyyVkN4KKmZcNRr84zs3DcMoftlMAuoKqNSnqg0HE7NQ1844+TLFSJoztCdSA==} peerDependencies: @@ -5529,10 +4946,6 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@phosphor-icons/core@2.1.1: - resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} - dev: false - /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -6669,18 +6082,6 @@ packages: '@redis/client': 1.6.1 dev: false - /@replit/codemirror-css-color-picker@6.3.0(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.6): - resolution: {integrity: sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - dev: false - /@rolldown/pluginutils@1.0.0-beta.47: resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} dev: true @@ -6982,421 +6383,6 @@ packages: /@rushstack/eslint-patch@1.6.0: resolution: {integrity: sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==} - /@scalar/analytics-client@1.0.1: - resolution: {integrity: sha512-ai4DJuxsNLUEgJIlYDE3n8/oF47M31Rgjz3LxbefzejxE8LiidUud/fcEzMYtdxqJYi3ketzhSbTWK0o6gg4mQ==} - engines: {node: '>=20'} - dependencies: - zod: 4.3.6 - dev: false - - /@scalar/api-client@2.21.1(axios@1.6.2)(nprogress@0.2.0)(tailwindcss@4.1.18)(typescript@5.2.2): - resolution: {integrity: sha512-jZO15BJ3kgMsi8kF6I4j23xAmRtSGQ/kaC4Tgahr1L50PrUCqHzwu+aQAjFq1FFGlTWsDAT2pPSpuXJcHWTh9g==} - engines: {node: '>=20'} - dependencies: - '@headlessui/tailwindcss': 0.2.2(tailwindcss@4.1.18) - '@headlessui/vue': 1.7.23(vue@3.5.29) - '@scalar/analytics-client': 1.0.1 - '@scalar/components': 0.16.32(typescript@5.2.2) - '@scalar/draggable': 0.3.0(typescript@5.2.2) - '@scalar/helpers': 0.2.9 - '@scalar/icons': 0.5.2(typescript@5.2.2) - '@scalar/import': 0.4.46 - '@scalar/json-magic': 0.9.4 - '@scalar/oas-utils': 0.6.29(typescript@5.2.2) - '@scalar/object-utils': 1.2.23 - '@scalar/openapi-parser': 0.24.5 - '@scalar/openapi-types': 0.5.3 - '@scalar/postman-to-openapi': 0.4.1 - '@scalar/sidebar': 0.7.22(typescript@5.2.2) - '@scalar/snippetz': 0.6.8 - '@scalar/themes': 0.13.26 - '@scalar/types': 0.5.10 - '@scalar/use-codemirror': 0.13.26(typescript@5.2.2) - '@scalar/use-hooks': 0.3.6(typescript@5.2.2) - '@scalar/use-toasts': 0.9.1(typescript@5.2.2) - '@scalar/workspace-store': 0.27.1(typescript@5.2.2) - '@types/har-format': 1.2.16 - '@vueuse/core': 13.9.0(vue@3.5.29) - '@vueuse/integrations': 13.9.0(axios@1.6.2)(focus-trap@7.6.4)(fuse.js@7.1.0)(nprogress@0.2.0)(vue@3.5.29) - focus-trap: 7.6.4 - fuse.js: 7.1.0 - js-base64: 3.7.8 - microdiff: 1.5.0 - nanoid: 5.1.6 - pretty-bytes: 7.1.0 - pretty-ms: 9.3.0 - shell-quote: 1.8.2 - type-fest: 5.3.1 - vue: 3.5.29(typescript@5.2.2) - vue-router: 4.6.2(vue@3.5.29) - whatwg-mimetype: 4.0.0 - yaml: 2.8.0 - zod: 4.3.6 - transitivePeerDependencies: - - '@vue/composition-api' - - async-validator - - axios - - change-case - - drauu - - idb-keyval - - jwt-decode - - nprogress - - qrcode - - sortablejs - - supports-color - - tailwindcss - - typescript - - universal-cookie - dev: false - - /@scalar/api-reference-react@0.8.36(axios@1.6.2)(nprogress@0.2.0)(react@18.3.1)(tailwindcss@4.1.18)(typescript@5.2.2): - resolution: {integrity: sha512-m4OzRO8cfmv9UQe9YQ7I9T26virQKyyCzyDrbCAKdDTn81ZQgN1LxGJ2e+GOh9bwCqJPs+2ud+OKApFsqTnx9A==} - engines: {node: '>=20'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - dependencies: - '@scalar/api-reference': 1.43.17(axios@1.6.2)(nprogress@0.2.0)(tailwindcss@4.1.18)(typescript@5.2.2) - '@scalar/types': 0.5.10 - react: 18.3.1 - transitivePeerDependencies: - - '@vue/composition-api' - - async-validator - - axios - - change-case - - drauu - - idb-keyval - - jwt-decode - - nprogress - - qrcode - - sortablejs - - supports-color - - tailwindcss - - typescript - - universal-cookie - dev: false - - /@scalar/api-reference@1.43.17(axios@1.6.2)(nprogress@0.2.0)(tailwindcss@4.1.18)(typescript@5.2.2): - resolution: {integrity: sha512-YeJUfd6gSER0lMtrY2VwuLEesUwxTik54za3N0Udhhy/OBwrrA//DtBfsv2Gd89zLvaocjXavdu9prXpqLndaw==} - engines: {node: '>=20'} - dependencies: - '@headlessui/vue': 1.7.23(vue@3.5.29) - '@scalar/api-client': 2.21.1(axios@1.6.2)(nprogress@0.2.0)(tailwindcss@4.1.18)(typescript@5.2.2) - '@scalar/code-highlight': 0.2.2 - '@scalar/components': 0.16.32(typescript@5.2.2) - '@scalar/helpers': 0.2.9 - '@scalar/icons': 0.5.2(typescript@5.2.2) - '@scalar/oas-utils': 0.6.29(typescript@5.2.2) - '@scalar/openapi-parser': 0.24.5 - '@scalar/openapi-types': 0.5.3 - '@scalar/sidebar': 0.7.22(typescript@5.2.2) - '@scalar/snippetz': 0.6.8 - '@scalar/themes': 0.13.26 - '@scalar/types': 0.5.10 - '@scalar/use-hooks': 0.3.6(typescript@5.2.2) - '@scalar/use-toasts': 0.9.1(typescript@5.2.2) - '@scalar/workspace-store': 0.27.1(typescript@5.2.2) - '@unhead/vue': 1.11.20(vue@3.5.29) - '@vueuse/core': 13.9.0(vue@3.5.29) - fuse.js: 7.1.0 - github-slugger: 2.0.0 - microdiff: 1.5.0 - nanoid: 5.1.6 - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - '@vue/composition-api' - - async-validator - - axios - - change-case - - drauu - - idb-keyval - - jwt-decode - - nprogress - - qrcode - - sortablejs - - supports-color - - tailwindcss - - typescript - - universal-cookie - dev: false - - /@scalar/code-highlight@0.2.2: - resolution: {integrity: sha512-sr2nV0ngVEw3hUPWISj6t0VRztUIbFqNxZNY8ZwpvYj6YoU99c1cng9+4njxi3d7F7YgbNMPL2PQ2bWQLQEknQ==} - engines: {node: '>=20'} - dependencies: - hast-util-to-text: 4.0.2 - highlight.js: 11.11.1 - highlightjs-curl: 1.3.0 - lowlight: 3.3.0 - rehype-external-links: 3.0.0 - rehype-format: 5.0.1 - rehype-parse: 9.0.1 - rehype-raw: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-stringify: 10.0.1 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remark-stringify: 11.0.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@scalar/components@0.16.32(typescript@5.2.2): - resolution: {integrity: sha512-JWYK8Hs3onAPmtw9qgqbCAwwxQtB0vvLw+olrsJ26Mg1WuY4w5vwF8J7MHbu6qMezsGzf0u0yRRld8twv1s+wA==} - engines: {node: '>=20'} - dependencies: - '@floating-ui/utils': 0.2.10 - '@floating-ui/vue': 1.1.9(vue@3.5.29) - '@headlessui/vue': 1.7.23(vue@3.5.29) - '@scalar/code-highlight': 0.2.2 - '@scalar/helpers': 0.2.9 - '@scalar/icons': 0.5.2(typescript@5.2.2) - '@scalar/oas-utils': 0.6.29(typescript@5.2.2) - '@scalar/themes': 0.13.26 - '@scalar/use-hooks': 0.3.6(typescript@5.2.2) - '@vueuse/core': 13.9.0(vue@3.5.29) - cva: 1.0.0-beta.4(typescript@5.2.2) - nanoid: 5.1.6 - pretty-bytes: 7.1.0 - radix-vue: 1.9.17(vue@3.5.29) - vue: 3.5.29(typescript@5.2.2) - vue-component-type-helpers: 3.2.5 - transitivePeerDependencies: - - '@vue/composition-api' - - supports-color - - typescript - dev: false - - /@scalar/draggable@0.3.0(typescript@5.2.2): - resolution: {integrity: sha512-T/79XY5HGNo9Lte7wlnrH393zjiulom4HuwW4u8RtaafWxIdtXykD2+TgiO0KTreyzCrWyWrESqiqKKJMe2nKg==} - engines: {node: '>=20'} - dependencies: - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - typescript - dev: false - - /@scalar/helpers@0.2.9: - resolution: {integrity: sha512-Y4ffJF0yELdwZ0BKgonqn3SumIgRn1WKyYCVHD+TDM7qRFChdGRypyt20+efHs26fmJeyBAIIv2laICj5uimiw==} - engines: {node: '>=20'} - dev: false - - /@scalar/icons@0.5.2(typescript@5.2.2): - resolution: {integrity: sha512-jN0qXmaR1zGW9vZ5HUkhD1StM+52t+GONYstbo199h7tDYSsY+oWxtkuYqdWESiNg1VtNyJ9PruMmTi/PVyq/A==} - engines: {node: '>=20'} - dependencies: - '@phosphor-icons/core': 2.1.1 - '@types/node': 22.19.11 - chalk: 5.4.1 - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - typescript - dev: false - - /@scalar/import@0.4.46: - resolution: {integrity: sha512-j6t8lXJULY3C69WMWvgI8EBNa0+kPF4n8ZggEI36OlGoEMHT57QRRAPyQR8165dqqHNjnX1jSK1uofD+yOHzUw==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - yaml: 2.8.0 - dev: false - - /@scalar/json-magic@0.9.4: - resolution: {integrity: sha512-PyfyWrH4ZkW0TM1ColiiHj4NRF8hUM61H0UzAkHLhRNnKFxi6hI+oqNrwqPnyk93hrpkpTRHC7Fl5T0BRwuzVg==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - yaml: 2.8.0 - dev: false - - /@scalar/oas-utils@0.6.29(typescript@5.2.2): - resolution: {integrity: sha512-A2P4Y9FHMUwaUmdwZIyTzK0WMxLV78S1opgkxe3+5CSbSUIUKPZwmDgnCyDOHJo3+pIMfDN9YQuj83lJd5D/Ng==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - '@scalar/json-magic': 0.9.4 - '@scalar/object-utils': 1.2.23 - '@scalar/openapi-types': 0.5.3 - '@scalar/themes': 0.13.26 - '@scalar/types': 0.5.10 - '@scalar/workspace-store': 0.27.1(typescript@5.2.2) - flatted: 3.3.3 - type-fest: 5.3.1 - yaml: 2.8.0 - zod: 4.3.6 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@scalar/object-utils@1.2.23: - resolution: {integrity: sha512-3kU9hjYqTufd6hd94gR41dMU/kswEFnRt5XMnAf6a7+OEPxHxANnEYtw5YnHQk2K55/J7zGZdiSIfii6GXfsMg==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - flatted: 3.3.3 - just-clone: 6.2.0 - ts-deepmerge: 7.0.3 - dev: false - - /@scalar/openapi-parser@0.24.5: - resolution: {integrity: sha512-pTeKnmhVdSIfG3vysgDm6jsKc7Do1vXdy/4aqp7j8AEzXllf8RZjSgRSUhtvFYFQCr27fDZ117V3WPQUYtgmCw==} - engines: {node: '>=20'} - dependencies: - '@scalar/json-magic': 0.9.4 - '@scalar/openapi-types': 0.5.3 - '@scalar/openapi-upgrader': 0.1.8 - ajv: 8.17.1 - ajv-draft-04: 1.0.0(ajv@8.17.1) - ajv-formats: 3.0.1(ajv@8.17.1) - jsonpointer: 5.0.1 - leven: 4.0.0 - yaml: 2.8.0 - dev: false - - /@scalar/openapi-types@0.5.3: - resolution: {integrity: sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw==} - engines: {node: '>=20'} - dependencies: - zod: 4.3.6 - dev: false - - /@scalar/openapi-upgrader@0.1.8: - resolution: {integrity: sha512-2xuYLLs0fBadLIk4I1ObjMiCnOyLPEMPf24A1HtHQvhKGDnGlvT63F2rU2Xw8lxCjgHnzveMPnOJEbwIy64RCg==} - engines: {node: '>=20'} - dependencies: - '@scalar/openapi-types': 0.5.3 - dev: false - - /@scalar/postman-to-openapi@0.4.1: - resolution: {integrity: sha512-rSO5gJbnv8ho0SsUFB3l0/d/eJydviWCqRlzuFA+LCYpfMZQGC59jJ08dxBSUGx27Opocf00EXZCeabl0rUryw==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - '@scalar/openapi-types': 0.5.3 - dev: false - - /@scalar/sidebar@0.7.22(typescript@5.2.2): - resolution: {integrity: sha512-jmrnBKzrhOCQqkOYwTfMvjOnZ69BCnstPS5tZKmu/6koNkbDAMZB3MZBuqOJn7BoJwTuNDC2/gs8DzCde09QVQ==} - engines: {node: '>=20'} - dependencies: - '@scalar/components': 0.16.32(typescript@5.2.2) - '@scalar/helpers': 0.2.9 - '@scalar/icons': 0.5.2(typescript@5.2.2) - '@scalar/themes': 0.13.26 - '@scalar/use-hooks': 0.3.6(typescript@5.2.2) - '@scalar/workspace-store': 0.27.1(typescript@5.2.2) - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - '@vue/composition-api' - - supports-color - - typescript - dev: false - - /@scalar/snippetz@0.6.8: - resolution: {integrity: sha512-eW596kFCIyiie3/2UGIWRf3lHBpHB9H9eRJ/pYlPvRXiQH14hQNwxfr/EWYTA6IxG3xFkZnMFwLDiPoEc+P35w==} - engines: {node: '>=20'} - dependencies: - '@scalar/types': 0.5.10 - js-base64: 3.7.8 - stringify-object: 5.0.0 - dev: false - - /@scalar/themes@0.13.26: - resolution: {integrity: sha512-uS4gek85aDYH663DAiXaXmEMz/NuzBDL6oIGvb+Z8KNYGb7GSSTbFJky+l13ru7juyuDqZIwJ9isk1SnGzm1Zg==} - engines: {node: '>=20'} - dependencies: - nanoid: 5.1.5 - dev: false - - /@scalar/typebox@0.1.3: - resolution: {integrity: sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==} - dev: false - - /@scalar/types@0.5.10: - resolution: {integrity: sha512-37qAHQC2J7O+Mt8u0HOZttTQPQ1OEWKWxo9SMbahYKTosL9k1KtTG2F3EB33EkW3WqEVQitkUKrM0+MVM2HeYQ==} - engines: {node: '>=20'} - dependencies: - '@scalar/helpers': 0.2.9 - nanoid: 5.1.6 - type-fest: 5.3.1 - zod: 4.3.6 - dev: false - - /@scalar/use-codemirror@0.13.26(typescript@5.2.2): - resolution: {integrity: sha512-k8d8ss9oQpiRELTC7J37RlvYLx3RqVXHmIpraGaDfwHtlgGcEhDjy4rb+jB13j/22h8vOtghVSDz08MvBmBNhw==} - engines: {node: '>=20'} - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 - '@codemirror/lang-css': 6.3.1 - '@codemirror/lang-html': 6.4.9 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lang-xml': 6.1.0 - '@codemirror/lang-yaml': 6.1.2 - '@codemirror/language': 6.11.0 - '@codemirror/lint': 6.8.5 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@replit/codemirror-css-color-picker': 6.3.0(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.6) - '@scalar/components': 0.16.32(typescript@5.2.2) - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - '@vue/composition-api' - - supports-color - - typescript - dev: false - - /@scalar/use-hooks@0.3.6(typescript@5.2.2): - resolution: {integrity: sha512-VX/kAmnxDjXi+Gcjm5OP0fV9+t+4UTy9SoK6Z0SXEKoFbAIW2jsq52sfnIeNzdEotxaUulwUIOlX0yj2HaedyQ==} - engines: {node: '>=20'} - dependencies: - '@scalar/use-toasts': 0.9.1(typescript@5.2.2) - '@vueuse/core': 13.9.0(vue@3.5.29) - cva: 1.0.0-beta.2(typescript@5.2.2) - tailwind-merge: 2.6.0 - vue: 3.5.29(typescript@5.2.2) - zod: 4.3.6 - transitivePeerDependencies: - - typescript - dev: false - - /@scalar/use-toasts@0.9.1(typescript@5.2.2): - resolution: {integrity: sha512-t8QoQO4ZWekiSdJ2O7C+PbXfv7x2fmhv3C7t/iITdNpOyLv4jAhlELGpxQHkWsU0ZwRrLU8e+rV0jJcKWE6vYA==} - engines: {node: '>=20'} - dependencies: - vue: 3.5.29(typescript@5.2.2) - vue-sonner: 1.3.2 - transitivePeerDependencies: - - typescript - dev: false - - /@scalar/workspace-store@0.27.1(typescript@5.2.2): - resolution: {integrity: sha512-v65ja0HSo0QuEYU/o4WFlHY+uWxmc2F2bYXviOPCFdSGNztpKVeT7UelJjWwv78NltNiHJ4XkE510cJYp2ZMiQ==} - engines: {node: '>=18'} - dependencies: - '@scalar/code-highlight': 0.2.2 - '@scalar/helpers': 0.2.9 - '@scalar/json-magic': 0.9.4 - '@scalar/object-utils': 1.2.23 - '@scalar/openapi-upgrader': 0.1.8 - '@scalar/snippetz': 0.6.8 - '@scalar/themes': 0.13.26 - '@scalar/typebox': 0.1.3 - '@scalar/types': 0.5.10 - github-slugger: 2.0.0 - type-fest: 5.3.1 - vue: 3.5.29(typescript@5.2.2) - yaml: 2.8.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /@sindresorhus/base62@1.0.0: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} @@ -7590,18 +6576,6 @@ packages: tailwindcss: 4.1.10 dev: false - /@tailwindcss/node@4.1.18: - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.4 - jiti: 2.6.1 - lightningcss: 1.30.2 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.1.18 - dev: true - /@tailwindcss/oxide-android-arm64@4.1.10: resolution: {integrity: sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==} engines: {node: '>= 10'} @@ -7611,15 +6585,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-android-arm64@4.1.18: - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-darwin-arm64@4.1.10: resolution: {integrity: sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==} engines: {node: '>= 10'} @@ -7629,15 +6594,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-darwin-arm64@4.1.18: - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-darwin-x64@4.1.10: resolution: {integrity: sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==} engines: {node: '>= 10'} @@ -7647,15 +6603,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-darwin-x64@4.1.18: - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-freebsd-x64@4.1.10: resolution: {integrity: sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==} engines: {node: '>= 10'} @@ -7665,15 +6612,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-freebsd-x64@4.1.18: - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10: resolution: {integrity: sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==} engines: {node: '>= 10'} @@ -7683,15 +6621,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18: - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-linux-arm64-gnu@4.1.10: resolution: {integrity: sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==} engines: {node: '>= 10'} @@ -7702,15 +6631,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-linux-arm64-gnu@4.1.18: - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-linux-arm64-musl@4.1.10: resolution: {integrity: sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==} engines: {node: '>= 10'} @@ -7721,15 +6641,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-linux-arm64-musl@4.1.18: - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-linux-x64-gnu@4.1.10: resolution: {integrity: sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==} engines: {node: '>= 10'} @@ -7740,15 +6651,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-linux-x64-gnu@4.1.18: - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-linux-x64-musl@4.1.10: resolution: {integrity: sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==} engines: {node: '>= 10'} @@ -7759,15 +6661,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-linux-x64-musl@4.1.18: - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-wasm32-wasi@4.1.10: resolution: {integrity: sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==} engines: {node: '>=14.0.0'} @@ -7783,21 +6676,6 @@ packages: - '@emnapi/wasi-threads' - tslib - /@tailwindcss/oxide-wasm32-wasi@4.1.18: - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - requiresBuild: true - dev: true - optional: true - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - /@tailwindcss/oxide-win32-arm64-msvc@4.1.10: resolution: {integrity: sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==} engines: {node: '>= 10'} @@ -7807,15 +6685,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-win32-arm64-msvc@4.1.18: - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide-win32-x64-msvc@4.1.10: resolution: {integrity: sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==} engines: {node: '>= 10'} @@ -7825,15 +6694,6 @@ packages: dev: false optional: true - /@tailwindcss/oxide-win32-x64-msvc@4.1.18: - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@tailwindcss/oxide@4.1.10: resolution: {integrity: sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==} engines: {node: '>= 10'} @@ -7856,24 +6716,6 @@ packages: '@tailwindcss/oxide-win32-x64-msvc': 4.1.10 dev: false - /@tailwindcss/oxide@4.1.18: - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - dev: true - /@tailwindcss/postcss@4.1.10: resolution: {integrity: sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ==} dependencies: @@ -7884,16 +6726,6 @@ packages: tailwindcss: 4.1.10 dev: false - /@tailwindcss/postcss@4.1.18: - resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - postcss: 8.5.6 - tailwindcss: 4.1.18 - dev: true - /@tanstack/query-core@4.36.1: resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} @@ -7952,33 +6784,6 @@ packages: engines: {node: '>=12'} dev: false - /@tanstack/virtual-core@3.13.6: - resolution: {integrity: sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==} - dev: false - - /@tanstack/vue-virtual@3.13.6(vue@3.5.29): - resolution: {integrity: sha512-GYdZ3SJBQPzgxhuCE2fvpiH46qzHiVx5XzBSdtESgiqh4poj8UgckjGWYEhxaBbcVt1oLzh1m3Ql4TyH32TOzQ==} - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - dependencies: - '@tanstack/virtual-core': 3.13.6 - vue: 3.5.29(typescript@5.2.2) - dev: false - - /@testing-library/dom@10.4.1: - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.26.0 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - dev: true - /@testing-library/dom@9.3.3: resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} engines: {node: '>=14'} @@ -8047,12 +6852,6 @@ packages: '@babel/types': 7.27.0 dev: true - /@types/base64-stream@1.0.5: - resolution: {integrity: sha512-gXuo/a7pQ1EXlR5ksM2MccBLl6UUgAgnzR01r/QoHnkaSNinmzSdaGcCq5NAxn72dZ5A1zNYQIl+J9hPsBgBrA==} - dependencies: - '@types/node': 20.17.32 - dev: true - /@types/caseless@0.12.5: resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} @@ -8073,22 +6872,10 @@ packages: resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} dev: true - /@types/dns-packet@5.6.5: - resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} - dependencies: - '@types/node': 20.17.32 - dev: true - /@types/estree@1.0.8: resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} dev: true - /@types/formidable@3.4.5: - resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} - dependencies: - '@types/node': 20.17.32 - dev: true - /@types/fs-extra@8.1.5: resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} dependencies: @@ -8102,22 +6889,12 @@ packages: '@types/node': 20.17.32 dev: true - /@types/har-format@1.2.16: - resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} - dev: false - /@types/hast@2.3.8: resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} dependencies: '@types/unist': 2.0.10 dev: false - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - dependencies: - '@types/unist': 3.0.2 - dev: false - /@types/hoist-non-react-statics@3.3.5: resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} dependencies: @@ -8162,12 +6939,6 @@ packages: '@types/unist': 2.0.10 dev: false - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - dependencies: - '@types/unist': 3.0.2 - dev: false - /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true @@ -8213,12 +6984,6 @@ packages: dependencies: undici-types: 6.19.8 - /@types/node@22.19.11: - resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} - dependencies: - undici-types: 6.21.0 - dev: false - /@types/nodemailer@6.4.15: resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==} dependencies: @@ -8287,22 +7052,10 @@ packages: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} dev: false - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false - /@types/uuid@9.0.7: resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} dev: true - /@types/web-bluetooth@0.0.20: - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - dev: false - - /@types/web-bluetooth@0.0.21: - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - dev: false - /@types/webidl-conversions@7.0.3: resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} dev: false @@ -8400,27 +7153,6 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.21.0(eslint@8.33.0)(typescript@5.2.2): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - eslint: 8.33.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.36.0)(typescript@5.2.2): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -8639,39 +7371,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@unhead/dom@1.11.20: - resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} - dependencies: - '@unhead/schema': 1.11.20 - '@unhead/shared': 1.11.20 - dev: false - - /@unhead/schema@1.11.20: - resolution: {integrity: sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==} - dependencies: - hookable: 5.5.3 - zhead: 2.2.4 - dev: false - - /@unhead/shared@1.11.20: - resolution: {integrity: sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==} - dependencies: - '@unhead/schema': 1.11.20 - packrup: 0.1.2 - dev: false - - /@unhead/vue@1.11.20(vue@3.5.29): - resolution: {integrity: sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==} - peerDependencies: - vue: '>=2.7 || >=3' - dependencies: - '@unhead/schema': 1.11.20 - '@unhead/shared': 1.11.20 - hookable: 5.5.3 - unhead: 1.11.20 - vue: 3.5.29(typescript@5.2.2) - dev: false - /@vercel/mcp-adapter@0.9.1(@modelcontextprotocol/sdk@1.12.1)(next@14.2.35): resolution: {integrity: sha512-qvlO8b+wwxwe81MY7iHV0FowO2pFk4SIeq9oUPQQ4uXqKe54rrnqvXcLT5IJ2XpF+aiVMpgOFYofa2XJbwYKcg==} hasBin: true @@ -8770,12 +7469,6 @@ packages: vite: 7.2.6(@types/node@18.15.11)(sass@1.69.5) dev: true - /@vitest/pretty-format@4.0.12: - resolution: {integrity: sha512-R7nMAcnienG17MvRN8TPMJiCG8rrZJblV9mhT7oMFdBXvS0x+QD6S1G4DxFusR2E0QIS73f7DqSR1n87rrmE+g==} - dependencies: - tinyrainbow: 3.0.3 - dev: true - /@vitest/pretty-format@4.0.15: resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} dependencies: @@ -8801,28 +7494,6 @@ packages: resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} dev: true - /@vitest/ui@4.0.12(vitest@4.0.15): - resolution: {integrity: sha512-RCqeApCnbwd5IFvxk6OeKMXTvzHU/cVqY8HAW0gWk0yAO6wXwQJMKhDfDtk2ss7JCy9u7RNC3kyazwiaDhBA/g==} - peerDependencies: - vitest: 4.0.12 - dependencies: - '@vitest/utils': 4.0.12 - fflate: 0.8.2 - flatted: 3.3.3 - pathe: 2.0.3 - sirv: 3.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@18.13.0)(@vitest/browser-playwright@4.0.15)(@vitest/ui@4.0.12)(jsdom@27.2.0)(sass@1.69.5) - dev: true - - /@vitest/utils@4.0.12: - resolution: {integrity: sha512-DVS/TLkLdvGvj1avRy0LSmKfrcI9MNFvNGN6ECjTUHWJdlcgPDOXhjMis5Dh7rBH62nAmSXnkPbE+DZ5YD75Rw==} - dependencies: - '@vitest/pretty-format': 4.0.12 - tinyrainbow: 3.0.3 - dev: true - /@vitest/utils@4.0.15: resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} dependencies: @@ -8830,183 +7501,6 @@ packages: tinyrainbow: 3.0.3 dev: true - /@vue/compiler-core@3.5.29: - resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} - dependencies: - '@babel/parser': 7.29.0 - '@vue/shared': 3.5.29 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - dev: false - - /@vue/compiler-dom@3.5.29: - resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} - dependencies: - '@vue/compiler-core': 3.5.29 - '@vue/shared': 3.5.29 - dev: false - - /@vue/compiler-sfc@3.5.29: - resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} - dependencies: - '@babel/parser': 7.29.0 - '@vue/compiler-core': 3.5.29 - '@vue/compiler-dom': 3.5.29 - '@vue/compiler-ssr': 3.5.29 - '@vue/shared': 3.5.29 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.6 - source-map-js: 1.2.1 - dev: false - - /@vue/compiler-ssr@3.5.29: - resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} - dependencies: - '@vue/compiler-dom': 3.5.29 - '@vue/shared': 3.5.29 - dev: false - - /@vue/devtools-api@6.6.4: - resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - dev: false - - /@vue/reactivity@3.5.29: - resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} - dependencies: - '@vue/shared': 3.5.29 - dev: false - - /@vue/runtime-core@3.5.29: - resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} - dependencies: - '@vue/reactivity': 3.5.29 - '@vue/shared': 3.5.29 - dev: false - - /@vue/runtime-dom@3.5.29: - resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} - dependencies: - '@vue/reactivity': 3.5.29 - '@vue/runtime-core': 3.5.29 - '@vue/shared': 3.5.29 - csstype: 3.2.3 - dev: false - - /@vue/server-renderer@3.5.29(vue@3.5.29): - resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} - peerDependencies: - vue: 3.5.29 - dependencies: - '@vue/compiler-ssr': 3.5.29 - '@vue/shared': 3.5.29 - vue: 3.5.29(typescript@5.2.2) - dev: false - - /@vue/shared@3.5.29: - resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} - dev: false - - /@vueuse/core@10.11.1(vue@3.5.29): - resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.11.1 - '@vueuse/shared': 10.11.1(vue@3.5.29) - vue-demi: 0.14.10(vue@3.5.29) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@vueuse/core@13.9.0(vue@3.5.29): - resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} - peerDependencies: - vue: ^3.5.0 - dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 13.9.0 - '@vueuse/shared': 13.9.0(vue@3.5.29) - vue: 3.5.29(typescript@5.2.2) - dev: false - - /@vueuse/integrations@13.9.0(axios@1.6.2)(focus-trap@7.6.4)(fuse.js@7.1.0)(nprogress@0.2.0)(vue@3.5.29): - resolution: {integrity: sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 || ^8 - vue: ^3.5.0 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - dependencies: - '@vueuse/core': 13.9.0(vue@3.5.29) - '@vueuse/shared': 13.9.0(vue@3.5.29) - axios: 1.6.2 - focus-trap: 7.6.4 - fuse.js: 7.1.0 - nprogress: 0.2.0 - vue: 3.5.29(typescript@5.2.2) - dev: false - - /@vueuse/metadata@10.11.1: - resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} - dev: false - - /@vueuse/metadata@13.9.0: - resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} - dev: false - - /@vueuse/shared@10.11.1(vue@3.5.29): - resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} - dependencies: - vue-demi: 0.14.10(vue@3.5.29) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@vueuse/shared@13.9.0(vue@3.5.29): - resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} - peerDependencies: - vue: ^3.5.0 - dependencies: - vue: 3.5.29(typescript@5.2.2) - dev: false - /@zag-js/dom-query@0.16.0: resolution: {integrity: sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==} @@ -9027,14 +7521,6 @@ packages: requiresBuild: true optional: true - /accepts@1.0.7: - resolution: {integrity: sha512-iq8ew2zitUlNcUca0wye3fYwQ6sSPItDo38oC0R+XA5KTzeXRN+GF7NjOXs3dVItj4J+gQVdpq4/qbnMb1hMHw==} - engines: {node: '>= 0.8.0'} - dependencies: - mime-types: 1.0.2 - negotiator: 0.4.7 - dev: false - /accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -9074,10 +7560,6 @@ packages: hasBin: true dev: true - /after@0.8.1: - resolution: {integrity: sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==} - dev: false - /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -9091,28 +7573,6 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - /ajv-draft-04@1.0.0(ajv@8.17.1): - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.17.1 - dev: false - - /ajv-formats@3.0.1(ajv@8.17.1): - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.17.1 - dev: false - /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -9121,15 +7581,6 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - dev: false - /ansi-escapes@7.0.0: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} @@ -9198,12 +7649,6 @@ packages: deep-equal: 2.2.3 dev: true - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true - /aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -9344,14 +7789,6 @@ packages: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - /arraybuffer.slice@0.0.6: - resolution: {integrity: sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==} - dev: false - - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false - /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: @@ -9369,10 +7806,6 @@ packages: /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - /async@0.2.10: - resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} - dev: false - /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} @@ -9402,10 +7835,6 @@ packages: /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - /aws-sign@0.2.0: - resolution: {integrity: sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==} - dev: false - /aws4@1.12.0: resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} @@ -9513,49 +7942,19 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /base64-arraybuffer@0.1.2: - resolution: {integrity: sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==} - engines: {node: '>= 0.6.0'} - dev: false - /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /base64-stream@1.0.0: - resolution: {integrity: sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==} - dev: false - - /base64id@0.1.0: - resolution: {integrity: sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==} - engines: {node: '>= 0.4.0'} - dev: false - /baseline-browser-mapping@2.9.0: resolution: {integrity: sha512-Mh++g+2LPfzZToywfE1BUzvZbfOY52Nil0rn9H1CPC5DJ7fX+Vir7nToBeoiSbB1zTNeGYbELEvJESujgGrzXw==} hasBin: true - /basic-auth@1.0.0: - resolution: {integrity: sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==} - dev: false - /bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 - /better-assert@1.0.2: - resolution: {integrity: sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==} - dependencies: - callsite: 1.0.0 - dev: false - - /bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - dependencies: - require-from-string: 2.0.2 - dev: true - /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true @@ -9568,11 +7967,6 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /binaryheap@0.0.3: - resolution: {integrity: sha512-9JFb4Yt5R9FZwbJaxOayF+T5sxn5eiU2NA9/LOeI1g2FUFRTdxpdmWppikO4O5AbNze8s0sL6ZuFxB1y4Ay8GA==} - engines: {node: '>= 0.6.0'} - dev: false - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -9581,28 +7975,11 @@ packages: readable-stream: 3.6.2 dev: false - /blob@0.0.2: - resolution: {integrity: sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==} - dev: false - /block-stream2@2.1.0: resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} dependencies: readable-stream: 3.6.2 - /body-parser@1.5.0: - resolution: {integrity: sha512-UJfZike68QN1mdo0mA+Z0y+0qi10oxOrCPw2CZpP73O/LIfEWHDy9SHhwsME1mdk1WmnltBLddUkfBpuKPH4Ng==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 1.0.0 - depd: 0.4.2 - iconv-lite: 0.4.4 - media-typer: 0.2.0 - qs: 0.6.6 - raw-body: 1.3.0 - type-is: 1.3.2 - dev: false - /body-parser@2.2.0: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} @@ -9624,14 +8001,6 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /boom@0.3.8: - resolution: {integrity: sha512-wTAE8aPTB971DLEE1Xfaw/5uSDqm7wGEJqUIza150BTelZieRvvzkLZO7fK3BeaiYClpJ5OYunQHqp5Jp7xrSQ==} - engines: {node: 0.8.x} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). - dependencies: - hoek: 0.7.6 - dev: false - /boring-avatars@1.11.2: resolution: {integrity: sha512-3+wkwPeObwS4R37FGXMYViqc4iTrIRj5yzfX9Qy4mnpZ26sX41dGMhsAgmKks1r/uufY1pl4vpgzMWHYfJRb2A==} dev: false @@ -9681,10 +8050,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - /buffer-crc32@0.2.3: - resolution: {integrity: sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==} - dev: false - /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} dev: false @@ -9700,13 +8065,6 @@ packages: ieee754: 1.2.1 dev: false - /buffercursor@0.0.12: - resolution: {integrity: sha512-Z+6Jm/eW6ITeqcFQKVXX7LYIGk7rENqCKHJ4CbWfJMeLpQZJj1v70WehkLmp+1kFN/QyCgpQ3Z0dKUHAwSbf9w==} - engines: {node: '>= 0.5.0'} - dependencies: - verror: 1.10.1 - dev: false - /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -9722,10 +8080,6 @@ packages: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} engines: {node: '>=0.10.0'} - /bytes@1.0.0: - resolution: {integrity: sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==} - dev: false - /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -9771,10 +8125,6 @@ packages: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - /callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - dev: false - /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -9794,10 +8144,6 @@ packages: /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - /chai@6.2.1: resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} @@ -9837,18 +8183,10 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false - /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: false - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false - /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} dev: false @@ -10004,18 +8342,6 @@ packages: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true - /colors@0.6.2: - resolution: {integrity: sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==} - engines: {node: '>=0.1.90'} - dev: false - - /combined-stream@0.0.7: - resolution: {integrity: sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 0.0.5 - dev: false - /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -10030,11 +8356,6 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@0.6.1: - resolution: {integrity: sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==} - engines: {node: '>= 0.4.x'} - dev: false - /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -10068,36 +8389,12 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /component-bind@1.0.0: - resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} - dev: false - - /component-emitter@1.1.2: - resolution: {integrity: sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==} - dev: false - - /component-inherit@0.0.3: - resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} - dev: false - /compute-scroll-into-view@3.0.3: resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /connect@3.0.2: - resolution: {integrity: sha512-k3kqw6T2Fc5ihvh5VVjwuJHA++qvh0/rPfe2GkJ5QNSQ9tRigQXMjtX2CYf73KZFe4+IV3HfQ3VR3W+nkt0eWQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 1.0.3 - finalhandler: 0.0.2 - parseurl: 1.1.3 - utils-merge: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /content-disposition@1.0.0: resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} engines: {node: '>= 0.6'} @@ -10116,23 +8413,11 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /cookie-jar@0.2.0: - resolution: {integrity: sha512-yImk9AY90xjoUsN2fWHoIhVgveXqiZv7LDqUTZEzVBHyzfay8AjcJITUZpz2fTYLh6rnP+7GogiuRCo/5j2epg==} - dev: false - - /cookie-signature@1.0.4: - resolution: {integrity: sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==} - dev: false - /cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} dev: false - /cookie@0.1.2: - resolution: {integrity: sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==} - dev: false - /cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -10191,10 +8476,6 @@ packages: warning: 4.0.3 dev: false - /crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - dev: false - /croner@8.0.2: resolution: {integrity: sha512-HgSdlSUX8mIgDTTiQpWUP4qY4IFRMsduPCYdca34Pelt8MVdxdaDOzreFtCscA6R+cRZd7UbD1CD3uyx6J3X1A==} engines: {node: '>=18.0'} @@ -10216,14 +8497,6 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /cryptiles@0.1.3: - resolution: {integrity: sha512-YI0PphzKlfxoNvaUPpkf8x+TUssMJimL1pPIEgj+8WSx0PQtfesYms/dua8Rn+KZWqoCL4AxcxHZJS9nd/oLPw==} - engines: {node: 0.8.x} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). - dependencies: - boom: 0.3.8 - dev: false - /css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} dependencies: @@ -10247,14 +8520,6 @@ packages: source-map: 0.6.1 dev: true - /css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 - dev: true - /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -10267,50 +8532,12 @@ packages: css-tree: 1.1.3 dev: true - /cssstyle@5.3.3: - resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==} - engines: {node: '>=20'} - dependencies: - '@asamuzakjp/css-color': 4.1.0 - '@csstools/css-syntax-patches-for-csstree': 1.0.20 - css-tree: 3.1.0 - dev: true - /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} /csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - /cva@1.0.0-beta.2(typescript@5.2.2): - resolution: {integrity: sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg==} - peerDependencies: - typescript: '>= 4.5.5 < 6' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - clsx: 2.1.1 - typescript: 5.2.2 - dev: false - - /cva@1.0.0-beta.4(typescript@5.2.2): - resolution: {integrity: sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ==} - peerDependencies: - typescript: '>= 4.5.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - clsx: 2.1.1 - typescript: 5.2.2 - dev: false - - /cycle@1.0.3: - resolution: {integrity: sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==} - engines: {node: '>=0.4.0'} - dev: false - /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -10325,14 +8552,6 @@ packages: engines: {node: '>= 12'} dev: false - /data-urls@6.0.0: - resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} - engines: {node: '>=20'} - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - dev: true - /data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -10380,46 +8599,6 @@ packages: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true - /debug@0.6.0: - resolution: {integrity: sha512-2vIZf67+gMicLu8McscD1NNhMWbiTSJkhlByoTA1Gw54zOb/9IlxylYG+Kr9z1X2wZTHh1AMSp+YiMjYtLkVUA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dev: false - - /debug@0.7.4: - resolution: {integrity: sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dev: false - - /debug@1.0.2: - resolution: {integrity: sha512-T9bufXIzQvCa4VrTIpLvvwdLhH+wuBtvIJJA3xgzVcaVETGmTIWMfEXQEd1K4p8BaRmQJPn6MPut38H7YQ+iIA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 0.6.2 - dev: false - - /debug@1.0.3: - resolution: {integrity: sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 0.6.2 - dev: false - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -10479,10 +8658,6 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: false - /decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - dev: true - /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -10542,11 +8717,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /defaultable@0.7.2: - resolution: {integrity: sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==} - engines: {'0': node} - dev: false - /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} @@ -10571,29 +8741,10 @@ packages: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - /defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - dev: false - - /delayed-stream@0.0.5: - resolution: {integrity: sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==} - engines: {node: '>=0.4.0'} - dev: false - /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - /depd@0.3.0: - resolution: {integrity: sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==} - engines: {node: '>= 0.8.0'} - dev: false - - /depd@0.4.2: - resolution: {integrity: sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==} - engines: {node: '>= 0.8.0'} - dev: false - /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -10615,19 +8766,6 @@ packages: /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: false - - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - dependencies: - asap: 2.0.6 - wrappy: 1.0.2 - dev: false - /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} @@ -10643,30 +8781,6 @@ packages: resolution: {integrity: sha512-uLktJxoBV1xus1cCgjx6sPLH5aS9/AVtJ4FnDHY4Cvn/BDcCZdB/uKT0EMEYdAE1kMef/fzFDR8HHTCwLaiZJA==} dev: false - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - dev: false - - /dns@0.2.2: - resolution: {integrity: sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==} - engines: {node: '>= 0.10.0 < 0.11.0'} - hasBin: true - dependencies: - hbo-dnsd: 0.9.8 - native-dns: 0.6.1 - node-options: 0.0.6 - tomahawk: 0.1.6 - tomahawk-plugin-kv-memory-store: 0.0.3 - winston: 0.7.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -10788,10 +8902,6 @@ packages: zrender: 5.4.4 dev: false - /ee-first@1.0.3: - resolution: {integrity: sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==} - dev: false - /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -10826,49 +8936,6 @@ packages: once: 1.4.0 dev: false - /engine.io-client@1.3.1: - resolution: {integrity: sha512-bTOZMqAe7HXhyA/2T7Fve04b/ZZruTHSOqa+yn8U4RFSyRAVPePjopOgJOUNciEfuXo1gx850P5LzaQU28/p3w==} - dependencies: - component-emitter: 1.1.2 - component-inherit: 0.0.3 - debug: 0.7.4 - engine.io-parser: 1.0.6 - has-cors: 1.0.3 - indexof: 0.0.1 - parsejson: 0.0.1 - parseqs: 0.0.2 - parseuri: 0.0.2 - ws: 0.4.31 - xmlhttprequest: '@github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz' - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /engine.io-parser@1.0.6: - resolution: {integrity: sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==} - dependencies: - after: 0.8.1 - arraybuffer.slice: 0.0.6 - base64-arraybuffer: 0.1.2 - blob: 0.0.2 - utf8: 2.0.0 - dev: false - - /engine.io@1.3.1: - resolution: {integrity: sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==} - dependencies: - base64id: 0.1.0 - debug: 0.6.0 - engine.io-parser: 1.0.6 - ws: 0.4.31 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /enhanced-resolve@5.18.1: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} @@ -10876,14 +8943,6 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 - /enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -10892,16 +8951,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - /entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - dev: true - - /entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - dev: false - /environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -10912,14 +8961,6 @@ packages: dependencies: is-arrayish: 0.2.1 - /errorhandler@1.1.1: - resolution: {integrity: sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.0.7 - escape-html: 1.0.1 - dev: false - /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} @@ -11189,10 +9230,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - /escape-html@1.0.1: - resolution: {integrity: sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==} - dev: false - /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false @@ -11206,11 +9243,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - /eslint-config-next@13.1.6(eslint@8.33.0)(typescript@5.2.2): resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==} peerDependencies: @@ -11261,31 +9293,6 @@ packages: - supports-color dev: false - /eslint-config-next@13.5.9(eslint@8.33.0)(typescript@5.2.2): - resolution: {integrity: sha512-XcKvvXkTFJuxDtKyzZNCTLwLdG6KQGOl/9j3NDu5FQbksBPyQETQh7VjdgFcXYtyhhx7VDcKZ+44HAZaRcIWOw==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@next/eslint-plugin-next': 13.5.9 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/parser': 6.21.0(eslint@8.33.0)(typescript@5.2.2) - eslint: 8.33.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.33.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.33.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.33.0) - eslint-plugin-react: 7.37.2(eslint@8.33.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.33.0) - typescript: 5.2.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-config-next@13.5.9(eslint@8.36.0)(typescript@5.2.2): resolution: {integrity: sha512-XcKvvXkTFJuxDtKyzZNCTLwLdG6KQGOl/9j3NDu5FQbksBPyQETQh7VjdgFcXYtyhhx7VDcKZ+44HAZaRcIWOw==} peerDependencies: @@ -11366,29 +9373,6 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.33.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.4.1 - enhanced-resolve: 5.18.1 - eslint: 8.33.0 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.33.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.33.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.36.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11472,36 +9456,6 @@ packages: - supports-color dev: false - /eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.33.0): - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.33.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.33.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.33.0) - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.36.0): resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} @@ -11762,30 +9716,6 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y@6.10.2(eslint@8.33.0): - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.2 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.33.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.1 - dev: true - /eslint-plugin-jsx-a11y@6.10.2(eslint@8.36.0): resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} @@ -11937,33 +9867,6 @@ packages: string.prototype.matchall: 4.0.10 dev: false - /eslint-plugin-react@7.37.2(eslint@8.33.0): - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.1.0 - eslint: 8.33.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - dev: true - /eslint-plugin-react@7.37.2(eslint@8.36.0): resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} engines: {node: '>=4'} @@ -12339,36 +10242,6 @@ packages: express: 5.1.0 dev: false - /express@4.6.1: - resolution: {integrity: sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.0.7 - buffer-crc32: 0.2.3 - cookie: 0.1.2 - cookie-signature: 1.0.4 - debug: 1.0.3 - depd: 0.3.0 - escape-html: 1.0.1 - finalhandler: 0.0.3 - fresh: 0.2.2 - media-typer: 0.2.0 - merge-descriptors: 0.0.2 - methods: 1.1.0 - parseurl: 1.1.3 - path-to-regexp: 0.1.3 - proxy-addr: 1.0.1 - qs: 0.6.6 - range-parser: 1.0.0 - send: 0.6.0 - serve-static: 1.3.2 - type-is: 1.3.2 - utils-merge: 1.0.0 - vary: 0.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} @@ -12415,11 +10288,6 @@ packages: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} - /eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - dev: false - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -12437,20 +10305,12 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - dev: false - /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - dev: false - /fast-xml-parser@4.3.2: resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} hasBin: true @@ -12488,10 +10348,6 @@ packages: web-streams-polyfill: 3.3.3 dev: false - /fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - dev: true - /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -12521,26 +10377,6 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} - /finalhandler@0.0.2: - resolution: {integrity: sha512-SbpQfvWVwWEBlPTQyaM9gs0D5404ENTC0x2jzbb7t+P+EOD/cBlWjAAvfozIQYtOepUuNkxoLNLCK9/kS29f4w==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 1.0.2 - escape-html: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /finalhandler@0.0.3: - resolution: {integrity: sha512-/fqgssseNfnD8Y77HWyJKQ+1xbKu7bZl2LXfhFjkgeGg91WRMMO9GN1KKL53NnIG9g1H2Xq3iKrZkuIcAmjd0A==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 1.0.3 - escape-html: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /finalhandler@2.1.0: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} @@ -12582,12 +10418,6 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /finished@1.2.2: - resolution: {integrity: sha512-HPJ8x7Gn1pmTS1zWyMoXmQ1yxHkYHRoFsBI66ONq4PS9iWBJy1iHYXOSqMWNp3ksMXfrBpenkSwBhl9WG4zr4Q==} - dependencies: - ee-first: 1.0.3 - dev: false - /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -12605,12 +10435,6 @@ packages: dependencies: tslib: 2.6.2 - /focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} - dependencies: - tabbable: 6.2.0 - dev: false - /follow-redirects@1.15.3: resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} @@ -12650,22 +10474,9 @@ packages: signal-exit: 4.1.0 dev: false - /forever-agent@0.2.0: - resolution: {integrity: sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==} - dev: false - /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - /form-data@0.0.10: - resolution: {integrity: sha512-Z9/PpT/agxXi80nMpOH6GFD7XOr6mwk5aWMxDt/KMY+Nm7e4FnRMjddM4/mLPJhpmp6alY1F/1JQpRE6z07xng==} - engines: {node: '>= 0.6'} - dependencies: - async: 0.2.10 - combined-stream: 0.0.7 - mime: 1.2.11 - dev: false - /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -12712,14 +10523,6 @@ packages: fetch-blob: 3.2.0 dev: false - /formidable@3.5.1: - resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} - dependencies: - dezalgo: 1.0.4 - hexoid: 1.0.0 - once: 1.4.0 - dev: false - /formik@2.4.5(react@18.3.1): resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} peerDependencies: @@ -12763,10 +10566,6 @@ packages: dependencies: tslib: 2.4.0 - /fresh@0.2.2: - resolution: {integrity: sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==} - dev: false - /fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -12832,11 +10631,6 @@ packages: /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /fuse.js@7.1.0: - resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} - engines: {node: '>=10'} - dev: false - /gaxios@7.1.6: resolution: {integrity: sha512-aIQ0QL8Or8vsUhHyXGA6AohOFRrAAiHhrvsAG6myzcSlfhxSXtnwXA/pRuQTilFgjhLe30swK5rg1d7E1f8Izw==} engines: {node: '>=18'} @@ -12859,14 +10653,6 @@ packages: - supports-color dev: false - /geist@1.4.2(next@14.2.35): - resolution: {integrity: sha512-OQUga/KUc8ueijck6EbtT07L4tZ5+TZgjw8PyWfxo16sL5FWk7gNViPNU8hgCFjy6bJi9yuTP+CRpywzaGN8zw==} - peerDependencies: - next: '>=13.2.0' - dependencies: - next: 14.2.35(@babel/core@7.28.5)(@playwright/test@1.59.1)(react-dom@18.3.1)(react@18.3.1)(sass@1.69.5) - dev: true - /generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -12918,11 +10704,6 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - /get-own-enumerable-keys@1.0.0: - resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} - engines: {node: '>=14.16'} - dev: false - /get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -12969,10 +10750,6 @@ packages: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -13145,18 +10922,6 @@ packages: /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - /has-binary-data@0.1.1: - resolution: {integrity: sha512-XqIrqIgPlA2gxvHKudDsLJt8Xu8B4DvkHyUWGmLWYOAO0rFOL94Ds4NSveSZ1fCjWX22tQgIiRpDKAETex8GCQ==} - dependencies: - isarray: 0.0.1 - dev: false - - /has-cors@1.0.3: - resolution: {integrity: sha512-Mxk1ba23PNtB3zPigreijApS3uuH9bhgZkqQtLQj7ydWHsGeb9uOtk4gsK6mZj4rYG6VNS/CT9G1XkYfgItpKg==} - dependencies: - global: '@github.com/component/global/archive/v2.0.1.tar.gz' - dev: false - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -13216,170 +10981,14 @@ packages: dependencies: function-bind: 1.1.2 - /hast-util-embedded@3.0.0: - resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - dependencies: - '@types/hast': 3.0.4 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-format@1.1.0: - resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-minify-whitespace: 1.0.1 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.1 - unist-util-visit-parents: 6.0.1 - dev: false - - /hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.1.2 - vfile: 6.0.1 - vfile-message: 4.0.2 - dev: false - - /hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.0.0 - vfile: 6.0.1 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - dev: false - - /hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - dependencies: - '@types/hast': 3.0.4 - dev: false - - /hast-util-is-body-ok-link@3.0.1: - resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} - dependencies: - '@types/hast': 3.0.4 - dev: false - - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - dependencies: - '@types/hast': 3.0.4 - dev: false - - /hast-util-minify-whitespace@1.0.1: - resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - dev: false - /hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - dependencies: - '@types/hast': 3.0.4 - dev: false - - /hast-util-phrasing@3.0.1: - resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.1 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-sanitize@5.0.2: - resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 - unist-util-position: 5.0.0 - dev: false - - /hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - dev: false - - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: false - /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.4 - dev: false - /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: @@ -13390,75 +10999,15 @@ packages: space-separated-tokens: 1.1.5 dev: false - /hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 7.0.0 - space-separated-tokens: 2.0.2 - dev: false - - /hawk@0.10.2: - resolution: {integrity: sha512-BjpmnZ95odv7KOIsydfNTAxfGOGaVc6xbYL4fozWl45PWjDqskix0LHAekmGkpnrCAI6+AZRvJIXNTAllj+e6w==} - engines: {node: 0.8.x} - deprecated: This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues. - dependencies: - boom: 0.3.8 - cryptiles: 0.1.3 - hoek: 0.7.6 - sntp: 0.1.4 - dev: false - - /hbo-dnsd@0.9.8: - resolution: {integrity: sha512-mIj4V7OicuAlnSfvTXopd401Ba7eFFSL2L3EmM1NqlIWe1pJ/x9dyHqfnKXnJr5qSbNFLnadXvwNd3kURNy+ug==} - engines: {node: '>= 0.8'} - dependencies: - defaultable: 0.7.2 - optimist: 0.3.7 - dev: false - - /hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - dev: false - /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false - /highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - dev: false - - /highlightjs-curl@1.3.0: - resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} - dev: false - - /hoek@0.7.6: - resolution: {integrity: sha512-z75muWk69yyjWn6nNzJP0pnfgcewtSTs7uBolGUA7kWNdCYZukzHn3sYqUirhXul7qp9WBUwNT/7ieJZNveJqg==} - engines: {node: 0.8.x} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). - dev: false - /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 - /hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - dev: false - - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - dependencies: - whatwg-encoding: 3.1.1 - dev: true - /html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} dev: true @@ -13473,14 +11022,6 @@ packages: void-elements: 3.1.0 dev: false - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false - - /html-whitespace-sensitive-tag-names@3.0.1: - resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} - dev: false - /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -13492,16 +11033,6 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.3 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: true - /http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -13568,11 +11099,6 @@ packages: '@babel/runtime': 7.26.0 dev: false - /iconv-lite@0.4.4: - resolution: {integrity: sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==} - engines: {node: '>=0.8.0'} - dev: false - /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -13621,10 +11147,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - /indexof@0.0.1: - resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} - dev: false - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -13667,11 +11189,6 @@ packages: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: false - /ipaddr.js@0.1.2: - resolution: {integrity: sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==} - engines: {node: '>= 0.2.5'} - dev: false - /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -13681,11 +11198,6 @@ packages: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} - /is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} dev: false @@ -13860,11 +11372,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false - /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -13884,10 +11391,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} dev: false @@ -13905,11 +11408,6 @@ packages: call-bind: 1.0.8 has-tostringtag: 1.0.2 - /is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - dev: false - /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} @@ -13981,10 +11479,6 @@ packages: call-bind: 1.0.8 get-intrinsic: 1.3.0 - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false @@ -14056,24 +11550,11 @@ packages: hasBin: true dev: false - /jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - dev: true - /jose@4.15.4: resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} requiresBuild: true optional: true - /js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - dev: false - - /js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - dev: false - /js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -14106,41 +11587,6 @@ packages: engines: {node: '>=20.0.0'} dev: true - /jsdom@27.2.0: - resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - '@acemir/cssom': 0.9.24 - '@asamuzakjp/dom-selector': 6.7.5 - cssstyle: 5.3.3 - data-urls: 6.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -14171,10 +11617,6 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -14184,18 +11626,9 @@ packages: /json-stream@1.0.0: resolution: {integrity: sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==} - /json-stringify-safe@3.0.0: - resolution: {integrity: sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==} - dev: false - /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - /json3@3.2.6: - resolution: {integrity: sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==} - deprecated: Please use the native JSON object instead of JSON 3 - dev: false - /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -14230,11 +11663,6 @@ packages: resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} engines: {node: '>=12.0.0'} - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false - /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -14286,10 +11714,6 @@ packages: setimmediate: 1.0.5 dev: false - /just-clone@6.2.0: - resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} - dev: false - /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: @@ -14350,11 +11774,6 @@ packages: dependencies: language-subtag-registry: 0.3.22 - /leven@4.0.0: - resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -14368,15 +11787,6 @@ packages: immediate: 3.0.6 dev: false - /lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} @@ -14386,15 +11796,6 @@ packages: dev: false optional: true - /lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /lightningcss-darwin-x64@1.30.1: resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} @@ -14404,15 +11805,6 @@ packages: dev: false optional: true - /lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /lightningcss-freebsd-x64@1.30.1: resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} @@ -14422,15 +11814,6 @@ packages: dev: false optional: true - /lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /lightningcss-linux-arm-gnueabihf@1.30.1: resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} @@ -14440,15 +11823,6 @@ packages: dev: false optional: true - /lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /lightningcss-linux-arm64-gnu@1.30.1: resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} @@ -14459,16 +11833,6 @@ packages: dev: false optional: true - /lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true - optional: true - /lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} @@ -14479,16 +11843,6 @@ packages: dev: false optional: true - /lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - requiresBuild: true - dev: true - optional: true - /lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} @@ -14499,16 +11853,6 @@ packages: dev: false optional: true - /lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true - optional: true - /lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} @@ -14519,16 +11863,6 @@ packages: dev: false optional: true - /lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - requiresBuild: true - dev: true - optional: true - /lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} @@ -14538,15 +11872,6 @@ packages: dev: false optional: true - /lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /lightningcss-win32-x64-msvc@1.30.1: resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} @@ -14556,15 +11881,6 @@ packages: dev: false optional: true - /lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /lightningcss@1.30.1: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} @@ -14583,25 +11899,6 @@ packages: lightningcss-win32-x64-msvc: 1.30.1 dev: false - /lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} - engines: {node: '>= 12.0.0'} - dependencies: - detect-libc: 2.0.4 - optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - dev: true - /lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -14726,10 +12023,6 @@ packages: wrap-ansi: 9.0.0 dev: true - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -14743,24 +12036,11 @@ packages: highlight.js: 10.7.3 dev: false - /lowlight@3.3.0: - resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - highlight.js: 11.11.1 - dev: false - /lru-cache@10.1.0: resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} engines: {node: 14 || >=16.14} dev: false - /lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} - engines: {node: 20 || >=22} - dev: true - /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -14825,10 +12105,6 @@ packages: semver: 6.3.1 dev: true - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - /math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -14841,15 +12117,6 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: @@ -14869,101 +12136,6 @@ packages: - supports-color dev: false - /mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - dependencies: - '@types/mdast': 4.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.1 - dev: false - - /mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - dependencies: - '@types/mdast': 4.0.3 - unist-util-is: 6.0.0 - dev: false - /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: @@ -14977,59 +12149,16 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: '@types/mdast': 3.0.15 dev: false - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - dependencies: - '@types/mdast': 4.0.3 - dev: false - /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true - /mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - dev: true - - /media-typer@0.2.0: - resolution: {integrity: sha512-TSggxYk75oP4tae7JkT8InpcFGUP4340zg1dOWjcu9qcphaDKtXEuNUv3OD4vJ+gVTvIDK797W0uYeNm8qqsDg==} - engines: {node: '>= 0.8.0'} - dev: false - /media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -15041,10 +12170,6 @@ packages: dev: false optional: true - /merge-descriptors@0.0.2: - resolution: {integrity: sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==} - dev: false - /merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -15057,14 +12182,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /methods@1.1.0: - resolution: {integrity: sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==} - dev: false - - /microdiff@1.5.0: - resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} - dev: false - /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: @@ -15086,99 +12203,6 @@ packages: uvu: 0.5.6 dev: false - /micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - dependencies: - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: @@ -15187,14 +12211,6 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-factory-label@1.1.0: resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: @@ -15204,15 +12220,6 @@ packages: uvu: 0.5.6 dev: false - /micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: @@ -15220,13 +12227,6 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-factory-title@1.1.0: resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: @@ -15236,15 +12236,6 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-factory-whitespace@1.1.0: resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: @@ -15254,15 +12245,6 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: @@ -15270,25 +12252,12 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-util-chunked@1.1.0: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - dependencies: - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-classify-character@1.1.0: resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: @@ -15297,14 +12266,6 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-util-combine-extensions@1.1.0: resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: @@ -15312,25 +12273,12 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-util-decode-numeric-character-reference@1.1.0: resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - dependencies: - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-decode-string@1.1.0: resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: @@ -15340,55 +12288,26 @@ packages: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-encode@1.1.0: resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} dev: false - /micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - dev: false - /micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} dev: false - /micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - dev: false - /micromark-util-normalize-identifier@1.1.0: resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - dependencies: - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-resolve-all@1.1.0: resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 dev: false - /micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - dependencies: - micromark-util-types: 2.0.2 - dev: false - /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: @@ -15397,14 +12316,6 @@ packages: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-subtokenize@1.1.0: resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: @@ -15414,31 +12325,14 @@ packages: uvu: 0.5.6 dev: false - /micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - dev: false - /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: false - /micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - dev: false - /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: false - /micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - dev: false - /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: @@ -15463,30 +12357,6 @@ packages: - supports-color dev: false - /micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.3 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: false - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -15511,11 +12381,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /mime-types@1.0.2: - resolution: {integrity: sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==} - engines: {node: '>= 0.8.0'} - dev: false - /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -15529,10 +12394,6 @@ packages: mime-db: 1.54.0 dev: false - /mime@1.2.11: - resolution: {integrity: sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==} - dev: false - /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -15681,16 +12542,6 @@ packages: '@mongodb-js/saslprep': 1.1.1 dev: false - /morgan@1.2.0: - resolution: {integrity: sha512-VrasIzA69dsxJm1+MVWTLTiij3kiG33XPfGiexqstHpcSvSu/Z51W+FGQyIlbc3jZZuF2PFujsjw+YQvpXz3UA==} - engines: {node: '>= 0.8.0'} - dependencies: - basic-auth: 1.0.0 - bytes: 1.0.0 - depd: 0.4.2 - finished: 1.2.2 - dev: false - /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -15706,20 +12557,12 @@ packages: engines: {node: '>=10'} dev: true - /ms@0.6.2: - resolution: {integrity: sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==} - dev: false - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /nan@0.3.2: - resolution: {integrity: sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==} - dev: false - /nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -15731,54 +12574,13 @@ packages: hasBin: true dev: false - /nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} - engines: {node: ^18 || >=20} - hasBin: true - dev: false - - /nanoid@5.1.6: - resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} - engines: {node: ^18 || >=20} - hasBin: true - dev: false - /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false - /native-dns-cache@0.0.2: - resolution: {integrity: sha512-09HXHdb/updxfigaFbR53F8nCKqxM8WuHfTWBsusVlwSSZZ3qwWRdD6Kx2x8HBI1Q5IaycwcJOvBoXZWJNfVEg==} - engines: {node: '>= 0.5.0'} - dependencies: - binaryheap: 0.0.3 - native-dns-packet: 0.1.1 - dev: false - - /native-dns-packet@0.1.1: - resolution: {integrity: sha512-j1XxnFFTUB7mujma468WyAOmyVtkuuLTelxJF13tSTIPO56X7bHALrG0G4jFQnvyTPCt4VnFiZezWpfKbaHc+g==} - engines: {node: '>= 0.5.0'} - dependencies: - buffercursor: 0.0.12 - ipaddr.js: 2.1.0 - dev: false - - /native-dns@0.6.1: - resolution: {integrity: sha512-svX0dstdoFeEO1sD1Kkrrj/Ad7QfHuczp2YpRnBpjJHqh0dpYLZhLERbf76S6LMkLAT5eZ8tJrPwZciIX5pj6Q==} - engines: {node: '>= 0.5.0'} - dependencies: - ipaddr.js: 2.1.0 - native-dns-cache: 0.0.2 - native-dns-packet: 0.1.1 - dev: false - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /negotiator@0.4.7: - resolution: {integrity: sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==} - dev: false - /negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -15999,20 +12801,9 @@ packages: formdata-polyfill: 4.0.10 dev: false - /node-options@0.0.6: - resolution: {integrity: sha512-OrfY9+LgcLjoo2oyqxjP3gZLBuNDV1IblF69HGLdbE8JUJxSnl2kB561r41KOMc1GWLspjMSfa9L6+iW4fvYrw==} - engines: {node: '>= 0.6.0'} - dev: false - /node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - /node-uuid@1.4.8: - resolution: {integrity: sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==} - deprecated: Use uuid module instead - hasBin: true - dev: false - /nodemailer@6.9.13: resolution: {integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==} engines: {node: '>=6.0.0'} @@ -16046,10 +12837,6 @@ packages: boolbase: 1.0.0 dev: true - /oauth-sign@0.2.0: - resolution: {integrity: sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==} - dev: false - /oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -16057,10 +12844,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-component@0.0.3: - resolution: {integrity: sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==} - dev: false - /object-deep-merge@2.0.0: resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} dev: true @@ -16246,12 +13029,6 @@ packages: oidc-token-hash: 5.0.3 optional: true - /optimist@0.3.7: - resolution: {integrity: sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==} - dependencies: - wordwrap: 0.0.3 - dev: false - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -16263,11 +13040,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /options@0.0.6: - resolution: {integrity: sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==} - engines: {node: '>=0.4.0'} - dev: false - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -16299,10 +13071,6 @@ packages: engines: {node: '>=6'} dev: true - /packrup@0.1.2: - resolution: {integrity: sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==} - dev: false - /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: false @@ -16339,49 +13107,10 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - dev: false - /parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: false - - /parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} - dependencies: - entities: 6.0.1 - dev: true - - /parsejson@0.0.1: - resolution: {integrity: sha512-W9CRvTfYQY/kbRc5Q6YTWarb/QDxdEGbd6RCP8CLUQDJV89RVHoS2A0dZYNtAcq31fulGNN4ZhAhiQQazwlKJg==} - dependencies: - better-assert: 1.0.2 - dev: false - - /parseqs@0.0.2: - resolution: {integrity: sha512-vyyyfQGUFZnDhgrrdn+hh1JuOfvbXU5oRr6dijfkSIbaFuxGgTSCA/RNVcsADmo0k2NX6wERVTMKkXokjuObJA==} - dependencies: - better-assert: 1.0.2 - dev: false - - /parseuri@0.0.2: - resolution: {integrity: sha512-m0H+R0u5LXOx8sbxufnvgKrRLpkVpvtMf0AyWXYSqLwo2MWrVEgCIbgpaSVa398xl6wTLe0A7CGhiC4hBdEzHQ==} - dependencies: - better-assert: 1.0.2 - dev: false - - /parseurl@1.1.3: - resolution: {integrity: sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==} - dev: false - /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -16415,10 +13144,6 @@ packages: minipass: 7.1.2 dev: false - /path-to-regexp@0.1.3: - resolution: {integrity: sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==} - dev: false - /path-to-regexp@8.2.0: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} @@ -16472,11 +13197,6 @@ packages: find-up: 4.1.0 dev: true - /pkginfo@0.3.1: - resolution: {integrity: sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==} - engines: {node: '>= 0.4.0'} - dev: false - /playwright-core@1.59.1: resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} @@ -16553,11 +13273,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - /pretty-bytes@7.1.0: - resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} - engines: {node: '>=20'} - dev: false - /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -16567,13 +13282,6 @@ packages: react-is: 17.0.2 dev: true - /pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - dependencies: - parse-ms: 4.0.0 - dev: false - /prisma@5.10.2: resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} engines: {node: '>=16.13'} @@ -16614,17 +13322,6 @@ packages: resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} dev: false - /property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} - dev: false - - /proxy-addr@1.0.1: - resolution: {integrity: sha512-rIUGzBlSfkJMWWCgsd4N5wvVSNAcJZg//UwPZumDIbScHRUzuSOjBmIdyICiKkB9yArv+er9qC6RA/NL3AWc6A==} - engines: {node: '>= 0.8.0'} - dependencies: - ipaddr.js: 0.1.2 - dev: false - /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -16667,14 +13364,6 @@ packages: react: 18.3.1 dev: false - /qs@0.5.6: - resolution: {integrity: sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==} - dev: false - - /qs@0.6.6: - resolution: {integrity: sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==} - dev: false - /qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -16702,27 +13391,6 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: false - /radix-vue@1.9.17(vue@3.5.29): - resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} - peerDependencies: - vue: '>= 3.2.0' - dependencies: - '@floating-ui/dom': 1.7.4 - '@floating-ui/vue': 1.1.9(vue@3.5.29) - '@internationalized/date': 3.8.0 - '@internationalized/number': 3.6.1 - '@tanstack/vue-virtual': 3.13.6(vue@3.5.29) - '@vueuse/core': 10.11.1(vue@3.5.29) - '@vueuse/shared': 10.11.1(vue@3.5.29) - aria-hidden: 1.2.4 - defu: 6.1.4 - fast-deep-equal: 3.1.3 - nanoid: 5.1.6 - vue: 3.5.29(typescript@5.2.2) - transitivePeerDependencies: - - '@vue/composition-api' - dev: false - /randexp@0.5.3: resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} engines: {node: '>=4'} @@ -16737,23 +13405,11 @@ packages: safe-buffer: 5.2.1 dev: true - /range-parser@1.0.0: - resolution: {integrity: sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==} - dev: false - /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: false - /raw-body@1.3.0: - resolution: {integrity: sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==} - engines: {node: '>= 0.8.0'} - dependencies: - bytes: 1.0.0 - iconv-lite: 0.4.4 - dev: false - /raw-body@3.0.0: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} @@ -17171,68 +13827,6 @@ packages: jsesc: 0.5.0 dev: true - /rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - - /rehype-format@5.0.1: - resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} - dependencies: - '@types/hast': 3.0.4 - hast-util-format: 1.1.0 - dev: false - - /rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - unified: 11.0.4 - dev: false - - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.1 - dev: false - - /rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} - dependencies: - '@types/hast': 3.0.4 - hast-util-sanitize: 5.0.2 - dev: false - - /rehype-stringify@10.0.1: - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - dependencies: - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - unified: 11.0.4 - dev: false - - /remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: @@ -17243,17 +13837,6 @@ packages: - supports-color dev: false - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.2 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: @@ -17263,42 +13846,6 @@ packages: unified: 10.1.2 dev: false - /remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 - mdast-util-to-hast: 13.2.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.4 - dev: false - - /request@2.16.6: - resolution: {integrity: sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==} - engines: {'0': node >= 0.8.0} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign: 0.2.0 - cookie-jar: 0.2.0 - forever-agent: 0.2.0 - form-data: 0.0.10 - hawk: 0.10.2 - json-stringify-safe: 3.0.0 - mime: 1.2.11 - node-uuid: 1.4.8 - oauth-sign: 0.2.0 - qs: 0.5.6 - tunnel-agent: 0.2.0 - dev: false - /request@2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} @@ -17325,10 +13872,6 @@ packages: tunnel-agent: 0.6.0 uuid: 3.4.0 - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - /reserved-identifiers@1.2.0: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} @@ -17589,13 +14132,6 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: 2.2.0 - dev: true - /scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: @@ -17623,22 +14159,6 @@ packages: hasBin: true dev: true - /send@0.6.0: - resolution: {integrity: sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 1.0.3 - depd: 0.3.0 - escape-html: 1.0.1 - finished: 1.2.2 - fresh: 0.2.2 - mime: 1.2.11 - ms: 0.6.2 - range-parser: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} @@ -17664,17 +14184,6 @@ packages: randombytes: 2.1.0 dev: true - /serve-static@1.3.2: - resolution: {integrity: sha512-KwjCeYUx7IM1neg8/P0+O1DZsl76XcOSuV0ZxrI0r60vwGlcjMjKOYCK/OFLJy/a2CFuIyAa/x0PuQ0yuG+IgQ==} - engines: {node: '>= 0.8.0'} - dependencies: - escape-html: 1.0.1 - parseurl: 1.1.3 - send: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: false - /serve-static@2.2.0: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} @@ -17757,11 +14266,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} - engines: {node: '>= 0.4'} - dev: false - /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -17900,79 +14404,6 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: false - /sntp@0.1.4: - resolution: {integrity: sha512-v90tkW8VIdXwY35BJAWIpZWd/h+WC7TufizgUO2jtOY21isIo8IP85f1zJ8mKF8o77Vxo5k+GJmUZ4H6phVt1g==} - engines: {node: 0.8.x} - deprecated: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues. - dependencies: - hoek: 0.7.6 - dev: false - - /socket.io-adapter@0.2.0: - resolution: {integrity: sha512-3PlX+MOlpHiY+ZTbKhpE4i+M4u8hFUlVyqFP4K/mH+t+D9bMKATFqUUY3zWQMEo2g/1ckosURXviQw6M8R/y8A==} - dependencies: - debug: 0.7.4 - socket.io-parser: 2.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /socket.io-client@1.0.6: - resolution: {integrity: sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==} - dependencies: - component-bind: 1.0.0 - component-emitter: 1.1.2 - debug: 0.7.4 - engine.io-client: 1.3.1 - has-binary-data: 0.1.1 - indexof: 0.0.1 - object-component: 0.0.3 - parseuri: 0.0.2 - socket.io-parser: 2.2.0 - to-array: 0.1.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /socket.io-parser@2.1.2: - resolution: {integrity: sha512-eVkt8prgw20H+4P8Iw6tis/w7leiN5EW/93Vq+KL8w+yNJu+QNgaej2Cgt8FhVCVuN3AHyLU50vXvM8cpUR1JQ==} - dependencies: - debug: 0.7.4 - emitter: '@github.com/component/emitter/archive/1.0.1.tar.gz' - isarray: 0.0.1 - json3: 3.2.6 - transitivePeerDependencies: - - supports-color - dev: false - - /socket.io-parser@2.2.0: - resolution: {integrity: sha512-uW3UiLVibAyleKq8r/yZe1oPO51olhY18T6HtnN0iI6RLqJfYC0YiyAFlsPw1+8I0Z1qFd8jFLTRZo2vr6ISxA==} - dependencies: - debug: 0.7.4 - emitter: '@github.com/component/emitter/archive/1.0.1.tar.gz' - isarray: 0.0.1 - json3: 3.2.6 - transitivePeerDependencies: - - supports-color - dev: false - - /socket.io@1.0.6: - resolution: {integrity: sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==} - dependencies: - debug: 0.7.4 - engine.io: 1.3.1 - has-binary-data: 0.1.1 - socket.io-adapter: 0.2.0 - socket.io-client: 1.0.6 - socket.io-parser: 2.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} @@ -18085,10 +14516,6 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: false - /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -18262,22 +14689,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /stringify-object@5.0.0: - resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} - engines: {node: '>=14.16'} - dependencies: - get-own-enumerable-keys: 1.0.0 - is-obj: 3.0.0 - is-regexp: 3.1.0 - dev: false - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -18316,10 +14727,6 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - /style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - dev: false - /style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: @@ -18407,29 +14814,12 @@ packages: stable: 0.1.8 dev: true - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - /szfe-tools@0.0.0-beta.7: resolution: {integrity: sha512-/M7+Tel2G8zapfDYZlz17hf9ViqAi/loZMfM81b5iZMyaWL/t5dajBszEBI2kyIDFzlLT4btBcq+BimFgmAHug==} dependencies: '@babel/runtime': 7.28.4 dev: false - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false - - /tagged-tag@1.0.0: - resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} - engines: {node: '>=20'} - dev: false - - /tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} - dev: false - /tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} dev: false @@ -18442,9 +14832,6 @@ packages: resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} dev: false - /tailwindcss@4.1.18: - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -18555,11 +14942,6 @@ packages: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} dev: true - /tinycolor@0.0.1: - resolution: {integrity: sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==} - engines: {node: '>=0.4.0'} - dev: false - /tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -18578,17 +14960,6 @@ packages: engines: {node: '>=14.0.0'} dev: true - /tldts-core@7.0.19: - resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} - dev: true - - /tldts@7.0.19: - resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} - hasBin: true - dependencies: - tldts-core: 7.0.19 - dev: true - /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} dependencies: @@ -18600,10 +14971,6 @@ packages: dependencies: rimraf: 3.0.2 - /to-array@0.1.3: - resolution: {integrity: sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==} - dev: false - /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -18630,29 +14997,6 @@ packages: engines: {node: '>=0.6'} dev: false - /tomahawk-plugin-kv-memory-store@0.0.3: - resolution: {integrity: sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==} - dev: false - - /tomahawk@0.1.6: - resolution: {integrity: sha512-HFLoewTx2gHD0o2t0tR+EIcDXhqdtakfZCDiYsGjOO93nYQ1i7nbhj3UL7iQdtoBbPAcEbrxeJ0KlfPOvhxFyg==} - engines: {node: '>= 0.8.0 < 0.11.0'} - hasBin: true - dependencies: - body-parser: 1.5.0 - connect: 3.0.2 - errorhandler: 1.1.1 - express: 4.6.1 - morgan: 1.2.0 - node-options: 0.0.6 - socket.io: 1.0.6 - winston: 0.7.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -18665,13 +15009,6 @@ packages: psl: 1.9.0 punycode: 2.3.1 - /tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} - dependencies: - tldts: 7.0.19 - dev: true - /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false @@ -18683,13 +15020,6 @@ packages: punycode: 2.3.1 dev: false - /tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - dependencies: - punycode: 2.3.1 - dev: true - /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -18716,11 +15046,6 @@ packages: typescript: 5.9.3 dev: true - /ts-deepmerge@7.0.3: - resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} - engines: {node: '>=14.13.1'} - dev: false - /tsconfck@3.1.6(typescript@5.2.2): resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -18802,10 +15127,6 @@ packages: typescript: 5.9.3 dev: false - /tunnel-agent@0.2.0: - resolution: {integrity: sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==} - dev: false - /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -18828,21 +15149,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - /type-fest@5.3.1: - resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} - engines: {node: '>=20'} - dependencies: - tagged-tag: 1.0.0 - dev: false - - /type-is@1.3.2: - resolution: {integrity: sha512-sdIhnvhWEyIP2DKjj1o9tL31m8vFxDfLPD56KXz2absqY5AF2QYkJC7Wrw2fkzsZA9mv+PCtgyB7EqYOgR+r3Q==} - engines: {node: '>= 0.8'} - dependencies: - media-typer: 0.2.0 - mime-types: 1.0.2 - dev: false - /type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -18960,19 +15266,6 @@ packages: /undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - /undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - dev: false - - /unhead@1.11.20: - resolution: {integrity: sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==} - dependencies: - '@unhead/dom': 1.11.20 - '@unhead/schema': 1.11.20 - '@unhead/shared': 1.11.20 - hookable: 5.5.3 - dev: false - /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -19008,25 +15301,6 @@ packages: vfile: 5.3.7 dev: false - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - dependencies: - '@types/unist': 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - dev: false - - /unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - dev: false - /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} dev: false @@ -19037,36 +15311,18 @@ packages: '@types/unist': 2.0.10 dev: false - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - dependencies: - '@types/unist': 3.0.2 - dev: false - /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.10 dev: false - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - dependencies: - '@types/unist': 3.0.2 - dev: false - /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.10 dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - dependencies: - '@types/unist': 3.0.2 - dev: false - /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: @@ -19074,13 +15330,6 @@ packages: unist-util-is: 5.2.1 dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - dev: false - /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: @@ -19089,14 +15338,6 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -19171,10 +15412,6 @@ packages: dependencies: react: 18.3.1 - /utf8@2.0.0: - resolution: {integrity: sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==} - dev: false - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -19187,11 +15424,6 @@ packages: is-typed-array: 1.1.12 which-typed-array: 1.1.13 - /utils-merge@1.0.0: - resolution: {integrity: sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==} - engines: {node: '>= 0.4.0'} - dev: false - /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -19218,11 +15450,6 @@ packages: sade: 1.8.1 dev: false - /vary@0.1.0: - resolution: {integrity: sha512-tyyeG46NQdwyVP/RsWLSrT78ouwEuvwk9gK8vQK4jdXmqoXtTXW+vsCfNcnqRhigF8olV34QVZarmAi6wBV2Mw==} - engines: {node: '>= 0.8.0'} - dev: false - /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -19236,22 +15463,6 @@ packages: core-util-is: 1.0.2 extsprintf: 1.4.1 - /verror@1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - dev: false - - /vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - dev: false - /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: @@ -19259,13 +15470,6 @@ packages: unist-util-stringify-position: 3.0.3 dev: false - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - dev: false - /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: @@ -19275,14 +15479,6 @@ packages: vfile-message: 3.1.4 dev: false - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: false - /vite-tsconfig-paths@5.1.4(typescript@5.2.2)(vite@7.2.6): resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -19524,78 +15720,6 @@ packages: fsevents: 2.3.3 dev: true - /vitest@4.0.15(@types/node@18.13.0)(@vitest/browser-playwright@4.0.15)(@vitest/ui@4.0.12)(jsdom@27.2.0)(sass@1.69.5): - resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.15 - '@vitest/browser-preview': 4.0.15 - '@vitest/browser-webdriverio': 4.0.15 - '@vitest/ui': 4.0.15 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@types/node': 18.13.0 - '@vitest/browser-playwright': 4.0.15(playwright@1.59.1)(vite@7.2.6)(vitest@4.0.15) - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.6) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/ui': 4.0.12(vitest@4.0.15) - '@vitest/utils': 4.0.15 - es-module-lexer: 1.7.0 - expect-type: 1.2.2 - jsdom: 27.2.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.2.6(@types/node@18.13.0)(sass@1.69.5) - why-is-node-running: 2.3.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml - dev: true - /vitest@4.0.15(@types/node@18.15.11)(@vitest/browser-playwright@4.0.15)(sass@1.69.5): resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -19811,65 +15935,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /vue-component-type-helpers@3.2.5: - resolution: {integrity: sha512-tkvNr+bU8+xD/onAThIe7CHFvOJ/BO6XCOrxMzeytJq40nTfpGDJuVjyCM8ccGZKfAbGk2YfuZyDMXM56qheZQ==} - dev: false - - /vue-demi@0.14.10(vue@3.5.29): - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.5.29(typescript@5.2.2) - dev: false - - /vue-router@4.6.2(vue@3.5.29): - resolution: {integrity: sha512-my83mxQKXyCms9EegBXZldehOihxBjgSjZqrZwgg4vBacNGl0oBCO+xT//wgOYpLV1RW93ZfqxrjTozd+82nbA==} - peerDependencies: - vue: ^3.5.0 - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.29(typescript@5.2.2) - dev: false - - /vue-sonner@1.3.2: - resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} - dev: false - - /vue@3.5.29(typescript@5.2.2): - resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@vue/compiler-dom': 3.5.29 - '@vue/compiler-sfc': 3.5.29 - '@vue/runtime-dom': 3.5.29 - '@vue/server-renderer': 3.5.29(vue@3.5.29) - '@vue/shared': 3.5.29 - typescript: 5.2.2 - dev: false - - /w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - dev: false - - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - dependencies: - xml-name-validator: 5.0.0 - dev: true - /warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} dependencies: @@ -19883,10 +15948,6 @@ packages: optionalDependencies: '@zxing/text-encoding': 0.9.0 - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false - /web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -19901,11 +15962,6 @@ packages: engines: {node: '>=12'} dev: false - /webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} - engines: {node: '>=20'} - dev: true - /webpack-bundle-analyzer@4.10.1: resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} engines: {node: '>= 10.13.0'} @@ -19929,17 +15985,6 @@ packages: - utf-8-validate dev: true - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - dependencies: - iconv-lite: 0.6.3 - dev: true - - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} @@ -19948,14 +15993,6 @@ packages: webidl-conversions: 7.0.0 dev: false - /whatwg-url@15.1.0: - resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} - engines: {node: '>=20'} - dependencies: - tr46: 6.0.0 - webidl-conversions: 8.0.0 - dev: true - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -20045,24 +16082,6 @@ packages: stackback: 0.0.2 dev: true - /winston@0.7.3: - resolution: {integrity: sha512-iVTT8tf9YnTyfZX+aEUj2fl6WBRet7za6vdjMeyF8SA80Vii2rreM5XH+5qmpBV9uJGj8jz8BozvTDcroVq/eA==} - engines: {node: '>= 0.6.0'} - dependencies: - async: 0.2.10 - colors: 0.6.2 - cycle: 1.0.3 - eyes: 0.1.8 - pkginfo: 0.3.1 - request: 2.16.6 - stack-trace: 0.0.10 - dev: false - - /wordwrap@0.0.3: - resolution: {integrity: sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==} - engines: {node: '>=0.4.0'} - dev: false - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -20093,26 +16112,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /ws@0.4.31: - resolution: {integrity: sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==} - engines: {node: '>=0.4.0'} - hasBin: true - requiresBuild: true - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - commander: 0.6.1 - nan: 0.3.2 - options: 0.0.6 - tinycolor: 0.0.1 - dev: false - /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -20150,11 +16149,6 @@ packages: optional: true dev: true - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true - /xml2js@0.4.23: resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} engines: {node: '>=4.0.0'} @@ -20185,10 +16179,6 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -20216,29 +16206,10 @@ packages: hasBin: true dev: true - /yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - dev: false - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zhead@2.2.4: - resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} - dev: false - - /zod-openapi@4.2.4(zod@4.3.5): - resolution: {integrity: sha512-tsrQpbpqFCXqVXUzi3TPwFhuMtLN3oNZobOtYnK6/5VkXsNdnIgyNr4r8no4wmYluaxzN3F7iS+8xCW8BmMQ8g==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.21.4 - dependencies: - zod: 4.3.5 - dev: false - /zod-to-json-schema@3.24.5(zod@3.25.76): resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} peerDependencies: @@ -20258,10 +16229,6 @@ packages: /zod@4.3.5: resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} - /zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - dev: false - /zrender@5.4.4: resolution: {integrity: sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==} dependencies: @@ -20330,28 +16297,3 @@ packages: react: 18.3.1 use-sync-external-store: 1.5.0(react@18.3.1) dev: true - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false - - '@github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz': - resolution: {tarball: https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz} - name: xmlhttprequest - version: 1.5.0 - engines: {node: '>=0.4.0'} - dev: false - - '@github.com/component/emitter/archive/1.0.1.tar.gz': - resolution: {tarball: http://github.com/component/emitter/archive/1.0.1.tar.gz} - name: emitter - version: 1.0.1 - dependencies: - indexof: 0.0.1 - dev: false - - '@github.com/component/global/archive/v2.0.1.tar.gz': - resolution: {tarball: https://github.com/component/global/archive/v2.0.1.tar.gz} - name: global - version: 2.0.1 - dev: false diff --git a/frontend/providers/applaunchpad/.dockerignore b/frontend/providers/applaunchpad/.dockerignore deleted file mode 100644 index 599da9cd7..000000000 --- a/frontend/providers/applaunchpad/.dockerignore +++ /dev/null @@ -1,10 +0,0 @@ -Dockerfile -.dockerignore -node_modules -npm-debug.log -README.md -.next -.git - -.yalc/ -yalc.lock diff --git a/frontend/providers/applaunchpad/.eslintrc.json b/frontend/providers/applaunchpad/.eslintrc.json deleted file mode 100644 index be661eb5c..000000000 --- a/frontend/providers/applaunchpad/.eslintrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "next/core-web-vitals", - "rules": { - "react-hooks/rules-of-hooks": 0 - } -} diff --git a/frontend/providers/applaunchpad/.gitignore b/frontend/providers/applaunchpad/.gitignore deleted file mode 100644 index 314c7b88f..000000000 --- a/frontend/providers/applaunchpad/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts -/public/trainData/ -platform.json -.yalc/ -yalc.lock -data/*.local - -data/* -!data/config.example.yaml diff --git a/frontend/providers/applaunchpad/.prettierignore b/frontend/providers/applaunchpad/.prettierignore deleted file mode 100644 index ab9a493f2..000000000 --- a/frontend/providers/applaunchpad/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -dist -.vscode -**/.DS_Store -node_modules diff --git a/frontend/providers/applaunchpad/.prettierrc.js b/frontend/providers/applaunchpad/.prettierrc.js deleted file mode 100644 index 8bc336a36..000000000 --- a/frontend/providers/applaunchpad/.prettierrc.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - printWidth: 100, - tabWidth: 2, - useTabs: false, - semi: true, - singleQuote: true, - quoteProps: 'as-needed', - jsxSingleQuote: false, - trailingComma: 'none', - bracketSpacing: true, - jsxBracketSameLine: false, - arrowParens: 'always', - rangeStart: 0, - rangeEnd: Infinity, - requirePragma: false, - insertPragma: false, - proseWrap: 'preserve', - htmlWhitespaceSensitivity: 'css', - endOfLine: 'lf' -}; diff --git a/frontend/providers/applaunchpad/.vscode/settings.json b/frontend/providers/applaunchpad/.vscode/settings.json deleted file mode 100644 index aaaf338a2..000000000 --- a/frontend/providers/applaunchpad/.vscode/settings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "i18n-ally.localesPaths": [ - "public/locales" - ], - "i18n-ally.enabledParsers": [ - "json", - "yaml", - "js", - "ts" - ], - "i18n-ally.keystyle": "nested", - "i18n-ally.keepFulfilled": false, - "i18n-ally.sourceLanguage": "en", - "i18n-ally.displayLanguage": "en", - "i18n-ally.pathMatcher": "{locale}/{namespaces}.json", - "i18n-ally.extract.targetPickingStrategy": "most-similar-by-key" -} \ No newline at end of file diff --git a/frontend/providers/applaunchpad/Makefile b/frontend/providers/applaunchpad/Makefile deleted file mode 100644 index 803dae84c..000000000 --- a/frontend/providers/applaunchpad/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -.PHONY: all -all: build - -##@ General - -# The help target prints out all targets with their descriptions organized -# beneath their categories. The categories are represented by '##@' and the -# target descriptions by '##'. The awk commands is responsible for reading the -# entire set of makefiles included in this invocation, looking for lines of the -# file as xyz: ## something, and then pretty-format the target and help. Then, -# if there's a line with ##@ something, that gets pretty-printed as a category. -# More info on the usage of ANSI control characters for terminal formatting: -# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters -# More info on the awk command: -# http://linuxcommand.org/lc3_adv_awk.php - -.PHONY: help -help: ## Display this help. - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -##@ Build - -.PHONY: build -build: ## Build desktop-frontend binary. - pnpm run build - -.PHONY: run -run: ## Run a dev service from host. - pnpm run start diff --git a/frontend/providers/applaunchpad/README.md b/frontend/providers/applaunchpad/README.md deleted file mode 100644 index eb24ade5f..000000000 --- a/frontend/providers/applaunchpad/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# sealos app launchpad - -## Preparation, refer to the README.md in the frontend directory - -## project tree - -```bash -. -├── data -│ ├── form_slider_config.json // Optional configuration files -├── deploy -├── public -│ ├── locales -│ ├── favicon.ico -│ └── logo.svg -├── src -│ ├── api -│ ├── components // Components -│ ├── constants -│ ├── hooks -│ ├── mock -│ ├── pages // Pages, the path is the route -│ │ ├── api // Server-side API -│ │ ├── app -│ │ │ ├── detail -│ │ │ │ ├── components -│ │ │ │ ├── index.module.scss -│ │ │ │ └── index.tsx // Detail page -│ │ │ └── edit -│ │ │ ├── components -│ │ │ ├── index.module.scss -│ │ │ └── index.tsx // Create and edit page -│ │ ├── apps -│ │ │ ├── components -│ │ │ ├── index.module.scss -│ │ │ └── index.tsx // App list page -│ │ ├── 404.tsx -│ │ ├── _app.tsx -│ │ └── _document.tsx -│ ├── services -│ │ ├── backend -│ │ │ ├── auth.ts -│ │ │ ├── kubernetes.ts -│ │ │ └── response.ts -│ │ ├── error.ts -│ │ ├── kubernet.ts -│ │ ├── monitorFetch.ts -│ │ ├── request.ts -│ │ └── streamFetch.ts -│ ├── store -│ ├── styles -│ ├── types -│ └── utils -├── Makefile -├── README.md -├── next-env.d.ts -├── next-i18next.config.js -├── next.config.js -├── package.json -└── tsconfig.json -``` diff --git a/frontend/providers/applaunchpad/__tests__/components/network-configuration-table-layout.test.tsx b/frontend/providers/applaunchpad/__tests__/components/network-configuration-table-layout.test.tsx deleted file mode 100644 index fb20da46d..000000000 --- a/frontend/providers/applaunchpad/__tests__/components/network-configuration-table-layout.test.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import '@/styles/tailwind.css'; - -import { cleanup, render, screen, within } from '@testing-library/react'; -import React from 'react'; -import { afterEach, describe, expect, test, vi } from 'vitest'; -import { page } from 'vitest/browser'; -import NetworkConfigurationTable, { - type NetworkConfigurationTableItem -} from '@/components/app/detail/index/NetworkConfigurationTable'; - -vi.mock('@sealos/shadcn-ui/tooltip', () => ({ - Tooltip: ({ children }: { children: React.ReactNode }) => <>{children}, - TooltipContent: ({ children }: { children: React.ReactNode }) =>
{children}
, - TooltipTrigger: ({ children }: { children: React.ReactNode }) => <>{children} -})); - -vi.mock('@/components/app/detail/index/ICPStatus', () => ({ - default: ({ - onRegistrationStatusChange - }: { - onRegistrationStatusChange?: (registered: boolean) => void; - }) => { - React.useEffect(() => { - onRegistrationStatusChange?.(false); - }, [onRegistrationStatusChange]); - - return Domain not filed; - } -})); - -const publicAddress = 'https://very-long-public-domain-for-layout-regression.gzg.sealos.run'; - -const networks: NetworkConfigurationTableItem[] = [ - { - inline: 'http://hello-world.ns-test.svc.cluster.local:8080', - public: publicAddress, - customDomain: '', - showReadyStatus: true, - port: 8080 - } -]; - -const renderNetworkConfigurationTable = () => { - return render( -
- key} - /> -
- ); -}; - -const getLineTop = (element: Element) => Math.round(element.getBoundingClientRect().top); -const expectOnSameLine = (left: Element, right: Element) => { - expect(Math.abs(getLineTop(left) - getLineTop(right))).toBeLessThanOrEqual(2); -}; - -afterEach(() => { - cleanup(); - vi.clearAllMocks(); -}); - -describe('NetworkConfigurationTable layout', () => { - test('keeps the network table inside its parent in a narrow viewport', async () => { - await page.viewport(390, 844); - renderNetworkConfigurationTable(); - - const table = screen.getByRole('table'); - const tableHead = table.querySelector('thead'); - const tableBody = table.querySelector('tbody'); - const publicCell = within(table).getByText(publicAddress).closest('td'); - const accessibleTag = screen.getByText('Accessible'); - const renderedPublicAddress = screen.getByText(publicAddress); - const publicContentRow = publicCell?.firstElementChild; - const scrollContainer = table.parentElement as HTMLElement; - - expect(tableHead).toBeTruthy(); - expect(tableBody).toBeTruthy(); - expect(publicCell).toBeTruthy(); - expect(publicContentRow).toBeTruthy(); - - expect(getComputedStyle(table).tableLayout).toBe('fixed'); - expect(Math.round(table.getBoundingClientRect().width)).toBeLessThanOrEqual( - scrollContainer.clientWidth - ); - expect(renderedPublicAddress.getBoundingClientRect().width).toBeLessThanOrEqual(220); - expectOnSameLine(accessibleTag, renderedPublicAddress); - }); - - test('shows the ICP tag as the only left status tag when domain is unregistered', async () => { - await page.viewport(390, 844); - render( - key} - /> - ); - - const icpTag = screen.getByTestId('icp-status'); - const renderedPublicAddress = screen.getByText(publicAddress); - - expect(screen.queryByText('Accessible')).toBeNull(); - expect(screen.queryByText('Ready')).toBeNull(); - expect(icpTag.getBoundingClientRect().left).toBeLessThan( - renderedPublicAddress.getBoundingClientRect().left - ); - expectOnSameLine(icpTag, renderedPublicAddress); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/api/app.test.ts b/frontend/providers/applaunchpad/__tests__/unit/api/app.test.ts deleted file mode 100644 index a27289171..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/api/app.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { Quantity } from '@sealos/shared'; -import { getAppByName, getAppPodsByAppName } from '@/api/app'; -import { MOCK_APP_DETAIL, MOCK_PODS } from '@/mock/apps'; -import { GET } from '@/services/request'; - -vi.mock('@/services/request', () => ({ - GET: vi.fn(), - POST: vi.fn(), - DELETE: vi.fn() -})); - -vi.mock('@sealos/gtm', () => ({ - track: vi.fn() -})); - -const mockedGET = vi.mocked(GET); - -describe('getAppByName', () => { - it('hydrates Quantity fields from the API JSON payload', async () => { - const payload = JSON.parse(JSON.stringify(MOCK_APP_DETAIL)); - payload.storeList = [ - { - name: 'data', - path: '/data', - value: '2Gi' - } - ]; - - mockedGET.mockResolvedValueOnce(payload); - - const app = await getAppByName('hello-world'); - - expect(app.cpu).toBeInstanceOf(Quantity); - expect(app.cpu.formatForDisplay({ format: 'DecimalSI' })).toBe('200m'); - expect(app.memory).toBeInstanceOf(Quantity); - expect(app.memory.formatForDisplay({ format: 'BinarySI' })).toBe('256Mi'); - expect(app.storeList[0]?.value).toBeInstanceOf(Quantity); - expect(app.storeList[0]?.value.formatForDisplay({ format: 'BinarySI' })).toBe('2Gi'); - }); -}); - -describe('getAppPodsByAppName', () => { - it('hydrates pod Quantity fields from the API JSON payload', async () => { - const payload = JSON.parse(JSON.stringify(MOCK_PODS)); - payload[0].cpu = '500m'; - payload[0].memory = '128Mi'; - - mockedGET.mockResolvedValueOnce(payload); - - const pods = await getAppPodsByAppName('hello-world'); - - expect(pods[0]?.cpu).toBeInstanceOf(Quantity); - expect(pods[0]?.cpu.formatForDisplay({ format: 'DecimalSI' })).toBe('500m'); - expect(pods[0]?.memory).toBeInstanceOf(Quantity); - expect(pods[0]?.memory.formatForDisplay({ format: 'BinarySI' })).toBe('128Mi'); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/pages/api/checkReady.test.ts b/frontend/providers/applaunchpad/__tests__/unit/pages/api/checkReady.test.ts deleted file mode 100644 index 0c90fc2ee..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/pages/api/checkReady.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -// @vitest-environment node -import type { NextApiRequest, NextApiResponse } from 'next'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -import handler from '@/pages/api/checkReady'; -import { getK8s } from '@/services/backend/kubernetes'; - -vi.mock('@/services/backend/auth', () => ({ - authSession: vi.fn().mockResolvedValue('kubeconfig') -})); - -vi.mock('@/services/backend/kubernetes', () => ({ - getK8s: vi.fn() -})); - -vi.mock('@/config', () => ({ - Config: () => ({ - cloud: { - disableHttps: false, - domain: 'sealos.run', - httpPort: undefined, - port: undefined, - userDomains: [] - } - }) -})); - -const mockedGetK8s = vi.mocked(getK8s); -const mockedFetch = vi.fn(); - -global.fetch = mockedFetch; - -const createResponse = () => { - const res = { - json: vi.fn((payload) => payload) - } as unknown as NextApiResponse & { json: ReturnType }; - - return res; -}; - -const callHandler = async () => { - const req = { - query: { - appName: 'hello-world' - }, - headers: {} - } as unknown as NextApiRequest; - const res = createResponse(); - - await handler(req, res); - - return res.json.mock.calls[0][0]; -}; - -describe('/api/checkReady', () => { - beforeEach(() => { - vi.clearAllMocks(); - mockedGetK8s.mockResolvedValue({ - namespace: 'ns-test', - k8sNetworkingApp: { - listNamespacedIngress: vi.fn().mockResolvedValue({ - body: { - items: [ - { - metadata: { - annotations: { - 'nginx.ingress.kubernetes.io/backend-protocol': 'HTTP' - } - }, - spec: { - rules: [ - { - host: 'hello-world.sealos.run' - } - ] - } - } - ] - } - }) - } - } as any); - }); - - it('marks a 503 no healthy upstream response as not ready', async () => { - mockedFetch.mockResolvedValueOnce({ - status: 503, - headers: { - get: vi.fn() - }, - text: vi.fn().mockResolvedValue('no healthy upstream') - }); - - const response = await callHandler(); - - expect(response.code).toBe(200); - expect(response.data).toEqual([ - { - ready: false, - url: 'https://hello-world.sealos.run', - error: 'Upstream not healthy' - } - ]); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/pages/api/platform/authDomainChallenge.test.ts b/frontend/providers/applaunchpad/__tests__/unit/pages/api/platform/authDomainChallenge.test.ts deleted file mode 100644 index ca762d06d..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/pages/api/platform/authDomainChallenge.test.ts +++ /dev/null @@ -1,523 +0,0 @@ -// @vitest-environment node -import crypto from 'crypto'; -import { EventEmitter } from 'events'; -import { Readable } from 'stream'; -import type { NextApiRequest, NextApiResponse } from 'next'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; -import handler, { - formatChallengeHost, - isPublicIp, - sanitizeChallengeDomain -} from '@/pages/api/platform/authDomainChallenge'; -import { queryA, queryAAAA } from '@/services/dns-resolver'; -import { getK8s } from '@/services/backend/kubernetes'; -import http from 'http'; -import https from 'https'; - -const TEST_DOMAIN_CHALLENGE_SECRET = vi.hoisted(() => ['test', 'secret'].join('-')); - -vi.mock('nanoid', () => ({ - customAlphabet: () => () => 'abcdefghijklmnop' -})); - -vi.mock('@/services/dns-resolver', () => ({ - queryA: vi.fn(), - queryAAAA: vi.fn() -})); - -vi.mock('@/services/backend/kubernetes', () => ({ - getK8s: vi.fn() -})); - -vi.mock('http', () => ({ - default: { - request: vi.fn() - } -})); - -vi.mock('https', () => ({ - default: { - request: vi.fn() - } -})); - -vi.mock('@/config', () => ({ - Config: () => ({ - launchpad: { - domainChallengeSecret: TEST_DOMAIN_CHALLENGE_SECRET - } - }) -})); - -const mockedQueryA = vi.mocked(queryA); -const mockedQueryAAAA = vi.mocked(queryAAAA); -const mockedGetK8s = vi.mocked(getK8s); -const mockedHttpRequest = vi.mocked(http.request); -const mockedHttpsRequest = vi.mocked(https.request); - -const createResponse = () => { - const res = { - json: vi.fn((payload) => payload) - } as unknown as NextApiResponse & { json: ReturnType }; - - return res; -}; - -const callHandler = async (body: unknown, authorization = 'kubeconfig') => { - const req = { - body, - headers: authorization ? { authorization } : {} - } as unknown as NextApiRequest; - const res = createResponse(); - - await handler(req, res); - - return res.json.mock.calls[0][0]; -}; - -const createValidChallengeResponse = (host = 'example.com') => { - const timestamp = Math.floor(Date.now() / 1000); - const signatureData = `${host}:abcdefghijklmnop:${timestamp}:applaunchpad:false`; - const signature = crypto - .createHmac('sha256', TEST_DOMAIN_CHALLENGE_SECRET) - .update(signatureData) - .digest('hex'); - - return { - host, - token: 'abcdefghijklmnop', - timestamp, - service: 'applaunchpad', - isProxy: false, - signature - }; -}; - -const createMockNodeResponse = ( - body: unknown, - statusCode = 200, - headers: Record = { 'content-type': 'application/json' } -) => { - const payload = body === null ? '' : JSON.stringify(body); - const res = Readable.from([Buffer.from(payload)]) as any; - res.statusCode = statusCode; - res.headers = headers; - return res; -}; - -const mockHttpResponse = ( - body: unknown, - statusCode = 200, - headers: Record = { 'content-type': 'application/json' } -) => { - mockedHttpRequest.mockImplementationOnce((options: any, callback: any) => { - const req = new EventEmitter() as any; - req.end = vi.fn(); - - callback(createMockNodeResponse(body, statusCode, headers)); - - return req; - }); -}; - -const mockHttpsResponse = ( - body: unknown, - statusCode = 200, - headers: Record = { 'content-type': 'application/json' } -) => { - mockedHttpsRequest.mockImplementationOnce((options: any, callback: any) => { - const req = new EventEmitter() as any; - req.end = vi.fn(); - - callback(createMockNodeResponse(body, statusCode, headers)); - - return req; - }); -}; - -describe('authDomainChallenge SSRF protections', () => { - beforeEach(() => { - vi.clearAllMocks(); - mockedGetK8s.mockResolvedValue({ - namespace: 'ns-test', - k8sCore: { - listNamespacedService: vi.fn().mockResolvedValue({}) - } - } as any); - }); - - describe('sanitizeChallengeDomain', () => { - it('accepts normalized public hostnames only', () => { - expect(sanitizeChallengeDomain(' Example.COM. ')).toBe('example.com'); - expect(sanitizeChallengeDomain('sub.example.co')).toBe('sub.example.co'); - }); - - it('rejects URL control characters and internal hostnames', () => { - expect(sanitizeChallengeDomain('example.com:8080')).toBeNull(); - expect(sanitizeChallengeDomain('example.com/path#')).toBeNull(); - expect(sanitizeChallengeDomain('example.com?target=1')).toBeNull(); - expect(sanitizeChallengeDomain('user@example.com')).toBeNull(); - expect(sanitizeChallengeDomain('localhost')).toBeNull(); - expect(sanitizeChallengeDomain('account-service.account-system.svc')).toBeNull(); - expect(sanitizeChallengeDomain('kubernetes.default.svc.cluster.local')).toBeNull(); - expect(sanitizeChallengeDomain('10.0.0.1')).toBeNull(); - }); - }); - - describe('isPublicIp', () => { - it('rejects private and reserved addresses', () => { - expect(isPublicIp('10.0.0.1')).toBe(false); - expect(isPublicIp('127.0.0.1')).toBe(false); - expect(isPublicIp('169.254.169.254')).toBe(false); - expect(isPublicIp('172.16.0.1')).toBe(false); - expect(isPublicIp('192.168.1.1')).toBe(false); - expect(isPublicIp('192.0.0.1')).toBe(false); - expect(isPublicIp('192.0.2.1')).toBe(false); - expect(isPublicIp('198.51.100.1')).toBe(false); - expect(isPublicIp('203.0.113.1')).toBe(false); - expect(isPublicIp('::1')).toBe(false); - expect(isPublicIp('fc00::1')).toBe(false); - expect(isPublicIp('fe80::1')).toBe(false); - expect(isPublicIp('febf::1')).toBe(false); - expect(isPublicIp('ff02::1')).toBe(false); - expect(isPublicIp('::ffff:10.0.0.1')).toBe(false); - expect(isPublicIp('::ffff:7f00:1')).toBe(false); - expect(isPublicIp('::127.0.0.1')).toBe(false); - expect(isPublicIp('::a00:1')).toBe(false); - expect(isPublicIp('2002:0a00:0001::1')).toBe(false); - expect(isPublicIp('2002:c0a8:0001::1')).toBe(false); - }); - - it('allows public addresses', () => { - expect(isPublicIp('93.184.216.34')).toBe(true); - expect(isPublicIp('192.0.1.1')).toBe(true); - expect(isPublicIp('2001:4860:4860::8888')).toBe(true); - }); - }); - - it('formats IPv6 hosts for URL authorities', () => { - expect(formatChallengeHost('93.184.216.34')).toBe('93.184.216.34'); - expect(formatChallengeHost('2001:4860:4860::8888')).toBe('[2001:4860:4860::8888]'); - }); - - it('requires authentication before resolving or fetching', async () => { - const response = await callHandler({ customDomain: 'example.com' }, ''); - - expect(response.code).toBe(401); - expect(mockedQueryA).not.toHaveBeenCalled(); - expect(mockedHttpRequest).not.toHaveBeenCalled(); - }); - - it('returns forbidden when the kubeconfig cannot access its namespace', async () => { - mockedGetK8s.mockResolvedValueOnce({ - namespace: 'ns-test', - k8sCore: { - listNamespacedService: vi.fn().mockRejectedValue({ - body: { - code: 403, - message: 'forbidden' - } - }) - } - } as any); - - const response = await callHandler({ customDomain: 'example.com' }, 'not-a-kubeconfig'); - - expect(response.code).toBe(403); - expect(response.error.code).toBe('FORBIDDEN'); - expect(mockedQueryA).not.toHaveBeenCalled(); - expect(mockedHttpRequest).not.toHaveBeenCalled(); - }); - - it('does not report server-side authentication probe failures as unauthorized', async () => { - mockedGetK8s.mockResolvedValueOnce({ - namespace: 'ns-test', - k8sCore: { - listNamespacedService: vi.fn().mockRejectedValue({ - body: { - code: 500, - message: 'apiserver unavailable' - } - }) - } - } as any); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(500); - expect(response.error.code).toBe('INTERNAL_ERROR'); - expect(mockedQueryA).not.toHaveBeenCalled(); - expect(mockedHttpRequest).not.toHaveBeenCalled(); - }); - - it('rejects fragment path-control input before DNS resolution', async () => { - const response = await callHandler({ - customDomain: 'desktop-frontend.sealos.svc:3000/api/platform/getCloudConfig#' - }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('INVALID_CUSTOM_DOMAIN'); - expect(mockedQueryA).not.toHaveBeenCalled(); - expect(mockedHttpRequest).not.toHaveBeenCalled(); - }); - - it('rejects domains resolving to private addresses', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '10.0.0.2' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('PRIVATE_ADDRESS_NOT_ALLOWED'); - expect(mockedHttpRequest).not.toHaveBeenCalled(); - }); - - it('rejects unsafe redirects during challenge fetch', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse(null, 302, { - location: 'http://account-service.account-system.svc:2333/swagger/doc.json' - }); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('CHALLENGE_REQUEST_FAILED'); - expect(mockedHttpRequest).toHaveBeenCalledWith( - expect.objectContaining({ - hostname: '93.184.216.34', - path: '/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop', - headers: expect.objectContaining({ - Host: 'example.com' - }) - }), - expect.any(Function) - ); - expect(mockedHttpsRequest).not.toHaveBeenCalled(); - }); - - it('allows same-host HTTP to HTTPS challenge redirects', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse(null, 301, { - location: 'https://example.com/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop' - }); - mockHttpsResponse(createValidChallengeResponse()); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(200); - expect(response.data.verified).toBe(true); - expect(mockedHttpRequest).toHaveBeenCalledTimes(1); - expect(mockedQueryA).toHaveBeenCalledTimes(1); - expect(mockedQueryAAAA).toHaveBeenCalledTimes(1); - expect(mockedHttpRequest).toHaveBeenCalledWith( - expect.objectContaining({ - hostname: '93.184.216.34', - path: '/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop', - headers: expect.objectContaining({ - Host: 'example.com' - }) - }), - expect.any(Function) - ); - expect(mockedHttpsRequest).toHaveBeenCalledWith( - expect.objectContaining({ - hostname: '93.184.216.34', - path: '/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop', - servername: 'example.com', - headers: expect.objectContaining({ - Host: 'example.com' - }) - }), - expect.any(Function) - ); - }); - - it('reuses the initially resolved IP for same-host HTTPS redirects', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse(null, 301, { - location: 'https://example.com/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop' - }); - mockHttpsResponse(createValidChallengeResponse()); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(200); - expect(mockedHttpRequest).toHaveBeenCalledTimes(1); - expect(mockedQueryA).toHaveBeenCalledTimes(1); - expect(mockedQueryAAAA).toHaveBeenCalledTimes(1); - expect(mockedHttpsRequest).toHaveBeenCalledWith( - expect.objectContaining({ - hostname: '93.184.216.34', - servername: 'example.com', - headers: expect.objectContaining({ - Host: 'example.com' - }) - }), - expect.any(Function) - ); - }); - - it('rejects redirects to a different host', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse(null, 302, { - location: - 'https://evil.example/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop' - }); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('CHALLENGE_REQUEST_FAILED'); - expect(mockedHttpRequest).toHaveBeenCalledTimes(1); - expect(mockedHttpsRequest).not.toHaveBeenCalled(); - }); - - it('rejects redirects that change the challenge path', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse(null, 302, { - location: 'https://example.com/other-path' - }); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('CHALLENGE_REQUEST_FAILED'); - expect(mockedHttpRequest).toHaveBeenCalledTimes(1); - expect(mockedHttpsRequest).not.toHaveBeenCalled(); - }); - - it('does not reflect invalid challenge response bodies', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - mockHttpResponse({ - internal: { - token: 'should-not-leak' - } - }); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('INVALID_CHALLENGE_RESPONSE'); - expect(response.error.response).toBeUndefined(); - expect(JSON.stringify(response)).not.toContain('should-not-leak'); - }); - - it('uses resolved IPv6 host for HTTP challenge targets', async () => { - mockedQueryA.mockRejectedValueOnce(new Error('no A')); - mockedQueryAAAA.mockResolvedValueOnce({ - name: 'example.com', - type: 'AAAA', - ttl: 60, - data: '2001:4860:4860::8888' - }); - mockHttpResponse({ - internal: { - token: 'should-not-leak' - } - }); - - await callHandler({ customDomain: 'example.com' }); - - expect(mockedHttpRequest).toHaveBeenCalledWith( - expect.objectContaining({ - hostname: '2001:4860:4860::8888', - path: '/api/.well-known/applaunchpad-domain-challenge/abcdefghijklmnop', - headers: expect.objectContaining({ - Host: 'example.com' - }) - }), - expect.any(Function) - ); - }); - - it('does not expose computed signature material on signature failure', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - - mockHttpResponse({ - host: 'attacker-controlled.example', - token: 'abcdefghijklmnop', - timestamp: Math.floor(Date.now() / 1000), - service: 'applaunchpad', - isProxy: false, - signature: 'invalid-signature' - }); - - const response = await callHandler({ customDomain: 'example.com' }); - - expect(response.code).toBe(400); - expect(response.error.code).toBe('SIGNATURE_VERIFICATION_FAILED'); - expect(response.error.expected).toBeUndefined(); - expect(response.error.signatureData).toBeUndefined(); - expect(JSON.stringify(response)).not.toContain('attacker-controlled.example'); - }); - - it('verifies a valid public challenge response', async () => { - mockedQueryA.mockResolvedValueOnce({ - name: 'example.com', - type: 'A', - ttl: 60, - data: '93.184.216.34' - }); - mockedQueryAAAA.mockRejectedValueOnce(new Error('no AAAA')); - - mockHttpResponse(createValidChallengeResponse()); - - const response = await callHandler({ customDomain: 'Example.COM.' }); - - expect(response.code).toBe(200); - expect(response.data).toMatchObject({ - verified: true, - domain: 'example.com', - proxy: { - isProxy: false - } - }); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/pages/api/v1alpha/createApp.test.ts b/frontend/providers/applaunchpad/__tests__/unit/pages/api/v1alpha/createApp.test.ts deleted file mode 100644 index 739ad2157..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/pages/api/v1alpha/createApp.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import type { AppEditType } from '@/types/app'; -import { hydrateLegacyAppForm, hydrateLegacyAppFormData } from '@/utils/hydrateLegacyAppForm'; -import { - cpuMillicoresToQuantity, - memoryMiToQuantity, - storageGiToQuantity -} from '@/utils/resourceQuantity'; - -const createApp = (): AppEditType => - ({ - appName: 'demo', - imageName: 'nginx:latest', - runCMD: '', - cmdParam: '', - replicas: 1, - cpu: cpuMillicoresToQuantity(100), - memory: memoryMiToQuantity(128), - networks: [], - envs: [], - hpa: { - use: false, - target: 'cpu', - value: 50, - minReplicas: 1, - maxReplicas: 1 - }, - secret: { - use: false, - username: '', - password: '', - serverAddress: '' - }, - configMapList: [], - storeList: [], - labels: {}, - volumes: [], - volumeMounts: [], - kind: 'deployment' - } as AppEditType); - -describe('hydrateLegacyAppForm', () => { - it('converts partial URL formData resources to Quantity values', () => { - const formData = hydrateLegacyAppFormData({ - cpu: 2000, - memory: '4096' - } as unknown as Partial); - - expect(formData.cpu?.toString()).toBe('2'); - expect(formData.memory?.toString()).toBe('4Gi'); - }); - - it('converts legacy numeric resources to Quantity values', () => { - const app = hydrateLegacyAppForm({ - ...createApp(), - cpu: '500', - memory: 1024, - storeList: [ - { - name: 'data', - path: '/data', - value: 2 - } - ] - } as unknown as AppEditType); - - expect(app.cpu.toString()).toBe('500m'); - expect(app.memory.toString()).toBe('1Gi'); - expect(app.storeList[0].value.toString()).toBe('2Gi'); - }); - - it('fills missing legacy resources with default Quantity values', () => { - const app = hydrateLegacyAppForm({ - ...createApp(), - cpu: undefined, - memory: undefined, - configMapList: undefined, - networks: undefined - } as unknown as AppEditType); - - expect(app.cpu.toString()).toBe('200m'); - expect(app.memory.toString()).toBe('256Mi'); - expect(app.configMapList).toEqual([]); - expect(app.networks.length).toBe(1); - }); - - it('keeps Quantity resources unchanged', () => { - const cpu = cpuMillicoresToQuantity(300); - const memory = memoryMiToQuantity(512); - const storage = storageGiToQuantity(1); - const app = hydrateLegacyAppForm({ - ...createApp(), - cpu, - memory, - storeList: [ - { - name: 'data', - path: '/data', - value: storage - } - ] - }); - - expect(app.cpu).toBe(cpu); - expect(app.memory).toBe(memory); - expect(app.storeList[0].value).toBe(storage); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/pages/api/v2alpha/docs.test.ts b/frontend/providers/applaunchpad/__tests__/unit/pages/api/v2alpha/docs.test.ts deleted file mode 100644 index 131da53c0..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/pages/api/v2alpha/docs.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -// @vitest-environment node -import type { NextApiRequest, NextApiResponse } from 'next'; -import { describe, expect, it, vi } from 'vitest'; - -import handler from '@/pages/api/v2alpha/docs'; - -const createResponse = () => - ({ - setHeader: vi.fn(), - status: vi.fn().mockReturnThis(), - send: vi.fn() - } as unknown as NextApiResponse & { - setHeader: ReturnType; - status: ReturnType; - send: ReturnType; - }); - -describe('/api/v2alpha/docs', () => { - it('returns a standalone Scalar docs page', async () => { - const req = { method: 'GET' } as NextApiRequest; - const res = createResponse(); - - await handler(req, res); - - expect(res.setHeader).toHaveBeenCalledWith('Content-Type', 'text/html; charset=utf-8'); - expect(res.status).toHaveBeenCalledWith(200); - expect(res.send.mock.calls[0][0]).toContain('id="api-reference"'); - expect(res.send.mock.calls[0][0]).toContain('data-url="/api/v2alpha/openapi.json"'); - expect(res.send.mock.calls[0][0]).toContain('@scalar/api-reference@1.43.17'); - }); -}); diff --git a/frontend/providers/applaunchpad/__tests__/unit/pages/app/network-service-identity.test.tsx b/frontend/providers/applaunchpad/__tests__/unit/pages/app/network-service-identity.test.tsx deleted file mode 100644 index 7208c76f3..000000000 --- a/frontend/providers/applaunchpad/__tests__/unit/pages/app/network-service-identity.test.tsx +++ /dev/null @@ -1,148 +0,0 @@ -// @vitest-environment jsdom -import React from 'react'; -import { afterEach, describe, expect, it, vi } from 'vitest'; -import { cleanup, fireEvent, render, screen } from '@testing-library/react'; -import { useForm, type UseFormReturn } from 'react-hook-form'; -import { NetworkSection } from '@/pages/app/edit/components/NetworkSection'; -import type { AppEditType } from '@/types/app'; -import { json2Ingress, json2Service, yamlString2Objects } from '@/utils/deployYaml2Json'; - -vi.mock('next-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key }) })); -vi.mock('next/dynamic', () => ({ default: () => () => null })); -vi.mock('@/hooks/useClientAppConfig', () => ({ - useClientAppConfig: () => ({ domain: 'example.com', userDomains: [] }) -})); -vi.mock('@sealos/shadcn-ui', () => ({ - Card: ({ children }: any) =>
{children}
, - CardContent: ({ children }: any) =>
{children}
, - CardDescription: ({ children }: any) =>
{children}
, - CardHeader: ({ children }: any) =>
{children}
, - CardTitle: ({ children }: any) =>
{children}
, - Input: React.forwardRef(function MockInput(props, ref) { - return ; - }), - Button: ({ children, onClick }: any) => -})); -vi.mock('@sealos/shadcn-ui/switch', () => ({ - Switch: ({ checked, onCheckedChange }: any) => ( - - - - {title && ( -
- {title} -
- )} - -
- {checkBoxMode && ( - - )} - - {sortedList.map((item, index) => ( -
- {checkBoxMode ? ( - - ) : ( -
{ - if (onchange && value !== item.value) { - onchange(item.value); - setIsOpen(false); - } - }} - > - {item.label} -
- )} -
- ))} -
-
- - ); -}; - -export default forwardRef(AdvancedSelect); diff --git a/frontend/providers/applaunchpad/src/components/AppStatusTag/index.tsx b/frontend/providers/applaunchpad/src/components/AppStatusTag/index.tsx deleted file mode 100644 index e9ec9546a..000000000 --- a/frontend/providers/applaunchpad/src/components/AppStatusTag/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useMemo } from 'react'; -import { useTranslation } from 'next-i18next'; - -import { cn } from '@sealos/shadcn-ui'; -import type { AppStatusMapType } from '@/types/app'; -import { appStatusMap } from '@/constants/app'; - -interface AppStatusTagProps { - status: AppStatusMapType; - isPause: boolean; - showBorder?: boolean; - className?: string; -} - -const AppStatusTag = ({ status, isPause, showBorder = false, className }: AppStatusTagProps) => { - const { t } = useTranslation(); - const statusMap = useMemo(() => (isPause ? appStatusMap.pause : status), [isPause, status]); - - return ( -
-
-
- {t(statusMap.label)} -
-
- ); -}; - -export default AppStatusTag; diff --git a/frontend/providers/applaunchpad/src/components/BaseTable/SwitchPage.tsx b/frontend/providers/applaunchpad/src/components/BaseTable/SwitchPage.tsx deleted file mode 100644 index fe1c44dd4..000000000 --- a/frontend/providers/applaunchpad/src/components/BaseTable/SwitchPage.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import { Button, ButtonProps, Flex, FlexProps, Text } from '@chakra-ui/react'; -import { useTranslation } from 'next-i18next'; - -import { Icon, IconProps } from '@chakra-ui/react'; - -export function ToLeftIcon(props: IconProps) { - return ( - - - - ); -} - -export function RightFirstIcon(props: IconProps) { - return ( - - - - ); -} - -export function SwitchPage({ - totalPage, - totalItem, - pageSize, - currentPage, - setCurrentPage, - isPreviousData, - ...props -}: { - currentPage: number; - totalPage: number; - totalItem: number; - pageSize: number; - isPreviousData?: boolean; - setCurrentPage: (idx: number) => void; -} & FlexProps) { - const { t } = useTranslation(); - const switchStyle: ButtonProps = { - width: '24px', - height: '24px', - minW: '0', - background: 'grayModern.250', - flexGrow: '0', - borderRadius: 'full', - // variant:'unstyled', - _hover: { - background: 'grayModern.150', - minW: '0' - }, - _disabled: { - borderRadius: 'full', - background: 'grayModern.150', - cursor: 'not-allowed', - minW: '0' - } - }; - return ( - - - {t('Total')}: - - - {totalItem} - - - - - {currentPage} - / - {totalPage} - - - - - {pageSize} - - - /{t('Page')} - - - ); -} diff --git a/frontend/providers/applaunchpad/src/components/BaseTable/index.tsx b/frontend/providers/applaunchpad/src/components/BaseTable/index.tsx deleted file mode 100644 index 3d2e9934b..000000000 --- a/frontend/providers/applaunchpad/src/components/BaseTable/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Column, Row, Table as ReactTable, flexRender } from '@tanstack/react-table'; -import { CSSProperties } from 'react'; -import { Loading } from '@sealos/shadcn-ui/loading'; -import { cn } from '@sealos/shadcn-ui'; -import { - Table, - TableHeader, - TableBody, - TableHead, - TableRow, - TableCell -} from '@sealos/shadcn-ui/table'; - -const getCommonPinningStyles = (column: Column): CSSProperties => { - const isPinned = column.getIsPinned(); - - return { - position: isPinned ? 'sticky' : 'relative', - left: isPinned === 'left' ? 0 : undefined, - right: isPinned === 'right' ? 0 : undefined, - zIndex: isPinned ? 10 : 0 - }; -}; - -export function BaseTable({ - table, - isLoading, - isHeaderFixed = false, - className, - rowClassName, - ...props -}: { - table: ReactTable; - isLoading: boolean; - isHeaderFixed?: boolean; - className?: string; - rowClassName?: (row: Row, rowIndex: number) => string; -} & React.HTMLAttributes) { - return ( -
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header, i) => ( - - {header.isPlaceholder - ? null - : flexRender(header.column.columnDef.header, header.getContext())} - - ))} - - ))} - - - {isLoading ? ( - - - - - - ) : ( - table.getRowModel().rows.map((row, rowIndex) => ( - - {row.getVisibleCells().map((cell) => { - const isPinned = cell.column.getIsPinned(); - return ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ); - })} - - )) - )} - -
-
- ); -} diff --git a/frontend/providers/applaunchpad/src/components/ButtonGroup/index.tsx b/frontend/providers/applaunchpad/src/components/ButtonGroup/index.tsx deleted file mode 100644 index f28defa8b..000000000 --- a/frontend/providers/applaunchpad/src/components/ButtonGroup/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { Flex, Box } from '@chakra-ui/react'; - -const ButtonGroup = ({ - list -}: { - list: { - label: string; - onclick: () => void; - active: boolean; - }[]; -}) => { - return ( - - {list.map((item) => ( - - {item.label} - - ))} - - ); -}; - -export default ButtonGroup; diff --git a/frontend/providers/applaunchpad/src/components/DatePicker/index.tsx b/frontend/providers/applaunchpad/src/components/DatePicker/index.tsx deleted file mode 100644 index 9793a0178..000000000 --- a/frontend/providers/applaunchpad/src/components/DatePicker/index.tsx +++ /dev/null @@ -1,568 +0,0 @@ -'use client'; - -import { format, isAfter, isBefore, subDays } from 'date-fns'; -import { enUS, zhCN } from 'date-fns/locale'; -import { useTranslation } from 'next-i18next'; -import { ChangeEventHandler, useMemo, useState } from 'react'; -import { DateRange, DayPicker } from 'react-day-picker'; -import useDateTimeStore from '@/store/date'; -import { - formatDateInTimeZone, - formatDateTimeInTimeZone, - formatTimeInTimeZone, - getBrowserTimeZone, - getBoundedRangeStart, - getBoundedDayRangeInTimeZone, - getDayBoundsInTimeZone, - normalizeTimeInput, - orderDateRange, - parseTimeRange, - parseDateTimeInTimeZone -} from '@/utils/timeRange'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Calendar, RefreshCw } from 'lucide-react'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Popover, PopoverContent, PopoverTrigger } from '@sealos/shadcn-ui/popover'; -import { cn } from '@sealos/shadcn-ui'; -import 'react-day-picker/style.css'; - -interface DatePickerProps { - isDisabled?: boolean; - className?: string; -} - -interface RecentDate { - label: string; - value: DateRange; - compareValue: string; -} - -const DatePicker = ({ isDisabled = false, className }: DatePickerProps) => { - const { t, i18n } = useTranslation(); - const currentLang = i18n.language; - const [isOpen, setIsOpen] = useState(false); - const timeZone = useMemo(() => getBrowserTimeZone(), []); - - const { - startDateTime, - endDateTime, - setStartDateTime, - setEndDateTime, - setManualRange, - setAutoRange - } = useDateTimeStore(); - - const now = new Date(); - const sevenDaysAgo = subDays(now, 7); - const earliestCalendarDay = getDayBoundsInTimeZone(sevenDaysAgo, timeZone).start; - const latestCalendarDay = getDayBoundsInTimeZone(now, timeZone).start; - - const initState = { - from: startDateTime, - to: endDateTime - }; - - const recentDateList = useMemo( - () => [ - { - label: `${t('recently')} 5 ${t('minute')}`, - value: getDateRange('5m'), - compareValue: '5m' - }, - { - label: `${t('recently')} 15 ${t('minute')}`, - value: getDateRange('15m'), - compareValue: '15m' - }, - { - label: `${t('recently')} 30 ${t('minute')}`, - value: getDateRange('30m'), - compareValue: '30m' - }, - { - label: `${t('recently')} 1 ${t('hour-singular')}`, - value: getDateRange('1h'), - compareValue: '1h' - }, - { - label: `${t('recently')} 3 ${t('hour')}`, - value: getDateRange('3h'), - compareValue: '3h' - }, - { - label: `${t('recently')} 6 ${t('hour')}`, - value: getDateRange('6h'), - compareValue: '6h' - }, - { - label: `${t('recently')} 24 ${t('hour')}`, - value: getDateRange('24h'), - compareValue: '24h' - }, - { - label: `${t('recently')} 2 ${t('day')}`, - value: getDateRange('2d'), - compareValue: '2d' - }, - { - label: `${t('recently')} 3 ${t('day')}`, - value: getDateRange('3d'), - compareValue: '3d' - }, - { - label: `${t('recently')} 7 ${t('day')}`, - value: getDateRange('7d'), - compareValue: '7d' - } - ], - [t] - ); - - const isExactMatch = (currentStart: Date, currentEnd: Date, presetRange: DateRange) => { - if (!presetRange.from || !presetRange.to) return false; - - const tolerance = 1000; // 1秒 - const startDiff = Math.abs(currentStart.getTime() - presetRange.from.getTime()); - const endDiff = Math.abs(currentEnd.getTime() - presetRange.to.getTime()); - - return startDiff <= tolerance && endDiff <= tolerance; - }; - - const defaultRecentDate = useMemo(() => { - const exactMatch = recentDateList.find((item) => - isExactMatch(startDateTime, endDateTime, item.value) - ); - - if (exactMatch) { - return exactMatch; - } - - return null; - }, [startDateTime, endDateTime, recentDateList]); - - const [inputState, setInputState] = useState<0 | 1>(0); - const [recentDate, setRecentDate] = useState(defaultRecentDate); - - const [fromDateString, setFromDateString] = useState( - formatDateInTimeZone(initState.from, timeZone) - ); - const [toDateString, setToDateString] = useState( - formatDateInTimeZone(initState.to, timeZone) - ); - const [fromTimeString, setFromTimeString] = useState( - formatTimeInTimeZone(initState.from, timeZone) - ); - const [toTimeString, setToTimeString] = useState( - formatTimeInTimeZone(initState.to, timeZone) - ); - - const [fromDateError, setFromDateError] = useState(null); - const [toDateError, setToDateError] = useState(null); - const [fromTimeError, setFromTimeError] = useState(null); - const [toTimeError, setToTimeError] = useState(null); - const [fromDateShake, setFromDateShake] = useState(false); - const [toDateShake, setToDateShake] = useState(false); - const [fromTimeShake, setFromTimeShake] = useState(false); - const [toTimeShake, setToTimeShake] = useState(false); - - const [selectedRange, setSelectedRange] = useState(initState); - - const syncRange = ({ from, to }: { from: Date; to: Date }) => { - setSelectedRange({ from, to }); - setFromDateString(formatDateInTimeZone(from, timeZone)); - setFromTimeString(formatTimeInTimeZone(from, timeZone)); - setToDateString(formatDateInTimeZone(to, timeZone)); - setToTimeString(formatTimeInTimeZone(to, timeZone)); - }; - - const onSubmit = () => { - if (fromDateError || fromTimeError || toDateError || toTimeError) { - if (fromDateError) setFromDateShake(true); - if (toDateError) setToDateShake(true); - if (fromTimeError) setFromTimeShake(true); - if (toTimeError) setToTimeShake(true); - setTimeout(() => { - setFromDateShake(false); - setToDateShake(false); - setFromTimeShake(false); - setToTimeShake(false); - }, 300); - - return; - } - const start = parseDateTimeInTimeZone(fromDateString, fromTimeString, timeZone); - const end = parseDateTimeInTimeZone(toDateString, toTimeString, timeZone); - - if (!start || !end) { - if (!start) setFromTimeError('Invalid start time range'); - if (!end) setToTimeError('Invalid end time range'); - return; - } - - if (start > end) { - setFromTimeError('Start time must be before end time'); - setToTimeError('End time must be after start time'); - return; - } - - const submitNow = new Date(); - const earliestStart = subDays(submitNow, 7); - const boundedStart = getBoundedRangeStart(start, end, earliestStart, timeZone); - - if (!boundedStart) { - setFromTimeError('start time cannot be before 7 days ago'); - return; - } - - if (isAfter(end, submitNow)) { - setToTimeError('end time cannot be after current time'); - return; - } - - setFromDateError(null); - setFromTimeError(null); - setToDateError(null); - setToTimeError(null); - syncRange({ from: boundedStart, to: end }); - setStartDateTime(boundedStart); - setEndDateTime(end); - setIsOpen(false); - }; - - const handleFromChange = (value: string, type: 'date' | 'time') => { - setManualRange(); - const normalizedValue = type === 'time' ? normalizeTimeInput(value) : value; - - if (type === 'date') { - setFromDateString(value); - } else { - setFromTimeString(normalizedValue); - } - - const date = parseDateTimeInTimeZone( - type === 'date' ? value : fromDateString, - type === 'time' ? normalizedValue : fromTimeString, - timeZone - ); - - if (!date) { - if (type === 'date') { - setFromDateError('Invalid date format'); - } else { - setFromTimeError('Invalid time format'); - } - return setSelectedRange({ from: undefined, to: selectedRange?.to }); - } - - if (isBefore(date, sevenDaysAgo)) { - if (type === 'date') { - setFromDateError('start time cannot be before 7 days ago'); - } else { - setFromTimeError('start time cannot be before 7 days ago'); - } - return; - } - - setFromDateError(null); - setFromTimeError(null); - - setRecentDate(null); - - if (selectedRange?.to) { - syncRange(orderDateRange(date, selectedRange.to)); - } else { - syncRange({ from: date, to: date }); - } - }; - - const handleToChange = (value: string, type: 'date' | 'time') => { - setManualRange(); - const normalizedValue = type === 'time' ? normalizeTimeInput(value) : value; - - if (type === 'date') { - setToDateString(value); - } else { - setToTimeString(normalizedValue); - } - - const date = parseDateTimeInTimeZone( - type === 'date' ? value : toDateString, - type === 'time' ? normalizedValue : toTimeString, - timeZone - ); - - if (!date) { - if (type === 'date') { - setToDateError('Invalid date format'); - } else { - setToTimeError('Invalid time format'); - } - return setSelectedRange({ from: selectedRange?.from, to: undefined }); - } - - if (isAfter(date, now)) { - if (type === 'date') { - setToDateError('end time cannot be after current time'); - } else { - setToTimeError('end time cannot be after current time'); - } - return; - } - - setToDateError(null); - setToTimeError(null); - - setRecentDate(null); - - if (selectedRange?.from) { - syncRange(orderDateRange(selectedRange.from, date)); - } else { - syncRange({ from: date, to: date }); - } - }; - - const handleRangeSelect = (range: DateRange | undefined) => { - setManualRange(); - if (range) { - let { from, to } = range; - - if (inputState === 0) { - // from - if (from === selectedRange?.from) { - // when 'to' is changed - from = to; - } else { - to = from; - } - setInputState(1); - } else { - setInputState(0); - } - const boundedRange = getBoundedDayRangeInTimeZone(from, to, sevenDaysAgo, now, timeZone); - - setSelectedRange(boundedRange); - if (boundedRange.from) { - setFromDateString(formatDateInTimeZone(boundedRange.from, timeZone)); - setFromTimeString(formatTimeInTimeZone(boundedRange.from, timeZone)); - } else { - setFromDateString(formatDateInTimeZone(now, timeZone)); - setFromTimeString(formatTimeInTimeZone(now, timeZone)); - } - if (boundedRange.to) { - setToDateString(formatDateInTimeZone(boundedRange.to, timeZone)); - setToTimeString(formatTimeInTimeZone(boundedRange.to, timeZone)); - } else { - const fallback = boundedRange.from || now; - setToDateString(formatDateInTimeZone(fallback, timeZone)); - setToTimeString(formatTimeInTimeZone(fallback, timeZone)); - } - - setRecentDate(null); - } else { - // default is cancel - if (fromDateString && fromTimeString && selectedRange?.from) { - setToDateString(fromDateString); - setToTimeString(fromTimeString); - setSelectedRange({ - ...selectedRange, - to: selectedRange.from - }); - setInputState(1); - } - } - }; - - const handleRecentDateClick = (item: RecentDate) => { - setAutoRange(item.compareValue); - setFromDateError(null); - setFromTimeError(null); - setToDateError(null); - setToTimeError(null); - - const nextRange = getDateRange(item.compareValue); - setRecentDate({ ...item, value: nextRange }); - setSelectedRange(nextRange); - if (nextRange.from) { - setFromDateString(formatDateInTimeZone(nextRange.from, timeZone)); - setFromTimeString(formatTimeInTimeZone(nextRange.from, timeZone)); - } - if (nextRange.to) { - setToDateString(formatDateInTimeZone(nextRange.to, timeZone)); - setToTimeString(formatTimeInTimeZone(nextRange.to, timeZone)); - } - }; - - // format date time display - const formatDateTimeDisplay = () => { - return `${formatDateTimeInTimeZone( - startDateTime, - timeZone, - 'HH:mm, MMM DD' - )} - ${formatDateTimeInTimeZone(endDateTime, timeZone, 'HH:mm, MMM DD')}`; - }; - - return ( - - - - - -
-
- { - const dayStart = getDayBoundsInTimeZone(date, timeZone).start; - return ( - isAfter(dayStart, latestCalendarDay) || isBefore(dayStart, earliestCalendarDay) - ); - }} - formatters={{ - formatWeekdayName: (date) => - format(date, 'EEE', { locale: currentLang === 'zh' ? zhCN : enUS }) - }} - className="px-4 pb-2 pt-4" - /> - -
- {t('start')} -
- handleFromChange(e.target.value, 'date')} - error={!!fromDateError} - showError={fromDateShake} - /> - handleFromChange(e.target.value, 'time')} - error={!!fromTimeError} - showError={fromTimeShake} - /> -
-
- -
- {t('end')} -
- handleToChange(e.target.value, 'date')} - error={!!toDateError} - showError={toDateShake} - /> - handleToChange(e.target.value, 'time')} - error={!!toTimeError} - showError={toTimeShake} - /> -
-
-
-
-
- {recentDateList.map((item) => ( - - ))} -
-
-
- -
- {timeZone} -
- - - -
-
-
-
- ); -}; - -interface DatePickerInputProps { - value: string; - onChange: ChangeEventHandler | undefined; - error: boolean; - showError: boolean; -} - -const DatePickerInput = ({ value, onChange, error, showError }: DatePickerInputProps) => { - return ( - - ); -}; - -const getDateRange = (value: string): DateRange => { - const { startTime: from, endTime: to } = parseTimeRange(value); - return { from, to }; -}; - -export default DatePicker; diff --git a/frontend/providers/applaunchpad/src/components/ErrorModal.tsx b/frontend/providers/applaunchpad/src/components/ErrorModal.tsx deleted file mode 100644 index 988128a4a..000000000 --- a/frontend/providers/applaunchpad/src/components/ErrorModal.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogFooter -} from '@sealos/shadcn-ui/dialog'; -import { Button } from '@sealos/shadcn-ui/button'; -import { useTranslation } from 'next-i18next'; -import { ResponseCode } from '@/types/response'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import { TriangleAlert } from 'lucide-react'; - -const ErrorModal = ({ - title, - content, - onClose, - errorCode -}: { - title: string; - content: string; - onClose: () => void; - errorCode?: ResponseCode; -}) => { - const { t } = useTranslation(); - - const openCostCenterApp = () => { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-costcenter', - query: { - openRecharge: 'true' - } - }); - }; - - return ( - !open && onClose()}> - - - - - {t(title)} - - - -
{t(content)}
- - - - - -
-
- ); -}; - -export default ErrorModal; diff --git a/frontend/providers/applaunchpad/src/components/FormControl/index.tsx b/frontend/providers/applaunchpad/src/components/FormControl/index.tsx deleted file mode 100644 index 904350290..000000000 --- a/frontend/providers/applaunchpad/src/components/FormControl/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { ReactNode } from 'react'; -import { FormControl, FormErrorMessage } from '@chakra-ui/react'; -import type { FormControlProps } from '@chakra-ui/react'; - -interface Props extends FormControlProps { - errorText?: string; - showError?: boolean; - children: ReactNode; -} - -const MyFormControl = ({ errorText, showError = false, children, ...props }: Props) => { - return ( - - {children} - {showError && !!errorText && ( - - {errorText} - - )} - - ); -}; - -export default MyFormControl; diff --git a/frontend/providers/applaunchpad/src/components/GPUItem/index.tsx b/frontend/providers/applaunchpad/src/components/GPUItem/index.tsx deleted file mode 100644 index 97078d1ec..000000000 --- a/frontend/providers/applaunchpad/src/components/GPUItem/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useMemo } from 'react'; -import MyIcon from '../Icon'; -import { GpuType } from '@/types/app'; -import { useTranslation } from 'next-i18next'; -import { useUserStore } from '@/store/user'; - -const GPUItem = ({ gpu }: { gpu?: GpuType }) => { - const { t } = useTranslation(); - const { userSourcePrice } = useUserStore(); - - const gpuAlias = useMemo(() => { - const gpuItem = userSourcePrice?.gpu?.find((item) => item.type === gpu?.type); - - return gpuItem?.alias || gpu?.type || ''; - }, [gpu?.type, userSourcePrice?.gpu]); - - return ( -
- - {gpuAlias && ( - <> - {gpuAlias} - / - - )} - - {gpuAlias ? gpu?.amount : 0} - {t('Card')} - -
- ); -}; - -export default React.memo(GPUItem); diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/analyze.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/analyze.svg deleted file mode 100644 index 503178647..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/analyze.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/appType.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/appType.svg deleted file mode 100644 index 1b9a96f4d..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/appType.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/arrowLeft.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/arrowLeft.svg deleted file mode 100644 index 045c63cbc..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/arrowLeft.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/arrowRight.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/arrowRight.svg deleted file mode 100644 index 80e943436..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/arrowRight.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/calendar.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/calendar.svg deleted file mode 100644 index f864a731f..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/calendar.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/change.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/change.svg deleted file mode 100644 index 2ffbb98e1..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/change.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/chart.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/chart.svg deleted file mode 100644 index c6902b196..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/chart.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/configMap-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/configMap-color.svg deleted file mode 100644 index 6cc77ca8c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/configMap-color.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/configMap.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/configMap.svg deleted file mode 100644 index 88d5f5340..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/configMap.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/container.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/container.svg deleted file mode 100644 index c15441ffd..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/container.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/continue.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/continue.svg deleted file mode 100644 index d38b29ef0..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/continue.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/copy.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/copy.svg deleted file mode 100644 index adc04ee68..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/copy.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/delete.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/delete.svg deleted file mode 100644 index 7f07bdcd4..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/deployMode.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/deployMode.svg deleted file mode 100644 index 0069d388a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/deployMode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/detail.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/detail.svg deleted file mode 100644 index 63bb1eda5..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/detail.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/download.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/download.svg deleted file mode 100644 index 13fd73a9b..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/download.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/edit.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/edit.svg deleted file mode 100644 index 031f0c1f3..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/edit.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/emptyChart.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/emptyChart.svg deleted file mode 100644 index af039d00a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/emptyChart.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/enlarge.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/enlarge.svg deleted file mode 100644 index 565f9406a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/enlarge.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/export.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/export.svg deleted file mode 100644 index 6fbd16dbd..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/export.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file.svg deleted file mode 100644 index a5456274a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv-color.svg deleted file mode 100644 index 895ff4949..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv-color.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv.svg deleted file mode 100644 index 2fc7cd025..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/csv.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/defaul-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/defaul-color.svg deleted file mode 100644 index 70e326273..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/defaul-color.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/default.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/default.svg deleted file mode 100644 index df55085b6..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/default.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-color.svg deleted file mode 100644 index f44ff6f3c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-color.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-line.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-line.svg deleted file mode 100644 index 2129aec18..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder.svg deleted file mode 100644 index f44ff6f3c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2-color.svg deleted file mode 100644 index 3104f33a2..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2-color.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2.svg deleted file mode 100644 index aae38c626..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/html2.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf-color.svg deleted file mode 100644 index 2949ca2cf..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf-color.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf.svg deleted file mode 100644 index f30138f4b..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/pdf.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/png-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/png-color.svg deleted file mode 100644 index 9e3a1233f..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/png-color.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/png.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/png.svg deleted file mode 100644 index 7f43c603c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/png.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt-color.svg deleted file mode 100644 index 95c9e2967..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt-color.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt.svg deleted file mode 100644 index da43ac6c7..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/txt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml-color.svg deleted file mode 100644 index 992a0d07e..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml-color.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml.svg deleted file mode 100644 index 382c968d8..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/file/yaml.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/formInfo.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/formInfo.svg deleted file mode 100644 index a7c39c65f..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/formInfo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/gift.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/gift.svg deleted file mode 100644 index 865d6307d..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/gift.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia-green.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia-green.svg deleted file mode 100644 index 97d79d2e7..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia-green.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia.svg deleted file mode 100644 index 5eefafabe..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/gpu/nvidia.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/hardDrive.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/hardDrive.svg deleted file mode 100644 index 5913c7a1c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/hardDrive.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/help.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/help.svg deleted file mode 100644 index 29dad6392..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/help.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/home.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/home.svg deleted file mode 100644 index 38cc2f366..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/listen.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/listen.svg deleted file mode 100644 index 165ee5825..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/listen.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/loading.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/loading.svg deleted file mode 100644 index 257c1b5aa..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/loading.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/log.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/log.svg deleted file mode 100644 index 5257fb78e..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/log.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/logo.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/logo.svg deleted file mode 100644 index 4afbcffda..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/monitor.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/monitor.svg deleted file mode 100644 index c81668789..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/monitor.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/more.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/more.svg deleted file mode 100644 index bc3ddc9e9..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/more.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/network.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/network.svg deleted file mode 100644 index 8ecd02dca..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/network.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/noEvents.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/noEvents.svg deleted file mode 100644 index 9665a7024..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/noEvents.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/pause.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/pause.svg deleted file mode 100644 index 0c7f9ec92..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/pause.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/plus.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/plus.svg deleted file mode 100644 index 26b54ed30..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/podList.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/podList.svg deleted file mode 100644 index 6be85b62a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/podList.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/pods.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/pods.svg deleted file mode 100644 index 7a7ebdc45..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/pods.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/refresh.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/refresh.svg deleted file mode 100644 index 302e566a1..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/refresh.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/rename.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/rename.svg deleted file mode 100644 index 3526b5759..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/rename.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/restart.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/restart.svg deleted file mode 100644 index 93cf5ef2f..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/restart.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/search.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/search.svg deleted file mode 100644 index e1feabe5c..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/settings.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/settings.svg deleted file mode 100644 index fa9f203e6..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/settings.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/start.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/start.svg deleted file mode 100644 index c0603e79a..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/start.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/statusicon.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/statusicon.svg deleted file mode 100644 index b4841dadb..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/statusicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/store-color.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/store-color.svg deleted file mode 100644 index b9a059569..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/store-color.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/store.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/store.svg deleted file mode 100644 index d212d3c11..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/store.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/target.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/target.svg deleted file mode 100644 index c9ed55907..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/target.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/terminal.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/terminal.svg deleted file mode 100644 index 385fa627e..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/terminal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/to.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/to.svg deleted file mode 100644 index af8c21bdf..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/to.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/upload.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/upload.svg deleted file mode 100644 index c672b9f9e..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/upload.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/upperRight.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/upperRight.svg deleted file mode 100644 index f3299a16f..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/upperRight.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/icons/warning.svg b/frontend/providers/applaunchpad/src/components/Icon/icons/warning.svg deleted file mode 100644 index 747b87564..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/icons/warning.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/frontend/providers/applaunchpad/src/components/Icon/index.tsx b/frontend/providers/applaunchpad/src/components/Icon/index.tsx deleted file mode 100644 index 1d53aaf41..000000000 --- a/frontend/providers/applaunchpad/src/components/Icon/index.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import React from 'react'; -import type { IconProps } from '@chakra-ui/react'; -import { Icon } from '@chakra-ui/react'; - -export const IconMap = { - more: require('./icons/more.svg').default, - store: require('./icons/store.svg').default, - storeColor: require('./icons/store-color.svg').default, - configMap: require('./icons/configMap.svg').default, - configMapColor: require('./icons/configMap-color.svg').default, - podList: require('./icons/podList.svg').default, - arrowLeft: require('./icons/arrowLeft.svg').default, - plus: require('./icons/plus.svg').default, - delete: require('./icons/delete.svg').default, - statusicon: require('./icons/statusicon.svg').default, - restart: require('./icons/restart.svg').default, - start: require('./icons/start.svg').default, - pause: require('./icons/pause.svg').default, - detail: require('./icons/detail.svg').default, - logo: require('./icons/logo.svg').default, - change: require('./icons/change.svg').default, - deployMode: require('./icons/deployMode.svg').default, - formInfo: require('./icons/formInfo.svg').default, - network: require('./icons/network.svg').default, - settings: require('./icons/settings.svg').default, - edit: require('./icons/edit.svg').default, - copy: require('./icons/copy.svg').default, - continue: require('./icons/continue.svg').default, - appType: require('./icons/appType.svg').default, - listen: require('./icons/listen.svg').default, - noEvents: require('./icons/noEvents.svg').default, - warning: require('./icons/warning.svg').default, - analyze: require('./icons/analyze.svg').default, - gift: require('./icons/gift.svg').default, - terminal: require('./icons/terminal.svg').default, - log: require('./icons/log.svg').default, - nvidia: require('./icons/gpu/nvidia.svg').default, - nvidiaGreen: require('./icons/gpu/nvidia-green.svg').default, - enlarge: require('./icons/enlarge.svg').default, - file: require('./icons/file.svg').default, - rename: require('./icons/rename.svg').default, - folder: require('./icons/file/folder.svg').default, - folderColor: require('./icons/file/folder-color.svg').default, - csv: require('./icons/file/csv.svg').default, - csvColor: require('./icons/file/csv-color.svg').default, - pdf: require('./icons/file/pdf.svg').default, - pdfColor: require('./icons/file/pdf-color.svg').default, - png: require('./icons/file/png.svg').default, - pngColor: require('./icons/file/png-color.svg').default, - txt: require('./icons/file/txt.svg').default, - txtColor: require('./icons/file/txt-color.svg').default, - html2: require('./icons/file/html2.svg').default, - html2Color: require('./icons/file/html2-color.svg').default, - upperRight: require('./icons/upperRight.svg').default, - target: require('./icons/target.svg').default, - yaml: require('./icons/file/yaml.svg').default, - yamlColor: require('./icons/file/yaml-color.svg').default, - help: require('./icons/help.svg').default, - folderLine: require('./icons/file/folder-line.svg').default, - default: require('./icons/file/default.svg').default, - defaultColor: require('./icons/file/defaul-color.svg').default, - home: require('./icons/home.svg').default, - upload: require('./icons/upload.svg').default, - search: require('./icons/search.svg').default, - pods: require('./icons/pods.svg').default, - monitor: require('./icons/monitor.svg').default, - hardDrive: require('./icons/hardDrive.svg').default, - download: require('./icons/download.svg').default, - calendar: require('./icons/calendar.svg').default, - to: require('./icons/to.svg').default, - refresh: require('./icons/refresh.svg').default, - container: require('./icons/container.svg').default, - arrowRight: require('./icons/arrowRight.svg').default, - chart: require('./icons/chart.svg').default, - export: require('./icons/export.svg').default, - loading: require('./icons/loading.svg').default -}; - -export type IconType = keyof typeof IconMap; - -const MyIcon = ({ - name, - w = 'auto', - h = 'auto', - ...props -}: { name: keyof typeof IconMap } & IconProps) => { - return IconMap[name] ? ( - - ) : null; -}; - -export default MyIcon; diff --git a/frontend/providers/applaunchpad/src/components/LangSelect/index.tsx b/frontend/providers/applaunchpad/src/components/LangSelect/index.tsx deleted file mode 100644 index 3e1401a1d..000000000 --- a/frontend/providers/applaunchpad/src/components/LangSelect/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { setLangStore } from '@/utils/cookieUtils'; -import { Menu, MenuButton, MenuButtonProps, MenuItem, MenuList, Text } from '@chakra-ui/react'; -import { useTranslation } from 'next-i18next'; - -const langIcon = ( - -); - -const LANG_MAP = { - en: { - label: 'English' - }, - zh: { - label: '中文' - } -} as const; - -const LangSelect: React.FC = (props) => { - const { i18n } = useTranslation(); - - return ( - - - {langIcon} - - - {Object.entries(LANG_MAP).map(([key, lang]) => ( - { - setLangStore(key); - i18n.changeLanguage(key); - }} - > - {lang.label} - - ))} - - - ); -}; - -export default LangSelect; diff --git a/frontend/providers/applaunchpad/src/components/LogBarChart/index.tsx b/frontend/providers/applaunchpad/src/components/LogBarChart/index.tsx deleted file mode 100644 index 8734f7150..000000000 --- a/frontend/providers/applaunchpad/src/components/LogBarChart/index.tsx +++ /dev/null @@ -1,255 +0,0 @@ -import * as echarts from 'echarts'; -import React, { useEffect, useMemo, useRef } from 'react'; - -import { useGlobalStore } from '@/store/global'; -import { MonitorDataResult } from '@/types/monitor'; -import { formatDateTimeInTimeZone, getBrowserTimeZone } from '@/utils/timeRange'; - -const map = { - blue: { - backgroundColor: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0, - color: 'rgba(147, 197, 253, 0.42)' // Tailwind blue-300 - }, - { - offset: 1, - color: 'rgba(147, 197, 253, 0)' - } - ], - global: false - }, - lineColor: '#93C5FD' // Tailwind blue-300 - }, - deepBlue: { - backgroundColor: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0, - color: 'rgba(59, 130, 246, 0.42)' // Tailwind blue-500 - }, - { - offset: 1, - color: 'rgba(59, 130, 246, 0)' - } - ], - global: false - }, - lineColor: '#3B82F6' // Tailwind blue-500 - }, - purple: { - backgroundColor: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0, - color: 'rgba(192, 132, 252, 0.42)' // Tailwind purple-400 - }, - { - offset: 1, - color: 'rgba(192, 132, 252, 0)' - } - ], - global: false - }, - lineColor: '#C084FC' // Tailwind purple-400 - }, - green: { - backgroundColor: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [ - { - offset: 0, - color: 'rgba(16, 185, 129, 0.42)' // Tailwind emerald-500 - }, - { - offset: 1, - color: 'rgba(16, 185, 129, 0)' - } - ], - global: false - }, - lineColor: '#10B981', // Tailwind emerald-500 - max: 100 - } -}; - -const LogBarChart = ({ - type, - data, - isShowLabel = false, - visible = true -}: { - type: 'blue' | 'deepBlue' | 'green' | 'purple'; - data?: MonitorDataResult; - isShowLabel?: boolean; - visible?: boolean; -}) => { - const { screenWidth } = useGlobalStore(); - const timeZone = useMemo(() => getBrowserTimeZone(), []); - const xData = useMemo( - () => - data?.xData?.map((time) => formatDateTimeInTimeZone(time * 1000, timeZone, 'MM-DD HH:mm')) || - new Array(30).fill(0), - [data?.xData, timeZone] - ); - const yData = data?.yData || new Array(30).fill(null); - - const Dom = useRef(null); - const myChart = useRef(); - const resizeObserver = useRef(); - - const optionStyle = useMemo( - () => ({ - areaStyle: { - color: map[type].backgroundColor - }, - lineStyle: { - width: '1', - color: map[type].lineColor - }, - itemStyle: { - width: 1.5, - color: map[type].lineColor - } - }), - [type] - ); - - const option = useRef({ - xAxis: { - type: 'category', - data: xData, - boundaryGap: true, - axisLine: { - lineStyle: { - color: '#E8EBF0' - } - }, - axisLabel: { - color: '#667085' - } - }, - yAxis: { - type: 'value', - splitNumber: 3, - splitLine: { - lineStyle: { - type: 'dashed', - color: '#E4E7EC' - } - } - }, - series: [ - { - data: yData, - type: 'bar', - animationDuration: 300, - barWidth: '90%', - ...optionStyle - } - ], - grid: { - left: 0, - right: 0, - bottom: 0, - top: 5, - containLabel: true - }, - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'line' - }, - formatter: (params: any[]) => { - const axisValue = params[0]?.axisValue; - const value = params[0]?.value; - const displayValue = - value === null || value === undefined || Number.isNaN(value) ? '-' : value; - return `${axisValue} ${displayValue}`; - } - } - }); - - // init chart - useEffect(() => { - if (!Dom.current || myChart?.current?.getOption() || !visible) return; - myChart.current = echarts.init(Dom.current); - myChart.current && myChart.current.setOption(option.current); - }, [Dom, visible]); - - // data changed, update - useEffect(() => { - if (!myChart.current || !myChart?.current?.getOption() || !visible) return; - option.current.xAxis.data = xData; - option.current.series[0].data = yData; - myChart.current.setOption(option.current); - }, [xData, yData, visible]); - - // type changed, update - useEffect(() => { - if (!myChart.current || !myChart?.current?.getOption()) return; - option.current.series[0] = { - ...option.current.series[0], - ...optionStyle - }; - myChart.current.setOption(option.current); - }, [optionStyle]); - - // resize chart - useEffect(() => { - if (!myChart.current || !myChart.current.getOption()) return; - myChart.current.resize(); - }, [screenWidth]); - - useEffect(() => { - if (!Dom.current || !visible) return; - - resizeObserver.current = new ResizeObserver((entries) => { - const entry = entries[0]; - if (entry?.contentRect && myChart.current) { - if (entry.contentRect.width > 0 && entry.contentRect.height > 0) { - myChart.current.resize(); - } - } - }); - - resizeObserver.current.observe(Dom.current); - - return () => { - resizeObserver.current?.disconnect(); - }; - }, [visible]); - - useEffect(() => { - return () => { - if (myChart.current) { - myChart.current.dispose(); - } - resizeObserver.current?.disconnect(); - }; - }, []); - - return
; -}; - -export default LogBarChart; diff --git a/frontend/providers/applaunchpad/src/components/Monitor/Header.tsx b/frontend/providers/applaunchpad/src/components/Monitor/Header.tsx deleted file mode 100644 index 8ade742c9..000000000 --- a/frontend/providers/applaunchpad/src/components/Monitor/Header.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { useTranslation } from 'next-i18next'; -import AdvancedSelect, { ListItem } from '../AdvancedSelect'; -import DynamicTime from './Time'; -import { REFRESH_INTERVAL_OPTIONS } from '@/constants/monitor'; -import useDateTimeStore from '@/store/date'; -import dynamic from 'next/dynamic'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue -} from '@sealos/shadcn-ui/select'; -import { Separator } from '@sealos/shadcn-ui/separator'; -import { RefreshCw } from 'lucide-react'; -const DatePicker = dynamic(() => import('@/components/DatePicker'), { ssr: false }); - -export type MonitorTab = 'performance' | 'network' | 'storage'; - -export interface NetworkOption { - serviceName?: string; - port: number; -} - -export default function Header({ - podList, - setPodList, - refetchData, - lastRefreshTime, - currentTab = 'performance', - availableNetworks = [], - selectedNetworkIndex = 0, - setSelectedNetworkIndex -}: { - podList: ListItem[]; - setPodList: (val: ListItem[]) => void; - refetchData: () => void; - lastRefreshTime?: number; - currentTab?: MonitorTab; - availableNetworks?: NetworkOption[]; - selectedNetworkIndex?: number; - setSelectedNetworkIndex?: (index: number) => void; -}) { - const { t } = useTranslation(); - const { refreshInterval, setRefreshInterval } = useDateTimeStore(); - - return ( -
-
-

{t('monitor')}

-
-
- -
-
- {currentTab === 'network' ? ( - availableNetworks.length > 0 && - setSelectedNetworkIndex && ( -
- -
- ) - ) : ( - {t('Pods')}} - title={t('pod_filtering')} - width={'fit-content'} - value={'hello-sql-postgresql-0'} - list={podList} - onCheckboxChange={(val) => { - setPodList(val); - }} - placeholder={t('please_select')} - /> - )} -
-
-
- -
-
-
- - - - - {t('refresh')} - - - -
-
- {t('Update Time')}  - -
-
-
-
- ); -} diff --git a/frontend/providers/applaunchpad/src/components/Monitor/Time.tsx b/frontend/providers/applaunchpad/src/components/Monitor/Time.tsx deleted file mode 100644 index 76f24e3f3..000000000 --- a/frontend/providers/applaunchpad/src/components/Monitor/Time.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { formatDateTimeInTimeZone, getBrowserTimeZone } from '@/utils/timeRange'; - -export default function DynamicTime({ lastRefreshTime }: { lastRefreshTime?: number }) { - if (!lastRefreshTime) { - return --:--:--; - } - - return {formatDateTimeInTimeZone(lastRefreshTime, getBrowserTimeZone(), 'HH:mm:ss')}; -} diff --git a/frontend/providers/applaunchpad/src/components/MonitorChart/index.tsx b/frontend/providers/applaunchpad/src/components/MonitorChart/index.tsx deleted file mode 100644 index 500a068bb..000000000 --- a/frontend/providers/applaunchpad/src/components/MonitorChart/index.tsx +++ /dev/null @@ -1,597 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { Check } from 'lucide-react'; -import * as echarts from 'echarts'; -import { useGlobalStore } from '@/store/global'; -import { LineStyleMap, NetworkLineStyleMap } from '@/constants/monitor'; -import { Button } from '@sealos/shadcn-ui/button'; -import { cn } from '@sealos/shadcn-ui'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { useTranslation } from 'next-i18next'; -import { formatDateTimeInTimeZone, getBrowserTimeZone } from '@/utils/timeRange'; - -type MonitorChartProps = React.HTMLAttributes & { - data: { - xData: string[]; - yData: { - name: string; - type: string; - data: Array; - lineStyleType?: string; - }[]; - }; - type?: 'blue' | 'deepBlue' | 'green' | 'purple' | 'cpu' | 'memory' | 'storage' | 'network'; - title: string; - yAxisLabelFormatter?: (value: number) => string; - yDataFormatter?: (values: Array) => Array; - xAxisLabelFormatter?: (value: string) => string; - xAxisTooltipFormatter?: (value: string) => string; - yAxisConfig?: { - min?: number | ((value: { min: number; max: number }) => number); - max?: number | ((value: { min: number; max: number }) => number); - interval?: number; - splitNumber?: number; - }; - yAxisUseNative?: boolean; - displayNameFormatter?: (params: { - seriesName: string; - seriesIndex: number; - appName?: string; - type?: string; - }) => string; - unit?: string; - isShowLegend?: boolean; - lineWidth?: number; - appName?: string; - /** All active pod names (used to distinguish active vs deprecated pods) */ - activePodNames?: string[]; - /** Checked pod names from header (only these active pods will be shown in legend and chart) */ - checkedPodNames?: string[]; -}; - -const MonitorChart = ({ - type, - data, - title, - yAxisLabelFormatter, - yDataFormatter, - xAxisLabelFormatter, - xAxisTooltipFormatter, - yAxisConfig, - yAxisUseNative, - displayNameFormatter, - unit, - isShowLegend = true, - lineWidth = 1.5, - appName, - activePodNames, - checkedPodNames, - className, - ...props -}: MonitorChartProps) => { - const { t } = useTranslation(); - const { screenWidth } = useGlobalStore(); - const timeZone = useMemo(() => getBrowserTimeZone(), []); - const chartDom = useRef(null); - const myChart = useRef(); - const seriesNames = useMemo(() => data?.yData?.map((item) => item.name) || [], [data?.yData]); - const seriesIndexMap = useMemo( - () => new Map(seriesNames.map((name, index) => [name, index])), - [seriesNames] - ); - const [selectedSeries, setSelectedSeries] = useState>(new Set(seriesNames)); - - // For cpu/memory charts, only show checked pods in legend (but deprecated pods always in chart) - const isCpuOrMemoryType = type === 'cpu' || type === 'memory'; - const legendData = useMemo(() => { - if (!data?.yData) return []; - if (isCpuOrMemoryType && checkedPodNames) { - // Filter to only show checked pods in legend - const checkedPodSet = new Set(checkedPodNames); - return data.yData.filter((item) => checkedPodSet.has(item.name)); - } - return data.yData; - }, [data?.yData, checkedPodNames, isCpuOrMemoryType]); - - // Active pod names for legend filtering and "show all" button - const legendSeriesNames = useMemo(() => legendData.map((item) => item.name), [legendData]); - const filterLabel = - type === 'cpu' || type === 'memory' - ? t('replica_filtering') - : type === 'storage' - ? t('volume_filtering') - : t('status_filtering'); - - useEffect(() => { - const nextSelected = new Set(seriesNames); - if (type === 'network') { - nextSelected.delete('2xx'); - } - setSelectedSeries(nextSelected); - }, [seriesNames, type]); - - // Network status code display info (code prefix and label separately for styling) - const networkStatusCodeInfo: Record = useMemo( - () => ({ - '2xx': { code: '2xx', label: 'success' }, - '3xx': { code: '3xx', label: 'redirect' }, - '4xx': { code: '4xx', label: 'client err' }, - '5xx': { code: '5xx', label: 'server err' } - }), - [] - ); - - const getNetworkDisplayInfo = useCallback( - (seriesName: string): { code: string; label: string } | null => { - return networkStatusCodeInfo[seriesName] || null; - }, - [networkStatusCodeInfo] - ); - - const getDisplayName = useCallback( - (seriesName: string, seriesIndex: number) => { - if (displayNameFormatter) { - return displayNameFormatter({ seriesName, seriesIndex, appName, type }); - } - if (type === 'cpu' || type === 'memory') { - const displayIndex = String(seriesIndex + 1).padStart(2, '0'); - return `Replica-${displayIndex}`; - } - if (type === 'network') { - const info = networkStatusCodeInfo[seriesName]; - return info ? `${info.code} ${info.label}` : seriesName; - } - return seriesName; - }, - [appName, displayNameFormatter, networkStatusCodeInfo, type] - ); - - const getSeriesLineColor = useCallback( - (seriesName: string, seriesIndex: number) => { - if (type === 'network') { - return ( - NetworkLineStyleMap[seriesName]?.lineColor || - LineStyleMap[seriesIndex % LineStyleMap.length].lineColor - ); - } - return LineStyleMap[seriesIndex % LineStyleMap.length].lineColor; - }, - [type] - ); - - const option = useMemo( - () => ({ - tooltip: { - trigger: 'axis', - // Prevent tooltip DOM from capturing pointer, so hover keeps tracking chart. - enterable: false, - extraCssText: ` - box-shadow: none; - padding: 0; - background-color: transparent; - border: none; - pointer-events: none; - z-index: 9999; - `, - formatter: (params: any) => { - const formatValue = (value: number | null | undefined) => { - if (value === null || value === undefined || Number.isNaN(value)) return '-'; - return value; - }; - const axisIndex = params?.[0]?.dataIndex ?? 0; - const rawTime = data?.xData?.[axisIndex]; - const axisValue = rawTime - ? xAxisTooltipFormatter - ? xAxisTooltipFormatter(rawTime) - : formatDateTimeInTimeZone(parseFloat(rawTime) * 1000, timeZone, 'YYYY-MM-DD HH:mm') - : params[0]?.axisValue; - const isCpuOrMemory = type === 'cpu' || type === 'memory'; - const isNetwork = type === 'network'; - return ` -
-
- ${axisValue} -
- ${params - .map((item: any, index: number) => { - const isLastItem = index === params.length - 1; - const seriesName = item.seriesName || ''; - if (!isCpuOrMemory) { - const displayName = isNetwork - ? (() => { - const info = getNetworkDisplayInfo(seriesName); - return info - ? `${info.code} ${info.label}` - : seriesName; - })() - : seriesName; - return ` -
-
- -
${displayName}
-
- ${formatValue( - item.value - )}${unit || ''} -
- `; - } - const seriesIndex = seriesIndexMap.get(seriesName) ?? 0; - const displayName = getDisplayName(seriesName, seriesIndex); - return ` -
-
- -
${displayName}
-
- -
-
${seriesName}
- ${formatValue( - item.value - )}${unit || ''} -
-
- `; - }) - .join('')} -
- `; - }, - - // @ts-ignore - position: (point, params, dom, rect, size) => { - const offset = 10; - const verticalOffset = -24; - const headerHeight = 90; // header height (h-20 = 80px) - const tooltipWidth = dom.offsetWidth; - const tooltipHeight = dom.offsetHeight; - - // get the position of the chart container - const chartContainer = dom.parentElement?.parentElement; - const chartRect = chartContainer?.getBoundingClientRect(); - - if (!chartRect) { - return [point[0] + offset, point[1] + offset]; - } - - // calculate the position of the tooltip in the viewport - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; - - // the position of the mouse point in the viewport - const pointInViewportX = chartRect.left + point[0]; - const pointInViewportY = chartRect.top + point[1]; - - let xPos = point[0] + offset; - let yPos = point[1] + offset; - - // horizontal direction flip: if the right edge of the tooltip exceeds the right boundary of the viewport, flip to the left - if (pointInViewportX + offset + tooltipWidth > viewportWidth) { - xPos = point[0] - tooltipWidth - offset; - } - // if the left edge of the tooltip exceeds the left boundary of the viewport after flipping, stick to the left boundary of the viewport - if (pointInViewportX + xPos - point[0] < 0) { - xPos = -chartRect.left; - } - - // vertical direction flip: if the bottom edge of the tooltip exceeds the bottom boundary of the viewport, flip to the top - if (pointInViewportY + offset + tooltipHeight > viewportHeight) { - yPos = point[1] - tooltipHeight - verticalOffset; - } - // if the top edge of the tooltip exceeds the header bottom after flipping, stick to below the header - if (pointInViewportY + yPos - point[1] < headerHeight) { - yPos = headerHeight - chartRect.top; - } - - return [xPos, yPos]; - } - }, - grid: { - left: '4px', - bottom: '4px', - top: '10px', - right: '20px', - containLabel: true - }, - xAxis: { - show: true, - type: 'category', - offset: 4, - boundaryGap: false, - axisLabel: { - interval: (index: number, value: string) => { - const total = data?.xData?.length || 0; - if (index === 0 || index === total - 1) return false; - return index % Math.floor(total / 6) === 0; - }, - formatter: (value: string) => - xAxisLabelFormatter - ? xAxisLabelFormatter(value) - : formatDateTimeInTimeZone(parseFloat(value) * 1000, timeZone, 'MM-DD HH:mm'), - textStyle: { - fontSize: 14, - fontWeight: 400, - color: '#71717A' - }, - hideOverlap: true - }, - axisTick: { - show: false - }, - axisLine: { - show: true, - lineStyle: { - color: '#E4E7EC', - type: 'solid' - } - }, - data: data?.xData || [] - }, - yAxis: { - type: 'value', - splitNumber: yAxisConfig?.splitNumber ?? 4, - interval: yAxisUseNative ? yAxisConfig?.interval : yAxisConfig?.interval ?? 25, - max: yAxisUseNative ? yAxisConfig?.max : yAxisConfig?.max ?? 100, - min: yAxisUseNative ? yAxisConfig?.min ?? 0 : yAxisConfig?.min ?? 0, - boundaryGap: false, - axisLabel: { - formatter: yAxisLabelFormatter, - textStyle: { - fontSize: 14, - fontWeight: 400, - color: '#71717A' - } - }, - axisLine: { - show: false - }, - splitLine: { - lineStyle: { - type: 'dashed', - color: '#E4E7EC' - } - } - }, - series: data?.yData - ?.map((item, index) => { - // For cpu/memory charts with activePodNames: - // - Active pods (in activePodNames): show only if checked in header AND selected in legend - // - Deprecated pods (not in activePodNames): always show - if (isCpuOrMemoryType && activePodNames) { - const isActivePod = activePodNames.includes(item.name); - if (isActivePod) { - // Active pod: must be checked in header AND selected in legend - const isChecked = checkedPodNames?.includes(item.name) ?? false; - if (!isChecked || !selectedSeries.has(item.name)) return null; - } - // Deprecated pod: always show (no filter) - } else { - // For other chart types, use normal selection logic - if (!selectedSeries.has(item.name)) return null; - } - const formattedData = yDataFormatter ? yDataFormatter(item.data) : item.data; - const seriesLineColor = getSeriesLineColor(item.name, index); - return { - name: item.name, - data: formattedData, - type: 'line', - smooth: false, - showSymbol: false, - animationDuration: 300, - animationEasingUpdate: 'linear', - lineStyle: { - width: lineWidth, - color: seriesLineColor, - type: item?.lineStyleType || 'solid' - }, - itemStyle: { - width: 1.5, - color: seriesLineColor - }, - emphasis: { - // highlight - disabled: true - } - }; - }) - .filter(Boolean) - }), - [ - activePodNames, - checkedPodNames, - data?.xData, - data?.yData, - getDisplayName, - getNetworkDisplayInfo, - getSeriesLineColor, - isCpuOrMemoryType, - lineWidth, - selectedSeries, - seriesIndexMap, - type, - timeZone, - unit, - xAxisLabelFormatter, - xAxisTooltipFormatter, - yAxisConfig?.interval, - yAxisConfig?.max, - yAxisConfig?.min, - yAxisConfig?.splitNumber, - yAxisLabelFormatter, - yAxisUseNative, - yDataFormatter - ] - ); - - useEffect(() => { - if (!chartDom.current) return; - - if (!myChart.current) { - myChart.current = echarts.init(chartDom.current); - } else { - myChart.current.dispose(); - myChart.current = echarts.init(chartDom.current); - } - - myChart.current.setOption(option); - }, [data, option]); - - useEffect(() => { - return () => { - if (myChart.current) { - myChart.current.dispose(); - } - }; - }, []); - - // resize chart - useEffect(() => { - if (!myChart.current || !myChart.current.getOption()) return; - myChart.current.resize(); - }, [screenWidth]); - - return ( -
-
- {isShowLegend && ( -
-
-
- {filterLabel} - -
-
- {legendData.map((item) => { - // Use original index from seriesIndexMap to keep color consistent - const originalIndex = seriesIndexMap.get(item.name) ?? 0; - const lineColor = getSeriesLineColor(item.name, originalIndex); - const isSelected = selectedSeries.has(item.name); - const displayName = getDisplayName(item.name, originalIndex); - const isCpuOrMemory = type === 'cpu' || type === 'memory'; - const isNetwork = type === 'network'; - const networkInfo = isNetwork ? getNetworkDisplayInfo(item.name) : null; - return ( - - ); - })} -
-
-
- )} -
- ); -}; - -export default MonitorChart; diff --git a/frontend/providers/applaunchpad/src/components/PodLineChart/index.tsx b/frontend/providers/applaunchpad/src/components/PodLineChart/index.tsx deleted file mode 100644 index c3fde454e..000000000 --- a/frontend/providers/applaunchpad/src/components/PodLineChart/index.tsx +++ /dev/null @@ -1,217 +0,0 @@ -import React, { useEffect, useMemo, useRef } from 'react'; -import * as echarts from 'echarts'; -import { useGlobalStore } from '@/store/global'; -import { MonitorDataResult } from '@/types/monitor'; -import dayjs from 'dayjs'; -import { cn } from '@sealos/shadcn-ui'; - -const map = { - blue: { - backgroundColor: 'rgba(73, 174, 255, 0.3)', - lineColor: '#49AEFF' - }, - green: { - backgroundColor: 'rgba(0, 209, 181, 0.3)', - lineColor: '#00D1B5' - }, - deepBlue: { - backgroundColor: 'rgba(81, 125, 255, 0.3)', - lineColor: '#517DFF' - }, - purple: { - backgroundColor: 'rgba(139, 139, 255, 0.3)', - lineColor: '#8B8BFF' - } -}; - -const PodLineChart = ({ - type, - data, - isShowLabel = false, - isShowText = true, - className -}: { - type: 'blue' | 'deepBlue' | 'green' | 'purple'; - data?: MonitorDataResult; - isShowLabel?: boolean; - isShowText?: boolean; - className?: string; -}) => { - const { screenWidth } = useGlobalStore(); - const xData = - data?.xData?.map((time) => (time ? dayjs(time * 1000).format('YYYY-MM-DD HH:mm') : '')) || - new Array(30).fill(0); - const yData = data?.yData || new Array(30).fill(null); - const lastDisplayValue = useMemo(() => { - if (!data?.yData?.length) return '--'; - for (let i = data.yData.length - 1; i >= 0; i -= 1) { - const value = data.yData[i]; - if (value !== null && value !== undefined) return value; - } - return '--'; - }, [data?.yData]); - const yAxisMax = useMemo(() => { - if (!data?.yData?.length) return 100; - const maxValue = data.yData.reduce((max, value) => { - if (value === null || value === undefined || Number.isNaN(value)) return max; - return Math.max(max, Number(value)); - }, 0); - const rounded = Math.ceil(maxValue / 10) * 10; - const nextMax = rounded <= maxValue ? rounded + 10 : rounded; - return Math.max(100, nextMax); - }, [data?.yData]); - - const Dom = useRef(null); - const myChart = useRef(); - - const optionStyle = useMemo( - () => ({ - areaStyle: { - color: map[type].backgroundColor - }, - lineStyle: { - width: '1', - color: map[type].lineColor - }, - itemStyle: { - width: 1.5, - color: map[type].lineColor - } - }), - [type] - ); - const option = useRef({ - xAxis: { - type: 'category', - show: isShowLabel, - boundaryGap: false, - data: xData, - axisLabel: { - show: isShowLabel - }, - axisTick: { - show: false - }, - axisLine: { - show: false - } - }, - yAxis: { - type: 'value', - boundaryGap: false, - splitNumber: 2, - max: yAxisMax, - min: 0, - interval: 50, - axisLabel: { - show: isShowLabel, - formatter: '{value}' - }, - splitLine: { - show: true, - lineStyle: { - color: '#EBEBEB' - } - } - }, - grid: { - containLabel: isShowLabel, - show: false, - left: '2%', - right: isShowLabel ? '4%' : 0, - top: 10, - bottom: 2 - }, - tooltip: { - trigger: 'axis', - axisPointer: { - type: 'line' - }, - appendToBody: true, - extraCssText: ` - box-shadow: none; - padding: 0; - background-color: transparent; - border: none; - `, - formatter: (params: any[]) => { - const xValue = params[0]?.axisValue; - const yValue = params[0]?.value; - const displayValue = - yValue === null || yValue === undefined || Number.isNaN(yValue) ? '-' : yValue; - return ` -
-
- ${xValue || ''} -
-
- - ${displayValue}% -
-
- `; - } - }, - series: [ - { - data: yData, - type: 'line', - showSymbol: false, - smooth: true, - animationDuration: 300, - animationEasingUpdate: 'linear', - ...optionStyle, - emphasis: { - disabled: true - } - } - ] - }); - - // init chart - useEffect(() => { - if (!Dom.current || myChart?.current?.getOption()) return; - myChart.current = echarts.init(Dom.current); - myChart.current && myChart.current.setOption(option.current); - }, [Dom]); - - // data changed, update - useEffect(() => { - if (!myChart.current || !myChart?.current?.getOption()) return; - option.current.xAxis.data = xData; - option.current.series[0].data = yData; - option.current.yAxis.max = yAxisMax; - myChart.current.setOption(option.current); - }, [xData, yData, yAxisMax]); - - // type changed, update - useEffect(() => { - if (!myChart.current || !myChart?.current?.getOption()) return; - option.current.series[0] = { - ...option.current.series[0], - ...optionStyle - }; - myChart.current.setOption(option.current); - }, [optionStyle]); - - // resize chart - useEffect(() => { - if (!myChart.current || !myChart.current.getOption()) return; - myChart.current.resize(); - }, [screenWidth]); - - return ( -
-
- {isShowText && ( - - {lastDisplayValue}% - - )} -
- ); -}; - -export default React.memo(PodLineChart); diff --git a/frontend/providers/applaunchpad/src/components/PodPieChart/index.tsx b/frontend/providers/applaunchpad/src/components/PodPieChart/index.tsx deleted file mode 100644 index 91b4d2633..000000000 --- a/frontend/providers/applaunchpad/src/components/PodPieChart/index.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import React, { useEffect, useMemo, useRef } from 'react'; -import * as echarts from 'echarts'; -import { useGlobalStore } from '@/store/global'; -import { cn } from '@sealos/shadcn-ui'; - -const colorMap = { - blue: { - main: '#60A5FA', - background: 'rgba(96, 165, 250, 0.3)' - }, - green: { - main: '#00D1B5', - background: 'rgba(0, 209, 181, 0.2)' - }, - deepBlue: { - main: '#517DFF', - background: 'rgba(81, 125, 255, 0.2)' - }, - purple: { - main: '#8B8BFF', - background: 'rgba(139, 139, 255, 0.2)' - } -}; - -const PodPieChart = ({ - type = 'blue', - value = 0, - className -}: { - type?: 'blue' | 'deepBlue' | 'green' | 'purple'; - value?: number; - className?: string; -}) => { - const { screenWidth } = useGlobalStore(); - const chartRef = useRef(null); - const myChart = useRef(); - - const colors = useMemo(() => colorMap[type], [type]); - const displayValue = useMemo(() => Math.min(100, Math.max(0, value)), [value]); - - const option = useMemo( - () => ({ - series: [ - { - type: 'pie', - radius: ['70%', '90%'], - avoidLabelOverlap: false, - label: { - show: true, - position: 'center', - formatter: `${displayValue}%`, - fontSize: 20, - fontWeight: 600, - color: '#18181B' - }, - labelLine: { - show: false - }, - data: [ - { - value: displayValue, - name: 'Used', - itemStyle: { - color: colors.main - } - }, - { - value: 100 - displayValue, - name: 'Free', - itemStyle: { - color: '#F4F4F5' - } - } - ], - emphasis: { - disabled: true - } - } - ] - }), - [displayValue, colors] - ); - - // init chart - useEffect(() => { - if (!chartRef.current) return; - - if (!myChart.current) { - myChart.current = echarts.init(chartRef.current); - } - myChart.current.setOption(option); - }, [option]); - - // resize chart - useEffect(() => { - if (!myChart.current) return; - myChart.current.resize(); - }, [screenWidth]); - - return ( -
-
-
- ); -}; - -export default React.memo(PodPieChart); diff --git a/frontend/providers/applaunchpad/src/components/TruncateTooltip/index.tsx b/frontend/providers/applaunchpad/src/components/TruncateTooltip/index.tsx deleted file mode 100644 index 29ad3dedf..000000000 --- a/frontend/providers/applaunchpad/src/components/TruncateTooltip/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useState, useRef, useLayoutEffect } from 'react'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { cn } from '@sealos/shadcn-ui'; - -interface TruncateTooltipProps { - children: React.ReactNode; - content: string; - className?: string; - contentClassName?: string; - onClick?: () => void; -} - -const TruncateTooltip = ({ - children, - content, - className, - contentClassName, - onClick -}: TruncateTooltipProps) => { - const ref = useRef(null); - const [isTruncated, setIsTruncated] = useState(false); - - useLayoutEffect(() => { - const el = ref.current; - if (el) { - setIsTruncated(el.scrollWidth > el.clientWidth); - } - }, [content]); - - return ( - - -
- {children} -
-
- {isTruncated && ( - -

- {content} -

-
- )} -
- ); -}; - -export default TruncateTooltip; diff --git a/frontend/providers/applaunchpad/src/components/YamlCode/hljs.ts b/frontend/providers/applaunchpad/src/components/YamlCode/hljs.ts deleted file mode 100644 index 568156b7f..000000000 --- a/frontend/providers/applaunchpad/src/components/YamlCode/hljs.ts +++ /dev/null @@ -1,123 +0,0 @@ -export const codeTheme = { - hljs: { - display: 'block', - overflowX: 'auto', - color: '#2f3337' - }, - linenumber: { - minWidth: '1.75em', - paddingRight: '0px', - marginRight: '20px' - }, - 'hljs-comment': { - color: '#656e77' - }, - comment: { - color: '#A19F9D' - }, - 'hljs-keyword': { - color: '#0770BC' - }, - 'hljs-selector-tag': { - color: '#0770BC' - }, - 'hljs-meta-keyword': { - color: '#0770BC' - }, - 'hljs-doctag': { - color: '#0770BC' - }, - 'hljs-section': { - color: '#0770BC' - }, - 'hljs-selector-class': { - color: '#0770BC' - }, - 'hljs-meta': { - color: '#0770BC' - }, - 'hljs-selector-pseudo': { - color: '#0770BC' - }, - 'hljs-attr': { - color: '#0770BC' - }, - 'hljs-attribute': { - color: '#803378' - }, - 'hljs-name': { - color: '#b75501' - }, - 'hljs-type': { - color: '#b75501' - }, - 'hljs-number': { - color: '#b75501' - }, - 'hljs-selector-id': { - color: '#b75501' - }, - 'hljs-quote': { - color: '#b75501' - }, - 'hljs-template-tag': { - color: '#b75501' - }, - 'hljs-built_in': { - color: '#b75501' - }, - 'hljs-title': { - color: '#b75501' - }, - 'hljs-literal': { - color: '#b75501' - }, - 'hljs-string': { - color: '#9E53C1' - }, - 'hljs-regexp': { - color: '#9E53C1' - }, - 'hljs-symbol': { - color: '#9E53C1' - }, - 'hljs-variable': { - color: '#9E53C1' - }, - 'hljs-template-variable': { - color: '#9E53C1' - }, - 'hljs-link': { - color: '#9E53C1' - }, - 'hljs-selector-attr': { - color: '#9E53C1' - }, - 'hljs-meta-string': { - color: '#9E53C1' - }, - 'hljs-bullet': { - color: '#535a60' - }, - 'hljs-code': { - color: '#535a60' - }, - 'hljs-deletion': { - color: '#c02d2e' - }, - 'hljs-addition': { - color: '#2f6f44' - }, - 'hljs-emphasis': { - fontStyle: 'italic' - }, - 'hljs-strong': { - fontWeight: 'bold' - }, - '-webkit-touch-callout': 'none' /* iOS Safari */, - '-webkit-user-select': 'none' /* Safari */, - '-khtml-user-select': 'none' /* Konqueror HTML */, - '-moz-user-select': 'none' /* Old versions of Firefox */, - '-ms-user-select': 'none' /* Internet Explorer/Edge */, - 'user-select': 'none' /* Non-prefixed version, currently supported by Chrome, Opera and Firefox */ -}; diff --git a/frontend/providers/applaunchpad/src/components/YamlCode/index.module.scss b/frontend/providers/applaunchpad/src/components/YamlCode/index.module.scss deleted file mode 100644 index 883b64a97..000000000 --- a/frontend/providers/applaunchpad/src/components/YamlCode/index.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.markdown { - height: '100%'; - div { - overflow: visible !important; - } -} diff --git a/frontend/providers/applaunchpad/src/components/YamlCode/index.tsx b/frontend/providers/applaunchpad/src/components/YamlCode/index.tsx deleted file mode 100644 index dabc4886e..000000000 --- a/frontend/providers/applaunchpad/src/components/YamlCode/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useMemo } from 'react'; -import ReactMarkdown from 'react-markdown'; -import SyntaxHighlighter from 'react-syntax-highlighter'; -import { codeTheme } from './hljs'; -import styles from './index.module.scss'; - -type TMarkDown = { - content: string; - [key: string]: any; -}; - -const YamlCode = ({ content, ...props }: TMarkDown) => { - const code = useMemo(() => '```yaml\n' + content + '```', [content]); - - return ( - - ) : ( - - {children} - - ); - } - }} - /> - ); -}; - -export default YamlCode; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/AdvancedInfo.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/AdvancedInfo.tsx deleted file mode 100644 index a35bc6d54..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/AdvancedInfo.tsx +++ /dev/null @@ -1,331 +0,0 @@ -import MyIcon from '@/components/Icon'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import type { AppDetailType } from '@/types/app'; -import { Separator } from '@sealos/shadcn-ui/separator'; -import { Button } from '@sealos/shadcn-ui/button'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow -} from '@sealos/shadcn-ui/table'; -import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import React, { useState } from 'react'; -import TruncateTooltip from '@/components/TruncateTooltip'; -import { useRouter } from 'next/router'; -import { FileCog, HardDrive, Variable } from 'lucide-react'; - -const ConfigMapDetailModal = dynamic(() => import('./ConfigMapDetailModal')); - -interface AdvancedInfoProps { - app?: AppDetailType; - containerClassName?: string; - contentClassName?: string; -} - -const AdvancedInfo = ({ - app = MOCK_APP_DETAIL, - containerClassName, - contentClassName -}: AdvancedInfoProps) => { - const { t } = useTranslation(); - const router = useRouter(); - const [detailConfigMap, setDetailConfigMap] = useState<{ - mountPath: string; - value: string; - }>(); - const handleManage = (scrollTo: string) => { - router.push(`/app/edit?name=${app.appName}&scrollTo=${scrollTo}`); - }; - const rootClassName = containerClassName?.length ? containerClassName : ''; - - return ( -
-
-
-
-
{t('Command')}
-
- {t('If no, the default command is used')} -
-
- -
- -
-
-
{t('Command')}
-
- - {app.runCMD || t('Not Configured')} - -
-
-
-
- {t('Arguments')} -
-
- - {app.cmdParam || t('Not Configured')} - -
-
-
-
- -
-
-
{t('Environment Variables')}
- -
- {app.envs?.length > 0 ? ( -
- - - - - {t('Key')} - - - {t('Value')} - - - - - {app.envs.map((env) => { - const valText = env.value ? env.value : env.valueFrom ? 'value from | ***' : ''; - return ( - - - - {env.key} - - - - - {valText} - - - - ); - })} - -
-
- ) : ( -
- -
- )} -
- -
-
-
{t('Configmaps')}
- -
- {app.configMapList?.length > 0 ? ( -
- {app.configMapList.map((item) => ( -
setDetailConfigMap({ mountPath: item.mountPath, value: item.value })} - > - -
-

{item.mountPath}

-

{item.value}

-
-
- ))} -
- ) : ( -
- -
- )} -
- -
-
-
{t('Local Storage')}
- -
- {app.storeList?.length > 0 ? ( -
- {app.storeList.map((item) => ( -
- -
-

{item.path}

-

- {item.value.formatForDisplay({ - format: 'BinarySI', - scale: 'auto', - digits: 4 - })} -

-
-
- ))} -
- ) : ( -
- -
- )} -
- - {/* TODO: Add probe management */} - {/*
-
-
{t('Probe')}
- -
-
- {[ - { title: 'Startup', empty: 'No startup added yet' }, - { title: 'Liveness', empty: 'No liveness added yet' }, - { title: 'Readiness', empty: 'No readiness added yet' } - ].map((item) => ( -
-
- {t(item.title)} -
-
- {t(item.empty)} -
-
- ))} -
-
*/} - - {detailConfigMap && ( - setDetailConfigMap(undefined)} /> - )} -
- ); -}; - -export default React.memo(AdvancedInfo); diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/AppBaseInfo.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/AppBaseInfo.tsx deleted file mode 100644 index 05308d073..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/AppBaseInfo.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import GPUItem from '@/components/GPUItem'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useUserStore } from '@/store/user'; -import type { AppDetailType } from '@/types/app'; -import { useCopyData } from '@/utils/tools'; -import { Separator } from '@sealos/shadcn-ui/separator'; -import TruncateTooltip from '@/components/TruncateTooltip'; -import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import React, { useMemo, useState } from 'react'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import { ArrowUpRight } from 'lucide-react'; - -const ConfigMapDetailModal = dynamic(() => import('./ConfigMapDetailModal')); - -const AppBaseInfo = ({ app = MOCK_APP_DETAIL }: { app: AppDetailType }) => { - const { t } = useTranslation(); - const { copyData } = useCopyData(); - const { userSourcePrice } = useUserStore(); - const [detailConfigMap, setDetailConfigMap] = useState<{ - mountPath: string; - value: string; - }>(); - - const appInfoTable = useMemo< - { - name: string; - iconName: string; - items: { - label: string; - value?: string; - copy?: string; - render?: React.ReactNode; - }[]; - }[] - >( - () => [ - { - name: 'Basic Information', - iconName: 'formInfo', - items: [ - { label: 'Creation Time', value: app.createTime }, - { - label: `${t('Image Name')} ${app.secret.use ? '(Private)' : ''}`, - value: app.imageName - }, - { - label: 'Limit CPU', - value: app.cpu.formatForDisplay({ - format: 'DecimalSI', - scale: 'auto', - digits: 4 - }) - }, - { - label: 'Limit Memory', - value: app.memory.formatForDisplay({ - format: 'BinarySI', - scale: 'auto', - digits: 4 - }) - }, - ...(userSourcePrice?.gpu - ? [ - { - label: 'GPU', - render: - } - ] - : []) - ] - }, - { - name: 'Deployment Mode', - iconName: 'deployMode', - items: app.hpa.use - ? [ - { - label: `${app.hpa.target} ${t('target_value')}`, - value: `${app.hpa.value}${app.hpa.target === 'gpu' ? '' : '%'}` - }, - { - label: 'Number of Instances', - value: `${app.hpa.minReplicas} ~ ${app.hpa.maxReplicas}` - } - ] - : [{ label: `Number of Instances`, value: `${app.replicas}` }] - } - ], - [app, t, userSourcePrice?.gpu] - ); - - const appTags = useMemo( - () => [ - ...(app.networks.find((item) => item.openPublicDomain) ? ['Public Access'] : []), - ...(app.hpa.use ? ['Auto scaling'] : ['Fixed instance']), - ...(app.storeList.length > 0 ? ['Stateful'] : ['Stateless']) - ], - [app] - ); - - const persistentVolumes = useMemo(() => { - return app.volumes - .filter((item) => 'persistentVolumeClaim' in item) - .reduce( - ( - acc: { - path: string; - name: string; - }[], - volume - ) => { - const mount = app.volumeMounts.find((m) => m.name === volume.name); - if (mount) { - acc.push({ - path: mount.mountPath, - name: volume.name - }); - } - return acc; - }, - [] - ); - }, [app.volumes, app.volumeMounts]); - - return ( -
- {appInfoTable.map((info, index) => ( -
-
{t(info.name)}
-
- {app?.source?.hasSource && index === 0 && ( -
{ - if (!app?.source?.sourceName) return; - if (app.source.sourceType === 'app_store') { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-template', - pathname: '/instance', - query: { instanceName: app.source.sourceName } - }); - } - if (app.source.sourceType === 'sealaf') { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-sealaf', - pathname: '/', - query: { instanceName: app.source.sourceName } - }); - } - }} - > - {t('application_source')} -
- {t(app.source?.sourceType)} - - {t('Manage all resources')} - -
-
- )} - - {info.items.map((item, i) => ( -
-
{t(item.label)}
-
- copyData(item.copy!) : undefined} - > - {item.render ? item.render : item.value} - -
-
- ))} -
- {index !== appInfoTable.length - 1 && } -
- ))} - - {detailConfigMap && ( - setDetailConfigMap(undefined)} /> - )} -
- ); -}; - -export default React.memo(AppBaseInfo); diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/AppMainInfo.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/AppMainInfo.tsx deleted file mode 100644 index 545c899d4..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/AppMainInfo.tsx +++ /dev/null @@ -1,385 +0,0 @@ -import PodLineChart from '@/components/PodLineChart'; -import PodPieChart from '@/components/PodPieChart'; -import { ProtocolList } from '@/constants/app'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useClientAppConfig } from '@/hooks/useClientAppConfig'; -import type { AppDetailType } from '@/types/app'; -import { buildExternalUrl, getExternalProtocol } from '@/utils/network-url'; -import { useCopyData, generatePvcNameRegex } from '@/utils/tools'; -import { calculateStorageUsagePercentFromUsageData } from '@/utils/storage-usage'; -import { getUserNamespace } from '@/utils/user'; -import { useTranslation } from 'next-i18next'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import MonitorModal from './MonitorModal'; -import { useQuery } from '@tanstack/react-query'; -import { checkReady } from '@/api/platform'; -import { getAppMonitorData, getNetworkMonitorData } from '@/api/app'; -import { useGuideStore } from '@/store/guide'; -import { startDriver, detailDriverObj } from '@/hooks/driver'; -import { useRouter } from 'next/router'; -import Image from 'next/image'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { CircleHelp } from 'lucide-react'; -import NetworkConfigurationTable from './NetworkConfigurationTable'; - -const AppMainInfo = ({ app = MOCK_APP_DETAIL }: { app: AppDetailType }) => { - const { t } = useTranslation(); - const { copyData } = useCopyData(); - const config = useClientAppConfig(); - const [isOpen, setIsOpen] = useState(false); - const router = useRouter(); - - const { detailCompleted } = useGuideStore(); - - const hasStorage = app.storeList && app.storeList.length > 0; - const pvcNameRegex = generatePvcNameRegex(app); - - // Fetch storage size and available capacity for all PVCs - const { data: storageData } = useQuery({ - queryKey: ['storageUsage', app.appName, pvcNameRegex], - queryFn: async () => { - if (!pvcNameRegex) return null; - return getAppMonitorData({ - queryName: pvcNameRegex, - queryKey: 'storage', - step: '2m', - pvcName: pvcNameRegex - }); - }, - enabled: hasStorage && !!pvcNameRegex, - refetchInterval: 2 * 60 * 1000 - }); - - const storageUsagePercent = useMemo(() => { - return calculateStorageUsagePercentFromUsageData(storageData, app.storeList); - }, [app.storeList, storageData]); - - // Get all available networks for error codes query (non-NodePort networks only) - const availableNetworks = useMemo(() => { - return app.networks?.filter((network) => !network.openNodePort) || []; - }, [app.networks]); - - const hasNetwork = availableNetworks.length > 0; - - // Fetch error codes data for all networks (last 5 minutes) - const { data: allNetworksErrorData } = useQuery({ - queryKey: [ - 'errorCodes', - app.appName, - availableNetworks.map((n) => `${n.serviceName || app.appName}:${n.port}`).join(',') - ], - queryFn: async () => { - if (!hasNetwork) return null; - const end = Date.now(); - const start = end - 5 * 60 * 1000; // last 5 minutes - - // Query all networks in parallel - const results = await Promise.all( - availableNetworks.map((network) => - getNetworkMonitorData({ - serviceName: network.serviceName || app.appName, - port: network.port, - type: 'network_service_request_count', - step: '1m', - start, - end - }) - ) - ); - - return results; - }, - enabled: hasNetwork && !app.isPause, - refetchInterval: 60 * 1000 // refresh every minute - }); - - // Calculate error codes counts (sum of all values across all networks) - const errorCodesCounts = useMemo(() => { - const counts = { - '3xx': 0, - '4xx': 0, - '5xx': 0 - }; - - if (!allNetworksErrorData) return counts; - - // Iterate through all network results - allNetworksErrorData.forEach((networkData) => { - if (!networkData) return; - networkData.forEach((item) => { - if (item.name && ['3xx', '4xx', '5xx'].includes(item.name)) { - const total = item.yData.reduce((sum, val) => { - return sum + (val ? parseInt(val, 10) : 0); - }, 0); - counts[item.name as keyof typeof counts] += total; - } - }); - }); - - return counts; - }, [allNetworksErrorData]); - - useEffect(() => { - if (!detailCompleted) { - const checkAndStartGuide = () => { - const guideListElement = document.getElementById('driver-detail-network'); - - if (guideListElement) { - startDriver(detailDriverObj(t)); - return true; - } - return false; - }; - - if (!checkAndStartGuide()) return; - const observer = new MutationObserver((mutations, obs) => { - if (checkAndStartGuide()) { - obs.disconnect(); - } - }); - observer.observe(document.body, { - childList: true, - subtree: true - }); - return () => { - observer.disconnect(); - }; - } - }, [detailCompleted, t]); - - const networks = useMemo( - () => - app.networks.map((network) => { - const protocol = ProtocolList.find((item) => item.value === network.protocol); - const appProtocol = ProtocolList.find((item) => item.value === network.appProtocol); - - if (network.openNodePort) { - return { - inline: `${protocol?.inline}${ - network?.serviceName ? network.serviceName : app.appName - }.${getUserNamespace()}.svc.cluster.local:${network.port}`, - public: network.nodePort - ? buildExternalUrl({ - protocol: network.protocol, - host: `${protocol?.value.toLowerCase()}.${network.domain}`, - nodePort: network.nodePort - }) - : `${getExternalProtocol(network.protocol)}://${protocol?.value.toLowerCase()}.${ - network.domain - }`, - customDomain: null, - showReadyStatus: false, - port: network.port - }; - } - - return { - inline: `${appProtocol?.inline}${ - network?.serviceName ? network.serviceName : app.appName - }.${getUserNamespace()}.svc.cluster.local:${network.port}`, - public: network.openPublicDomain - ? buildExternalUrl({ - protocol: network.appProtocol, - host: network.customDomain - ? network.customDomain - : `${network.publicDomain}.${network.domain}`, - config: { - disableHttps: config.disableHttps, - cloudPort: config.port, - httpPort: config.httpPort - } - }) - : '', - customDomain: network.openPublicDomain ? network.customDomain : null, - showReadyStatus: true, - port: network.port - }; - }), - [app, config.disableHttps, config.httpPort, config.port] - ); - - const retryCount = useRef(0); - const { data: networkStatus, refetch } = useQuery({ - queryKey: ['networkStatus', app.appName], - queryFn: () => checkReady(app.appName), - retry: 5, - retryDelay: (attemptIndex) => Math.min(1000 * Math.pow(2, attemptIndex), 30000), - onSuccess: (data) => { - const hasUnready = data.some((item) => !item.ready); - if (!hasUnready) { - retryCount.current = 0; - return; - } - if (retryCount.current < 14) { - const delay = Math.min(1000 * Math.pow(2, retryCount.current), 32000); - retryCount.current += 1; - setTimeout(() => { - refetch(); - }, delay); - } - }, - refetchIntervalInBackground: false, - staleTime: 1000 * 60 * 5 - }); - - const statusMap = useMemo( - () => - networkStatus - ? networkStatus.reduce((acc, item) => { - if (item?.url) { - acc[item.url] = item; - } - return acc; - }, {} as Record) - : {}, - [networkStatus] - ); - - return ( -
- {/* Real-time Monitoring Cards */} -
-
-
- CPU: {app.usedCpu.yData[app.usedCpu.yData.length - 1]}% -
-
- -
-
-
-
- {t('Memory')}: {app.usedMemory.yData[app.usedMemory.yData.length - 1]}% -
-
- -
-
- {hasStorage && ( -
-
{t('storage_usage')}
-
- -
-
- )} - {/* Error Codes Card */} - {hasNetwork && ( -
-
-
-
{t('error_codes')}
- - - - - - {t('error_codes_tooltip_content')} - - -
-
{t('last_5_mins')}
-
- {errorCodesCounts['3xx'] === 0 && - errorCodesCounts['4xx'] === 0 && - errorCodesCounts['5xx'] === 0 ? ( -
-
- No errors -
- {t('no_errors_found')} -
- ) : ( -
-
-
-
- 300+ -
-
- {errorCodesCounts['3xx']} - {t('counts')} -
-
-
-
-
- 400+ -
-
- {errorCodesCounts['4xx']} - {t('counts')} -
-
-
-
-
- 500+ -
-
- {errorCodesCounts['5xx']} - {t('counts')} -
-
-
- )} -
- )} -
- - {/* Network Configuration Card */} -
-
-
- {t('Network Configuration')} - - {networks.length} - -
- -
- -
- - setIsOpen(false)} /> -
- ); -}; - -export default AppMainInfo; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/ConfigMapDetailModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/ConfigMapDetailModal.tsx deleted file mode 100644 index ceeefc3ff..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/ConfigMapDetailModal.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'next-i18next'; -import { - Drawer, - DrawerContent, - DrawerHeader, - DrawerTitle, - DrawerFooter -} from '@sealos/shadcn-ui/drawer'; -import { Button } from '@sealos/shadcn-ui/button'; - -const ConfigMapDetailModal = ({ - mountPath, - value, - onClose -}: { - mountPath: string; - value: string; - onClose: () => void; -}) => { - const { t } = useTranslation(); - return ( - !open && onClose()}> - - - - {t('ConfigMap Tip')} {t('Details')} - - - -
-
- - - - - - - - - - - -
- {t('filename')} - {mountPath}
- {t('file value')} - -
-                      {value}
-                    
-
-
-
-
-
- ); -}; - -export default ConfigMapDetailModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/DelModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/DelModal.tsx deleted file mode 100644 index e773f968f..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/DelModal.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { delAppByName } from '@/api/app'; -import { TAppSource, TAppSourceType } from '@/types/app'; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle -} from '@sealos/shadcn-ui/dialog'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Input } from '@sealos/shadcn-ui/input'; -import { useTranslation } from 'next-i18next'; -import { useCallback, useEffect, useRef, useState } from 'react'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import { useAppOperation } from '@/hooks/useAppOperation'; -import dynamic from 'next/dynamic'; -import { TriangleAlert } from 'lucide-react'; - -const ErrorModal = dynamic(() => import('@/components/ErrorModal')); - -enum Page { - REMINDER = 'REMINDER', - DELETION_WARNING = 'DELETION_WARNING' -} - -const DelModal = ({ - appName, - onClose, - onSuccess, - source -}: { - appName: string; - onClose: () => void; - onSuccess: () => void; - source?: TAppSource; -}) => { - const { t } = useTranslation(); - const [inputValue, setInputValue] = useState(''); - const { executeOperation, loading, errorModalState, closeErrorModal } = useAppOperation(); - const [activePage, setActivePage] = useState(Page.REMINDER); - const pageManuallyChangedRef = useRef(false); - - useEffect(() => { - if (!pageManuallyChangedRef.current) { - source?.hasSource ? setActivePage(Page.REMINDER) : setActivePage(Page.DELETION_WARNING); - } - }, [source]); - - const deleteTypeTipMap: Record = { - app_store: t('delete_template_app_tip'), - sealaf: t('delete_sealaf_app_tip') - }; - - const handleDelApp = useCallback(async () => { - await executeOperation( - async () => { - await delAppByName(appName); - const delay = Math.random() * 2000 + 2000; // 2000-4000ms - await new Promise((resolve) => setTimeout(resolve, delay)); - }, - { - successMessage: t('success'), - errorMessage: t('Delete Failed'), - showErrorModal: true, - onSuccess: () => { - onSuccess(); - onClose(); - } - } - ); - }, [appName, executeOperation, t, onSuccess, onClose]); - - const openTemplateApp = () => { - if (!source?.hasSource) return; - if (source?.sourceType === 'app_store') { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-template', - pathname: '/instance', - query: { instanceName: source?.sourceName } - }); - } - if (source?.sourceType === 'sealaf') { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-sealaf', - pathname: '/', - query: { instanceName: source?.sourceName } - }); - } - onClose(); - }; - - return ( - !open && onClose()}> - - - - - {activePage === Page.REMINDER ? t('Remind') : t('Deletion warning')} - - - - {activePage === Page.REMINDER && source?.sourceType ? ( - <> -
{deleteTypeTipMap[source?.sourceType]}
- - ) : ( - <> -
{t('delete_app_tip')}
- -
- {t('delete_warning_persistent')} -
- -
- - {t('Please enter')} - - {appName} - - {t('To Confirm')} - - setInputValue(e.target.value)} - className="h-10" - /> -
- - )} - - - - {activePage === Page.REMINDER ? ( - - ) : ( - - )} - -
- {errorModalState.visible && ( - - )} -
- ); -}; - -export default DelModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/Header.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/Header.tsx deleted file mode 100644 index 1b3dacb7c..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/Header.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import React, { useCallback, useState } from 'react'; -import type { AppStatusMapType, TAppSource } from '@/types/app'; -import { useRouter } from 'next/router'; -import { restartAppByName, pauseAppByName, startAppByName } from '@/api/app'; -import { useAppOperation } from '@/hooks/useAppOperation'; -import { useConfirm } from '@/hooks/useConfirm'; -import { AppStatusEnum, appStatusMap } from '@/constants/app'; -import AppStatusTag from '@/components/AppStatusTag'; -import dynamic from 'next/dynamic'; -import { useTranslation } from 'next-i18next'; -import UpdateModal from './UpdateModal'; -import { Button } from '@sealos/shadcn-ui/button'; -import { ButtonGroup } from '@sealos/shadcn-ui/button-group'; -import { ArrowLeft, Play, Pause, PencilLine, RotateCw, Trash2 } from 'lucide-react'; -import { Skeleton } from '@sealos/shadcn-ui/skeleton'; - -const DelModal = dynamic(() => import('./DelModal')); -const ErrorModal = dynamic(() => import('@/components/ErrorModal')); - -const Header = ({ - appName = 'app-name', - appStatus = appStatusMap[AppStatusEnum.waiting], - isPause = false, - refetch, - source, - isLoading = false -}: { - appName?: string; - appStatus?: AppStatusMapType; - isPause?: boolean; - refetch: () => void; - source?: TAppSource; - isLoading?: boolean; -}) => { - const { t } = useTranslation(); - const router = useRouter(); - const { executeOperation, loading, errorModalState, closeErrorModal } = useAppOperation(); - const [isOpenDelModal, setIsOpenDelModal] = useState(false); - const [isOpenUpdateModal, setIsOpenUpdateModal] = useState(false); - - const { openConfirm: openRestartConfirm, ConfirmChild: RestartConfirmChild } = useConfirm({ - content: 'Confirm to restart this application?' - }); - const { openConfirm: onOpenPause, ConfirmChild: PauseChild } = useConfirm({ - content: 'pause_message' - }); - - const handleRestartApp = useCallback(async () => { - await executeOperation(() => restartAppByName(appName), { - successMessage: t('Restart Success'), - errorMessage: t('Restart Failed') - }); - }, [appName, executeOperation, t]); - - const handlePauseApp = useCallback(async () => { - await executeOperation(() => pauseAppByName(appName), { - successMessage: t('Application paused'), - errorMessage: t('Application failed'), - onSuccess: () => refetch() - }); - }, [appName, executeOperation, refetch, t]); - - const handleStartApp = useCallback(async () => { - await executeOperation(() => startAppByName(appName), { - successMessage: t('Start Successful'), - errorMessage: t('Start Failed'), - onSuccess: () => refetch() - }); - }, [appName, executeOperation, refetch, t]); - - if (isLoading) { - return ( -
-
-
- - -
- -
- -
- - - - -
-
- ); - } - - return ( -
-
-
router.replace('/apps')} - > - - {appName} -
-
- -
-
- - {/* btns */} -
- - - {isPause ? ( - - ) : ( - - - - - - )} -
- - - - {isOpenDelModal && ( - setIsOpenDelModal(false)} - onSuccess={() => router.replace('/apps')} - /> - )} - setIsOpenUpdateModal(false)} - /> - {errorModalState.visible && ( - - )} -
- ); -}; - -export default React.memo(Header); diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/ICPStatus.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/ICPStatus.tsx deleted file mode 100644 index 564f5ed3b..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/ICPStatus.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { checkDomainICP } from '@/api/platform'; -import { useTranslation } from 'next-i18next'; -import { useEffect } from 'react'; -import { useQuery } from '@tanstack/react-query'; - -// ICP备案状态组件 -const ICPStatus = ({ - customDomain, - enabled, - onRegistrationStatusChange -}: { - customDomain: string; - enabled: boolean; - onRegistrationStatusChange?: (registered: boolean | null) => void; -}) => { - const { t } = useTranslation(); - const { data, isSuccess } = useQuery({ - queryKey: ['checkDomainICP', customDomain], - queryFn: () => checkDomainICP({ domain: customDomain }), - enabled: enabled, - retry: false, - staleTime: 1000 * 60 * 10 // 10min - }); - - useEffect(() => { - if (!enabled || !isSuccess) { - onRegistrationStatusChange?.(null); - return; - } - - onRegistrationStatusChange?.(Boolean(data?.icpRegistered)); - }, [data?.icpRegistered, enabled, isSuccess, onRegistrationStatusChange]); - - if (!enabled || !isSuccess) return null; - - if (!data?.icpRegistered) { - return ( -
-
- {t('icp_reg_not_registered')} -
- ); - } - - return null; -}; - -export default ICPStatus; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/LogsModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/LogsModal.tsx deleted file mode 100644 index 9a6ed7e1a..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/LogsModal.tsx +++ /dev/null @@ -1,264 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { getPodLogs } from '@/api/app'; -import { - Modal, - ModalOverlay, - ModalContent, - ModalCloseButton, - Box, - Flex, - Button, - MenuButton, - ModalHeader -} from '@chakra-ui/react'; -import { useLoading } from '@/hooks/useLoading'; -import { downLoadBold } from '@/utils/tools'; -import styles from '@/components/app/detail/index/index.module.scss'; -import { SealosMenu } from '@sealos/ui'; -import Empty from './empty'; -import { ChevronDownIcon } from '@chakra-ui/icons'; -import { streamFetch } from '@/services/streamFetch'; -import { default as AnsiUp } from 'ansi_up'; -import { useTranslation } from 'next-i18next'; -import { getPodContainerName } from '@/utils/pod'; -import type { PodDetailType } from '@/types/app'; - -interface sinceItem { - key: 'streaming_logs' | 'within_5_minute' | 'within_1_hour' | 'within_1_day' | 'terminated_logs'; - since: number; - previous: boolean; -} - -const newSinceItems = (baseTimestamp: number): sinceItem[] => { - return [ - { - key: 'streaming_logs', - since: 0, - previous: false - }, - { - key: 'within_5_minute', - since: baseTimestamp - 5 * 60 * 1000, - previous: false - }, - { - key: 'within_1_hour', - since: baseTimestamp - 60 * 60 * 1000, - previous: false - }, - { - key: 'within_1_day', - since: baseTimestamp - 24 * 60 * 60 * 1000, - previous: false - }, - { - key: 'terminated_logs', - since: 0, - previous: true - } - ]; -}; - -const LogsModal = ({ - appName, - podName, - pods = [], - podAlias, - pod, - setLogsPodName, - closeFn -}: { - appName: string; - podName: string; - pods: { alias: string; podName: string; pod?: PodDetailType }[]; - podAlias: string; - pod?: PodDetailType; - setLogsPodName: (name: string) => void; - closeFn: () => void; -}) => { - const borderBase = '1px solid #E8EBF0'; - const { t } = useTranslation(); - const { Loading } = useLoading(); - const [logs, setLogs] = useState(''); - const [isLoading, setIsLoading] = useState(true); - const LogBox = useRef(null); - const ansi_up = useRef(new AnsiUp()); - const [sinceKey, setSinceKey] = useState('streaming_logs'); - const [sinceTime, setSinceTime] = useState(0); - const [previous, setPrevious] = useState(false); - const containerName = getPodContainerName(pod || {}); - - const switchSince = useCallback( - (item: sinceItem) => { - setSinceKey(item.key); - setPrevious(item.previous); - setSinceTime(item.since); - }, - [setSinceKey, setPrevious, setSinceTime] - ); - - const sinceItems = useMemo(() => newSinceItems(Date.now()), []); - - const watchLogs = useCallback(() => { - // podName is empty. pod may has been deleted - if (!podName) return closeFn(); - setIsLoading(true); - - const controller = new AbortController(); - streamFetch({ - url: '/api/getPodLogs', - data: { - appName, - podName, - containerName, - stream: true, - sinceTime, - previous - }, - abortSignal: controller, - firstResponse() { - setLogs(''); - setIsLoading(false); - setTimeout(() => { - if (!LogBox.current) return; - - LogBox.current.scrollTo({ - top: LogBox.current.scrollHeight - }); - }, 500); - }, - onMessage(text) { - setLogs((state) => { - return state + ansi_up.current.ansi_to_html(text); - }); - - // scroll bottom - setTimeout(() => { - if (!LogBox.current) return; - const isBottom = - LogBox.current.scrollTop === 0 || - LogBox.current.scrollTop + LogBox.current.clientHeight + 200 >= - LogBox.current.scrollHeight; - - isBottom && - LogBox.current.scrollTo({ - top: LogBox.current.scrollHeight - }); - }, 100); - } - }); - return controller; - }, [appName, closeFn, containerName, podName, sinceTime, previous]); - - useEffect(() => { - const controller = watchLogs(); - return () => { - controller?.abort(); - }; - }, [watchLogs]); - - const exportLogs = useCallback(async () => { - try { - const allLogs = await getPodLogs({ - appName, - podName, - containerName, - stream: false, - sinceTime, - previous - }); - downLoadBold(allLogs, 'text/plain', 'log.txt'); - } catch (e) { - console.log('download log error:', e); - } - }, [appName, containerName, podName, sinceTime, previous]); - - return ( - - - - - - - Pod {t('Log')} - - - - - {podAlias} - - - - } - menuList={pods.map((item) => ({ - isActive: item.podName === podName, - child: {item.alias}, - onClick: () => setLogsPodName(item.podName) - }))} - /> - - - - - {t(sinceKey)} - - - - } - menuList={sinceItems.map((item) => ({ - isActive: item.key === sinceKey, - child: {t(item.key)}, - onClick: () => switchSince(item) - }))} - /> - - - - - - - {logs === '' ? ( - - ) : ( - - )} - - - - - - ); -}; - -export default LogsModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/MonitorModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/MonitorModal.tsx deleted file mode 100644 index cb249f432..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/MonitorModal.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import PodLineChart from '@/components/PodLineChart'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useAppStore } from '@/store/app'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@sealos/shadcn-ui/dialog'; -import { useTranslation } from 'next-i18next'; - -const MonitorModal = ({ onClose, isOpen }: { isOpen: boolean; onClose: () => void }) => { - const { t } = useTranslation(); - const { appDetail = MOCK_APP_DETAIL } = useAppStore(); - - return ( - !open && onClose()}> - - - - {t('Real-time Monitoring')} - - - -
-
-
- CPU ({appDetail.usedCpu.yData[appDetail.usedCpu.yData.length - 1]}%) -
-
- -
-
-
-
- {t('Memory')} ( - {appDetail.usedMemory.yData[appDetail.usedMemory.yData.length - 1]}%) -
-
- -
-
-
-
-
- ); -}; - -export default MonitorModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/NetworkConfigurationTable.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/NetworkConfigurationTable.tsx deleted file mode 100644 index 68e22f755..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/NetworkConfigurationTable.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { CircleHelpIcon, Copy } from 'lucide-react'; -import { useCallback, useState } from 'react'; -import ICPStatus from './ICPStatus'; - -export type NetworkConfigurationTableItem = { - inline: string; - public: string; - customDomain: string | null; - showReadyStatus: boolean; - port: number; -}; - -type NetworkStatusItem = { - ready: boolean; - url: string; -}; - -type NetworkConfigurationTableProps = { - networks: NetworkConfigurationTableItem[]; - networkStatus?: NetworkStatusItem[]; - statusMap: Record; - copyData: (value: string) => void; - t: (key: string) => string; -}; - -const NetworkConfigurationTable = ({ - networks, - networkStatus, - statusMap, - copyData, - t -}: NetworkConfigurationTableProps) => { - const [icpRegisteredByPublicUrl, setIcpRegisteredByPublicUrl] = useState< - Record - >({}); - - const handleIcpRegistrationStatusChange = useCallback( - (publicUrl: string, registered: boolean | null) => { - setIcpRegisteredByPublicUrl((prev) => { - if (prev[publicUrl] === registered) return prev; - return { - ...prev, - [publicUrl]: registered - }; - }); - }, - [] - ); - - return ( -
- - - - - - - - - - - - - - - {networks.map((network, index) => { - const publicUrl = network.public; - const customDomain = network.customDomain ?? ''; - const isIcpUnregistered = !!publicUrl && icpRegisteredByPublicUrl[publicUrl] === false; - const showReadyTag = publicUrl && network.showReadyStatus && !isIcpUnregistered; - const showIcpStatus = - network.customDomain !== null && - network.showReadyStatus === true && - !!publicUrl && - !!customDomain; - - return ( - - - - - - ); - })} - -
- {t('Port')} - - {t('Private Address')} - - {t('Public Address')} -
-
{network.port}
-
- - -
copyData(network.inline)} - > - {network.inline.replace('.svc.cluster.local', '')} -
-
- -

{t('Copy')}

-
-
-
-
- {showIcpStatus && ( - - handleIcpRegistrationStatusChange(publicUrl, registered) - } - /> - )} - - {showReadyTag && ( -
- {statusMap[network.public]?.ready ? ( -
-
- {t('Accessible')} -
- ) : ( - - -
- - {t('Ready')} -
-
- -
- {network.customDomain - ? t('network_not_ready_icp_reg') - : t('network_not_ready')} -
-
-
- )} -
- )} - -
- - -
window.open(network.public, '_blank') - } - : {})} - > - {network.public || '-'} -
-
- {network.public && ( - -

{t('Open Link')}

-
- )} -
- {!!network.public && ( -
copyData(network.public)} - > - -
- )} -
-
-
-
- ); -}; - -export default NetworkConfigurationTable; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/PodDetailModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/PodDetailModal.tsx deleted file mode 100644 index 597f0ae01..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/PodDetailModal.tsx +++ /dev/null @@ -1,531 +0,0 @@ -import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react'; -import type { PodDetailType, PodEvent } from '@/types/app'; -import { MOCK_PODS } from '@/mock/apps'; -import { getPodEvents, getPodLogs } from '@/api/app'; -import { useQuery } from '@tanstack/react-query'; -import { useLoading } from '@/hooks/useLoading'; -import { streamFetch } from '@/services/streamFetch'; -import { useToast } from '@/hooks/useToast'; -import { downLoadBold } from '@/utils/tools'; -import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@sealos/shadcn-ui/drawer'; -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@sealos/shadcn-ui/dialog'; -import { Button } from '@sealos/shadcn-ui/button'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue -} from '@sealos/shadcn-ui/select'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { Sparkles, CircleAlert, CircleHelp, Download, LineChart, FileClock } from 'lucide-react'; -import { default as AnsiUp } from 'ansi_up'; -import Empty from './empty'; - -import styles from '@/components/app/detail/index/index.module.scss'; -import { useTranslation } from 'next-i18next'; -import { useClientAppConfig } from '@/hooks/useClientAppConfig'; -import { useRouter } from 'next/navigation'; -import { getPodContainerName } from '@/utils/pod'; - -interface SinceItem { - key: 'streaming_logs' | 'within_5_minute' | 'within_1_hour' | 'within_1_day' | 'terminated_logs'; - since: number; - previous: boolean; -} - -const newSinceItems = (baseTimestamp: number): SinceItem[] => { - return [ - { key: 'streaming_logs', since: 0, previous: false }, - { key: 'within_5_minute', since: baseTimestamp - 5 * 60 * 1000, previous: false }, - { key: 'within_1_hour', since: baseTimestamp - 60 * 60 * 1000, previous: false }, - { key: 'within_1_day', since: baseTimestamp - 24 * 60 * 60 * 1000, previous: false }, - { key: 'terminated_logs', since: 0, previous: true } - ]; -}; - -const PodDetailModal = ({ - appName, - pod = MOCK_PODS[0], - pods = [], - podAlias, - setPodDetail, - closeFn -}: { - appName: string; - pod: PodDetailType; - pods: { alias: string; podName: string }[]; - podAlias: string; - setPodDetail: (name: string) => void; - closeFn: () => void; -}) => { - const { t } = useTranslation(); - const router = useRouter(); - const controller = useRef(new AbortController()); - const logsController = useRef(null); - const { Loading } = useLoading(); - const { toast } = useToast(); - const config = useClientAppConfig(); - const [events, setEvents] = useState([]); - const [eventAnalysesText, setEventAnalysesText] = useState(''); - const [isAnalyzing, setIsAnalyzing] = useState(false); - const [isOpenAnalyses, setIsOpenAnalyses] = useState(false); - - // Logs state - const [logs, setLogs] = useState(''); - const [isLoadingLogs, setIsLoadingLogs] = useState(true); - const LogBox = useRef(null); - const ansi_up = useRef(new AnsiUp()); - const [sinceKey, setSinceKey] = useState('streaming_logs'); - const [sinceTime, setSinceTime] = useState(0); - const [previous, setPrevious] = useState(false); - const sinceItems = useMemo(() => newSinceItems(Date.now()), []); - const containerName = getPodContainerName(pod); - - const RenderItem = useCallback( - ({ label, children }: { label: string; children: React.ReactNode }) => { - return ( -
-
{label}
-
- {children} -
-
- ); - }, - [] - ); - const RenderItemWithTags = useCallback( - ({ label, children }: { label: string; children: React.ReactNode }) => { - return ( -
-
{label}
-
{children}
-
- ); - }, - [] - ); - const RenderTag = useCallback(({ children }: { children: string }) => { - return ( - - -
- {children} -
-
- -

{children}

-
-
- ); - }, []); - - const { isLoading } = useQuery(['initPodEvents'], () => getPodEvents(pod.podName), { - refetchInterval: 3000, - onSuccess(res) { - setEvents(res); - } - }); - - // Logs functions - const switchSince = useCallback((item: SinceItem) => { - setSinceKey(item.key); - setPrevious(item.previous); - setSinceTime(item.since); - }, []); - - const watchLogs = useCallback(() => { - if (!pod.podName) return null; - setIsLoadingLogs(true); - - const abortController = new AbortController(); - logsController.current = abortController; - - streamFetch({ - url: '/api/getPodLogs', - data: { - appName, - podName: pod.podName, - containerName, - stream: true, - sinceTime, - previous - }, - abortSignal: abortController, - firstResponse() { - setLogs(''); - setIsLoadingLogs(false); - setTimeout(() => { - if (!LogBox.current) return; - LogBox.current.scrollTo({ top: LogBox.current.scrollHeight }); - }, 500); - }, - onMessage(text) { - setLogs((state) => state + ansi_up.current.ansi_to_html(text)); - setTimeout(() => { - if (!LogBox.current) return; - const isBottom = - LogBox.current.scrollTop === 0 || - LogBox.current.scrollTop + LogBox.current.clientHeight + 200 >= - LogBox.current.scrollHeight; - isBottom && LogBox.current.scrollTo({ top: LogBox.current.scrollHeight }); - }, 100); - } - }); - return abortController; - }, [appName, containerName, pod.podName, sinceTime, previous]); - - const exportLogs = useCallback(async () => { - try { - const allLogs = await getPodLogs({ - appName, - podName: pod.podName, - containerName, - stream: false, - sinceTime, - previous - }); - downLoadBold(allLogs, 'text/plain', 'log.txt'); - } catch (e) { - console.log('download log error:', e); - } - }, [appName, containerName, pod.podName, sinceTime, previous]); - - useEffect(() => { - controller.current = new AbortController(); - return () => { - controller.current?.abort(); - }; - }, []); - - // Watch logs effect - useEffect(() => { - const logsAbortController = watchLogs(); - return () => { - logsAbortController?.abort(); - }; - }, [watchLogs]); - - const onCloseAnalysesModel = useCallback(() => { - setEventAnalysesText(''); - setIsOpenAnalyses(false); - controller.current?.abort(); - controller.current = new AbortController(); - }, []); - - const onclickAnalyses = useCallback(async () => { - try { - setIsOpenAnalyses(true); - setIsAnalyzing(true); - await streamFetch({ - url: '/api/getPodEventsAnalyses', - data: events.map((item) => ({ - reason: item.reason, - message: item.message, - count: item.count, - type: item.type, - firstTimestamp: item.firstTime, - lastTimestamp: item.lastTime - })), - abortSignal: controller.current, - onMessage: (text: string) => { - setEventAnalysesText((state) => (state += text)); - } - }); - } catch (err: any) { - toast({ - title: typeof err === 'string' ? err : err?.message || t('analysis_error'), - status: 'warning' - }); - onCloseAnalysesModel(); - } - setIsAnalyzing(false); - }, [events, onCloseAnalysesModel, t, toast]); - - return ( - <> - !open && closeFn()}> - - -
- Pod {t('Details')} - -
-
- -
- {/* Details Section */} -
-
-
- {t('Details')} -
- -
-
- -
-
- {pod.containerStatuses.map((container) => ( - - -
- - -
-
{container.name}
-
- {container.state.label}{' '} - {container.state.reason && <>({container.state.reason})} -
-
- {container.cpuLimit && ( - - {t('CPU')}: {container.cpuLimit} - - )}{' '} - {container.memoryLimit && ( - - {t('Memory')}: {container.memoryLimit} - - )} -
-
-
- - ))} -
- - {pod.status.label} - - {!!pod.status.reason && ( - - - - - -

- {t('Reason')}: {pod.status.reason} - {pod.status.message ? `\n${t('Message')}: ${pod.status.message}` : ''} -

-
-
- )} -
- - {pod.restarts} - {pod.age} - {pod.podName} - - {`${pod.metadata?.ownerReferences?.[0].kind}/${pod.metadata?.ownerReferences?.[0].name}`} - - -
- {Object.entries(pod.metadata?.labels || {}).map( - ([key, value]: [string, string]) => ( - {`${key}=${value}`} - ) - )} -
-
- -
- {Object.entries(pod.metadata?.annotations || {}).map( - ([key, value]: [string, string]) => ( - {`${key}=${value}`} - ) - )} -
-
-
-
- - {/* Events Section */} -
-
- {t('Events')} - {events.length > 0 && config.components.eventAnalysis.enabled && ( - - )} -
-
- {events.map((event, i) => ( -
-
-
-
- - {event.reason}, {t('Last Occur')}: {event.lastTime} - - - {t('First Seen')}: {event.firstTime} - - - {t('Count')}: {event.count} - -
-
{event.message}
-
-
- ))} - {events.length === 0 && !isLoading && ( -
-
- -
- -
{t('No events yet')}
-
- )} -
- -
- - {/* Logs Section */} -
-
-
-
- {t('Log')} -
- -
- -
- - -
-
-
- {logs === '' ? ( - - ) : ( -
- )} - -
-
-
- - - - {/* Analyses Dialog */} - !open && onCloseAnalysesModel()} - > - - - Pod {t('Intelligent Analysis')} - -
- {eventAnalysesText} -
-
-
- - ); -}; - -export default PodDetailModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/PodFileModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/PodFileModal.tsx deleted file mode 100644 index b8dbfb710..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/PodFileModal.tsx +++ /dev/null @@ -1,899 +0,0 @@ -import { - kubeFile_delete, - kubeFile_ls, - kubeFile_mkdir, - kubeFile_rename, - kubeFile_upload -} from '@/api/kubeFile'; -import MyIcon from '@/components/Icon'; -import { useSelectFile } from '@/hooks/useSelectFile'; -import { MOCK_APP_DETAIL, MOCK_PODS } from '@/mock/apps'; -import { useAppStore } from '@/store/app'; -import { useClientAppConfig } from '@/hooks/useClientAppConfig'; -import type { PodDetailType } from '@/types/app'; -import { TFile } from '@/utils/kubeFileSystem'; -import { formatSize, formatTime } from '@/utils/tools'; -import { getUserKubeConfig } from '@/utils/user'; -import { useQuery } from '@tanstack/react-query'; -import { useTranslation } from 'next-i18next'; -import { MouseEvent, useMemo, useState, useEffect } from 'react'; -import { toast } from 'sonner'; -import { - Search, - ChevronDown, - Home, - Loader2, - FolderPlus, - Upload, - PencilLine, - Download, - Trash2, - Save, - X, - TriangleAlert -} from 'lucide-react'; -import { Pagination } from '@sealos/shadcn-ui/pagination'; -import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@sealos/shadcn-ui/drawer'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Switch } from '@sealos/shadcn-ui/switch'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue -} from '@sealos/shadcn-ui/select'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow -} from '@sealos/shadcn-ui/table'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { Separator } from '@sealos/shadcn-ui/separator'; -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbPage, - BreadcrumbSeparator -} from '@sealos/shadcn-ui/breadcrumb'; -import { Popover, PopoverContent, PopoverTrigger } from '@sealos/shadcn-ui/popover'; -import { Label } from '@sealos/shadcn-ui/label'; -import { storageGiToQuantity } from '@/utils/resourceQuantity'; -import type { Quantity } from '@sealos/shared'; -import { getPodContainerName } from '@/utils/pod'; - -const PodFile = ({ - isOpen, - onClose, - pod: podDetail = MOCK_PODS[0], - pods = [], - podAlias = '', - setPodDetail -}: { - isOpen: boolean; - onClose: () => void; - pod: PodDetailType; - pods: { alias: string; podName: string }[]; - podAlias: string; - setPodDetail: (name: string) => void; -}) => { - const { t } = useTranslation(); - const { appDetail = MOCK_APP_DETAIL } = useAppStore(); - const config = useClientAppConfig(); - const [storeDetail, setStoreDetail] = useState<{ - name: string; - path: string; - value: Quantity; - }>( - appDetail.storeList[0] - ? appDetail.storeList[0] - : { name: '/', path: '/', value: storageGiToQuantity(10) } - ); - - const [fileProgress, setFileProgress] = useState(0); - const containerName = getPodContainerName(podDetail); - const [basePath, setBasePath] = useState(storeDetail?.path || '/'); - const basePathArray = useMemo(() => basePath?.split('/')?.filter(Boolean), [basePath]); - const [newFileName, setNewFileName] = useState(''); - const [currentFile, setCurrentFile] = useState(); - const [showHidden, setShowHidden] = useState(false); - const [searchValue, setSearchValue] = useState(''); - const [isUploadLoading, setIsUploadLoading] = useState(false); - const [currentPage, setCurrentPage] = useState(1); - const [pageSize, setPageSize] = useState(10); - const [isEditingPageSize, setIsEditingPageSize] = useState(false); - const [editingPageSizeValue, setEditingPageSizeValue] = useState('10'); - const [editingFile, setEditingFile] = useState(null); - const [editingFileName, setEditingFileName] = useState(''); - const [isCreateFolderOpen, setIsCreateFolderOpen] = useState(false); - const [folderName, setFolderName] = useState(''); - const [deletePopoverOpen, setDeletePopoverOpen] = useState(null); - - const { File, onOpen: openUploadFile } = useSelectFile({ - fileType: '*', - multiple: true - }); - - const { data, refetch } = useQuery( - ['KubeFileSystem-ls', basePath, showHidden, podDetail.podName, containerName], - () => - kubeFile_ls({ - containerName, - podName: podDetail.podName, - path: basePath, - showHidden: showHidden - }), - { - enabled: !!basePath - } - ); - - const sortData = useMemo(() => { - if (!data) return null; - const resultData = data.directories.concat(data.files); - if (!searchValue.trim()) { - return resultData; - } - return resultData.filter((item) => item.name.toLowerCase().includes(searchValue.toLowerCase())); - }, [data, searchValue]); - - // Pagination - const totalPages = useMemo(() => { - if (!sortData) return 0; - return Math.ceil(sortData.length / pageSize); - }, [sortData, pageSize]); - - const paginatedData = useMemo(() => { - if (!sortData) return null; - const startIndex = (currentPage - 1) * pageSize; - const endIndex = startIndex + pageSize; - return sortData.slice(startIndex, endIndex); - }, [sortData, currentPage, pageSize]); - - // Reset to page 1 when search or path changes - useEffect(() => { - setCurrentPage(1); - }, [searchValue, basePath]); - - // Handle pageSize edit - const handlePageSizeStartEdit = () => { - setIsEditingPageSize(true); - setEditingPageSizeValue(pageSize.toString()); - }; - - const handlePageSizeSave = () => { - const newPageSize = parseInt(editingPageSizeValue, 10); - if (newPageSize > 0 && newPageSize <= 100) { - setPageSize(newPageSize); - setCurrentPage(1); // Reset to first page when page size changes - } - setIsEditingPageSize(false); - }; - - const handlePageSizeCancel = () => { - setIsEditingPageSize(false); - setEditingPageSizeValue(pageSize.toString()); - }; - - // File icon system with color mapping - const getFileIcon = (file: TFile): { name: string; color: string } => { - const kind = file.kind; - const name = file.name; - - // Folder - if (kind === 'd') { - return { name: 'folderColor', color: '#EAB308' }; - } - - // File extension mapping - const fileExtension = name.split('.').pop()?.toLowerCase() || ''; - - // Icon and color mapping - const iconMap: Record = { - // Documents - csv: { name: 'csvColor', color: '#16A34A' }, - pdf: { name: 'pdfColor', color: '#DC2626' }, - txt: { name: 'txtColor', color: '#71717A' }, - - // Images - png: { name: 'pngColor', color: '#0D9488' }, - jpg: { name: 'pngColor', color: '#0D9488' }, - jpeg: { name: 'pngColor', color: '#0D9488' }, - gif: { name: 'pngColor', color: '#0D9488' }, - svg: { name: 'pngColor', color: '#0D9488' }, - webp: { name: 'pngColor', color: '#0D9488' }, - ico: { name: 'pngColor', color: '#0D9488' }, - - // Config files - yaml: { name: 'yamlColor', color: '#8B5CF6' }, - yml: { name: 'yamlColor', color: '#8B5CF6' }, - json: { name: 'yamlColor', color: '#8B5CF6' }, - toml: { name: 'yamlColor', color: '#8B5CF6' }, - ini: { name: 'yamlColor', color: '#8B5CF6' }, - conf: { name: 'yamlColor', color: '#8B5CF6' }, - config: { name: 'yamlColor', color: '#8B5CF6' }, - - // Web files - html: { name: 'html2Color', color: '#71717A' }, - htm: { name: 'html2Color', color: '#71717A' }, - css: { name: 'html2Color', color: '#71717A' }, - scss: { name: 'html2Color', color: '#71717A' }, - sass: { name: 'html2Color', color: '#71717A' }, - less: { name: 'html2Color', color: '#71717A' }, - - // Code files - js: { name: 'txtColor', color: '#71717A' }, - jsx: { name: 'txtColor', color: '#71717A' }, - ts: { name: 'txtColor', color: '#71717A' }, - tsx: { name: 'txtColor', color: '#71717A' }, - py: { name: 'txtColor', color: '#71717A' }, - go: { name: 'txtColor', color: '#71717A' }, - java: { name: 'txtColor', color: '#71717A' }, - c: { name: 'txtColor', color: '#71717A' }, - cpp: { name: 'txtColor', color: '#71717A' }, - h: { name: 'txtColor', color: '#71717A' }, - hpp: { name: 'txtColor', color: '#71717A' }, - rs: { name: 'txtColor', color: '#71717A' }, - php: { name: 'txtColor', color: '#71717A' }, - rb: { name: 'txtColor', color: '#71717A' }, - sh: { name: 'txtColor', color: '#71717A' }, - bash: { name: 'txtColor', color: '#71717A' }, - - // Data files - xml: { name: 'txtColor', color: '#71717A' }, - sql: { name: 'txtColor', color: '#71717A' }, - md: { name: 'txtColor', color: '#71717A' }, - markdown: { name: 'txtColor', color: '#71717A' }, - log: { name: 'txtColor', color: '#71717A' } - }; - - return iconMap[fileExtension] || { name: 'defaultColor', color: '#2563EB' }; - }; - - const handleBreadcrumbClick = (index: number) => { - if (index === basePathArray.length - 1) { - return; - } - const newPath = `/${basePathArray.slice(0, index + 1).join('/')}`; - setBasePath(newPath); - }; - - const handleDelete = async (file: TFile) => { - try { - await kubeFile_delete({ - podName: podDetail.podName, - containerName, - path: file.path - }); - toast.success(t('Delete Success') || 'success'); - refetch(); - } catch (error) { - toast.error(t('Delete Failed') || 'Delete failed'); - } - setDeletePopoverOpen(null); - }; - - const handleRename = async (file: TFile, newName: string) => { - try { - if (!file || !newName || newName === file.name) return; - const from = file.path; - const to = file.path.replace(/\/[^/]+$/, `/${newName}`); - await kubeFile_rename({ - podName: podDetail.podName, - containerName, - from, - to - }); - toast.success(t('Rename Success')); - refetch(); - } catch (error) { - toast.error(t('Rename Failed')); - } - }; - - const handleStartEdit = (file: TFile) => { - setEditingFile(file.path); - setEditingFileName(file.name); - }; - - const handleSaveEdit = async (file: TFile) => { - if (editingFileName && editingFileName !== file.name) { - await handleRename(file, editingFileName); - } - setEditingFile(null); - setEditingFileName(''); - }; - - const handleCancelEdit = () => { - setEditingFile(null); - setEditingFileName(''); - }; - - const handleDownload = async (e: MouseEvent, file: TFile) => { - try { - e.stopPropagation(); - setCurrentFile(file); - if (!file) return; - const res = await fetch('/api/kubeFileSystem/download', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: encodeURIComponent(getUserKubeConfig()) - }, - body: JSON.stringify({ - podName: podDetail.podName, - containerName, - path: file.path - }) - }); - - if (res.ok) { - const cloneRes = res.clone(); - const contentLength = file.size; - - let downloaded = 0; - const reader = res.body?.getReader(); - if (!reader) return; - while (true) { - const { done, value } = await reader.read(); - if (done) { - setFileProgress(100); - break; - } - downloaded += value.length; - const progress = Math.round((downloaded / contentLength) * 100); - setFileProgress(progress); - } - - const blob = await cloneRes.blob(); - const url = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = url; - link.setAttribute('download', file.name); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - window.URL.revokeObjectURL(url); - } - } catch (error: any) {} - }; - - const uploadFile = async (files: File[]) => { - setIsUploadLoading(true); - try { - const filteredFiles = files.filter((file) => { - if (file.size > config.fileManager.uploadLimit * 1024 * 1024) { - toast.info(t('File is too large tip', { name: file.name })); - return false; - } - return true; - }); - const uploadPromises = filteredFiles.map(async (file) => { - const name = file.name; - const form = new FormData(); - form.append('file', file, encodeURIComponent(file.name)); - return await kubeFile_upload( - { - podName: podDetail.podName, - containerName, - path: `${basePath}/${name}` - }, - form - ); - }); - await Promise.all(uploadPromises); - refetch(); - } catch (error) { - refetch(); - } - setIsUploadLoading(false); - }; - - const createFolder = async () => { - try { - if (!newFileName) return; - await kubeFile_mkdir({ - podName: podDetail.podName, - containerName, - path: `${basePath}/${newFileName}` - }); - toast.success('success'); - } catch (error) {} - }; - - const handleCreateFolderConfirm = async () => { - try { - if (!folderName.trim()) return; - await kubeFile_mkdir({ - podName: podDetail.podName, - containerName, - path: `${basePath}/${folderName}` - }); - toast.success(t('Create Folder Success') || 'success'); - setFolderName(''); - setIsCreateFolderOpen(false); - refetch(); - } catch (error) { - toast.error(t('Create Folder Failed') || 'failed'); - } - }; - - return ( - <> - !open && onClose()}> - - -
- {t('File Management')} - - {storeDetail && ( - - )} -
-
- -
-
- {/* Breadcrumb */} - - - {basePathArray.map((p, index, arr) => ( - - {index === arr.length - 1 ? ( - - {p} - - ) : ( - <> - handleBreadcrumbClick(index)} - > - {p} - - - - )} - - ))} - - - - {/* Header */} -
- uploadFile(e)} /> -
- - setSearchValue(e.target.value)} - /> -
- - {t('show hidden files')} -
- - - - - -
-

- {t('Create Folder')} -

-
- - setFolderName(e.target.value)} - placeholder={ - t('Please enter the folder name') || 'Please enter the folder name' - } - className="h-10" - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.preventDefault(); - handleCreateFolderConfirm(); - } - }} - /> -
-
- - -
-
-
-
- -
-
- - {/* Table */} -
-
- - - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 pl-5 w-[30%] !rounded-l-xl`} - > - {t('File Name')} - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 w-[15%]`} - > - {t('Attribute')} - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 w-[15%]`} - > - {t('Owner')} : {t('Group')} - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 w-[10%]`} - > - {t('Size')} - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 w-[20%]`} - > - {t('Update Time')} - - 0 - ? 'border-b border-zinc-200' - : '' - } bg-white py-3 pr-5 w-[10%] !rounded-r-xl`} - > - {' '} - - - - - {paginatedData?.map((item) => ( - { - if (item.kind === 'd') { - setBasePath(item.path); - } - }} - > - -
- {(() => { - const iconInfo = getFileIcon(item); - return ( - - ); - })()} - {editingFile === item.path ? ( -
e.stopPropagation()} - > - setEditingFileName(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.preventDefault(); - handleSaveEdit(item); - } else if (e.key === 'Escape') { - e.preventDefault(); - handleCancelEdit(); - } - }} - autoFocus - className="h-9 text-sm flex-1 bg-white" - onClick={(e) => e.stopPropagation()} - /> -
- - -
-
- ) : ( - <> - {item.name} - { - e.stopPropagation(); - handleStartEdit(item); - }} - /> - - )} -
-
- {item.attr} - - {item.owner}:{item.group} - - - {formatSize(item.size)} - - - {formatTime(item.updateTime, 'YYYY-MM-DD HH:mm')} - - e.stopPropagation()}> -
- {item.kind !== 'd' && ( - <> - {fileProgress > 0 && - fileProgress < 100 && - currentFile?.path === item.path ? ( -
- -
- ) : ( - - - - - {t('download')} - - )} - - )} - - setDeletePopoverOpen(open ? item.path : null) - } - > - - - - -
-

- - {t('Delete')} -

-

- {t('Are you sure you want to delete the file or folder?')} -

-
- - -
-
-
-
-
-
-
- ))} -
-
-
-
-
-
- - {/* Pagination*/} - {sortData && sortData.length > 0 && ( -
- {t('Total') + ': ' + sortData.length} -
- -
- {isEditingPageSize ? ( - setEditingPageSizeValue(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.preventDefault(); - handlePageSizeSave(); - } else if (e.key === 'Escape') { - e.preventDefault(); - handlePageSizeCancel(); - } - }} - onBlur={handlePageSizeSave} - autoFocus - className="h-7 w-12 text-center text-sm p-0" - type="number" - min="1" - max="100" - /> - ) : ( - - {pageSize} - - )} - / - {t('Page')} -
-
-
- )} -
-
- - ); -}; - -export default PodFile; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/Pods.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/Pods.tsx deleted file mode 100644 index 3671019c0..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/Pods.tsx +++ /dev/null @@ -1,355 +0,0 @@ -import { restartPodByName } from '@/api/app'; -import PodLineChart from '@/components/PodLineChart'; -import { PodStatusEnum } from '@/constants/app'; -import { useConfirm } from '@/hooks/useConfirm'; -import { useLoading } from '@/hooks/useLoading'; -import { useToast } from '@/hooks/useToast'; -import type { PodDetailType } from '@/types/app'; -import { CircleHelp, ScrollText, Terminal, FolderOpen } from 'lucide-react'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow -} from '@sealos/shadcn-ui/table'; -import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import React, { useCallback, useState } from 'react'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useAppStore } from '@/store/app'; -import { track } from '@sealos/gtm'; -import { getUserSession } from '@/utils/user'; -import { useUserStore } from '@/store/user'; -import { getPodContainerName } from '@/utils/pod'; - -const LogsModal = dynamic(() => import('./LogsModal')); -const DetailModel = dynamic(() => import('./PodDetailModal')); -const PodFileModal = dynamic(() => import('./PodFileModal')); - -const Pods = ({ pods = [], appName }: { pods: PodDetailType[]; appName: string }) => { - const { t } = useTranslation(); - const { toast } = useToast(); - const [logsPodIndex, setLogsPodIndex] = useState(); - const [detailPodIndex, setDetailPodIndex] = useState(); - const [detailFilePodIndex, setDetailFilePodIndex] = useState(); - const nsid = useUserStore().session?.user.nsid; - - const closeFn = useCallback(() => setLogsPodIndex(undefined), [setLogsPodIndex]); - - const { Loading } = useLoading(); - const { openConfirm: openConfirmRestart, ConfirmChild: RestartConfirmChild } = useConfirm({ - content: 'Please confirm to restart the Pod?' - }); - const { appDetail = MOCK_APP_DETAIL, appDetailPods } = useAppStore(); - const [isOpenPodFile, setIsOpenPodFile] = useState(false); - - const handleRestartPod = useCallback( - async (podName: string) => { - try { - await restartPodByName(podName); - toast({ - title: `${t('Restart')} ${podName} ${t('success')}`, - status: 'success' - }); - } catch (err) { - toast({ - title: `${t('Restart')} ${podName} 出现异常`, - status: 'warning' - }); - console.log(err); - } - }, - [t, toast] - ); - - const columns: { - title: string; - dataIndex?: keyof PodDetailType; - key: string; - render?: (item: PodDetailType, i: number) => JSX.Element | string; - }[] = [ - { - title: 'Pod Name', - key: 'podName', - render: (_: PodDetailType, i: number) => ( -
{_?.podName}
- ) - }, - { - title: 'Status', - key: 'status', - render: (item: PodDetailType) => ( -
-
- {item.containerStatuses.map((container) => { - return ( - - -
- - -
-
{container.name}
-
- {container.state.label}{' '} - {container.state.reason && <>({container.state.reason})} -
-
- {container.cpuLimit && ( - - {t('CPU')}: {container.cpuLimit} - - )}{' '} - {container.memoryLimit && ( - - {t('Memory')}: {container.memoryLimit} - - )} -
-
-
- - ); - })} -
-
- {item.status.label} - {!!item.status.reason && ( - - - - - -

- Reason: {item.status.reason} - {item.status.message ? `\nMessage: ${item.status.message}` : ''} -

-
-
- )} -
-
- ) - }, - { - title: 'Restarts Num', - key: 'restarts', - render: (item: PodDetailType) => ( -
- {item.restarts} - {!!item.containerStatuses[0]?.state.reason && ( -
- ({item.containerStatuses[0].state.reason}) -
- )} -
- ) - }, - { - title: 'Age', - key: 'age', - render: (item: PodDetailType) => ( -
{item.age}
- ) - }, - { - title: '', - key: 'control', - render: (item: PodDetailType, i: number) => { - const containerName = getPodContainerName(item); - - return ( -
- - - - - - - - - -

{t('Terminal')}

-
-
- - {appDetail.storeList?.length > 0 && ( - - - - - -

{t('File Management')}

-
-
- )} -
- ); - } - } - ]; - - return ( -
-
- {t('Pods List')} - - {pods.length} - -
- -
- - - - {columns.map((item, index) => ( - - {t(item.title)} - - ))} - - - - {pods.map((app, i) => ( - - {columns.map((col) => ( - - {col.render - ? col.render(app, i) - : col.dataIndex - ? `${app[col.dataIndex]}` - : '-'} - - ))} - - ))} - -
-
- - {logsPodIndex !== undefined && ( - pod.status.value === PodStatusEnum.running) - .map((item) => ({ - alias: item.podName, - podName: item.podName, - pod: item - }))} - podAlias={pods[logsPodIndex]?.podName || ''} - setLogsPodName={(name: string) => - setLogsPodIndex(pods.findIndex((item) => item.podName === name)) - } - closeFn={closeFn} - /> - )} - {detailPodIndex !== undefined && ( - ({ - alias: item.podName, - podName: item.podName - }))} - setPodDetail={(e: string) => - setDetailPodIndex(pods.findIndex((item) => item.podName === e)) - } - closeFn={() => setDetailPodIndex(undefined)} - /> - )} - - {isOpenPodFile && appDetail.storeList?.length > 0 && detailFilePodIndex !== undefined && ( - setIsOpenPodFile(false)} - pod={pods[detailFilePodIndex]} - podAlias={pods[detailFilePodIndex]?.podName || ''} - pods={pods.map((item, i) => ({ - alias: item.podName, - podName: item.podName - }))} - setPodDetail={(e: string) => - setDetailFilePodIndex(pods.findIndex((item) => item.podName === e)) - } - /> - )} - -
- ); -}; - -export default React.memo(Pods); diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/UpdateModal.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/UpdateModal.tsx deleted file mode 100644 index 2000c0dbd..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/UpdateModal.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { TAppSource } from '@/types/app'; -import { useTranslation } from 'next-i18next'; -import { useState } from 'react'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import { TriangleAlert } from 'lucide-react'; -import { Button } from '@sealos/shadcn-ui/button'; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle -} from '@sealos/shadcn-ui/dialog'; - -const UpdateModal = ({ - isOpen, - onClose, - source -}: { - isOpen: boolean; - onClose: () => void; - source?: TAppSource; -}) => { - const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - - const openTemplateApp = () => { - if (!source?.hasSource) return; - if (source.sourceType === 'sealaf') { - sealosApp.runEvents('openDesktopApp', { - appKey: 'system-sealaf', - pathname: '/', - query: { instanceName: source.sourceName } - }); - } - onClose(); - }; - - return ( - !open && onClose()}> - - - - - {t('remind')} - - - -
{t('update_sealaf_app_tip')}
- - - - - -
-
- ); -}; - -export default UpdateModal; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/empty.tsx b/frontend/providers/applaunchpad/src/components/app/detail/index/empty.tsx deleted file mode 100644 index 4636ec0ae..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/empty.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import MyIcon from '@/components/Icon'; -import { useTranslation } from 'next-i18next'; - -const Empty = () => { - const { t } = useTranslation(); - return ( -
- -
{t('no_logs_for_now')}
-
- ); -}; - -export default Empty; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/index/index.module.scss b/frontend/providers/applaunchpad/src/components/app/detail/index/index.module.scss deleted file mode 100644 index b3d1db5c2..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/index/index.module.scss +++ /dev/null @@ -1,100 +0,0 @@ -.logs { - ::-webkit-scrollbar { - width: 8px; - height: 8px; - border-radius: 2px; - } - ::-webkit-scrollbar-track { - border-radius: 2px; - } - ::-webkit-scrollbar-thumb { - background: #bfbfbf; - border-radius: 2px; - } - ::-webkit-scrollbar-thumb:hover { - background: #999; - } -} - -.analysesAnimation::after { - display: inline-block; - content: ''; - width: 4px; - height: 14px; - transform: translate(4px, 2px) scaleY(1.3); - background-color: var(--chakra-colors-chakra-body-text); - animation: blink 0.6s infinite; -} -.textEllipsis { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.table { - border-radius: 2px; - overflow: hidden; - table-layout: fixed; - width: 100%; - background-color: #fff; - - th { - border: 1px solid #eff0f1; - text-align: left; - padding: 8px; - user-select: all; - font-weight: 500; - } - - tr:nth-child(even) { - background-color: #eff0f1; - } -} - -@keyframes blink { - from, - to { - opacity: 0; - } - 50% { - opacity: 1; - } -} - -.fileSystemTable { - table { - thead { - th { - font-size: 12px; - font-weight: 500; - color: #485264; - background: #f4f4f7; - } - tr:first-child th:first-child { - border-top-left-radius: 6px; - } - tr:first-child th:last-child { - border-top-right-radius: 6px; - } - tr:last-child th:first-child { - border-bottom-left-radius: 6px; - } - tr:last-child th:last-child { - border-bottom-right-radius: 6px; - } - th { - border-bottom: none; - } - } - tbody { - tr:first-child { - border-top: none; - } - tr { - font-size: 12px; - color: #485264; - font-weight: 500; - } - } - } -} diff --git a/frontend/providers/applaunchpad/src/components/app/detail/logs/Filter.tsx b/frontend/providers/applaunchpad/src/components/app/detail/logs/Filter.tsx deleted file mode 100644 index 9a0f2e27b..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/logs/Filter.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import { Search, X, Plus, Filter as FilterIcon, Inbox, Trash2 } from 'lucide-react'; -import { JsonFilterItem, LogsFormData } from '@/pages/app/detail/logs'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Switch } from '@sealos/shadcn-ui/switch'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue -} from '@sealos/shadcn-ui/select'; -import { useTranslation } from 'next-i18next'; -import { useState } from 'react'; -import { UseFormReturn, useFieldArray } from 'react-hook-form'; -import { cn } from '@sealos/shadcn-ui'; - -export const Filter = ({ - formHook, - refetchData -}: { - formHook: UseFormReturn; - refetchData: () => void; -}) => { - const { t } = useTranslation(); - const [activeId, setActiveId] = useState('normal_filter'); - const [inputKeyword, setInputKeyword] = useState(formHook.watch('keyword')); - - const isJsonMode = formHook.watch('isJsonMode'); - const isOnlyStderr = formHook.watch('isOnlyStderr'); - const filterKeys = formHook.watch('filterKeys'); - - const { fields, append, remove } = useFieldArray({ - control: formHook.control, - name: 'jsonFilters' - }); - - return ( -
- {/* operator button */} -
-
- -
- -
- {t('highlight_stderr')} - formHook.setValue('isOnlyStderr', checked)} - /> -
- -
-
- setInputKeyword(e.target.value)} - className="h-10 rounded-lg shadow-none text-sm font-normal text-zinc-900 bg-zinc-100 border-0" - /> -
- - -
-
- - {/* json mode */} - {isJsonMode && ( -
- {fields.map((field, index) => ( -
- {/* Field Name Select */} - - - {/* Mode Select */} - - - {/* Value Input */} - formHook.setValue(`jsonFilters.${index}.value`, e.target.value)} - /> - - {/* Remove Button */} - -
- ))} - - {filterKeys.length > 0 || fields.length > 0 ? ( - - append({ - key: '', - value: '', - mode: '=' - }) - } - /> - ) : ( -
-
- - {t('no_data_available')} -
-
- )} -
- )} -
- ); -}; - -const AppendJSONFormItemButton = ({ onClick }: { onClick: () => void }) => { - const { t } = useTranslation(); - return ( - - ); -}; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/logs/Header.tsx b/frontend/providers/applaunchpad/src/components/app/detail/logs/Header.tsx deleted file mode 100644 index f6ff87b66..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/logs/Header.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import { RefreshCw } from 'lucide-react'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@sealos/shadcn-ui/tooltip'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue -} from '@sealos/shadcn-ui/select'; -import { Separator } from '@sealos/shadcn-ui/separator'; - -import AdvancedSelect, { ListItem } from '@/components/AdvancedSelect'; -import { REFRESH_INTERVAL_OPTIONS } from '@/constants/monitor'; -import { LogsFormData } from '@/pages/app/detail/logs'; -import useDateTimeStore from '@/store/date'; -import { UseFormReturn } from 'react-hook-form'; - -const DatePicker = dynamic(() => import('@/components/DatePicker'), { ssr: false }); - -export const Header = ({ - formHook, - refetchData, - onContainerChange -}: { - formHook: UseFormReturn; - refetchData: () => void; - onContainerChange: (containers: ListItem[]) => void; -}) => { - const { t } = useTranslation(); - const { refreshInterval, setRefreshInterval } = useDateTimeStore(); - - return ( -
-
-

{t('Filter')}

-
-
- -
-
- {t('Pods')}} - title={t('pod_filtering')} - width={'fit-content'} - value={'hello-sql-postgresql-0'} - onCheckboxChange={(val) => { - formHook.setValue('pods', val); - }} - list={formHook.watch('pods')} - /> -
-
- {t('Containers')} - } - title={t('container_filtering')} - width={'fit-content'} - value={'hello-sql-postgresql-0'} - list={formHook.watch('containers')} - onCheckboxChange={onContainerChange} - /> -
-
-
- -
-
- {/* refresh button */} -
- - - - - {t('refresh')} - - - -
- - {/* log number input */} -
- { - const val = Number(e.target.value); - if (isNaN(val)) { - formHook.setValue('limit', 1); - } else if (val > 1000) { - formHook.setValue('limit', 1000); - } else if (val < 1) { - formHook.setValue('limit', 1); - } else { - formHook.setValue('limit', val); - } - }} - /> - - {t('logs')} - -
-
-
-
- ); -}; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/logs/LogCounts.tsx b/frontend/providers/applaunchpad/src/components/app/detail/logs/LogCounts.tsx deleted file mode 100644 index 16e8a03c7..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/logs/LogCounts.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import MyIcon from '@/components/Icon'; -import LogBarChart from '@/components/LogBarChart'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Loading } from '@sealos/shadcn-ui/loading'; -import { cn } from '@sealos/shadcn-ui'; -import { useTranslation } from 'next-i18next'; -import { useState } from 'react'; -import EmptyChart from '@/components/Icon/icons/emptyChart.svg'; -import { ChevronRight, BarChart3 } from 'lucide-react'; -import { getUtcTimestamp } from '@/utils/timeRange'; - -export const LogCounts = ({ - logCountsData, - isLogCountsLoading -}: { - logCountsData: { logs_total: string; _time: string }[]; - isLogCountsLoading?: boolean; -}) => { - const { t } = useTranslation(); - const [onOpenChart, setOnOpenChart] = useState(true); - - const processChartData = (rawData: Array<{ _time: string; logs_total: string }>) => { - const sortedData = [...rawData].sort( - (a, b) => getUtcTimestamp(a._time) - getUtcTimestamp(b._time) - ); - const xData = sortedData.map((item) => Math.floor(getUtcTimestamp(item._time) / 1000)); - const yData = sortedData.map((item) => item.logs_total); - - return { - xData, - yData - }; - }; - - return ( -
-
- -
- {/* charts */} -
- {isLogCountsLoading ? ( -
0 ? 'h-[140px]' : 'h-[72px]')} - > - -
- ) : logCountsData.length > 0 ? ( - - ) : ( -
-
- -
- {t('no_data_available')} -
- )} -
-
- ); -}; diff --git a/frontend/providers/applaunchpad/src/components/app/detail/logs/LogTable.tsx b/frontend/providers/applaunchpad/src/components/app/detail/logs/LogTable.tsx deleted file mode 100644 index 1ab657477..000000000 --- a/frontend/providers/applaunchpad/src/components/app/detail/logs/LogTable.tsx +++ /dev/null @@ -1,243 +0,0 @@ -import { BaseTable } from '@/components/BaseTable/index'; -import { - ColumnDef, - getCoreRowModel, - getFilteredRowModel, - useReactTable -} from '@tanstack/react-table'; -import { get } from 'lodash'; -import { useTranslation } from 'next-i18next'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { Download, ScrollText, Filter as FilterIcon } from 'lucide-react'; - -import { formatDateTimeInTimeZone, getBrowserTimeZone } from '@/utils/timeRange'; -import { LogsFormData } from '@/pages/app/detail/logs'; -import { UseFormReturn } from 'react-hook-form'; -import { useLogStore } from '@/store/logStore'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Checkbox } from '@sealos/shadcn-ui/checkbox'; -import { cn } from '@sealos/shadcn-ui'; -import { Separator } from '@sealos/shadcn-ui/separator'; - -interface FieldItem { - value: string; - label: string; - checked: boolean; - accessorKey: string; -} - -interface LogData { - stream: string; - [key: string]: any; -} - -export const LogTable = ({ - data, - isLoading, - formHook -}: { - data: any[]; - isLoading: boolean; - formHook: UseFormReturn; -}) => { - const { t, i18n } = useTranslation(); - const lang = i18n.language; - const timeZone = useMemo(() => getBrowserTimeZone(), []); - - const [onOpenField, setOnOpenField] = useState(false); - const [hiddenFieldCount, setHiddenFieldCount] = useState(0); - const [visibleFieldCount, setVisibleFieldCount] = useState(0); - const isJsonMode = formHook.watch('isJsonMode'); - const isOnlyStderr = formHook.watch('isOnlyStderr'); - const { exportLogs } = useLogStore(); - - const generateFieldList = useCallback((data: any[], prevFieldList: FieldItem[] = []) => { - if (!data.length) return []; - - const uniqueKeys = new Set(); - data.forEach((item) => { - Object.keys(item).forEach((key) => { - uniqueKeys.add(key); - }); - }); - - const prevFieldStates = prevFieldList.reduce((acc, field) => { - acc[field.value] = field.checked; - return acc; - }, {} as Record); - - return Array.from(uniqueKeys).map((key) => ({ - value: key, - label: key, - checked: key in prevFieldStates ? prevFieldStates[key] : true, - accessorKey: key - })); - }, []); - - const [fieldList, setFieldList] = useState([]); - - useEffect(() => { - setFieldList((prevFieldList) => generateFieldList(data, prevFieldList)); - const excludeFields = ['_time', '_msg', 'container', 'pod', 'stream']; - formHook.setValue( - 'filterKeys', - generateFieldList(data) - .filter((field) => !excludeFields.includes(field.value)) - .map((field) => ({ value: field.value, label: field.label })) - ); - }, [data, generateFieldList, formHook]); - - useEffect(() => { - const visibleCount = fieldList.filter((field) => field.checked).length; - setVisibleFieldCount(visibleCount); - setHiddenFieldCount(fieldList.length - visibleCount); - }, [fieldList]); - - const columns = useMemo>>(() => { - return fieldList - .filter((field) => field.checked) - .map((field) => ({ - accessorKey: field.accessorKey, - header: () => { - return t('log_table.' + field.label, { defaultValue: field.label }); - }, - cell: ({ row }) => { - let value = get(row.original, field.accessorKey, ''); - - if (field.accessorKey === '_time') { - value = formatDateTimeInTimeZone(value, timeZone); - } - - return ( - - {value?.toString() || ''} - - ); - }, - meta: { - isError: (row: any) => row.stream === 'stderr' - } - })); - }, [fieldList, isOnlyStderr, t, timeZone]); - - const table = useReactTable({ - data: data, - columns, - getCoreRowModel: getCoreRowModel(), - getFilteredRowModel: getFilteredRowModel() - }); - - return ( -
-
-
- {t('Log')} - {isJsonMode && ( -
- -
- )} -
- - - - {isJsonMode && ( -
- {fieldList.map((item) => ( -
- - setFieldList( - fieldList.map((field) => - field.value === item.value ? { ...field, checked: !field.checked } : field - ) - ) - } - /> - -
- ))} -
- )} -
- - {data.length > 0 ? ( -
- - isOnlyStderr && row.original?.stream === 'stderr' ? 'bg-red-50 hover:bg-red-50' : '' - } - /> -
- ) : ( -
-
- -
-
{t('no_data_available')}
-
- )} -
- ); -}; diff --git a/frontend/providers/applaunchpad/src/components/apps/appList.tsx b/frontend/providers/applaunchpad/src/components/apps/appList.tsx deleted file mode 100644 index 3d493c1bf..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/appList.tsx +++ /dev/null @@ -1,609 +0,0 @@ -import { pauseAppByName, restartAppByName, startAppByName, setAppRemark } from '@/api/app'; -import { useAppOperation } from '@/hooks/useAppOperation'; -import { useGlobalStore } from '@/store/global'; -import { useAppStore } from '@/store/app'; -import { useUserStore } from '@/store/user'; -import { AppListItemType } from '@/types/app'; -import { getErrText } from '@/utils/tools'; -import { toast } from 'sonner'; -import { Button } from '@sealos/shadcn-ui/button'; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogFooter -} from '@sealos/shadcn-ui/dialog'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Label } from '@sealos/shadcn-ui/label'; -import { Pagination } from '@sealos/shadcn-ui/pagination'; -import { useTranslation } from 'next-i18next'; -import dynamic from 'next/dynamic'; -import { useRouter } from 'next/router'; -import React, { useCallback, useEffect, useState, useMemo, memo } from 'react'; -import UpdateModal from '@/components/app/detail/index/UpdateModal'; -import { useGuideStore } from '@/store/guide'; -import { applistDriverObj, startDriver } from '@/hooks/driver'; -import { useClientSideValue } from '@/hooks/useClientSideValue'; -import { BookOpen, Plus, TriangleAlert } from 'lucide-react'; -import { track } from '@sealos/gtm'; -import { useQuotaGuarded } from '@sealos/shared'; -import Empty from './empty'; - -import { - getCoreRowModel, - getPaginationRowModel, - useReactTable, - flexRender, - type ColumnDef -} from '@tanstack/react-table'; - -import { Name as NameColumn } from './list/columns/Name'; -import { Status as StatusColumn } from './list/columns/Status'; -import { CreateTime as CreateTimeColumn } from './list/columns/CreateTime'; -import { CPU as CPUColumn } from './list/columns/CPU'; -import { Memory as MemoryColumn } from './list/columns/Memory'; -import { GPU as GPUColumn } from './list/columns/GPU'; -import { Replicas as ReplicasColumn } from './list/columns/Replicas'; -import { Storage as StorageColumn } from './list/columns/Storage'; -import { Actions as ActionsColumn } from './list/columns/Actions'; - -// Define table meta type for callbacks -export interface AppTableMeta { - onEditRemark: (appName: string) => void; - onPauseApp: (appName: string) => void; - onStartApp: (appName: string) => void; - onRestartApp: (appName: string) => void; - onDeleteApp: (appName: string) => void; - onUpdateApp: (item: AppListItemType) => void; -} - -const DelModal = dynamic(() => import('@/components/app/detail/index/DelModal')); -const ErrorModal = dynamic(() => import('@/components/ErrorModal')); - -const PAGE_SIZE = 10; - -const AppList = ({ - apps = [], - refetchApps -}: { - apps: AppListItemType[]; - refetchApps: () => void; -}) => { - const { t } = useTranslation(); - const { setLoading } = useGlobalStore(); - const { appListPagination, setAppListPagination } = useAppStore(); - const { userSourcePrice } = useUserStore(); - const { executeOperation, errorModalState, closeErrorModal } = useAppOperation(); - const router = useRouter(); - const [delAppName, setDelAppName] = useState(''); - const [updateAppName, setUpdateAppName] = useState(''); - const [remarkAppName, setRemarkAppName] = useState(''); - const [remarkValue, setRemarkValue] = useState(''); - - // Pause confirm dialog state - const [pauseDialogOpen, setPauseDialogOpen] = useState(false); - const [pendingPauseAppName, setPendingPauseAppName] = useState(''); - const [restartDialogOpen, setRestartDialogOpen] = useState(false); - const [pendingRestartAppName, setPendingRestartAppName] = useState(''); - - // Page size edit state - const [isEditingPageSize, setIsEditingPageSize] = useState(false); - const [editingPageSizeValue, setEditingPageSizeValue] = useState(PAGE_SIZE.toString()); - - // Update modal state (replaces useDisclosure) - const [isOpenUpdateModal, setIsOpenUpdateModal] = useState(false); - const onOpenUpdateModal = useCallback(() => setIsOpenUpdateModal(true), []); - const onCloseUpdateModal = useCallback(() => setIsOpenUpdateModal(false), []); - - const [isOpenRemarkModal, setIsOpenRemarkModal] = useState(false); - - const handleOpenRemarkModal = useCallback( - (appName: string) => { - const app = apps.find((app) => app.name === appName); - setRemarkAppName(appName); - setRemarkValue(app?.remark || ''); - setIsOpenRemarkModal(true); - }, - [apps] - ); - - const handleSaveRemark = useCallback(async () => { - try { - setLoading(true); - const app = apps.find((app) => app.name === remarkAppName); - const kind = app?.kind || 'deployment'; - - await setAppRemark({ - appName: remarkAppName, - remark: remarkValue, - kind - }); - - toast.success(t('remark_updated_successfully')); - - refetchApps(); - } catch (error: any) { - toast.error(t(getErrText(error), 'update_remark_failed')); - console.error(error); - } finally { - setLoading(false); - setIsOpenRemarkModal(false); - setRemarkAppName(''); - setRemarkValue(''); - } - }, [apps, remarkAppName, remarkValue, setLoading, t, refetchApps]); - - const handleGotoDocs = useCallback(() => { - // TODO: update localized docs url? - const docsUrl = - router.locale === 'zh' - ? 'https://sealos.run/docs/guides/app-launchpad' - : 'https://sealos.run/docs/guides/app-launchpad'; - window.open(docsUrl, '_blank'); - }, [router.locale]); - - const handleCreateApp = useQuotaGuarded( - { - requirements: { - cpu: 1, - memory: 1, - nodeport: 1, - storage: 1, - traffic: true - }, - immediate: false, - allowContinue: true - }, - () => { - track('deployment_start', { - module: 'applaunchpad' - }); - router.push('/app/edit'); - } - ); - - const handleRestartApp = useCallback( - async (appName: string) => { - await executeOperation(() => restartAppByName(appName), { - successMessage: t('Restart Success'), - errorMessage: t('Restart Failed'), - onSuccess: () => refetchApps() - }); - }, - [executeOperation, refetchApps, t] - ); - - const handlePauseApp = useCallback( - async (appName: string) => { - await executeOperation(() => pauseAppByName(appName), { - successMessage: t('Application paused'), - errorMessage: t('Application failed'), - onSuccess: () => refetchApps() - }); - }, - [executeOperation, refetchApps, t] - ); - - const handleStartApp = useCallback( - async (appName: string) => { - await executeOperation(() => startAppByName(appName), { - successMessage: t('Start Successful'), - errorMessage: t('Start Failed'), - onSuccess: () => refetchApps() - }); - }, - [executeOperation, refetchApps, t] - ); - - const handleUpdateApp = useCallback( - (item: AppListItemType) => { - if (item.source.hasSource && item.source.sourceType === 'sealaf') { - setUpdateAppName(item.name); - onOpenUpdateModal(); - } else { - router.push(`/app/edit?name=${item.name}`); - } - }, - [onOpenUpdateModal, router] - ); - - const handleDeleteApp = useCallback((appName: string) => { - setDelAppName(appName); - }, []); - - const showGpu = !!userSourcePrice?.gpu; - - const handlePauseAppWithDialog = useCallback((appName: string) => { - setPendingPauseAppName(appName); - setPauseDialogOpen(true); - }, []); - - const handleRestartAppWithDialog = useCallback((appName: string) => { - setPendingRestartAppName(appName); - setRestartDialogOpen(true); - }, []); - - // Stable columns definition - no inline functions for cell renderers - const columns = useMemo[]>( - () => - [ - { - accessorKey: 'name', - header: () => {t('Name')}, - cell: NameColumn - }, - { - accessorKey: 'status', - header: () => {t('Status')}, - size: 140, - cell: StatusColumn - }, - { - accessorKey: 'cpu', - header: () => {t('CPU')}, - cell: CPUColumn - }, - { - accessorKey: 'memory', - header: () => {t('Memory')}, - cell: MemoryColumn - }, - { - accessorKey: 'gpu', - header: () => {t('GPU')}, - size: 100, - cell: GPUColumn - }, - { - accessorKey: 'replicas', - header: () => {t('Replicas')}, - size: 120, - cell: ReplicasColumn - }, - { - accessorKey: 'storage', - header: () => {t('Storage')}, - size: 100, - cell: StorageColumn - }, - { - accessorKey: 'createTime', - header: () => {t('Creation Time')}, - size: 160, - cell: CreateTimeColumn - }, - { - id: 'actions', - header: () => {t('Operation')}, - size: 140, - cell: ActionsColumn - } - ].filter((column) => { - if (column.accessorKey === 'gpu' && !showGpu) { - return false; - } - return true; - }), - [t, showGpu] - ); - - // Table meta with callbacks - passed to cells via table.options.meta - const tableMeta = useMemo( - () => ({ - onEditRemark: handleOpenRemarkModal, - onPauseApp: handlePauseAppWithDialog, - onStartApp: handleStartApp, - onRestartApp: handleRestartAppWithDialog, - onDeleteApp: handleDeleteApp, - onUpdateApp: handleUpdateApp - }), - [ - handleOpenRemarkModal, - handlePauseAppWithDialog, - handleStartApp, - handleRestartAppWithDialog, - handleDeleteApp, - handleUpdateApp - ] - ); - - const table = useReactTable({ - data: apps, - columns, - state: { - pagination: appListPagination - }, - onPaginationChange: (updater) => { - const nextPagination = typeof updater === 'function' ? updater(appListPagination) : updater; - setAppListPagination(nextPagination); - }, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - autoResetPageIndex: false, - meta: tableMeta - }); - - useEffect(() => { - const pageCount = table.getPageCount(); - if (pageCount > 0 && appListPagination.pageIndex >= pageCount) { - setAppListPagination({ pageIndex: pageCount - 1 }); - } - }, [appListPagination.pageIndex, setAppListPagination, table]); - - const handlePageSizeStartEdit = () => { - setIsEditingPageSize(true); - setEditingPageSizeValue(table.getState().pagination.pageSize.toString()); - }; - - const handlePageSizeSave = () => { - const newPageSize = parseInt(editingPageSizeValue, 10); - if (Number.isFinite(newPageSize) && newPageSize > 0 && newPageSize <= 100) { - setAppListPagination({ pageIndex: 0, pageSize: newPageSize }); - } - setIsEditingPageSize(false); - }; - - const handlePageSizeCancel = () => { - setIsEditingPageSize(false); - setEditingPageSizeValue(table.getState().pagination.pageSize.toString()); - }; - - const { listCompleted } = useGuideStore(); - const isClientSide = useClientSideValue(true); - - useEffect(() => { - if (!listCompleted && isClientSide) { - startDriver( - applistDriverObj(t, () => { - router.push('/app/edit'); - }) - ); - } - }, [listCompleted, router, t, isClientSide]); - - return ( -
- {/* Header */} -
-
{t('Applications')}
-
- {apps.length} -
-
- - {t('docs')} -
-
- -
- - {/* Table */} -
- {apps.length === 0 ? ( - - ) : ( - <> -
- {/* Table Header */} -
- {table.getFlatHeaders().map((header) => { - const isGrowColumn = ['name', 'cpu', 'memory'].includes(header.id); - const columnSize = header.column.columnDef.size; - return ( -
- {flexRender(header.column.columnDef.header, header.getContext())} -
- ); - })} -
- - {/* Table Body */} - {table.getRowModel().rows.map((row) => ( -
- {row.getVisibleCells().map((cell) => { - const isGrowColumn = ['name', 'cpu', 'memory'].includes(cell.column.id); - const columnSize = cell.column.columnDef.size; - return ( -
- {flexRender(cell.column.columnDef.cell, cell.getContext())} -
- ); - })} -
- ))} -
- - {/* Pagination */} -
- {t('Total') + ': ' + table.getFilteredRowModel().rows.length} -
- table.setPageIndex(page - 1)} - /> -
- {isEditingPageSize ? ( - setEditingPageSizeValue(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - e.preventDefault(); - handlePageSizeSave(); - } else if (e.key === 'Escape') { - e.preventDefault(); - handlePageSizeCancel(); - } - }} - onBlur={handlePageSizeSave} - autoFocus - className="h-7 w-12 text-center text-sm p-0" - type="number" - min="1" - max="100" - /> - ) : ( - - {table.getState().pagination.pageSize} - - )} - / - {t('Page')} -
-
-
- - )} -
- - {/* Modals */} - {/* Pause Confirm Dialog */} - - - - - - {t('Warning')} - - -
{t('pause_message')}
- - - - -
-
- - - - - - {t('Warning')} - - -
{t('Confirm to restart this application?')}
- - - - -
-
- {!!delAppName && ( - item.name === delAppName)?.source} - onClose={() => setDelAppName('')} - onSuccess={refetchApps} - /> - )} - i.name === updateAppName)?.source} - isOpen={isOpenUpdateModal} - onClose={() => { - setUpdateAppName(''); - onCloseUpdateModal(); - }} - /> - - - - {t('set_remarks_title')} - -
- - setRemarkValue(e.target.value)} - maxLength={60} - /> -
- - - - -
-
- {errorModalState.visible && ( - - )} -
- ); -}; - -export default React.memo(AppList); diff --git a/frontend/providers/applaunchpad/src/components/apps/empty.tsx b/frontend/providers/applaunchpad/src/components/apps/empty.tsx deleted file mode 100644 index fccb806ae..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/empty.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import Image from 'next/image'; -import { useTranslation } from 'next-i18next'; - -interface EmptyProps { - onCreateApp: () => void; -} - -const Empty = ({ onCreateApp }: EmptyProps) => { - const { t } = useTranslation(); - - return ( -
- {'list-empty'} -
-
{t('create_your_first_application')}
-
- {t('click_here_to_create_application')} -
-
-
- ); -}; - -export default Empty; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Actions.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Actions.tsx deleted file mode 100644 index e66d80f40..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Actions.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { memo } from 'react'; -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { type CellContext } from '@tanstack/react-table'; -import { - MoreHorizontal, - Play, - Pause, - PencilLine, - Trash2, - AlignLeft, - IterationCw -} from 'lucide-react'; - -import { AppListItemType } from '@/types/app'; -import { Button } from '@sealos/shadcn-ui/button'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - DropdownMenuSeparator -} from '@sealos/shadcn-ui/dropdown-menu'; -import type { AppTableMeta } from '@/components/apps/appList'; - -export const Actions = memo>( - ({ row, table }) => { - const { t } = useTranslation(); - const router = useRouter(); - const item = row.original; - const { onPauseApp, onStartApp, onRestartApp, onDeleteApp, onUpdateApp } = table.options - .meta as AppTableMeta; - - return ( -
- - - - - - - {item.isPause ? ( - onStartApp(item.name)}> - - {t('Start Up')} - - ) : ( - <> - onPauseApp(item.name)}> - - {t('Pause')} - - onUpdateApp(item)}> - - {t('Update')} - - onRestartApp(item.name)}> - - {t('Restart')} - - - )} - - onDeleteApp(item.name)}> - - {t('Delete')} - - - -
- ); - }, - (prev, next) => - prev.row.original.name === next.row.original.name && - prev.row.original.isPause === next.row.original.isPause -); - -Actions.displayName = 'Actions'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/CPU.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/CPU.tsx deleted file mode 100644 index 9994dc8bc..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/CPU.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import PodLineChart from '@/components/PodLineChart'; -import { EMPTY_MONITOR_DATA } from '@/constants/monitor'; - -export const CPU = memo>( - ({ row }) => { - const item = row.original; - return ( -
- -
- ); - }, - (prev, next) => { - const prevData = prev.row.original.usedCpu; - const nextData = next.row.original.usedCpu; - return ( - prev.row.original.id === next.row.original.id && - JSON.stringify(prevData) === JSON.stringify(nextData) - ); - } -); - -CPU.displayName = 'CPU'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/CreateTime.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/CreateTime.tsx deleted file mode 100644 index 5f41071d3..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/CreateTime.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; - -export const CreateTime = memo>( - ({ row }) => { - return {row.original.createTime}; - }, - (prev, next) => prev.row.original.createTime === next.row.original.createTime -); - -CreateTime.displayName = 'CreateTime'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/GPU.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/GPU.tsx deleted file mode 100644 index 31e861f66..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/GPU.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import GPUItem from '@/components/GPUItem'; - -export const GPU = memo>( - ({ row }) => { - return ( -
- -
- ); - }, - (prev, next) => { - const prevGpu = prev.row.original.gpu; - const nextGpu = next.row.original.gpu; - return prevGpu?.type === nextGpu?.type && prevGpu?.amount === nextGpu?.amount; - } -); - -GPU.displayName = 'GPU'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Memory.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Memory.tsx deleted file mode 100644 index 1f82d8a4f..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Memory.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import PodLineChart from '@/components/PodLineChart'; -import { EMPTY_MONITOR_DATA } from '@/constants/monitor'; - -export const Memory = memo>( - ({ row }) => { - const item = row.original; - return ( -
- -
- ); - }, - (prev, next) => { - const prevData = prev.row.original.usedMemory; - const nextData = next.row.original.usedMemory; - return ( - prev.row.original.id === next.row.original.id && - JSON.stringify(prevData) === JSON.stringify(nextData) - ); - } -); - -Memory.displayName = 'Memory'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Name.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Name.tsx deleted file mode 100644 index f9ff07632..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Name.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { memo } from 'react'; -import { useTranslation } from 'next-i18next'; -import { PencilLine } from 'lucide-react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import type { AppTableMeta } from '@/components/apps/appList'; - -export const Name = memo>( - ({ row, table }) => { - const { t } = useTranslation(); - const item = row.original; - const { onEditRemark } = table.options.meta as AppTableMeta; - - return ( -
-
-
- - {item.name} - - {!item.remark && ( -
{ - e.stopPropagation(); - onEditRemark(item.name); - }} - > - - {t('set_remarks')} -
- )} -
- {item.remark && ( -
- {item.remark} - { - e.stopPropagation(); - onEditRemark(item.name); - }} - /> -
- )} -
-
- ); - }, - (prev, next) => - prev.row.original.id === next.row.original.id && - prev.row.original.name === next.row.original.name && - prev.row.original.remark === next.row.original.remark -); - -Name.displayName = 'Name'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Replicas.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Replicas.tsx deleted file mode 100644 index db29695de..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Replicas.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { memo } from 'react'; -import { useTranslation } from 'next-i18next'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; - -export const Replicas = memo>( - ({ row }) => { - const { t } = useTranslation(); - const item = row.original; - - return ( -
- - {t('Active')}: {item.activeReplicas} - - {item.minReplicas !== item.maxReplicas && ( - -  / {t('Total')}: {item.minReplicas}-{item.maxReplicas} - - )} -
- ); - }, - (prev, next) => - prev.row.original.activeReplicas === next.row.original.activeReplicas && - prev.row.original.minReplicas === next.row.original.minReplicas && - prev.row.original.maxReplicas === next.row.original.maxReplicas -); - -Replicas.displayName = 'Replicas'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Status.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Status.tsx deleted file mode 100644 index ad97ee040..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Status.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import AppStatusTag from '@/components/AppStatusTag'; - -export const Status = memo>( - ({ row }) => { - const item = row.original; - return ( - - ); - }, - (prev, next) => - prev.row.original.status.value === next.row.original.status.value && - prev.row.original.isPause === next.row.original.isPause -); - -Status.displayName = 'Status'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/Storage.tsx b/frontend/providers/applaunchpad/src/components/apps/list/columns/Storage.tsx deleted file mode 100644 index 0e8afeb93..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/Storage.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { memo } from 'react'; -import { type CellContext } from '@tanstack/react-table'; - -import { AppListItemType } from '@/types/app'; -import { storageGiToQuantity } from '@/utils/resourceQuantity'; - -export const Storage = memo>( - ({ row }) => { - const item = row.original; - return ( - - {item.storeAmount > 0 - ? storageGiToQuantity(item.storeAmount).formatForDisplay({ - format: 'BinarySI', - scale: 'auto', - digits: 4 - }) - : '-'} - - ); - }, - (prev, next) => prev.row.original.storeAmount === next.row.original.storeAmount -); - -Storage.displayName = 'Storage'; diff --git a/frontend/providers/applaunchpad/src/components/apps/list/columns/index.ts b/frontend/providers/applaunchpad/src/components/apps/list/columns/index.ts deleted file mode 100644 index 9fa2223c7..000000000 --- a/frontend/providers/applaunchpad/src/components/apps/list/columns/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { Name } from './Name'; -export { Status } from './Status'; -export { CreateTime } from './CreateTime'; -export { CPU } from './CPU'; -export { Memory } from './Memory'; -export { GPU } from './GPU'; -export { Replicas } from './Replicas'; -export { Storage } from './Storage'; -export { Actions } from './Actions'; diff --git a/frontend/providers/applaunchpad/src/components/layouts/DetailLayout.tsx b/frontend/providers/applaunchpad/src/components/layouts/DetailLayout.tsx deleted file mode 100644 index 37bc4f0d2..000000000 --- a/frontend/providers/applaunchpad/src/components/layouts/DetailLayout.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import Sidebar, { ROUTES } from '@/components/layouts/Sidebar'; -import { useToast } from '@/hooks/useToast'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import Header from '@/components/app/detail/index/Header'; -import { useAppStore } from '@/store/app'; -import { useQuery } from '@tanstack/react-query'; -import React, { useMemo } from 'react'; -import { useRouter } from 'next/router'; -import { useLoading } from '@/hooks/useLoading'; -import { Skeleton } from '@sealos/shadcn-ui/skeleton'; - -interface DetailLayoutProps { - children: React.ReactNode; - appName: string; -} - -export default function DetailLayout({ children, appName }: DetailLayoutProps) { - const { toast } = useToast(); - const router = useRouter(); - const { - appDetail = MOCK_APP_DETAIL, - appDetailPods, - setAppDetail, - intervalLoadPods - } = useAppStore(); - const { Loading } = useLoading(); - - const { - refetch, - isInitialLoading: appDetailInitialLoading, - isError: appDetailError, - isSuccess: appDetailLoaded - } = useQuery( - ['setAppDetail', appName], - () => setAppDetail(appName, router?.query?.guide === 'true'), - { - retryDelay: 3000, - retry: (count, _err) => { - if (count >= 5) return false; - return true; - }, - onError(err) { - toast({ - title: String(err), - status: 'error' - }); - } - } - ); - const showSkeleton = appDetailInitialLoading && !appDetailError; - - useQuery( - ['app-detail-pod', appName], - () => { - if (appDetail?.isPause) return null; - return intervalLoadPods(appName, true); - }, - { - // Only start polling after setAppDetail has completed - enabled: appDetailLoaded, - refetchOnMount: true, - refetchInterval: router.pathname === ROUTES.OVERVIEW ? 3000 : 5000, - staleTime: router.pathname === ROUTES.OVERVIEW ? 3000 : 5000 - } - ); - - return ( -
-
-
- {showSkeleton ? ( -
-
- - - - - -
-
- - - -
-
- ) : ( - <> - - - - {children} - - )} -
-
- ); -} diff --git a/frontend/providers/applaunchpad/src/components/layouts/Sidebar.tsx b/frontend/providers/applaunchpad/src/components/layouts/Sidebar.tsx deleted file mode 100644 index 822bb6d89..000000000 --- a/frontend/providers/applaunchpad/src/components/layouts/Sidebar.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { useTranslation } from 'next-i18next'; -import { useRouter } from 'next/router'; -import { useClientAppConfig } from '@/hooks/useClientAppConfig'; -import { LayoutDashboard, LineChart, FileClock, Cog } from 'lucide-react'; - -export const ROUTES = { - OVERVIEW: '/app/detail', - MONITOR: '/app/detail/monitor', - ADVANCED: '/app/detail/advanced', - LOGS: '/app/detail/logs' -} as const; - -export default function Sidebar() { - const { t } = useTranslation(); - const router = useRouter(); - const config = useClientAppConfig(); - const logEnabled = config.components.logging.enabled; - - const siderbarMap = [ - { - label: t('overview'), - icon: ( - - ), - path: ROUTES.OVERVIEW - }, - { - label: t('monitor'), - icon: ( - - ), - path: ROUTES.MONITOR - }, - ...(logEnabled - ? [ - { - label: t('Log'), - icon: ( - - ), - path: ROUTES.LOGS - } - ] - : []), - { - label: t('Advanced Configuration'), - icon: ( - - ), - path: ROUTES.ADVANCED - } - ]; - - return ( -
- {siderbarMap.map((item) => ( -
{ - console.log(router.query); - router.push({ - pathname: item.path, - query: { ...router.query } - }); - }} - > - {item.icon} - - {item.label} - -
- ))} -
- ); -} diff --git a/frontend/providers/applaunchpad/src/config.ts b/frontend/providers/applaunchpad/src/config.ts deleted file mode 100644 index 4a3bbdc50..000000000 --- a/frontend/providers/applaunchpad/src/config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AppConfig } from './types/config'; - -/** - * Get the global application configuration. - * Must only be called on the server side. - */ -export function Config(): Readonly { - if (typeof window !== 'undefined') { - throw new Error('[App Config] App config should only exist on the server side.'); - } - - const cfg = globalThis.__APP_CONFIG__; - if (!cfg) { - console.error('[App Config] config not initialized, this should not happen in normal flow.'); - process.exit(1); - } - - return cfg; -} diff --git a/frontend/providers/applaunchpad/src/constants/account.ts b/frontend/providers/applaunchpad/src/constants/account.ts deleted file mode 100644 index 22daaaf60..000000000 --- a/frontend/providers/applaunchpad/src/constants/account.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const GUIDE_LAUNCHPAD_CREATE_KEY = 'frontend.guide.launchpad.create'; -export const GUIDE_LAUNCHPAD_GIFT_KEY = 'activity.beginner-guide.launchpad.giveAmount'; - -export const GUIDE_LAUNCHPAD_DETAIL_KEY = 'frontend.guide.launchpad.detail'; - -export const templateDeployKey = 'cloud.sealos.io/deploy-on-sealos'; - -export const lauchpadRemarkKey = 'cloud.sealos.io/remark'; diff --git a/frontend/providers/applaunchpad/src/constants/app.ts b/frontend/providers/applaunchpad/src/constants/app.ts deleted file mode 100644 index 8a7fdf6db..000000000 --- a/frontend/providers/applaunchpad/src/constants/app.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { ApplicationProtocolType, TAppSourceType, TransportProtocolType } from '@/types/app'; - -export enum AppStatusEnum { - running = 'running', - creating = 'creating', - waiting = 'waiting', - error = 'error', - pause = 'pause' -} -export const appStatusMap = { - [AppStatusEnum.running]: { - label: 'Running', - value: AppStatusEnum.running, - color: '#16a34a', - backgroundColor: '#f0fdf4', - dotColor: '#16a34a' - }, - [AppStatusEnum.creating]: { - label: 'Creating', - value: AppStatusEnum.creating, - color: '#71717a', - backgroundColor: '#f4f4f5', - dotColor: '#71717a' - }, - [AppStatusEnum.error]: { - label: 'Abnormality Detected', - value: AppStatusEnum.error, - color: '#f04438', - backgroundColor: '#fef3f2', - dotColor: '#f04438' - }, - [AppStatusEnum.pause]: { - label: 'Paused', - value: AppStatusEnum.pause, - color: '#6f5dd7', - backgroundColor: '#f0eeff', - dotColor: '#6f5dd7' - }, - [AppStatusEnum.waiting]: { - label: 'Waiting', - value: AppStatusEnum.waiting, - color: '#71717a', - backgroundColor: 'rgba(17, 24, 36, 0.05)', - dotColor: '#71717a' - } -}; - -export enum PodStatusEnum { - waiting = 'waiting', - running = 'running', - terminated = 'terminated' -} -export const podStatusMap = { - [PodStatusEnum.running]: { - label: 'running', - value: PodStatusEnum.running, - color: '#16a34a' - }, - [PodStatusEnum.waiting]: { - label: 'waiting', - value: PodStatusEnum.waiting, - color: '#71717a', - reason: '', - message: '' - }, - [PodStatusEnum.terminated]: { - label: 'terminated', - value: PodStatusEnum.terminated, - color: '#6f5dd7', - reason: '', - message: '' - } -}; - -export const ProtocolList = [ - { value: 'HTTP', label: 'https://', inline: 'http://' }, - { value: 'GRPC', label: 'grpcs://', inline: 'grpc://' }, - // nosemgrep: javascript.lang.security.detect-insecure-websocket.detect-insecure-websocket - { value: 'WS', label: 'wss://', inline: 'ws://' }, - { value: 'TCP', label: 'tcp://', inline: 'tcp://' }, - { value: 'UDP', label: 'udp://', inline: 'udp://' } -]; - -export const APPLICATION_PROTOCOLS: ApplicationProtocolType[] = ['HTTP', 'GRPC', 'WS']; - -export const TRANSPORT_PROTOCOLS: TransportProtocolType[] = ['TCP', 'UDP', 'SCTP']; - -export const defaultSliderKey = 'default'; -export const defaultGpuSliderKey = 'default-gpu'; -export const pauseKey = 'deploy.cloud.sealos.io/pause'; -export const maxReplicasKey = 'deploy.cloud.sealos.io/maxReplicas'; -export const minReplicasKey = 'deploy.cloud.sealos.io/minReplicas'; -export const deployPVCResizeKey = 'deploy.cloud.sealos.io/resize'; -export const appDeployKey = 'cloud.sealos.io/app-deploy-manager'; -export const publicDomainKey = `cloud.sealos.io/app-deploy-manager-domain`; -export const gpuNodeSelectorKey = 'nvidia.com/gpu.product'; -export const gpuResourceKey = 'nvidia.com/gpu'; -export const templateDeployKey = 'cloud.sealos.io/deploy-on-sealos'; -export const sealafDeployKey = 'sealaf-app'; - -export enum Coin { - cny = 'cny', - shellCoin = 'shellCoin', - usd = 'usd' -} - -export const AppSourceConfigs: Array<{ - key: string; - type: TAppSourceType; -}> = [ - { key: templateDeployKey, type: 'app_store' }, - { key: sealafDeployKey, type: 'sealaf' } -]; diff --git a/frontend/providers/applaunchpad/src/constants/editApp.ts b/frontend/providers/applaunchpad/src/constants/editApp.ts deleted file mode 100644 index 6fb5a1596..000000000 --- a/frontend/providers/applaunchpad/src/constants/editApp.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { AppEditType } from '@/types/app'; -import { cpuMillicoresToQuantity, memoryMiToQuantity } from '@/utils/resourceQuantity'; -import { customAlphabet } from 'nanoid'; -const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz', 12); - -export const editModeMap = (isEdit: boolean) => { - if (isEdit) { - return { - title: 'Update Application', - applyBtnText: 'Update', - applyConfirmTitle: 'Confirm Update', - applyMessage: 'Are you sure you want to update the application?', - applySuccess: 'Update Successful', - applyError: 'Update Failed' - }; - } - - return { - title: 'Application Deployment', - applyBtnText: 'Deploy Application', - applyConfirmTitle: 'Confirm Deployment', - applyMessage: 'Are you sure you want to deploy the application?', - applySuccess: 'Deployment Successful', - applyError: 'Deployment Failed' - }; -}; - -export const defaultEditVal: AppEditType = { - kind: 'deployment', - appName: 'hello-world', - imageName: 'nginx', - runCMD: '', - cmdParam: '', - replicas: 1, - cpu: cpuMillicoresToQuantity(200), - memory: memoryMiToQuantity(256), - networks: [ - { - // note: this should not have serviceName - networkName: '', - portName: nanoid(), - port: 80, - protocol: 'TCP', - appProtocol: 'HTTP', - openPublicDomain: false, - openNodePort: false, - publicDomain: '', - customDomain: '', - domain: '' - } - ], - envs: [], - hpa: { - use: false, - target: 'cpu', - value: 50, - minReplicas: 1, - maxReplicas: 5 - }, - configMapList: [], - secret: { - use: false, - username: '', - password: '', - serverAddress: 'docker.io' - }, - storeList: [], - volumes: [], - volumeMounts: [], - gpu: { - manufacturers: 'nvidia', - type: '', - amount: 1 - }, - labels: {} -}; - -export const GpuAmountMarkList = [ - { label: '1', value: 1 }, - { label: '2', value: 2 }, - { label: '3', value: 3 }, - { label: '4', value: 4 }, - { label: '5', value: 5 }, - { label: '6', value: 6 }, - { label: '7', value: 7 }, - { label: '8', value: 8 } -]; diff --git a/frontend/providers/applaunchpad/src/constants/monitor.ts b/frontend/providers/applaunchpad/src/constants/monitor.ts deleted file mode 100644 index 2cb0c0492..000000000 --- a/frontend/providers/applaunchpad/src/constants/monitor.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { MonitorDataResult } from '@/types/monitor'; - -export const LineStyleMap = [ - { - backgroundColor: 'rgba(73, 174, 255, 0.3)', - lineColor: '#49AEFF' - }, - { - backgroundColor: 'rgba(0, 209, 181, 0.3)', - lineColor: '#00D1B5' - }, - { - backgroundColor: 'rgba(139, 139, 255, 0.3)', - lineColor: '#8B8BFF' - }, - { - backgroundColor: 'rgba(81, 125, 255, 0.3)', - lineColor: '#517DFF' - }, - { - backgroundColor: 'rgba(189, 139, 255, 0.3)', - lineColor: '#BD8BFF' - }, - { - backgroundColor: 'rgba(228, 139, 255, 0.3)', - lineColor: '#E48BFF' - }, - { - backgroundColor: 'rgba(26, 200, 244, 0.3)', - lineColor: '#1AC8F4' - }, - { - backgroundColor: 'rgba(255, 139, 226, 0.3)', - lineColor: '#FF8BE2' - }, - { - backgroundColor: 'rgba(147, 221, 0, 0.3)', - lineColor: '#93DD00' - }, - { - backgroundColor: 'rgba(255, 139, 141, 0.3)', - lineColor: '#FF8B8D' - }, - { - backgroundColor: 'rgba(255, 176, 139, 0.3)', - lineColor: '#FFB08B' - }, - { - backgroundColor: 'rgba(239, 211, 0, 0.3)', - lineColor: '#EFD300' - } -]; - -export const NetworkLineStyleMap: Record = { - '2xx': { - backgroundColor: 'rgba(0, 209, 181, 0.3)', - lineColor: '#00D1B5' - }, - '3xx': { - backgroundColor: 'rgba(73, 174, 255, 0.3)', - lineColor: '#49AEFF' - }, - '4xx': { - backgroundColor: 'rgba(250, 204, 21, 0.3)', - lineColor: '#FACC15' - }, - '5xx': { - backgroundColor: 'rgba(248, 113, 113, 0.3)', - lineColor: '#F87171' - } -}; - -export const EMPTY_MONITOR_DATA: MonitorDataResult = { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') -}; - -export const REFRESH_INTERVAL_OPTIONS = [ - { value: 1000, label: '1s' }, - { value: 2000, label: '2s' }, - { value: 5000, label: '5s' }, - { value: 10000, label: '10s' }, - { value: 0, label: 'close' } -]; diff --git a/frontend/providers/applaunchpad/src/constants/theme.ts b/frontend/providers/applaunchpad/src/constants/theme.ts deleted file mode 100644 index 183c66f7d..000000000 --- a/frontend/providers/applaunchpad/src/constants/theme.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { extendTheme } from '@chakra-ui/react'; -import { theme as sealosTheme } from '@sealos/ui'; - -import { switchAnatomy } from '@chakra-ui/anatomy'; -import { createMultiStyleConfigHelpers } from '@chakra-ui/react'; - -const { definePartsStyle, defineMultiStyleConfig } = createMultiStyleConfigHelpers( - switchAnatomy.keys -); - -const baseStyle = definePartsStyle({ - container: {}, - track: { - bg: 'gray.200' - } -}); - -export const Switch = defineMultiStyleConfig({ baseStyle }); - -export const theme = extendTheme(sealosTheme, { - components: { - Switch: Switch - } -}); diff --git a/frontend/providers/applaunchpad/src/hooks/driver.tsx b/frontend/providers/applaunchpad/src/hooks/driver.tsx deleted file mode 100644 index f7aec519c..000000000 --- a/frontend/providers/applaunchpad/src/hooks/driver.tsx +++ /dev/null @@ -1,324 +0,0 @@ -import { useGuideStore } from '@/store/guide'; -import { driver } from '@sealos/driver'; -import { Config } from '@sealos/driver/src/config'; -import { track } from '@sealos/gtm'; -import { CircleCheckBig, X } from 'lucide-react'; -import { TFunction } from 'next-i18next'; -import { sealosApp } from 'sealos-desktop-sdk/app'; -import Image from 'next/image'; - -let currentDriver: any = null; - -export function startDriver(config: Config) { - if (currentDriver) { - currentDriver.destroy(); - currentDriver = null; - } - - if (!useGuideStore.getState().startTimeMs) { - useGuideStore.setState({ - startTimeMs: Date.now() - }); - } - - const driverObj = driver(config); - currentDriver = driverObj; - driverObj.drive(); - - return driverObj; -} - -export const applistDriverObj = (t: TFunction, nextStep: () => void): Config => ({ - onPopoverRender() { - useGuideStore.setState({ - startTimeMs: Date.now() - }); - }, - - showProgress: true, - allowClose: false, - allowClickMaskNextStep: false, - isShowButtons: false, - allowKeyboardControl: false, - disableActiveInteraction: false, - overlayColor: 'transparent', - - steps: [ - { - element: '.create-app-btn', - popover: { - side: 'left', - align: 'start', - borderRadius: '12px 12px 12px 12px', - - PopoverBody: ( -
-
-
{t('driver.create_launchpad')}
-
{ - track('guide_exit', { - module: 'guide', - guide_name: 'applaunchpad', - duration_seconds: - (Date.now() - (useGuideStore.getState().startTimeMs ?? Date.now())) / 1000, - progress_step: 2 - }); - - startDriver(quitGuideDriverObj(t)); - }} - > - -
-
-
- {t('driver.define_settings')} -
-
-
2/4
-
{ - currentDriver.destroy(); - currentDriver = null; - nextStep(); - }} - > - {t('driver.next')} -
-
-
- ) - } - } - ], - onHighlightStarted: (element) => { - const el = element as any; - if (el) { - el._originalBorderRadius = el.style.borderRadius; - el._originalBorder = el.style.border; - el._originalOutline = el.style.outline; - - el.style.borderRadius = '8px'; - el.style.outline = '2px solid #1C4EF5'; - el.style.outlineOffset = '2px'; - - el.addEventListener( - 'click', - () => { - if (currentDriver) { - currentDriver.destroy(); - currentDriver = null; - } - }, - { once: true } - ); - } - }, - onDeselected: (element?: Element) => { - if (element) { - const el = element as any; - el.style.borderRadius = el._originalBorderRadius || ''; - el.style.border = el._originalBorder || ''; - el.style.outline = ''; - el.style.outlineOffset = ''; - } - }, - onHighlighted: (element?: Element) => { - const event = new Event('resize'); - window.dispatchEvent(event); - }, - onDestroyed: () => { - useGuideStore.getState().setListCompleted(true); - } -}); - -export const detailDriverObj = (t: TFunction): Config => ({ - showProgress: true, - allowClose: false, - allowClickMaskNextStep: true, - isShowButtons: false, - allowKeyboardControl: false, - disableActiveInteraction: false, - overlayColor: 'transparent', - - steps: [ - { - element: '#driver-detail-network', - popover: { - side: 'top', - align: 'center', - borderRadius: '12px 12px 12px 12px', - PopoverBody: ( -
-
-
- {t('driver.access_application')} -
-
{ - track('guide_exit', { - module: 'guide', - guide_name: 'applaunchpad', - duration_seconds: - (Date.now() - (useGuideStore.getState().startTimeMs ?? Date.now())) / 1000, - progress_step: 4 - }); - startDriver(quitGuideDriverObj(t)); - }} - > - -
-
-
{t('driver.copy_address')}
-
{t('driver.click_anywhere')}
-
-
4/4
-
{ - track('guide_complete', { - module: 'guide', - guide_name: 'applaunchpad', - duration_seconds: - (Date.now() - (useGuideStore.getState().startTimeMs ?? Date.now())) / 1000 - }); - - startDriver(quitGuideDriverObj(t)); - }} - > - {t('driver.next')} -
-
-
- ) - } - } - ], - onHighlightStarted: (element) => { - const el = element as any; - if (el) { - el.style.borderRadius = '8px'; - el.style.border = '1.5px solid #1C4EF5'; - - el.addEventListener( - 'click', - (e: any) => { - if (currentDriver) { - currentDriver.destroy(); - currentDriver = null; - } - }, - { once: true } - ); - } - }, - onHighlighted: (element?: Element) => { - const event = new Event('resize'); - window.dispatchEvent(event); - }, - onDeselected: (element?: Element) => { - if (element) { - const el = element as any; - el.style.borderRadius = ''; - el.style.border = ''; - } - }, - onDestroyed: (element?: Element) => { - useGuideStore.getState().setDetailCompleted(true); - startDriver(quitGuideDriverObj(t)); - } -}); - -export const quitGuideDriverObj = (t: TFunction, nextStep?: () => void): Config => ({ - showProgress: false, - allowClose: false, - allowClickMaskNextStep: false, - isShowButtons: false, - allowKeyboardControl: false, - disableActiveInteraction: true, - overlayColor: 'transparent', - - steps: [ - { - popover: { - side: 'bottom', - align: 'end', - PopoverBody: ( -
-
-
-
- -
-
- {t('driver.still_here')} -
-
- {t('driver.find_guide_tip')} -
- guide -
-
{ - if (currentDriver) { - currentDriver.destroy(); - currentDriver = null; - } - window.location.href = '/'; - }} - > - {t('driver.create_launchpad')} -
-
{ - if (currentDriver) { - currentDriver.destroy(); - currentDriver = null; - } - sealosApp.runEvents('quitGuide', { - appKey: 'system-applaunchpad', - pathname: '/', - messageData: { type: 'InternalAppCall', action: 'quitGuide' } - }); - }} - > - {t('driver.quit_guide')} -
-
-
- ) - } - } - ], - onHighlightStarted: (element) => { - const el = element as any; - if (el) { - el._originalBorderRadius = el.style.borderRadius; - el._originalBorder = el.style.border; - el.style.borderRadius = '8px'; - el.style.border = '1.5px solid #1C4EF5'; - } - }, - onDeselected: (element?: Element) => { - if (element) { - const el = element as any; - el.style.borderRadius = el._originalBorderRadius || ''; - el.style.border = el._originalBorder || ''; - } - }, - onDestroyed: () => { - useGuideStore.getState().resetGuideState(true); - nextStep && nextStep(); - } -}); diff --git a/frontend/providers/applaunchpad/src/hooks/useAppOperation.ts b/frontend/providers/applaunchpad/src/hooks/useAppOperation.ts deleted file mode 100644 index a76d335f7..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useAppOperation.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { useState, useCallback } from 'react'; -import { useToast } from '@/hooks/useToast'; -import { ResponseCode } from '@/types/response'; -import { useTranslation } from 'next-i18next'; -import { track } from '@sealos/gtm'; - -export interface AppOperationOptions { - successMessage?: string; - errorMessage?: string; - showErrorModal?: boolean; - onSuccess?: () => void; - onError?: (error: any) => void; -} - -export interface ErrorModalState { - visible: boolean; - title: string; - content: string; - errorCode?: ResponseCode; -} - -/** - * Unified error handling Hook for application operations - * - * Features: - * - Automatically manages loading state - * - Displays Toast or ErrorModal based on error code - * - Integrates GTM event tracking - * - Supports success/failure callbacks - * - * @example - * const { executeOperation, loading, errorModalState, closeErrorModal } = useAppOperation(); - * - * const handlePause = async () => { - * await executeOperation( - * () => pauseAppByName(appName), - * { - * successMessage: t('App Paused'), - * onSuccess: () => refetch() - * } - * ); - * }; - */ -export const useAppOperation = () => { - const { t } = useTranslation(); - const { toast } = useToast(); - const [loading, setLoading] = useState(false); - const [errorModalState, setErrorModalState] = useState({ - visible: false, - title: '', - content: '' - }); - - /** - * Wrapper function for executing application operations - * @param operation Async operation function - * @param options Configuration options - * @returns Operation result or null (on error) - */ - const executeOperation = useCallback( - async ( - operation: () => Promise, - options: AppOperationOptions = {} - ): Promise => { - const { - successMessage = t('success'), - errorMessage = t('Submit Error'), - showErrorModal = true, - onSuccess, - onError - } = options; - - try { - setLoading(true); - const result = await operation(); - - // Success notification - toast({ - title: successMessage, - status: 'success' - }); - - onSuccess?.(); - return result; - } catch (error: any) { - console.error('App operation error:', error); - - const errorCode = error?.code as ResponseCode; - let errorMsg: string; - - // Handle specific error codes with localized messages - if (errorCode === ResponseCode.BALANCE_NOT_ENOUGH) { - errorMsg = t('user_balance_not_enough'); - track('paywall_triggered', { - module: 'applaunchpad', - type: 'insufficient_balance' - }); - } else if (errorCode === ResponseCode.FORBIDDEN_CREATE_APP) { - errorMsg = t('forbidden_create_app'); - track('error_occurred', { - module: 'applaunchpad', - error_code: 'FORBIDDEN_CREATE_APP' - }); - } else if (errorCode === ResponseCode.APP_ALREADY_EXISTS) { - errorMsg = t('app_already_exists'); - track('error_occurred', { - module: 'applaunchpad', - error_code: 'APP_ALREADY_EXISTS' - }); - } else { - errorMsg = error?.message || errorMessage; - if (errorCode) { - track('error_occurred', { - module: 'applaunchpad', - error_code: String(errorCode) - }); - } - } - - // Special error codes: display ErrorModal - if ( - showErrorModal && - (errorCode === ResponseCode.BALANCE_NOT_ENOUGH || - errorCode === ResponseCode.FORBIDDEN_CREATE_APP || - errorCode === ResponseCode.APP_ALREADY_EXISTS) - ) { - setErrorModalState({ - visible: true, - title: errorMessage, - content: errorMsg, - errorCode: errorCode - }); - } else { - // Normal errors: display toast - toast({ - title: errorMsg, - status: 'error' - }); - } - - onError?.(error); - return null; - } finally { - setLoading(false); - } - }, - [t, toast] - ); - - /** - * Close error modal - */ - const closeErrorModal = useCallback(() => { - setErrorModalState({ - visible: false, - title: '', - content: '' - }); - }, []); - - return { - executeOperation, - loading, - errorModalState, - closeErrorModal - }; -}; diff --git a/frontend/providers/applaunchpad/src/hooks/useClientAppConfig.ts b/frontend/providers/applaunchpad/src/hooks/useClientAppConfig.ts deleted file mode 100644 index 4a750b620..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useClientAppConfig.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createClientAppConfigHook } from '@sealos/shared'; -import { ClientAppConfig } from '@/types/config'; - -/** - * Hook to access pre-fetched client app configuration. - * Configuration is pre-fetched in _app.tsx getInitialProps. - */ -export const useClientAppConfig = createClientAppConfigHook(['client-app-config']); diff --git a/frontend/providers/applaunchpad/src/hooks/useClientSideValue.tsx b/frontend/providers/applaunchpad/src/hooks/useClientSideValue.tsx deleted file mode 100644 index d75218b4e..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useClientSideValue.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useState, useEffect } from 'react'; - -export function useClientSideValue(serverValue: boolean): boolean { - const [clientValue, setClientValue] = useState(false); - - useEffect(() => { - setClientValue(serverValue); - }, [serverValue]); - - return clientValue; -} diff --git a/frontend/providers/applaunchpad/src/hooks/useConfirm.tsx b/frontend/providers/applaunchpad/src/hooks/useConfirm.tsx deleted file mode 100644 index b463f43ee..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useConfirm.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { useCallback, useRef, useState } from 'react'; -import { - AlertDialog, - AlertDialogContent, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle -} from '@sealos/shadcn-ui/alert-dialog'; -import { Button } from '@sealos/shadcn-ui/button'; -import { useTranslation } from 'next-i18next'; -import { TriangleAlert } from 'lucide-react'; - -export const useConfirm = ({ title = 'Prompt', content }: { title?: string; content: string }) => { - const { t } = useTranslation(); - const [isOpen, setIsOpen] = useState(false); - const confirmCb = useRef(); - const cancelCb = useRef(); - - return { - openConfirm: useCallback((confirm?: any, cancel?: any) => { - return function () { - setIsOpen(true); - confirmCb.current = confirm; - cancelCb.current = cancel; - }; - }, []), - ConfirmChild: useCallback( - () => ( - - - - - - {t(title)} - - - -
{t(content)}
- - - - - -
-
- ), - [content, isOpen, t, title] - ) - }; -}; diff --git a/frontend/providers/applaunchpad/src/hooks/useLoading.tsx b/frontend/providers/applaunchpad/src/hooks/useLoading.tsx deleted file mode 100644 index e65c9871b..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useLoading.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { useState, useCallback } from 'react'; -import { Loading as ShadcnLoading } from '@sealos/shadcn-ui/loading'; -import { cn } from '@sealos/shadcn-ui'; - -export const useLoading = (props?: { defaultLoading: boolean }) => { - const [isLoading, setIsLoading] = useState(props?.defaultLoading || false); - - const Loading = useCallback( - ({ - loading, - fixed = true, - backdropProps - }: { - loading?: boolean; - fixed?: boolean; - backdropProps?: React.HTMLAttributes & { style?: React.CSSProperties }; - }): JSX.Element | null => { - const shouldShow = isLoading === true || loading === true; - - return ( - - ); - }, - [isLoading] - ); - - return { - isLoading, - setIsLoading, - Loading - }; -}; diff --git a/frontend/providers/applaunchpad/src/hooks/useRequest.tsx b/frontend/providers/applaunchpad/src/hooks/useRequest.tsx deleted file mode 100644 index ca2a33d35..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useRequest.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useToast } from '@/hooks/useToast'; -import { useMutation } from '@tanstack/react-query'; -import type { UseMutationOptions } from '@tanstack/react-query'; -import { getErrText } from '@/utils/tools'; -import { useTranslation } from 'next-i18next'; - -interface Props extends UseMutationOptions { - successToast?: string | null; - errorToast?: string | null; -} - -export const useRequest = ({ successToast, errorToast, onSuccess, onError, ...props }: Props) => { - const { toast } = useToast(); - const { t } = useTranslation(); - const mutation = useMutation({ - ...props, - onSuccess(res, variables: void, context: unknown) { - onSuccess?.(res, variables, context); - successToast && - toast({ - title: successToast, - status: 'success' - }); - }, - onError(err: any, variables: void, context: unknown) { - onError?.(err, variables, context); - errorToast && - toast({ - title: t(getErrText(err, errorToast)), - status: 'error' - }); - } - }); - - return mutation; -}; diff --git a/frontend/providers/applaunchpad/src/hooks/useScreen.ts b/frontend/providers/applaunchpad/src/hooks/useScreen.ts deleted file mode 100644 index 79af2c568..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useScreen.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { useState, useEffect } from 'react'; -import { throttle } from 'lodash'; - -export function useScreen() { - const [screenWidth, setScreenWidth] = useState(1440); - - useEffect(() => { - const resize = throttle(() => { - const w = document.documentElement.clientWidth; - setScreenWidth(w); - }, 300); - window.addEventListener('resize', resize); - - const w = document.documentElement.clientWidth; - setScreenWidth(w); - - return () => { - window.removeEventListener('resize', resize); - }; - }, []); - - return { - screenWidth - }; -} diff --git a/frontend/providers/applaunchpad/src/hooks/useSelectFile.tsx b/frontend/providers/applaunchpad/src/hooks/useSelectFile.tsx deleted file mode 100644 index 25dd51184..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useSelectFile.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useRef, useCallback } from 'react'; - -export const useSelectFile = (props?: { fileType?: string; multiple?: boolean }) => { - const { fileType = '*', multiple = false } = props || {}; - - const SelectFileDom = useRef(null); - - const File = useCallback( - ({ onSelect }: { onSelect: (e: File[]) => void }) => ( -
- { - if (!e.target.files || e.target.files?.length === 0) return; - onSelect(Array.from(e.target.files)); - }} - /> -
- ), - [fileType, multiple] - ); - - const onOpen = useCallback(() => { - SelectFileDom.current && SelectFileDom.current.click(); - }, []); - - return { - File, - onOpen - }; -}; diff --git a/frontend/providers/applaunchpad/src/hooks/useToast.ts b/frontend/providers/applaunchpad/src/hooks/useToast.ts deleted file mode 100644 index 95161b3c6..000000000 --- a/frontend/providers/applaunchpad/src/hooks/useToast.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { toast as sonnerToast } from 'sonner'; - -type ToastStatus = 'success' | 'error' | 'warning' | 'info'; - -interface ToastOptions { - title?: string; - description?: string; - status?: ToastStatus; - duration?: number; -} - -export const useToast = () => { - const toast = (options: ToastOptions) => { - const { title, description, status = 'info', duration = 2000 } = options; - const message = title || description || ''; - - switch (status) { - case 'success': - sonnerToast.success(message, { duration }); - break; - case 'error': - sonnerToast.error(message, { duration }); - break; - case 'warning': - sonnerToast.warning(message, { duration }); - break; - case 'info': - default: - sonnerToast.info(message, { duration }); - break; - } - }; - - return { - toast - }; -}; diff --git a/frontend/providers/applaunchpad/src/instrumentation.ts b/frontend/providers/applaunchpad/src/instrumentation.ts deleted file mode 100644 index 08b9121b9..000000000 --- a/frontend/providers/applaunchpad/src/instrumentation.ts +++ /dev/null @@ -1,39 +0,0 @@ -export async function register() { - if (process.env.NEXT_RUNTIME === 'nodejs') { - const { readFileSync } = await import('fs'); - const { readConfig, mountToGlobalThis, prettyPrintErrors } = await import( - '@sealos/shared/server/config' - ); - const { AppConfigSchema } = await import('./types/config'); - - const configPath = - process.env.NODE_ENV === 'development' ? 'data/config.local.yaml' : '/app/data/config.yaml'; - - try { - const configText = readFileSync(configPath, 'utf-8'); - const result = await readConfig(configText, AppConfigSchema as any); - - if (result.error) { - console.error('[Instrumentation Hook] Configuration validation failed:'); - console.error(prettyPrintErrors(result.error.details)); - process.exit(1); - } - - mountToGlobalThis('__APP_CONFIG__', result.data); - console.log('[Instrumentation Hook] Configuration loaded.'); - - // GPU node detection - try { - const { getGpuNode } = await import('./services/backend/gpu'); - const gpuNodes = await getGpuNode(); - console.log(gpuNodes, 'gpuNodes'); - } catch (gpuErr) { - console.warn('[Instrumentation Hook] GPU node detection failed (non-fatal):', gpuErr); - } - } catch (err) { - // nosemgrep: unsafe-formatstring - console.error(`[Instrumentation Hook] Failed to load config file from ${configPath}:`, err); - process.exit(1); - } - } -} diff --git a/frontend/providers/applaunchpad/src/mock/apps.ts b/frontend/providers/applaunchpad/src/mock/apps.ts deleted file mode 100644 index 19e196976..000000000 --- a/frontend/providers/applaunchpad/src/mock/apps.ts +++ /dev/null @@ -1,346 +0,0 @@ -import { AppListItemType, AppDetailType, PodDetailType, AppEditSyncedFields } from '@/types/app'; -import { appStatusMap, podStatusMap } from '@/constants/app'; -import { cpuMillicoresToQuantity, memoryMiToQuantity } from '@/utils/resourceQuantity'; -import { customAlphabet } from 'nanoid'; -const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz', 12); - -export const MOCK_APPS: AppListItemType[] = [ - { - id: 'string', - name: 'string', - status: appStatusMap.running, - createTime: 'string', - cpu: cpuMillicoresToQuantity(100), - memory: memoryMiToQuantity(100), - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - activeReplicas: 1, - isPause: false, - maxReplicas: 1, - minReplicas: 1, - storeAmount: 0, - labels: {}, - source: { - hasSource: false, - sourceName: '', - sourceType: 'app_store' - } - }, - { - id: 'string2', - name: 'string', - status: appStatusMap.running, - createTime: 'string', - cpu: cpuMillicoresToQuantity(100), - memory: memoryMiToQuantity(100), - isPause: false, - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - activeReplicas: 1, - maxReplicas: 1, - minReplicas: 1, - storeAmount: 0, - labels: {}, - source: { - hasSource: false, - sourceName: '', - sourceType: 'app_store' - } - }, - { - id: 'string3', - name: 'string', - status: appStatusMap.running, - createTime: 'string', - isPause: false, - cpu: cpuMillicoresToQuantity(100), - memory: memoryMiToQuantity(100), - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - activeReplicas: 1, - maxReplicas: 1, - minReplicas: 1, - storeAmount: 0, - labels: {}, - source: { - hasSource: false, - sourceName: '', - sourceType: 'app_store' - } - } -]; -export const MOCK_NAMESPACE = 'ns-34dccadb-8e62-4205-8c1b-fc2dc146cd68'; - -export const MOCK_DEPLOY = ` -apiVersion: v1 -kind: ServiceAccount -metadata: - name: desktop-app-demo - namespace: ---- -apiVersion: v1 -kind: Service -metadata: - name: desktop-app-demo - namespace: ns-34dccadb-8e62-4205-8c1b-fc2dc146cd68 -spec: - ports: - - port: 3000 - selector: - app: desktop-app-demo ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: desktop-app-demo-config - namespace: ns-34dccadb-8e62-4205-8c1b-fc2dc146cd68 -data: - config.yaml: |- - addr: :3000 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: desktop-app-demo - namespace: ns-34dccadb-8e62-4205-8c1b-fc2dc146cd68 -spec: - selector: - matchLabels: - app: desktop-app-demo - strategy: - type: Recreate - template: - metadata: - labels: - app: desktop-app-demo - spec: - serviceAccountName: desktop-app-demo - containers: - - name: desktop-app-demo - securityContext: - runAsNonRoot: true - runAsUser: 1001 - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - image: c121914yu/desktop-app-demo - resources: - requests: - cpu: 30m - memory: 300Mi - limits: - cpu: 30m - memory: 300Mi - imagePullPolicy: Always - volumeMounts: - - name: desktop-app-demo-volume - mountPath: /config.yaml - subPath: config.yaml - volumes: - - name: desktop-app-demo-volume - configMap: - name: desktop-app-demo-config ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/backend-protocol: "HTTP" - name: desktop-app-demo - namespace: ns-34dccadb-8e62-4205-8c1b-fc2dc146cd68 -spec: - rules: - - host: app-test.cloud.sealos.io - http: - paths: - - pathType: Prefix - path: / - backend: - service: - name: desktop-app-demo - port: - number: 3000 - tls: - - hosts: - - app-test.cloud.sealos.io - secretName: wildcard-cloud-sealos-io-cert -`; - -export const MOCK_PODS: PodDetailType[] = [ - { - podName: '1', - nodeName: 'dafda-fasd-fas', - ip: '311.241.41.41', - restarts: 10, - age: '22', - status: podStatusMap.running, - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - cpu: cpuMillicoresToQuantity(0), - memory: memoryMiToQuantity(0), - containerStatuses: [ - { - name: 'hello-world', - state: podStatusMap.running - } - ] - }, - { - podName: '2', - nodeName: 'dafda-fasd-fas', - ip: '311.241.41.41', - restarts: 10, - age: '22', - status: podStatusMap.running, - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - cpu: cpuMillicoresToQuantity(0), - memory: memoryMiToQuantity(0), - containerStatuses: [ - { - name: 'hello-world', - state: podStatusMap.running - } - ] - } -]; - -export const MOCK_APP_DETAIL: AppDetailType = { - kind: 'deployment', - volumes: [], - volumeMounts: [], - crYamlList: [], - id: '44c550d5-549c-4cca-bd67-d24ad6f38c96', - createTime: '2025-05-19 10:50', - status: appStatusMap.waiting, - isPause: false, - appName: 'hello-world', - imageName: 'nginx', - runCMD: '', - cmdParam: '', - replicas: 1, - cpu: cpuMillicoresToQuantity(200), - memory: memoryMiToQuantity(256), - gpu: { - type: '', - amount: 1, - manufacturers: 'nvidia' - }, - usedCpu: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - usedMemory: { - name: '', - xData: new Array(30).fill(0), - yData: new Array(30).fill('0') - }, - networks: [ - { - networkName: 'network-qrnrclezfupe', - portName: 'dqrgmsrxqhte', - port: 80, - openNodePort: false, - protocol: 'TCP', - appProtocol: 'HTTP', - openPublicDomain: true, - publicDomain: 'alpemulkxamb', - customDomain: '', - domain: 'gzg.sealos.run' - } - ], - envs: [], - hpa: { - use: false, - target: 'cpu', - value: 50, - minReplicas: 1, - maxReplicas: 5 - }, - configMapList: [], - secret: { - use: false, - username: '', - password: '', - serverAddress: 'docker.io' - }, - storeList: [], - labels: { - app: 'hello-world', - 'cloud.sealos.io/app-deploy-manager': 'hello-world' - }, - source: { - hasSource: false, - sourceName: '', - sourceType: 'app_store' - } -}; - -export const MockAppEditSyncedFields: AppEditSyncedFields = { - imageName: 'nginx', - appName: 'hello-world-test', - replicas: 1, - cpu: cpuMillicoresToQuantity(4000), - memory: memoryMiToQuantity(64), - networks: [ - { - networkName: 'network-atyjahgvtzqm', - portName: 'vsjrpjzjptex', - port: 80, - protocol: 'TCP', - openPublicDomain: true, - publicDomain: 'tkywzlpibxdl', - customDomain: '', - domain: 'gzg.sealos.run', - appProtocol: 'HTTP', - openNodePort: false - } - ], - cmdParam: 'sleep 10', - runCMD: '/bin/bash -c', - labels: {} -}; diff --git a/frontend/providers/applaunchpad/src/pages/404.tsx b/frontend/providers/applaunchpad/src/pages/404.tsx deleted file mode 100644 index ccc638dfa..000000000 --- a/frontend/providers/applaunchpad/src/pages/404.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React, { useEffect } from 'react'; -import { useRouter } from 'next/router'; - -const NonePage = () => { - const router = useRouter(); - useEffect(() => { - router.push('/apps'); - }, [router]); - - return
; -}; - -export default NonePage; diff --git a/frontend/providers/applaunchpad/src/pages/_app.tsx b/frontend/providers/applaunchpad/src/pages/_app.tsx deleted file mode 100644 index efbc47af4..000000000 --- a/frontend/providers/applaunchpad/src/pages/_app.tsx +++ /dev/null @@ -1,361 +0,0 @@ -// import { theme } from '@/constants/theme'; -import { useConfirm } from '@/hooks/useConfirm'; -import { useLoading } from '@/hooks/useLoading'; -import { useClientAppConfig } from '@/hooks/useClientAppConfig'; -import { useGlobalStore } from '@/store/global'; -import { useUserStore } from '@/store/user'; -import { getLangStore, setLangStore } from '@/utils/cookieUtils'; -import { buildExternalUrl } from '@/utils/network-url'; -import { ChakraProvider } from '@chakra-ui/react'; -import { dehydrate, QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { Fira_Code } from 'next/font/google'; -import { GeistSans } from 'geist/font/sans'; -import throttle from 'lodash/throttle'; -import { appWithTranslation, useTranslation } from 'next-i18next'; -import type { AppContext, AppInitialProps, AppProps } from 'next/app'; -import Router, { useRouter } from 'next/router'; -import NProgress from 'nprogress'; -import { useEffect, useState, useCallback } from 'react'; -import { EVENT_NAME } from 'sealos-desktop-sdk'; -import { createSealosApp, sealosApp } from 'sealos-desktop-sdk/app'; -import 'react-day-picker/dist/style.css'; -import '@/styles/tailwind.css'; -import 'nprogress/nprogress.css'; -import '@sealos/driver/src/driver.css'; -import Head from 'next/head'; -import App from 'next/app'; -import Script from 'next/script'; -import { GTMScript, RybbitScript } from '@sealos/gtm'; -import { InsufficientQuotaDialog, type SupportedLang } from '@sealos/shared/shadcn'; -import { - ClientConfigProvider, - prefetchClientAppConfig, - QuotaGuardProvider, - setupClientAppConfigDefaults -} from '@sealos/shared'; -import { Toaster } from '@sealos/shadcn-ui/sonner'; -import { getClientAppConfigServer } from './api/platform/getClientAppConfig'; -import { Config } from '@/config'; - -const FiraCode = Fira_Code({ - subsets: ['latin'], - variable: '--font-fira-code' -}); - -//Binding events. -Router.events.on('routeChangeStart', () => NProgress.start()); -Router.events.on('routeChangeComplete', () => NProgress.done()); -Router.events.on('routeChangeError', () => NProgress.done()); - -// Create a client -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, - retry: false, - cacheTime: 0 - } - } -}); - -setupClientAppConfigDefaults(queryClient, ['client-app-config']); - -type MetaScript = { src: string; [key: string]: string }; - -type AppOwnProps = { - title: string; - description: string; - scripts: MetaScript[]; - gtmEnabled: boolean; - gtmId: string; - rybbitHost: string; - rybbitSiteId: string; - dehydratedState?: unknown; -}; - -type AppContentProps = { - Component: AppProps['Component']; - pageProps: AppProps['pageProps']; - title: string; - description: string; -}; - -const AppContent = ({ Component, pageProps, title, description }: AppContentProps) => { - const router = useRouter(); - const { i18n } = useTranslation(); - const { setScreenWidth, loading, setLastRoute, initFormSliderList } = useGlobalStore(); - const { loadUserSourcePrice, setSession } = useUserStore(); - const { Loading } = useLoading(); - const [refresh, setRefresh] = useState(false); - const { openConfirm, ConfirmChild } = useConfirm({ - title: 'jump_prompt', - content: 'jump_message' - }); - const config = useClientAppConfig(); - const desktopUrl = buildExternalUrl({ - protocol: 'HTTP', - host: config.desktopDomain, - config: { - disableHttps: config.disableHttps, - cloudPort: config.port, - httpPort: config.httpPort - } - }); - - const getSession = useCallback(() => { - return useUserStore.getState().session ?? null; - }, []); - - useEffect(() => { - const response = createSealosApp(); - (async () => { - if (config.appResourceFormSliderConfig) { - initFormSliderList(config.appResourceFormSliderConfig); - } - loadUserSourcePrice(); - - try { - const newSession = JSON.stringify(await sealosApp.getSession()); - setSession(JSON.parse(newSession)); - - console.log('app init success'); - } catch (err) { - console.log('App is not running in desktop'); - if (!process.env.NEXT_PUBLIC_MOCK_USER) { - openConfirm(() => { - window.open(desktopUrl, '_self'); - })(); - } - } - })(); - return response; - }, []); - - // Clean up old Service Workers (PWA has been removed) - useEffect(() => { - if (typeof window !== 'undefined' && 'serviceWorker' in navigator) { - // Unregister all Service Workers - navigator.serviceWorker.getRegistrations().then((registrations) => { - registrations.forEach((registration) => { - registration.unregister().then((success) => { - if (success) { - console.log('Service Worker unregistered'); - } - }); - }); - }); - - // Clear all caches - if ('caches' in window) { - caches.keys().then((names) => { - names.forEach((name) => { - caches.delete(name); - }); - }); - } - } - }, []); - - // add resize event - useEffect(() => { - const resize = throttle((e: Event) => { - const documentWidth = document.documentElement.clientWidth || document.body.clientWidth; - setScreenWidth(documentWidth); - }, 200); - window.addEventListener('resize', resize); - const documentWidth = document.documentElement.clientWidth || document.body.clientWidth; - setScreenWidth(documentWidth); - - return () => { - window.removeEventListener('resize', resize); - }; - }, [setScreenWidth]); - - useEffect(() => { - const changeI18n = async (data: { currentLanguage: string }) => { - const lastLang = getLangStore(); - const newLang = data.currentLanguage; - if (lastLang !== newLang) { - i18n?.changeLanguage?.(newLang); - setLangStore(newLang); - setRefresh((state) => !state); - } - }; - (async () => { - try { - const lang = await sealosApp.getLanguage(); - changeI18n({ - currentLanguage: lang.lng - }); - } catch (error) { - changeI18n({ - currentLanguage: 'zh' - }); - } - })(); - - return sealosApp?.addAppEventListen(EVENT_NAME.CHANGE_I18N, changeI18n); - }, []); - - // record route - useEffect(() => { - return () => { - const currentPath = router.asPath; - if (router.isReady && !currentPath.includes('/redirect')) { - setLastRoute(currentPath); - } - }; - }, [router.pathname, router.isReady, setLastRoute]); - - useEffect(() => { - const lang = getLangStore() || 'zh'; - i18n?.changeLanguage?.(lang); - }, [refresh, router.pathname]); - - useEffect(() => { - const setupInternalAppCallListener = async () => { - try { - const event = async ( - e: MessageEvent<{ - type?: string; - name?: string; - formData?: string; - action?: string; - }> - ) => { - const whitelist = [desktopUrl]; - if (!whitelist.includes(e.origin)) { - return; - } - try { - if (e.data?.type === 'InternalAppCall') { - const { name, formData, action } = e.data; - if (formData) { - router.replace({ - pathname: '/redirect', - query: { formData } - }); - } else if (name) { - router.replace({ - pathname: '/app/detail', - query: { name } - }); - } else if (action) { - router.replace({ - pathname: '/redirect', - query: { action } - }); - } - } - } catch (error) { - console.log(error, 'error'); - } - }; - window.addEventListener('message', event); - return () => window.removeEventListener('message', event); - } catch (error) {} - }; - setupInternalAppCallListener(); - }, []); - - return ( -
- {title && ( - - {title} - - - )} - - - - - - - -
- ); -}; - -const MyApp = ({ - Component, - pageProps, - title, - description, - scripts, - gtmEnabled, - gtmId, - rybbitHost, - rybbitSiteId, - dehydratedState -}: AppProps & AppOwnProps) => ( - <> - - - - - - {scripts?.map((script, i) => ( - - - -`; - -export default function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method !== 'GET') { - res.setHeader('Allow', 'GET'); - return res.status(405).end(); - } - - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - return res.status(200).send(html); -} diff --git a/frontend/providers/applaunchpad/src/pages/api/v2alpha/k8sContext.ts b/frontend/providers/applaunchpad/src/pages/api/v2alpha/k8sContext.ts deleted file mode 100644 index 064d7fa87..000000000 --- a/frontend/providers/applaunchpad/src/pages/api/v2alpha/k8sContext.ts +++ /dev/null @@ -1,214 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { createK8sContext } from '@/services/backend'; -import type { K8sContext } from '@/services/backend'; -import { sendError, ErrorType, ErrorCode } from '@/types/v2alpha/error'; - -/** - * Auth/kubeconfig error identifiers from authSession and getK8s. - * When createK8sContext throws these, map to 401. - */ -const AUTH_ERROR_INDICATORS = [ - 'unAuthorization', - '用户不存在', - 'Unauthorized', - 'unauthorized', - 'invalid kubeconfig', - 'kubeconfig' -]; - -/** - * Kubernetes cluster unavailable indicators (connection/network errors). - */ -const UNAVAILABLE_INDICATORS = [ - 'ECONNREFUSED', - 'ETIMEDOUT', - 'ENOTFOUND', - 'unavailable', - 'connection refused', - 'network' -]; - -/** - * Create K8s context from request, or send appropriate error response. - * Returns K8sContext on success, or null if an error was sent (caller should return). - */ -export async function getK8sContextOrSendError( - req: NextApiRequest, - res: NextApiResponse -): Promise { - try { - return await createK8sContext(req); - } catch (err: unknown) { - const errMessage = err instanceof Error ? err.message : String(err); - const errStr = errMessage.toLowerCase(); - - // 401 Unauthorized - Missing/invalid auth or kubeconfig - if (AUTH_ERROR_INDICATORS.some((indicator) => errStr.includes(indicator.toLowerCase()))) { - sendError(res, { - status: 401, - type: ErrorType.AUTHENTICATION_ERROR, - code: ErrorCode.AUTHENTICATION_REQUIRED, - message: - 'Authentication required. Please provide valid credentials in the Authorization header.', - details: errMessage - }); - return null; - } - - // 503 Service Unavailable - K8s cluster unreachable - if (UNAVAILABLE_INDICATORS.some((indicator) => errStr.includes(indicator.toLowerCase()))) { - sendError(res, { - status: 503, - type: ErrorType.INTERNAL_ERROR, - code: ErrorCode.SERVICE_UNAVAILABLE, - message: 'Kubernetes cluster is temporarily unavailable. Please try again later.', - details: errMessage - }); - return null; - } - - // 500 Internal Server Error - Unexpected init error - sendError(res, { - status: 500, - type: ErrorType.INTERNAL_ERROR, - code: ErrorCode.INTERNAL_ERROR, - message: - 'Failed to initialize Kubernetes context. Please check your configuration and try again.', - details: errMessage - }); - return null; - } -} - -/** - * Extract message from K8s API error (various shapes from @kubernetes/client-node). - */ -function getK8sErrorMessage(err: unknown): string { - if (err instanceof Error) return err.message; - if (typeof err === 'string') return err; - const anyErr = err as Record; - const body = anyErr?.body as Record | undefined; - if (body?.message && typeof body.message === 'string') return body.message; - if (anyErr?.message && typeof anyErr.message === 'string') return anyErr.message; - return String(err); -} - -/** - * Get HTTP status code from K8s API error if present. - */ -function getK8sStatusCode(err: unknown): number | undefined { - const anyErr = err as { response?: { statusCode?: number }; body?: { code?: number } }; - const code = anyErr?.response?.statusCode ?? anyErr?.body?.code; - if (typeof code === 'number') return code; - return undefined; -} - -/** - * Check if K8s error indicates AlreadyExists (409). - */ -function isAlreadyExistsError(err: unknown): boolean { - const anyErr = err as { body?: { reason?: string } }; - const reason = anyErr?.body?.reason; - return ( - getK8sStatusCode(err) === 409 || - (typeof reason === 'string' && reason.toLowerCase() === 'alreadyexists') - ); -} - -/** - * Send appropriate error response for K8s API operation failures. - * Maps 403 -> 403 Forbidden, connection errors -> 503, others -> 500 operation_error. - * Use for errors thrown by K8s API calls; for truly unexpected exceptions use sendInternalError. - * @param defaultCode - Error code for 500 responses; defaults to KUBERNETES_ERROR. - */ -export function sendK8sOperationError( - res: NextApiResponse, - err: unknown, - defaultMessage: string, - defaultCode: - | typeof ErrorCode.KUBERNETES_ERROR - | typeof ErrorCode.STORAGE_UPDATE_FAILED - | typeof ErrorCode.OPERATION_FAILED = ErrorCode.KUBERNETES_ERROR -): void { - const errMessage = getK8sErrorMessage(err); - const errStr = errMessage.toLowerCase(); - const statusCode = getK8sStatusCode(err); - - // 403 Forbidden - K8s permission denied - if (statusCode === 403 || errStr.includes('forbidden') || errStr.includes('permission denied')) { - sendError(res, { - status: 403, - type: ErrorType.AUTHORIZATION_ERROR, - code: ErrorCode.PERMISSION_DENIED, - message: - 'Insufficient permissions to perform this operation. Please check your access rights.', - details: errMessage - }); - return; - } - - // 409 Conflict - Resource already exists - if (isAlreadyExistsError(err)) { - sendError(res, { - status: 409, - type: ErrorType.RESOURCE_ERROR, - code: ErrorCode.ALREADY_EXISTS, - message: - 'An application with this name already exists in the current namespace. Use a different name.', - details: errMessage - }); - return; - } - - // 422 Unprocessable Entity - Admission webhook rejected, invalid spec, quota exceeded - if (statusCode === 422) { - sendError(res, { - status: 422, - type: ErrorType.OPERATION_ERROR, - code: ErrorCode.INVALID_RESOURCE_SPEC, - message: - 'The resource specification was rejected by the cluster. Check admission webhooks, field constraints, and quota limits.', - details: errMessage - }); - return; - } - - // 503 Service Unavailable - Cluster unreachable - if ( - statusCode === 503 || - UNAVAILABLE_INDICATORS.some((indicator) => errStr.includes(indicator.toLowerCase())) - ) { - sendError(res, { - status: 503, - type: ErrorType.INTERNAL_ERROR, - code: ErrorCode.SERVICE_UNAVAILABLE, - message: 'Kubernetes cluster is temporarily unavailable. Please try again later.', - details: errMessage - }); - return; - } - - // 500 - Other K8s operation errors - sendError(res, { - status: 500, - type: ErrorType.OPERATION_ERROR, - code: defaultCode, - message: defaultMessage, - details: errMessage - }); -} - -/** - * Send 500 internal_error response for truly unexpected exceptions (programming errors, - * unhandled edge cases). Use in outer catch blocks, not for K8s API call failures. - */ -export function sendInternalError(res: NextApiResponse, err: unknown, message: string): void { - const errMessage = getK8sErrorMessage(err); - sendError(res, { - status: 500, - type: ErrorType.INTERNAL_ERROR, - code: ErrorCode.INTERNAL_ERROR, - message, - details: errMessage - }); -} diff --git a/frontend/providers/applaunchpad/src/pages/api/v2alpha/openapi.ts b/frontend/providers/applaunchpad/src/pages/api/v2alpha/openapi.ts deleted file mode 100644 index d0fa0aede..000000000 --- a/frontend/providers/applaunchpad/src/pages/api/v2alpha/openapi.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { jsonRes } from '@/services/backend/response'; -import { createOpenApiDocument } from '@/types/v2alpha/openapi'; -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'GET') { - // Create document at runtime to use the current domain from AppConfig - const document = createOpenApiDocument(); - res.setHeader('Content-Type', 'application/json'); - res.setHeader('Content-Disposition', 'attachment; filename="openapi.json"'); - return res.status(200).json(document); - } - - return jsonRes(res, { - code: 405, - message: 'Method not allowed' - }); -} diff --git a/frontend/providers/applaunchpad/src/pages/app/detail/advanced.tsx b/frontend/providers/applaunchpad/src/pages/app/detail/advanced.tsx deleted file mode 100644 index ef471eb92..000000000 --- a/frontend/providers/applaunchpad/src/pages/app/detail/advanced.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import AdvancedInfo from '@/components/app/detail/index/AdvancedInfo'; -import DetailLayout from '@/components/layouts/DetailLayout'; -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useAppStore } from '@/store/app'; -import { serviceSideProps } from '@/utils/i18n'; -import React from 'react'; - -export default function AdvancedConfigPage({ appName }: { appName: string }) { - const { appDetail = MOCK_APP_DETAIL } = useAppStore(); - - return ( - -
- -
-
- ); -} - -export async function getServerSideProps(content: any) { - const appName = content?.query?.name || ''; - - return { - props: { - appName, - ...(await serviceSideProps(content)) - } - }; -} diff --git a/frontend/providers/applaunchpad/src/pages/app/detail/index.tsx b/frontend/providers/applaunchpad/src/pages/app/detail/index.tsx deleted file mode 100644 index e158ea5df..000000000 --- a/frontend/providers/applaunchpad/src/pages/app/detail/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { MOCK_APP_DETAIL } from '@/mock/apps'; -import { useAppStore } from '@/store/app'; -import { serviceSideProps } from '@/utils/i18n'; -import { useLoading } from '@/hooks/useLoading'; -import { useQuery } from '@tanstack/react-query'; -import dynamic from 'next/dynamic'; -import React, { useEffect } from 'react'; -import AppBaseInfo from '@/components/app/detail/index/AppBaseInfo'; -import Pods from '@/components/app/detail/index/Pods'; -import DetailLayout from '@/components/layouts/DetailLayout'; -import { track } from '@sealos/gtm'; - -const AppMainInfo = dynamic(() => import('@/components/app/detail/index/AppMainInfo'), { - ssr: false -}); - -const AppDetail = ({ appName }: { appName: string }) => { - const { appDetail = MOCK_APP_DETAIL, appDetailPods, loadDetailMonitorData } = useAppStore(); - const { Loading } = useLoading(); - - useQuery( - ['loadDetailMonitorData', appName, appDetail?.isPause], - () => { - if (appDetail?.isPause) return null; - return loadDetailMonitorData(appName); - }, - { - refetchOnMount: true, - refetchInterval: 2 * 60 * 1000 - } - ); - - useEffect(() => { - track('deployment_details', { - module: 'applaunchpad' - }); - }, []); - - return ( - -
-
-
- -
-
- {appDetail ? : } -
-
-
- -
-
-
- ); -}; - -export async function getServerSideProps(content: any) { - const appName = content?.query?.name || ''; - - return { - props: { - appName, - ...(await serviceSideProps(content)) - } - }; -} - -export default React.memo(AppDetail); diff --git a/frontend/providers/applaunchpad/src/pages/app/detail/logs.tsx b/frontend/providers/applaunchpad/src/pages/app/detail/logs.tsx deleted file mode 100644 index 2e2100021..000000000 --- a/frontend/providers/applaunchpad/src/pages/app/detail/logs.tsx +++ /dev/null @@ -1,396 +0,0 @@ -import { useTranslation } from 'next-i18next'; -import { useQuery } from '@tanstack/react-query'; -import { useAppStore } from '@/store/app'; -import { serviceSideProps } from '@/utils/i18n'; -import DetailLayout from '@/components/layouts/DetailLayout'; -import { Header } from '@/components/app/detail/logs/Header'; -import { Filter } from '@/components/app/detail/logs/Filter'; -import { LogTable } from '@/components/app/detail/logs/LogTable'; -import { LogCounts } from '@/components/app/detail/logs/LogCounts'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { ListItem } from '@/components/AdvancedSelect'; -import useDateTimeStore from '@/store/date'; -import { getAppLogs, getLogPodList } from '@/api/app'; -import { useForm } from 'react-hook-form'; -import { formatTimeRange, parseTimeRange } from '@/utils/timeRange'; -import { downLoadBold, formatTime } from '@/utils/tools'; -import { useLogStore } from '@/store/logStore'; -import { useRouter } from 'next/router'; -import { track } from '@sealos/gtm'; - -export interface JsonFilterItem { - key: string; - value: string; - mode: '=' | '!=' | '~' | '!~'; -} - -export interface LogsFormData { - pods: ListItem[]; - containers: ListItem[]; - limit: number; - keyword: string; - isJsonMode: boolean; - isOnlyStderr: boolean; - jsonFilters: JsonFilterItem[]; - refreshInterval: number; - filterKeys: { - value: string; - label: string; - }[]; -} - -export default function LogsPage({ appName }: { appName: string }) { - const router = useRouter(); - const { t } = useTranslation(); - const { appDetail, appDetailPods } = useAppStore(); - const urlPodName = useMemo(() => { - const podParam = router.query.pod; - return typeof podParam === 'string' ? podParam : undefined; - }, [router.query.pod]); - - const { - refreshInterval, - setRefreshInterval, - startDateTime, - endDateTime, - setStartDateTime, - setEndDateTime, - isManualRange, - autoRange - } = useDateTimeStore(); - const { setLogs, exportLogs, parsedLogs, logCounts, setLogCounts } = useLogStore(); - - useEffect(() => { - track('module_view', { - module: 'applaunchpad', - view_name: 'logs' - }); - }, []); - - useEffect(() => { - if (!refreshInterval) return; - - const timer = window.setInterval(() => { - if (isManualRange) return; - const now = new Date(); - if (autoRange) { - const { startTime } = parseTimeRange(autoRange, now); - setStartDateTime(startTime); - setEndDateTime(now); - } else { - const durationMs = Math.max(0, endDateTime.getTime() - startDateTime.getTime()); - setStartDateTime(new Date(now.getTime() - durationMs)); - setEndDateTime(now); - } - }, refreshInterval); - - return () => window.clearInterval(timer); - }, [ - refreshInterval, - isManualRange, - autoRange, - startDateTime, - endDateTime, - setStartDateTime, - setEndDateTime - ]); - - const formHook = useForm({ - defaultValues: { - pods: [], - containers: [], - limit: 100, - keyword: '', - isJsonMode: false, - isOnlyStderr: false, - jsonFilters: [], - refreshInterval: 0 - } - }); - - const selectedPods = formHook.watch('pods').filter((pod) => pod.checked); - const selectedContainers = formHook.watch('containers').filter((container) => container.checked); - const jsonFilters = formHook - .watch('jsonFilters') - .filter((item) => item.key && item.key.trim() !== ''); - - const timeRange = formatTimeRange(startDateTime, endDateTime); - - const allPods = formHook.watch('pods'); - const allContainers = formHook.watch('containers'); - - // Build the pod -> containers mapping - const podContainerMap = useMemo(() => { - const podToContainers = new Map>(); - - appDetailPods?.forEach((pod) => { - const podName = pod.metadata?.name; - if (!podName) return; - - const containers = pod.spec?.containers || []; - const containerNames = containers.map((c) => c.name); - - podToContainers.set(podName, new Set(containerNames)); - }); - - return podToContainers; - }, [appDetailPods]); - - // When container selection changes, update pod selection - const onContainerChange = useCallback( - (newContainers: ListItem[]) => { - formHook.setValue('containers', newContainers); - - const currentPods = formHook.getValues('pods'); - const checkedContainerNames = new Set( - newContainers.filter((c) => c.checked).map((c) => c.value) - ); - const hasAnyContainerChecked = checkedContainerNames.size > 0; - - // Update pod selection based on container selection - const updatedPods = currentPods.map((pod) => { - const podContainers = podContainerMap.get(pod.value); - - // For non-active pods (no container mapping): - // - If no container is selected, uncheck the pod - // - If any container is selected, keep the pod's current state - if (!podContainers) { - return hasAnyContainerChecked ? pod : { ...pod, checked: false }; - } - - // For active pods: check if any of its containers is selected - const hasCheckedContainer = Array.from(podContainers).some((containerName) => - checkedContainerNames.has(containerName) - ); - - return { ...pod, checked: hasCheckedContainer }; - }); - - formHook.setValue('pods', updatedPods); - }, - [formHook, podContainerMap] - ); - - // Compute the pod params for API (pods only, no containers) - const podParam = useMemo(() => { - // When none selected, pass a placeholder so backend returns empty - if (selectedPods.length === 0 && allPods.length > 0) { - return ['__none__']; - } - // When all selected, pass empty array (backend returns all) - if (selectedPods.length === allPods.length) { - return []; - } - // When partially selected, pass the selected pods - return selectedPods.map((pod) => pod.value); - }, [selectedPods, allPods]); - - const containerParam = useMemo(() => { - if (selectedContainers.length === 0 && allContainers.length > 0) { - return ['__none__']; - } - if (selectedContainers.length === allContainers.length) { - return []; - } - return selectedContainers.map((container) => container.value); - }, [selectedContainers, allContainers]); - - const { isLoading, refetch: refetchLogsData } = useQuery( - [ - 'logs-data', - appName, - startDateTime.getTime(), - endDateTime.getTime(), - formHook.watch('limit'), - formHook.watch('isJsonMode'), - formHook.watch('keyword'), - podParam, - containerParam - ], - () => - getAppLogs({ - // time: timeRange, - startTime: startDateTime.toISOString(), - endTime: endDateTime.toISOString(), - app: appName, - limit: formHook.watch('limit').toString(), - jsonMode: formHook.watch('isJsonMode').toString(), - keyword: formHook.watch('keyword'), - pod: podParam, - container: containerParam, - jsonQuery: jsonFilters - }), - { - retry: 1, - staleTime: 3000, - cacheTime: 3000, - refetchInterval: refreshInterval, - onError: (error: any) => { - console.log(error, 'error'); - setRefreshInterval(0); - }, - onSuccess: (data) => { - setLogs(data); - } - } - ); - - // Log counts - const { refetch: refetchLogCountsData, isLoading: isLogCountsLoading } = useQuery( - [ - 'log-counts-data', - appName, - startDateTime.getTime(), - endDateTime.getTime(), - podParam, - containerParam, - formHook.watch('isJsonMode'), - formHook.watch('keyword') - ], - () => - getAppLogs({ - app: appName, - numberMode: 'true', - numberLevel: timeRange.slice(-1), - jsonMode: formHook.watch('isJsonMode').toString(), - startTime: startDateTime.toISOString(), - endTime: endDateTime.toISOString(), - pod: podParam, - container: containerParam, - jsonQuery: jsonFilters, - keyword: formHook.watch('keyword') - }), - { - refetchInterval: refreshInterval, - staleTime: 3000, - cacheTime: 3000, - onSuccess: (data) => { - setLogCounts(data); - } - } - ); - - const { refetch: refetchPodListData, isLoading: isPodListLoading } = useQuery( - [ - 'log-pod-list-data', - appName, - startDateTime.getTime(), - endDateTime.getTime(), - appDetailPods?.length - ], - () => - getLogPodList({ - // time: timeRange - app: appName, - startTime: startDateTime.toISOString(), - endTime: endDateTime.toISOString() - }), - { - staleTime: 3000, - cacheTime: 3000, - onSuccess: (data) => { - console.log('isInitialized', appDetailPods); - - const podList = Array.isArray(data) ? data : []; - // Get active pod names from appDetailPods - const activePodNames = new Set( - appDetailPods - ?.map((pod) => pod.metadata?.name) - .filter((name): name is string => !!name) ?? [] - ); - - const podNamesSet = new Set([...podList, ...activePodNames]); - - const prevPods = formHook.getValues('pods'); - const hasPrevPods = prevPods.length > 0; - const checkedMap = new Map(prevPods.map((pod) => [pod.value, pod.checked])); - - const newPods: ListItem[] = Array.from(podNamesSet).map((podName) => ({ - value: podName, - label: podName, - checked: hasPrevPods - ? checkedMap.get(podName) ?? true - : urlPodName - ? podName === urlPodName - : true, - isActive: activePodNames.has(podName) - })); - - formHook.setValue('pods', newPods); - if (urlPodName && podNamesSet.has(urlPodName)) { - const { pod: _pod, ...rest } = router.query; - router.replace({ pathname: router.pathname, query: rest }, undefined, { shallow: true }); - } - - if (appDetailPods?.length) { - const prevContainers = formHook.getValues('containers'); - const hasPrevContainers = prevContainers.length > 0; - const containerCheckedMap = new Map( - prevContainers.map((container) => [container.value, container.checked]) - ); - - const containers = appDetailPods - .flatMap((pod) => pod.spec?.containers || []) - .map((container) => ({ - value: container.name, - label: container.name, - checked: hasPrevContainers ? containerCheckedMap.get(container.name) ?? true : true - })) - .filter((item, index, self) => index === self.findIndex((t) => t.value === item.value)); - formHook.setValue('containers', containers); - } - } - } - ); - - const refetchData = () => { - if (!isManualRange) { - const now = new Date(); - if (autoRange) { - const { startTime } = parseTimeRange(autoRange, now); - setStartDateTime(startTime); - setEndDateTime(now); - } else { - const durationMs = Math.max(0, endDateTime.getTime() - startDateTime.getTime()); - setStartDateTime(new Date(now.getTime() - durationMs)); - setEndDateTime(now); - } - } - refetchLogsData(); - refetchLogCountsData(); - refetchPodListData(); - }; - - return ( - -
-
-
-
- -
-
- -
-
- -
-
- - ); -} - -export async function getServerSideProps(content: any) { - const appName = content?.query?.name || ''; - - return { - props: { - appName, - ...(await serviceSideProps(content)) - } - }; -} diff --git a/frontend/providers/applaunchpad/src/pages/app/detail/monitor.tsx b/frontend/providers/applaunchpad/src/pages/app/detail/monitor.tsx deleted file mode 100644 index 3a61c6ddd..000000000 --- a/frontend/providers/applaunchpad/src/pages/app/detail/monitor.tsx +++ /dev/null @@ -1,826 +0,0 @@ -import DetailLayout from '@/components/layouts/DetailLayout'; -import { useAppStore } from '@/store/app'; -import { serviceSideProps } from '@/utils/i18n'; -import { useQuery } from '@tanstack/react-query'; -import { useTranslation } from 'react-i18next'; -import Header, { MonitorTab } from '@/components/Monitor/Header'; -import MonitorChart from '@/components/MonitorChart'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { ListItem } from '@/components/AdvancedSelect'; -import useDateTimeStore from '@/store/date'; -import { getAppMonitorData, getNetworkMonitorData } from '@/api/app'; -import { LineChart } from 'lucide-react'; -import { track } from '@sealos/gtm'; -import { generatePvcNameRegex } from '@/utils/tools'; -import { parseTimeRange } from '@/utils/timeRange'; -import { Skeleton } from '@sealos/shadcn-ui/skeleton'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@sealos/shadcn-ui/tabs'; -import { useRouter } from 'next/router'; - -const getPaddedAxisMax = (value: { max: number }) => { - const rawMax = value?.max ?? 0; - if (rawMax <= 0) return 1; - const padded = rawMax * 1.1; - const step = rawMax < 1000 ? 10 : rawMax < 5000 ? 50 : 100; - return Math.ceil(padded / step) * step; -}; -const getPercentAxisMax = (value: { max: number }) => { - const rawMax = value?.max ?? 0; - if (rawMax <= 0) return 100; - const rounded = Math.ceil(rawMax / 10) * 10; - const nextMax = rounded <= rawMax ? rounded + 10 : rounded; - return Math.max(100, nextMax); -}; - -export default function MonitorPage({ appName }: { appName: string }) { - const router = useRouter(); - const { appDetail, appDetailPods } = useAppStore(); - const { t } = useTranslation(); - const { - startDateTime, - endDateTime, - setStartDateTime, - setEndDateTime, - isManualRange, - autoRange, - refreshInterval - } = useDateTimeStore(); - const [podList, setPodList] = useState([]); - const [currentTab, setCurrentTab] = useState('performance'); - const urlPodName = useMemo(() => { - const podParam = router.query.pod; - return typeof podParam === 'string' ? podParam : undefined; - }, [router.query.pod]); - - // use useCallback to avoid unnecessary re-renders of MonitorChart - const percentFormatter = useCallback((value: number) => `${value}%`, []); - const getLatestNumericValue = useCallback((values?: Array) => { - if (!values?.length) return null; - for (let i = values.length - 1; i >= 0; i -= 1) { - const raw = values[i]; - if (raw === null || raw === undefined) continue; - const numeric = Number(raw); - if (!Number.isNaN(numeric)) return numeric; - } - return null; - }, []); - - useEffect(() => { - track('module_view', { - module: 'applaunchpad', - view_name: 'monitors' - }); - }, []); - - // update time range after set refresh interval - useEffect(() => { - if (!refreshInterval) return; - - const timer = window.setInterval(() => { - if (isManualRange) return; - const now = new Date(); - if (autoRange) { - const { startTime } = parseTimeRange(autoRange, now); - setStartDateTime(startTime); - setEndDateTime(now); - } else { - const durationMs = Math.max(0, endDateTime.getTime() - startDateTime.getTime()); - setStartDateTime(new Date(now.getTime() - durationMs)); - setEndDateTime(now); - } - }, refreshInterval); - - return () => window.clearInterval(timer); - }, [ - refreshInterval, - isManualRange, - autoRange, - startDateTime, - endDateTime, - setStartDateTime, - setEndDateTime - ]); - - // Reset pod list when app changes - useEffect(() => { - setPodList([]); - }, [appName]); - - // Update pod list when appDetailPods changes - useEffect(() => { - setPodList((prevList) => { - // If no pods, return empty list (but only if prevList is not already empty) - if (!appDetailPods?.length) { - return prevList.length === 0 ? prevList : []; - } - - // Check if pods actually changed (same pod names in same order) - const currentPodNames = appDetailPods.map((p) => p.podName); - const prevPodNames = prevList.map((p) => p.value); - const podsChanged = - currentPodNames.length !== prevPodNames.length || - currentPodNames.some((name, i) => name !== prevPodNames[i]); - - // If pods haven't changed, keep the same reference to avoid re-renders - if (!podsChanged) { - return prevList; - } - - const hasPrevPods = prevList.length > 0; - const shouldUseUrlPod = - !!urlPodName && appDetailPods.some((pod) => pod.podName === urlPodName); - - // Create a map of existing checked states (only for pods belonging to current app) - const checkedMap = new Map( - prevList - .filter((p) => appDetailPods.some((pod) => pod.podName === p.value)) - .map((p) => [p.value, p.checked]) - ); - - return appDetailPods.map((pod) => ({ - value: pod.podName, - label: pod.podName, - // Preserve checked state for existing pods, default to true for new pods - checked: hasPrevPods - ? checkedMap.get(pod.podName) ?? true - : shouldUseUrlPod - ? pod.podName === urlPodName - : true - })); - }); - }, [appDetailPods, urlPodName]); - - useEffect(() => { - if (!router.isReady || !urlPodName) return; - if (!appDetailPods?.some((pod) => pod.podName === urlPodName)) return; - const { pod: _pod, ...rest } = router.query; - router.replace({ pathname: router.pathname, query: rest }, undefined, { shallow: true }); - }, [appDetailPods, router, urlPodName]); - - // memory data - const { - data: memoryData, - isLoading, - refetch: refetchMemoryData, - dataUpdatedAt: memoryDataUpdatedAt - } = useQuery( - [ - 'monitor-data-memory', - appName, - appDetailPods?.[0]?.podName, - startDateTime.getTime(), - endDateTime.getTime() - ], - async () => { - const result = await getAppMonitorData({ - queryKey: 'memory', - queryName: appDetailPods?.[0]?.podName || appName, - step: '2m', - start: startDateTime.getTime(), - end: endDateTime.getTime() - }); - return result; - }, - { - refetchInterval: refreshInterval, - enabled: !!appDetailPods?.[0]?.podName - } - ); - - // memory latest average - const memoryLatestAvg = useMemo(() => { - if (!memoryData?.length) return '0.00'; - - let sum = 0; - let count = 0; - memoryData.forEach((pod) => { - const lastValue = getLatestNumericValue(pod?.yData); - if (lastValue !== null) { - sum += lastValue; - count += 1; - } - }); - - return count > 0 ? (sum / count).toFixed(2) : '0.00'; - }, [getLatestNumericValue, memoryData]); - - // cpu data - const { - data: cpuData, - refetch: refetchCpuData, - dataUpdatedAt: cpuDataUpdatedAt - } = useQuery( - [ - 'monitor-data-cpu', - appName, - appDetailPods?.[0]?.podName, - startDateTime.getTime(), - endDateTime.getTime() - ], - async () => { - const result = await getAppMonitorData({ - queryKey: 'cpu', - queryName: appDetailPods?.[0]?.podName || appName, - step: '2m', - start: startDateTime.getTime(), - end: endDateTime.getTime() - }); - return result; - }, - { - refetchInterval: refreshInterval, - enabled: !!appDetailPods?.[0]?.podName - } - ); - - // storage data - const pvcNameRegex = generatePvcNameRegex(appDetail); - const { - data: storageData, - refetch: refetchStorageData, - dataUpdatedAt: storageDataUpdatedAt - } = useQuery( - ['monitor-data-storage', appName, pvcNameRegex, startDateTime.getTime(), endDateTime.getTime()], - async () => { - const result = await getAppMonitorData({ - queryKey: 'storage', - queryName: pvcNameRegex || appName, - step: '2m', - start: startDateTime.getTime(), - end: endDateTime.getTime(), - pvcName: pvcNameRegex - }); - return result; - }, - { - refetchInterval: refreshInterval, - enabled: !!pvcNameRegex - } - ); - - // cpu latest average - const cpuLatestAvg = useMemo(() => { - if (!cpuData?.length) return '0.00'; - - let sum = 0; - let count = 0; - cpuData.forEach((pod) => { - const lastValue = getLatestNumericValue(pod?.yData); - if (lastValue !== null) { - sum += lastValue; - count += 1; - } - }); - - return count > 0 ? (sum / count).toFixed(2) : '0.00'; - }, [cpuData, getLatestNumericValue]); - - // Get all available networks for monitoring (only non-NodePort networks) - const availableNetworks = useMemo(() => { - // Filter networks where openNodePort is false (HTTP/GRPC/WS protocols) - const networks = appDetail?.networks?.filter((network) => !network.openNodePort) || []; - return networks.slice().sort((a, b) => (a?.port ?? 0) - (b?.port ?? 0)); - }, [appDetail?.networks]); - - // State for selected network index - const [selectedNetworkIndex, setSelectedNetworkIndex] = useState(0); - - // Get current selected network info directly from availableNetworks - const networkInfo = useMemo(() => { - const network = availableNetworks[selectedNetworkIndex]; - return { - serviceName: network?.serviceName || '', - port: network?.port || 0 - }; - }, [availableNetworks, selectedNetworkIndex]); - - // Network request count data - const { - data: networkCountData, - refetch: refetchNetworkCountData, - dataUpdatedAt: networkCountDataUpdatedAt, - isLoading: isNetworkCountLoading - } = useQuery( - [ - 'monitor-data-network-count', - appName, - networkInfo.serviceName, - networkInfo.port, - startDateTime.getTime(), - endDateTime.getTime() - ], - async () => { - const result = await getNetworkMonitorData({ - serviceName: networkInfo.serviceName, - port: networkInfo.port, - type: 'network_service_request_count', - step: '2m', - start: startDateTime.getTime(), - end: endDateTime.getTime() - }); - return result; - }, - { - refetchInterval: refreshInterval, - enabled: !!networkInfo.serviceName && !!networkInfo.port - } - ); - - // Network request percent data - const { - data: networkPercentData, - refetch: refetchNetworkPercentData, - dataUpdatedAt: networkPercentDataUpdatedAt, - isLoading: isNetworkPercentLoading - } = useQuery( - [ - 'monitor-data-network-percent', - appName, - networkInfo.serviceName, - networkInfo.port, - startDateTime.getTime(), - endDateTime.getTime() - ], - async () => { - const result = await getNetworkMonitorData({ - serviceName: networkInfo.serviceName, - port: networkInfo.port, - type: 'network_service_request_percent', - step: '2m', - start: startDateTime.getTime(), - end: endDateTime.getTime() - }); - return result; - }, - { - refetchInterval: refreshInterval, - enabled: !!networkInfo.serviceName && !!networkInfo.port - } - ); - - // Network count chart data - const networkCountChartData = useMemo(() => { - if (!networkCountData?.length) { - return { - xData: [] as string[], - yData: [] as { name: string; type: string; data: Array }[] - }; - } - - const xData = networkCountData[0]?.xData?.map(String) || []; - const yData = - networkCountData.map((item) => ({ - name: item?.name || 'unknown', - type: 'line', - data: item?.yData?.map((value) => (value === null ? null : Number(value))) || [] - })) || []; - - const chartData = { - xData, - yData - }; - return chartData; - }, [networkCountData]); - - // Network percent chart data - const networkPercentChartData = useMemo(() => { - if (!networkPercentData?.length) { - return { - xData: [] as string[], - yData: [] as { name: string; type: string; data: Array }[] - }; - } - - const xData = networkPercentData[0]?.xData?.map(String) || []; - const yData = - networkPercentData.map((item) => ({ - name: item?.name || 'unknown', - type: 'line', - data: item?.yData?.map((value) => (value === null ? null : Number(value))) || [] - })) || []; - - const chartData = { - xData, - yData - }; - return chartData; - }, [networkPercentData]); - - // Network total count (sum of latest values for all status codes) - const networkTotalCount = useMemo(() => { - if (!networkCountData?.length) return '0'; - - let total = 0; - networkCountData.forEach((item) => { - const lastValue = getLatestNumericValue(item?.yData); - if (lastValue !== null) { - total += lastValue; - } - }); - - return Math.round(total).toString(); - }, [networkCountData, getLatestNumericValue]); - - // storage latest value - const storageLatestValue = useMemo(() => { - const selectedPods = podList.filter((pod) => pod.checked); - const filteredData = storageData?.filter((item) => - selectedPods.some((pod) => item?.name?.endsWith(pod.value)) - ); - if (!filteredData?.length) return '0.00'; - const lastValue = getLatestNumericValue(filteredData?.[0]?.yData); - return lastValue !== null ? lastValue.toFixed(2) : '0.00'; - }, [getLatestNumericValue, podList, storageData]); - - // All active pod names (all pods in podList, used to distinguish active vs deprecated) - const activePodNames = useMemo(() => { - return podList.map((pod) => pod.value); - }, [podList]); - - // Checked pod names (only pods selected in header) - const checkedPodNames = useMemo(() => { - return podList.filter((pod) => pod.checked).map((pod) => pod.value); - }, [podList]); - - // memory chart data - include all pods (active and deprecated) for chart display - const memoryChartData = useMemo(() => { - if (!memoryData?.length) { - return { - xData: [] as string[], - yData: [] as { name: string; type: string; data: Array }[] - }; - } - - const xData = memoryData[0]?.xData?.map(String) || []; - const yData = - memoryData.map((item) => ({ - name: item?.name || 'unknown', - type: 'line', - data: item?.yData?.map((value) => (value === null ? null : Number(value))) || [] - })) || []; - - return { - xData, - yData - }; - }, [memoryData]); - - // cpu chart data - include all pods (active and deprecated) for chart display - const cpuChartData = useMemo(() => { - if (!cpuData?.length) { - return { - xData: [] as string[], - yData: [] as { name: string; type: string; data: Array }[] - }; - } - - const xData = cpuData[0]?.xData?.map(String) || []; - const yData = - cpuData.map((item) => ({ - name: item?.name || 'unknown', - type: 'line', - data: item?.yData?.map((value) => (value === null ? null : Number(value))) || [] - })) || []; - - return { - xData, - yData - }; - }, [cpuData]); - - // storage chart data - const storageChartData = useMemo(() => { - const selectedPods = podList.filter((pod) => pod.checked); - const filteredData = storageData?.filter((item) => - selectedPods.some((pod) => item?.name?.endsWith(pod.value)) - ); - - if (filteredData?.length === 0) { - return { - xData: [] as string[], - yData: [] as { name: string; type: string; data: Array }[] - }; - } - - const xData = filteredData?.[0]?.xData?.map(String) || []; - const yData = - filteredData?.map((item) => ({ - name: item?.name || 'unknown', - type: 'line', - data: item?.yData?.map((value) => (value === null ? null : Number(value))) || [] - })) || []; - - return { - xData, - yData - }; - }, [storageData, podList]); - - // get the latest refresh time from all queries - const lastRefreshTime = useMemo(() => { - const times = [ - memoryDataUpdatedAt, - cpuDataUpdatedAt, - storageDataUpdatedAt, - networkCountDataUpdatedAt, - networkPercentDataUpdatedAt - ].filter(Boolean); - return times.length > 0 ? Math.max(...times) : undefined; - }, [ - memoryDataUpdatedAt, - cpuDataUpdatedAt, - storageDataUpdatedAt, - networkCountDataUpdatedAt, - networkPercentDataUpdatedAt - ]); - - // refetch data - const refetchData = () => { - if (!isManualRange) { - const now = new Date(); - if (autoRange) { - const { startTime } = parseTimeRange(autoRange, now); - setStartDateTime(startTime); - setEndDateTime(now); - } else { - const durationMs = Math.max(0, endDateTime.getTime() - startDateTime.getTime()); - setStartDateTime(new Date(now.getTime() - durationMs)); - setEndDateTime(now); - } - } - refetchCpuData(); - refetchMemoryData(); - refetchStorageData(); - refetchNetworkCountData(); - refetchNetworkPercentData(); - }; - - return ( - -
-
-
-
-
- setCurrentTab(value as MonitorTab)} - className="w-full h-full flex flex-col flex-1 gap-0" - > - - - {t('monitor_tab_performance')} - - - {t('monitor_tab_network')} - - - {t('monitor_tab_storage')} - -
-
- - {!isLoading ? ( -
-
-
-
- CPU: ({cpuLatestAvg}%) -
-
-
- {cpuChartData?.yData?.length > 0 ? ( - - ) : ( -
-
- -
-
- {t('no_data_available')} -
-
- )} -
-
-
-
-
- Memory: ( - {memoryLatestAvg}%) -
-
-
- {memoryChartData?.yData?.length > 0 ? ( - - ) : ( -
-
- -
-
- {t('no_data_available')} -
-
- )} -
-
-
- ) : ( - <> - {[{ height: 'h-[242px]' }, { height: 'h-[200px]' }].map((item, index) => ( -
- - -
- ))} - - )} -
- - {!isNetworkCountLoading && !isNetworkPercentLoading ? ( - networkInfo.serviceName && networkInfo.port ? ( -
-
-
-
- {t('network_request_percent')} (%) -
-
-
- {networkPercentChartData?.yData?.length > 0 ? ( - - ) : ( -
-
- -
-
- {t('no_data_available')} -
-
- )} -
-
- -
-
-
- {t('network_request_count')} ( - {networkTotalCount}) -
-
-
- {networkCountChartData?.yData?.length > 0 ? ( - - ) : ( -
-
- -
-
- {t('no_data_available')} -
-
- )} -
-
-
- ) : ( -
-
- -
-
- {t('no_network_configured')} -
-
- ) - ) : ( - <> - {[{ height: 'h-[242px]' }, { height: 'h-[200px]' }].map((item, index) => ( -
- - -
- ))} - - )} -
- - {!isLoading ? ( -
-
-
- {t('storage_usage')} ( - {storageLatestValue}%) -
-
-
- {storageChartData?.yData?.length > 0 ? ( - - ) : ( -
-
- -
-
- {t('no_data_available')} -
-
- )} -
-
- ) : ( -
- - -
- )} -
-
-
-
-
- ); -} - -export async function getServerSideProps(content: any) { - const appName = content?.query?.name || ''; - - return { - props: { - appName, - ...(await serviceSideProps(content)) - } - }; -} diff --git a/frontend/providers/applaunchpad/src/pages/app/edit/components/ConfigmapModal.tsx b/frontend/providers/applaunchpad/src/pages/app/edit/components/ConfigmapModal.tsx deleted file mode 100644 index 59480758b..000000000 --- a/frontend/providers/applaunchpad/src/pages/app/edit/components/ConfigmapModal.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import React, { useMemo } from 'react'; -import { useForm } from 'react-hook-form'; -import { useTranslation } from 'next-i18next'; -import { - Drawer, - DrawerContent, - DrawerHeader, - DrawerTitle, - DrawerFooter -} from '@sealos/shadcn-ui/drawer'; -import { Button } from '@sealos/shadcn-ui/button'; -import { Input } from '@sealos/shadcn-ui/input'; -import { Textarea } from '@sealos/shadcn-ui/textarea'; -import { Label } from '@sealos/shadcn-ui/label'; -import { Maximize2, Minimize2 } from 'lucide-react'; - -export type ConfigMapType = { - id?: string; - mountPath: string; - value: string; - key: string; - volumeName: string; -}; - -const ConfigmapModal = ({ - defaultValue = { - mountPath: '', - value: '', - key: '', - volumeName: '' - }, - listNames, - successCb, - closeCb -}: { - defaultValue?: ConfigMapType; - listNames: string[]; - successCb: (e: ConfigMapType) => void; - closeCb: () => void; -}) => { - const { t } = useTranslation(); - const [isExpanded, setIsExpanded] = React.useState(false); - const type = useMemo(() => (!defaultValue.id ? 'create' : 'edit'), [defaultValue]); - const { - register, - handleSubmit, - formState: { errors } - } = useForm({ - defaultValues: defaultValue - }); - const textMap = { - create: { - title: 'Add' - }, - edit: { - title: 'Update' - } - }; - - return ( - !open && closeCb()}> - e.preventDefault()} - > - - - {t(textMap[type].title)} {t('ConfigMap Tip')} - - - - -
- {/* Mount Path / Filename */} -
- - { - if (listNames.includes(e.toLocaleLowerCase())) { - return t('ConfigMap Path Conflict') || 'ConfigMap Path Conflict'; - } - return true; - } - })} - /> - {errors.mountPath &&

{errors.mountPath.message}

} -
- - {/* File Value */} -
- -