From fa44b795d4ed5553a578439cac9917fbdc0c641f Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 1 May 2023 13:48:32 -0400 Subject: [PATCH] chore: Improve linting within @k8slens/core - Turning on @typescript-eslint/recommended-requiring-type-checking - Turning off @typescript-eslint/no-unnecessary-type-assertion (due too many false positives) - Making @typescript-eslint/no-explicit-any an error (except in tests) Signed-off-by: Sebastian Malton --- docs/extensions/guides/renderer-extension.md | 4 +- package-lock.json | 27983 +++++++++++++++- packages/core/.eslintrc.js | 38 +- .../__tests__/create-resource-stack.test.ts | 33 +- .../src/common/__tests__/kube-helpers.test.ts | 88 +- .../src/common/__tests__/user-store.test.ts | 4 +- .../src/common/app-event-bus/event-bus.ts | 2 +- .../src/common/app-paths/app-paths.test.ts | 4 +- .../app-paths/path-to-npm-cli.injectable.ts | 6 + .../src/common/catalog-entities/general.ts | 2 +- .../catalog-entities/kubernetes-cluster.ts | 17 +- .../src/common/catalog-entities/web-link.ts | 2 +- .../core/src/common/catalog/catalog-entity.ts | 22 +- .../src/common/catalog/category-registry.ts | 22 +- packages/core/src/common/catalog/helpers.ts | 2 +- .../visit-entity-context-menu.injectable.ts | 2 +- packages/core/src/common/cluster-types.ts | 62 +- packages/core/src/common/cluster/cluster.ts | 79 +- .../common/cluster/create-can-i.injectable.ts | 2 +- ...t-namespace-list-permissions.injectable.ts | 2 +- .../cluster/load-kubeconfig.injectable.ts | 18 +- ...request-namespace-list-permissions.test.ts | 2 +- .../fetch/download-binary.injectable.ts | 10 +- .../src/common/fetch/download-json/impl.ts | 10 +- .../navigate-to-route-injection-token.ts | 18 +- .../navigate-to-url-injection-token.ts | 2 +- .../src/common/fs/exec-file.injectable.ts | 9 +- ...ract-tar.global-override-for-injectable.ts | 1 + packages/core/src/common/fs/fs.injectable.ts | 9 +- .../common/fs/read-json-file.injectable.ts | 3 +- .../fs/validate-directory.injectable.ts | 10 +- ...le-model.global-override-for-injectable.ts | 25 +- .../get-active-helm-repositories-channel.ts | 2 +- .../src/common/initializable-state/create.ts | 3 +- .../ipc/broadcast-message.injectable.ts | 2 +- packages/core/src/common/ipc/ipc.ts | 43 +- packages/core/src/common/item.store.ts | 26 +- .../k8s-api/__tests__/api-manager.test.ts | 2 +- .../kube-api-version-detection.test.ts | 11 +- .../common/k8s-api/__tests__/kube-api.test.ts | 9 +- .../k8s-api/__tests__/kube-object.test.ts | 50 +- .../common/k8s-api/api-manager/api-manager.ts | 4 +- .../auto-registration-emitter.injectable.ts | 25 - .../api-manager/kube-object-store-token.ts | 17 +- .../k8s-api/create-json-api.injectable.ts | 4 +- .../create-kube-api-for-cluster.injectable.ts | 14 +- ...-kube-api-for-remote-cluster.injectable.ts | 16 +- .../create-kube-json-api.injectable.ts | 6 +- .../cluster-role-binding.api.injectable.ts | 7 +- .../endpoints/cluster-role.api.injectable.ts | 7 +- .../endpoints/cluster.api.injectable.ts | 7 +- .../component-status.api.injectable.ts | 7 +- .../endpoints/config-map.api.injectable.ts | 7 +- .../endpoints/cron-job.api.injectable.ts | 7 +- ...stom-resource-definition.api.injectable.ts | 7 +- .../endpoints/daemon-set.api.injectable.ts | 7 +- .../endpoints/deployment.api.injectable.ts | 7 +- .../endpoints/endpoint.api.injectable.ts | 7 +- .../endpoints/events.api.injectable.ts | 7 +- .../k8s-api/endpoints/helm-charts.api.ts | 182 +- .../request-readme.injectable.ts | 2 +- .../request-values.injectable.ts | 2 +- .../request-update.injectable.ts | 4 +- ...orizontal-pod-autoscaler.api.injectable.ts | 7 +- .../endpoints/ingress-class.api.injectable.ts | 19 +- .../endpoints/ingress.api.injectable.ts | 7 +- .../k8s-api/endpoints/job.api.injectable.ts | 7 +- .../k8s-api/endpoints/lease.api.injectable.ts | 7 +- .../endpoints/limit-range.api.injectable.ts | 7 +- ...ng-webhook-configuration-api.injectable.ts | 9 +- .../endpoints/namespace.api.injectable.ts | 7 +- .../network-policy.api.injectable.ts | 7 +- .../k8s-api/endpoints/node.api.injectable.ts | 7 +- .../persistent-volume-claim.api.injectable.ts | 7 +- .../persistent-volume.api.injectable.ts | 7 +- .../pod-disruption-budget.api.injectable.ts | 7 +- .../endpoints/pod-metrics.api.injectable.ts | 7 +- .../pod-security-policy.api.injectable.ts | 7 +- .../k8s-api/endpoints/pod.api.injectable.ts | 7 +- .../priority-class.api.injectable.ts | 9 +- .../endpoints/replica-set.api.injectable.ts | 7 +- .../replication-controller.api.injectable.ts | 11 +- .../request-patch.injectable.ts | 8 +- .../request-update.injectable.ts | 8 +- .../resource-quota.api.injectable.ts | 7 +- .../endpoints/role-binding.api.injectable.ts | 7 +- .../k8s-api/endpoints/role.api.injectable.ts | 7 +- .../endpoints/runtime-class.api.injectable.ts | 7 +- .../endpoints/secret.api.injectable.ts | 7 +- ...lf-subject-rules-reviews.api.injectable.ts | 7 +- .../service-account.api.injectable.ts | 7 +- .../endpoints/service.api.injectable.ts | 7 +- .../endpoints/stateful-set.api.injectable.ts | 7 +- .../endpoints/storage-class.api.injectable.ts | 7 +- ...ng-webhook-configuration-api.injectable.ts | 11 +- .../vertical-pod-autoscaler.api.injectable.ts | 7 +- .../src/common/k8s-api/kube-object.store.ts | 10 +- .../core/src/common/k8s/resource-stack.ts | 18 +- packages/core/src/common/kube-helpers.ts | 177 +- .../load-config-from-file.injectable.ts | 6 +- ...d-validated-config-from-file.injectable.ts | 6 +- ...ute-path.global-override-for-injectable.ts | 2 +- .../path/get-absolute-path.injectable.ts | 2 +- ...basename.global-override-for-injectable.ts | 2 +- .../common/path/get-basename.injectable.ts | 2 +- ...-dirname.global-override-for-injectable.ts | 2 +- .../src/common/path/get-dirname.injectable.ts | 2 +- ...ive-path.global-override-for-injectable.ts | 2 +- .../path/get-relative-path.injectable.ts | 2 +- ...in-paths.global-override-for-injectable.ts | 2 +- .../src/common/path/join-paths.injectable.ts | 2 +- .../parse.global-override-for-injectable.ts | 2 +- .../core/src/common/path/parse.injectable.ts | 5 +- .../src/common/protocol-handler/router.ts | 2 +- .../src/common/utils/__tests__/paths.test.ts | 8 +- .../utils/add-separator/add-separator.test.ts | 3 +- .../discriminable/discriminable.ts | 2 +- .../get-composite/get-composite.test.ts | 11 +- .../src/common/utils/registrator-helper.ts | 5 +- packages/core/src/common/utils/singleton.ts | 10 +- .../src/common/utils/sync-box/channels.ts | 12 +- .../sync-box/sync-box-injection-token.ts | 19 +- .../common/utils/sync-box/sync-box.test.ts | 38 +- .../core/src/common/utils/wait-for-path.ts | 2 +- .../with-error-logging.injectable.ts | 10 +- .../with-error-logging.test.ts | 27 +- .../with-error-suppression.test.ts | 5 +- .../with-error-suppression.ts | 11 +- .../with-orphan-promise.injectable.ts | 4 +- .../vars/normalized-platform.injectable.ts | 2 +- .../configurable-directories.test.ts | 6 +- .../__tests__/extension-loader.test.ts | 4 +- .../src/extensions/base-extension-store.ts | 12 +- .../core/src/extensions/common-api/k8s-api.ts | 30 +- .../extension-discovery.test.ts | 9 +- .../extension-discovery.ts | 76 +- .../extension-installation-state-store.ts | 24 +- .../extension-loader/extension-loader.ts | 59 +- .../extension-registrator-injection-token.ts | 1 + packages/core/src/extensions/ipc/ipc-main.ts | 2 + .../core/src/extensions/ipc/ipc-registrar.ts | 4 +- .../core/src/extensions/ipc/ipc-renderer.ts | 4 +- .../core/src/extensions/lens-extension.ts | 16 +- .../src/extensions/lens-main-extension.ts | 1 + .../src/extensions/lens-renderer-extension.ts | 11 +- .../core/src/extensions/main-api/k8s-api.ts | 2 +- ...navigation-using-application-menu.test.tsx | 10 +- ...ation-menu-in-legacy-extension-api.test.ts | 10 +- .../application-menu/application-menu.test.ts | 3 +- ...g-of-orphan-application-menu-items.test.ts | 3 +- .../application-menu-item-injection-token.ts | 2 +- ...open-documentation-menu-item.injectable.ts | 4 +- .../open-support-item.injectable.ts | 4 +- .../about-menu-item.injectable.ts | 2 +- .../show-about.injectable.ts | 4 +- ...en-command-palette-menu-item.injectable.ts | 2 +- .../analytics-for-installing-update.test.ts | 12 +- ...tion-update-using-application-menu.test.ts | 18 +- .../check-for-updates-menu-item.injectable.ts | 2 +- ...alling-update-using-topbar-button.test.tsx | 24 +- .../update-button/update-button.tsx | 2 +- .../installing-update-using-tray.test.ts | 4 +- .../check-for-updates-tray-item.injectable.ts | 8 +- ...application-update-tray-item.injectable.ts | 8 +- .../force-update/force-update.test.ts | 16 +- .../periodical-checking-of-updates.test.ts | 8 +- .../selection-of-update-stability.test.ts | 31 +- .../discovered-update-version.injectable.ts | 22 +- .../progress-of-update-download.injectable.ts | 16 +- .../update-downloaded-date-time.injectable.ts | 19 +- .../update-is-being-downloaded.injectable.ts | 16 +- ...updates-are-being-discovered.injectable.ts | 16 +- .../downgrading-version-update.test.ts | 14 +- .../installing-update.test.ts | 8 +- .../check-for-platform-updates.test.ts | 4 +- .../download-platform-update.test.ts | 6 +- .../features/catalog/custom-columns.test.tsx | 12 +- .../features/catalog/entity-running.test.tsx | 22 +- .../catalog/opening-entity-details.test.tsx | 8 +- .../common/request-system-cas-token.ts | 2 +- .../darwin-request-system-cas.injectable.ts | 16 +- .../linux-request-system-cas.injectable.ts | 2 +- ...stem-cas.global-override-for-injectable.ts | 2 +- .../main/request-system-cas.injectable.ts | 2 +- .../win32-request-system-cas.injectable.ts | 13 +- .../main/request-deactivation.injectable.ts | 2 + .../connections/main/api-url.injectable.ts | 4 +- .../delete-cluster-dialog.test.tsx | 14 +- ...ages-when-cluster-is-not-relevant.test.tsx | 4 +- ...tems-when-cluster-is-not-relevant.test.tsx | 4 +- .../reactively-disable-cluster-pages.test.tsx | 4 +- ...tems-when-cluster-is-not-relevant.test.tsx | 11 +- ...vely-hide-kube-object-detail-item.test.tsx | 11 +- ...tems-when-cluster-is-not-relevant.test.tsx | 10 +- ...tively-hide-kube-object-menu-item.test.tsx | 10 +- ...uses-when-cluster-is-not-relevant.test.tsx | 10 +- ...eactively-hide-kube-object-status.test.tsx | 10 +- .../show-status-for-a-kube-object.test.tsx | 10 +- ...n-adding-cluster-frame-components.test.tsx | 4 +- .../edit-namespace-from-new-tab.test.tsx | 6 +- ...espace-from-previously-opened-tab.test.tsx | 12 +- .../refresh-accessibility-technical.test.ts | 24 +- ...debar-and-tab-navigation-for-core.test.tsx | 12 +- ...and-tab-navigation-for-extensions.test.tsx | 42 +- .../cluster/storage/cluster-storage.test.ts | 12 +- .../cluster/storage/common/add.injectable.ts | 15 +- .../storage/common/storage.injectable.ts | 20 +- .../visibility-of-sidebar-items.test.tsx | 4 +- .../cluster/workload-overview.test.tsx | 2 +- ...ails-when-cluster-is-not-relevant.test.tsx | 4 +- ...rder-of-workload-overview-details.test.tsx | 6 +- ...e-workloads-overview-details-item.test.tsx | 4 +- .../features/cluster/workloads/pods.test.tsx | 40 +- .../keyboard-shortcuts.test.tsx | 6 +- ...owing-settings-for-correct-entity.test.tsx | 2 +- ...-characters-in-page-registrations.test.tsx | 2 +- .../extensions/navigate/common/channel.ts | 2 +- .../navigation-using-application-menu.test.ts | 2 +- ...tom-helm-repository-in-preferences.test.ts | 22 +- ...epository-from-list-in-preferences.test.ts | 26 +- .../active-helm-repositories.injectable.ts | 4 +- .../adding-of-public-helm-repository.tsx | 4 +- ...est-public-helm-repositories.injectable.ts | 4 +- .../add-helm-repository.injectable.ts | 2 +- .../select-helm-repository.injectable.ts | 6 +- .../renderer/helm-repositories.tsx | 2 +- ...installing-helm-chart-from-new-tab.test.ts | 82 +- ...m-chart-from-previously-opened-tab.test.ts | 10 +- ...dock-tab-for-installing-helm-chart.test.ts | 14 +- ...e-helm-repositories-in-preferences.test.ts | 36 +- ...f-active-repository-in-preferences.test.ts | 20 +- .../upgrade-chart-new-tab.test.ts | 4 +- .../showing-details-for-helm-release.test.ts | 24 +- .../compute-display-label.injectable.ts | 2 +- .../features/hotbar/storage/common/hotbar.ts | 2 +- .../storage/main/5.0.0-alpha.2.injectable.ts | 2 +- .../storage/main/5.0.0-beta.10.injectable.ts | 8 +- .../storage/main/5.0.0-beta.5.injectable.ts | 2 +- .../hotbar/storage/storage-technical.test.ts | 10 +- .../route-with-sub-namespaces.test.tsx | 6 +- .../navigate-to-extension-page.test.tsx | 92 +- .../navigating-between-routes.test.tsx | 18 +- .../common/create.injectable.ts | 4 +- .../common/migrations.injectable.ts | 4 +- .../features/pod-logs/download-logs.test.tsx | 4 +- .../main/ipc-file-logger.test.ts | 13 +- .../population-of-logs-to-a-file.test.ts | 12 +- .../close-renderer-log-file-id.test.ts | 2 +- .../renderer/ipc-transport.injectable.ts | 10 +- .../renderer/ipc-transport.ts | 7 +- .../renderer-log-file-id.injectable.ts | 7 +- .../open-preferences-tray-item.injectable.ts | 6 +- .../preferences/closing-preferences.test.tsx | 6 +- .../extension-adding-preference-tabs.test.tsx | 2 +- ...gation-to-application-preferences.test.tsx | 6 +- .../navigation-to-editor-preferences.test.ts | 12 +- ...to-extension-specific-preferences.test.tsx | 37 +- ...vigation-to-kubernetes-preferences.test.ts | 10 +- .../navigation-to-proxy-preferences.test.ts | 12 +- ...vigation-to-telemetry-preferences.test.tsx | 10 +- ...navigation-to-terminal-preferences.test.ts | 12 +- .../navigation-using-application-menu.test.ts | 8 +- .../preferences/navigation-using-tray.test.ts | 10 +- .../app-preference-registration.ts | 4 +- .../discover-sync-kind.injectable.ts | 2 +- .../removable-item/removable-item.tsx | 2 +- .../urls-of-legacy-extensions.test.tsx | 6 +- ...ning-application-window-using-tray.test.ts | 7 +- ...ing-the-app-using-application-menu.test.ts | 2 +- .../resolve-system-proxy.test.ts | 18 +- .../reactively-disable-global-pages.test.tsx | 2 +- ...ironment.global-override-for-injectable.ts | 6 +- .../compute-shell-environment.injectable.ts | 10 +- ...ironment.global-override-for-injectable.ts | 6 +- ...mpute-unix-shell-environment.injectable.ts | 18 +- .../compute-unix-shell-environment.test.ts | 48 +- .../shell-sync/main/setup-shell.injectable.ts | 4 +- ...items-originating-from-extensions.test.tsx | 22 +- ...extendability-using-extension-api.test.tsx | 26 +- ...nu-item-originating-from-extension.test.ts | 10 +- .../tray/extension-adding-tray-items.test.tsx | 10 +- ...arators-originating-from-extension.test.ts | 8 +- .../preference-descriptors.injectable.ts | 4 +- .../common/preferences-helpers.ts | 9 +- ...-weblink.global-override-for-injectable.ts | 2 +- .../welcome/banners-from-extension.test.tsx | 4 +- .../navigation-using-application-menu.test.ts | 10 +- .../welcome/setting-welcome-page.test.tsx | 27 +- packages/core/src/jest.setup.tsx | 41 +- packages/core/src/jest.timezone.ts | 2 + .../core/src/main/__test__/cluster.test.ts | 4 +- .../src/main/__test__/kube-auth-proxy.test.ts | 31 +- .../main/__test__/kubeconfig-manager.test.ts | 12 +- .../main/__test__/prometheus-handler.test.ts | 6 +- .../main/__test__/static-file-route.test.ts | 2 +- .../get-electron-app-path.test.ts | 7 +- .../__test__/kubeconfig-sync.test.ts | 43 +- .../compute-diff.injectable.ts | 47 +- .../config-to-models.injectable.ts | 4 +- .../diff-changed-kubeconfig.injectable.ts | 4 +- .../watch-file-changes.injectable.ts | 10 +- .../broadcaster.injectable.ts | 2 +- .../__tests__/catalog-entity-registry.test.ts | 16 - .../detect-cluster-metadata.test.ts | 4 +- .../broadcast-connection-update.injectable.ts | 2 +- .../cluster/cluster-connection.injectable.ts | 66 +- .../load-proxy-kubeconfig.injectable.ts | 9 +- .../src/main/cluster/manager.injectable.ts | 4 +- packages/core/src/main/cluster/manager.ts | 35 +- .../prometheus-handler.injectable.ts | 4 +- .../prometheus-handler/prometheus-handler.ts | 21 +- .../request-api-resources.injectable.ts | 16 +- .../request-core-api-versions.injectable.ts | 6 +- ...quest-kube-api-resources-for.injectable.ts | 6 +- ...equest-non-core-api-versions.injectable.ts | 6 +- .../request-non-core-api-versions.test.ts | 16 +- .../3.6.0-beta.1.injectable.ts | 42 +- .../5.0.0-beta.10.injectable.ts | 7 +- .../cluster/update-entity-metadata.test.ts | 5 +- .../main/cluster/update-entity-spec.test.ts | 2 +- ...tron-app.global-override-for-injectable.ts | 6 +- ...n-dialog.global-override-for-injectable.ts | 6 +- .../features/show-message-popup.injectable.ts | 2 +- ...dock-for-first-opened-window.injectable.ts | 4 +- .../setup-deep-linking.injectable.ts | 16 +- .../setup-ipc-main-handlers.ts | 12 +- ...ables-after-window-is-opened.injectable.ts | 2 +- packages/core/src/main/getDiForUnitTesting.ts | 10 +- .../main/helm/__tests__/helm-service.test.ts | 20 +- .../helm/delete-helm-release.injectable.ts | 4 +- .../get-helm-env/get-helm-env.injectable.ts | 10 +- .../get-helm-release-history.injectable.ts | 22 +- .../get-helm-release-values.injectable.ts | 4 +- .../core/src/main/helm/helm-chart-manager.ts | 2 +- .../call-for-helm-manifest.injectable.ts | 12 +- ...r-kube-resources-by-manifest.injectable.ts | 4 +- .../exec-file-with-input.injectable.ts | 14 +- .../exec-file-with-input.test.ts | 37 +- .../get-helm-release-resources.injectable.ts | 6 +- .../get-helm-release-resources.test.ts | 16 +- .../get-helm-release.injectable.ts | 16 +- .../list-helm-charts.injectable.ts | 4 +- .../update-helm-release.injectable.ts | 8 +- .../helm/install-helm-chart.injectable.ts | 4 +- .../helm/list-helm-releases.injectable.ts | 10 +- .../add-helm-repository.injectable.ts | 6 +- ...get-active-helm-repositories.injectable.ts | 59 +- .../get-active-helm-repository.injectable.ts | 4 +- .../remove-helm-repository.injectable.ts | 6 +- .../helm/rollback-helm-release.injectable.ts | 2 +- packages/core/src/main/ipc/window.ts | 6 +- .../kubeconfig-manager/kubeconfig-manager.ts | 10 +- .../kubectl/apply-all-handler.injectable.ts | 2 +- .../kubectl/delete-all-handler.injectable.ts | 2 +- packages/core/src/main/kubectl/kubectl.ts | 14 +- .../core/src/main/lens-proxy/lens-proxy.ts | 14 +- .../kube-api-upgrade-request.injectable.ts | 4 +- .../core/src/main/logger/console-format.ts | 5 +- .../navigate-to-route.injectable.ts | 3 +- packages/core/src/main/prometheus/provider.ts | 4 +- .../protocol-handler/__test__/router.test.ts | 14 +- .../lens-protocol-router-main.ts | 10 +- .../main/resource-applier/resource-applier.ts | 12 +- .../create-handler-for-route.injectable.ts | 2 +- packages/core/src/main/router/route.ts | 18 +- packages/core/src/main/router/router.test.ts | 45 +- .../routes/files/development.injectable.ts | 4 +- .../install-chart-route.injectable.ts | 31 +- .../rollback-release-route.injectable.ts | 18 +- .../update-release-route.injectable.ts | 23 +- .../get-service-account-route.injectable.ts | 11 +- .../metrics/add-metrics-route.injectable.ts | 28 +- .../functionality/port-forward.ts | 6 +- ...t-current-port-forward-route.injectable.ts | 4 +- .../start-port-forward-route.injectable.ts | 4 +- ...p-current-port-forward-route.injectable.ts | 6 +- .../create-resource-route.injectable.ts | 8 +- .../patch-resource-route.injectable.ts | 48 +- .../local-shell-session.ts | 8 +- .../local-shell-session/techincal.test.ts | 6 +- .../node-shell-session/node-shell-session.ts | 10 +- .../modify-terminal-shell-env.injectable.ts | 2 +- .../src/main/shell-session/shell-session.ts | 12 +- .../session-certificate-verifier.test.ts | 4 +- .../create-electron-window.injectable.ts | 16 +- .../navigate-for-extension.injectable.ts | 9 +- .../initialize-extensions.injectable.ts | 7 +- .../channel-listener.injectable.ts | 3 +- .../runnables/setup-lens-proxy.injectable.ts | 9 +- .../electron-tray/electron-tray.injectable.ts | 4 +- .../about-app-tray-item.injectable.ts | 2 +- .../tray-menu-item-registrator.injectable.ts | 9 +- .../utils/get-port-from-stream.injectable.ts | 5 +- .../core/src/main/utils/http-responses.ts | 2 +- ...resolve-system-proxy-from-electron.test.ts | 10 +- ...y-window.global-override-for-injectable.ts | 2 +- .../entity/__tests__/metrics-enabled.test.ts | 2 +- .../renderer/api/catalog/entity/registry.ts | 29 +- .../core/src/renderer/api/terminal-api.ts | 2 +- .../core/src/renderer/api/websocket-api.ts | 2 +- .../runnables/listen-unload.injectable.ts | 2 +- .../setup-auto-registration.injectable.ts | 42 - ...es-cluster-context-menu-open.injectable.ts | 6 +- packages/core/src/renderer/bootstrap.tsx | 2 +- .../__tests__/cronjob.store.test.ts | 2 +- .../__tests__/daemonset.store.test.ts | 2 +- .../__tests__/deployments.store.test.ts | 2 +- .../components/__tests__/job.store.test.ts | 2 +- .../components/__tests__/pods.store.test.ts | 2 +- .../__tests__/replicaset.store.test.ts | 2 +- .../__tests__/statefulset.store.test.ts | 2 +- .../activate-entity-command.tsx | 2 +- .../components/add-cluster/add-cluster.tsx | 47 +- .../add-remove-buttons/add-remove-buttons.tsx | 2 +- .../components/catalog/catalog-add-button.tsx | 40 +- .../catalog-entity-store.injectable.ts | 4 +- .../renderer/components/catalog/catalog.tsx | 46 +- ...-named-category-column-cell.injectable.tsx | 7 +- .../entity-details/component.injectable.tsx | 2 +- .../on-catalog-click.injectable.ts | 2 +- .../catalog/entity-details/view.tsx | 7 +- .../catalog/get-label-badges.injectable.tsx | 6 +- .../renderer/components/chart/bar-chart.tsx | 4 +- .../src/renderer/components/chart/chart.tsx | 4 +- .../src/renderer/components/chart/options.ts | 18 +- .../renderer/components/chart/pie-chart.tsx | 7 +- .../components/chart/zebra-stripes.plugin.ts | 2 +- .../cluster-manager/cluster-frame-handler.ts | 7 +- .../cluster-manager/cluster-status.tsx | 2 +- .../cluster-manager/cluster-view.tsx | 4 +- .../cluster-local-terminal-settings.test.tsx | 14 +- .../__tests__/icon-settings.test.tsx | 8 +- .../cluster-settings/icon-settings.tsx | 21 +- ...l-terminal-setting-presenter.injectable.ts | 9 +- .../local-terminal-settings.tsx | 8 +- .../cluster-settings/prometheus-setting.tsx | 4 +- .../components/cluster/store.injectable.ts | 7 +- .../command-palette/command-container.tsx | 10 +- .../command-palette/command-dialog.tsx | 2 +- .../details.test.tsx | 9 +- .../details.tsx | 19 +- .../store.injectable.ts | 6 +- .../config-leases/lease-details.tsx | 11 +- .../components/config-leases/leases.tsx | 3 +- .../config-leases/store.injectable.ts | 6 +- .../limit-range-details.tsx | 7 +- .../config-limit-ranges/store.injectable.ts | 6 +- .../config-maps/config-map-details.tsx | 17 +- .../config-maps/store.injectable.ts | 6 +- ...-webhook-configuration-store.injectable.ts | 9 +- ...utating-webhook-configurations-details.tsx | 11 +- .../pod-distruption-budgets.test.tsx | 25 +- .../pod-disruption-budgets-details.tsx | 11 +- .../pod-disruption-budgets.tsx | 3 +- .../store.injectable.ts | 6 +- .../priority-classes-details.tsx | 17 +- .../priority-classes.tsx | 3 +- .../store.injectable.ts | 6 +- .../add-dialog/view.tsx | 3 +- .../resource-quota-details.tsx | 7 +- .../store.injectable.ts | 6 +- .../runtime-classes-details.tsx | 16 +- .../runtime-classes.tsx | 3 +- .../store.injectable.ts | 6 +- .../__tests__/secret-details.test.tsx | 2 +- .../config-secrets/add-dialog/view.tsx | 3 +- .../config-secrets/secret-details.tsx | 21 +- .../config-secrets/store.injectable.ts | 6 +- ...-webhook-configuration-store.injectable.ts | 6 +- ...idating-webhook-configurations-details.tsx | 17 +- .../store.injectable.ts | 6 +- .../vpa-details.tsx | 16 +- .../confirm-dialog/confirm-dialog.tsx | 61 +- .../custom-resource-definitions/details.tsx | 7 +- .../store.injectable.ts | 6 +- ...beconfig.global-override-for-injectable.ts | 6 +- .../components/delete-cluster-dialog/view.tsx | 4 +- .../components/dock/create-resource/store.ts | 3 +- .../user-templates.injectable.ts | 24 +- .../components/dock/create-resource/view.tsx | 11 +- .../dock/dock-tab-store/dock-tab.store.ts | 4 +- .../src/renderer/components/dock/dock-tab.tsx | 4 + .../components/dock/dock/store.injectable.ts | 2 +- .../renderer/components/dock/dock/store.ts | 78 +- .../edit-resource-model.injectable.tsx | 16 +- .../request-kube-resource.injectable.ts | 10 +- .../request-patch-kube-resource.injectable.ts | 8 +- .../renderer/components/dock/info-panel.tsx | 11 +- .../install-chart-model.injectable.tsx | 6 +- .../components/dock/install-chart/view.tsx | 2 +- .../components/dock/logs/controls.tsx | 2 +- .../dock/logs/download-all-logs.injectable.ts | 2 +- .../dock/logs/download-logs-dropdown.tsx | 14 +- .../renderer/components/dock/logs/list.tsx | 70 +- .../dock/logs/log-tab-data.validator.ts | 44 +- .../dock/logs/resource-selector.tsx | 4 +- .../renderer/components/dock/logs/search.tsx | 18 +- .../renderer/components/dock/logs/store.ts | 101 +- .../components/dock/logs/tab-store.ts | 4 +- .../renderer/components/dock/logs/view.tsx | 2 +- .../components/dock/terminal/dock-tab.tsx | 16 +- .../dock/terminal/send-command.injectable.ts | 2 +- .../components/dock/terminal/store.ts | 50 +- .../components/dock/terminal/terminal.ts | 2 +- .../components/dock/terminal/view.tsx | 4 +- .../upgrade-chart-model.injectable.ts | 10 +- .../components/dock/upgrade-chart/view.tsx | 2 +- .../editable-list/editable-list.tsx | 101 +- .../entity-settings/entity-settings.tsx | 7 +- .../components/events/event-details.tsx | 7 +- .../src/renderer/components/events/events.tsx | 2 + .../components/events/store.injectable.ts | 6 +- .../extensions/__tests__/extensions.test.tsx | 8 +- .../attempt-install-by-info.injectable.tsx | 17 +- .../attempt-install.injectable.tsx | 16 +- .../components/extensions/extensions.tsx | 2 +- .../get-base-registry-url.injectable.tsx | 4 +- ...nstall-extension-from-input.injectable.tsx | 4 +- .../components/extensions/install.tsx | 4 +- .../extensions/installed-extensions.tsx | 12 +- .../renderer/components/extensions/notice.tsx | 2 +- .../uninstall-extension.injectable.tsx | 2 +- .../components/file-picker/file-picker.tsx | 4 +- ...eadme-of-selected-helm-chart.injectable.ts | 2 +- .../helm-charts/helm-chart-details.tsx | 5 +- .../helm-releases/dialog/dialog.tsx | 3 +- .../release-details-content.tsx | 4 +- .../release-details-model.injectable.tsx | 6 +- ...equest-detailed-helm-release.injectable.ts | 10 +- .../components/helm-releases/release-menu.tsx | 2 +- .../helm-releases/removable-releases.ts | 2 +- .../components/hotbar/hotbar-entity-icon.tsx | 7 +- .../components/hotbar/hotbar-menu.tsx | 4 +- .../components/input/drop-file-input.tsx | 37 +- .../renderer/components/input/file-input.tsx | 111 +- .../src/renderer/components/input/input.tsx | 37 +- .../components/input/input_validators.ts | 6 +- .../components/input/search-input-url.tsx | 4 +- .../components/input/search-input.tsx | 40 +- .../components/item-object-list/content.tsx | 36 +- .../components/item-object-list/header.tsx | 4 +- .../item-object-list/list-layout.tsx | 21 +- .../item-object-list/page-filters/store.ts | 2 +- .../get-details-url.injectable.ts | 2 +- ...kube-object-detail-item-injection-token.ts | 5 +- ...ics-kube-object-detail-item.injectable.tsx | 9 +- .../kube-object-list-layout.test.tsx | 2 +- .../kube-object-menu.test.tsx | 20 +- .../kube-object-menu/kube-object-menu.tsx | 16 +- .../on-context-menu-open.injectable.ts | 5 +- .../kubeconfig-dialog/kubeconfig-dialog.tsx | 3 +- .../kubeconfig-dialog/open.injectable.ts | 10 +- .../components/layout/close-button.tsx | 3 +- .../components/layout/cluster-page-menu.ts | 4 +- .../components/layout/setting-layout.tsx | 14 +- .../components/layout/sidebar-cluster.tsx | 9 +- .../renderer/components/layout/tab-layout.tsx | 2 +- .../navigation-to-back/navigation-to-back.tsx | 4 +- .../navigation-to-forward.tsx | 4 +- .../window-controls/window-controls.tsx | 12 +- .../components/layout/top-bar/top-bar.tsx | 4 +- .../components/layout/wizard-layout.tsx | 2 +- .../line-progress/line-progress.tsx | 2 +- .../src/renderer/components/list/list.tsx | 8 +- .../renderer/components/menu/menu-actions.tsx | 11 +- .../src/renderer/components/menu/menu.tsx | 65 +- .../monaco-editor/__mocks__/monaco-editor.tsx | 2 +- .../monaco-editor/monaco-editor.tsx | 9 +- .../namespaces/add-dialog/dialog.tsx | 13 +- .../namespaces/namespace-details.tsx | 19 +- ...ext-menu-overriding-listener.injectable.ts | 2 +- .../namespace-select-filter.test.tsx | 2 +- .../namespaces/namespace-select-filter.tsx | 2 +- .../namespaces/namespace-select.tsx | 2 + .../namespaces/namespace-store.test.ts | 4 +- .../namespaces/namespace-tree-view.test.tsx | 2 +- .../components/namespaces/store.injectable.ts | 6 +- .../network-endpoints/endpoint-details.tsx | 7 +- .../endpoint-subset-list.tsx | 6 +- .../network-endpoints/store.injectable.ts | 6 +- .../ingress-class-details.tsx | 77 +- .../ingress-class-menu.injectable.tsx | 3 +- .../ingress-class-store.injectable.ts | 7 +- .../network-ingresses/ingress-details.tsx | 9 +- .../ingress-store.injectable.ts | 6 +- .../__tests__/network-policy-details.test.tsx | 2 +- .../network-policy-details.tsx | 7 +- .../network-policies/store.injectable.ts | 6 +- .../port-forward-menu.tsx | 10 +- .../network-port-forwards/port-forwards.tsx | 3 +- .../network-services/service-details.tsx | 9 +- .../service-port-component.tsx | 26 +- .../network-services/store.injectable.ts | 6 +- .../src/renderer/components/nodes/details.tsx | 14 +- .../renderer/components/nodes/node-charts.tsx | 9 +- .../components/nodes/store.injectable.ts | 6 +- .../notifications/notifications.tsx | 10 +- .../pod-security-policy-details.tsx | 7 +- .../pod-security-policies/store.injectable.ts | 6 +- .../src/renderer/components/radio/radio.tsx | 14 +- .../__tests__/render-delay.test.tsx | 2 +- .../components/select/select.test.tsx | 11 +- .../src/renderer/components/select/select.tsx | 4 +- .../src/renderer/components/slider/slider.tsx | 2 +- .../renderer/components/spinner/spinner.tsx | 24 +- .../status-bar-item-injection-token.ts | 2 +- .../status-bar-items.injectable.tsx | 3 +- .../status-bar/status-bar-registration.ts | 7 +- .../components/status-bar/status-bar.test.tsx | 26 +- .../components/status-bar/status-bar.tsx | 13 +- .../renderer/components/stepper/stepper.tsx | 54 +- .../storage-classes/storage-class-details.tsx | 9 +- .../storage-classes/store.injectable.ts | 6 +- .../storage-volume-claims/store.injectable.ts | 6 +- .../volume-claim-details.tsx | 7 +- .../volume-claim-disk-chart.tsx | 9 +- .../storage-volumes/store.injectable.ts | 6 +- .../storage-volumes/volume-details.tsx | 7 +- .../components/switch/form-switcher.tsx | 2 +- .../renderer/components/table/table-cell.tsx | 6 +- .../renderer/components/table/table-row.tsx | 6 +- .../src/renderer/components/table/table.tsx | 6 +- .../src/renderer/components/tabs/tabs.tsx | 9 +- .../test-utils/get-application-builder.tsx | 87 +- .../components/tree-view/tree-view.tsx | 2 +- .../__tests__/dialog.test.tsx | 2 +- .../cluster-role-bindings/details.tsx | 24 +- .../cluster-role-bindings/dialog/view.tsx | 3 +- .../cluster-role-bindings/store.injectable.ts | 6 +- .../cluster-roles/add-dialog/view.tsx | 6 +- .../user-management/cluster-roles/details.tsx | 16 +- .../cluster-roles/store.injectable.ts | 6 +- .../role-bindings/__tests__/dialog.test.tsx | 2 +- .../user-management/role-bindings/details.tsx | 22 +- .../role-bindings/dialog/view.tsx | 3 +- .../role-bindings/store.injectable.ts | 6 +- .../user-management/roles/add-dialog/view.tsx | 5 +- .../user-management/roles/details.tsx | 16 +- .../user-management/roles/store.injectable.ts | 6 +- .../service-accounts/create-dialog/view.tsx | 5 +- .../service-accounts/details.tsx | 17 +- .../service-accounts/store.injectable.ts | 6 +- .../virtual-list/virtual-list.test.tsx | 6 +- .../renderer/components/welcome/welcome.tsx | 2 +- .../src/renderer/components/wizard/wizard.tsx | 30 +- .../workloads-cronjobs/cron-job-menu.tsx | 2 +- .../workloads-cronjobs/cronjob-details.tsx | 7 +- .../workloads-cronjobs/store.injectable.ts | 6 +- .../trigger-dialog/view.tsx | 3 +- .../daemonset-details.tsx | 7 +- .../workloads-daemonsets/daemonset-menu.tsx | 2 +- .../workloads-daemonsets/store.injectable.ts | 6 +- .../deployment-details.tsx | 9 +- .../workloads-deployments/deployment-menu.tsx | 2 +- .../workloads-deployments/scale/dialog.tsx | 3 +- .../workloads-deployments/store.injectable.ts | 6 +- .../components/workloads-jobs/job-details.tsx | 7 +- .../workloads-jobs/store.injectable.ts | 6 +- .../workloads-overview/overview-statuses.tsx | 35 +- .../workloads-overview/overview.tsx | 2 +- ...orkload-overview-detail-injection-token.ts | 2 +- .../workloads-overview-detail-registration.ts | 8 +- .../__tests__/pod-container-env.test.tsx | 4 +- .../workloads-pods/container-charts.tsx | 9 +- ...oad-pods-from-all-namespaces.injectable.ts | 7 +- .../workloads-pods/pod-container-env.tsx | 8 +- .../workloads-pods/pod-container-port.tsx | 19 +- .../workloads-pods/pod-details-container.tsx | 2 +- .../workloads-pods/pod-details-list.tsx | 4 +- .../components/workloads-pods/pod-details.tsx | 7 +- .../components/workloads-pods/secret-key.tsx | 38 +- .../workloads-pods/store.injectable.ts | 8 +- .../replica-set-menu.tsx | 4 +- .../replicaset-details.tsx | 7 +- .../scale-dialog/dialog.tsx | 3 +- .../workloads-replicasets/store.injectable.ts | 6 +- .../replication-controller-details.tsx | 32 +- ...replication-controller-store.injectable.ts | 6 +- .../workloads-statefulsets/scale/dialog.tsx | 3 +- .../statefulset-details.tsx | 7 +- .../statefulset-menu.tsx | 2 +- .../store.injectable.ts | 6 +- ...rame-layout-child-component.injectable.tsx | 2 +- .../cluster-frame/cluster-frame.test.tsx | 2 +- .../init-cluster-frame/init-cluster-frame.ts | 5 +- .../frame-application-root.injectable.ts | 26 +- .../root-frame/init-root-frame.injectable.ts | 7 +- .../core/src/renderer/getDiForUnitTesting.tsx | 5 +- .../add-sync-entries.injectable.tsx | 2 +- .../renderer/initializers/workload-events.tsx | 6 +- packages/core/src/renderer/ipc/index.ts | 24 +- .../renderer/kube-watch-api/kube-watch-api.ts | 6 +- .../create-page-param.injectable.ts | 6 +- .../navigation-channel-listener.injectable.ts | 2 +- .../src/renderer/navigation/page-param.ts | 58 +- .../open-port-forward.injectable.ts | 2 +- .../port-forward/port-forward-dialog.tsx | 8 +- .../port-forward-store/port-forward-store.ts | 80 +- .../request-active-port-forward.injectable.ts | 2 +- .../bind-protocol-add-route-handlers.tsx | 2 +- .../lens-protocol-router-renderer.tsx | 46 +- .../extension-page-parameters.injectable.ts | 45 +- ...extension-route-registrator.injectable.tsx | 4 +- ...et-extension-page-parameters.injectable.ts | 4 +- .../routes/navigate-to-route.injectable.ts | 5 +- .../src/renderer/routes/page-registration.ts | 41 +- ...oute-specific-component-injection-token.ts | 2 +- .../src/renderer/search-store/search-store.ts | 84 +- .../utils/__tests__/storage-helper.test.ts | 14 +- .../initialize-state.injectable.ts | 14 +- .../core/src/renderer/utils/storage-helper.ts | 4 +- .../window/event-listener.injectable.ts | 23 - .../core/src/test-utils/mock-interface.ts | 4 +- .../core/src/test-utils/mock-responses.ts | 24 +- .../src/test-utils/override-fs-with-fakes.ts | 52 +- packages/core/tsconfig.json | 2 +- packages/core/types/font-face.d.ts | 2 +- packages/core/types/react-table.config.d.ts | 2 +- packages/core/types/selfsigned.d.ts | 4 +- .../ui-components/animate/src/animate.tsx | 2 +- packages/ui-components/icon/src/icon.tsx | 8 +- .../ui-components/tooltip/src/withTooltip.tsx | 1 + .../event-emitter/src/event-emitter.ts | 4 +- .../utility-features/json-api/src/json-api.ts | 14 +- .../kube-api-specifics/src/token.ts | 19 +- .../utility-features/kube-api/src/kube-api.ts | 59 +- packages/utility-features/utilities/index.ts | 1 + .../utilities/src/add-event-listener.ts | 16 + .../utility-features/utilities/src/array.ts | 10 + .../utilities/src/backoff-caller.ts | 2 +- .../utility-features/utilities/src/json.ts | 14 +- .../utilities/src/prevDefault.ts | 4 +- .../utility-features/utilities/src/result.ts | 34 +- .../utilities/src/type-narrowing.ts | 13 +- 734 files changed, 32216 insertions(+), 4566 deletions(-) delete mode 100644 packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts delete mode 100644 packages/core/src/renderer/before-frame-starts/runnables/setup-auto-registration.injectable.ts delete mode 100644 packages/core/src/renderer/window/event-listener.injectable.ts create mode 100644 packages/utility-features/utilities/src/add-event-listener.ts diff --git a/docs/extensions/guides/renderer-extension.md b/docs/extensions/guides/renderer-extension.md index 4cc6e338bf..0f2c64d46c 100644 --- a/docs/extensions/guides/renderer-extension.md +++ b/docs/extensions/guides/renderer-extension.md @@ -95,7 +95,7 @@ The properties of the `clusterPages` array objects are defined as follows: - `id` is a string that identifies the page. - `components` matches the `PageComponents` interface for which there is one field, `Page`. -- `Page` is of type ` React.ComponentType`. +- `Page` is of type ` React.ComponentType>`. It offers flexibility in defining the appearance and behavior of your page. `ExamplePage` in the example above can be defined in `page.tsx`: @@ -304,7 +304,7 @@ The properties of the `globalPages` array objects are defined as follows: - `id` is a string that identifies the page. - `components` matches the `PageComponents` interface for which there is one field, `Page`. -- `Page` is of type `React.ComponentType`. +- `Page` is of type `React.ComponentType>`. It offers flexibility in defining the appearance and behavior of your page. `HelpPage` in the example above can be defined in `page.tsx`: diff --git a/package-lock.json b/package-lock.json index 6e799353ee..c8d727861b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3016,19 +3016,6 @@ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hapi/topo/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, "node_modules/@hapi/vise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", @@ -6530,29 +6517,6 @@ "jest-runtime": ">=28" } }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/address/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, "node_modules/@sigstore/protobuf-specs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", @@ -19164,23 +19128,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, "node_modules/jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", @@ -35916,5 +35863,27935 @@ "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", "dev": true } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@astronautlabs/jsonpath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@astronautlabs/jsonpath/-/jsonpath-1.1.0.tgz", + "integrity": "sha512-I4sckUQNYEeF4w6AkujiRblVzC0jo3ja+bxKHB1M2aFiaBjevSGlBdgZ80PgCX5sj65/AhKSFN9+cT908avBlQ==", + "requires": { + "@types/esprima": "^4.0.2", + "@types/mkdirp": "^1.0.0", + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "^1.12.1" + } + }, + "@async-fn/jest": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@async-fn/jest/-/jest-1.6.4.tgz", + "integrity": "sha512-m3T/m6a39f5dbqFj79BGCqudkm42McgMXD7M0ZorKeqqdAbNazay7t+VDOz5qqFHO12frFbbhAB5GnFPoGADPA==", + "requires": {} + }, + "@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==" + }, + "@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", + "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", + "peer": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "peer": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "@babel/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "requires": { + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "peer": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "requires": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", + "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "peer": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "requires": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "peer": true, + "requires": { + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "requires": { + "@babel/types": "^7.21.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "peer": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "peer": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" + }, + "@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "peer": true, + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, + "@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "peer": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", + "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.21.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "peer": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "peer": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", + "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", + "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "peer": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", + "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-flow": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", + "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "peer": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "peer": true, + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "peer": true, + "requires": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "peer": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "peer": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "peer": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", + "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "peer": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "peer": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", + "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "peer": true, + "requires": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.21.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "peer": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "peer": true + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" + }, + "@electron/get": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", + "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "@electron/rebuild": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.13.tgz", + "integrity": "sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.0.0", + "node-api-version": "^0.1.4", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@electron/universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", + "integrity": "sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^1.1.0", + "asar": "^3.1.0", + "debug": "^4.3.1", + "dir-compare": "^2.4.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "dependencies": { + "@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + } + } + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "@emotion/cache": { + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", + "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "dev": true, + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "dev": true + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dev": true, + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "dev": true + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + } + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "dev": true + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "dev": true + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "dev": true, + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "dev": true + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "dev": true + }, + "@esbuild/android-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==" + }, + "@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==" + }, + "@floating-ui/core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", + "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==", + "dev": true + }, + "@floating-ui/dom": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.7.tgz", + "integrity": "sha512-DyqylONj1ZaBnzj+uBnVfzdjjCkFCL2aA9ESHLyUOGSqb03RpbLMImP1ekIQXYs4KLk9jAjJfZAU8hXfWSahEg==", + "dev": true, + "requires": { + "@floating-ui/core": "^1.2.6" + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "requires": { + "@hapi/hoek": "9.x.x" + }, + "dependencies": { + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/boom": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", + "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", + "requires": { + "@hapi/hoek": "^11.0.2" + } + }, + "@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "@hapi/call": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@hapi/call/-/call-9.0.1.tgz", + "integrity": "sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg==", + "requires": { + "@hapi/boom": "^10.0.1", + "@hapi/hoek": "^11.0.2" + } + }, + "@hapi/content": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz", + "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==", + "requires": { + "@hapi/boom": "9.x.x" + }, + "dependencies": { + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz", + "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==" + }, + "@hapi/hoek": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", + "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==" + }, + "@hapi/nigel": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.2.tgz", + "integrity": "sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw==", + "requires": { + "@hapi/hoek": "^9.0.4", + "@hapi/vise": "^4.0.0" + }, + "dependencies": { + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/pez": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.1.0.tgz", + "integrity": "sha512-YfB0btnkLB3lb6Ry/1KifnMPBm5ZPfaAHWFskzOMAgDgXgcBgA+zjpIynyEiBfWEz22DBT8o1e2tAaBdlt8zbw==", + "requires": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/content": "^5.0.2", + "@hapi/hoek": "9.x.x", + "@hapi/nigel": "4.x.x" + }, + "dependencies": { + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/subtext": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.1.0.tgz", + "integrity": "sha512-n94cU6hlvsNRIpXaROzBNEJGwxC+HA69q769pChzej84On8vsU14guHDub7Pphr/pqn5b93zV3IkMPDU5AUiXA==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/content": "^5.0.2", + "@hapi/file": "2.x.x", + "@hapi/hoek": "9.x.x", + "@hapi/pez": "^5.1.0", + "@hapi/wreck": "17.x.x" + }, + "dependencies": { + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/vise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", + "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==", + "requires": { + "@hapi/hoek": "9.x.x" + }, + "dependencies": { + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@hapi/wreck": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.2.0.tgz", + "integrity": "sha512-pJ5kjYoRPYDv+eIuiLQqhGon341fr2bNIYZjuotuPJG/3Ilzr/XtI+JAp0A86E2bYfsS3zBPABuS2ICkaXFT8g==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/hoek": "9.x.x" + }, + "dependencies": { + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "requires": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "@jest/create-cache-key-function": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", + "integrity": "sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "requires": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + } + }, + "@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "requires": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + } + }, + "@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "requires": { + "jest-get-type": "^29.4.3" + } + }, + "@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "requires": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + } + }, + "@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "requires": { + "@sinclair/typebox": "^0.25.16" + } + }, + "@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "requires": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "requires": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + } + }, + "@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "requires": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } + } + }, + "@k8slens/application": { + "version": "file:packages/technical-features/application/agnostic", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/application-for-electron-main": { + "version": "file:packages/technical-features/application/electron-main", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@ogre-tools/test-utils": "^15.8.1" + }, + "dependencies": { + "@ogre-tools/test-utils": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/test-utils/-/test-utils-15.8.1.tgz", + "integrity": "sha512-ww+wURUaKX4/yWzrAFX237PuFERoFVQZ5J1D3WC0u097tgKEVx6kxi0buyhbqBMlpCRkIr9gK+1xSdbx9ZDr+Q==", + "dev": true, + "requires": {} + } + } + }, + "@k8slens/button": { + "version": "file:packages/ui-components/button", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.0", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^12.8.3" + }, + "dependencies": { + "@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + } + } + }, + "@k8slens/cluster-settings": { + "version": "file:packages/cluster-settings", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "rimraf": "^4.4.1" + } + }, + "@k8slens/computed-channel": { + "version": "file:packages/technical-features/messaging/computed-channel", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/messaging-fake-bridge": "^1.0.0-alpha.3", + "@k8slens/webpack": "^6.5.0-alpha.4", + "type-fest": "^2.14.0" + } + }, + "@k8slens/core": { + "version": "file:packages/core", + "requires": { + "@astronautlabs/jsonpath": "^1.1.0", + "@async-fn/jest": "1.6.4", + "@hapi/call": "^9.0.1", + "@hapi/subtext": "^7.1.0", + "@k8slens/list-layout": "^1.0.0-alpha.1", + "@k8slens/messaging-fake-bridge": "^1.0.0-alpha.3", + "@k8slens/metrics": "^6.5.0-alpha.4", + "@k8slens/node-fetch": "^6.5.0-alpha.3", + "@k8slens/react-application": "^1.0.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.3", + "@k8slens/resource-templates": "^1.0.0-alpha.0", + "@kubernetes/client-node": "^0.18.1", + "@material-ui/core": "^4.12.3", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.60", + "@material-ui/styles": "^4.11.5", + "@ogre-tools/linkable": "^15.8.1", + "@sentry/electron": "^3.0.8", + "@sentry/integrations": "^6.19.3", + "@sentry/types": "^6.19.7", + "@side/jest-runtime": "^1.1.0", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@swc/jest": "^0.2.26", + "@testing-library/dom": "^8.19.0", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^13.5.0", + "@types/byline": "^4.2.33", + "@types/chart.js": "^2.9.36", + "@types/circular-dependency-plugin": "5.0.5", + "@types/color": "^3.0.3", + "@types/command-line-args": "^5.2.0", + "@types/crypto-js": "^3.1.47", + "@types/dompurify": "^2.4.0", + "@types/electron-devtools-installer": "^2.2.1", + "@types/fs-extra": "^9.0.13", + "@types/glob-to-regexp": "^0.4.1", + "@types/hapi__call": "^9.0.0", + "@types/hapi__subtext": "^7.0.0", + "@types/http-proxy": "^1.17.11", + "@types/jest": "^29.5.0", + "@types/js-yaml": "^4.0.5", + "@types/lodash": "^4.14.191", + "@types/marked": "^4.3.0", + "@types/md5-file": "^4.0.2", + "@types/memorystream": "^0.3.0", + "@types/mock-fs": "^4.13.1", + "@types/node": "^16.18.25", + "@types/proper-lockfile": "^4.1.2", + "@types/randomcolor": "^0.5.7", + "@types/react": "^17.0.45", + "@types/react-beautiful-dnd": "^13.1.4", + "@types/react-dom": "^17.0.16", + "@types/react-router": "^5.1.19", + "@types/react-router-dom": "^5.3.3", + "@types/react-table": "^7.7.14", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", + "@types/readable-stream": "^2.3.13", + "@types/semver": "^7.3.13", + "@types/stoppable": "^1.1.1", + "@types/tar": "^6.1.4", + "@types/tcp-port-used": "^1.0.1", + "@types/triple-beam": "^1.3.2", + "@types/url-parse": "^1.4.8", + "@types/uuid": "^8.3.4", + "@types/webpack": "^5.28.1", + "@types/webpack-dev-server": "^4.7.2", + "@types/webpack-env": "^1.18.0", + "@types/webpack-node-externals": "^2.5.3", + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "adr": "^1.4.3", + "ansi_up": "^5.2.1", + "auto-bind": "^4.0.0", + "await-lock": "^2.2.2", + "byline": "^5.0.0", + "chalk": "^4.1.2", + "chart.js": "^2.9.4", + "chokidar": "^3.5.3", + "circular-dependency-plugin": "^5.2.2", + "color": "^3.2.1", + "command-line-args": "^5.2.1", + "concurrently": "^7.6.0", + "conf": "^10.2.0", + "cross-env": "^7.0.3", + "crypto-js": "^4.1.1", + "css-loader": "^6.7.3", + "deepdash": "^5.3.9", + "dompurify": "^2.4.4", + "electron": "^22.3.7", + "electron-builder": "^23.6.0", + "electron-devtools-installer": "^3.2.0", + "electron-updater": "^4.6.5", + "electron-window-state": "^5.0.3", + "esbuild": "^0.17.8", + "esbuild-loader": "^2.21.0", + "eslint": "^8.39.0", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-unused-imports": "^2.0.0", + "filehound": "^1.17.6", + "fork-ts-checker-webpack-plugin": "^7.3.0", + "fs-extra": "^9.0.1", + "glob-to-regexp": "^0.4.1", + "grapheme-splitter": "^1.0.4", + "handlebars": "^4.7.7", + "history": "^4.10.1", + "hpagent": "^1.2.0", + "http-proxy": "^1.18.1", + "identity-obj-proxy": "^3.0.0", + "ignore-loader": "^0.1.2", + "immer": "^9.0.21", + "include-media": "^1.4.9", + "jest": "^29.5.0", + "jest-canvas-mock": "^2.3.1", + "jest-environment-jsdom": "^28.1.3", + "jest-mock-extended": "^2.0.9", + "js-yaml": "^4.1.0", + "lodash": "^4.17.15", + "make-plural": "^6.2.2", + "marked": "^4.2.12", + "md5-file": "^5.0.0", + "memfs": "^3.5.1", + "memorystream": "^0.3.1", + "mini-css-extract-plugin": "^2.7.2", + "mobx": "^6.8.0", + "mobx-observable-history": "^2.0.3", + "mobx-react": "^7.6.0", + "mobx-utils": "^6.0.4", + "mock-http": "^1.1.0", + "moment": "^2.29.4", + "moment-timezone": "^0.5.40", + "monaco-editor": "^0.37.1", + "monaco-editor-webpack-plugin": "^7.0.1", + "node-gyp": "^8.3.0", + "node-loader": "^2.0.0", + "node-pty": "0.10.1", + "nodemon": "^2.0.20", + "npm": "^8.19.3", + "p-limit": "^3.1.0", + "path-to-regexp": "^6.2.0", + "postcss": "^8.4.23", + "postcss-loader": "^6.2.1", + "proper-lockfile": "^4.1.2", + "query-string": "^7.1.3", + "randomcolor": "^0.6.2", + "react": "^17.0.2", + "react-beautiful-dnd": "^13.1.1", + "react-dom": "^17.0.2", + "react-material-ui-carousel": "^2.3.11", + "react-refresh": "^0.14.0", + "react-refresh-typescript": "^2.0.7", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-select": "^5.7.0", + "react-select-event": "^5.5.1", + "react-table": "^7.8.0", + "react-virtualized-auto-sizer": "^1.0.7", + "react-window": "^1.8.8", + "readable-stream": "^3.6.0", + "rfc6902": "^5.0.1", + "rimraf": "^4.4.1", + "sass": "^1.62.1", + "sass-loader": "^12.6.0", + "selfsigned": "^2.1.1", + "semver": "^7.3.8", + "stoppable": "^1.1.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.3.2", + "tar": "^6.1.13", + "tcp-port-used": "^1.0.2", + "tempy": "1.0.1", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", + "type-fest": "^2.14.0", + "typed-emitter": "^1.4.0", + "typed-regex": "^0.0.8", + "typedoc": "^0.24.6", + "typedoc-plugin-markdown": "^3.15.1", + "typescript": "^4.9.5", + "typescript-plugin-css-modules": "^3.4.0", + "url-parse": "^1.5.10", + "uuid": "^8.3.2", + "webpack": "^5.81.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.13.3", + "webpack-node-externals": "^3.0.0", + "win-ca": "^3.5.0", + "winston": "^3.8.2", + "winston-transport-browserconsole": "^1.0.5", + "ws": "^8.12.1", + "xterm": "^4.19.0", + "xterm-addon-fit": "^0.7.0", + "xterm-link-provider": "^1.3.1", + "zod": "^3.21.4" + }, + "dependencies": { + "xterm": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", + "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==", + "dev": true + } + } + }, + "@k8slens/ensure-binaries": { + "version": "file:packages/ensure-binaries", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@types/cli-progress": "^3.11.0", + "@types/gunzip-maybe": "^1.4.0", + "@types/node": "^16.18.25", + "@types/semver": "^7.3.13", + "@types/tar-stream": "^2.2.2", + "arg": "^5.0.2", + "cli-progress": "^3.11.2", + "gunzip-maybe": "^1.4.2", + "node-fetch": "^3.3.0", + "rimraf": "^4.4.1", + "tar-stream": "^3.0.0", + "zod": "^3.20.6" + }, + "dependencies": { + "node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + } + } + }, + "@k8slens/error-boundary": { + "version": "file:packages/ui-components/error-boundary", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.0", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^13.5.0" + } + }, + "@k8slens/eslint-config": { + "version": "file:packages/infrastructure/eslint-config", + "requires": {} + }, + "@k8slens/event-emitter": { + "version": "file:packages/utility-features/event-emitter", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/jest": "^6.5.0-alpha.4", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "6.5.0-alpha.4" + } + }, + "@k8slens/extensions": { + "version": "file:packages/extension-api", + "requires": { + "@k8slens/core": "6.5.0-alpha.8", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@types/node": "^16.18.25", + "@types/webpack": "^5.28.1", + "@types/webpack-env": "^1.18.0", + "@types/webpack-node-externals": "2.5.3", + "css-loader": "^6.7.2", + "node-loader": "^2.0.0", + "rimraf": "^4.4.1", + "style-loader": "^3.3.1", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", + "typed-emitter": "^2.1.0", + "typedoc": "^0.24.6", + "typedoc-plugin-markdown": "^3.15.1", + "typescript": "^4.9.5", + "typescript-plugin-css-modules": "^4.1.1", + "webpack": "^5.81.0", + "webpack-cli": "^5.0.1" + }, + "dependencies": { + "@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz", + "integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==", + "dev": true, + "requires": {} + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "stylus": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", + "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.0.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + } + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "requires": { + "rxjs": "*" + } + }, + "typescript-plugin-css-modules": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-4.2.3.tgz", + "integrity": "sha512-jEEP2oUPOqR89QGgvPK2HSTZLkrCeKZQ9EwiNxm9VUcufUbNY1Tv053fPKRq6c13PMQjlBU3WrQjKN8u0j5Y6w==", + "dev": true, + "requires": { + "@types/postcss-modules-local-by-default": "^4.0.0", + "@types/postcss-modules-scope": "^3.0.1", + "dotenv": "^16.0.3", + "icss-utils": "^5.1.0", + "less": "^4.1.3", + "lodash.camelcase": "^4.3.0", + "postcss": "^8.4.21", + "postcss-load-config": "^3.1.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "reserved-words": "^0.1.2", + "sass": "^1.58.3", + "source-map-js": "^1.0.2", + "stylus": "^0.59.0", + "tsconfig-paths": "^4.1.2" + }, + "dependencies": { + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + } + } + }, + "webpack-cli": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + } + } + } + }, + "@k8slens/feature-core": { + "version": "file:packages/technical-features/feature-core", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/generate-tray-icons": { + "version": "file:packages/generate-tray-icons", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@types/jsdom": "^20.0.1", + "@types/node": "^16.18.25", + "@types/sharp": "^0.31.1", + "arg": "^5.0.2", + "jsdom": "^21.1.0", + "rimraf": "^4.4.1", + "sharp": "^0.32.1" + }, + "dependencies": { + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "sharp": { + "version": "https://registry.npmjs.org/sharp/-/sharp-0.32.0.tgz", + "integrity": "sha512-yLAypVcqj1toSAqRSwbs86nEzfyZVDYqjuUX8grhFpeij0DDNagKJXELS/auegDBRDg1XBtELdOGfo2X1cCpeA==", + "requires": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^6.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.8", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + } + } + } + }, + "@k8slens/jest": { + "version": "file:packages/infrastructure/jest", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@swc/jest": "^0.2.26", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^12.1.5", + "@types/jest": "^29.2.2", + "identity-obj-proxy": "^3.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "jest-watch-select-projects": "^2.0.0", + "jest-watch-typeahead": "^2.2.1", + "lodash": "^4.17.21", + "ts-jest": "^29.0.3" + }, + "dependencies": { + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "jest-environment-jsdom": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", + "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", + "jsdom": "^20.0.0" + } + }, + "jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "@k8slens/keyboard-shortcuts": { + "version": "file:packages/business-features/keyboard-shortcuts", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.3", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/kube-object": { + "version": "file:packages/kube-object", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/jest": "^6.5.0-alpha.4", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "6.5.0-alpha.4" + } + }, + "@k8slens/kubectl-versions": { + "version": "file:packages/kubectl-versions", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "fast-xml-parser": "^4.2.2", + "semver": "^7.3.8", + "ts-node": "^10.9.1", + "typed-regex": "^0.0.8" + } + }, + "@k8slens/legacy-extension-example": { + "version": "file:packages/legacy-extension-example", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/extensions": "^6.5.0-alpha.8", + "@types/node": "^16.18.25", + "typescript": "^4.9.5", + "webpack": "^5.81.0", + "webpack-cli": "^5.0.1" + }, + "dependencies": { + "@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.2.tgz", + "integrity": "sha512-S9h3GmOmzUseyeFW3tYNnWS7gNUuwxZ3mmMq0JyW78Vx1SGKPSkt5bT4pB0rUnVfHjP0EL9gW2bOzmtiTfQt0A==", + "dev": true, + "requires": {} + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, + "webpack-cli": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + } + } + } + }, + "@k8slens/legacy-extensions": { + "version": "file:packages/technical-features/application/legacy-extensions", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/legacy-global-di": { + "version": "file:packages/legacy-global-di", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/jest": "^6.5.0-alpha.4", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "6.5.0-alpha.4" + } + }, + "@k8slens/list-layout": { + "version": "file:packages/list-layout", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/jest": "^6.5.0-alpha.4", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/messaging": { + "version": "file:packages/technical-features/messaging/agnostic", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/messaging-fake-bridge": { + "version": "file:packages/technical-features/messaging/message-bridge-fake", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/messaging-for-main": { + "version": "file:packages/technical-features/messaging/electron/main", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/messaging-for-renderer": { + "version": "file:packages/technical-features/messaging/electron/renderer", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/metrics": { + "version": "file:packages/metrics", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/jest": "^6.5.0-alpha.4", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/node-fetch": { + "version": "file:packages/node-fetch", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "node-fetch": "^3.3.0", + "rimraf": "^4.4.1" + }, + "dependencies": { + "node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + } + } + }, + "@k8slens/react-application": { + "version": "file:packages/technical-features/react-application", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.3", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@testing-library/react": "^12.1.5" + } + }, + "@k8slens/react-testing-library-discovery": { + "version": "file:packages/utility-features/react-testing-library-discovery", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2" + } + }, + "@k8slens/release-tool": { + "version": "file:packages/release-tool", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@types/inquirer": "^9.0.3", + "@types/node": "^16.18.25", + "@types/semver": "^7.3.13", + "chalk": "^5.2.0", + "inquirer": "^9.2.0", + "rimraf": "^4.4.1", + "semver": "^7.3.8" + }, + "dependencies": { + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + } + } + }, + "@k8slens/resizing-anchor": { + "version": "file:packages/ui-components/resizing-anchor", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.0", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/resource-templates": { + "version": "file:packages/resource-templates", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2" + } + }, + "@k8slens/routing": { + "version": "file:packages/routing", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.3", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^13.5.0" + } + }, + "@k8slens/run-many": { + "version": "file:packages/utility-features/run-many", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@types/uuid": "^9.0.1" + }, + "dependencies": { + "@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true + } + } + }, + "@k8slens/semver": { + "version": "file:packages/semver", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@types/command-line-args": "^5.2.0", + "@types/node": "^16.18.25", + "@types/semver": "^7.3.13", + "command-line-args": "^5.2.1", + "rimraf": "^4.4.1", + "semver": "^7.3.8" + } + }, + "@k8slens/startable-stoppable": { + "version": "file:packages/utility-features/startable-stoppable", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4" + } + }, + "@k8slens/test-utils": { + "version": "file:packages/utility-features/test-utils", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@types/lodash": "^4.14.191" + } + }, + "@k8slens/tooltip": { + "version": "file:packages/ui-components/tooltip", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.0", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^12.8.3" + }, + "dependencies": { + "@testing-library/user-event": { + "version": "12.8.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", + "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + } + } + }, + "@k8slens/typescript": { + "version": "file:packages/infrastructure/typescript", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "typescript": "^4.9.3", + "typescript-plugin-css-modules": "^3.4.0" + } + }, + "@k8slens/utilities": { + "version": "file:packages/utility-features/utilities", + "requires": { + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/webpack": "^6.5.0-alpha.4", + "@types/crypto-js": "^4.1.1", + "@types/lodash": "^4.14.191", + "@types/react": "^17.0.2", + "@types/react-router": "^5.1.20", + "@types/readable-stream": "^2.3.15", + "@types/semver": "^7.3.13", + "@types/tar": "^6.1.4", + "type-fest": "^2.14.0" + }, + "dependencies": { + "@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + } + } + }, + "@k8slens/webpack": { + "version": "file:packages/infrastructure/webpack", + "requires": { + "@async-fn/jest": "^1.6.4", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/typescript": "^6.5.0-alpha.2", + "@ogre-tools/linkable": "^15.8.1", + "@ogre-tools/test-utils": "^15.8.1", + "@types/webpack-env": "^1.18.0", + "css-loader": "^6.7.2", + "fork-ts-checker-webpack-plugin": "^7.3.0", + "fs-extra": "^9.0.1", + "mini-css-extract-plugin": "^2.7.3", + "sass": "^1.62.1", + "sass-loader": "^13.2.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.3.2", + "ts-loader": "^9.4.1", + "ts-node": "^10.9.1", + "webpack": "^5.81.0", + "webpack-cli": "^4.10.0", + "webpack-node-externals": "^3.0.0" + }, + "dependencies": { + "@ogre-tools/test-utils": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/test-utils/-/test-utils-15.8.1.tgz", + "integrity": "sha512-ww+wURUaKX4/yWzrAFX237PuFERoFVQZ5J1D3WC0u097tgKEVx6kxi0buyhbqBMlpCRkIr9gK+1xSdbx9ZDr+Q==", + "dev": true, + "requires": {} + }, + "sass-loader": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", + "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "requires": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" + } + } + } + }, + "@kubernetes/client-node": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.18.1.tgz", + "integrity": "sha512-F3JiK9iZnbh81O/da1tD0h8fQMi/MDttWc/JydyUVnjPEom55wVfnpl4zQ/sWD4uKB8FlxYRPiLwV2ZXB+xPKw==", + "requires": { + "@types/js-yaml": "^4.0.1", + "@types/node": "^18.11.17", + "@types/request": "^2.47.1", + "@types/ws": "^8.5.3", + "byline": "^5.0.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "openid-client": "^5.3.0", + "request": "^2.88.0", + "rfc4648": "^1.3.0", + "stream-buffers": "^3.0.2", + "tar": "^6.1.11", + "tmp-promise": "^3.0.2", + "tslib": "^2.4.1", + "underscore": "^1.12.1", + "ws": "^8.11.0" + }, + "dependencies": { + "@types/node": { + "version": "18.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", + "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" + } + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@lerna/child-process": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.6.1.tgz", + "integrity": "sha512-yUCDCcRNNbI9UUsUB6FYEmDHpo5Tn/f0q5D7vhDP4i6Or8kBj82y7+e31hwfLvK2ykOYlDVs2MxAluH/+QUBOQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "execa": "^5.0.0", + "strong-log-transformer": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "@lerna/create": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-6.6.1.tgz", + "integrity": "sha512-GDmHFhQ0mr0RcXWXrsLyfMV6ch/dZV/Ped1e6sFVQhsLL9P+FFXX1ZWxa/dQQ90VWF2qWcmK0+S/L3kUz2xvTA==", + "dev": true, + "requires": { + "@lerna/child-process": "6.6.1", + "dedent": "^0.7.0", + "fs-extra": "^9.1.0", + "init-package-json": "^3.0.2", + "npm-package-arg": "8.1.1", + "p-reduce": "^2.1.0", + "pacote": "^13.6.1", + "pify": "^5.0.0", + "semver": "^7.3.4", + "slash": "^3.0.0", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0", + "yargs-parser": "20.2.4" + }, + "dependencies": { + "pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + } + } + }, + "@lerna/legacy-package-management": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@lerna/legacy-package-management/-/legacy-package-management-6.6.1.tgz", + "integrity": "sha512-0EYxSFr34VgeudA5rvjGJSY7s4seITMVB7AJ9LRFv9QDUk6jpvapV13ZAaKnhDTxX5vNCfnJuWHXXWq0KyPF/Q==", + "dev": true, + "requires": { + "@npmcli/arborist": "6.2.3", + "@npmcli/run-script": "4.1.7", + "@nrwl/devkit": ">=15.5.2 < 16", + "@octokit/rest": "19.0.3", + "byte-size": "7.0.0", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "5.0.0", + "columnify": "1.6.0", + "config-chain": "1.1.12", + "conventional-changelog-core": "4.2.4", + "conventional-recommended-bump": "6.1.0", + "cosmiconfig": "7.0.0", + "dedent": "0.7.0", + "dot-prop": "6.0.1", + "execa": "5.0.0", + "file-url": "3.0.0", + "find-up": "5.0.0", + "fs-extra": "9.1.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "13.1.0", + "glob-parent": "5.1.2", + "globby": "11.1.0", + "graceful-fs": "4.2.10", + "has-unicode": "2.0.1", + "inquirer": "8.2.4", + "is-ci": "2.0.0", + "is-stream": "2.0.0", + "libnpmpublish": "6.0.4", + "load-json-file": "6.2.0", + "make-dir": "3.1.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "8.1.1", + "npm-packlist": "5.1.1", + "npm-registry-fetch": "14.0.3", + "npmlog": "6.0.2", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-queue": "6.6.2", + "p-waterfall": "2.1.1", + "pacote": "13.6.2", + "pify": "5.0.0", + "pretty-format": "29.4.3", + "read-cmd-shim": "3.0.0", + "read-package-json": "5.0.1", + "resolve-from": "5.0.0", + "semver": "7.3.8", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "9.0.1", + "strong-log-transformer": "2.1.0", + "tar": "6.1.11", + "temp-dir": "1.0.0", + "tempy": "1.0.0", + "upath": "2.0.1", + "uuid": "8.3.2", + "write-file-atomic": "4.0.1", + "write-pkg": "4.0.0", + "yargs": "16.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz", + "integrity": "sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "dependencies": { + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + } + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.2.tgz", + "integrity": "sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "npm-registry-fetch": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", + "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", + "dev": true, + "requires": { + "make-fetch-happen": "^11.0.0", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + }, + "pretty-format": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", + "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "tempy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz", + "integrity": "sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w==", + "dev": true, + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + } + }, + "@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.61", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} + }, + "@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "dev": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + } + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "peer": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/arborist": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.2.3.tgz", + "integrity": "sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA==", + "dev": true, + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^5.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^3.0.0", + "@npmcli/query": "^3.0.0", + "@npmcli/run-script": "^6.0.0", + "bin-links": "^4.0.1", + "cacache": "^17.0.4", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^6.1.6", + "nopt": "^7.0.0", + "npm-install-checks": "^6.0.0", + "npm-package-arg": "^10.1.0", + "npm-pick-manifest": "^8.0.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^7.0.1", + "pacote": "^15.0.8", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.1", + "treeverse": "^3.0.0", + "walk-up-path": "^1.0.0" + }, + "dependencies": { + "@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "requires": { + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/run-script": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", + "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "ignore-walk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.2.tgz", + "integrity": "sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg==", + "dev": true, + "requires": { + "minimatch": "^7.4.2" + }, + "dependencies": { + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + } + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "requires": { + "ignore-walk": "^6.0.0" + } + }, + "npmlog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz", + "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + } + }, + "gauge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.0.tgz", + "integrity": "sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + } + } + }, + "pacote": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.2.tgz", + "integrity": "sha512-EAGJrMiIjBTBB6tWGrx9hFJTOo14B3HSAoa/W9SawFEBhUqjxN7qqaFlGVF9jfY/mIri8Mb2xafmkRgWxYXxIQ==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + } + }, + "read-package-json": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.1.tgz", + "integrity": "sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA==", + "dev": true, + "requires": { + "glob": "^9.3.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "readable-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "npm-install-checks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + } + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + } + } + }, + "@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "requires": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "@npmcli/map-workspaces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.3.tgz", + "integrity": "sha512-HlCvFuTzw4UNoKyZdqiNrln+qMF71QJkxy2dsusV8QQdoa89e2TF4dATCzBxbl4zzRzdDoWWyP5ADVrNAH9cRQ==", + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^9.3.1", + "minimatch": "^7.4.2", + "read-package-json-fast": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "dependencies": { + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@npmcli/metavuln-calculator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", + "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", + "dev": true, + "requires": { + "cacache": "^17.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^15.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + } + }, + "@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "requires": { + "which": "^3.0.0" + } + }, + "@npmcli/run-script": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", + "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "ignore-walk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.2.tgz", + "integrity": "sha512-ezmQ1Dg2b3jVZh2Dh+ar6Eu2MqNSTkyb32HU2MAQQQX9tKM3q/UQ/9lf03lQ5hW+fOeoMnwxwkleZ0xcNp0/qg==", + "dev": true, + "requires": { + "minimatch": "^7.4.2" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "requires": { + "ignore-walk": "^6.0.0" + } + }, + "pacote": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.2.tgz", + "integrity": "sha512-EAGJrMiIjBTBB6tWGrx9hFJTOo14B3HSAoa/W9SawFEBhUqjxN7qqaFlGVF9jfY/mIri8Mb2xafmkRgWxYXxIQ==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + } + }, + "read-package-json": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.1.tgz", + "integrity": "sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA==", + "dev": true, + "requires": { + "glob": "^9.3.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true + }, + "@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true + }, + "@npmcli/package-json": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.0.0.tgz", + "integrity": "sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0" + } + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.0.tgz", + "integrity": "sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "@npmcli/run-script": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz", + "integrity": "sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@nrwl/cli": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.9.2.tgz", + "integrity": "sha512-QoCmyrcGakHAYTJaNBbOerRQAmqJHMYGCdqtQidV+aP9p1Dy33XxDELfhd+IYmGqngutXuEWChNpWNhPloLnoA==", + "dev": true, + "requires": { + "nx": "15.9.2" + } + }, + "@nrwl/devkit": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.2.tgz", + "integrity": "sha512-2DvTstVZb91m+d4wqUJMBHQ3elxyabdmFE6/3aXmtOGeDxTyXyDzf/1O6JvBBiL8K6XC3ZYchjtxUHgxl/NJ5A==", + "dev": true, + "requires": { + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@nrwl/nx-darwin-arm64": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.2.tgz", + "integrity": "sha512-Yv+OVsQt3C/hmWOC+YhJZQlsyph5w1BHfbp4jyCvV1ZXBbb8NdvwxgDHPWXxKPTc1EXuB7aEX3qzxM3/OWEUJg==", + "dev": true, + "optional": true + }, + "@nrwl/nx-darwin-x64": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.2.tgz", + "integrity": "sha512-qHfdluHlPzV0UHOwj1ZJ+qNEhzfLGiBuy1cOth4BSzDlvMnkuqBWoprfaXoztzYcus2NSILY1/7b3Jw4DAWmMw==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm-gnueabihf": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.2.tgz", + "integrity": "sha512-0GzwbablosnYnnJDCJvAeZv8LlelSrNwUnGhe43saeoZdAew35Ay1E34zBrg/GCGTASuz+knEEYFM+gDD9Mc6A==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm64-gnu": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.2.tgz", + "integrity": "sha512-3mFIY7iUTPG45hSIRaM2DmraCy8W6hNoArAGRrTgYw40BIJHtLrW+Rt7DLyvVXaYCvrKugWOKtxC+jG7kpIZVA==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm64-musl": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.2.tgz", + "integrity": "sha512-FNBnXEtockwxZa4I3NqggrJp0YIbNokJvt/clrICP+ijOacdUDkv8mJedavobkFsRsNq9gzCbRbUScKymrOLrg==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-x64-gnu": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.2.tgz", + "integrity": "sha512-gHWsP5lbe4FNQCa1Q/VLxIuik+BqAOcSzyPjdUa4gCDcbxPa8xiE57PgXB5E1XUzOWNnDTlXa/Ll07/TIuKuog==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-x64-musl": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.2.tgz", + "integrity": "sha512-EaFUukCbmoHsYECX2AS4pxXH933yesBFVvBgD38DkoFDxDoJMVt6JqYwm+d5R7S4R2P9U3l++aurljQTRq567Q==", + "dev": true, + "optional": true + }, + "@nrwl/nx-win32-arm64-msvc": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.2.tgz", + "integrity": "sha512-PGAe7QMr51ivx1X3avvs8daNlvv1wGo3OFrobjlu5rSyjC1Y3qHwT9+wdlwzNZ93FIqWOq09s+rE5gfZRfpdAg==", + "dev": true, + "optional": true + }, + "@nrwl/nx-win32-x64-msvc": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.2.tgz", + "integrity": "sha512-Q8onNzhuAZ0l9DNkm8D4Z1AEIzJr8JiT4L2fVBLYrV/R75C2HS3q7lzvfo6oqMY6mXge1cFPcrTtg3YXBQaSWA==", + "dev": true, + "optional": true + }, + "@nrwl/tao": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.2.tgz", + "integrity": "sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA==", + "dev": true, + "requires": { + "nx": "15.9.2" + } + }, + "@octokit/auth-token": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", + "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0" + } + }, + "@octokit/core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", + "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "dev": true, + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", + "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "dev": true, + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.0.0.tgz", + "integrity": "sha512-V8BVJGN0ZmMlURF55VFHFd/L92XQQ43KvFjNmY1IYbCN3V/h/uUFV6iQi19WEHM395Nn+1qhUbViCAD/1czzog==", + "dev": true + }, + "@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", + "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "dev": true, + "requires": { + "@octokit/types": "^6.41.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true + }, + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + } + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz", + "integrity": "sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==", + "dev": true, + "requires": { + "@octokit/types": "^8.1.1", + "deprecation": "^2.3.1" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", + "dev": true + }, + "@octokit/types": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz", + "integrity": "sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^14.0.0" + } + } + } + }, + "@octokit/request": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", + "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "dev": true, + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", + "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "dev": true, + "requires": { + "@octokit/core": "^4.0.0", + "@octokit/plugin-paginate-rest": "^3.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + } + }, + "@octokit/types": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.2.tgz", + "integrity": "sha512-LPbJIuu1WNoRHbN4UMysEdlissRFpTCWyoKT7kHPufI8T+XX33/qilfMWJo3mCOjNIKu0+43oSQPf+HJa0+TTQ==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^17.0.0" + } + }, + "@ogre-tools/fp": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/fp/-/fp-15.8.1.tgz", + "integrity": "sha512-2l6eckvxVrmFgtMGwCnqDa8aNaon5GchVzPc5jyslTfNuFYH2G406HP91xajoGgyGLq2UrkT82tdGXJyyxnbHA==", + "requires": {} + }, + "@ogre-tools/injectable": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/injectable/-/injectable-15.8.1.tgz", + "integrity": "sha512-+5O6bAZlPoxRvy1bkkgG8bD3xikRIvLQHb9mkyB0cfTlrEZSUTER77tzj+T0wcKmZ9HPPeEfshSZQ/HW/dSMAg==", + "requires": {} + }, + "@ogre-tools/injectable-extension-for-auto-registration": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-extension-for-auto-registration/-/injectable-extension-for-auto-registration-15.8.1.tgz", + "integrity": "sha512-6vNYZi2nOUTr/g2B2BQj0D3xDl72XaNjZ+bIlQa6TnqpNNlxg2VxrBKadr3j32NoWtygIobVndrECfejAeczAg==", + "requires": {} + }, + "@ogre-tools/injectable-extension-for-mobx": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-extension-for-mobx/-/injectable-extension-for-mobx-15.8.1.tgz", + "integrity": "sha512-iqoDr/17p4U5vC5p+98VHcjtwM+iYN1xNCiU40FhdagtijJSepENIokddS1efn2gc4rOaHayg6WeDlo+nv8Cbg==", + "requires": {} + }, + "@ogre-tools/injectable-react": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-react/-/injectable-react-15.8.1.tgz", + "integrity": "sha512-NdSQpLEtRNJa24wg8M1MTYd73G+1J8cQfgyAq143DT4RI8l450YUsm8QPrhCYKnJXt6NLf/ibPR9ipotqQF0kg==", + "requires": {} + }, + "@ogre-tools/linkable": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/@ogre-tools/linkable/-/linkable-15.8.1.tgz", + "integrity": "sha512-HSeQnz93afLGcJ4Wz3heUdRd+eHq3ExLqJO23MX1kr65BsjVSbxZAJhBnfoJS1jDroKSlm1cs8bztRSk4QoCkw==", + "requires": { + "@ogre-tools/fp": "^15.8.1", + "@ogre-tools/injectable": "^15.8.1", + "@ogre-tools/injectable-extension-for-auto-registration": "^15.8.1", + "fast-glob": "^3.2.12", + "fs-extra": "^9.0.1", + "lodash": "^4.17.21", + "yalc": "^1.0.0-pre.53" + } + }, + "@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "dependencies": { + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + } + } + }, + "@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + } + }, + "@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "peer": true + }, + "@sentry/browser": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.19.2.tgz", + "integrity": "sha512-5VC44p5Vu2eJhVT39nLAJFgha5MjHDYCyZRR1ieeZt3a++otojPGBBAKNAtrEMGV+A2Z9AoneD6ZnDVlyb3GKg==", + "requires": { + "@sentry/core": "6.19.2", + "@sentry/types": "6.19.2", + "@sentry/utils": "6.19.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/core": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.2.tgz", + "integrity": "sha512-yu1R3ewBT4udmB4v7sc4biQZ0Z0rfB9+TzB5ZKoCftbe6kqXjFMMaFRYNUF9HicVldKAsBktgkWw3+yfqGkw/A==", + "requires": { + "@sentry/hub": "6.19.2", + "@sentry/minimal": "6.19.2", + "@sentry/types": "6.19.2", + "@sentry/utils": "6.19.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/electron": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-3.0.8.tgz", + "integrity": "sha512-D330t0rRswAYreFtzIICD5uQH7Wp2e7g6GEFTGisTouHY9+qSu7q9J/hGe5Vase5cY5277/YmUaUKRrVxj/2DQ==", + "requires": { + "@sentry/browser": "6.19.2", + "@sentry/core": "6.19.2", + "@sentry/node": "6.19.2", + "@sentry/types": "6.19.2", + "@sentry/utils": "6.19.2", + "deepmerge": "^4.2.2", + "tslib": "^2.3.1" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + } + } + }, + "@sentry/hub": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.2.tgz", + "integrity": "sha512-W7KCgNBgdBIMagOxy5J5KQPe+maYxSqfE8a5ncQ3R8BcZDQEKnkW/1FplNbfRLZqA/tL/ndKb7pTPqVtzsbARw==", + "requires": { + "@sentry/types": "6.19.2", + "@sentry/utils": "6.19.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/integrations": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.19.7.tgz", + "integrity": "sha512-yNeeFyuygJaV7Mdc5qWuDa13xVj5mVdECaaw2Xs4pfeHaXmRfRzZY17N8ypWFegKWxKBHynyQRMD10W5pBwJvA==", + "requires": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "localforage": "^1.8.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "requires": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/minimal": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.2.tgz", + "integrity": "sha512-ClwxKm77iDHET7kpzv1JvzDx1er5DoNu+EUjst0kQzARIrXvu9xuZuE2/CnBWycQWqw8o3HoGoKz65uIhsUCzQ==", + "requires": { + "@sentry/hub": "6.19.2", + "@sentry/types": "6.19.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/node": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.2.tgz", + "integrity": "sha512-Z1qREpTpYHxaeWjc1zMUk8ZTAp1WbxMiI2TVNc+a14DVT19Z2xNXb06MiRfeLgNc9lVGdmzR62dPmMBjVgPJYg==", + "requires": { + "@sentry/core": "6.19.2", + "@sentry/hub": "6.19.2", + "@sentry/types": "6.19.2", + "@sentry/utils": "6.19.2", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==" + }, + "@sentry/utils": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.2.tgz", + "integrity": "sha512-2DQQ2OJaxjtyxGq5FmMlqb6hptsqMs2xoBiVRMkTS/rvyTrk1oQdKZ8ePwjtgX3nJ728ni3IXIyXV+vfGp4EBw==", + "requires": { + "@sentry/types": "6.19.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/types": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", + "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@side/jest-runtime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@side/jest-runtime/-/jest-runtime-1.1.0.tgz", + "integrity": "sha512-KikALXowNWyOxn/zdy4AUgkYq/1hASkOEEP0+bcCDv5L3KJNwDw8kmzBcx7sljnwV8yi2cLGzt9QH9EjwA9TKg==", + "requires": {} + }, + "@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "dev": true + }, + "@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "requires": { + "@sinonjs/commons": "^2.0.0" + } + }, + "@swc/cli": { + "version": "0.1.62", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", + "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", + "dev": true, + "requires": { + "@mole-inc/bin-wrapper": "^8.0.1", + "commander": "^7.1.0", + "fast-glob": "^3.2.5", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + } + }, + "@swc/core": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.55.tgz", + "integrity": "sha512-w/lN3OuJsuy868yJZKop+voZLVzI5pVSoopQVtgDNkEzejnPuRp9XaeAValvuMaWqKoTMtOjLzEPyv/xiAGYQQ==", + "dev": true, + "requires": { + "@swc/core-darwin-arm64": "1.3.55", + "@swc/core-darwin-x64": "1.3.55", + "@swc/core-linux-arm-gnueabihf": "1.3.55", + "@swc/core-linux-arm64-gnu": "1.3.55", + "@swc/core-linux-arm64-musl": "1.3.55", + "@swc/core-linux-x64-gnu": "1.3.55", + "@swc/core-linux-x64-musl": "1.3.55", + "@swc/core-win32-arm64-msvc": "1.3.55", + "@swc/core-win32-ia32-msvc": "1.3.55", + "@swc/core-win32-x64-msvc": "1.3.55" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.55.tgz", + "integrity": "sha512-UnHC8aPg/JvHhgXxTU6EhTtfnYNS7nhq8EKB8laNPxlHbwEyMBVQ2QuJHlNCtFtvSfX/uH5l04Ld1iGXnBTfdQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.55.tgz", + "integrity": "sha512-VNJkFVARrktIqtaLrD1NFA54gqekH7eAUcUY2U2SdHwO67HYjfMXMxlugLP5PDasSKpTkrVooUdhkffoA5W50g==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.55.tgz", + "integrity": "sha512-6OcohhIFKKNW/TpJt26Tpul8zyL7dmp1Lnyj2BX9ycsZZ5UnsNiGqn37mrqJgVTx/ansEmbyOmKu2mzm/Ct6cQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.55.tgz", + "integrity": "sha512-MfZtXGBv21XWwvrSMP0CMxScDolT/iv5PRl9UBprYUehwWr7BNjA3V9W7QQ+kKoPyORWk7LX7OpJZF3FnO618Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.55.tgz", + "integrity": "sha512-iZJo+7L5lv10W0f0C6SlyteAyMJt5Tp+aH3+nlAwKdtc+VjyL1sGhR8DJMXp2/buBRZJ9tjEtpXKDaWUdSdF7Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.55.tgz", + "integrity": "sha512-Rmc8ny/mslzzz0+wNK9/mLdyAWVbMZHRSvljhpzASmq48NBkmZ5vk9/WID6MnUz2e9cQ0JxJQs8t39KlFJtW3g==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.55.tgz", + "integrity": "sha512-Ymoc4xxINzS93ZjVd2UZfLZk1jF6wHjdCbC1JF+0zK3IrNrxCIDoWoaAj0+Bbvyo3hD1Xg/cneSTsqX8amnnuQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.55.tgz", + "integrity": "sha512-OhnmFstq2qRU2GI5I0G/8L+vc2rx8+w+IOA6EZBrY4FuMCbPIZKKzlnAIxYn2W+yD4gvBzYP3tgEcaDfQk6EkA==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.55.tgz", + "integrity": "sha512-3VR5rHZ6uoL/Vo3djV30GgX2oyDwWWsk+Yp+nyvYyBaKYiH2zeHfxdYRLSQV3W7kSlCAH3oDYpSljrWZ0t5XEQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.55.tgz", + "integrity": "sha512-KBtMFtRwnbxBugYf6i2ePqEGdxsk715KcqGMjGhxNg7BTACnXnhj37irHu2e7A7wZffbkUVUYuj/JEgVkEjSxg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/jest": { + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.26.tgz", + "integrity": "sha512-7lAi7q7ShTO3E5Gt1Xqf3pIhRbERxR1DUxvtVa9WKzIB+HGQ7wZP5sYx86zqnaEoKKGhmOoZ7gyW0IRu8Br5+A==", + "dev": true, + "requires": { + "@jest/create-cache-key-function": "^27.4.2", + "jsonc-parser": "^3.2.0" + } + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@testing-library/dom": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz", + "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + } + }, + "@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "requires": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@testing-library/react": { + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", + "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "<18.0.0" + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true + }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true + }, + "@tufjs/models": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.3.tgz", + "integrity": "sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw==", + "dev": true, + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^7.4.6" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.4.tgz", + "integrity": "sha512-TLG7CsGZZmX9aDF78UuJxnNTfQyRUFU0OYIVyIblr0/wd/HvsIo8wmuB90CszeD2MtLLAE9Tt4cWvk+KVkyGIw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/byline": { + "version": "4.2.33", + "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.33.tgz", + "integrity": "sha512-LJYez7wrWcJQQDknqZtrZuExMGP0IXmPl1rOOGDqLbu+H7UNNRfKNuSxCBcQMLH1EfjeWidLedC/hCc5dDfBog==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "@types/chart.js": { + "version": "2.9.37", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.37.tgz", + "integrity": "sha512-9bosRfHhkXxKYfrw94EmyDQcdjMaQPkU1fH2tDxu8DWXxf1mjzWQAV4laJF51ZbC2ycYwNDvIm1rGez8Bug0vg==", + "dev": true, + "requires": { + "moment": "^2.10.2" + } + }, + "@types/circular-dependency-plugin": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/circular-dependency-plugin/-/circular-dependency-plugin-5.0.5.tgz", + "integrity": "sha512-JU1sYQWNbUluWHseLUfokakx18+BXRA9Bxji56hdY5NW0nvrJSJd4SNAl0Btpm5ima9BnUkoGEcW/2PH1QuWQA==", + "dev": true, + "requires": { + "@types/node": "*", + "webpack": "^5.1.0" + } + }, + "@types/cli-progress": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.0.tgz", + "integrity": "sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/color": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz", + "integrity": "sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==", + "dev": true, + "requires": { + "@types/color-convert": "*" + } + }, + "@types/color-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", + "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", + "dev": true, + "requires": { + "@types/color-name": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/command-line-args": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/crypto-js": { + "version": "3.1.47", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", + "integrity": "sha512-eI6gvpcGHLk3dAuHYnRCAjX+41gMv1nz/VP55wAe5HtmAKDOoPSfr3f6vkMc08ov1S0NsjvUBxDtHHxqQY1LGA==", + "dev": true + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/dompurify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", + "dev": true, + "requires": { + "@types/trusted-types": "*" + } + }, + "@types/electron-devtools-installer": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.2.tgz", + "integrity": "sha512-8o2XkyAw2HZoVD5KpIoUJmEgZ7BPVv33p7rY1jmn/wJUbugtQUc44vNMDTguUNUGiLv+oqgtyYmiYctHDZEzdQ==", + "dev": true + }, + "@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/esprima": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/esprima/-/esprima-4.0.3.tgz", + "integrity": "sha512-jo14dIWVVtF0iMsKkYek6++4cWJjwpvog+rchLulwgFJGTXqIeTdCOvY0B3yMLTaIwMcKCdJ6mQbSR6wYHy98A==", + "requires": { + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "optional": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", + "dev": true + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "requires": { + "@types/node": "*" + } + }, + "@types/gunzip-maybe": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz", + "integrity": "sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hapi__call": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/hapi__call/-/hapi__call-9.0.0.tgz", + "integrity": "sha512-WJlvjk4i7uLhALYJfWMdhW58B4OphXuE0Ob4DZFwc0zqC5fnM9Wjgk3B1fd/C6jEKnM9Y1Pzz8QeSrUJ1mue5A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hapi__subtext": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/hapi__subtext/-/hapi__subtext-7.0.0.tgz", + "integrity": "sha512-CwZZpuf7qXj/JKeMhFkiJQDupf7PhjZcHQ0RaeetAyxoR7vDN6kmQcGMZKEG5VTvlS/JfZGNIkq7F7nd/K+j+g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dev": true, + "requires": { + "@types/react": "^17", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/inquirer": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.3.tgz", + "integrity": "sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==", + "dev": true, + "requires": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, + "@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "dev": true + }, + "@types/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-zK4gSFMjgslsv5Lyvr3O1yCjgmnE4pr8jbG8qVn4QglMwtpvPCf4YT2Wma7Nk95OxUUJI8Z+kzdXohbM7mVpGw==", + "dev": true + }, + "@types/md5-file": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/md5-file/-/md5-file-4.0.2.tgz", + "integrity": "sha512-8gacRfEqLrmZ6KofpFfxyjsm/LYepeWUWUJGaf5A9W9J5B2/dRZMdkDqFDL6YDa9IweH12IO76jO7mpsK2B3wg==", + "dev": true + }, + "@types/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@types/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-eSkOeBPwr0godOTPV4hQTzXZElnpyHhhCCscrcN6teFLbSPC8Xyb/rxsU2r6tg+eNzIuVX4miav3KhY6NUpgMw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "optional": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/mkdirp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", + "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/mock-fs": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.1.tgz", + "integrity": "sha512-m6nFAJ3lBSnqbvDZioawRvpLXSaPyn52Srf7OfzjubYbYX8MTUdIgDxQl0wEapm4m/pNYSd9TXocpQ0TvZFlYA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "@types/node": { + "version": "16.18.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.25.tgz", + "integrity": "sha512-rUDO6s9Q/El1R1I21HG4qw/LstTHCPO/oQNAwI/4b2f9EWvMnqt4d3HJwPMawfZ3UvodB8516Yg+VAq54YM+eA==" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, + "@types/plist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", + "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "@types/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg==", + "dev": true, + "requires": { + "postcss": "^8.0.0" + } + }, + "@types/postcss-modules-scope": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz", + "integrity": "sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg==", + "dev": true, + "requires": { + "postcss": "^8.0.0" + } + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-kd4LMvcnpYkspDcp7rmXKedn8iJSCoa331zRRamUp5oanKt/CefbEGPQP7G89enz7sKD4bvsr8mHSsC8j5WOvA==", + "dev": true, + "requires": { + "@types/retry": "*" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/randomcolor": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.7.tgz", + "integrity": "sha512-LPcG96dGYRCsXlk1fslUNIg6ebEi+bKNyn84uBL/pu2cRSf5i/djD3ArJZOyzszVMVV/DB87va6pMZP+tRSl/w==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/react": { + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + } + } + }, + "@types/react-beautiful-dnd": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", + "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", + "dev": true, + "requires": { + "@types/react": "^17" + } + }, + "@types/react-dom": { + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", + "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", + "requires": { + "@types/react": "^17" + } + }, + "@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "dev": true, + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "^17", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "requires": { + "@types/history": "^4.7.11", + "@types/react": "^17" + } + }, + "@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "requires": { + "@types/history": "^4.7.11", + "@types/react": "^17", + "@types/react-router": "*" + } + }, + "@types/react-table": { + "version": "7.7.14", + "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.14.tgz", + "integrity": "sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw==", + "dev": true, + "requires": { + "@types/react": "^17" + } + }, + "@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "requires": { + "@types/react": "^17" + } + }, + "@types/react-virtualized-auto-sizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", + "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", + "dev": true, + "requires": { + "@types/react": "^17" + } + }, + "@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dev": true, + "requires": { + "@types/react": "^17" + } + }, + "@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dev": true, + "requires": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "@types/request-promise-native": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.18.tgz", + "integrity": "sha512-tPnODeISFc/c1LjWyLuZUY+Z0uLB3+IMfNoQyDEi395+j6kTFTTRAqjENjoPJUid4vHRGEozoTrcTrfZM+AcbA==", + "dev": true, + "requires": { + "@types/request": "*" + } + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sharp": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/stoppable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.1.tgz", + "integrity": "sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/tar": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.4.tgz", + "integrity": "sha512-Cp4oxpfIzWt7mr2pbhHT2OTXGMAL0szYCzuf8lRWyIMCgsx6/Hfc3ubztuhvzXHXgraTQxyOCmmg7TDGIMIJJQ==", + "dev": true, + "requires": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "@types/tar-stream": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.2.tgz", + "integrity": "sha512-1AX+Yt3icFuU6kxwmPakaiGrJUwG44MpuiqPg4dSolRFk6jmvs4b3IbUol9wKDLIgU76gevn3EwE8y/DkSJCZQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/tcp-port-used": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/tcp-port-used/-/tcp-port-used-1.0.1.tgz", + "integrity": "sha512-6pwWTx8oUtWvsiZUCrhrK/53MzKVLnuNSSaZILPy3uMes9QnTrLMar9BDlJArbMOjDcjb3QXFk6Rz8qmmuySZw==", + "dev": true + }, + "@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "requires": { + "@types/jest": "*" + } + }, + "@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, + "@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + }, + "@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", + "dev": true + }, + "@types/url-parse": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@types/url-parse/-/url-parse-1.4.8.tgz", + "integrity": "sha512-zqqcGKyNWgTLFBxmaexGUKQyWqeG7HjXj20EuQJSJWwXe54BjX0ihIo5cJB9yAQzH8dNugJ9GvkBYMjPXs/PJw==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@types/verror": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", + "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "dev": true, + "optional": true + }, + "@types/webpack": { + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.1.tgz", + "integrity": "sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==", + "dev": true, + "requires": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "@types/webpack-dev-server": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-4.7.2.tgz", + "integrity": "sha512-Y3p0Fmfvp0MHBDoCzo+xFJaWTw0/z37mWIo6P15j+OtmUDLvznJWdZNeD7Q004R+MpQlys12oXbXsrXRmxwg4Q==", + "dev": true, + "requires": { + "webpack-dev-server": "*" + } + }, + "@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" + }, + "@types/webpack-node-externals": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-2.5.3.tgz", + "integrity": "sha512-A9JxaR8QXoYT95egET4AmCFuChyTlP8d18ZAnmSHuIMsFdS7QlCQQ8pmN/+FHgLIkm+ViE/VngltT5avLACY9A==", + "dev": true, + "requires": { + "@types/node": "*", + "webpack": "^5" + } + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "peer": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.1.tgz", + "integrity": "sha512-KVtKcHEizCIRx//LC9tBi6xp94ULKbU5StVHBVWURJQOVa2qw6HP28Hu7LmHrQM3p9I3q5Y2VR4wKllCJ3IWrw==", + "peer": true, + "requires": { + "@typescript-eslint/utils": "5.59.1" + } + }, + "@typescript-eslint/parser": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", + "requires": { + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", + "requires": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", + "requires": { + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", + "requires": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", + "requires": { + "@typescript-eslint/types": "5.59.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", + "requires": { + "@webassemblyjs/ast": "1.11.5", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.42", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.42.tgz", + "integrity": "sha512-eW9Mbegmb5bJjwawJM9ghjUjUqciNMhC6L7XrQPF/clXS5bbP66MstsgCT5hy9VlfUh/CfBT+0Wucf531dMjHA==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "7zip-bin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", + "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "adr": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/adr/-/adr-1.4.3.tgz", + "integrity": "sha512-g9KcB0i1Hnf2b24LhD6JVZmDEc8si4XVTmic0Tv+mN1YuM2JRckLTIPQbeklnqloSTjk8uLUkr95p307qvSBHA==", + "dev": true, + "requires": { + "colors": "^1.3.3", + "commander": "^5.1.0", + "find-in-files": "^0.5.0", + "inquirer": "^7.1.0", + "lru-cache": "^5.1.1", + "markdown": "^0.5.0", + "markdown-toc": "^1.2.0", + "mkdirp": "^1.0.4", + "moment": "^2.24.0", + "open-in-editor": "^2.2.0", + "remarkable": "^2.0.1", + "sharp": "^0.30.4", + "table": "^5.4.1", + "tslib": "^2.0.0", + "walk": "^2.3.14", + "walk-sync": "^2.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "sharp": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", + "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", + "dev": true, + "requires": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^5.0.0", + "prebuild-install": "^7.1.1", + "semver": "^7.3.7", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi_up": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ansi_up/-/ansi_up-5.2.1.tgz", + "integrity": "sha512-5bz5T/7FRmlxA37zDXhG6cAwlcZtfnmNLDJra66EEIT3kYlw5aPJdbkJEhm59D6kA4Wi5ict6u6IDYHJaQlH+g==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "requires": { + "type-fest": "^3.0.0" + }, + "dependencies": { + "type-fest": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.9.0.tgz", + "integrity": "sha512-hR8JP2e8UiH7SME5JZjsobBlEiatFoxpzCP+R3ZeCo7kAaG1jXQE5X/buLzogM6GJu8le9Y4OcfNuIQX0rZskA==" + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "app-builder-lib": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.6.0.tgz", + "integrity": "sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==", + "dev": true, + "requires": { + "@develar/schema-utils": "~2.6.5", + "@electron/universal": "1.2.1", + "@malept/flatpak-bundler": "^0.4.0", + "7zip-bin": "~5.1.1", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.7", + "electron-osx-sign": "^0.6.0", + "electron-publish": "23.6.0", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^4.0.10", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^3.1.2", + "read-config-file": "6.2.0", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.7", + "tar": "^6.1.11", + "temp-file": "^3.4.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", + "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "peer": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==" + }, + "auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" + }, + "autolinker": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", + "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + } + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "peer": true + }, + "axios": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz", + "integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "peer": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "b4a": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.3.tgz", + "integrity": "sha512-aX6/FqpWQve8VN9kyTExy7GlmwNShvxcCWWD5QVR3ZbRlyBGtCrG5Autu95xxSPH4CRs+5PSV4d7PRnWpmqFlA==" + }, + "babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "requires": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "peer": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "peer": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "peer": true + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "requires": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "peer": true, + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + } + }, + "bin-links": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz", + "integrity": "sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==", + "dev": true, + "requires": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "dependencies": { + "cmd-shim": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz", + "integrity": "sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==", + "dev": true + }, + "read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true + }, + "write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } + } + }, + "bin-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", + "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "bin-version-check": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.0.0.tgz", + "integrity": "sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==", + "dev": true, + "requires": { + "bin-version": "^6.0.0", + "semver": "^7.3.5", + "semver-truncate": "^2.0.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5" + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true, + "peer": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "requires": { + "pako": "~0.2.0" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builder-util": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-23.6.0.tgz", + "integrity": "sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==", + "dev": true, + "requires": { + "@types/debug": "^4.1.6", + "@types/fs-extra": "^9.0.11", + "7zip-bin": "~5.1.1", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "builder-util-runtime": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz", + "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==" + }, + "byte-size": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.0.tgz", + "integrity": "sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "cacache": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.5.tgz", + "integrity": "sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA==", + "dev": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^9.3.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + } + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "chart.js": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", + "dev": true, + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "dev": true, + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + } + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "requires": {} + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "requires": { + "string-width": "^4.2.3" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", + "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "cmd-shim": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "requires": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + } + } + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "concurrently": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "requires": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "peer": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "requires": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", + "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", + "peer": true, + "requires": { + "browserslist": "^4.21.5" + } + }, + "core-js-pure": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.1.tgz", + "integrity": "sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dev": true, + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "requires": { + "rrweb-cssom": "^0.6.0" + } + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "peer": true + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + }, + "data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + } + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "requires": { + "mimic-fn": "^3.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepdash": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/deepdash/-/deepdash-5.3.9.tgz", + "integrity": "sha512-GRzJ0q9PDj2T+J2fX+b+TlUa2NlZ11l6vJ8LHNKVGeZ8CfxCuJaCychTq07iDRTvlfO8435jlvVS1QXBrW9kMg==", + "dev": true, + "requires": { + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "devOptional": true + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "dev": true + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" + }, + "dir-compare": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", + "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", + "dev": true, + "requires": { + "buffer-equal": "1.0.0", + "colors": "1.0.3", + "commander": "2.9.0", + "minimatch": "3.0.4" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dmg-builder": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.6.0.tgz", + "integrity": "sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==", + "dev": true, + "requires": { + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "dmg-license": "^1.0.11", + "fs-extra": "^10.0.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "requires": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "optional": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + } + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", + "dev": true + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron": { + "version": "22.3.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.7.tgz", + "integrity": "sha512-QUuRCl0QJk0w2yPAQXl6sk4YV1b9353w4e1eO/fF2OUmrGQV9Fy2pEpEDV1PIq/JJ/oeVVlI3H07LHpEcNb0TA==", + "requires": { + "@electron/get": "^2.0.0", + "@types/node": "^16.11.26", + "extract-zip": "^2.0.1" + } + }, + "electron-builder": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.6.0.tgz", + "integrity": "sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==", + "dev": true, + "requires": { + "@types/yargs": "^17.0.1", + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "dmg-builder": "23.6.0", + "fs-extra": "^10.0.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.2.0", + "simple-update-notifier": "^1.0.7", + "yargs": "^17.5.1" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "electron-devtools-installer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", + "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", + "requires": { + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "tslib": "^2.1.0", + "unzip-crx-3": "^0.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "electron-notarize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.3.0.tgz", + "integrity": "sha512-tuDw8H0gcDOalNLv6RM2CwGvUXU60MPGZRDEmd0ppX+yP5XqL8Ec2DuXyz9J7WQSA3aRCfzIgH8C5CAivDYWMw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "electron-osx-sign": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz", + "integrity": "sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "electron-publish": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-23.6.0.tgz", + "integrity": "sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==", + "dev": true, + "requires": { + "@types/fs-extra": "^9.0.11", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "fs-extra": "^10.0.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "electron-to-chromium": { + "version": "1.4.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.372.tgz", + "integrity": "sha512-MrlFq/j+TYHOjeWsWGYfzevc25HNeJdsF6qaLFrqBTRWZQtWkb1myq/Q2veLWezVaa5OcSZ99CFwTT4aF4Mung==" + }, + "electron-updater": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.6.5.tgz", + "integrity": "sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==", + "requires": { + "@types/semver": "^7.3.6", + "builder-util-runtime": "8.9.2", + "fs-extra": "^10.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.5" + }, + "dependencies": { + "builder-util-runtime": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", + "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", + "requires": { + "debug": "^4.3.2", + "sax": "^1.2.4" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "electron-window-state": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", + "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", + "requires": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ensure-posix-path": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", + "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true, + "peer": true + }, + "esbuild": { + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" + } + }, + "esbuild-loader": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-2.21.0.tgz", + "integrity": "sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==", + "dev": true, + "requires": { + "esbuild": "^0.16.17", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + } + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "peer": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "eslint-config-airbnb-typescript": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", + "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", + "peer": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0" + } + }, + "eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "peer": true, + "requires": {} + }, + "eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "peer": true, + "requires": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "dependencies": { + "eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "peer": true, + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "dependencies": { + "globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "peer": true, + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "requires": {} + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-jest": { + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", + "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", + "peer": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true + } + } + }, + "eslint-plugin-no-unsanitized": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", + "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", + "peer": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "peer": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "requires": {} + }, + "eslint-plugin-security": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", + "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", + "peer": true, + "requires": { + "safe-regex": "^2.1.1" + } + }, + "eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "peer": true, + "requires": {} + }, + "eslint-plugin-testing-library": { + "version": "5.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.3.tgz", + "integrity": "sha512-0yhsKFsjHLud5PM+f2dWr9K3rqYzMy4cSHs3lcmFYMa1CdSzRvHGgXvsFarBjZ41gU8jhTdMIkg8jHLxGJqLqw==", + "peer": true, + "requires": { + "@typescript-eslint/utils": "^5.58.0" + } + }, + "eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-plugin-xss": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-xss/-/eslint-plugin-xss-0.1.12.tgz", + "integrity": "sha512-L5oYaD//ZE7fKNtWUfVgYTRW19jrZlvaHe2swyFLxXQ5pwVQLivi5m92rtXd/ww8yqg4Drasqyi0hlBmhf9YQg==", + "peer": true, + "requires": { + "requireindex": "~1.1.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==" + }, + "espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + } + }, + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "requires": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "peer": true + }, + "fast-fifo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.2.0.tgz", + "integrity": "sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fast-xml-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.2.tgz", + "integrity": "sha512-DLzIPtQqmvmdq3VUKR7T6omPK/VCRNqgFlGtbESfyhcH2R4I8EzK1/K6E8PkRCK2EabWrUHK32NjYRbEFnnz0Q==", + "dev": true, + "requires": { + "strnum": "^1.0.5" + } + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "requires": { + "pend": "~1.2.0" + } + }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "requires": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-js": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/file-js/-/file-js-0.3.0.tgz", + "integrity": "sha512-nZlX1pxpV6Mt8BghM3Z150bpsCT1zqil97UryusstZLSs9caYAe0Wph2UKPC3awfM2Dq4ri1Sv99KuK4EIImlA==", + "requires": { + "bluebird": "^3.4.7", + "minimatch": "^3.0.3", + "proper-lockfile": "^1.2.0" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==" + }, + "proper-lockfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-1.2.0.tgz", + "integrity": "sha512-YNjxtCoY3A+lohlLXWCYrHDhUdfU3MMnuC+ADhloDvJo586LKW23dPrjxGvRGuus05Amcf0cQy6vrjjtbJhWpw==", + "requires": { + "err-code": "^1.0.0", + "extend": "^3.0.0", + "graceful-fs": "^4.1.2", + "retry": "^0.10.0" + } + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==" + } + } + }, + "file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dev": true, + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + } + }, + "file-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", + "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", + "dev": true + }, + "filehound": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/filehound/-/filehound-1.17.6.tgz", + "integrity": "sha512-5q4zjFkI8W2zLmvbvyvI//K882IpEj6sMNXPUQlk5H6W4Wh3OSSylEAIEmMLELP9G7ileYjTKPXOn0YzzS55Lg==", + "requires": { + "bluebird": "^3.7.2", + "file-js": "0.3.0", + "lodash": "^4.17.21", + "minimatch": "^5.0.0", + "moment": "^2.29.1", + "unit-compare": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "dev": true + }, + "filenamify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "dev": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", + "integrity": "sha512-jPrupTOe/pO//3a9Ty2o4NqQCp0L46UG+swUnfFtdmtQVN8pEltKpAqR7Nuf6vWn0GBXx5w+R1MyZzqwjEIqdA==", + "dev": true, + "requires": { + "traverse-chain": "~0.1.0" + } + }, + "find-in-files": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", + "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "dev": true, + "requires": { + "find": "^0.1.5", + "q": "^1.0.1" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "requires": { + "array-back": "^3.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "requires": { + "semver-regex": "^4.0.5" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "fork-ts-checker-webpack-plugin": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", + "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", + "requires": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", + "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "generic-names": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", + "integrity": "sha512-b6OHfQuKasIKM9b6YPkX+KUj/TLBTx3B/1aT1T5F12FEuEqyFMdr59OMS53aoaSw8eVtapdqieX6lbg5opaOhA==", + "requires": { + "loader-utils": "^0.2.16" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "requires": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "requires": { + "git-up": "^7.0.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "requires": { + "ini": "^1.3.2" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "peer": true, + "requires": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dev": true, + "requires": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "requires": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==" + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "requires": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "ignore-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", + "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA==", + "dev": true + }, + "ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "include-media": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/include-media/-/include-media-1.4.10.tgz", + "integrity": "sha512-TymQzKF7oWHbItEcEHOCponZ90lRr1I9QbYeD+qCxXy4Z0/pSpS4Ocz2bq3FMOERlXXrY9Sawsh9GjiObVQA6A==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "init-package-json": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", + "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", + "dev": true, + "requires": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + } + } + }, + "inquirer": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.0.tgz", + "integrity": "sha512-WWERbVqjsTXjXub1ZW0ZHDit1dyHqy0T9XIkky9TnmKAPrjU9Jkd59nZPK0dUuM3s73GZAZu2Jo4iFU3XSPVLA==", + "requires": { + "ansi-escapes": "^6.0.0", + "chalk": "^5.2.0", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^6.1.2", + "run-async": "^2.4.0", + "rxjs": "^7.8.0", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + } + }, + "ora": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", + "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", + "requires": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==" + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "requires": { + "protocols": "^2.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "requires": {} + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "requires": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + } + }, + "jest-canvas-mock": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.0.tgz", + "integrity": "sha512-s2bmY2f22WPMzhB2YA93kiyf7CAfWAnV/sFfY9s48IVOrGmwui1eSFluDPesq1M+7tSC1hJAit6mzO0ZNXvVBA==", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "requires": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "requires": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-environment-jsdom": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", + "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/jsdom": "^16.2.4", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3", + "jsdom": "^19.0.0" + }, + "dependencies": { + "@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + } + }, + "@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/jsdom": { + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", + "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/parse5": "^6.0.3", + "@types/tough-cookie": "*" + } + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*" + } + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" + }, + "jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "requires": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "requires": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + } + }, + "jest-mock-extended": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-2.0.9.tgz", + "integrity": "sha512-eRZq7/FgwHbxOMm3Lo4DpQX6S2zi4OvwMVFHEb3FgDLp0Xy3P1WARkF93xxO5uD4nAHiEPYHZ25qVU9mAVxoLQ==", + "dev": true, + "requires": { + "ts-essentials": "^7.0.3" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "requires": {} + }, + "jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==" + }, + "jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "requires": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + } + }, + "jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "requires": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "requires": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-watch-select-projects": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", + "requires": { + "ansi-escapes": "^4.3.0", + "chalk": "^3.0.0", + "prompts": "^2.2.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "jest-watch-typeahead": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz", + "integrity": "sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==", + "requires": { + "ansi-escapes": "^6.0.0", + "chalk": "^5.2.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" + }, + "char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" + }, + "slash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.0.1.tgz", + "integrity": "sha512-ywNzUOiXwetmLvTUiCBZpLi+vxqN3i+zDqjs2HHfUSV3wN4UJxVVKWrS1JZDeiJIeBFNgB5pmioC2g0IUTL+rQ==" + }, + "string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "requires": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "requires": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "requires": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" + }, + "jose": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.1.tgz", + "integrity": "sha512-SgjXLpP7jhQkUNKL6RpowoR/IF4QKE+WjLDMpNnh2vmhiFs67NftrNpvFtgbwpvRdtueFliahYYWz9E+XZZQlg==", + "optional": true + }, + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true + }, + "js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "jsdom": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz", + "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==", + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.2", + "acorn-globals": "^7.0.0", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "dependencies": { + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } + }, + "jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "jss-plugin-global": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "jss-plugin-nested": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true + }, + "just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "peer": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "peer": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" + }, + "lerna": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-6.6.1.tgz", + "integrity": "sha512-WJtrvmbmR+6hMB9b5pvsxJzew0lRL6hARgW/My9BM4vYaxwPIA2I0riv3qQu5Zd7lYse7FEqJkTnl9Kn1bXhLA==", + "dev": true, + "requires": { + "@lerna/child-process": "6.6.1", + "@lerna/create": "6.6.1", + "@lerna/legacy-package-management": "6.6.1", + "@npmcli/arborist": "6.2.3", + "@npmcli/run-script": "4.1.7", + "@nrwl/devkit": ">=15.5.2 < 16", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "19.0.3", + "byte-size": "7.0.0", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "5.0.0", + "columnify": "1.6.0", + "config-chain": "1.1.12", + "conventional-changelog-angular": "5.0.12", + "conventional-changelog-core": "4.2.4", + "conventional-recommended-bump": "6.1.0", + "cosmiconfig": "7.0.0", + "dedent": "0.7.0", + "dot-prop": "6.0.1", + "envinfo": "^7.7.4", + "execa": "5.0.0", + "fs-extra": "9.1.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "13.1.0", + "glob-parent": "5.1.2", + "globby": "11.1.0", + "graceful-fs": "4.2.10", + "has-unicode": "2.0.1", + "import-local": "^3.0.2", + "init-package-json": "3.0.2", + "inquirer": "^8.2.4", + "is-ci": "2.0.0", + "is-stream": "2.0.0", + "js-yaml": "^4.1.0", + "libnpmaccess": "6.0.3", + "libnpmpublish": "6.0.4", + "load-json-file": "6.2.0", + "make-dir": "3.1.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "8.1.1", + "npm-packlist": "5.1.1", + "npm-registry-fetch": "^14.0.3", + "npmlog": "^6.0.2", + "nx": ">=15.5.2 < 16", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-pipe": "3.1.0", + "p-queue": "6.6.2", + "p-reduce": "2.1.0", + "p-waterfall": "2.1.1", + "pacote": "13.6.2", + "pify": "5.0.0", + "read-cmd-shim": "3.0.0", + "read-package-json": "5.0.1", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.8", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "9.0.1", + "strong-log-transformer": "2.1.0", + "tar": "6.1.11", + "temp-dir": "1.0.0", + "typescript": "^3 || ^4", + "upath": "^2.0.1", + "uuid": "8.3.2", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "4.0.0", + "write-file-atomic": "4.0.1", + "write-pkg": "4.0.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libnpmaccess": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.3.tgz", + "integrity": "sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg==", + "dev": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "libnpmpublish": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.4.tgz", + "integrity": "sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg==", + "dev": true, + "requires": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "normalize-package-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + } + }, + "load-json-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "requires": { + "lie": "3.1.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "peer": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + } + } + }, + "logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "requires": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "make-plural": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", + "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "markdown": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz", + "integrity": "sha512-ctGPIcuqsYoJ493sCtFK7H4UEgMWAUdXeBhPbdsg1W0LsV9yJELAHRsMmWfTgao6nH0/x5gf9FmsbxiXnrgaIQ==", + "dev": true, + "requires": { + "nopt": "~2.1.1" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "nopt": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", + "integrity": "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "dev": true + }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "peer": true, + "requires": { + "escape-string-regexp": "^4.0.0" + } + }, + "matcher-collection": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz", + "integrity": "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "minimatch": "^3.0.2" + }, + "dependencies": { + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "dev": true + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "mergee": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mergee/-/mergee-1.0.0.tgz", + "integrity": "sha512-hbbXD4LOcxVkpS+mp3BMEhkSDf+lTVENFeEeqACgjjL8WrgKuW2EyLT0fOHyTbyDiuRLZJZ1HrHNeiX4iOd79Q==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "mini-css-extract-plugin": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", + "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==" + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "mobx": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", + "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==" + }, + "mobx-observable-history": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mobx-observable-history/-/mobx-observable-history-2.0.3.tgz", + "integrity": "sha512-cWMG3GcT1l2Y880mfffNh9m6WldQyOtlLUvcdVUjIj++sNOQbRxKBaBUe/TPDiJ80EN6g8FGiVuFlzzyRJPykQ==", + "requires": { + "@types/history": "^4.7.8", + "history": "^4.10.1", + "mobx": "^6.3.0" + } + }, + "mobx-react": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", + "requires": { + "mobx-react-lite": "^3.4.0" + } + }, + "mobx-react-lite": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", + "requires": {} + }, + "mobx-utils": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/mobx-utils/-/mobx-utils-6.0.6.tgz", + "integrity": "sha512-lzJtxOWgj3Dp2HeXviInV3ZRY4YhThzRHXuy90oKXDH2g+ymJGIts4bdjb7NQuSi34V25cMZoQX7TkHJQuKLOQ==", + "requires": {} + }, + "mock-http": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mock-http/-/mock-http-1.1.0.tgz", + "integrity": "sha512-H2HMGaHNQPWY8PdeEw4RFux2WEOHD6eJAtN3+iFELik5kGjPKAcoyPWcsC2vgDiTa2yimAEDssmMed51e+cBKQ==", + "dev": true, + "requires": { + "mergee": "^1.0.0" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "requires": { + "moment": "^2.29.4" + } + }, + "monaco-editor": { + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.37.1.tgz", + "integrity": "sha512-jLXEEYSbqMkT/FuJLBZAVWGuhIb4JNwHE9kPTorAVmsdZ4UzHAfgWxLsVtD7pLRFaOwYPhNG9nUCpmFL1t/dIg==", + "dev": true + }, + "monaco-editor-webpack-plugin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.0.1.tgz", + "integrity": "sha512-M8qIqizltrPlIbrb73cZdTWfU9sIsUVFvAZkL3KGjAHmVWEJ0hZKa/uad14JuOckc0GwnCaoGHvMoYtJjVyCzw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.2" + } + }, + "moo-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", + "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", + "dev": true, + "requires": { + "color-name": "^1.1.4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } + } + }, + "mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-abi": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "requires": { + "semver": "^7.3.5" + } + }, + "node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node-api-version": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", + "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", + "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0" + } + }, + "node-pty": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", + "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", + "requires": { + "nan": "^2.14.0" + } + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.1.0.tgz", + "integrity": "sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q==", + "dev": true, + "requires": { + "abbrev": "^2.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "bundled": true, + "optional": true + }, + "@gar/promisify": { + "version": "1.1.3", + "bundled": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "bundled": true + }, + "@npmcli/arborist": { + "version": "5.6.3", + "bundled": true, + "requires": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/ci-detect": { + "version": "2.0.0", + "bundled": true + }, + "@npmcli/config": { + "version": "4.2.2", + "bundled": true, + "requires": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/disparity-colors": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-styles": "^4.3.0" + } + }, + "@npmcli/fs": { + "version": "2.1.2", + "bundled": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.2", + "bundled": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "bundled": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "npm-bundled": { + "version": "1.1.2", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + } + } + }, + "@npmcli/map-workspaces": { + "version": "2.0.4", + "bundled": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + } + }, + "@npmcli/metavuln-calculator": { + "version": "3.1.1", + "bundled": true, + "requires": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "bundled": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "bundled": true + }, + "@npmcli/package-json": { + "version": "2.0.0", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "bundled": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/query": { + "version": "1.2.0", + "bundled": true, + "requires": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + } + }, + "@npmcli/run-script": { + "version": "4.2.1", + "bundled": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "bundled": true + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "agent-base": { + "version": "6.0.2", + "bundled": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "bundled": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "bundled": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aproba": { + "version": "2.0.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true + }, + "bin-links": { + "version": "3.0.3", + "bundled": true, + "requires": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "bundled": true + } + } + }, + "binary-extensions": { + "version": "2.2.0", + "bundled": true + }, + "brace-expansion": { + "version": "2.0.1", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "builtins": { + "version": "5.0.1", + "bundled": true, + "requires": { + "semver": "^7.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "bundled": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "bundled": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "bundled": true + }, + "cidr-regex": { + "version": "3.1.1", + "bundled": true, + "requires": { + "ip-regex": "^4.1.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "bundled": true + }, + "cli-columns": { + "version": "4.0.0", + "bundled": true, + "requires": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "cli-table3": { + "version": "0.6.2", + "bundled": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "clone": { + "version": "1.0.4", + "bundled": true + }, + "cmd-shim": { + "version": "5.0.0", + "bundled": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true + }, + "color-support": { + "version": "1.1.3", + "bundled": true + }, + "columnify": { + "version": "1.6.0", + "bundled": true, + "requires": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + } + }, + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "cssesc": { + "version": "3.0.0", + "bundled": true + }, + "debug": { + "version": "4.3.4", + "bundled": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "depd": { + "version": "1.1.2", + "bundled": true + }, + "dezalgo": { + "version": "1.0.4", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.1.0", + "bundled": true + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true + }, + "encoding": { + "version": "0.1.13", + "bundled": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "bundled": true + }, + "err-code": { + "version": "2.0.3", + "bundled": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "bundled": true + }, + "fs-minipass": { + "version": "2.1.0", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "gauge": { + "version": "4.0.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "glob": { + "version": "8.0.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "bundled": true + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "5.2.1", + "bundled": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "bundled": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-walk": { + "version": "5.0.1", + "bundled": true, + "requires": { + "minimatch": "^5.0.1" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "indent-string": { + "version": "4.0.0", + "bundled": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "3.0.1", + "bundled": true + }, + "init-package-json": { + "version": "3.0.2", + "bundled": true, + "requires": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + } + }, + "ip": { + "version": "2.0.0", + "bundled": true + }, + "ip-regex": { + "version": "4.3.0", + "bundled": true + }, + "is-cidr": { + "version": "4.0.2", + "bundled": true, + "requires": { + "cidr-regex": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.10.0", + "bundled": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true + }, + "is-lambda": { + "version": "1.0.1", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "bundled": true + }, + "json-stringify-nice": { + "version": "1.1.4", + "bundled": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "just-diff": { + "version": "5.1.1", + "bundled": true + }, + "just-diff-apply": { + "version": "5.4.1", + "bundled": true + }, + "libnpmaccess": { + "version": "6.0.4", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmdiff": { + "version": "4.0.5", + "bundled": true, + "requires": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + } + }, + "libnpmexec": { + "version": "4.0.14", + "bundled": true, + "requires": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + } + }, + "libnpmfund": { + "version": "3.0.5", + "bundled": true, + "requires": { + "@npmcli/arborist": "^5.6.3" + } + }, + "libnpmhook": { + "version": "8.0.4", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmorg": { + "version": "4.0.4", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmpack": { + "version": "4.1.3", + "bundled": true, + "requires": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + } + }, + "libnpmpublish": { + "version": "6.0.5", + "bundled": true, + "requires": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + } + }, + "libnpmsearch": { + "version": "5.0.4", + "bundled": true, + "requires": { + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmteam": { + "version": "4.0.4", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmversion": { + "version": "3.0.7", + "bundled": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + } + }, + "lru-cache": { + "version": "7.13.2", + "bundled": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "bundled": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "bundled": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.4", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.1", + "bundled": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "bundled": true + }, + "mute-stream": { + "version": "0.0.8", + "bundled": true + }, + "negotiator": { + "version": "0.6.3", + "bundled": true + }, + "node-gyp": { + "version": "9.1.0", + "bundled": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nopt": { + "version": "5.0.0", + "bundled": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "nopt": { + "version": "6.0.0", + "bundled": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "4.0.1", + "bundled": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-audit-report": { + "version": "3.0.0", + "bundled": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "npm-bundled": { + "version": "2.0.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^2.0.0" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "bundled": true + } + } + }, + "npm-install-checks": { + "version": "5.0.0", + "bundled": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, + "npm-package-arg": { + "version": "9.1.0", + "bundled": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-packlist": { + "version": "5.1.3", + "bundled": true, + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "bundled": true + } + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "bundled": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "bundled": true + } + } + }, + "npm-profile": { + "version": "6.2.1", + "bundled": true, + "requires": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "bundled": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true + }, + "npmlog": { + "version": "6.0.2", + "bundled": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true + }, + "p-map": { + "version": "4.0.0", + "bundled": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pacote": { + "version": "13.6.2", + "bundled": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + } + }, + "parse-conflict-json": { + "version": "2.0.2", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "postcss-selector-parser": { + "version": "6.0.10", + "bundled": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "proc-log": { + "version": "2.0.1", + "bundled": true + }, + "promise-all-reject-late": { + "version": "1.0.1", + "bundled": true + }, + "promise-call-limit": { + "version": "1.0.1", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "promise-retry": { + "version": "2.0.1", + "bundled": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "3.0.0", + "bundled": true + }, + "read-package-json": { + "version": "5.0.2", + "bundled": true, + "requires": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "bundled": true + } + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "retry": { + "version": "0.12.0", + "bundled": true + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "semver": { + "version": "7.3.7", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.7", + "bundled": true + }, + "smart-buffer": { + "version": "4.2.0", + "bundled": true + }, + "socks": { + "version": "2.7.0", + "bundled": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "bundled": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "bundled": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "bundled": true + }, + "ssri": { + "version": "9.0.1", + "bundled": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "bundled": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.11", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, + "treeverse": { + "version": "2.0.0", + "bundled": true + }, + "unique-filename": { + "version": "2.0.1", + "bundled": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "bundled": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "walk-up-path": { + "version": "1.0.0", + "bundled": true + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "4.0.2", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^3.0.0" + } + }, + "npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", + "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", + "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", + "dev": true, + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + } + } + }, + "npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "requires": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "npm-registry-fetch": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.4.tgz", + "integrity": "sha512-pMS2DRkwg+M44ct65zrN/Cr9IHK1+n6weuefAo6Er4lc+/8YBCU0Czq04H3ZiSigluh7pb2rMM5JpgcytctB+Q==", + "dev": true, + "requires": { + "make-fetch-happen": "^11.0.0", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz", + "integrity": "sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.2.tgz", + "integrity": "sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + } + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", + "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" + }, + "nx": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.9.2.tgz", + "integrity": "sha512-wtcs+wsuplSckvgk+bV+/XuGlo+sVWzSG0RpgWBjQYeqA3QsVFEAPVY66Z5cSoukDbTV77ddcAjEw+Rz8oOR1A==", + "dev": true, + "requires": { + "@nrwl/cli": "15.9.2", + "@nrwl/nx-darwin-arm64": "15.9.2", + "@nrwl/nx-darwin-x64": "15.9.2", + "@nrwl/nx-linux-arm-gnueabihf": "15.9.2", + "@nrwl/nx-linux-arm64-gnu": "15.9.2", + "@nrwl/nx-linux-arm64-musl": "15.9.2", + "@nrwl/nx-linux-x64-gnu": "15.9.2", + "@nrwl/nx-linux-x64-musl": "15.9.2", + "@nrwl/nx-win32-arm64-msvc": "15.9.2", + "@nrwl/nx-win32-x64-msvc": "15.9.2", + "@nrwl/tao": "15.9.2", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "optional": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "optional": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "open-in-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/open-in-editor/-/open-in-editor-2.2.0.tgz", + "integrity": "sha512-ZQJDm2lmIgR2GkuwzjrlkVmT2KpDVp0Nnnb3LtYLe3Xi3cQhDa1vnh4IIlrT35a46OLZ8nlKJNOsx2B85FOS+Q==", + "dev": true, + "requires": { + "clap": "^1.1.3", + "os-homedir": "~1.0.2" + } + }, + "open-lens": { + "version": "file:packages/open-lens", + "requires": { + "@electron/rebuild": "^3.2.10", + "@k8slens/application": "^6.5.0-alpha.4", + "@k8slens/application-for-electron-main": "^6.5.0-alpha.3", + "@k8slens/core": "^6.5.0-alpha.8", + "@k8slens/ensure-binaries": "^6.5.0-alpha.4", + "@k8slens/event-emitter": "^1.0.0-alpha.1", + "@k8slens/eslint-config": "^6.5.0-alpha.2", + "@k8slens/feature-core": "^6.5.0-alpha.3", + "@k8slens/generate-tray-icons": "^6.5.0-alpha.4", + "@k8slens/keyboard-shortcuts": "^1.0.0-alpha.3", + "@k8slens/kube-object": "^1.0.0-alpha.1", + "@k8slens/kubectl-versions": "^1.0.0-alpha.2", + "@k8slens/legacy-extension-example": "^1.0.0-alpha.6", + "@k8slens/legacy-extensions": "^1.0.0-alpha.3", + "@k8slens/legacy-global-di": "^1.0.0-alpha.0", + "@k8slens/messaging": "^1.0.0-alpha.3", + "@k8slens/messaging-for-main": "^1.0.0-alpha.3", + "@k8slens/messaging-for-renderer": "^1.0.0-alpha.3", + "@k8slens/node-fetch": "^6.5.0-alpha.3", + "@k8slens/react-application": "^1.0.0-alpha.2", + "@k8slens/run-many": "^1.0.0-alpha.3", + "@k8slens/startable-stoppable": "^1.0.0-alpha.2", + "@k8slens/test-utils": "^1.0.0-alpha.3", + "@k8slens/utilities": "^1.0.0-alpha.2", + "@ogre-tools/fp": "^15.8.1", + "@ogre-tools/injectable": "^15.8.1", + "@ogre-tools/injectable-extension-for-auto-registration": "^15.8.1", + "@ogre-tools/injectable-extension-for-mobx": "^15.8.1", + "@ogre-tools/injectable-react": "^15.8.1", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.53", + "@swc/jest": "^0.2.26", + "@types/byline": "^4.2.33", + "@types/chart.js": "^2.9.36", + "@types/color": "^3.0.3", + "@types/crypto-js": "^3.1.47", + "@types/lodash": "^4.14.191", + "@types/node": "^16.18.25", + "@types/proper-lockfile": "^4.1.2", + "@types/react-dom": "^17.0.16", + "@types/react-router-dom": "^5.3.3", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", + "@types/request-promise-native": "^1.0.18", + "@types/tar": "^6.1.4", + "@types/tcp-port-used": "^1.0.1", + "@types/url-parse": "^1.4.8", + "@types/uuid": "^8.3.4", + "@types/webpack": "^5.28.1", + "@types/webpack-dev-server": "^4.7.2", + "@types/webpack-env": "^1.18.0", + "@types/webpack-node-externals": "2.5.3", + "autoprefixer": "^10.4.13", + "circular-dependency-plugin": "^5.2.2", + "concurrently": "^7.6.0", + "copy-webpack-plugin": "^11.0.0", + "cross-env": "^7.0.3", + "css-loader": "^6.7.2", + "electron": "^22.3.7", + "electron-builder": "^23.6.0", + "electron-notarize": "^0.3.0", + "esbuild-loader": "^2.20.0", + "fork-ts-checker-webpack-plugin": "^7.3.0", + "html-webpack-plugin": "^5.5.1", + "jest": "^29.5.0", + "jest-environment-jsdom": "^28.1.3", + "jsonfile": "^6.1.0", + "mini-css-extract-plugin": "^2.7.1", + "mobx": "^6.8.0", + "monaco-editor": "^0.37.1", + "monaco-editor-webpack-plugin": "^7.0.1", + "node-loader": "^2.0.0", + "nodemon": "^2.0.20", + "playwright": "^1.33.0", + "react-refresh": "^0.14.0", + "react-refresh-typescript": "^2.0.7", + "react-select": "^5.7.0", + "rimraf": "^4.4.1", + "run-script-os": "^1.1.6", + "style-loader": "^3.3.1", + "tailwindcss": "^3.3.2", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", + "type-fest": "^2.14.0", + "typed-emitter": "^1.4.0", + "typescript": "^4.9.5", + "typescript-plugin-css-modules": "^4.1.1", + "webpack": "^5.81.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.13.3", + "webpack-node-externals": "^3.0.0", + "xterm-addon-fit": "^0.7.0" + }, + "dependencies": { + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "stylus": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", + "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.0.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.2.4", + "source-map": "^0.7.3" + } + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "typescript-plugin-css-modules": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-4.2.3.tgz", + "integrity": "sha512-jEEP2oUPOqR89QGgvPK2HSTZLkrCeKZQ9EwiNxm9VUcufUbNY1Tv053fPKRq6c13PMQjlBU3WrQjKN8u0j5Y6w==", + "dev": true, + "requires": { + "@types/postcss-modules-local-by-default": "^4.0.0", + "@types/postcss-modules-scope": "^3.0.1", + "dotenv": "^16.0.3", + "icss-utils": "^5.1.0", + "less": "^4.1.3", + "lodash.camelcase": "^4.3.0", + "postcss": "^8.4.21", + "postcss-load-config": "^3.1.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "reserved-words": "^0.1.2", + "sass": "^1.58.3", + "source-map-js": "^1.0.2", + "stylus": "^0.59.0", + "tsconfig-paths": "^4.1.2" + }, + "dependencies": { + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + } + } + } + } + }, + "openid-client": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.2.tgz", + "integrity": "sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==", + "optional": true, + "requires": { + "jose": "^4.14.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "requires": { + "arch": "^2.1.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-map-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", + "dev": true + }, + "p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true + }, + "p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + } + }, + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "p-waterfall": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", + "dev": true, + "requires": { + "p-reduce": "^2.0.0" + } + }, + "pacote": { + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "dev": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-pick-manifest": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + } + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + } + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "requires": { + "protocols": "^2.0.0" + } + }, + "parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "requires": { + "parse-path": "^7.0.0" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "requires": { + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true + }, + "peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "requires": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "playwright": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.33.0.tgz", + "integrity": "sha512-+zzU3V2TslRX2ETBRgQKsKytYBkJeLZ2xzUj4JohnZnxQnivoUvOvNbRBYWSYykQTO0Y4zb8NwZTYFUO+EpPBQ==", + "dev": true, + "requires": { + "playwright-core": "1.33.0" + } + }, + "playwright-core": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", + "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", + "dev": true + }, + "plist": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", + "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "dev": true, + "requires": { + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-filter-plugins": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-3.0.1.tgz", + "integrity": "sha512-tRKbW4wWBEkSSFuJtamV2wkiV9rj6Yy7P3Y13+zaynlPEEZt8EgYKn3y/RBpMeIhNmHXFlSdzofml65hD5OafA==", + "requires": { + "postcss": "^6.0.14" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-icss-keyframes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/postcss-icss-keyframes/-/postcss-icss-keyframes-0.2.1.tgz", + "integrity": "sha512-4m+hLY5TVqoTM198KKnzdNudyu1OvtqwD+8kVZ9PNiEO4+IfHYoyVvEXsOHjV8nZ1k6xowf+nY4HlUfZhOFvvw==", + "requires": { + "icss-utils": "^3.0.1", + "postcss": "^6.0.2", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "icss-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-3.0.1.tgz", + "integrity": "sha512-ANhVLoEfe0KoC9+z4yiTaXOneB49K6JIXdS+yAgH0NERELpdIT7kkj2XxUPuHafeHnn8umXnECSpsfk1RTaUew==", + "requires": { + "postcss": "^6.0.2" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-icss-selectors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-icss-selectors/-/postcss-icss-selectors-2.0.3.tgz", + "integrity": "sha512-dxFtq+wscbU9faJaH8kIi98vvCPDbt+qg1g9GoG0os1PY3UvgY1Y2G06iZrZb1iVC9cyFfafwSY1IS+IQpRQ4w==", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "generic-names": "^1.0.2", + "icss-utils": "^3.0.1", + "lodash": "^4.17.4", + "postcss": "^6.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "icss-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-3.0.1.tgz", + "integrity": "sha512-ANhVLoEfe0KoC9+z4yiTaXOneB49K6JIXdS+yAgH0NERELpdIT7kkj2XxUPuHafeHnn8umXnECSpsfk1RTaUew==", + "requires": { + "postcss": "^6.0.2" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "peer": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "peer": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true + }, + "promise-call-limit": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", + "dev": true, + "requires": { + "read": "1" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomcolor": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz", + "integrity": "sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-material-ui-carousel": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/react-material-ui-carousel/-/react-material-ui-carousel-2.3.11.tgz", + "integrity": "sha512-rsD9D2JLDBTfinaPy1+hcb7gunfdX7jmga7xESfRCCtLXzokOrkhmx4qMd8dZmYY42zc/HbYqLqg9E/d187lbw==", + "requires": { + "auto-bind": "^2.1.1", + "react-swipeable": "^6.1.0" + }, + "dependencies": { + "auto-bind": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.1.tgz", + "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==", + "requires": { + "@types/react": "^17" + } + } + } + }, + "react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "react-refresh-typescript": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/react-refresh-typescript/-/react-refresh-typescript-2.0.9.tgz", + "integrity": "sha512-chAnOO4vpxm/3WkgOVmti+eN8yUtkJzeGkOigV6UA9eDFz12W34e/SsYe2H5+RwYJ3+sfSZkVbiXcG1chEBxlg==", + "dev": true, + "requires": {} + }, + "react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-select": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.2.tgz", + "integrity": "sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "dependencies": { + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "dev": true + } + } + }, + "react-select-event": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/react-select-event/-/react-select-event-5.5.1.tgz", + "integrity": "sha512-goAx28y0+iYrbqZA2FeRTreHHs/ZtSuKxtA+J5jpKT5RHPCbVZJ4MqACfPnWyFXsEec+3dP5bCrNTxIX8oYe9A==", + "dev": true, + "requires": { + "@testing-library/dom": ">=7" + } + }, + "react-swipeable": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/react-swipeable/-/react-swipeable-6.2.2.tgz", + "integrity": "sha512-Oz7nSFrssvq2yvy05aNL3F+yBUqSvLsK6x1mu+rQFOpMdQVnt4izKt1vyjvvTb70q6GQOaSpaB6qniROW2MAzQ==", + "requires": {} + }, + "react-table": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", + "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", + "dev": true, + "requires": {} + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-virtualized-auto-sizer": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.15.tgz", + "integrity": "sha512-01yhkssgHShMiu5W8k+86kgl8lutpl+Uef9KP4wrozXnzZjxWIgj+cH8Qi064oQpKD8myn/JNMzp4tcZNQ3Avg==", + "requires": {} + }, + "react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "read-cmd-shim": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz", + "integrity": "sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==", + "dev": true + }, + "read-config-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", + "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", + "dev": true, + "requires": { + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true + } + } + }, + "read-package-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", + "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", + "dev": true, + "requires": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "normalize-package-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + } + } + }, + "read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "requires": { + "readable-stream": "^3.6.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "requires": { + "resolve": "^1.9.0" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "peer": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "peer": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp-tree": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.25.tgz", + "integrity": "sha512-szcL3aqw+vEeuxhL1AMYRyeMP+goYF5I/guaH10uJX5xbGyeQeNPPneaj3ZWVmGLCDxrVaaYekkr5R12gk4dJw==", + "peer": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "peer": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "peer": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "peer": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", + "peer": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + }, + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==" + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfc4648": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + }, + "rfc6902": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rfc6902/-/rfc6902-5.0.1.tgz", + "integrity": "sha512-tYGfLpKIq9X7lrt4o3IkD9w9bpeAtsejfAqWNR98AoxfTsZqCepKa8eDlRiX8QMiCOD9vMx0/YbKLx0G1nPi5w==" + }, + "rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "requires": { + "glob": "^9.2.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "peer": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, + "rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-script-os": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", + "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", + "dev": true + }, + "rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "peer": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true, + "peer": true + }, + "semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true + }, + "semver-truncate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-2.0.0.tgz", + "integrity": "sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "peer": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true, + "peer": true + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "shiki": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", + "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "dev": true, + "requires": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "sigstore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz", + "integrity": "sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz", + "integrity": "sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.2.tgz", + "integrity": "sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + } + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "dev": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "optional": true, + "peer": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true + }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "requires": { + "bl": "^5.0.0" + }, + "dependencies": { + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" + }, + "stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "streamx": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.13.2.tgz", + "integrity": "sha512-+TWqixPhGDXEG9L/XczSbhfkmwAtGs3BJX5QNU6cvno+pOLKeszByWcnaTu6dg8efsTYqR8ZZuXWHhZfgrxMvA==", + "requires": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "peer": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strip-outer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", + "dev": true + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true + }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "style-loader": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", + "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", + "requires": {} + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "dev": true + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + } + } + }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "requires": { + "debug": "^4.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==" + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "tar-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.0.0.tgz", + "integrity": "sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==", + "requires": { + "b4a": "^1.6.1", + "bl": "^6.0.0", + "streamx": "^2.12.5" + }, + "dependencies": { + "bl": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.1.tgz", + "integrity": "sha512-zk1P1eAEBHhhB+4NfGxqmuV6NgwECnIoRgsOq2ObdEsmoFVIYzJ/Jjcgaj7JOY/8ekH27bIHSV4Si2T+evqu+Q==", + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } + } + } + }, + "tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "requires": { + "debug": "4.3.1", + "is2": "^2.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true + }, + "temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "terser": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "dependencies": { + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "requires": { + "tmp": "^0.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + }, + "dependencies": { + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "requires": { + "punycode": "^2.3.0" + } + }, + "traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } + } + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "requires": {} + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "ts-jest": { + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", + "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + } + } + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + } + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tuf-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.4.tgz", + "integrity": "sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A==", + "dev": true, + "requires": { + "@tufjs/models": "1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.0.tgz", + "integrity": "sha512-7ChuOzCb1LzdQZrTy0ky6RsCoMYeM+Fh4cY0+4zsJVhNcH5Q3OJojLY1mGkD0xAhWB29lskECVb6ZopofwjldA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.2.tgz", + "integrity": "sha512-/ZpF1CQaWYqjbhfFgKNt3azxztEpc/JUPuMkqOgrnMQqcU8CbE409AUdJYTIWryl3PP5CBaTJZT71N49MXP/YA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "ssri": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.3.tgz", + "integrity": "sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==", + "dev": true, + "requires": { + "minipass": "^4.0.0" + } + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typed-emitter": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz", + "integrity": "sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==" + }, + "typed-regex": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/typed-regex/-/typed-regex-0.0.8.tgz", + "integrity": "sha512-1XkGm1T/rUngbFROIOw9wPnMAKeMsRoc+c9O6GwOHz6aH/FrJFtcyd2sHASbT0OXeGLot5N1shPNpwHGTv9RdQ==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typedoc": { + "version": "0.24.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.6.tgz", + "integrity": "sha512-c3y3h45xJv3qYwKDAwU6Cl+26CjT0ZvblHzfHJ+SjQDM4p1mZxtgHky4lhmG0+nNarRht8kADfZlbspJWdZarQ==", + "dev": true, + "requires": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "typedoc-plugin-markdown": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.2.tgz", + "integrity": "sha512-OPXAL9hhdoVJzH/UaKAz6CBS/s8KlYyLWwnxF7ap0fQCuaMMWShA1JBq4n1SXbiGjx+7DOhOfTKQ5OzwryN3Vw==", + "dev": true, + "requires": { + "handlebars": "^4.7.7", + "typedoc-plugin-mdn-links": "^3.0.3" + } + }, + "typedoc-plugin-mdn-links": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-3.0.3.tgz", + "integrity": "sha512-NXhIpwQnsg7BcyMCHVqj3tUK+DL4g3Bt96JbFl4APzTGFkA+iM6GfZ/fn3TAqJ8O0CXG5R9BfWxolw1m1omNuQ==", + "dev": true, + "requires": {} + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + }, + "typescript-plugin-css-modules": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-3.4.0.tgz", + "integrity": "sha512-2MdjfSg4MGex1csCWRUwKD+MpgnvcvLLr9bSAMemU/QYGqBsXdez0cc06H/fFhLtRoKJjXg6PSTur3Gy1Umhpw==", + "requires": { + "dotenv": "^10.0.0", + "icss-utils": "^5.1.0", + "less": "^4.1.1", + "lodash.camelcase": "^4.3.0", + "postcss": "^8.3.0", + "postcss-filter-plugins": "^3.0.1", + "postcss-icss-keyframes": "^0.2.1", + "postcss-icss-selectors": "^2.0.3", + "postcss-load-config": "^3.0.1", + "reserved-words": "^0.1.2", + "sass": "^1.32.13", + "stylus": "^0.54.8", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + } + } + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "peer": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "peer": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "peer": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "peer": true + }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unit-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unit-compare/-/unit-compare-1.0.1.tgz", + "integrity": "sha512-AeLMQr8gcen2WOTwV0Gvi1nKKbY4Mms79MoltZ6hrZV/VANgE/YQly3jtWZJA/fa9m4ajhynq3XMqh5rOyZclA==", + "requires": { + "moment": "^2.14.1" + } + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unzip-crx-3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", + "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", + "requires": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "dev": true, + "requires": {} + }, + "use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "dev": true, + "requires": {} + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "dev": true, + "requires": { + "foreachasync": "^3.0.0" + } + }, + "walk-sync": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz", + "integrity": "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "ensure-posix-path": "^1.1.0", + "matcher-collection": "^2.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + } + } + }, + "walk-up-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "requires": { + "defaults": "^1.0.3" + } + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "webpack": { + "version": "5.81.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz", + "integrity": "sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + } + } + }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "requires": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "win-ca": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.5.0.tgz", + "integrity": "sha512-0TgO/+2iz2pS3OxBy2ikovPHOYyZRdLRxRTT9ze7DpZwEpaahLFOBuac93GM3lYEVzDyf8fXskJjIX/EILvkhQ==", + "requires": { + "is-electron": "^2.2.0", + "make-dir": "^1.3.0", + "node-forge": "^1.2.1", + "split": "^1.0.1" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, + "winston": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "requires": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + } + } + }, + "winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + } + }, + "winston-transport-browserconsole": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/winston-transport-browserconsole/-/winston-transport-browserconsole-1.0.5.tgz", + "integrity": "sha512-BFZDvknATAmsqaRY3WatB2S0eEb0ziwqBYIv+H0Fnu9oe7GnPUVQzEJC1frmLdNsfEkfnyR1PCNDBAFtZE3SuQ==", + "requires": { + "winston": "^3.2.1", + "winston-transport": "^4.3.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, + "requires": { + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" + }, + "dependencies": { + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + } + } + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "xterm": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.1.0.tgz", + "integrity": "sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ==", + "dev": true, + "peer": true + }, + "xterm-addon-fit": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz", + "integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==", + "dev": true, + "requires": {} + }, + "xterm-link-provider": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/xterm-link-provider/-/xterm-link-provider-1.3.1.tgz", + "integrity": "sha512-uOlaIeUED6kJeL2nIIf5YwreO0obMhsC0RWypEUmWkz7SAQewzgwdWFjQ2He7NGcT93c4KUf8bRgAu8cV9bAYA==", + "requires": { + "xterm": "^4.6.0" + }, + "dependencies": { + "xterm": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", + "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==" + } + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yaku": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", + "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==" + }, + "yalc": { + "version": "1.0.0-pre.53", + "resolved": "https://registry.npmjs.org/yalc/-/yalc-1.0.0-pre.53.tgz", + "integrity": "sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==", + "requires": { + "chalk": "^4.1.0", + "detect-indent": "^6.0.0", + "fs-extra": "^8.0.1", + "glob": "^7.1.4", + "ignore": "^5.0.4", + "ini": "^2.0.0", + "npm-packlist": "^2.1.5", + "yargs": "^16.1.1" + }, + "dependencies": { + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" + } } } diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 90ae34ae8b..21b5837f9a 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -12,6 +12,7 @@ module.exports = { "**/static/**/*", "**/site/**/*", "**/build/webpack/**/*", + "**/webpack/**/*", ], settings: { react: { @@ -106,6 +107,7 @@ module.exports = { extends: [ "eslint:recommended", "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", "plugin:react/recommended", "plugin:import/recommended", "plugin:import/typescript", @@ -116,8 +118,8 @@ module.exports = { "react-hooks", ], parserOptions: { - ecmaVersion: 2018, - sourceType: "module", + project: true, + tsconfigRootDir: "./tsconfig.json", }, rules: { "no-constant-condition": ["error", { @@ -126,19 +128,14 @@ module.exports = { "header/header": [2, "../../license-header"], "react/prop-types": "off", "no-invalid-this": "off", - "@typescript-eslint/no-invalid-this": ["error"], + "@typescript-eslint/no-invalid-this": "error", "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/interface-name-prefix": "off", "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/ban-ts-ignore": "off", "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", "no-restricted-imports": ["error", { "paths": [ { @@ -186,6 +183,11 @@ module.exports = { "named": "never", "asyncArrow": "always", }], + "@typescript-eslint/restrict-template-expressions": ["error", { + "allowNumber": true, + "allowBoolean": true, + "allowNever": true, + }], "@typescript-eslint/naming-convention": ["error", { "selector": "interface", @@ -217,7 +219,7 @@ module.exports = { "ignoreRestSiblings": true, }, ], - "comman-dangle": "off", + "comma-dangle": "off", "@typescript-eslint/comma-dangle": ["error", "always-multiline"], "comma-spacing": "off", "@typescript-eslint/comma-spacing": "error", @@ -296,5 +298,19 @@ module.exports = { }], }, }, + { + files: [ + "**/*.test.ts", + "**/*.test.tsx", + ], + plugins: [ + "jest", + ], + rules: { + "@typescript-eslint/unbound-method": "off", + "jest/unbound-method": "error", + "@typescript-eslint/no-unsafe-assignment": "off", + }, + }, ], }; diff --git a/packages/core/src/common/__tests__/create-resource-stack.test.ts b/packages/core/src/common/__tests__/create-resource-stack.test.ts index 5bf9cb1fe7..9a813da62f 100644 --- a/packages/core/src/common/__tests__/create-resource-stack.test.ts +++ b/packages/core/src/common/__tests__/create-resource-stack.test.ts @@ -5,9 +5,7 @@ import type { DiContainer } from "@ogre-tools/injectable"; import kubectlApplyAllInjectable from "../../main/kubectl/kubectl-apply-all.injectable"; import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import type { KubernetesCluster } from "../catalog-entities"; -import readDirectoryInjectable from "../fs/read-directory.injectable"; -import readFileInjectable from "../fs/read-file.injectable"; +import { KubernetesCluster } from "../catalog-entities"; import createResourceStackInjectable from "../k8s/create-resource-stack.injectable"; import appPathsStateInjectable from "../app-paths/app-paths-state.injectable"; import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; @@ -16,26 +14,35 @@ describe("create resource stack tests", () => { let di: DiContainer; let cluster: KubernetesCluster; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); - cluster = { - getId: () => "test-cluster", - } as any; + cluster = new KubernetesCluster({ + metadata: { + labels: {}, + name: "some-name", + uid: "test-cluster", + }, + spec: { + kubeconfigContext: "some-context", + kubeconfigPath: "/some-kubeconfig-path", + }, + status: { + phase: "some-phase", + }, + }); - di.override(readDirectoryInjectable, () => () => Promise.resolve(["file1"]) as any); - di.override(readFileInjectable, () => () => Promise.resolve("filecontents")); di.override(appPathsStateInjectable, () => ({ get: () => ({}), })); di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - + }); describe("kubectlApplyFolder", () => { it("returns response", async () => { di.override(kubectlApplyAllInjectable, () => () => Promise.resolve({ - callWasSuccessful: true as const, - response: "success", + isOk: true as const, + value: "success", })); const createResourceStack = di.inject(createResourceStackInjectable); @@ -48,7 +55,7 @@ describe("create resource stack tests", () => { it("throws on error", async () => { di.override(kubectlApplyAllInjectable, () => () => Promise.resolve({ - callWasSuccessful: false as const, + isOk: false as const, error: "No permissions", })); diff --git a/packages/core/src/common/__tests__/kube-helpers.test.ts b/packages/core/src/common/__tests__/kube-helpers.test.ts index ec466b5c56..d6466e4b1e 100644 --- a/packages/core/src/common/__tests__/kube-helpers.test.ts +++ b/packages/core/src/common/__tests__/kube-helpers.test.ts @@ -4,6 +4,7 @@ */ import { KubeConfig } from "@kubernetes/client-node"; +import assert from "assert"; import { validateKubeConfig, loadConfigFromString } from "../kube-helpers"; const kubeconfig = ` @@ -63,7 +64,7 @@ interface Kubeconfig { }]; kind: string; "current-context": string; - preferences: {}; + preferences: object; } let mockKubeConfig: Kubeconfig; @@ -78,30 +79,33 @@ describe("kube helpers", () => { describe("with default validation options", () => { describe("with valid kubeconfig", () => { it("does not return an error", () => { - expect(validateKubeConfig(kc, "valid")).toBeDefined(); + expect(validateKubeConfig(kc, "valid").isOk).toBe(true); }); }); describe("with invalid context object", () => { it("returns an error", () => { - expect(validateKubeConfig(kc, "invalid").error?.toString()).toEqual( - expect.stringContaining("No valid context object provided in kubeconfig for context 'invalid'"), - ); + const result = validateKubeConfig(kc, "invalid"); + + assert(result.isOk === false); + expect(result.error).toBe("No valid context object provided in kubeconfig for context 'invalid'"); }); }); describe("with invalid cluster object", () => { it("returns an error", () => { - expect(validateKubeConfig(kc, "invalidCluster").error?.toString()).toEqual( - expect.stringContaining("No valid cluster object provided in kubeconfig for context 'invalidCluster'"), - ); + const result = validateKubeConfig(kc, "invalidCluster"); + + assert(result.isOk === false); + expect(result.error).toBe("No valid cluster object provided in kubeconfig for context 'invalidCluster'"); }); }); describe("with invalid user object", () => { it("returns an error", () => { - expect(validateKubeConfig(kc, "invalidUser").error?.toString()).toEqual( - expect.stringContaining("No valid user object provided in kubeconfig for context 'invalidUser'"), - ); + const result = validateKubeConfig(kc, "invalidUser"); + + assert(result.isOk === false); + expect(result.error).toBe("No valid user object provided in kubeconfig for context 'invalidUser'"); }); }); }); @@ -115,13 +119,15 @@ describe("kube helpers", () => { describe("Check logger.error() output", () => { it("invalid yaml string", () => { const invalidYAMLString = "fancy foo config"; + const result = loadConfigFromString(invalidYAMLString); - expect(loadConfigFromString(invalidYAMLString).error).toBeInstanceOf(Error); + expect(result.isOk).toBe(false); }); it("empty contexts", () => { const emptyContexts = `apiVersion: v1\ncontexts: []`; + const result = loadConfigFromString(emptyContexts); - expect(loadConfigFromString(emptyContexts).error).toBeUndefined(); + expect(result.isOk).toBe(true); }); }); @@ -151,18 +157,20 @@ describe("kube helpers", () => { }; }); - it("single context is ok", async () => { - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + it("single context is ok", () => { + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); }); - it("multiple context is ok", async () => { + it("multiple context is ok", () => { mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "cluster-2" }, name: "cluster-2" }); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(2); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); + expect(result.value.contexts.length).toBe(2); }); }); @@ -192,43 +200,47 @@ describe("kube helpers", () => { }; }); - it("empty name in context causes it to be removed", async () => { + it("empty name in context causes it to be removed", () => { mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "cluster-2" }, name: "" }); expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); + expect(result.value.contexts.length).toBe(1); }); - it("empty cluster in context causes it to be removed", async () => { + it("empty cluster in context causes it to be removed", () => { mockKubeConfig.contexts.push({ context: { cluster: "", user: "cluster-2" }, name: "cluster-2" }); expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); + expect(result.value.contexts.length).toBe(1); }); - it("empty user in context causes it to be removed", async () => { + it("empty user in context causes it to be removed", () => { mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "" }, name: "cluster-2" }); expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); + expect(result.value.contexts.length).toBe(1); }); - it("invalid context in between valid contexts is removed", async () => { + it("invalid context in between valid contexts is removed", () => { mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "" }, name: "cluster-2" }); mockKubeConfig.contexts.push({ context: { cluster: "cluster-3", user: "cluster-3" }, name: "cluster-3" }); expect(mockKubeConfig.contexts.length).toBe(3); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); + const result = loadConfigFromString(JSON.stringify(mockKubeConfig)); - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(2); - expect(config.contexts[0].name).toBe("minikube"); - expect(config.contexts[1].name).toBe("cluster-3"); + assert(result.isOk === true); + expect(result.value.getCurrentContext()).toBe("minikube"); + expect(result.value.contexts.length).toBe(2); + expect(result.value.contexts[0].name).toBe("minikube"); + expect(result.value.contexts[1].name).toBe("cluster-3"); }); }); }); diff --git a/packages/core/src/common/__tests__/user-store.test.ts b/packages/core/src/common/__tests__/user-store.test.ts index 25c4f1eeea..cab7c9f108 100644 --- a/packages/core/src/common/__tests__/user-store.test.ts +++ b/packages/core/src/common/__tests__/user-store.test.ts @@ -23,7 +23,7 @@ describe("user store tests", () => { let resetTheme: ResetTheme; let di: DiContainer; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); di.override(writeFileInjectable, () => () => Promise.resolve()); @@ -55,7 +55,7 @@ describe("user store tests", () => { expect(state.colorTheme).toBe("light"); }); - it("correctly resets theme to default value", async () => { + it("correctly resets theme to default value", () => { state.colorTheme = "some other theme"; resetTheme(); expect(state.colorTheme).toBe(defaultThemeId); diff --git a/packages/core/src/common/app-event-bus/event-bus.ts b/packages/core/src/common/app-event-bus/event-bus.ts index d121b842f7..888c71de19 100644 --- a/packages/core/src/common/app-event-bus/event-bus.ts +++ b/packages/core/src/common/app-event-bus/event-bus.ts @@ -10,5 +10,5 @@ export interface AppEvent { name: string; action: string; destination?: string; - params?: Record; + params?: Record; } diff --git a/packages/core/src/common/app-paths/app-paths.test.ts b/packages/core/src/common/app-paths/app-paths.test.ts index 851ece4390..2d8023b129 100644 --- a/packages/core/src/common/app-paths/app-paths.test.ts +++ b/packages/core/src/common/app-paths/app-paths.test.ts @@ -38,7 +38,7 @@ describe("app-paths", () => { sessionData: "/some-irrelevant-user-data", // By default this points to userData }; - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override( getElectronAppPathInjectable, () => @@ -120,7 +120,7 @@ describe("app-paths", () => { let windowDi: DiContainer; beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override( directoryForIntegrationTestingInjectable, () => "/some-integration-testing-app-data", diff --git a/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts b/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts index 1c32b9ed6a..14934f0608 100644 --- a/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts +++ b/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts @@ -4,6 +4,12 @@ */ import { getInjectable } from "@ogre-tools/injectable"; +interface NonWebpackRequire { + resolve(name: string): string; +} + +declare const __non_webpack_require__: NonWebpackRequire; + const pathToNpmCliInjectable = getInjectable({ id: "path-to-npm-cli", instantiate: () => __non_webpack_require__.resolve("npm"), diff --git a/packages/core/src/common/catalog-entities/general.ts b/packages/core/src/common/catalog-entities/general.ts index 40988a95c8..aff20a6846 100644 --- a/packages/core/src/common/catalog-entities/general.ts +++ b/packages/core/src/common/catalog-entities/general.ts @@ -19,7 +19,7 @@ export class GeneralEntity extends CatalogEntity { - this.disconnect(); - broadcastMessage( + void this.disconnect(); + void broadcastMessage( IpcRendererNavigationEvents.NAVIGATE_IN_APP, "/catalog", ); diff --git a/packages/core/src/common/catalog-entities/web-link.ts b/packages/core/src/common/catalog-entities/web-link.ts index be11efe238..505f39c886 100644 --- a/packages/core/src/common/catalog-entities/web-link.ts +++ b/packages/core/src/common/catalog-entities/web-link.ts @@ -26,7 +26,7 @@ export class WebLink extends CatalogEntity any; +export type AddMenuFilter = (menu: CatalogEntityAddMenu) => unknown; export interface CatalogCategoryEvents { /** @@ -291,7 +291,7 @@ export interface CatalogEntitySettingsMenu { group?: string; title: string; components: { - View: React.ComponentType; + View: React.ComponentType>; }; } @@ -323,7 +323,7 @@ export interface CatalogEntityAddMenuContext { menuItems: CatalogEntityAddMenu[]; } -export type CatalogEntitySpec = Record; +export type CatalogEntitySpec = Record; export interface CatalogEntityData< @@ -409,7 +409,17 @@ export abstract class CatalogEntity< return this.status.enabled ?? true; } - public onRun?(context: CatalogEntityActionContext): void | Promise; - public onContextMenuOpen?(context: CatalogEntityContextMenuContext): void | Promise; - public onSettingsOpen?(context: CatalogEntitySettingsContext): void | Promise; + public onRun(context: CatalogEntityActionContext): void | Promise { + void context; + } + public onContextMenuOpen(context: CatalogEntityContextMenuContext): void | Promise { + void context; + } + + /** + * @deprecated This has never been used + */ + public onSettingsOpen(context: CatalogEntitySettingsContext): void | Promise { + void context; + } } diff --git a/packages/core/src/common/catalog/category-registry.ts b/packages/core/src/common/catalog/category-registry.ts index f541645df0..3223cedf58 100644 --- a/packages/core/src/common/catalog/category-registry.ts +++ b/packages/core/src/common/catalog/category-registry.ts @@ -3,13 +3,13 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { action, computed, observable, makeObservable } from "mobx"; +import { action, computed, observable, makeObservable, runInAction } from "mobx"; import { once } from "lodash"; import { iter, getOrInsertMap, strictSet } from "@k8slens/utilities"; import type { Disposer } from "@k8slens/utilities"; import type { CatalogCategory, CatalogEntityData, CatalogEntityKindData } from "./catalog-entity"; -export type CategoryFilter = (category: CatalogCategory) => any; +export type CategoryFilter = (category: CatalogCategory) => unknown; export class CatalogCategoryRegistry { protected readonly categories = observable.set(); @@ -22,16 +22,18 @@ export class CatalogCategoryRegistry { makeObservable(this); } - @action add(category: CatalogCategory): Disposer { - const byGroup = getOrInsertMap(this.groupKinds, category.spec.group); + add(category: CatalogCategory): Disposer { + return runInAction(() => { + const byGroup = getOrInsertMap(this.groupKinds, category.spec.group); - this.categories.add(category); - strictSet(byGroup, category.spec.names.kind, category); + this.categories.add(category); + strictSet(byGroup, category.spec.names.kind, category); - return () => { - this.categories.delete(category); - byGroup.delete(category.spec.names.kind); - }; + return action(() => { + this.categories.delete(category); + byGroup.delete(category.spec.names.kind); + }); + }); } getById(id: string) { diff --git a/packages/core/src/common/catalog/helpers.ts b/packages/core/src/common/catalog/helpers.ts index 75cdf726aa..3d34d1e509 100644 --- a/packages/core/src/common/catalog/helpers.ts +++ b/packages/core/src/common/catalog/helpers.ts @@ -54,7 +54,7 @@ export function getShortName(entity: CatalogEntity): string { } export function getIconColourHash(entity: CatalogEntity): string { - return `${entity.metadata.name}-${entity.metadata.source}`; + return `${entity.metadata.name}-${entity.metadata.source ?? ""}`; } export function getIconBackground(entity: CatalogEntity): string | undefined { diff --git a/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts b/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts index eb1a2abeba..b100930ed0 100644 --- a/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts +++ b/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts @@ -14,7 +14,7 @@ const visitEntityContextMenuInjectable = getInjectable({ const categoryRegistry = di.inject(catalogCategoryRegistryInjectable); return (entity, context) => { - entity.onContextMenuOpen?.(context); + void entity.onContextMenuOpen(context); categoryRegistry.getCategoryForEntity(entity)?.emit("contextMenuOpen", entity, context); }; }, diff --git a/packages/core/src/common/cluster-types.ts b/packages/core/src/common/cluster-types.ts index a8ce7da912..13ca549036 100644 --- a/packages/core/src/common/cluster-types.ts +++ b/packages/core/src/common/cluster-types.ts @@ -3,12 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import Joi from "joi"; +import { z } from "zod"; /** * JSON serializable metadata type */ -export type ClusterMetadata = Record; +export type ClusterMetadata = Partial>; /** * Metadata for cluster's prometheus settings @@ -29,31 +29,55 @@ export type ClusterId = string; */ export type UpdateClusterModel = Omit; +export type Literal = z.infer; +export const literalSchema = z.string().or(z.number()).or(z.boolean()); + +export type Metadata = Literal | { [key: string]: Metadata } | Metadata[]; +export const metadataSchema: z.ZodType = z.lazy(() => z.union([literalSchema, z.array(metadataSchema), z.record(metadataSchema)])); + +export const prometheusPreferencesSchema = z.object({ + namespace: z.string(), + service: z.string(), + prefix: z.string(), + port: z.number(), +}); + +export const prometheusProviderPreferencesSchema = z.object({ + type: z.string(), +}); + +export const preferencesSchema = z.object({ + terminalCWD: z.string().min(1).optional(), + clusterName: z.string().min(1).optional(), + httpsProxy: z.string().min(1).optional(), + nodeShellImage: z.string().min(1).optional(), + imagePullSecret: z.string().min(1).optional(), + defaultNamespace: z.string().min(1).optional(), + iconOrder: z.number().optional(), + icon: z.nullable(z.string()).optional(), + hiddenMetrics: z.array(z.string()).optional(), + prometheus: prometheusPreferencesSchema.optional(), + prometheusProvider: prometheusProviderPreferencesSchema.optional(), +}); + /** * A type validator for `UpdateClusterModel` so that only expected types are present */ -export const updateClusterModelChecker = Joi.object({ - kubeConfigPath: Joi.string() - .required() - .min(1), - contextName: Joi.string() - .required() - .min(1), - preferences: Joi.object(), - metadata: Joi.object(), - accessibleNamespaces: Joi.array() - .items(Joi.string()), - labels: Joi.object().pattern(Joi.string(), Joi.string()), +export const updateClusterModelSchema = z.object({ + kubeConfigPath: z.string().min(1), + contextName: z.string().min(1), + preferences: preferencesSchema.optional(), + metadata: z.record(metadataSchema).optional(), + accessibleNamespaces: z.array(z.string()).optional(), + labels: z.record(z.string()).optional(), }); /** * A type validator for just the `id` fields of `ClusterModel`. The rest is * covered by `updateClusterModelChecker` */ -export const clusterModelIdChecker = Joi.object>({ - id: Joi.string() - .required() - .min(1), +export const clusterModelIdSchema = z.object({ + id: z.string().min(1), }); /** @@ -85,7 +109,7 @@ export interface ClusterModel { } /** - * This data is retreived from the kubeconfig file before calling the cluster constructor. + * This data is retrieved from the kubeconfig file before calling the cluster constructor. * * That is done to remove the external dependency on the construction of Cluster instances. */ diff --git a/packages/core/src/common/cluster/cluster.ts b/packages/core/src/common/cluster/cluster.ts index f703ebc336..cbe4fb8bb7 100644 --- a/packages/core/src/common/cluster/cluster.ts +++ b/packages/core/src/common/cluster/cluster.ts @@ -6,10 +6,12 @@ import { computed, observable, toJS, runInAction } from "mobx"; import type { KubeApiResource } from "../rbac"; import type { ClusterState, ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences, ClusterPrometheusPreferences, UpdateClusterModel } from "../cluster-types"; -import { ClusterMetadataKey, clusterModelIdChecker, updateClusterModelChecker } from "../cluster-types"; +import { ClusterMetadataKey, clusterModelIdSchema, updateClusterModelSchema } from "../cluster-types"; import type { IObservableValue } from "mobx"; import { replaceObservableObject } from "../utils/replace-observable-object"; import { pick } from "lodash"; +import type { ZodError } from "zod"; +import type { Result } from "@k8slens/utilities"; export class Cluster { /** @@ -20,12 +22,12 @@ export class Cluster { /** * Kubeconfig context name */ - readonly contextName = observable.box() as IObservableValue; + readonly contextName: IObservableValue; /** * Path to kubeconfig */ - readonly kubeConfigPath = observable.box() as IObservableValue; + readonly kubeConfigPath: IObservableValue; /** * Describes if we can detect that cluster is online @@ -117,15 +119,58 @@ export class Cluster { */ readonly prometheusPreferences = computed(() => pick(toJS(this.preferences), "prometheus", "prometheusProvider") as ClusterPrometheusPreferences); - constructor({ id, ...model }: ClusterModel) { - const { error } = clusterModelIdChecker.validate({ id }); + static create({ id, ...model }: ClusterModel): Result> { + const clusterIdResult = clusterModelIdSchema.safeParse({ id }); - if (error) { - throw error; + if (!clusterIdResult.success) { + return { + isOk: false, + error: clusterIdResult.error, + }; } + const updateModelResult = updateClusterModelSchema.safeParse(model); + + if (!updateModelResult.success) { + return { + isOk: false, + error: updateModelResult.error, + }; + } + + return { + isOk: true, + value: new Cluster(clusterIdResult.data.id, updateModelResult.data), + }; + } + + static createForTestingOnly({ id, ...model }: ClusterModel): Cluster { + const clusterIdResult = clusterModelIdSchema.parse({ id }); + const updateModelResult = updateClusterModelSchema.parse(model); + + return new Cluster(clusterIdResult.id, updateModelResult); + } + + private constructor(id: string, model: UpdateClusterModel) { this.id = id; - this.updateModel(model); + this.kubeConfigPath = observable.box(model.kubeConfigPath); + this.contextName = observable.box(model.contextName); + + if (model.preferences) { + replaceObservableObject(this.preferences, model.preferences); + } + + if (model.metadata) { + replaceObservableObject(this.metadata, model.metadata); + } + + if (model.accessibleNamespaces) { + this.accessibleNamespaces.replace(model.accessibleNamespaces); + } + + if (model.labels) { + replaceObservableObject(this.labels, model.labels); + } } /** @@ -133,13 +178,14 @@ export class Cluster { * * @param model */ - updateModel(model: UpdateClusterModel) { - // Note: do not assign ID as that should never be updated + updateModel(model: UpdateClusterModel): Result> { + const updateModelResult = updateClusterModelSchema.safeParse(model); - const { error } = updateClusterModelChecker.validate(model, { allowUnknown: true }); - - if (error) { - throw error; + if (!updateModelResult.success) { + return { + isOk: false, + error: updateModelResult.error, + }; } runInAction(() => { @@ -162,6 +208,11 @@ export class Cluster { replaceObservableObject(this.labels, model.labels); } }); + + return { + isOk: true, + value: this, + }; } toJSON(): ClusterModel { diff --git a/packages/core/src/common/cluster/create-can-i.injectable.ts b/packages/core/src/common/cluster/create-can-i.injectable.ts index 3613f4da84..2a5b1312fc 100644 --- a/packages/core/src/common/cluster/create-can-i.injectable.ts +++ b/packages/core/src/common/cluster/create-can-i.injectable.ts @@ -31,7 +31,7 @@ const createCanIInjectable = getInjectable({ return body.status?.allowed ?? false; } catch (error) { - logger.error(`[AUTHORIZATION-REVIEW]: failed to create access review: ${error}`, { resourceAttributes }); + logger.error(`[AUTHORIZATION-REVIEW]: failed to create access review: ${String(error)}`, { resourceAttributes }); return false; } diff --git a/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts b/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts index 0e2678cda7..8ab6fc24ff 100644 --- a/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts +++ b/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts @@ -32,7 +32,7 @@ const createRequestNamespaceListPermissionsInjectable = getInjectable({ }); if (!status || status.incomplete) { - logger.warn(`[AUTHORIZATION-NAMESPACE-REVIEW]: allowing all resources in namespace="${namespace}" due to incomplete SelfSubjectRulesReview: ${status?.evaluationError}`); + logger.warn(`[AUTHORIZATION-NAMESPACE-REVIEW]: allowing all resources in namespace="${namespace}" due to incomplete SelfSubjectRulesReview: ${status?.evaluationError ?? ""}`); return () => true; } diff --git a/packages/core/src/common/cluster/load-kubeconfig.injectable.ts b/packages/core/src/common/cluster/load-kubeconfig.injectable.ts index 4a420dadd3..59dcb4dee1 100644 --- a/packages/core/src/common/cluster/load-kubeconfig.injectable.ts +++ b/packages/core/src/common/cluster/load-kubeconfig.injectable.ts @@ -6,27 +6,17 @@ import type { KubeConfig } from "@kubernetes/client-node"; import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import type { Cluster } from "./cluster"; import loadConfigFromFileInjectable from "../kube-helpers/load-config-from-file.injectable"; -import type { ConfigResult } from "../kube-helpers"; +import type { AsyncResult } from "@k8slens/utilities"; +import type { ZodError } from "zod"; -export interface LoadKubeconfig { - (fullResult?: false): Promise; - (fullResult: true): Promise; -} +export type LoadKubeconfig = () => AsyncResult>; const loadKubeconfigInjectable = getInjectable({ id: "load-kubeconfig", instantiate: (di, cluster) => { const loadConfigFromFile = di.inject(loadConfigFromFileInjectable); - return (async (fullResult = false) => { - const result = await loadConfigFromFile(cluster.kubeConfigPath.get()); - - if (fullResult) { - return result; - } - - return result.config; - }) as LoadKubeconfig; + return () => loadConfigFromFile(cluster.kubeConfigPath.get()); }, lifecycle: lifecycleEnum.keyedSingleton({ getInstanceKey: (di, cluster: Cluster) => cluster.id, diff --git a/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts b/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts index 194b5ce7e5..6eb32b49d6 100644 --- a/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts +++ b/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts @@ -193,7 +193,7 @@ describe("requestNamespaceListPermissions", () => { status, spec: {}, }, - response: null as unknown as IncomingMessage, + value: null as unknown as IncomingMessage, }); }); diff --git a/packages/core/src/common/fetch/download-binary.injectable.ts b/packages/core/src/common/fetch/download-binary.injectable.ts index 9f0ce65093..17b50a5bfc 100644 --- a/packages/core/src/common/fetch/download-binary.injectable.ts +++ b/packages/core/src/common/fetch/download-binary.injectable.ts @@ -25,26 +25,26 @@ const downloadBinaryInjectable = getInjectable({ result = await fetch(url, opts as RequestInit); } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } if (result.status < 200 || 300 <= result.status) { return { - callWasSuccessful: false, + isOk: false, error: result.statusText, }; } try { return { - callWasSuccessful: true, - response: await result.buffer(), + isOk: true, + value: await result.buffer(), }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } diff --git a/packages/core/src/common/fetch/download-json/impl.ts b/packages/core/src/common/fetch/download-json/impl.ts index f691cc2762..7ea849ae1d 100644 --- a/packages/core/src/common/fetch/download-json/impl.ts +++ b/packages/core/src/common/fetch/download-json/impl.ts @@ -19,26 +19,26 @@ export const downloadJsonWith = (fetch: Fetch): DownloadJson => async (url, opts result = await fetch(url, opts as RequestInit); } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } if (result.status < 200 || 300 <= result.status) { return { - callWasSuccessful: false, + isOk: false, error: result.statusText, }; } try { return { - callWasSuccessful: true, - response: await result.json(), + isOk: true, + value: await result.json(), }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } diff --git a/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts b/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts index 29fb82867c..4f37d85531 100644 --- a/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts +++ b/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts @@ -18,9 +18,11 @@ type RequiredKeys = Exclude< type ObjectContainingNoRequired = T extends void ? never - : RequiredKeys extends [] - ? any - : never; + : ( + RequiredKeys extends [] + ? Record + : never + ); type ObjectContainsNoRequired = T extends ObjectContainingNoRequired ? true @@ -30,10 +32,12 @@ type ObjectContainsNoRequired = T extends ObjectContainingNoRequired // - Navigating to route without parameters, with parameters // - Navigating to route with required parameters, without parameters type Parameters = TParameters extends void - ? {} - : ObjectContainsNoRequired extends true - ? { parameters?: TParameters } - : { parameters: TParameters }; + ? { parameters?: undefined } + : ( + ObjectContainsNoRequired extends true + ? { parameters?: TParameters } + : { parameters: TParameters } + ); export type NavigateToRouteOptions = Parameters< InferParametersFrom diff --git a/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts b/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts index 560d62ce4a..ebd81c9a63 100644 --- a/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts +++ b/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts @@ -9,7 +9,7 @@ export interface NavigateToUrlOptions { forceRootFrame?: boolean; } -export type NavigateToUrl = (url: string, options?: NavigateToUrlOptions) => void; +export type NavigateToUrl = (url: string, options?: NavigateToUrlOptions) => void | Promise; export const navigateToUrlInjectionToken = getInjectionToken( { id: "navigate-to-url-injection-token" }, diff --git a/packages/core/src/common/fs/exec-file.injectable.ts b/packages/core/src/common/fs/exec-file.injectable.ts index 9ee0fae78f..28f022a3b1 100644 --- a/packages/core/src/common/fs/exec-file.injectable.ts +++ b/packages/core/src/common/fs/exec-file.injectable.ts @@ -6,6 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { ExecFileException, ExecFileOptions } from "child_process"; import { execFile } from "child_process"; import type { AsyncResult } from "@k8slens/utilities"; +import { isArray } from "@k8slens/utilities"; export type ExecFileError = ExecFileException & { stderr: string }; @@ -21,7 +22,7 @@ const execFileInjectable = getInjectable({ instantiate: (): ExecFile => { return (filePath: string, argsOrOptions?: string[] | ExecFileOptions, maybeOptions?: ExecFileOptions) => { const { args, options } = (() => { - if (Array.isArray(argsOrOptions)) { + if (isArray(argsOrOptions)) { return { args: argsOrOptions, options: maybeOptions ?? {}, @@ -38,13 +39,13 @@ const execFileInjectable = getInjectable({ execFile(filePath, args, options, (error, stdout, stderr) => { if (error) { resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(error, { stderr }), }); } else { resolve({ - callWasSuccessful: true, - response: stdout, + isOk: true, + value: stdout, }); } }); diff --git a/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts b/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts index 68d1fe4259..6849350cb8 100644 --- a/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts +++ b/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts @@ -6,6 +6,7 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import extractTarInjectable from "./extract-tar.injectable"; +// eslint-disable-next-line @typescript-eslint/require-await export default getGlobalOverride(extractTarInjectable, () => async () => { throw new Error("tried to extract a tar file without override"); }); diff --git a/packages/core/src/common/fs/fs.injectable.ts b/packages/core/src/common/fs/fs.injectable.ts index 16fbbd73aa..f29e806385 100644 --- a/packages/core/src/common/fs/fs.injectable.ts +++ b/packages/core/src/common/fs/fs.injectable.ts @@ -3,9 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import type { WriteFileOptions } from "fs"; import type { ReadOptions } from "fs-extra"; import fse from "fs-extra"; +export type FileSystemFunctions = ReturnType<(typeof fsInjectable)["instantiate"]>; + /** * NOTE: Add corresponding override of this injectable in `src/test-utils/override-fs-with-fakes.ts` */ @@ -40,13 +43,13 @@ const fsInjectable = getInjectable({ return { readFile, - readJson: readJson as (file: string, options?: ReadOptions | BufferEncoding) => Promise, + readJson: readJson as (file: string, options?: ReadOptions | BufferEncoding) => Promise, writeFile, - writeJson, + writeJson: writeJson as (file: string, value: unknown, options?: string | WriteFileOptions) => Promise, pathExists, readdir, readFileSync, - readJsonSync, + readJsonSync: readJsonSync as (file: string, options?: ReadOptions | BufferEncoding) => unknown, writeFileSync, writeJsonSync, pathExistsSync, diff --git a/packages/core/src/common/fs/read-json-file.injectable.ts b/packages/core/src/common/fs/read-json-file.injectable.ts index d270368cf9..894ef6bd0f 100644 --- a/packages/core/src/common/fs/read-json-file.injectable.ts +++ b/packages/core/src/common/fs/read-json-file.injectable.ts @@ -3,10 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { JsonValue } from "type-fest"; import fsInjectable from "./fs.injectable"; -export type ReadJson = (filePath: string) => Promise; +export type ReadJson = (filePath: string) => Promise; const readJsonFileInjectable = getInjectable({ id: "read-json-file", diff --git a/packages/core/src/common/fs/validate-directory.injectable.ts b/packages/core/src/common/fs/validate-directory.injectable.ts index 717caf5ec8..d6af229837 100644 --- a/packages/core/src/common/fs/validate-directory.injectable.ts +++ b/packages/core/src/common/fs/validate-directory.injectable.ts @@ -9,7 +9,7 @@ import type { Stats } from "fs-extra"; import { lowerFirst } from "lodash/fp"; import statInjectable from "./stat.injectable"; -export type ValidateDirectory = (path: string) => AsyncResult; +export type ValidateDirectory = (path: string) => AsyncResult; function getUserReadableFileType(stats: Stats): string { if (stats.isFile()) { @@ -46,13 +46,13 @@ const validateDirectoryInjectable = getInjectable({ const stats = await stat(path); if (stats.isDirectory()) { - return { callWasSuccessful: true, response: undefined }; + return { isOk: true, value: undefined }; } - return { callWasSuccessful: false, error: `the provided path is ${getUserReadableFileType(stats)} and not a directory.` }; + return { isOk: false, error: `the provided path is ${getUserReadableFileType(stats)} and not a directory.` }; } catch (error) { if (!isErrnoException(error)) { - return { callWasSuccessful: false, error: "of an unknown error, please try again." }; + return { isOk: false, error: "of an unknown error, please try again." }; } const humanReadableErrors: Record = { @@ -67,7 +67,7 @@ const validateDirectoryInjectable = getInjectable({ ? humanReadableErrors[error.code] : lowerFirst(String(error)); - return { callWasSuccessful: false, error: humanReadableError }; + return { isOk: false, error: humanReadableError }; } }; }, diff --git a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts b/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts index 5b83b7b573..d2e61e0fb7 100644 --- a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts +++ b/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts @@ -12,6 +12,7 @@ import readJsonSyncInjectable from "../fs/read-json-sync.injectable"; import writeJsonSyncInjectable from "../fs/write-json-sync.injectable"; import { get, has, set } from "lodash"; import semver from "semver"; +import type { Options as ConfOptions } from "conf/dist/source/types"; const MIGRATION_KEY = `__internal__.migrations.version`; @@ -43,16 +44,16 @@ export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { const readJsonSync = di.inject(readJsonSyncInjectable); const writeJsonSync = di.inject(writeJsonSyncInjectable); - return (options) => { + return (options: ConfOptions) => { assert(options.cwd, "Missing options.cwd"); assert(options.configName, "Missing options.configName"); assert(options.projectVersion, "Missing options.projectVersion"); const configFilePath = path.posix.join(options.cwd, `${options.configName}.json`); - let store: object = {}; + let store: Partial> = {}; try { - store = readJsonSync(configFilePath); + store = readJsonSync(configFilePath) as Partial>; } catch { // ignore } @@ -62,12 +63,12 @@ export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { return store; }, path: configFilePath, - get: (key: string) => get(store, key), + get: (key: string) => get(store, key) as unknown, set: (key: string, value: unknown) => { let currentState: Partial>; try { - currentState = readJsonSync(configFilePath); + currentState = readJsonSync(configFilePath) as Partial>; } catch { currentState = {}; } @@ -76,13 +77,13 @@ export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { ...currentState, [key]: value, }); - store = readJsonSync(configFilePath); + store = readJsonSync(configFilePath) as Partial>; }, delete: (key: string) => { let currentState: Partial>; try { - currentState = readJsonSync(configFilePath); + currentState = readJsonSync(configFilePath) as Partial>; } catch { currentState = {}; } @@ -90,20 +91,20 @@ export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { delete currentState[key]; writeJsonSync(configFilePath, currentState); - store = readJsonSync(configFilePath); + store = readJsonSync(configFilePath) as Partial>; }, has: (key: string) => has(store, key), clear: () => { writeJsonSync(configFilePath, {}); - store = readJsonSync(configFilePath); + store = readJsonSync(configFilePath) as Partial>; }, - } as Partial as Config; + } as Partial as Config; // Migrate { const migrations = options.migrations ?? []; const versionToMigrate = options.projectVersion; - let previousMigratedVersion = get(store, MIGRATION_KEY) || "0.0.0"; + let previousMigratedVersion = String(get(store, MIGRATION_KEY)) || "0.0.0"; const newerVersions = Object.entries(migrations) .filter(([candidateVersion]) => _shouldPerformMigration(candidateVersion, previousMigratedVersion, versionToMigrate)); @@ -118,7 +119,7 @@ export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { } catch (error) { store = storeBackup; - throw new Error(`Something went wrong during the migration! Changes applied to the store until this failed migration will be restored. ${error}`); + throw new Error(`Something went wrong during the migration! Changes applied to the store until this failed migration will be restored. ${String(error)}`); } } diff --git a/packages/core/src/common/helm/get-active-helm-repositories-channel.ts b/packages/core/src/common/helm/get-active-helm-repositories-channel.ts index ba4e0ae956..0f5e109b7b 100644 --- a/packages/core/src/common/helm/get-active-helm-repositories-channel.ts +++ b/packages/core/src/common/helm/get-active-helm-repositories-channel.ts @@ -8,5 +8,5 @@ import { getRequestChannel } from "@k8slens/messaging"; export const getActiveHelmRepositoriesChannel = getRequestChannel< void, - AsyncResult + AsyncResult >("get-helm-active-list-repositories"); diff --git a/packages/core/src/common/initializable-state/create.ts b/packages/core/src/common/initializable-state/create.ts index 51e0d8ed25..17cfba2880 100644 --- a/packages/core/src/common/initializable-state/create.ts +++ b/packages/core/src/common/initializable-state/create.ts @@ -4,6 +4,7 @@ */ import type { Runnable } from "@k8slens/run-many"; +import { isArray } from "@k8slens/utilities"; import type { DiContainerForInjection, Injectable, InjectionToken } from "@ogre-tools/injectable"; import { getInjectionToken, getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; @@ -67,7 +68,7 @@ export const getInjectablesForInitializable = ({ runAfter: rest.runAfter, }), injectionToken: (() => { - if (rest.runAfter && !Array.isArray(rest.runAfter)) { + if (rest.runAfter && !isArray(rest.runAfter)) { return rest.runAfter.injectionToken; } diff --git a/packages/core/src/common/ipc/broadcast-message.injectable.ts b/packages/core/src/common/ipc/broadcast-message.injectable.ts index 41db749d65..eaab780389 100644 --- a/packages/core/src/common/ipc/broadcast-message.injectable.ts +++ b/packages/core/src/common/ipc/broadcast-message.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { broadcastMessage } from "./ipc"; -export type BroadcastMessage = (channel: string, ...args: any[]) => Promise; +export type BroadcastMessage = (channel: string, ...args: unknown[]) => Promise; const broadcastMessageInjectable = getInjectable({ id: "broadcast-message", diff --git a/packages/core/src/common/ipc/ipc.ts b/packages/core/src/common/ipc/ipc.ts index 10a5fb33fc..ab8f7b6b04 100644 --- a/packages/core/src/common/ipc/ipc.ts +++ b/packages/core/src/common/ipc/ipc.ts @@ -10,6 +10,7 @@ import { ipcMain, ipcRenderer, webContents } from "electron"; import { toJS } from "../utils/toJS"; import type { Disposer } from "@k8slens/utilities"; +import { isArray } from "@k8slens/utilities"; import { getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; import ipcRendererInjectable from "../../renderer/utils/channel/ipc-renderer.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; @@ -18,19 +19,21 @@ import clusterFramesInjectable from "../cluster-frames.injectable"; export const broadcastMainChannel = "ipc:broadcast-main"; -export function ipcMainHandle(channel: string, listener: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any) { +export function ipcMainHandle(channel: string, listener: (event: Electron.IpcMainInvokeEvent, ...args: unknown[]) => unknown) { const di = getLegacyGlobalDiForExtensionApi(); const ipcMain = di.inject(ipcMainInjectionToken); - ipcMain.handle(channel, async (event, ...args) => { - return sanitizePayload(await listener(event, ...args)); + ipcMain.handle(channel, async (event, ...args: unknown[]) => { + return toJS(await listener(event, ...args)); }); } -export async function broadcastMessage(channel: string, ...args: any[]): Promise { +export async function broadcastMessage(channel: string, ...args: unknown[]): Promise { if (ipcRenderer) { - return ipcRenderer.invoke(broadcastMainChannel, channel, ...args.map(sanitizePayload)); + await ipcRenderer.invoke(broadcastMainChannel, channel, ...args.map(toJS)); + + return; } if (!webContents) { @@ -41,15 +44,23 @@ export async function broadcastMessage(channel: string, ...args: any[]): Promise const logger = di.inject(loggerInjectionToken); const clusterFrames = di.inject(clusterFramesInjectable); - ipcMain.listeners(channel).forEach((func) => func({ - processId: undefined, frameId: undefined, sender: undefined, senderFrame: undefined, - }, ...args)); + ipcMain.listeners(channel).forEach((func) => { + func( + { + processId: undefined, + frameId: undefined, + sender: undefined, + senderFrame: undefined, + }, + ...args, + ); + }); const views = webContents.getAllWebContents(); - if (!views || !Array.isArray(views) || views.length === 0) return; + if (!views || !isArray(views) || views.length === 0) return; - args = args.map(sanitizePayload); + args = args.map(toJS); for (const view of views) { let viewType = "unknown"; @@ -82,7 +93,7 @@ export async function broadcastMessage(channel: string, ...args: any[]): Promise } } -export function ipcMainOn(channel: string, listener: (event: Electron.IpcMainEvent, ...args: any[]) => any): Disposer { +export function ipcMainOn(channel: string, listener: (event: Electron.IpcMainEvent, ...args: unknown[]) => unknown): Disposer { const di = getLegacyGlobalDiForExtensionApi(); const ipcMain = di.inject(ipcMainInjectionToken); @@ -92,7 +103,7 @@ export function ipcMainOn(channel: string, listener: (event: Electron.IpcMainEve return () => ipcMain.off(channel, listener); } -export function ipcRendererOn(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { +export function ipcRendererOn(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: unknown[]) => unknown): Disposer { const di = getLegacyGlobalDiForExtensionApi(); const ipcRenderer = di.inject(ipcRendererInjectable); @@ -101,11 +112,3 @@ export function ipcRendererOn(channel: string, listener: (event: Electron.IpcRen return () => ipcRenderer.off(channel, listener); } - -/** - * Sanitizing data for IPC-messaging before send. - * Removes possible observable values to avoid exceptions like "can't clone object". - */ -function sanitizePayload(data: any): T { - return toJS(data); -} diff --git a/packages/core/src/common/item.store.ts b/packages/core/src/common/item.store.ts index cb9b27ed2e..bd47723cba 100644 --- a/packages/core/src/common/item.store.ts +++ b/packages/core/src/common/item.store.ts @@ -57,11 +57,11 @@ export abstract class ItemStore { * @param order whether to sort from least to greatest (`"asc"` (default)) or vice-versa (`"desc"`) */ @action - protected sortItems(items: Item[] = this.items, sorting: ((item: Item) => any)[] = [this.defaultSorting], order?: "asc" | "desc"): Item[] { + protected sortItems(items: Item[] = this.items, sorting: ((item: Item) => unknown)[] = [this.defaultSorting], order?: "asc" | "desc"): Item[] { return orderBy(items, sorting, order); } - protected async createItem(...args: any[]): Promise; + protected async createItem(...args: unknown[]): Promise; @action protected async createItem(request: () => Promise) { const newItem = await request(); @@ -78,7 +78,7 @@ export abstract class ItemStore { } } - protected async loadItems(...args: any[]): Promise; + protected async loadItems(...args: unknown[]): Promise; /** * Load items to this.items * @param request Function to return the items to be loaded. @@ -87,7 +87,7 @@ export abstract class ItemStore { * @returns */ @action - protected async loadItems(request: () => Promise, sortItems = true, concurrency = false) { + protected async loadItems(request: () => Promise, sortItems = true, concurrency = false) { if (this.isLoading) { await when(() => !this.isLoading); @@ -142,7 +142,7 @@ export abstract class ItemStore { } @action - protected async removeItem(item: Item, request: () => Promise) { + protected async removeItem(item: Item, request: () => Promise) { await request(); this.items.remove(item); this.selectedItemsIds.delete(item.getId()); @@ -173,19 +173,19 @@ export abstract class ItemStore { @action toggleSelectionAll(visibleItems: Item[] = this.items) { - const allSelected = visibleItems.every(this.isSelected); + const allSelected = visibleItems.every(item => this.isSelected(item)); - if (allSelected) { - visibleItems.forEach(this.unselect); - } else { - visibleItems.forEach(this.select); - } + visibleItems.forEach(( + allSelected + ? (item) => this.unselect(item) + : (item) => this.select(item) + )); } isSelectedAll(visibleItems: Item[] = this.items) { if (!visibleItems.length) return false; - return visibleItems.every(this.isSelected); + return visibleItems.every((item) => this.isSelected(item)); } @action @@ -202,7 +202,7 @@ export abstract class ItemStore { this.isLoading = false; } - async removeSelectedItems?(): Promise; + async removeSelectedItems?(): Promise; async removeItems?(items: Item[]): Promise; diff --git a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts b/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts index 3008b91916..9789be4bfa 100644 --- a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts +++ b/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts @@ -47,7 +47,7 @@ describe("ApiManager", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts index c73d024cce..204b65c284 100644 --- a/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts +++ b/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts @@ -12,7 +12,6 @@ import fetchInjectable from "../../fetch/fetch.injectable"; import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import { flushPromises } from "@k8slens/test-utils"; -import setupAutoRegistrationInjectable from "../../../renderer/before-frame-starts/runnables/setup-auto-registration.injectable"; import { createMockResponseFromString } from "../../../test-utils/mock-responses"; import storesAndApisCanBeCreatedInjectable from "../../../renderer/stores-apis-can-be-created.injectable"; import directoryForUserDataInjectable from "../../app-paths/directory-for-user-data/directory-for-user-data.injectable"; @@ -30,7 +29,7 @@ describe("KubeApi", () => { let apiManager: ApiManager; let di: DiContainer; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); fetchMock = asyncFn(); @@ -40,17 +39,13 @@ describe("KubeApi", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", })); apiManager = di.inject(apiManagerInjectable); - - const setupAutoRegistration = di.inject(setupAutoRegistrationInjectable); - - setupAutoRegistration.run(); }); describe("on first call to IngressApi.get()", () => { @@ -722,7 +717,7 @@ describe("KubeApi", () => { ], }, }); - horizontalPodAutoscalerApi.get({ + void horizontalPodAutoscalerApi.get({ name: "foo", namespace: "default", }); diff --git a/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts index 072f889824..33aa7342f1 100644 --- a/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts +++ b/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts @@ -14,7 +14,6 @@ import asyncFn from "@async-fn/jest"; import { flushPromises } from "@k8slens/test-utils"; import createKubeJsonApiInjectable from "../create-kube-json-api.injectable"; import type { KubeStatusData } from "@k8slens/kube-object"; -import setupAutoRegistrationInjectable from "../../../renderer/before-frame-starts/runnables/setup-auto-registration.injectable"; import { createMockResponseFromString } from "../../../test-utils/mock-responses"; import storesAndApisCanBeCreatedInjectable from "../../../renderer/stores-apis-can-be-created.injectable"; import directoryForUserDataInjectable from "../../app-paths/directory-for-user-data/directory-for-user-data.injectable"; @@ -40,7 +39,7 @@ describe("createKubeApiForRemoteCluster", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", @@ -144,7 +143,7 @@ describe("KubeApi", () => { const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", @@ -154,10 +153,6 @@ describe("KubeApi", () => { serverAddress: `http://127.0.0.1:9999`, apiBase: "/api-kube", })); - - const setupAutoRegistration = di.inject(setupAutoRegistrationInjectable); - - setupAutoRegistration.run(); }); describe("deleting pods (namespace scoped resource)", () => { diff --git a/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts index 5d458f7446..031a98261a 100644 --- a/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts +++ b/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts @@ -3,12 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { KubeObject } from "@k8slens/kube-object"; +import { isJsonApiData, isJsonApiDataList, isPartialJsonApiData } from "@k8slens/kube-object"; describe("KubeObject", () => { describe("isJsonApiData", () => { { - type TestCase = [any]; + type TestCase = [unknown]; const tests: TestCase[] = [ [false], [true], @@ -22,12 +22,12 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); + expect(isJsonApiData(input)).toBe(false); }); } { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], ["apiVersion", { kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], @@ -38,12 +38,12 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject with missing: %s", (missingField, input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); + expect(isJsonApiData(input)).toBe(false); }); } { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { kind: 1, apiVersion: "", metadata: {}}], ["apiVersion", { apiVersion: 1, kind: "", metadata: {}}], @@ -65,20 +65,20 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); + expect(isJsonApiData(input)).toBe(false); }); } it("should accept valid KubeJsonApiData (ignoring other fields)", () => { const valid = { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: "" }}}; - expect(KubeObject.isJsonApiData(valid)).toBe(true); + expect(isJsonApiData(valid)).toBe(true); }); }); describe("isPartialJsonApiData", () => { { - type TestCase = [any]; + type TestCase = [unknown]; const tests: TestCase[] = [ [false], [true], @@ -91,16 +91,16 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(false); + expect(isPartialJsonApiData(input)).toBe(false); }); } it("should accept {}", () => { - expect(KubeObject.isPartialJsonApiData({})).toBe(true); + expect(isPartialJsonApiData({})).toBe(true); }); { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], ["apiVersion", { kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], @@ -108,12 +108,12 @@ describe("KubeObject", () => { ]; it.each(tests)("should not reject with missing top level field: %s", (missingField, input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(true); + expect(isPartialJsonApiData(input)).toBe(true); }); } { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { kind: 1, apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], ["apiVersion", { apiVersion: 1, kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], @@ -135,23 +135,23 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(false); + expect(isPartialJsonApiData(input)).toBe(false); }); } it("should accept valid Partial (ignoring other fields)", () => { const valid = { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: "" }}}; - expect(KubeObject.isPartialJsonApiData(valid)).toBe(true); + expect(isPartialJsonApiData(valid)).toBe(true); }); }); describe("isJsonApiDataList", () => { - function isAny(val: unknown): val is any { + function isSomething(val: unknown): val is unknown { return true; } - function isNotAny(val: unknown): val is any { + function isNotSomething(val: unknown): val is unknown { return false; } @@ -160,7 +160,7 @@ describe("KubeObject", () => { } { - type TestCase = [any]; + type TestCase = [unknown]; const tests: TestCase[] = [ [false], [true], @@ -174,12 +174,12 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isJsonApiDataList(input, isAny)).toBe(false); + expect(isJsonApiDataList(input, isSomething)).toBe(false); }); } { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { apiVersion: "", items: [], metadata: { resourceVersion: "", selfLink: "" }}], ["apiVersion", { kind: "", items: [], metadata: { resourceVersion: "", selfLink: "" }}], @@ -187,12 +187,12 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject with missing: %s", (missingField, input) => { - expect(KubeObject.isJsonApiDataList(input, isAny)).toBe(false); + expect(isJsonApiDataList(input, isSomething)).toBe(false); }); } { - type TestCase = [string, any]; + type TestCase = [string, unknown]; const tests: TestCase[] = [ ["kind", { kind: 1, items: [], apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], ["apiVersion", { kind: "", items: [], apiVersion: 1, metadata: { resourceVersion: "", selfLink: "" }}], @@ -206,14 +206,14 @@ describe("KubeObject", () => { ]; it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isJsonApiDataList(input, isNotAny)).toBe(false); + expect(isJsonApiDataList(input, isNotSomething)).toBe(false); }); } it("should accept valid KubeJsonApiDataList (ignoring other fields)", () => { const valid = { kind: "", items: [false], apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}; - expect(KubeObject.isJsonApiDataList(valid, isBoolean)).toBe(true); + expect(isJsonApiDataList(valid, isBoolean)).toBe(true); }); }); }); diff --git a/packages/core/src/common/k8s-api/api-manager/api-manager.ts b/packages/core/src/common/k8s-api/api-manager/api-manager.ts index a42e29a5b5..1065554ad6 100644 --- a/packages/core/src/common/k8s-api/api-manager/api-manager.ts +++ b/packages/core/src/common/k8s-api/api-manager/api-manager.ts @@ -13,10 +13,10 @@ import { parseKubeApi, createKubeApiURL } from "@k8slens/kube-api"; import { getOrInsertWith, iter } from "@k8slens/utilities"; import type { CreateCustomResourceStore } from "./create-custom-resource-store.injectable"; -export type RegisterableStore = Store extends KubeObjectStore +export type RegisterableStore = Store extends KubeObjectStore ? Store : never; -export type RegisterableApi = Api extends KubeApi +export type RegisterableApi = Api extends KubeApi ? Api : never; export type KubeObjectStoreFrom = Api extends KubeApi diff --git a/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts b/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts deleted file mode 100644 index 47e53cd98c..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import EventEmitter from "events"; -import type TypedEventEmitter from "typed-emitter"; -import type { KubeApi } from "@k8slens/kube-api"; - -export interface LegacyAutoRegistration { - kubeApi: (api: KubeApi) => void; -} - -/** - * This is used to remove dependency cycles from auto registering of instances - * - * - Custom Resource Definitions get their own registered store (will need in the future) - * - All KubeApi's get auto registered (this should be changed in the future) - */ -const autoRegistrationEmitterInjectable = getInjectable({ - id: "auto-registration-emitter", - instantiate: (): TypedEventEmitter => new EventEmitter(), -}); - -export default autoRegistrationEmitterInjectable; diff --git a/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts b/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts index bbf272db24..05d49f8c87 100644 --- a/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts +++ b/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts @@ -2,9 +2,24 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectionToken } from "@ogre-tools/injectable"; +import type { DiContainerForInjection } from "@ogre-tools/injectable"; +import { getInjectable, getInjectionToken } from "@ogre-tools/injectable"; import type { KubeObjectStore } from "../kube-object.store"; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const kubeObjectStoreInjectionToken = getInjectionToken>({ id: "kube-object-store-token", }); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export interface KubeStoreInjectableParts> { + id: string; + instantiate: (di: DiContainerForInjection) => Store; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const getKubeStoreInjectable = >(parts: KubeStoreInjectableParts) => getInjectable({ + id: parts.id, + instantiate: (di) => parts.instantiate(di), + injectionToken: kubeObjectStoreInjectionToken, +}); diff --git a/packages/core/src/common/k8s-api/create-json-api.injectable.ts b/packages/core/src/common/k8s-api/create-json-api.injectable.ts index b8a67a424d..5a70dbf118 100644 --- a/packages/core/src/common/k8s-api/create-json-api.injectable.ts +++ b/packages/core/src/common/k8s-api/create-json-api.injectable.ts @@ -24,11 +24,11 @@ const createJsonApiInjectable = getInjectable({ return (config, reqInit) => { if (!config.getRequestOptions) { - config.getRequestOptions = async () => { + config.getRequestOptions = () => { const agent = new Agent({ ca: lensProxyCert.get().cert, }); - + return { agent, }; diff --git a/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts b/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts index d237d90660..5bb0c66489 100644 --- a/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts +++ b/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts @@ -19,16 +19,16 @@ export interface CreateKubeApiForLocalClusterConfig { } export interface CreateKubeApiForCluster { - , Data extends KubeJsonApiDataFor>( + , Data extends KubeJsonApiDataFor>( cluster: CreateKubeApiForLocalClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass: KubeApiConstructor, + kubeClass: KubeObjectConstructor, + apiClass: KubeApiConstructor, ): Api; - >( + >( cluster: CreateKubeApiForLocalClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass?: KubeApiConstructor>, - ): KubeApi; + kubeClass: KubeObjectConstructor, + apiClass?: KubeApiConstructor>, + ): KubeApi; } const createKubeApiForClusterInjectable = getInjectable({ diff --git a/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts b/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts index 28377d4e88..4fc43f9209 100644 --- a/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts +++ b/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts @@ -33,19 +33,19 @@ export interface CreateKubeApiForRemoteClusterConfig { agent?: Agent; } -export type KubeApiConstructor> = new (apiOpts: KubeApiOptions) => Api; +export type KubeApiConstructor> = new (apiOpts: KubeApiOptions) => Api; export interface CreateKubeApiForRemoteCluster { - , Data extends KubeJsonApiDataFor>( + , Data extends KubeJsonApiDataFor>( config: CreateKubeApiForRemoteClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass: KubeApiConstructor, + kubeClass: KubeObjectConstructor, + apiClass: KubeApiConstructor, ): Api; - >( + >( config: CreateKubeApiForRemoteClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass?: KubeApiConstructor>, - ): KubeApi; + kubeClass: KubeObjectConstructor, + apiClass?: KubeApiConstructor>, + ): KubeApi; } const createKubeApiForRemoteClusterInjectable = getInjectable({ diff --git a/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts b/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts index 235f381771..182a34d544 100644 --- a/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts +++ b/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts @@ -24,17 +24,17 @@ const createKubeJsonApiInjectable = getInjectable({ return (config, reqInit) => { if (!config.getRequestOptions) { - config.getRequestOptions = async () => { + config.getRequestOptions = () => { const agent = new Agent({ ca: lensProxyCert.get().cert, }); - + return { agent, }; }; } - + return new KubeJsonApi(dependencies, config, reqInit); }; }, diff --git a/packages/core/src/common/k8s-api/endpoints/cluster-role-binding.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/cluster-role-binding.api.injectable.ts index f731e32a28..4cae21d173 100644 --- a/packages/core/src/common/k8s-api/endpoints/cluster-role-binding.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/cluster-role-binding.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ClusterRoleBindingApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const clusterRoleBindingApiInjectable = getInjectable({ +const clusterRoleBindingApiInjectable = getKubeApiInjectable({ id: "cluster-role-binding-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "clusterRoleBindingApi is only accessible in certain environments"); @@ -20,8 +19,6 @@ const clusterRoleBindingApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default clusterRoleBindingApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/cluster-role.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/cluster-role.api.injectable.ts index 6e5ea7b184..61c70a1aad 100644 --- a/packages/core/src/common/k8s-api/endpoints/cluster-role.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/cluster-role.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ClusterRoleApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const clusterRoleApiInjectable = getInjectable({ +const clusterRoleApiInjectable = getKubeApiInjectable({ id: "cluster-role-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "clusterRoleApi is only available in certain environments"); @@ -20,8 +19,6 @@ const clusterRoleApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default clusterRoleApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/cluster.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/cluster.api.injectable.ts index bb2c2f9d3d..9cb9054e3e 100644 --- a/packages/core/src/common/k8s-api/endpoints/cluster.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/cluster.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ClusterApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const clusterApiInjectable = getInjectable({ +const clusterApiInjectable = getKubeApiInjectable({ id: "cluster-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "clusterApi is only available in certain environments"); @@ -20,8 +19,6 @@ const clusterApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default clusterApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/component-status.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/component-status.api.injectable.ts index eb5a216a13..d2a4b1e894 100644 --- a/packages/core/src/common/k8s-api/endpoints/component-status.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/component-status.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ComponentStatusApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; -const componentStatusApiInjectable = getInjectable({ +const componentStatusApiInjectable = getKubeApiInjectable({ id: "component-status-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "componentStatusApi is only available in certain environments"); @@ -20,8 +19,6 @@ const componentStatusApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default componentStatusApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/config-map.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/config-map.api.injectable.ts index 4b9c1323bf..952d8f5636 100644 --- a/packages/core/src/common/k8s-api/endpoints/config-map.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/config-map.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ConfigMapApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const configMapApiInjectable = getInjectable({ +const configMapApiInjectable = getKubeApiInjectable({ id: "config-map-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "configMapApi is only available in certain environments"); @@ -20,8 +19,6 @@ const configMapApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default configMapApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/cron-job.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/cron-job.api.injectable.ts index 016b147668..0f988d17f6 100644 --- a/packages/core/src/common/k8s-api/endpoints/cron-job.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/cron-job.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { CronJobApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const cronJobApiInjectable = getInjectable({ +const cronJobApiInjectable = getKubeApiInjectable({ id: "cron-job-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "cronJobApi is only available in certain environments"); @@ -22,8 +21,6 @@ const cronJobApiInjectable = getInjectable({ checkPreferredVersion: true, }); }, - - injectionToken: kubeApiInjectionToken, }); export default cronJobApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/custom-resource-definition.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/custom-resource-definition.api.injectable.ts index f6b32ffbf6..94575b43d7 100644 --- a/packages/core/src/common/k8s-api/endpoints/custom-resource-definition.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/custom-resource-definition.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { CustomResourceDefinitionApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; -const customResourceDefinitionApiInjectable = getInjectable({ +const customResourceDefinitionApiInjectable = getKubeApiInjectable({ id: "custom-resource-definition-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "customResourceDefinitionApi is only available in certain environments"); @@ -20,8 +19,6 @@ const customResourceDefinitionApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default customResourceDefinitionApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts index ab2a004a08..732c14e249 100644 --- a/packages/core/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { DaemonSetApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const daemonSetApiInjectable = getInjectable({ +const daemonSetApiInjectable = getKubeApiInjectable({ id: "daemon-set-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "daemonSetApi is only available in certain environments"); @@ -20,8 +19,6 @@ const daemonSetApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default daemonSetApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/deployment.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/deployment.api.injectable.ts index d652d710f5..c5b423b4d6 100644 --- a/packages/core/src/common/k8s-api/endpoints/deployment.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/deployment.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { DeploymentApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const deploymentApiInjectable = getInjectable({ +const deploymentApiInjectable = getKubeApiInjectable({ id: "deployment-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "deploymentApi is only available in certain environments"); @@ -20,8 +19,6 @@ const deploymentApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default deploymentApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/endpoint.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/endpoint.api.injectable.ts index fa2ba55d23..d65a426ff9 100644 --- a/packages/core/src/common/k8s-api/endpoints/endpoint.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/endpoint.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { EndpointsApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const endpointsApiInjectable = getInjectable({ +const endpointsApiInjectable = getKubeApiInjectable({ id: "endpoints-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "endpointsApi is only available in certain environments"); @@ -20,8 +19,6 @@ const endpointsApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default endpointsApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/events.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/events.api.injectable.ts index 8b26fb9065..5efda9894c 100644 --- a/packages/core/src/common/k8s-api/endpoints/events.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/events.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { KubeEventApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const kubeEventApiInjectable = getInjectable({ +const kubeEventApiInjectable = getKubeApiInjectable({ id: "kube-event-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "kubeEventApi is only available in certain environments"); @@ -20,8 +19,6 @@ const kubeEventApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default kubeEventApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts index da2d8ab00c..61eb4977c7 100644 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts @@ -3,9 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { array } from "@k8slens/utilities"; import autoBind from "auto-bind"; -import Joi from "joi"; +import { z } from "zod"; export interface RawHelmChart { apiVersion: string; @@ -31,132 +30,51 @@ export interface RawHelmChart { annotations?: Record; } -const helmChartMaintainerValidator = Joi.object({ - name: Joi - .string() - .required(), - email: Joi - .string() - .required(), - url: Joi - .string() - .optional(), +const helmChartMaintainerSchema = z.object({ + name: z.string(), + email: z.string(), + url: z.string().optional(), }); -const helmChartDependencyValidator = Joi.object({ - name: Joi - .string() - .required(), - repository: Joi - .string() - .required(), - condition: Joi - .string() - .optional(), - version: Joi - .string() - .required(), - tags: Joi - .array() - .items(Joi.string()) - .default(() => ([])), +const helmChartDependencySchema = z.object({ + name: z.string(), + repository: z.string(), + condition: z.string().optional(), + version: z.string(), + tags: z.array(z.string()).default(() => []), }); -const helmChartValidator = Joi.object({ - apiVersion: Joi - .string() - .required(), - name: Joi - .string() - .required(), - version: Joi - .string() - .required(), - repo: Joi - .string() - .required(), - created: Joi - .string() - .required(), - digest: Joi - .string() +const helmChartValidator = z.object({ + apiVersion: z.string(), + name: z.string(), + version: z.string(), + repo: z.string(), + created: z.string(), + digest: z.string().optional(), + kubeVersion: z.string() .optional(), - kubeVersion: Joi - .string() - .optional(), - description: Joi - .string() + description: z.string() .default(""), - home: Joi - .string() + home: z.string() .optional(), - engine: Joi - .string() + engine: z.string() .optional(), - icon: Joi - .string() + icon: z.string() .optional(), - appVersion: Joi - .string() + appVersion: z.string() .optional(), - tillerVersion: Joi - .string() + tillerVersion: z.string() .optional(), - type: Joi - .string() + type: z.string() .optional(), - deprecated: Joi - .boolean() + deprecated: z.boolean() .default(false), - keywords: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - sources: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - urls: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - maintainers: Joi - .array() - .items(helmChartMaintainerValidator) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - dependencies: Joi - .array() - .items(helmChartDependencyValidator) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - annotations: Joi - .object({}) - .pattern(/.*/, Joi.string()) - .default(() => ({})), + keywords: z.array(z.string()).default(() => ([])), + sources: z.array(z.string()).default(() => ([])), + urls: z.array(z.string()).default(() => ([])), + maintainers: z.array(helmChartMaintainerSchema).default(() => ([])), + dependencies: z.array(helmChartDependencySchema).default(() => ([])), + annotations: z.record(z.string()).default(() => ({})), }); export interface HelmChartCreateOpts { @@ -256,31 +174,17 @@ export class HelmChart implements HelmChartData { static create(data: RawHelmChart): HelmChart; static create(data: RawHelmChart, opts?: HelmChartCreateOpts): HelmChart | undefined; static create(data: RawHelmChart, { onError = "throw" }: HelmChartCreateOpts = {}): HelmChart | undefined { - const result = helmChartValidator.validate(data, { - abortEarly: false, - }); + const result = helmChartValidator.safeParse(data); - if (!result.error) { - return new HelmChart(result.value); + if (result.success) { + return new HelmChart(result.data); } - const [actualErrors, unknownDetails] = array.bifurcate(result.error.details, ({ type }) => type === "object.unknown"); - - if (unknownDetails.length > 0) { - console.warn("HelmChart data has unexpected fields", { original: data, unknownFields: unknownDetails.flatMap(d => d.path) }); - } - - if (actualErrors.length === 0) { - return new HelmChart(result.value as unknown as HelmChartData); - } - - const validationError = new Joi.ValidationError(actualErrors.map(er => er.message).join(". "), actualErrors, result.error._original); - if (onError === "throw") { - throw validationError; + throw result.error; } - console.warn("[HELM-CHART]: failed to validate data", data, validationError); + console.warn("[HELM-CHART]: failed to validate data", data, result.error); return undefined; } @@ -289,16 +193,20 @@ export class HelmChart implements HelmChartData { const digestPart = this.digest ? `+${this.digest}` : ""; + const version = this.getAppVersion(); + const versionId = version + ? `@${version}` + : ""; - return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}${digestPart}`; + return `${this.repo}:${this.apiVersion}/${this.name}${versionId}${digestPart}`; } getName(): string { return this.name; } - getFullName(seperator = "/"): string { - return [this.getRepository(), this.getName()].join(seperator); + getFullName(separator = "/"): string { + return [this.getRepository(), this.getName()].join(separator); } getDescription(): string { diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts index d6977fc5ca..0c5eb3e728 100644 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts @@ -9,7 +9,7 @@ import apiBaseInjectable from "../../api-base.injectable"; const requestReadmeEndpoint = urlBuilderFor("/v2/charts/:repo/:name/readme"); -export type RequestHelmChartReadme = (repo: string, name: string, version?: string) => AsyncResult; +export type RequestHelmChartReadme = (repo: string, name: string, version?: string) => AsyncResult; const requestHelmChartReadmeInjectable = getInjectable({ id: "request-helm-chart-readme", diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts index 2d4e77bf33..1b7bc8c600 100644 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts @@ -9,7 +9,7 @@ import apiBaseInjectable from "../../api-base.injectable"; const requestValuesEndpoint = urlBuilderFor("/v2/charts/:repo/:name/values"); -export type RequestHelmChartValues = (repo: string, name: string, version: string) => AsyncResult; +export type RequestHelmChartValues = (repo: string, name: string, version: string) => AsyncResult; const requestHelmChartValuesInjectable = getInjectable({ id: "request-helm-chart-values", diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts index 3a23536673..b271f391eb 100644 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts @@ -38,10 +38,10 @@ const requestHelmReleaseUpdateInjectable = getInjectable({ }, }); } catch (e) { - return { callWasSuccessful: false, error: e }; + return { isOk: false, error: e }; } - return { callWasSuccessful: true }; + return { isOk: true }; }; }, }); diff --git a/packages/core/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable.ts index 226fc60e94..3147351434 100644 --- a/packages/core/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { HorizontalPodAutoscalerApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const horizontalPodAutoscalerApiInjectable = getInjectable({ +const horizontalPodAutoscalerApiInjectable = getKubeApiInjectable({ id: "horizontal-pod-autoscaler-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "horizontalPodAutoscalerApi is only available in certain environments"); @@ -20,8 +19,6 @@ const horizontalPodAutoscalerApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default horizontalPodAutoscalerApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/ingress-class.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/ingress-class.api.injectable.ts index 25662ddd7e..625186022c 100644 --- a/packages/core/src/common/k8s-api/endpoints/ingress-class.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/ingress-class.api.injectable.ts @@ -2,20 +2,23 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import { IngressClassApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; +import assert from "assert"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; +import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; -const ingressClassApiInjectable = getInjectable({ +const ingressClassApiInjectable = getKubeApiInjectable({ id: "ingress-class-api", - instantiate: (di) => new IngressClassApi({ - logger: di.inject(loggerInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }), + instantiate: (di) => { + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "ingressClassApi is only available in certain environments"); - injectionToken: kubeApiInjectionToken, + return new IngressClassApi({ + logger: di.inject(loggerInjectionToken), + maybeKubeApi: di.inject(maybeKubeApiInjectable), + }); + }, }); export default ingressClassApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/ingress.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/ingress.api.injectable.ts index 203d65f25d..87edb84110 100644 --- a/packages/core/src/common/k8s-api/endpoints/ingress.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/ingress.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { IngressApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const ingressApiInjectable = getInjectable({ +const ingressApiInjectable = getKubeApiInjectable({ id: "ingress-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "ingressApi is only available in certain environments"); @@ -20,8 +19,6 @@ const ingressApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default ingressApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/job.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/job.api.injectable.ts index edd0a66e29..5c035730dc 100644 --- a/packages/core/src/common/k8s-api/endpoints/job.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/job.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { JobApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const jobApiInjectable = getInjectable({ +const jobApiInjectable = getKubeApiInjectable({ id: "job-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "jobApi is only available in certain environments"); @@ -22,8 +21,6 @@ const jobApiInjectable = getInjectable({ checkPreferredVersion: true, }); }, - - injectionToken: kubeApiInjectionToken, }); export default jobApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/lease.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/lease.api.injectable.ts index bdc7552448..257b330496 100644 --- a/packages/core/src/common/k8s-api/endpoints/lease.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/lease.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { LeaseApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const leaseApiInjectable = getInjectable({ +const leaseApiInjectable = getKubeApiInjectable({ id: "lease-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "leaseApi is only available in certain environments"); @@ -20,8 +19,6 @@ const leaseApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default leaseApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/limit-range.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/limit-range.api.injectable.ts index 8eb4427f57..34a302e6c1 100644 --- a/packages/core/src/common/k8s-api/endpoints/limit-range.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/limit-range.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { LimitRangeApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const limitRangeApiInjectable = getInjectable({ +const limitRangeApiInjectable = getKubeApiInjectable({ id: "limit-range-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "limitRangeApi is only available in certain environments"); @@ -20,8 +19,6 @@ const limitRangeApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default limitRangeApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable.ts index a91fa90332..7da783f17d 100644 --- a/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable.ts @@ -2,26 +2,23 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { MutatingWebhookConfigurationApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const mutatingWebhookConfigurationApiInjectable = getInjectable({ +const mutatingWebhookConfigurationApiInjectable = getKubeApiInjectable({ id: "mutating-webhook-configuration", instantiate: (di) => { - assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "mutatingWebhookApi is only available in certain environments"); + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "mutatingWebhookConfigurationApi is only available in certain environments"); return new MutatingWebhookConfigurationApi({ logger: di.inject(loggerInjectionToken), maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default mutatingWebhookConfigurationApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/namespace.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/namespace.api.injectable.ts index 5ed484fe74..3723d82e21 100644 --- a/packages/core/src/common/k8s-api/endpoints/namespace.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/namespace.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { NamespaceApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const namespaceApiInjectable = getInjectable({ +const namespaceApiInjectable = getKubeApiInjectable({ id: "namespace-api", instantiate: (di) => { @@ -21,8 +20,6 @@ const namespaceApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default namespaceApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/network-policy.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/network-policy.api.injectable.ts index bcc325b85b..d33934ecce 100644 --- a/packages/core/src/common/k8s-api/endpoints/network-policy.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/network-policy.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { NetworkPolicyApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const networkPolicyApiInjectable = getInjectable({ +const networkPolicyApiInjectable = getKubeApiInjectable({ id: "network-policy-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "networkPolicyApi is only available in certain environments"); @@ -20,8 +19,6 @@ const networkPolicyApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default networkPolicyApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/node.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/node.api.injectable.ts index fe2764db03..6e614bb890 100644 --- a/packages/core/src/common/k8s-api/endpoints/node.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/node.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { NodeApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const nodeApiInjectable = getInjectable({ +const nodeApiInjectable = getKubeApiInjectable({ id: "node-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "nodeApi is only available in certain environments"); @@ -20,8 +19,6 @@ const nodeApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default nodeApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/persistent-volume-claim.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/persistent-volume-claim.api.injectable.ts index 6a50975a8a..e4696ea3d8 100644 --- a/packages/core/src/common/k8s-api/endpoints/persistent-volume-claim.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/persistent-volume-claim.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PersistentVolumeClaimApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const persistentVolumeClaimApiInjectable = getInjectable({ +const persistentVolumeClaimApiInjectable = getKubeApiInjectable({ id: "persistent-volume-claim-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "persistentVolumeClaimApi is only available in certain environments"); @@ -20,8 +19,6 @@ const persistentVolumeClaimApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default persistentVolumeClaimApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/persistent-volume.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/persistent-volume.api.injectable.ts index 72a1ec8d21..79580fcc82 100644 --- a/packages/core/src/common/k8s-api/endpoints/persistent-volume.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/persistent-volume.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PersistentVolumeApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const persistentVolumeApiInjectable = getInjectable({ +const persistentVolumeApiInjectable = getKubeApiInjectable({ id: "persistent-volume-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "persistentVolumeApi is only available in certain environments"); @@ -20,8 +19,6 @@ const persistentVolumeApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default persistentVolumeApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts index ab17a0f35d..aef3f38110 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod-disruption-budget.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PodDisruptionBudgetApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const podDisruptionBudgetApiInjectable = getInjectable({ +const podDisruptionBudgetApiInjectable = getKubeApiInjectable({ id: "pod-disruption-budget-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "podDisruptionBudgetApi is only available in certain environments"); @@ -28,8 +27,6 @@ const podDisruptionBudgetApiInjectable = getInjectable({ }, }); }, - - injectionToken: kubeApiInjectionToken, }); export default podDisruptionBudgetApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/pod-metrics.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/pod-metrics.api.injectable.ts index bda2bfe010..bba9a459a7 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod-metrics.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod-metrics.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PodMetricsApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const podMetricsApiInjectable = getInjectable({ +const podMetricsApiInjectable = getKubeApiInjectable({ id: "pod-metrics-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "podMetricsApi is only available in certain environments"); @@ -20,8 +19,6 @@ const podMetricsApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default podMetricsApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/pod-security-policy.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/pod-security-policy.api.injectable.ts index b6bf8ada32..8c990ffa18 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod-security-policy.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod-security-policy.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PodSecurityPolicyApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const podSecurityPolicyApiInjectable = getInjectable({ +const podSecurityPolicyApiInjectable = getKubeApiInjectable({ id: "pod-security-policy-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "podSecurityPolicyApi is only available in certain environments"); @@ -20,8 +19,6 @@ const podSecurityPolicyApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default podSecurityPolicyApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/pod.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/pod.api.injectable.ts index 352d8f5815..5228085082 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PodApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const podApiInjectable = getInjectable({ +const podApiInjectable = getKubeApiInjectable({ id: "pod-api", instantiate: (di) => { @@ -21,8 +20,6 @@ const podApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default podApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/priority-class.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/priority-class.api.injectable.ts index de6b2d8c1d..4014df4974 100644 --- a/packages/core/src/common/k8s-api/endpoints/priority-class.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/priority-class.api.injectable.ts @@ -2,26 +2,23 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { PriorityClassApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const priorityClassApiInjectable = getInjectable({ +const priorityClassApiInjectable = getKubeApiInjectable({ id: "priority-class-api", instantiate: (di) => { - assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "PriorityClassApi is only available in certain environments"); + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "priorityClassApi is only available in certain environments"); return new PriorityClassApi({ logger: di.inject(loggerInjectionToken), maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default priorityClassApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/replica-set.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/replica-set.api.injectable.ts index fcebaa7aca..4996281316 100644 --- a/packages/core/src/common/k8s-api/endpoints/replica-set.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/replica-set.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ReplicaSetApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const replicaSetApiInjectable = getInjectable({ +const replicaSetApiInjectable = getKubeApiInjectable({ id: "replica-set-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "replicaSetApi is only available in certain environments"); @@ -20,8 +19,6 @@ const replicaSetApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default replicaSetApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.injectable.ts index 82b09ad2b6..c364f83346 100644 --- a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.injectable.ts @@ -2,22 +2,23 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import { ReplicationControllerApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; +import assert from "assert"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; +import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; -const replicationControllerApiInjectable = getInjectable({ +const replicationControllerApiInjectable = getKubeApiInjectable({ id: "replication-controller-api", instantiate: (di) => { + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "replicationControllerApi is only available in certain environments"); + return new ReplicationControllerApi({ logger: di.inject(loggerInjectionToken), maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default replicationControllerApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts index cd07058da8..8bbb986d4b 100644 --- a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts @@ -25,20 +25,20 @@ const requestKubeObjectPatchInjectable = getInjectable({ }, })) as Result; - if (!result.callWasSuccessful) { + if (!result.isOk) { return result; } try { - const response = JSON.parse(result.response) as KubeJsonApiData; + const response = JSON.parse(result.value) as KubeJsonApiData; return { - callWasSuccessful: true, + isOk: true, response, }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } diff --git a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts index 5e094c7a80..1b75d31255 100644 --- a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts @@ -17,20 +17,20 @@ const requestKubeObjectCreationInjectable = getInjectable({ return async (data) => { const result = await apiBase.post("/stack", { data }) as Result; - if (!result.callWasSuccessful) { + if (!result.isOk) { return result; } try { - const response = JSON.parse(result.response); + const response = JSON.parse(result.value) as KubeJsonApiData; return { - callWasSuccessful: true, + isOk: true, response, }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: String(error), }; } diff --git a/packages/core/src/common/k8s-api/endpoints/resource-quota.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/resource-quota.api.injectable.ts index 5bb50c6b14..91b27c34b7 100644 --- a/packages/core/src/common/k8s-api/endpoints/resource-quota.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/resource-quota.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ResourceQuotaApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const resourceQuotaApiInjectable = getInjectable({ +const resourceQuotaApiInjectable = getKubeApiInjectable({ id: "resource-quota-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "resourceQuotaApi is only available in certain environments"); @@ -20,8 +19,6 @@ const resourceQuotaApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default resourceQuotaApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/role-binding.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/role-binding.api.injectable.ts index a254a587b9..040f210422 100644 --- a/packages/core/src/common/k8s-api/endpoints/role-binding.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/role-binding.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { RoleBindingApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const roleBindingApiInjectable = getInjectable({ +const roleBindingApiInjectable = getKubeApiInjectable({ id: "role-binding-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "roleBindingApi is only available in certain environments"); @@ -20,8 +19,6 @@ const roleBindingApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default roleBindingApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/role.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/role.api.injectable.ts index 0b9e077e4b..96a0724d94 100644 --- a/packages/core/src/common/k8s-api/endpoints/role.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/role.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { RoleApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const roleApiInjectable = getInjectable({ +const roleApiInjectable = getKubeApiInjectable({ id: "role-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "roleApi is only available in certain environments"); @@ -20,8 +19,6 @@ const roleApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default roleApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/runtime-class.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/runtime-class.api.injectable.ts index 4aba1e2d42..db2d9fc256 100644 --- a/packages/core/src/common/k8s-api/endpoints/runtime-class.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/runtime-class.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { RuntimeClassApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const runtimeClassApiInjectable = getInjectable({ +const runtimeClassApiInjectable = getKubeApiInjectable({ id: "runtime-class-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "RuntimeClassApi is only available in certain environments"); @@ -20,8 +19,6 @@ const runtimeClassApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default runtimeClassApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/secret.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/secret.api.injectable.ts index 66cc807c06..330980124e 100644 --- a/packages/core/src/common/k8s-api/endpoints/secret.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/secret.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { SecretApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const secretApiInjectable = getInjectable({ +const secretApiInjectable = getKubeApiInjectable({ id: "secret-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "secretApi is only available in certain environments"); @@ -20,8 +19,6 @@ const secretApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default secretApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/self-subject-rules-reviews.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/self-subject-rules-reviews.api.injectable.ts index f0a44febd4..9dde255022 100644 --- a/packages/core/src/common/k8s-api/endpoints/self-subject-rules-reviews.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/self-subject-rules-reviews.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { SelfSubjectRulesReviewApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const selfSubjectRulesReviewApiInjectable = getInjectable({ +const selfSubjectRulesReviewApiInjectable = getKubeApiInjectable({ id: "self-subject-rules-review-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "selfSubjectRulesReviewApi is only available in certain environments"); @@ -20,8 +19,6 @@ const selfSubjectRulesReviewApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default selfSubjectRulesReviewApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/service-account.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/service-account.api.injectable.ts index 170a106b12..847be072ff 100644 --- a/packages/core/src/common/k8s-api/endpoints/service-account.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/service-account.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ServiceAccountApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const serviceAccountApiInjectable = getInjectable({ +const serviceAccountApiInjectable = getKubeApiInjectable({ id: "service-account-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "serviceAccountApi is only available in certain environments"); @@ -20,8 +19,6 @@ const serviceAccountApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default serviceAccountApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/service.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/service.api.injectable.ts index 75adcfb3f0..13cc19f069 100644 --- a/packages/core/src/common/k8s-api/endpoints/service.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/service.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ServiceApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const serviceApiInjectable = getInjectable({ +const serviceApiInjectable = getKubeApiInjectable({ id: "service-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "serviceApi is only available in certain environments"); @@ -20,8 +19,6 @@ const serviceApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default serviceApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/stateful-set.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/stateful-set.api.injectable.ts index ba56cb4a95..c944d042a5 100644 --- a/packages/core/src/common/k8s-api/endpoints/stateful-set.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/stateful-set.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { StatefulSetApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const statefulSetApiInjectable = getInjectable({ +const statefulSetApiInjectable = getKubeApiInjectable({ id: "stateful-set-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "statefulSetApi is only available in certain environments"); @@ -20,8 +19,6 @@ const statefulSetApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default statefulSetApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/storage-class.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/storage-class.api.injectable.ts index 4eb7003e7a..8165e4c308 100644 --- a/packages/core/src/common/k8s-api/endpoints/storage-class.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/storage-class.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { StorageClassApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const storageClassApiInjectable = getInjectable({ +const storageClassApiInjectable = getKubeApiInjectable({ id: "storage-class-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "storageClassApi is only available in certain environments"); @@ -20,8 +19,6 @@ const storageClassApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default storageClassApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts index 5bf2f7ab4d..ae93a64a06 100644 --- a/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts @@ -2,26 +2,23 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { ValidatingWebhookConfigurationApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const validatingWebhookConfigurationApiInjectable = getInjectable({ - id: "validating-webhook-configuration", +const validatingWebhookConfigurationApiInjectable = getKubeApiInjectable({ + id: "validating-webhook-configuration-api", instantiate: (di) => { - assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "validatingWebhookApi is only available in certain environments"); + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "validatingWebhookConfigurationApi is only available in certain environments"); return new ValidatingWebhookConfigurationApi({ logger: di.inject(loggerInjectionToken), maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default validatingWebhookConfigurationApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/vertical-pod-autoscaler.api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/vertical-pod-autoscaler.api.injectable.ts index 439c2107e9..ae7c184802 100644 --- a/packages/core/src/common/k8s-api/endpoints/vertical-pod-autoscaler.api.injectable.ts +++ b/packages/core/src/common/k8s-api/endpoints/vertical-pod-autoscaler.api.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; import { VerticalPodAutoscalerApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; +import { getKubeApiInjectable } from "@k8slens/kube-api-specifics"; import { loggerInjectionToken } from "@k8slens/logger"; import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; -const verticalPodAutoscalerApiInjectable = getInjectable({ +const verticalPodAutoscalerApiInjectable = getKubeApiInjectable({ id: "vertical-pod-autoscaler-api", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "verticalPodAutoscalerApi is only available in certain environments"); @@ -20,8 +19,6 @@ const verticalPodAutoscalerApiInjectable = getInjectable({ maybeKubeApi: di.inject(maybeKubeApiInjectable), }); }, - - injectionToken: kubeApiInjectionToken, }); export default verticalPodAutoscalerApiInjectable; diff --git a/packages/core/src/common/k8s-api/kube-object.store.ts b/packages/core/src/common/k8s-api/kube-object.store.ts index 78cf4f7fe2..f539153090 100644 --- a/packages/core/src/common/k8s-api/kube-object.store.ts +++ b/packages/core/src/common/k8s-api/kube-object.store.ts @@ -97,6 +97,14 @@ export class KubeObjectStore< private readonly loadedNamespaces = observable.box(); + static create( + dependencies: KubeObjectStoreDependencies, + api: Api, + opts?: KubeObjectStoreOptions, + ): Api extends KubeApi ? KubeObjectStore : never { + return new KubeObjectStore(dependencies, api as KubeApi, opts) as never; + } + constructor( protected readonly dependencies: KubeObjectStoreDependencies, public readonly api: A, @@ -297,7 +305,7 @@ export class KubeObjectStore< return items; } - protected resetOnError(error: any) { + protected resetOnError(error: unknown) { if (error) this.reset(); } diff --git a/packages/core/src/common/k8s/resource-stack.ts b/packages/core/src/common/k8s/resource-stack.ts index 7ad0e8088a..5038a57ab7 100644 --- a/packages/core/src/common/k8s/resource-stack.ts +++ b/packages/core/src/common/k8s/resource-stack.ts @@ -16,8 +16,8 @@ import type { ReadFile } from "../fs/read-file.injectable"; import { hasTypedProperty, isObject } from "@k8slens/utilities"; export interface ResourceApplyingStack { - kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise; - kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise; + kubectlApplyFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[]): Promise; + kubectlDeleteFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[]): Promise; } export interface ResourceStackDependencies { @@ -41,12 +41,12 @@ export class ResourceStack { * @param folderPath folder path that is searched for files defining kubernetes resources. * @param templateContext sets the template parameters that are to be applied to any templated kubernetes resources that are to be applied. */ - async kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise { + async kubectlApplyFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[]): Promise { const resources = await this.renderTemplates(folderPath, templateContext); const result = await this.applyResources(resources, extraArgs); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } this.dependencies.logger.warn(`[RESOURCE-STACK]: failed to apply resources: ${result.error}`); @@ -59,12 +59,12 @@ export class ResourceStack { * @param folderPath folder path that is searched for files defining kubernetes resources. * @param templateContext sets the template parameters that are to be applied to any templated kubernetes resources that are to be applied. */ - async kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise { + async kubectlDeleteFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[]): Promise { const resources = await this.renderTemplates(folderPath, templateContext); const result = await this.deleteResources(resources, extraArgs); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } this.dependencies.logger.warn(`[RESOURCE-STACK]: failed to delete resources: ${result.error}`); @@ -100,7 +100,7 @@ export class ResourceStack { return []; } - protected async renderTemplates(folderPath: string, templateContext: any): Promise { + protected async renderTemplates(folderPath: string, templateContext: unknown): Promise { const resources: string[] = []; const di = getLegacyGlobalDiForExtensionApi(); const productName = di.inject(productNameInjectable); diff --git a/packages/core/src/common/kube-helpers.ts b/packages/core/src/common/kube-helpers.ts index 0e42425f1c..468e5570eb 100644 --- a/packages/core/src/common/kube-helpers.ts +++ b/packages/core/src/common/kube-helpers.ts @@ -7,64 +7,55 @@ import { KubeConfig } from "@kubernetes/client-node"; import yaml from "js-yaml"; import type { Cluster, Context, User } from "@kubernetes/client-node/dist/config_types"; import { newClusters, newContexts, newUsers } from "@kubernetes/client-node/dist/config_types"; +import type { Result } from "@k8slens/utilities"; import { isDefined } from "@k8slens/utilities"; -import Joi from "joi"; import type { PartialDeep } from "type-fest"; +import z from "zod"; +import type { ZodError } from "zod"; -const clusterSchema = Joi.object({ - name: Joi +const userSchema = z.object({ + name: z.string() + .min(1), +}); + +const clusterSchema = z.object({ + name: z .string() - .min(1) - .required(), - cluster: Joi + .min(1), + cluster: z .object({ - server: Joi + server: z .string() - .min(1) - .required(), - }) - .required(), + .min(1), + }), }); -const userSchema = Joi.object({ - name: Joi.string() - .min(1) - .required(), -}); - -const contextSchema = Joi.object({ - name: Joi.string() - .min(1) - .required(), - context: Joi.object({ - cluster: Joi.string() - .min(1) - .required(), - user: Joi.string() - .min(1) - .required(), +const contextSchema = z.object({ + name: z.string() + .min(1), + context: z.object({ + cluster: z.string() + .min(1), + user: z.string() + .min(1), }), }); -const kubeConfigSchema = Joi.object({ - users: Joi - .array() - .items(userSchema) +const kubeConfigSchema = z.object({ + users: z + .array(userSchema) .optional(), - clusters: Joi - .array() - .items(clusterSchema) + clusters: z + .array(clusterSchema) .optional(), - contexts: Joi - .array() - .items(contextSchema) + contexts: z + .array(contextSchema) .optional(), - "current-context": Joi + "current-context": z .string() .min(1) .optional(), -}) - .required(); +}); interface KubeConfigOptions { clusters: Cluster[]; @@ -73,37 +64,25 @@ interface KubeConfigOptions { currentContext?: string; } -interface OptionsResult { - options: KubeConfigOptions; - error: Joi.ValidationError | undefined; -} - -function loadToOptions(rawYaml: string): OptionsResult { +function loadToOptions(rawYaml: string): Result> { const parsed = yaml.load(rawYaml); - const { error } = kubeConfigSchema.validate(parsed, { - abortEarly: false, - allowUnknown: true, - }); - const { value } = kubeConfigSchema.validate(parsed, { - abortEarly: false, - allowUnknown: true, - stripUnknown: { - arrays: true, - }, - }); - const { - clusters: rawClusters, - users: rawUsers, - contexts: rawContexts, - "current-context": currentContext, - } = value ?? {}; - const clusters = newClusters(rawClusters); - const users = newUsers(rawUsers); - const contexts = newContexts(rawContexts); + const configParseResult = kubeConfigSchema.safeParse(parsed); + + if (configParseResult.success === false) { + return { + isOk: false, + error: configParseResult.error, + }; + } return { - options: { clusters, users, contexts, currentContext }, - error, + isOk: true, + value: { + clusters: newClusters(configParseResult.data.clusters), + users: newUsers(configParseResult.data.users), + contexts: newContexts(configParseResult.data.contexts), + currentContext: configParseResult.data["current-context"], + }, }; } @@ -116,33 +95,32 @@ export function loadFromOptions(options: KubeConfigOptions): KubeConfig { return kc; } -export interface ConfigResult { - config: KubeConfig; - error: Joi.ValidationError | undefined; -} +export function loadConfigFromString(content: string): Result> { + const loadResult = loadToOptions(content); -export function loadConfigFromString(content: string): ConfigResult { - const { options, error } = loadToOptions(content); + if (loadResult.isOk === false) { + return loadResult; + } return { - config: loadFromOptions(options), - error, + isOk: true, + value: loadFromOptions(loadResult.value), }; } -export function loadValidatedConfig(content: string, contextName: string): ValidateKubeConfigResult { - const { options, error } = loadToOptions(content); +export function loadValidatedConfig(content: string, contextName: string): Result | string> { + const result = loadToOptions(content); - if (error) { - return { error }; + if (result.isOk === false) { + return result; } - return validateKubeConfig(loadFromOptions(options), contextName); + return validateKubeConfig(loadFromOptions(result.value), contextName); } export interface SplitConfigEntry { config: KubeConfig; - validationResult: ValidateKubeConfigResult; + validationResult: Result | string>; } /** @@ -212,8 +190,8 @@ export function dumpConfigYaml(kubeConfig: PartialDeep): string { "client-certificate": user.certFile, "client-key-data": user.keyData, "client-key": user.keyFile, - "auth-provider": user.authProvider, - exec: user.exec, + "auth-provider": user.authProvider as unknown, + exec: user.exec as unknown, token: user.token, username: user.username, password: user.password, @@ -233,26 +211,24 @@ export function dumpConfigYaml(kubeConfig: PartialDeep): string { return yaml.dump(config, { skipInvalid: true }); } -export type ValidateKubeConfigResult = { - error: Error; -} | { - error?: undefined; - context: Context; - cluster: Cluster; - user: User; -}; +export interface PartialKubeConfig { + readonly context: Context; + readonly cluster: Cluster; + readonly user: User; +} /** * Checks if `config` has valid `Context`, `User`, `Cluster`, and `exec` fields (if present when required) * * Note: This function returns an error instead of throwing it, returning `undefined` if the validation passes */ -export function validateKubeConfig(config: KubeConfig, contextName: string): ValidateKubeConfigResult { +export function validateKubeConfig(config: KubeConfig, contextName: string): Result { const context = config.getContextObject(contextName); if (!context) { return { - error: new Error(`No valid context object provided in kubeconfig for context '${contextName}'`), + isOk: false, + error: `No valid context object provided in kubeconfig for context '${contextName}'`, }; } @@ -260,7 +236,8 @@ export function validateKubeConfig(config: KubeConfig, contextName: string): Val if (!cluster) { return { - error: new Error(`No valid cluster object provided in kubeconfig for context '${contextName}'`), + isOk: false, + error: `No valid cluster object provided in kubeconfig for context '${contextName}'`, }; } @@ -268,9 +245,13 @@ export function validateKubeConfig(config: KubeConfig, contextName: string): Val if (!user) { return { - error: new Error(`No valid user object provided in kubeconfig for context '${contextName}'`), + isOk: false, + error: `No valid user object provided in kubeconfig for context '${contextName}'`, }; } - return { cluster, user, context }; + return { + isOk: true, + value: { cluster, user, context }, + }; } diff --git a/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts b/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts index f78b5961da..54c80896ad 100644 --- a/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts +++ b/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts @@ -2,13 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { AsyncResult } from "@k8slens/utilities"; +import type { KubeConfig } from "@kubernetes/client-node"; import { getInjectable } from "@ogre-tools/injectable"; +import type { ZodError } from "zod"; import readFileInjectable from "../fs/read-file.injectable"; -import type { ConfigResult } from "../kube-helpers"; import { loadConfigFromString } from "../kube-helpers"; import resolveTildeInjectable from "../path/resolve-tilde.injectable"; -export type LoadConfigFromFile = (filePath: string) => Promise; +export type LoadConfigFromFile = (filePath: string) => AsyncResult>; const loadConfigFromFileInjectable = getInjectable({ id: "load-config-from-file", diff --git a/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts b/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts index ee0b9ed9b0..f5182ca896 100644 --- a/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts +++ b/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts @@ -2,14 +2,16 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { AsyncResult } from "@k8slens/utilities"; import { getInjectable } from "@ogre-tools/injectable"; +import type { ZodError } from "zod"; import type { Cluster } from "../cluster/cluster"; import readFileInjectable from "../fs/read-file.injectable"; -import type { ValidateKubeConfigResult } from "../kube-helpers"; +import type { PartialKubeConfig } from "../kube-helpers"; import { loadValidatedConfig } from "../kube-helpers"; import resolveTildeInjectable from "../path/resolve-tilde.injectable"; -export type LoadValidatedClusterConfig = (cluster: Cluster) => Promise; +export type LoadValidatedClusterConfig = (cluster: Cluster) => AsyncResult>; const loadValidatedClusterConfigInjectable = getInjectable({ id: "load-validated-cluster-config", diff --git a/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts b/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts index 6ebbd34bd8..92ea12abf7 100644 --- a/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts +++ b/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import getAbsolutePathInjectable from "./get-absolute-path.injectable"; -export default getGlobalOverride(getAbsolutePathInjectable, () => path.posix.resolve); +export default getGlobalOverride(getAbsolutePathInjectable, () => (...value) => path.posix.resolve(...value)); diff --git a/packages/core/src/common/path/get-absolute-path.injectable.ts b/packages/core/src/common/path/get-absolute-path.injectable.ts index 8919605942..29278f85c6 100644 --- a/packages/core/src/common/path/get-absolute-path.injectable.ts +++ b/packages/core/src/common/path/get-absolute-path.injectable.ts @@ -10,7 +10,7 @@ export type GetAbsolutePath = (...args: string[]) => string; const getAbsolutePathInjectable = getInjectable({ id: "get-absolute-path", - instantiate: (): GetAbsolutePath => path.resolve, + instantiate: (): GetAbsolutePath => (...values) => path.resolve(...values), // This causes side effect e.g. Windows creates different kinds of // absolute paths than linux diff --git a/packages/core/src/common/path/get-basename.global-override-for-injectable.ts b/packages/core/src/common/path/get-basename.global-override-for-injectable.ts index 76c45ae30f..0213834a70 100644 --- a/packages/core/src/common/path/get-basename.global-override-for-injectable.ts +++ b/packages/core/src/common/path/get-basename.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import getBasenameOfPathInjectable from "./get-basename.injectable"; -export default getGlobalOverride(getBasenameOfPathInjectable, () => path.posix.basename); +export default getGlobalOverride(getBasenameOfPathInjectable, () => (...value) => path.posix.basename(...value)); diff --git a/packages/core/src/common/path/get-basename.injectable.ts b/packages/core/src/common/path/get-basename.injectable.ts index be92bde7f5..9391c90d9d 100644 --- a/packages/core/src/common/path/get-basename.injectable.ts +++ b/packages/core/src/common/path/get-basename.injectable.ts @@ -9,7 +9,7 @@ export type GetBasenameOfPath = (path: string) => string; const getBasenameOfPathInjectable = getInjectable({ id: "get-basename-of-path", - instantiate: (): GetBasenameOfPath => path.basename, + instantiate: (): GetBasenameOfPath => (...values) => path.basename(...values), causesSideEffects: true, }); diff --git a/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts b/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts index 5579636551..4cc34d669c 100644 --- a/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts +++ b/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import getDirnameOfPathInjectable from "./get-dirname.injectable"; -export default getGlobalOverride(getDirnameOfPathInjectable, () => path.posix.dirname); +export default getGlobalOverride(getDirnameOfPathInjectable, () => (...value) => path.posix.dirname(...value)); diff --git a/packages/core/src/common/path/get-dirname.injectable.ts b/packages/core/src/common/path/get-dirname.injectable.ts index 93b4496767..42c8fba05b 100644 --- a/packages/core/src/common/path/get-dirname.injectable.ts +++ b/packages/core/src/common/path/get-dirname.injectable.ts @@ -9,7 +9,7 @@ export type GetDirnameOfPath = (path: string) => string; const getDirnameOfPathInjectable = getInjectable({ id: "get-dirname-of-path", - instantiate: (): GetDirnameOfPath => path.dirname, + instantiate: (): GetDirnameOfPath => (...values) => path.dirname(...values), causesSideEffects: true, }); diff --git a/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts b/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts index 987165af15..f2012122ab 100644 --- a/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts +++ b/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import getRelativePathInjectable from "./get-relative-path.injectable"; -export default getGlobalOverride(getRelativePathInjectable, () => path.posix.relative); +export default getGlobalOverride(getRelativePathInjectable, () => (...value) => path.posix.relative(...value)); diff --git a/packages/core/src/common/path/get-relative-path.injectable.ts b/packages/core/src/common/path/get-relative-path.injectable.ts index 18b5d832de..c7242ceba5 100644 --- a/packages/core/src/common/path/get-relative-path.injectable.ts +++ b/packages/core/src/common/path/get-relative-path.injectable.ts @@ -9,7 +9,7 @@ export type GetRelativePath = (from: string, to: string) => string; const getRelativePathInjectable = getInjectable({ id: "get-relative-path", - instantiate: (): GetRelativePath => path.relative, + instantiate: (): GetRelativePath => (...values) => path.relative(...values), causesSideEffects: true, }); diff --git a/packages/core/src/common/path/join-paths.global-override-for-injectable.ts b/packages/core/src/common/path/join-paths.global-override-for-injectable.ts index 320490c0f3..4c5f1a5e09 100644 --- a/packages/core/src/common/path/join-paths.global-override-for-injectable.ts +++ b/packages/core/src/common/path/join-paths.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import joinPathsInjectable from "./join-paths.injectable"; -export default getGlobalOverride(joinPathsInjectable, () => path.posix.join); +export default getGlobalOverride(joinPathsInjectable, () => (...value) => path.posix.join(...value)); diff --git a/packages/core/src/common/path/join-paths.injectable.ts b/packages/core/src/common/path/join-paths.injectable.ts index dc63b48307..f8e3fc63b1 100644 --- a/packages/core/src/common/path/join-paths.injectable.ts +++ b/packages/core/src/common/path/join-paths.injectable.ts @@ -9,7 +9,7 @@ export type JoinPaths = (...args: string[]) => string; const joinPathsInjectable = getInjectable({ id: "join-paths", - instantiate: (): JoinPaths => path.join, + instantiate: (): JoinPaths => (...args) => path.join(...args), // This causes side effect e.g. Windows uses different separator than e.g. linux causesSideEffects: true, diff --git a/packages/core/src/common/path/parse.global-override-for-injectable.ts b/packages/core/src/common/path/parse.global-override-for-injectable.ts index 9dbc434bca..0021a00c5f 100644 --- a/packages/core/src/common/path/parse.global-override-for-injectable.ts +++ b/packages/core/src/common/path/parse.global-override-for-injectable.ts @@ -7,4 +7,4 @@ import path from "path"; import { getGlobalOverride } from "@k8slens/test-utils"; import parsePathInjectable from "./parse.injectable"; -export default getGlobalOverride(parsePathInjectable, () => path.posix.parse); +export default getGlobalOverride(parsePathInjectable, () => (...values) => path.posix.parse(...values)); diff --git a/packages/core/src/common/path/parse.injectable.ts b/packages/core/src/common/path/parse.injectable.ts index a32dfb3fa5..f55d5b37ca 100644 --- a/packages/core/src/common/path/parse.injectable.ts +++ b/packages/core/src/common/path/parse.injectable.ts @@ -3,11 +3,14 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import type { ParsedPath } from "path"; import path from "path"; +export type ParsePath = (path: string) => ParsedPath; + const parsePathInjectable = getInjectable({ id: "parse-path", - instantiate: () => path.parse, + instantiate: (): ParsePath => (...values) => path.parse(...values), causesSideEffects: true, }); diff --git a/packages/core/src/common/protocol-handler/router.ts b/packages/core/src/common/protocol-handler/router.ts index 5e265ed0a9..096e5968a3 100644 --- a/packages/core/src/common/protocol-handler/router.ts +++ b/packages/core/src/common/protocol-handler/router.ts @@ -195,7 +195,7 @@ export abstract class LensProtocolRouter { }); } catch (error) { this.dependencies.logger.info( - `${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not installed (${error})`, + `${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not installed (${String(error)})`, ); return name; diff --git a/packages/core/src/common/utils/__tests__/paths.test.ts b/packages/core/src/common/utils/__tests__/paths.test.ts index 5a52843432..8db4f9f83f 100644 --- a/packages/core/src/common/utils/__tests__/paths.test.ts +++ b/packages/core/src/common/utils/__tests__/paths.test.ts @@ -21,8 +21,8 @@ describe("isLogicalChildPath", () => { describe("when using win32 paths", () => { beforeEach(() => { - di.override(getAbsolutePathInjectable, () => path.win32.resolve); - di.override(getDirnameOfPathInjectable, () => path.win32.dirname); + di.override(getAbsolutePathInjectable, () => (...values) => path.win32.resolve(...values)); + di.override(getDirnameOfPathInjectable, () => (...values) => path.win32.dirname(...values)); isLogicalChildPath = di.inject(isLogicalChildPathInjectable); }); @@ -59,8 +59,8 @@ describe("isLogicalChildPath", () => { describe("when using posix paths", () => { beforeEach(() => { - di.override(getAbsolutePathInjectable, () => path.posix.resolve); - di.override(getDirnameOfPathInjectable, () => path.posix.dirname); + di.override(getAbsolutePathInjectable, () => (...values) => path.posix.resolve(...values)); + di.override(getDirnameOfPathInjectable, () => (...values) => path.posix.dirname(...values)); isLogicalChildPath = di.inject(isLogicalChildPathInjectable); }); diff --git a/packages/core/src/common/utils/add-separator/add-separator.test.ts b/packages/core/src/common/utils/add-separator/add-separator.test.ts index 8a45b45739..0fee28a3b2 100644 --- a/packages/core/src/common/utils/add-separator/add-separator.test.ts +++ b/packages/core/src/common/utils/add-separator/add-separator.test.ts @@ -22,6 +22,7 @@ describe("add-separator", () => { it("given multiple items including falsy ones, adds separators", () => { const items = [false, undefined, null, NaN]; + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions const actual = addSeparator((left, right) => `separator-between-${left}-and-${right}`, items); expect(actual).toEqual([ @@ -36,7 +37,7 @@ describe("add-separator", () => { }); it("given no items, does not add separator", () => { - const items: any[] = []; + const items: unknown[] = []; const actual = addSeparator(() => "separator", items); diff --git a/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts b/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts index 7976004ee6..adbb185e80 100644 --- a/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts +++ b/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts @@ -12,6 +12,6 @@ export const checkThatAllDiscriminablesAreExhausted = (value: T const _exhaustiveCheck: never = value; return new Error( - `Tried to exhaust discriminables, but no instructions were found for ${(_exhaustiveCheck as any).kind}`, + `Tried to exhaust discriminables, but no instructions were found for ${(_exhaustiveCheck as Discriminable).kind}`, ); }; diff --git a/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts b/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts index 594d0f3d01..b6de1d2e13 100644 --- a/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts +++ b/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts @@ -207,7 +207,7 @@ Available parent ids are: }); describe("given items with missing parents, when creating composite with handling for missing parents", () => { - let composite: Composite; + let composite: Composite; let handleMissingParentIdMock: jest.Mock; beforeEach(() => { @@ -290,9 +290,14 @@ Available parent ids are: id: undefined, }; - const items = [root, someItem, someOtherItem]; + const items = [root, someItem, someOtherItem] as Data[]; - const getComposite = getCompositeFor({ + interface Data { + id: string; + parentId?: string; + } + + const getComposite = getCompositeFor({ getId: (x) => x.id, getParentId: (x) => x.parentId, }); diff --git a/packages/core/src/common/utils/registrator-helper.ts b/packages/core/src/common/utils/registrator-helper.ts index 4a9cc5c2d2..03bef8605f 100644 --- a/packages/core/src/common/utils/registrator-helper.ts +++ b/packages/core/src/common/utils/registrator-helper.ts @@ -9,7 +9,10 @@ import type { DiContainerForInjection, Injectable } from "@ogre-tools/injectable // Register new injectables and deregister removed injectables by id export const injectableDifferencingRegistratorWith = (di: DiContainerForInjection) => ( - (rawCurrent: Injectable[], rawPrevious: Injectable[] = []) => { + ( + rawCurrent: Injectable[], + rawPrevious: Injectable[] = [], + ) => { const current = new Map(rawCurrent.map(inj => [inj.id, inj])); const previous = new Map(rawPrevious.map(inj => [inj.id, inj])); const toAdd = iter.chain(current.entries()) diff --git a/packages/core/src/common/utils/singleton.ts b/packages/core/src/common/utils/singleton.ts index 0dea1f7526..fd73ca30b1 100644 --- a/packages/core/src/common/utils/singleton.ts +++ b/packages/core/src/common/utils/singleton.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -export interface StaticThis { new(...args: R): T } +export interface StaticThis { new(...args: R): T } /** * @deprecated This is a form of global shared state @@ -30,7 +30,7 @@ export class Singleton { * @param args The constructor arguments for the child class * @returns An instance of the child class */ - static createInstance(this: StaticThis, ...args: R): T { + static createInstance(this: StaticThis, ...args: R): T { if (!Singleton.instances.has(this)) { if (Singleton.creating.length > 0) { throw new TypeError(`Cannot create a second singleton (${this.name}) while creating a first (${Singleton.creating})`); @@ -54,9 +54,9 @@ export class Singleton { * Default: `true` * @returns An instance of the child class */ - static getInstance(this: StaticThis, strict?: true): T; - static getInstance(this: StaticThis, strict: false): T | undefined; - static getInstance(this: StaticThis, strict = true): T | undefined { + static getInstance(this: StaticThis, strict?: true): T; + static getInstance(this: StaticThis, strict: false): T | undefined; + static getInstance(this: StaticThis, strict = true): T | undefined { if (!Singleton.instances.has(this) && strict) { throw new TypeError(`instance of ${this.name} is not created`); } diff --git a/packages/core/src/common/utils/sync-box/channels.ts b/packages/core/src/common/utils/sync-box/channels.ts index 5178ff013c..74fbc89312 100644 --- a/packages/core/src/common/utils/sync-box/channels.ts +++ b/packages/core/src/common/utils/sync-box/channels.ts @@ -4,10 +4,10 @@ */ import { getMessageChannel, getRequestChannel } from "@k8slens/messaging"; -export const syncBoxChannel = - getMessageChannel<{ id: string; value: any }>("sync-box-channel"); +export const syncBoxChannel = getMessageChannel<{ id: string; value: unknown }>( + "sync-box-channel", +); -export const syncBoxInitialValueChannel = getRequestChannel< - void, - { id: string; value: any }[] ->("sync-box-initial-value-channel"); +export const syncBoxInitialValueChannel = getRequestChannel( + "sync-box-initial-value-channel", +); diff --git a/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts b/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts index 8db80243d3..8fc3a2c6fb 100644 --- a/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts +++ b/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts @@ -2,14 +2,29 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectionToken } from "@ogre-tools/injectable"; +import type { Injectable, InjectionToken } from "@ogre-tools/injectable"; +import { getInjectable, getInjectionToken } from "@ogre-tools/injectable"; import type { IComputedValue } from "mobx"; +import createSyncBoxInjectable from "./create-sync-box.injectable"; + export interface SyncBox { id: string; value: IComputedValue; set: (value: Value) => void; } -export const syncBoxInjectionToken = getInjectionToken>({ +export const syncBoxInjectionToken = getInjectionToken>({ id: "sync-box", }); + +export const getSyncBoxInjectable = (id: string, initialValue: T): Injectable, SyncBox, void> => ( + getInjectable({ + id: `sync-box-${id}`, + instantiate: (di) => { + const createSyncBox = di.inject(createSyncBoxInjectable); + + return createSyncBox(id, initialValue); + }, + injectionToken: syncBoxInjectionToken as InjectionToken, void>, + }) +); diff --git a/packages/core/src/common/utils/sync-box/sync-box.test.ts b/packages/core/src/common/utils/sync-box/sync-box.test.ts index 4697a89f98..5b26a444e8 100644 --- a/packages/core/src/common/utils/sync-box/sync-box.test.ts +++ b/packages/core/src/common/utils/sync-box/sync-box.test.ts @@ -3,27 +3,25 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { DiContainer } from "@ogre-tools/injectable"; -import { getInjectable } from "@ogre-tools/injectable"; import { observe, runInAction } from "mobx"; import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import createSyncBoxInjectable from "./create-sync-box.injectable"; import type { SyncBox } from "./sync-box-injection-token"; -import { syncBoxInjectionToken } from "./sync-box-injection-token"; +import { getSyncBoxInjectable } from "./sync-box-injection-token"; describe("sync-box", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; - beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + beforeEach(async () => { + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { runInAction(() => { mainDi.register(someInjectable); }); }); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(someInjectable); }); @@ -35,9 +33,9 @@ describe("sync-box", () => { let syncBoxInMain: SyncBox; beforeEach(async () => { - await applicationBuilder.startHidden(); + await builder.startHidden(); - syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); + syncBoxInMain = builder.mainDi.inject(someInjectable); observe(syncBoxInMain.value, ({ newValue }) => { valueInMain = newValue as string; @@ -59,7 +57,7 @@ describe("sync-box", () => { beforeEach(async () => { const applicationWindow = - applicationBuilder.applicationWindow.create("some-window-id"); + builder.applicationWindow.create("some-window-id"); await applicationWindow.start(); @@ -101,11 +99,11 @@ describe("sync-box", () => { let syncBoxInRenderer: SyncBox; beforeEach(async () => { - await applicationBuilder.render(); + await builder.render(); - const applicationWindow = applicationBuilder.applicationWindow.only; + const applicationWindow = builder.applicationWindow.only; - syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); + syncBoxInMain = builder.mainDi.inject(someInjectable); syncBoxInRenderer = applicationWindow.di.inject(someInjectable); observe(syncBoxInRenderer.value, ({ newValue }) => { @@ -159,14 +157,4 @@ describe("sync-box", () => { }); }); -const someInjectable = getInjectable({ - id: "some-injectable", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox("some-sync-box", "some-initial-value"); - }, - - injectionToken: syncBoxInjectionToken, -}); +const someInjectable = getSyncBoxInjectable("some-sync-box", "some-initial-value"); diff --git a/packages/core/src/common/utils/wait-for-path.ts b/packages/core/src/common/utils/wait-for-path.ts index f5a068075b..12f29ccf8a 100644 --- a/packages/core/src/common/utils/wait-for-path.ts +++ b/packages/core/src/common/utils/wait-for-path.ts @@ -38,7 +38,7 @@ export async function waitForPath(pathname: string): Promise { .catch(reject); } }; - const onError = (error: any) => { + const onError = (error: unknown) => { watcher.unwatch(dirOfPath); watcher .close() diff --git a/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts b/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts index 37bf7220c7..4159d5b640 100644 --- a/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts +++ b/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts @@ -7,9 +7,9 @@ import logErrorInjectable from "../../log-error.injectable"; export type WithErrorLoggingFor = ( getErrorMessage: (error: unknown) => string -) => any>( - toBeDecorated: T -) => (...args: Parameters) => ReturnType; +) => ( + toBeDecorated: (...args: Params) => Res +) => (...args: Params) => Res; const withErrorLoggingInjectable = getInjectable({ id: "with-error-logging", @@ -32,14 +32,14 @@ const withErrorLoggingInjectable = getInjectable({ throw e; } - if ((returnValue as any) instanceof Promise) { + if (returnValue instanceof Promise) { return returnValue.catch((e: unknown) => { const errorMessage = getErrorMessage(e); logError(errorMessage, e); throw e; - }); + }) as never; } return returnValue; diff --git a/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts b/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts index 9cc5899ce6..2dbaffc08e 100644 --- a/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts +++ b/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts @@ -10,12 +10,13 @@ import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import { getPromiseStatus } from "@k8slens/test-utils"; import logErrorInjectable from "../../log-error.injectable"; +import type { Logger } from "../../logger"; describe("with-error-logging", () => { describe("given decorated sync function", () => { - let toBeDecorated: jest.Mock; + let toBeDecorated: jest.MockedFunction<(a: string, b: string) => number | undefined>; let decorated: (a: string, b: string) => number | undefined; - let logErrorMock: jest.Mock; + let logErrorMock: jest.MockedFunction; beforeEach(() => { const di = getDiForUnitTesting(); @@ -30,7 +31,7 @@ describe("with-error-logging", () => { decorated = pipeline( toBeDecorated, - withErrorLoggingFor((error: any) => `some-error-message-for-${error.message}`), + withErrorLoggingFor((error) => `some-error-message-for-${(error as Error).message}`), ); }); @@ -38,8 +39,7 @@ describe("with-error-logging", () => { let returnValue: number | undefined; beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => 42); + toBeDecorated.mockImplementation(() => 42); returnValue = decorated("some-parameter", "some-other-parameter"); }); @@ -61,8 +61,7 @@ describe("with-error-logging", () => { let returnValue: number | undefined; beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => undefined); + toBeDecorated.mockImplementation(() => undefined); returnValue = decorated("some-parameter", "some-other-parameter"); }); @@ -84,15 +83,14 @@ describe("with-error-logging", () => { let error: Error; beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => { + toBeDecorated.mockImplementation(() => { throw new Error("some-error"); }); try { decorated("some-parameter", "some-other-parameter"); - } catch (e: any) { - error = e; + } catch (e) { + error = e as Error; } }); @@ -130,8 +128,7 @@ describe("with-error-logging", () => { toBeDecorated, withErrorLoggingFor( - (error: any) => - `some-error-message-for-${error.message || error.someProperty}`, + (error) => `some-error-message-for-${(error as Error).message || (error as { someProperty: string }).someProperty}`, ), ); }); @@ -159,7 +156,7 @@ describe("with-error-logging", () => { describe("when call rejects with error instance", () => { beforeEach(() => { - toBeDecorated.reject(new Error("some-error")); + void toBeDecorated.reject(new Error("some-error")); }); it("logs the error", async () => { @@ -183,7 +180,7 @@ describe("with-error-logging", () => { let error: unknown; beforeEach(async () => { - toBeDecorated.reject({ someProperty: "some-rejection" }); + void toBeDecorated.reject({ someProperty: "some-rejection" }); try { await returnValuePromise; diff --git a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts index 63232ad06d..bcee8edbaa 100644 --- a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts +++ b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts @@ -10,7 +10,7 @@ import { withErrorSuppression } from "./with-error-suppression"; describe("with-error-suppression", () => { describe("given decorated sync function", () => { - let toBeDecorated: jest.Mock; + let toBeDecorated: jest.MockedFunction<(a: string, b: string) => void>; let decorated: (a: string, b: string) => void; beforeEach(() => { @@ -39,8 +39,7 @@ describe("with-error-suppression", () => { let returnValue: void; beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => { + toBeDecorated.mockImplementation(() => { throw new Error("some-error"); }); diff --git a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts index 22d51b6014..637b576588 100644 --- a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts +++ b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts @@ -4,15 +4,12 @@ */ import { noop } from "lodash/fp"; -export function withErrorSuppression Promise>(toBeDecorated: TDecorated): (...args: Parameters) => ReturnType | Promise; -export function withErrorSuppression any>(toBeDecorated: TDecorated): (...args: Parameters) => ReturnType | void; - -export function withErrorSuppression(toBeDecorated: any) { - return (...args: any[]) => { +export function withErrorSuppression(toBeDecorated: (...args: Params) => Res): (...args: Params) => Res extends Promise ? Promise : Res | undefined { + return ((...args: Params) => { try { const returnValue = toBeDecorated(...args); - if ((returnValue as any) instanceof Promise) { + if ((returnValue) instanceof Promise) { return returnValue.catch(noop); } @@ -20,5 +17,5 @@ export function withErrorSuppression(toBeDecorated: any) { } catch (e) { return undefined; } - }; + }) as never; } diff --git a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts b/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts index 2a005001da..ee3bd50390 100644 --- a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts +++ b/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts @@ -13,13 +13,13 @@ const withOrphanPromiseInjectable = getInjectable({ instantiate: (di) => { const withErrorLoggingFor = di.inject(withErrorLoggingInjectable); - return Promise>(toBeDecorated: T) => + return Promise>(toBeDecorated: T) => (...args: Parameters): void => { const decorated = pipeline( toBeDecorated, withErrorLoggingFor(() => "Orphan promise rejection encountered"), withErrorSuppression, - ) as ((...args: any[]) => any); + ) as ((...args: unknown[]) => unknown); decorated(...args); }; diff --git a/packages/core/src/common/vars/normalized-platform.injectable.ts b/packages/core/src/common/vars/normalized-platform.injectable.ts index ee1bf7fb74..f844652521 100644 --- a/packages/core/src/common/vars/normalized-platform.injectable.ts +++ b/packages/core/src/common/vars/normalized-platform.injectable.ts @@ -21,7 +21,7 @@ const normalizedPlatformInjectable = getInjectable({ case "win32": return "windows"; default: - throw new Error(`platform=${platform} is unsupported`); + throw new Error(`platform=${platform as string} is unsupported`); } }, }); diff --git a/packages/core/src/extensions/__tests__/configurable-directories.test.ts b/packages/core/src/extensions/__tests__/configurable-directories.test.ts index d663b90973..29dcc3c897 100644 --- a/packages/core/src/extensions/__tests__/configurable-directories.test.ts +++ b/packages/core/src/extensions/__tests__/configurable-directories.test.ts @@ -15,7 +15,7 @@ describe("configurable directories for extension files", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { runInAction(() => { mainDi.override(getHashInjectable, () => x => x); }); @@ -50,7 +50,7 @@ describe("configurable directories for extension files", () => { }, }; - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); }); it("creates extension directory for specific store name", async () => { @@ -85,7 +85,7 @@ describe("configurable directories for extension files", () => { }, }; - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); }); it("creates extension directory for package name", async () => { diff --git a/packages/core/src/extensions/__tests__/extension-loader.test.ts b/packages/core/src/extensions/__tests__/extension-loader.test.ts index 51a43dfeff..8748d01d85 100644 --- a/packages/core/src/extensions/__tests__/extension-loader.test.ts +++ b/packages/core/src/extensions/__tests__/extension-loader.test.ts @@ -31,7 +31,7 @@ describe("ExtensionLoader", () => { di.override(currentlyInClusterFrameInjectable, () => false); di.override(ipcRendererInjectable, () => ({ - invoke: jest.fn(async (channel: string) => { + invoke: jest.fn((channel: string) => { if (channel === "extension-loader:main:state") { return [ [ @@ -68,7 +68,7 @@ describe("ExtensionLoader", () => { return []; }), - on: (channel: string, listener: (event: any, ...args: any[]) => void) => { + on: (channel: string, listener: (event: unknown, ...args: unknown[]) => void) => { if (channel === "extension-loader:main:state") { // First initialize with extensions 1 and 2 // and then broadcast event to remove extension 2 and add extension number 3 diff --git a/packages/core/src/extensions/base-extension-store.ts b/packages/core/src/extensions/base-extension-store.ts index 1a841087ca..a61d8fcd35 100644 --- a/packages/core/src/extensions/base-extension-store.ts +++ b/packages/core/src/extensions/base-extension-store.ts @@ -21,21 +21,21 @@ export interface ExtensionStoreParams extends Omit { - private static readonly instances = new WeakMap(); + private static readonly instances = new WeakMap(); /** * @deprecated This is a form of global shared state. Just call `new Store(...)` */ - static createInstance(this: StaticThis, ...args: R): T { + static createInstance(this: StaticThis, ...args: R): T { return getOrInsertWith(BaseExtensionStore.instances, this, () => new this(...args)) as T; } /** * @deprecated This is a form of global shared state. Just call `new Store(...)` */ - static getInstance(this: StaticThis, strict?: true): T; - static getInstance(this: StaticThis, strict: false): T | undefined; - static getInstance(this: StaticThis, strict = true): T | undefined { + static getInstance(this: StaticThis, strict?: true): T; + static getInstance(this: StaticThis, strict: false): T | undefined; + static getInstance(this: StaticThis, strict = true): T | undefined { if (!BaseExtensionStore.instances.has(this) && strict) { throw new TypeError(`instance of ${this.name} is not created`); } @@ -73,6 +73,8 @@ export abstract class BaseExtensionStore { ...params } = this.rawParams; + void _cwd; + this.persistentStorage = this.dependencies.createPersistentStorage({ ...params, cwd: this.cwd(), diff --git a/packages/core/src/extensions/common-api/k8s-api.ts b/packages/core/src/extensions/common-api/k8s-api.ts index d53f240af5..5a7f21c4f6 100644 --- a/packages/core/src/extensions/common-api/k8s-api.ts +++ b/packages/core/src/extensions/common-api/k8s-api.ts @@ -59,9 +59,9 @@ export interface ExternalKubeApiOptions { // NOTE: this is done to preserve `instanceOf` behaviour function KubeApiCstr< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, ->({ autoRegister = true, ...opts }: KubeApiOptions & ExternalKubeApiOptions) { + Kube extends KubeObject = KubeObject, + Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, +>({ autoRegister = true, ...opts }: KubeApiOptions & ExternalKubeApiOptions) { const api = new InternalKubeApi(getKubeApiDeps(), opts); const di = getLegacyGlobalDiForExtensionApi(); @@ -75,14 +75,14 @@ function KubeApiCstr< } export type KubeApi< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, -> = InternalKubeApi; + Kube extends KubeObject = KubeObject, + Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, +> = InternalKubeApi; export const KubeApi = KubeApiCstr as unknown as new< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, ->(opts: KubeApiOptions & ExternalKubeApiOptions) => InternalKubeApi; + Kube extends KubeObject = KubeObject, + Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, +>(opts: KubeApiOptions & ExternalKubeApiOptions) => InternalKubeApi; /** * @deprecated Switch to using `Common.createResourceStack` instead @@ -94,11 +94,11 @@ export class ResourceStack implements ResourceApplyingStack { this.impl = createResourceStack(cluster, name); } - kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[] | undefined): Promise { + kubectlApplyFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[] | undefined): Promise { return this.impl.kubectlApplyFolder(folderPath, templateContext, extraArgs); } - kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[] | undefined): Promise { + kubectlDeleteFolder(folderPath: string, templateContext?: unknown, extraArgs?: string[] | undefined): Promise { return this.impl.kubectlDeleteFolder(folderPath, templateContext, extraArgs); } } @@ -211,19 +211,19 @@ export interface IgnoredKubeApiOptions { /** * @deprecated this option is overridden and should not be used */ - objectConstructor?: any; + objectConstructor?: unknown; /** * @deprecated this option is overridden and should not be used */ - kind?: any; + kind?: unknown; /** * @deprecated this option is overridden and should not be used */ - isNamespaces?: any; + isNamespaces?: unknown; /** * @deprecated this option is overridden and should not be used */ - apiBase?: any; + apiBase?: unknown; } // NOTE: these *Constructor functions MUST be `function` to work with `new X()` diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts index e27d00a34e..610ebacf72 100644 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts +++ b/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts @@ -87,9 +87,9 @@ describe("ExtensionDiscovery", () => { watchMock.mockImplementationOnce(() => mockWatchInstance); // Need to force isLoaded to be true so that the file watching is started - extensionDiscovery.isLoaded = true; + extensionDiscovery.isLoaded.set(true); - await extensionDiscovery.watchExtensions(); + extensionDiscovery.watchExtensions(); extensionDiscovery.events.on("add", extension => { expect(extension).toEqual({ @@ -130,9 +130,8 @@ describe("ExtensionDiscovery", () => { watchMock.mockImplementationOnce(() => mockWatchInstance); // Need to force isLoaded to be true so that the file watching is started - extensionDiscovery.isLoaded = true; - - await extensionDiscovery.watchExtensions(); + extensionDiscovery.isLoaded.set(true); + extensionDiscovery.watchExtensions(); const onAdd = jest.fn(); diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.ts index 31ecfc04da..cdeee413fa 100644 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.ts +++ b/packages/core/src/extensions/extension-discovery/extension-discovery.ts @@ -5,9 +5,8 @@ import { ipcRenderer } from "electron"; import { EventEmitter } from "events"; -import { makeObservable, observable, reaction, when } from "mobx"; +import { action, observable, reaction } from "mobx"; import { broadcastMessage, ipcMainHandle, ipcRendererOn } from "../../common/ipc"; -import { toJS } from "../../common/utils"; import { isErrnoException } from "@k8slens/utilities"; import type { ExtensionLoader } from "../extension-loader"; import type { InstalledExtension, LensExtensionId, LensExtensionManifest, ExternalInstalledExtension } from "@k8slens/legacy-extensions"; @@ -31,6 +30,7 @@ import type { GetRelativePath } from "../../common/path/get-relative-path.inject import type { RemovePath } from "../../common/fs/remove.injectable"; import type TypedEventEmitter from "typed-emitter"; import type { IsExtensionEnabled } from "../../features/extensions/enabled/common/is-enabled.injectable"; +import assert from "assert"; interface Dependencies { readonly extensionLoader: ExtensionLoader; @@ -95,53 +95,39 @@ export class ExtensionDiscovery { private extensions: Map = new Map(); // True if extensions have been loaded from the disk after app startup - @observable isLoaded = false; - - get whenLoaded() { - return when(() => this.isLoaded); - } + readonly isLoaded = observable.box(false); public readonly events: TypedEventEmitter = new EventEmitter(); - constructor(protected readonly dependencies: Dependencies) { - makeObservable(this); - } + constructor(protected readonly dependencies: Dependencies) {} - get localFolderPath(): string { - return this.dependencies.joinPaths(this.dependencies.homeDirectoryPath, ".k8slens", "extensions"); - } - - get packageJsonPath(): string { - return this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, manifestFilename); - } - - get nodeModulesPath(): string { - return this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, "node_modules"); - } + readonly localFolderPath = this.dependencies.joinPaths(this.dependencies.homeDirectoryPath, ".k8slens", "extensions"); + readonly packageJsonPath = this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, manifestFilename); + readonly nodeModulesPath = this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, "node_modules"); /** * Initializes the class and setups the file watcher for added/removed local extensions. */ - async init(): Promise { + async init() { if (ipcRenderer) { await this.initRenderer(); } else { - await this.initMain(); + this.initMain(); } } - async initRenderer(): Promise { - const onMessage = ({ isLoaded }: ExtensionDiscoveryChannelMessage) => { - this.isLoaded = isLoaded; - }; + async initRenderer() { + const onMessage = action(({ isLoaded }: ExtensionDiscoveryChannelMessage) => { + this.isLoaded.set(isLoaded); + }); - requestInitialExtensionDiscovery().then(onMessage); - ipcRendererOn(extensionDiscoveryStateChannel, (_event, message: ExtensionDiscoveryChannelMessage) => { - onMessage(message); + await requestInitialExtensionDiscovery().then(onMessage); + ipcRendererOn(extensionDiscoveryStateChannel, (_event, message) => { + onMessage(message as ExtensionDiscoveryChannelMessage); }); } - async initMain(): Promise { + initMain() { ipcMainHandle(extensionDiscoveryStateChannel, () => this.toJSON()); reaction(() => this.toJSON(), () => { @@ -155,12 +141,10 @@ export class ExtensionDiscovery { * Watches for added/removed local extensions. * Dependencies are installed automatically after an extension folder is copied. */ - async watchExtensions(): Promise { + watchExtensions() { + assert(this.isLoaded.get(), "Can only watch extensions after ExtensionDiscovery is loaded"); + this.dependencies.logger.info(`${logModule} watching extension add/remove in ${this.localFolderPath}`); - - // Wait until .load() has been called and has been resolved - await this.whenLoaded; - this._watch = this.dependencies.watch(this.localFolderPath, { // For adding and removing symlinks to work, the depth has to be 1. depth: 1, @@ -174,11 +158,11 @@ export class ExtensionDiscovery { }, }) // Extension add is detected by watching "/package.json" add - .on("add", this.handleWatchFileAdd) + .on("add", (path) => void this.handleWatchFileAdd(path)) // Extension remove is detected by watching "" unlink - .on("unlinkDir", this.handleWatchUnlinkEvent) + .on("unlinkDir", (path) => void this.handleWatchUnlinkEvent(path)) // Extension remove is detected by watching "" unlink - .on("unlink", this.handleWatchUnlinkEvent); + .on("unlink", (path) => void this.handleWatchUnlinkEvent(path)); } async stopWatchingExtensions() { @@ -213,7 +197,7 @@ export class ExtensionDiscovery { this.events.emit("add", extension); } } catch (error) { - this.dependencies.logger.error(`${logModule}: failed to add extension: ${error}`, { error }); + this.dependencies.logger.error(`${logModule}: failed to add extension: ${String(error)}`, { error }); } finally { this.dependencies.extensionInstallationStateStore.clearInstallingFromMain(manifestPath); } @@ -309,7 +293,7 @@ export class ExtensionDiscovery { const extensions = await this.ensureExtensions(); - this.isLoaded = true; + this.isLoaded.set(true); return extensions; } @@ -362,7 +346,7 @@ export class ExtensionDiscovery { // ignore this error, probably from .DS_Store file this.dependencies.logger.debug(`${logModule}: failed to load extension manifest through a not-dir-like at ${manifestPath}`); } else { - this.dependencies.logger.error(`${logModule}: can't load extension manifest at ${manifestPath}: ${error}`); + this.dependencies.logger.error(`${logModule}: can't load extension manifest at ${manifestPath}: ${String(error)}`); } return null; @@ -410,12 +394,12 @@ export class ExtensionDiscovery { } toJSON(): ExtensionDiscoveryChannelMessage { - return toJS({ - isLoaded: this.isLoaded, - }); + return { + isLoaded: this.isLoaded.get(), + }; } broadcast(): void { - broadcastMessage(extensionDiscoveryStateChannel, this.toJSON()); + void broadcastMessage(extensionDiscoveryStateChannel, this.toJSON()); } } diff --git a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts b/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts index fac13559ff..f389010c56 100644 --- a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts +++ b/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts @@ -35,11 +35,11 @@ export class ExtensionInstallationStateStore { bindIpcListeners = () => { ipcRenderer - .on(installingFromMainChannel, (event, extId) => { + .on(installingFromMainChannel, (event, extId: string) => { this.setInstalling(extId); }) - .on(clearInstallingFromMainChannel, (event, extId) => { + .on(clearInstallingFromMainChannel, (event, extId: string) => { this.clearInstalling(extId); }); }; @@ -68,7 +68,7 @@ export class ExtensionInstallationStateStore { * @param extId the ID of the extension */ setInstallingFromMain = (extId: string): void => { - broadcastMessage(installingFromMainChannel, extId); + void broadcastMessage(installingFromMainChannel, extId); }; /** @@ -76,7 +76,7 @@ export class ExtensionInstallationStateStore { * @param extId the ID of the extension */ clearInstallingFromMain = (extId: string): void => { - broadcastMessage(clearInstallingFromMainChannel, extId); + void broadcastMessage(clearInstallingFromMainChannel, extId); }; /** @@ -89,13 +89,13 @@ export class ExtensionInstallationStateStore { const preInstallStepId = uuid.v4(); this.dependencies.logger.debug( - `${Prefix}: starting a new preinstall phase: ${preInstallStepId}`, + `${Prefix}: starting a new pre-install phase: ${preInstallStepId}`, ); this.preInstallIds.add(preInstallStepId); return disposer(() => { this.preInstallIds.delete(preInstallStepId); - this.dependencies.logger.debug(`${Prefix}: ending a preinstall phase: ${preInstallStepId}`); + this.dependencies.logger.debug(`${Prefix}: ending a pre-install phase: ${preInstallStepId}`); }); }; @@ -225,23 +225,23 @@ export class ExtensionInstallationStateStore { } /** - * The current number of extensions preinstalling + * The current number of extensions pre-installing */ - get preinstalling(): number { + get preInstalling(): number { return this.preInstallIds.size; } /** * If there is at least one extension currently downloading */ - get anyPreinstalling(): boolean { - return this.preinstalling > 0; + get anyPreInstalling(): boolean { + return this.preInstalling > 0; } /** - * If there is at least one installing or preinstalling step taking place + * If there is at least one installing or pre-installing step taking place */ get anyPreInstallingOrInstalling(): boolean { - return this.anyInstalling || this.anyPreinstalling; + return this.anyInstalling || this.anyPreInstalling; } } diff --git a/packages/core/src/extensions/extension-loader/extension-loader.ts b/packages/core/src/extensions/extension-loader/extension-loader.ts index 591f70c25f..bfa019631b 100644 --- a/packages/core/src/extensions/extension-loader/extension-loader.ts +++ b/packages/core/src/extensions/extension-loader/extension-loader.ts @@ -6,10 +6,10 @@ import { ipcMain, ipcRenderer } from "electron"; import { isEqual } from "lodash"; import type { ObservableMap } from "mobx"; -import { runInAction, action, computed, toJS, observable, reaction, when } from "mobx"; +import { runInAction, computed, toJS, observable, reaction, when } from "mobx"; import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc"; import { isDefined, iter } from "@k8slens/utilities"; -import type { ExternalInstalledExtension, InstalledExtension, LensExtensionConstructor, LensExtensionId, BundledExtension, BundledInstalledExtension, LegacyLensExtension } from "@k8slens/legacy-extensions"; +import type { LensExtensionId, ExternalInstalledExtension, InstalledExtension, LensExtensionConstructor, BundledExtension, BundledInstalledExtension, LegacyLensExtension } from "@k8slens/legacy-extensions"; import type { LensExtension } from "../lens-extension"; import { extensionLoaderFromMainChannel, extensionLoaderFromRendererChannel } from "../../common/ipc/extension-handling"; import { requestExtensionLoaderInitialState } from "../../renderer/ipc"; @@ -104,7 +104,7 @@ export class ExtensionLoader { if (ipcMain) { await this.initMain(); } else { - await this.initRenderer(); + this.initRenderer(); } await when(() => this.isLoaded.get()); @@ -130,8 +130,7 @@ export class ExtensionLoader { this.extensions.set(extension.id, extension); } - @action - removeInstance(lensExtensionId: LensExtensionId) { + async removeInstance(lensExtensionId: LensExtensionId) { this.dependencies.logger.info(`${logModule} deleting extension instance ${lensExtensionId}`); const instance = this.dependencies.extensionInstances.get(lensExtensionId); @@ -140,22 +139,25 @@ export class ExtensionLoader { } try { - instance.disable(); + await instance.disable(); const extension = this.dependencies.getExtension(instance); extension.deregister(); this.onRemoveExtensionId.emit(instance.id); - this.dependencies.extensionInstances.delete(lensExtensionId); - this.nonInstancesByName.delete(instance.name); + + runInAction(() => { + this.dependencies.extensionInstances.delete(lensExtensionId); + this.nonInstancesByName.delete(instance.name); + }); } catch (error) { this.dependencies.logger.error(`${logModule}: deactivation extension error`, { lensExtensionId, error }); } } - removeExtension(lensExtensionId: LensExtensionId) { - this.removeInstance(lensExtensionId); + async removeExtension(lensExtensionId: LensExtensionId) { + await this.removeInstance(lensExtensionId); if (!this.extensions.delete(lensExtensionId)) { throw new Error(`Can't remove extension ${lensExtensionId}, doesn't exist.`); @@ -185,7 +187,7 @@ export class ExtensionLoader { }); } - protected async initRenderer() { + protected initRenderer() { const extensionListHandler = (extensions: [LensExtensionId, InstalledExtension][]) => { runInAction(() => { this.isLoaded.set(true); @@ -197,12 +199,12 @@ export class ExtensionLoader { // Remove deleted extensions in renderer side only this.extensions.forEach((_, lensExtensionId) => { if (!receivedExtensionIds.includes(lensExtensionId)) { - this.removeExtension(lensExtensionId); + void this.removeExtension(lensExtensionId); } }); }; - requestExtensionLoaderInitialState().then(extensionListHandler); + void requestExtensionLoaderInitialState().then(extensionListHandler); ipcRendererOn(extensionLoaderFromMainChannel, (event, extensions: [LensExtensionId, InstalledExtension][]) => { extensionListHandler(extensions); }); @@ -213,7 +215,7 @@ export class ExtensionLoader { ? extensionLoaderFromRendererChannel : extensionLoaderFromMainChannel; - broadcastMessage(channel, Array.from(this.extensions)); + void broadcastMessage(channel, Array.from(this.extensions)); } syncExtensions(extensions: [LensExtensionId, InstalledExtension][]) { @@ -269,9 +271,10 @@ export class ExtensionLoader { await Promise.all( extensions.map(extension => // If extension activation fails, log error - extension.activated.catch((error) => { - this.dependencies.logger.error(`${logModule}: activation extension error`, { ext: extension.installedExtension, error }); - }), + extension.activated + .catch((error: unknown) => { + this.dependencies.logger.error(`${logModule}: activation extension error`, { ext: extension.installedExtension, error }); + }), ), ); @@ -282,9 +285,10 @@ export class ExtensionLoader { }); return extensions.map(extension => { - const loaded = extension.instance.enable().catch((err) => { - this.dependencies.logger.error(`${logModule}: failed to enable`, { ext: extension, err }); - }); + const loaded = extension.instance.enable() + .catch((error: unknown) => { + this.dependencies.logger.error(`${logModule}: failed to enable`, { ext: extension, error }); + }); return { isBundled: extension.installedExtension.isBundled, @@ -300,9 +304,9 @@ export class ExtensionLoader { // 3. Call .enable for each extension // 4. Return ExtensionLoading[] - return [...installedExtensions.entries()] + const promises = [...installedExtensions.entries()] .filter((entry): entry is [string, ExternalInstalledExtension] => !entry[1].isBundled) - .map(([extId, installedExtension]) => { + .map(async ([extId, installedExtension]) => { const alreadyInit = this.dependencies.extensionInstances.has(extId) || this.nonInstancesByName.has(installedExtension.manifest.name); if (installedExtension.isCompatible && installedExtension.isEnabled && !alreadyInit) { @@ -328,11 +332,13 @@ export class ExtensionLoader { this.dependencies.logger.error(`${logModule}: error loading extension`, { ext: installedExtension, err }); } } else if (!installedExtension.isEnabled && alreadyInit) { - this.removeInstance(extId); + await this.removeInstance(extId); } return null; - }) + }); + + return (await Promise.all(promises)) .filter(isDefined); } @@ -368,9 +374,10 @@ export class ExtensionLoader { const extAbsolutePath = this.dependencies.joinPaths(this.dependencies.getDirnameOfPath(extension.manifestPath), extRelativePath); try { - return require(/* webpackIgnore: true */ extAbsolutePath).default; + // eslint-disable-next-line @typescript-eslint/no-var-requires + return (require(/* webpackIgnore: true */ extAbsolutePath) as unknown as { default: LensExtensionConstructor | null }).default; } catch (error) { - const message = (error instanceof Error ? error.stack : undefined) || error; + const message = (error instanceof Error ? error.stack : undefined) || String(error); this.dependencies.logger.error(`${logModule}: can't load ${this.dependencies.extensionEntryPointName} for "${extension.manifest.name}": ${message}`, { extension }); } diff --git a/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts b/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts index 7d507debb6..e49e38f0ea 100644 --- a/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts +++ b/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts @@ -7,6 +7,7 @@ import type { Injectable } from "@ogre-tools/injectable"; import { getInjectionToken } from "@ogre-tools/injectable"; import type { IComputedValue } from "mobx"; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export type Injectables = Injectable[]; export type Registration = Injectables | IComputedValue; export type ExtensionRegistrator = (extension: LegacyLensExtension) => Registration; diff --git a/packages/core/src/extensions/ipc/ipc-main.ts b/packages/core/src/extensions/ipc/ipc-main.ts index 42282af464..200a0afc33 100644 --- a/packages/core/src/extensions/ipc/ipc-main.ts +++ b/packages/core/src/extensions/ipc/ipc-main.ts @@ -39,6 +39,7 @@ export abstract class IpcMain extends IpcRegistrar { * @param listener The function that will be called with the arguments of the broadcast * @returns An optional disposer, Lens will cleanup when the extension is disabled or uninstalled even if this is not called */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; const cleanup = once(() => { @@ -59,6 +60,7 @@ export abstract class IpcMain extends IpcRegistrar { * @param channel The name of the RPC * @param handler The remote procedure that is called */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any handle(channel: string, handler: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any): void { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; diff --git a/packages/core/src/extensions/ipc/ipc-registrar.ts b/packages/core/src/extensions/ipc/ipc-registrar.ts index 7fc27ba0fd..1985f6f584 100644 --- a/packages/core/src/extensions/ipc/ipc-registrar.ts +++ b/packages/core/src/extensions/ipc/ipc-registrar.ts @@ -22,7 +22,7 @@ export abstract class IpcRegistrar extends Singleton { * @param channel The channel to broadcast to your whole extension, both `main` and `renderer` * @param args The arguments passed to all listeners */ - broadcast(channel: string, ...args: any[]): void { - broadcastMessage(`extensions@${this[IpcPrefix]}:${channel}`, ...args); + broadcast(channel: string, ...args: unknown[]): void { + void broadcastMessage(`extensions@${this[IpcPrefix]}:${channel}`, ...args); } } diff --git a/packages/core/src/extensions/ipc/ipc-renderer.ts b/packages/core/src/extensions/ipc/ipc-renderer.ts index 9060a19154..f97c5f3705 100644 --- a/packages/core/src/extensions/ipc/ipc-renderer.ts +++ b/packages/core/src/extensions/ipc/ipc-renderer.ts @@ -25,6 +25,7 @@ export abstract class IpcRenderer extends IpcRegistrar { * @param listener The function that will be called with the arguments of the broadcast * @returns An optional disposer, Lens will cleanup even if this is not called */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; const cleanup = once(() => { @@ -48,7 +49,8 @@ export abstract class IpcRenderer extends IpcRegistrar { * @param args The arguments to pass to the RPC * @returns A promise of the resulting value */ - invoke(channel: string, ...args: any[]): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + invoke(channel: string, ...args: unknown[]): Promise { const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; return ipcRenderer.invoke(prefixedChannel, ...args); diff --git a/packages/core/src/extensions/lens-extension.ts b/packages/core/src/extensions/lens-extension.ts index 407d4e9aa2..5106144399 100644 --- a/packages/core/src/extensions/lens-extension.ts +++ b/packages/core/src/extensions/lens-extension.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { action, computed, makeObservable, observable } from "mobx"; +import { computed, makeObservable, observable, runInAction } from "mobx"; import { disposer } from "@k8slens/utilities"; import type { ProtocolHandlerRegistration } from "../common/protocol-handler/registration"; import type { InstalledExtension, LensExtensionId, LensExtensionManifest } from "@k8slens/legacy-extensions"; @@ -83,30 +83,34 @@ export class LensExtension { return this.dependencies.ensureHashedDirectoryForExtension(this.storeName); } - @action async enable() { if (this._isEnabled) { return; } - this._isEnabled = true; + runInAction(() => { + this._isEnabled = true; + }); this.dependencies.logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`); + + return Promise.resolve(); } - @action async disable() { if (!this._isEnabled) { return; } - this._isEnabled = false; + runInAction(() => { + this._isEnabled = false; + }); try { await this.onDeactivate(); this[Disposers](); this.dependencies.logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`); } catch (error) { - this.dependencies.logger.error(`[EXTENSION]: disabling ${this.name}@${this.version} threw an error: ${error}`); + this.dependencies.logger.error(`[EXTENSION]: disabling ${this.name}@${this.version} threw an error: ${String(error)}`); } } diff --git a/packages/core/src/extensions/lens-main-extension.ts b/packages/core/src/extensions/lens-main-extension.ts index 2eab08895b..92bc9fd528 100644 --- a/packages/core/src/extensions/lens-main-extension.ts +++ b/packages/core/src/extensions/lens-main-extension.ts @@ -61,6 +61,7 @@ export class LensMainExtension extends LensExtension { */ terminalShellEnvModifier?: ShellEnvModifier; + // eslint-disable-next-line @typescript-eslint/no-explicit-any async navigate(pageId?: string, params?: Record, frameId?: number) { await this.dependencies.navigate(this.id, pageId, params, frameId); } diff --git a/packages/core/src/extensions/lens-renderer-extension.ts b/packages/core/src/extensions/lens-renderer-extension.ts index 76a35eae05..6c2c6c67b5 100644 --- a/packages/core/src/extensions/lens-renderer-extension.ts +++ b/packages/core/src/extensions/lens-renderer-extension.ts @@ -44,6 +44,7 @@ import getExtensionPageParametersInjectable from "../renderer/routes/get-extensi import navigateToRouteInjectable from "../renderer/routes/navigate-to-route.injectable"; import routesInjectable from "../renderer/routes/routes.injectable"; import ensureHashedDirectoryForExtensionInjectable from "./extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; +import type { PageParamInit } from "./renderer-api/navigation"; interface LensRendererExtensionDependencies extends LensExtensionDependencies { navigateToRoute: NavigateToRoute; @@ -53,6 +54,10 @@ interface LensRendererExtensionDependencies extends LensExtensionDependencies { readonly categoryRegistry: CatalogCategoryRegistry; } +export const getPageRegistration = (reg: PageRegistration): PageRegistration => reg; +export const getParamInitRegistration = (reg: Omit, "name">) => reg; +export const getParamsRegistration =

(reg: P): P => reg; + export class LensRendererExtension extends LensExtension { globalPages: PageRegistration[] = []; clusterPages: PageRegistration[] = []; @@ -95,7 +100,7 @@ export class LensRendererExtension extends LensExtension { super(deps, extension); } - async navigate(pageId?: string, params: object = {}) { + navigate(pageId?: string, params: object = {}) { const routes = this.dependencies.routes.get(); const targetRegistration = [...this.globalPages, ...this.clusterPages] .find(registration => registration.id === (pageId || undefined)); @@ -127,6 +132,7 @@ export class LensRendererExtension extends LensExtension { this.dependencies.navigateToRoute(targetRoute, { query, + parameters: {}, }); } @@ -138,8 +144,9 @@ export class LensRendererExtension extends LensExtension { * * @deprecated Switch to using "enabled" or "visible" properties in each registration together with `activeCluster` */ + // eslint-disable-next-line @typescript-eslint/ban-types async isEnabledForCluster(cluster: KubernetesCluster): Promise { - return (void cluster) || true; + return Promise.resolve((void cluster) || true); } /** diff --git a/packages/core/src/extensions/main-api/k8s-api.ts b/packages/core/src/extensions/main-api/k8s-api.ts index 05cffffdbf..4b60338fe6 100644 --- a/packages/core/src/extensions/main-api/k8s-api.ts +++ b/packages/core/src/extensions/main-api/k8s-api.ts @@ -7,7 +7,7 @@ * @deprecated This function never works * @returns false */ -export function isAllowedResource(...args: any[]) { +export function isAllowedResource(...args: unknown[]) { return Boolean(void args); } diff --git a/packages/core/src/features/add-cluster/navigation-using-application-menu.test.tsx b/packages/core/src/features/add-cluster/navigation-using-application-menu.test.tsx index 19b11672c9..74d99440ef 100644 --- a/packages/core/src/features/add-cluster/navigation-using-application-menu.test.tsx +++ b/packages/core/src/features/add-cluster/navigation-using-application-menu.test.tsx @@ -8,13 +8,13 @@ import type { ApplicationBuilder } from "../../renderer/components/test-utils/ge import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; describe("add-cluster - navigation using application menu", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -28,8 +28,8 @@ describe("add-cluster - navigation using application menu", () => { }); describe("when navigating to add cluster using application menu", () => { - beforeEach(async () => { - await applicationBuilder.applicationMenu.click( + beforeEach(() => { + builder.applicationMenu.click( "root", "file", "add-cluster", diff --git a/packages/core/src/features/application-menu/application-menu-in-legacy-extension-api.test.ts b/packages/core/src/features/application-menu/application-menu-in-legacy-extension-api.test.ts index 569ea9102f..6b9988ab0c 100644 --- a/packages/core/src/features/application-menu/application-menu-in-legacy-extension-api.test.ts +++ b/packages/core/src/features/application-menu/application-menu-in-legacy-extension-api.test.ts @@ -18,7 +18,7 @@ describe("application-menu-in-legacy-extension-api", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { runInAction(() => { mainDi.register( someTopMenuItemInjectable, @@ -84,7 +84,7 @@ describe("application-menu-in-legacy-extension-api", () => { }, }; - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); }); it("related menu items exist", () => { @@ -113,7 +113,7 @@ describe("application-menu-in-legacy-extension-api", () => { describe("when the extension is disabled", () => { beforeEach(() => { - builder.extensions.disable(testExtensionOptions); + await builder.extensions.disable(testExtensionOptions); }); it("when related menu items no longer exist", () => { @@ -126,7 +126,7 @@ describe("application-menu-in-legacy-extension-api", () => { }); it("when the extension is enabled again, also related menu items exist again", () => { - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); const menuItemPathsForExtension = builder.applicationMenu.items.filter( (x) => @@ -172,7 +172,7 @@ describe("application-menu-in-legacy-extension-api", () => { }, }; - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); }); it("only recognizable menu items from extension exist", () => { diff --git a/packages/core/src/features/application-menu/application-menu.test.ts b/packages/core/src/features/application-menu/application-menu.test.ts index 7f17c9eceb..5502e2d305 100644 --- a/packages/core/src/features/application-menu/application-menu.test.ts +++ b/packages/core/src/features/application-menu/application-menu.test.ts @@ -21,7 +21,7 @@ describe.each(allPlatforms)("application-menu, given platform is '%s'", (platfor builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(platformInjectable, () => platform); mainDi.override( @@ -45,6 +45,7 @@ describe.each(allPlatforms)("application-menu, given platform is '%s'", (platfor beforeEach(() => { advanceFakeTime(100); applicationMenuPaths = getCompositePaths( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access populateApplicationMenuMock.mock.calls[0][0], ); }); diff --git a/packages/core/src/features/application-menu/handling-of-orphan-application-menu-items.test.ts b/packages/core/src/features/application-menu/handling-of-orphan-application-menu-items.test.ts index b567f99a7d..fcb6dc2d7e 100644 --- a/packages/core/src/features/application-menu/handling-of-orphan-application-menu-items.test.ts +++ b/packages/core/src/features/application-menu/handling-of-orphan-application-menu-items.test.ts @@ -25,7 +25,7 @@ describe("handling-of-orphan-application-menu-items, given orphan menu item", () builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { const someOrphanMenuItemInjectable = getInjectable({ id: "some-orphan-menu-item", instantiate: () => ({ @@ -62,6 +62,7 @@ describe("handling-of-orphan-application-menu-items, given orphan menu item", () advanceFakeTime(100); applicationMenuPaths = getCompositePaths( + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access populateApplicationMenuMock.mock.calls[0][0], ); }); diff --git a/packages/core/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts b/packages/core/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts index 1da1bc00b7..8cb6111351 100644 --- a/packages/core/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts +++ b/packages/core/src/features/application-menu/main/menu-items/application-menu-item-injection-token.ts @@ -23,7 +23,7 @@ export interface Labeled { label: string; } -export interface MaybeLabeled extends SetOptional {} +export type MaybeLabeled = SetOptional; type ApplicationMenuItemType = // Note: "kind" is being used for Discriminated unions of TypeScript to achieve type narrowing. diff --git a/packages/core/src/features/application-menu/main/menu-items/help/open-documentation/open-documentation-menu-item.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/help/open-documentation/open-documentation-menu-item.injectable.ts index 983804b591..460487882d 100644 --- a/packages/core/src/features/application-menu/main/menu-items/help/open-documentation/open-documentation-menu-item.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/help/open-documentation/open-documentation-menu-item.injectable.ts @@ -21,10 +21,8 @@ const openDocumentationMenuItemInjectable = getInjectable({ id: "open-documentation", orderNumber: 20, label: "Documentation", - - // TODO: Convert to async/await onClick: () => { - openLinkInBrowser(docsUrl).catch((error) => { + openLinkInBrowser(docsUrl).catch((error: unknown) => { logger.error("[MENU]: failed to open browser", { error }); }); }, diff --git a/packages/core/src/features/application-menu/main/menu-items/help/open-support/open-support-item.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/help/open-support/open-support-item.injectable.ts index 4c10f92cd5..0102807d60 100644 --- a/packages/core/src/features/application-menu/main/menu-items/help/open-support/open-support-item.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/help/open-support/open-support-item.injectable.ts @@ -21,10 +21,8 @@ const openSupportItemInjectable = getInjectable({ id: "open-support", orderNumber: 30, label: "Support", - - // TODO: Convert to async/await onClick: () => { - openLinkInBrowser(supportUrl).catch((error) => { + openLinkInBrowser(supportUrl).catch((error: unknown) => { logger.error("[MENU]: failed to open browser", { error }); }); }, diff --git a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/about-menu-item.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/about-menu-item.injectable.ts index 6e269a9e3a..a6ff17f341 100644 --- a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/about-menu-item.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/about-menu-item.injectable.ts @@ -24,7 +24,7 @@ const aboutMenuItemInjectable = getInjectable({ label: `About ${productName}`, onClick() { - showAbout(); + void showAbout(); }, }; }, diff --git a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/show-about.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/show-about.injectable.ts index 7568482c12..601d18117e 100644 --- a/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/show-about.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/special-menu-for-mac-application/show-about-application/show-about.injectable.ts @@ -25,7 +25,7 @@ const showAboutInjectable = getInjectable({ const applicationCopyright = di.inject(applicationCopyrightInjectable); const specificVersions = di.inject(specificVersionsInjectable); - return () => { + return async () => { const appInfo = [ `${appName}: ${buildVersion}`, `Extension API: ${extensionApiVersion}`, @@ -43,7 +43,7 @@ const showAboutInjectable = getInjectable({ ); } - showMessagePopup( + await showMessagePopup( `${isWindows ? " ".repeat(2) : ""}${appName}`, productName, appInfo.join("\r\n"), diff --git a/packages/core/src/features/application-menu/main/menu-items/view/open-command-palette/open-command-palette-menu-item.injectable.ts b/packages/core/src/features/application-menu/main/menu-items/view/open-command-palette/open-command-palette-menu-item.injectable.ts index ac0bd77bfc..b69cb48fee 100644 --- a/packages/core/src/features/application-menu/main/menu-items/view/open-command-palette/open-command-palette-menu-item.injectable.ts +++ b/packages/core/src/features/application-menu/main/menu-items/view/open-command-palette/open-command-palette-menu-item.injectable.ts @@ -28,7 +28,7 @@ const openCommandPaletteMenuItemInjectable = getInjectable({ * NOTE: this `?` is required because of a bug in playwright. https://github.com/microsoft/playwright/issues/10554 */ if (!event?.triggeredByAccelerator) { - broadcastMessage("command-palette:open"); + void broadcastMessage("command-palette:open"); } }, }; diff --git a/packages/core/src/features/application-update/analytics-for-installing-update.test.ts b/packages/core/src/features/application-update/analytics-for-installing-update.test.ts index 0da666a22b..b0ef916782 100644 --- a/packages/core/src/features/application-update/analytics-for-installing-update.test.ts +++ b/packages/core/src/features/application-update/analytics-for-installing-update.test.ts @@ -34,7 +34,7 @@ describe("analytics for installing update", () => { analyticsListenerMock = jest.fn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getBuildVersionInjectable, () => () => "42.0.0"); checkForPlatformUpdatesMock = asyncFn(); @@ -115,10 +115,10 @@ describe("analytics for installing update", () => { }); }); - it("when checking for updates using tray, sends event to analytics for being checked from tray", async () => { + it("when checking for updates using tray, sends event to analytics for being checked from tray", () => { analyticsListenerMock.mockClear(); - builder.tray.click("check-for-updates"); + void builder.tray.click("check-for-updates"); expect(analyticsListenerMock.mock.calls).toEqual([ [ @@ -136,7 +136,7 @@ describe("analytics for installing update", () => { }); - it("when checking for updates using application menu, sends event to analytics for being checked from application menu", async () => { + it("when checking for updates using application menu, sends event to analytics for being checked from application menu", () => { analyticsListenerMock.mockClear(); builder.applicationMenu.click("root", "mac", "check-for-updates"); @@ -160,7 +160,7 @@ describe("analytics for installing update", () => { beforeEach(async () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); analyticsListenerMock.mockClear(); @@ -197,7 +197,7 @@ describe("analytics for installing update", () => { beforeEach(() => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); analyticsListenerMock.mockClear(); }); diff --git a/packages/core/src/features/application-update/child-features/application-update-using-application-menu/application-update-using-application-menu.test.ts b/packages/core/src/features/application-update/child-features/application-update-using-application-menu/application-update-using-application-menu.test.ts index d25355c821..440ea4dee4 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-application-menu/application-update-using-application-menu.test.ts +++ b/packages/core/src/features/application-update/child-features/application-update-using-application-menu/application-update-using-application-menu.test.ts @@ -12,19 +12,17 @@ import checkForPlatformUpdatesInjectable from "../../main/check-for-updates/chec import type { RenderResult } from "@testing-library/react"; import showMessagePopupInjectable from "../../../../main/electron-app/features/show-message-popup.injectable"; import type { ShowMessagePopup } from "../../../../main/electron-app/features/show-message-popup.injectable"; -import electronUpdaterIsActiveInjectable - from "../../../../main/electron-app/features/electron-updater-is-active.injectable"; -import publishIsConfiguredInjectable - from "../../child-features/updating-is-enabled/main/publish-is-configured.injectable"; +import electronUpdaterIsActiveInjectable from "../../../../main/electron-app/features/electron-updater-is-active.injectable"; +import publishIsConfiguredInjectable from "../updating-is-enabled/main/publish-is-configured.injectable"; describe("installing update using application menu", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let showMessagePopupMock: AsyncFnMock; - beforeEach(() => { - applicationBuilder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + beforeEach(async () => { + builder = getApplicationBuilder(); + await builder.beforeApplicationStart(({ mainDi }) => { checkForPlatformUpdatesMock = asyncFn(); showMessagePopupMock = asyncFn(); @@ -47,7 +45,7 @@ describe("installing update using application menu", () => { let rendered: RenderResult; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -56,7 +54,7 @@ describe("installing update using application menu", () => { describe("when user checks for updates using application menu", () => { beforeEach(() => { - applicationBuilder.applicationMenu.click( + builder.applicationMenu.click( "root", "mac", "check-for-updates", diff --git a/packages/core/src/features/application-update/child-features/application-update-using-application-menu/main/check-for-updates-menu-item.injectable.ts b/packages/core/src/features/application-update/child-features/application-update-using-application-menu/main/check-for-updates-menu-item.injectable.ts index 72cbff284a..16fa6e77ca 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-application-menu/main/check-for-updates-menu-item.injectable.ts +++ b/packages/core/src/features/application-update/child-features/application-update-using-application-menu/main/check-for-updates-menu-item.injectable.ts @@ -35,7 +35,7 @@ const checkForUpdatesMenuItemInjectable = getInjectable({ if (updateIsReadyToBeInstalled) { await showApplicationWindow(); } else { - showMessagePopup( + await showMessagePopup( "No Updates Available", "You're all good", "You've got the latest version of Lens,\nthanks for staying on the ball.", diff --git a/packages/core/src/features/application-update/child-features/application-update-using-top-bar/installing-update-using-topbar-button.test.tsx b/packages/core/src/features/application-update/child-features/application-update-using-top-bar/installing-update-using-topbar-button.test.tsx index be9bc9291a..f9e610eeec 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-top-bar/installing-update-using-topbar-button.test.tsx +++ b/packages/core/src/features/application-update/child-features/application-update-using-top-bar/installing-update-using-topbar-button.test.tsx @@ -23,17 +23,17 @@ function daysToMilliseconds(days: number) { } describe("encourage user to update when sufficient time passed since update was downloaded", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; let quitAndInstallUpdateMock: jest.MockedFunction<() => void>; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -59,7 +59,7 @@ describe("encourage user to update when sufficient time passed since update was let rendered: RenderResult; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -75,12 +75,10 @@ describe("encourage user to update when sufficient time passed since update was describe("given the update check", () => { let processCheckingForUpdates: (source: string) => Promise<{ updateIsReadyToBeInstalled: boolean }>; - beforeEach(async () => { - processCheckingForUpdates = applicationBuilder.mainDi.inject( - processCheckingForUpdatesInjectable, - ); + beforeEach(() => { + processCheckingForUpdates = builder.mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); describe("when update downloaded", () => { @@ -106,9 +104,9 @@ describe("encourage user to update when sufficient time passed since update was }); it("given closing the application window, when starting the application window again, still shows the button", async () => { - applicationBuilder.applicationWindow.closeAll(); + builder.applicationWindow.closeAll(); - const window = applicationBuilder.applicationWindow.create("some-window-id"); + const window = builder.applicationWindow.create("some-window-id"); await window.start(); @@ -121,7 +119,7 @@ describe("encourage user to update when sufficient time passed since update was beforeEach(() => { advanceFakeTime(daysToMilliseconds(2)); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); describe("when checking for updates resolves with same version that was previously downloaded", () => { diff --git a/packages/core/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/update-button.tsx b/packages/core/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/update-button.tsx index 571269b74f..b8191b3258 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/update-button.tsx +++ b/packages/core/src/features/application-update/child-features/application-update-using-top-bar/renderer/update-application-top-bar-item/update-button/update-button.tsx @@ -17,7 +17,7 @@ import type { IComputedValue } from "mobx"; import restartAndInstallUpdateInjectable from "../../../../../renderer/restart-and-install-update.injectable"; import updateWarningLevelInjectable from "../update-warning-level.injectable"; -interface UpdateButtonProps extends HTMLAttributes {} +type UpdateButtonProps = HTMLAttributes; interface Dependencies { warningLevel: IComputedValue<"light" | "medium" | "high" | "">; diff --git a/packages/core/src/features/application-update/child-features/application-update-using-tray/installing-update-using-tray.test.ts b/packages/core/src/features/application-update/child-features/application-update-using-tray/installing-update-using-tray.test.ts index fca1de9757..b8b0260b34 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-tray/installing-update-using-tray.test.ts +++ b/packages/core/src/features/application-update/child-features/application-update-using-tray/installing-update-using-tray.test.ts @@ -24,10 +24,10 @@ describe("installing update using tray", () => { let downloadPlatformUpdateMock: AsyncFnMock; let showMessagePopupMock: AsyncFnMock; - beforeEach(() => { + beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); showMessagePopupMock = asyncFn(); diff --git a/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/check-for-updates-tray-item.injectable.ts b/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/check-for-updates-tray-item.injectable.ts index 3f79fa628d..42128f08c9 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/check-for-updates-tray-item.injectable.ts +++ b/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/check-for-updates-tray-item.injectable.ts @@ -66,7 +66,7 @@ const checkForUpdatesTrayItemInjectable = getInjectable({ if (updateIsReadyToBeInstalled) { await showApplicationWindow(); } else { - showMessagePopup( + await showMessagePopup( "No Updates Available", "You're all good", "You've got the latest version of Lens,\nthanks for staying on the ball.", @@ -76,12 +76,8 @@ const checkForUpdatesTrayItemInjectable = getInjectable({ ); } }, - withErrorLoggingFor(() => "[TRAY]: Checking for updates failed."), - - // TODO: Find out how to improve typing so that instead of - // x => withErrorSuppression(x) there could only be withErrorSuppression - (x) => withErrorSuppression(x), + withErrorSuppression, ), }; }, diff --git a/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/install-application-update-tray-item.injectable.ts b/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/install-application-update-tray-item.injectable.ts index 42dc973ef7..4ce5fa0ea7 100644 --- a/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/install-application-update-tray-item.injectable.ts +++ b/packages/core/src/features/application-update/child-features/application-update-using-tray/main/tray-items/install-application-update-tray-item.injectable.ts @@ -29,7 +29,7 @@ const installApplicationUpdateTrayItemInjectable = getInjectable({ label: computed(() => { const versionToBeInstalled = discoveredVersionState.value.get()?.version; - return `Install update ${versionToBeInstalled}`; + return `Install update ${versionToBeInstalled ?? ""}`; }), enabled: computed(() => true), @@ -38,12 +38,8 @@ const installApplicationUpdateTrayItemInjectable = getInjectable({ click: pipeline( quitAndInstallUpdate, - withErrorLoggingFor(() => "[TRAY]: Update installation failed."), - - // TODO: Find out how to improve typing so that instead of - // x => withErrorSuppression(x) there could only be withErrorSuppression - (x) => withErrorSuppression(x), + withErrorSuppression, ), }; }, diff --git a/packages/core/src/features/application-update/child-features/force-update/force-update.test.ts b/packages/core/src/features/application-update/child-features/force-update/force-update.test.ts index fc5c3e12a0..11edd2a098 100644 --- a/packages/core/src/features/application-update/child-features/force-update/force-update.test.ts +++ b/packages/core/src/features/application-update/child-features/force-update/force-update.test.ts @@ -24,18 +24,18 @@ const TIME_AFTER_UPDATE_MUST_BE_INSTALLED = 1000; const TIME_AFTER_INSTALL_STARTS = 5 * 1000; describe("force user to update when too long since update was downloaded", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let downloadPlatformUpdateMock: AsyncFnMock; let mainDi: DiContainer; let quitAndInstallUpdateMock: jest.Mock; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { checkForPlatformUpdatesMock = asyncFn(); mainDi.override(checkForPlatformUpdatesInjectable, () => checkForPlatformUpdatesMock); @@ -49,7 +49,7 @@ describe("force user to update when too long since update was downloaded", () => mainDi.override(quitAndInstallUpdateInjectable, () => quitAndInstallUpdateMock); }); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.unoverride(forceUpdateModalRootFrameComponentInjectable); windowDi.permitSideEffects(forceUpdateModalRootFrameComponentInjectable); @@ -57,14 +57,14 @@ describe("force user to update when too long since update was downloaded", () => windowDi.override(secondsAfterInstallStartsInjectable, () => TIME_AFTER_INSTALL_STARTS / 1000); }); - mainDi = applicationBuilder.mainDi; + mainDi = builder.mainDi; }); describe("when application is started", () => { let rendered: RenderResult; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); describe("given checking for updates and it resolves, when update was downloaded", () => { @@ -73,7 +73,7 @@ describe("force user to update when too long since update was downloaded", () => processCheckingForUpdatesInjectable, ); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); await checkForPlatformUpdatesMock.resolve({ updateWasDiscovered: true, diff --git a/packages/core/src/features/application-update/child-features/periodical-checking-of-updates/periodical-checking-of-updates.test.ts b/packages/core/src/features/application-update/child-features/periodical-checking-of-updates/periodical-checking-of-updates.test.ts index ac29f38a2a..6b47473e69 100644 --- a/packages/core/src/features/application-update/child-features/periodical-checking-of-updates/periodical-checking-of-updates.test.ts +++ b/packages/core/src/features/application-update/child-features/periodical-checking-of-updates/periodical-checking-of-updates.test.ts @@ -22,7 +22,7 @@ describe("periodical checking of updates", () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.unoverride(periodicalCheckForUpdatesInjectable); mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable); @@ -39,7 +39,7 @@ describe("periodical checking of updates", () => { let rendered: RenderResult; beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(electronUpdaterIsActiveInjectable, () => true); mainDi.override(publishIsConfiguredInjectable, () => true); }); @@ -74,7 +74,7 @@ describe("periodical checking of updates", () => { describe("given updater is enabled but no configuration exist, when started", () => { beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(electronUpdaterIsActiveInjectable, () => true); mainDi.override(publishIsConfiguredInjectable, () => false); }); @@ -95,7 +95,7 @@ describe("periodical checking of updates", () => { describe("given updater is not enabled but and configuration exist, when started", () => { beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(electronUpdaterIsActiveInjectable, () => false); mainDi.override(publishIsConfiguredInjectable, () => true); }); diff --git a/packages/core/src/features/application-update/child-features/selection-of-update-stability/selection-of-update-stability.test.ts b/packages/core/src/features/application-update/child-features/selection-of-update-stability/selection-of-update-stability.test.ts index 05785faf38..6953c48ee2 100644 --- a/packages/core/src/features/application-update/child-features/selection-of-update-stability/selection-of-update-stability.test.ts +++ b/packages/core/src/features/application-update/child-features/selection-of-update-stability/selection-of-update-stability.test.ts @@ -22,8 +22,7 @@ import setUpdateOnQuitInjectable from "../../../../main/electron-app/features/se import showInfoNotificationInjectable from "../../../../renderer/components/notifications/show-info-notification.injectable"; import processCheckingForUpdatesInjectable from "../../main/process-checking-for-updates.injectable"; import type { DiContainer } from "@ogre-tools/injectable"; -import getBuildVersionInjectable - from "../../../../main/electron-app/features/get-build-version.injectable"; +import getBuildVersionInjectable from "../../../../main/electron-app/features/get-build-version.injectable"; describe("selection of update stability", () => { let builder: ApplicationBuilder; @@ -34,10 +33,10 @@ describe("selection of update stability", () => { let showInfoNotificationMock: jest.Mock; let mainDi: DiContainer; - beforeEach(() => { + beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { quitAndInstallUpdateMock = jest.fn(); checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -64,7 +63,7 @@ describe("selection of update stability", () => { mainDi.override(publishIsConfiguredInjectable, () => true); }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { showInfoNotificationMock = jest.fn(() => () => {}); windowDi.override(showInfoNotificationInjectable, () => showInfoNotificationMock); @@ -100,7 +99,7 @@ describe("selection of update stability", () => { selectedUpdateChannel.setValue(updateChannels.alpha.id); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); it('checks updates from update channel "alpha"', () => { @@ -194,7 +193,7 @@ describe("selection of update stability", () => { describe("when checking for updates", () => { beforeEach(() => { - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); describe('when update from "beta" channel is discovered', () => { @@ -240,7 +239,7 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); }); @@ -254,13 +253,13 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.latest, expect.any(Object)); }); it('given no update channel selection is stored and currently using stable release, when user checks for updates, checks for updates from "latest" update channel by default', async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getBuildVersionInjectable, () => () => "1.0.0"); }); @@ -268,7 +267,7 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith( updateChannels.latest, @@ -277,7 +276,7 @@ describe("selection of update stability", () => { }); it('given no update channel selection is stored and currently using alpha release, when checking for updates, checks for updates from "alpha" channel', async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getBuildVersionInjectable, () => () => "1.0.0-alpha"); }); @@ -285,13 +284,13 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.alpha, expect.any(Object)); }); it('given no update channel selection is stored and currently using beta release, when checking for updates, checks for updates from "beta" channel', async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getBuildVersionInjectable, () => () => "1.0.0-beta"); }); @@ -299,7 +298,7 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); }); @@ -313,7 +312,7 @@ describe("selection of update stability", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); }); diff --git a/packages/core/src/features/application-update/common/discovered-update-version.injectable.ts b/packages/core/src/features/application-update/common/discovered-update-version.injectable.ts index af55db617c..c29535dbd7 100644 --- a/packages/core/src/features/application-update/common/discovered-update-version.injectable.ts +++ b/packages/core/src/features/application-update/common/discovered-update-version.injectable.ts @@ -2,27 +2,11 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import createSyncBoxInjectable from "../../../common/utils/sync-box/create-sync-box.injectable"; import type { UpdateChannel } from "./update-channels"; -import type { SyncBox } from "../../../common/utils/sync-box/sync-box-injection-token"; -import { syncBoxInjectionToken } from "../../../common/utils/sync-box/sync-box-injection-token"; +import { getSyncBoxInjectable } from "../../../common/utils/sync-box/sync-box-injection-token"; -export type DiscoveredUpdateVersion = SyncBox<{ version: string; updateChannel: UpdateChannel } | null>; +export type DiscoveredUpdateVersion = { version: string; updateChannel: UpdateChannel } | null; -const discoveredUpdateVersionInjectable = getInjectable({ - id: "discovered-update-version", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox( - "discovered-update-version", - null, - ) as DiscoveredUpdateVersion; - }, - - injectionToken: syncBoxInjectionToken, -}); +const discoveredUpdateVersionInjectable = getSyncBoxInjectable("discovered-update-version", null as DiscoveredUpdateVersion); export default discoveredUpdateVersionInjectable; diff --git a/packages/core/src/features/application-update/common/progress-of-update-download.injectable.ts b/packages/core/src/features/application-update/common/progress-of-update-download.injectable.ts index f87fde506b..a91123eeb1 100644 --- a/packages/core/src/features/application-update/common/progress-of-update-download.injectable.ts +++ b/packages/core/src/features/application-update/common/progress-of-update-download.injectable.ts @@ -2,10 +2,8 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import createSyncBoxInjectable from "../../../common/utils/sync-box/create-sync-box.injectable"; import type { SyncBox } from "../../../common/utils/sync-box/sync-box-injection-token"; -import { syncBoxInjectionToken } from "../../../common/utils/sync-box/sync-box-injection-token"; +import { getSyncBoxInjectable } from "../../../common/utils/sync-box/sync-box-injection-token"; export interface ProgressOfDownload { percentage: number; @@ -14,16 +12,6 @@ export interface ProgressOfDownload { export type ProgressOfUpdateDownload = SyncBox; -const progressOfUpdateDownloadInjectable = getInjectable({ - id: "progress-of-update-download-state", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox("progress-of-update-download", { percentage: 0 }); - }, - - injectionToken: syncBoxInjectionToken, -}); +const progressOfUpdateDownloadInjectable = getSyncBoxInjectable("progress-of-update-download", { percentage: 0 }); export default progressOfUpdateDownloadInjectable; diff --git a/packages/core/src/features/application-update/common/update-downloaded-date-time.injectable.ts b/packages/core/src/features/application-update/common/update-downloaded-date-time.injectable.ts index 391e3c5c25..9394b1274a 100644 --- a/packages/core/src/features/application-update/common/update-downloaded-date-time.injectable.ts +++ b/packages/core/src/features/application-update/common/update-downloaded-date-time.injectable.ts @@ -2,23 +2,8 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import createSyncBoxInjectable from "../../../common/utils/sync-box/create-sync-box.injectable"; -import { syncBoxInjectionToken } from "../../../common/utils/sync-box/sync-box-injection-token"; +import { getSyncBoxInjectable } from "../../../common/utils/sync-box/sync-box-injection-token"; -const updateDownloadedDateTimeInjectable = getInjectable({ - id: "update-downloaded-date-time", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox( - "update-downloaded-date-time", - null, - ); - }, - - injectionToken: syncBoxInjectionToken, -}); +const updateDownloadedDateTimeInjectable = getSyncBoxInjectable("update-downloaded-date-time", null); export default updateDownloadedDateTimeInjectable; diff --git a/packages/core/src/features/application-update/common/update-is-being-downloaded.injectable.ts b/packages/core/src/features/application-update/common/update-is-being-downloaded.injectable.ts index f3bc8351fd..bf5c7ac769 100644 --- a/packages/core/src/features/application-update/common/update-is-being-downloaded.injectable.ts +++ b/packages/core/src/features/application-update/common/update-is-being-downloaded.injectable.ts @@ -2,23 +2,11 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import createSyncBoxInjectable from "../../../common/utils/sync-box/create-sync-box.injectable"; import type { SyncBox } from "../../../common/utils/sync-box/sync-box-injection-token"; -import { syncBoxInjectionToken } from "../../../common/utils/sync-box/sync-box-injection-token"; +import { getSyncBoxInjectable } from "../../../common/utils/sync-box/sync-box-injection-token"; export type UpdateIsBeingDownloaded = SyncBox; -const updateIsBeingDownloadedInjectable = getInjectable({ - id: "update-is-being-downloaded", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox("update-is-being-downloaded", false); - }, - - injectionToken: syncBoxInjectionToken, -}); +const updateIsBeingDownloadedInjectable = getSyncBoxInjectable("update-is-being-downloaded", false); export default updateIsBeingDownloadedInjectable; diff --git a/packages/core/src/features/application-update/common/updates-are-being-discovered.injectable.ts b/packages/core/src/features/application-update/common/updates-are-being-discovered.injectable.ts index 7ac4de3a03..ccb46b0256 100644 --- a/packages/core/src/features/application-update/common/updates-are-being-discovered.injectable.ts +++ b/packages/core/src/features/application-update/common/updates-are-being-discovered.injectable.ts @@ -2,23 +2,11 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import createSyncBoxInjectable from "../../../common/utils/sync-box/create-sync-box.injectable"; import type { SyncBox } from "../../../common/utils/sync-box/sync-box-injection-token"; -import { syncBoxInjectionToken } from "../../../common/utils/sync-box/sync-box-injection-token"; +import { getSyncBoxInjectable } from "../../../common/utils/sync-box/sync-box-injection-token"; export type UpdatesAreBeingDiscovered = SyncBox; -const updatesAreBeingDiscoveredInjectable = getInjectable({ - id: "updates-are-being-discovered", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox("updates-are-being-discovered", false); - }, - - injectionToken: syncBoxInjectionToken, -}); +const updatesAreBeingDiscoveredInjectable = getSyncBoxInjectable("updates-are-being-discovered", false); export default updatesAreBeingDiscoveredInjectable; diff --git a/packages/core/src/features/application-update/downgrading-version-update.test.ts b/packages/core/src/features/application-update/downgrading-version-update.test.ts index 0781484645..c70518d1ab 100644 --- a/packages/core/src/features/application-update/downgrading-version-update.test.ts +++ b/packages/core/src/features/application-update/downgrading-version-update.test.ts @@ -17,14 +17,14 @@ import { updateChannels } from "./common/update-channels"; import getBuildVersionInjectable from "../../main/electron-app/features/get-build-version.injectable"; describe("downgrading version update", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let checkForPlatformUpdatesMock: AsyncFnMock; let mainDi: DiContainer; - beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + beforeEach(async () => { + builder = getApplicationBuilder(); - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { checkForPlatformUpdatesMock = asyncFn(); mainDi.override( @@ -36,7 +36,7 @@ describe("downgrading version update", () => { mainDi.override(publishIsConfiguredInjectable, () => true); }); - mainDi = applicationBuilder.mainDi; + mainDi = builder.mainDi; }); [ @@ -104,7 +104,7 @@ describe("downgrading version update", () => { it(`given application version "${appVersion}" and update channel "${updateChannel.id}", when checking for updates, can${downgradeIsAllowed ? "": "not"} downgrade`, async () => { mainDi.override(getBuildVersionInjectable, () => () => appVersion); - await applicationBuilder.render(); + await builder.render(); const selectedUpdateChannel = mainDi.inject(selectedUpdateChannelInjectable); @@ -112,7 +112,7 @@ describe("downgrading version update", () => { const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(expect.any(Object), { allowDowngrade: downgradeIsAllowed }); }); diff --git a/packages/core/src/features/application-update/installing-update.test.ts b/packages/core/src/features/application-update/installing-update.test.ts index 7f1d20ed10..8f8c14d45a 100644 --- a/packages/core/src/features/application-update/installing-update.test.ts +++ b/packages/core/src/features/application-update/installing-update.test.ts @@ -27,12 +27,12 @@ describe("installing update", () => { let downloadPlatformUpdateMock: AsyncFnMock; let setUpdateOnQuitMock: jest.Mock; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { electronQuitAndInstallUpdateMock = jest.fn(); checkForPlatformUpdatesMock = asyncFn(); downloadPlatformUpdateMock = asyncFn(); @@ -91,7 +91,7 @@ describe("installing update", () => { describe("when user checks for updates", () => { beforeEach(() => { - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); it("checks for updates", () => { @@ -204,7 +204,7 @@ describe("installing update", () => { beforeEach(() => { downloadPlatformUpdateMock.mockClear(); - processCheckingForUpdates("irrelevant"); + void processCheckingForUpdates("irrelevant"); }); it("shows tray icon for checking for updates", () => { diff --git a/packages/core/src/features/application-update/main/check-for-updates/check-for-platform-updates/check-for-platform-updates.test.ts b/packages/core/src/features/application-update/main/check-for-updates/check-for-platform-updates/check-for-platform-updates.test.ts index 99024ae62a..626011928f 100644 --- a/packages/core/src/features/application-update/main/check-for-updates/check-for-platform-updates/check-for-platform-updates.test.ts +++ b/packages/core/src/features/application-update/main/check-for-updates/check-for-platform-updates/check-for-platform-updates.test.ts @@ -51,7 +51,7 @@ describe("check-for-platform-updates", () => { }); describe("when called", () => { - let actualPromise: Promise; + let actualPromise: Promise; beforeEach(() => { const testUpdateChannel: UpdateChannel = { @@ -119,7 +119,7 @@ describe("check-for-platform-updates", () => { beforeEach(() => { errorStub = new Error("Some error"); - checkForUpdatesMock.reject(errorStub); + void checkForUpdatesMock.reject(errorStub); }); it("logs errors", () => { diff --git a/packages/core/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts b/packages/core/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts index 0658ed9269..e3cd79eecd 100644 --- a/packages/core/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts +++ b/packages/core/src/features/application-update/main/download-update/download-platform-update/download-platform-update.test.ts @@ -84,10 +84,12 @@ describe("download-platform-update", () => { beforeEach(() => { onDownloadProgressMock.mockClear(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const [, callback] = electronUpdaterOnMock.mock.calls.find( ([event]) => event === "download-progress", ); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call callback({ percent: 42, total: 0, @@ -126,7 +128,7 @@ describe("download-platform-update", () => { }); it("when starting download again, resets progress of download", () => { - downloadPlatformUpdate(onDownloadProgressMock); + void downloadPlatformUpdate(onDownloadProgressMock); expect(onDownloadProgressMock).toHaveBeenCalledWith({ percentage: 0 }); }); @@ -138,7 +140,7 @@ describe("download-platform-update", () => { beforeEach(() => { errorStub = new Error("Some error"); - downloadUpdateMock.reject(errorStub); + void downloadUpdateMock.reject(errorStub); }); it("logs error", () => { diff --git a/packages/core/src/features/catalog/custom-columns.test.tsx b/packages/core/src/features/catalog/custom-columns.test.tsx index 19c2bf83dc..92bead9448 100644 --- a/packages/core/src/features/catalog/custom-columns.test.tsx +++ b/packages/core/src/features/catalog/custom-columns.test.tsx @@ -68,7 +68,7 @@ describe("custom category columns for catalog", () => { }); describe("when the Test category tab is clicked", () => { - beforeEach(async () => { + beforeEach(() => { const testCategory = renderResult.getByTestId("foo.bar.bat/Test-tab"); testCategory.click(); @@ -100,8 +100,8 @@ describe("custom category columns for catalog", () => { }); describe("when an extension is registered with additional custom columns", () => { - beforeEach(() => { - builder.extensions.enable({ + beforeEach(async () => { + await builder.extensions.enable({ id: "some-id", name: "some-name", rendererOptions: { @@ -132,7 +132,7 @@ describe("custom category columns for catalog", () => { }); describe("when the Test category tab is clicked", () => { - beforeEach(async () => { + beforeEach(() => { const testCategory = renderResult.getByTestId("foo.bar.bat/Test-tab"); testCategory.click(); @@ -200,7 +200,7 @@ describe("custom category columns for catalog", () => { }); describe("when the Test category tab is clicked", () => { - beforeEach(async () => { + beforeEach(() => { const testCategory = renderResult.getByTestId("foo.bar.bat/Test-tab"); testCategory.click(); @@ -256,7 +256,7 @@ describe("custom category columns for catalog", () => { }); describe("when the Test category tab is clicked", () => { - beforeEach(async () => { + beforeEach(() => { const testCategory = renderResult.getByTestId("foo.bar.bat/Test-tab"); testCategory.click(); diff --git a/packages/core/src/features/catalog/entity-running.test.tsx b/packages/core/src/features/catalog/entity-running.test.tsx index ee1b915202..fc53289cc0 100644 --- a/packages/core/src/features/catalog/entity-running.test.tsx +++ b/packages/core/src/features/catalog/entity-running.test.tsx @@ -8,7 +8,7 @@ import type { DiContainer } from "@ogre-tools/injectable"; import type { RenderResult } from "@testing-library/react"; import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable"; import type { AppEvent } from "../../common/app-event-bus/event-bus"; -import type { CatalogEntityActionContext } from "../../common/catalog"; +import type { CatalogEntityActionContext, CatalogEntityConstructor, CatalogEntityDataFor } from "../../common/catalog"; import { CatalogCategory, categoryVersion, CatalogEntity } from "../../common/catalog"; import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable"; import navigateToCatalogInjectable from "../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable"; @@ -18,6 +18,7 @@ import type { CatalogEntityOnBeforeRun, CatalogEntityRegistry } from "../../rend import catalogEntityRegistryInjectable from "../../renderer/api/catalog/entity/registry.injectable"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import type { CatalogRunEvent } from "../../common/catalog/catalog-run-event"; class MockCatalogCategory extends CatalogCategory { apiVersion = "catalog.k8slens.dev/v1alpha1"; @@ -33,13 +34,13 @@ class MockCatalogCategory extends CatalogCategory { // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; - return function (data: any) { + return (function (data: CatalogEntityDataFor) { const entity = new MockCatalogEntity(data); entity.onRun = self.onRun; return entity; - } as any; + }) as unknown as CatalogEntityConstructor; })()), ], names: { @@ -84,12 +85,12 @@ describe("entity running technical tests", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { onRun = jest.fn(); - const catalogCategoryRegistery = windowDi.inject(catalogCategoryRegistryInjectable); + const catalogCategoryRegistry = windowDi.inject(catalogCategoryRegistryInjectable); - catalogCategoryRegistery.add(new MockCatalogCategory(onRun)); + catalogCategoryRegistry.add(new MockCatalogCategory(onRun)); catalogEntityRegistry = windowDi.inject(catalogEntityRegistryInjectable); @@ -160,7 +161,7 @@ describe("entity running technical tests", () => { }); it("onBeforeRun prevents event => onRun wont be triggered", async () => { - const onBeforeRunMock = jest.fn((event) => event.preventDefault()); + const onBeforeRunMock = jest.fn((event: CatalogRunEvent) => event.preventDefault()); catalogEntityRegistry.addOnBeforeRun(onBeforeRunMock); @@ -184,7 +185,7 @@ describe("entity running technical tests", () => { }); it("addOnRunHook return a promise and does not prevent run event => onRun()", (done) => { - onRun.mockImplementation(() => done()); + onRun.mockImplementation(() => void done()); catalogEntityRegistry.addOnBeforeRun(async () => {}); @@ -192,10 +193,13 @@ describe("entity running technical tests", () => { }); it("addOnRunHook return a promise and prevents event wont be triggered", async () => { - catalogEntityRegistry.addOnBeforeRun(async (event) => event.preventDefault()); + const mock = asyncFn(); + catalogEntityRegistry.addOnBeforeRun(mock); rendered.getByTestId("detail-panel-hot-bar-icon").click(); + mock.mockImplementation((event) => event.preventDefault()); + await mock.resolve(); expect(onRun).not.toHaveBeenCalled(); }); diff --git a/packages/core/src/features/catalog/opening-entity-details.test.tsx b/packages/core/src/features/catalog/opening-entity-details.test.tsx index 40afd39d77..a6272af730 100644 --- a/packages/core/src/features/catalog/opening-entity-details.test.tsx +++ b/packages/core/src/features/catalog/opening-entity-details.test.tsx @@ -25,7 +25,7 @@ describe("opening catalog entity details panel", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.afterWindowStart(async ({ windowDi }) => { + await builder.afterWindowStart(async ({ windowDi }) => { clusterEntity = new KubernetesCluster({ metadata: { labels: {}, @@ -116,7 +116,7 @@ describe("opening catalog entity details panel", () => { }); describe("when navigated to the catalog", () => { - beforeEach(async () => { + beforeEach(() => { const navigateToCatalog = windowDi.inject(navigateToCatalogInjectable); navigateToCatalog(); @@ -234,14 +234,14 @@ describe("opening catalog entity details panel", () => { }); describe("when not navigated to the catalog and showEntityDetails is called from someplace", () => { - beforeEach(async () => { + beforeEach(() => { const showEntityDetails = windowDi.inject(showEntityDetailsInjectable); showEntityDetails("some-weblink-id"); advanceFakeTime(1000); }); - it("renders", async () => { + it("renders", () => { expect(rendered.baseElement).toMatchSnapshot(); }); diff --git a/packages/core/src/features/certificate-authorities/common/request-system-cas-token.ts b/packages/core/src/features/certificate-authorities/common/request-system-cas-token.ts index 5c5f17ff64..ee151a37a0 100644 --- a/packages/core/src/features/certificate-authorities/common/request-system-cas-token.ts +++ b/packages/core/src/features/certificate-authorities/common/request-system-cas-token.ts @@ -6,7 +6,7 @@ import { getInjectionToken } from "@ogre-tools/injectable"; import type { PlatformSpecific } from "../../../common/utils/platform-specific-version.injectable"; -export type RequestSystemCAs = () => Promise; +export type RequestSystemCAs = () => string[] | Promise; export const platformSpecificRequestSystemCAsInjectionToken = getInjectionToken>({ id: "platform-specific-request-system-cas-token", diff --git a/packages/core/src/features/certificate-authorities/main/darwin-request-system-cas.injectable.ts b/packages/core/src/features/certificate-authorities/main/darwin-request-system-cas.injectable.ts index 0fc75bd949..26b3120260 100644 --- a/packages/core/src/features/certificate-authorities/main/darwin-request-system-cas.injectable.ts +++ b/packages/core/src/features/certificate-authorities/main/darwin-request-system-cas.injectable.ts @@ -19,19 +19,19 @@ const darwinRequestSystemCAsInjectable = getInjectable({ const execFile = di.inject(execFileInjectable); const logger = di.inject(loggerInjectionToken); - const execSecurity = async (...args: string[]): AsyncResult => { + const execSecurity = async (...args: string[]): AsyncResult => { const result = await execFile("/usr/bin/security", args); - if (!result.callWasSuccessful) { + if (!result.isOk) { return { - callWasSuccessful: false, + isOk: false, error: result.error.stderr || result.error.message, }; } return { - callWasSuccessful: true, - response: result.response.split(certSplitPattern), + isOk: true, + value: result.value.split(certSplitPattern), }; }; @@ -41,12 +41,12 @@ const darwinRequestSystemCAsInjectable = getInjectable({ execSecurity("find-certificate", "-a", "-p", "/System/Library/Keychains/SystemRootCertificates.keychain"), ]); - if (!trustedResult.callWasSuccessful) { + if (!trustedResult.isOk) { logger.warn(`[INJECT-CAS]: Error retrieving trusted CAs: ${trustedResult.error}`); - } else if (!rootCAResult.callWasSuccessful) { + } else if (!rootCAResult.isOk) { logger.warn(`[INJECT-CAS]: Error retrieving root CAs: ${rootCAResult.error}`); } else { - return [...new Set([...trustedResult.response, ...rootCAResult.response])]; + return [...new Set([...trustedResult.value, ...rootCAResult.value])]; } return []; diff --git a/packages/core/src/features/certificate-authorities/main/linux-request-system-cas.injectable.ts b/packages/core/src/features/certificate-authorities/main/linux-request-system-cas.injectable.ts index 520830fdf8..3b5ce0765a 100644 --- a/packages/core/src/features/certificate-authorities/main/linux-request-system-cas.injectable.ts +++ b/packages/core/src/features/certificate-authorities/main/linux-request-system-cas.injectable.ts @@ -9,7 +9,7 @@ const linuxRequestSystemCAsInjectable = getInjectable({ id: "linux-request-system-cas", instantiate: () => ({ platform: "linux" as const, - instantiate: () => async () => [], + instantiate: () => () => [], }), injectionToken: platformSpecificRequestSystemCAsInjectionToken, }); diff --git a/packages/core/src/features/certificate-authorities/main/request-system-cas.global-override-for-injectable.ts b/packages/core/src/features/certificate-authorities/main/request-system-cas.global-override-for-injectable.ts index 670f150b81..c293ce0d7e 100644 --- a/packages/core/src/features/certificate-authorities/main/request-system-cas.global-override-for-injectable.ts +++ b/packages/core/src/features/certificate-authorities/main/request-system-cas.global-override-for-injectable.ts @@ -6,4 +6,4 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import requestSystemCAsInjectable from "./request-system-cas.injectable"; -export default getGlobalOverride(requestSystemCAsInjectable, () => async () => []); +export default getGlobalOverride(requestSystemCAsInjectable, () => () => []); diff --git a/packages/core/src/features/certificate-authorities/main/request-system-cas.injectable.ts b/packages/core/src/features/certificate-authorities/main/request-system-cas.injectable.ts index f17f538529..52ccbf5a1b 100644 --- a/packages/core/src/features/certificate-authorities/main/request-system-cas.injectable.ts +++ b/packages/core/src/features/certificate-authorities/main/request-system-cas.injectable.ts @@ -12,7 +12,7 @@ const requestSystemCAsInjectable = getInjectable({ const platformSpecificVersion = di.inject(platformSpecificVersionInjectable); const platformSpecificRequestSystemCAs = platformSpecificVersion(platformSpecificRequestSystemCAsInjectionToken); - return platformSpecificRequestSystemCAs ?? (async () => []); + return platformSpecificRequestSystemCAs ?? (() => []); }, injectionToken: requestSystemCAsInjectionToken, }); diff --git a/packages/core/src/features/certificate-authorities/main/win32-request-system-cas.injectable.ts b/packages/core/src/features/certificate-authorities/main/win32-request-system-cas.injectable.ts index e8fde56fd9..f8ef521e41 100644 --- a/packages/core/src/features/certificate-authorities/main/win32-request-system-cas.injectable.ts +++ b/packages/core/src/features/certificate-authorities/main/win32-request-system-cas.injectable.ts @@ -7,7 +7,7 @@ import execFileInjectable from "../../../common/fs/exec-file.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import { platformSpecificRequestSystemCAsInjectionToken } from "../common/request-system-cas-token"; -const pemEncoding = (hexEncodedCert: String) => { +const pemEncoding = (hexEncodedCert: string) => { const certData = Buffer.from(hexEncodedCert, "hex").toString("base64"); const lines = ["-----BEGIN CERTIFICATE-----"]; @@ -20,6 +20,13 @@ const pemEncoding = (hexEncodedCert: String) => { return lines.join("\r\n"); }; + +interface NonWebpackRequire { + resolve(name: string): string; +} + +declare const __non_webpack_require__: NonWebpackRequire; + const win32RequestSystemCAsInjectable = getInjectable({ id: "win32-request-system-cas", instantiate: (di) => ({ @@ -38,14 +45,14 @@ const win32RequestSystemCAsInjectable = getInjectable({ maxBuffer: 128 * 1024 * 1024, // 128 MiB }); - if (!result.callWasSuccessful) { + if (!result.isOk) { logger.warn(`[INJECT-CAS]: Error retrieving CAs`, result.error); return []; } return result - .response + .value .split("\r\n") .filter(Boolean) .map(pemEncoding); diff --git a/packages/core/src/features/cluster/activation/main/request-deactivation.injectable.ts b/packages/core/src/features/cluster/activation/main/request-deactivation.injectable.ts index 45585419dc..c03360ff3d 100644 --- a/packages/core/src/features/cluster/activation/main/request-deactivation.injectable.ts +++ b/packages/core/src/features/cluster/activation/main/request-deactivation.injectable.ts @@ -29,6 +29,8 @@ const requestClusterDeactivationInjectable = getInjectable({ connection.disconnect(); clusterFrames.delete(clusterId); + + return Promise.resolve(); }; }, injectionToken: requestClusterDeactivationInjectionToken, diff --git a/packages/core/src/features/cluster/connections/main/api-url.injectable.ts b/packages/core/src/features/cluster/connections/main/api-url.injectable.ts index 5cb0b761ec..eda9dfa11d 100644 --- a/packages/core/src/features/cluster/connections/main/api-url.injectable.ts +++ b/packages/core/src/features/cluster/connections/main/api-url.injectable.ts @@ -27,12 +27,12 @@ const clusterApiUrlInjectable = getInjectable({ if (!state || state.lastReadMtimeMs >= stats.mtimeMs) { const result = await loadValidatedClusterConfig(cluster); - if (result.error) { + if (result.isOk === false) { throw result.error; } state = { - url: new URL(result.cluster.server), + url: new URL(result.value.cluster.server), lastReadMtimeMs: stats.mtimeMs, }; } diff --git a/packages/core/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx b/packages/core/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx index 1ffad5df97..3f7e8be991 100644 --- a/packages/core/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx +++ b/packages/core/src/features/cluster/delete-dialog/delete-cluster-dialog.test.tsx @@ -76,17 +76,17 @@ describe("Deleting a cluster", () => { config = new KubeConfig(); builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(kubectlBinaryNameInjectable, () => "kubectl"); mainDi.override(kubectlDownloadingNormalizedArchInjectable, () => "amd64"); mainDi.override(normalizedPlatformInjectable, () => "darwin"); }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { openDeleteClusterDialog = windowDi.inject(openDeleteClusterDialogInjectable); }); - builder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { const navigateToCatalog = windowDi.inject(navigateToCatalogInjectable); navigateToCatalog(); @@ -102,7 +102,7 @@ describe("Deleting a cluster", () => { beforeEach(() => { config.loadFromString(multiClusterConfig); - currentCluster = new Cluster({ + currentCluster = Cluster.createForTestingOnly({ id: "some-current-context-cluster", contextName: "some-current-context", preferences: { @@ -110,7 +110,7 @@ describe("Deleting a cluster", () => { }, kubeConfigPath: "./temp-kube-config", }); - nonCurrentCluster = new Cluster({ + nonCurrentCluster = Cluster.createForTestingOnly({ id: "some-non-current-context-cluster", contextName: "some-non-current-context", preferences: { @@ -186,7 +186,7 @@ describe("Deleting a cluster", () => { const directoryForKubeConfigs = builder.applicationWindow.only.di.inject(directoryForKubeConfigsInjectable); const joinPaths = builder.applicationWindow.only.di.inject(joinPathsInjectable); - currentCluster = new Cluster({ + currentCluster = Cluster.createForTestingOnly({ id: "some-cluster", contextName: "some-context", preferences: { @@ -220,7 +220,7 @@ describe("Deleting a cluster", () => { beforeEach(() => { config.loadFromString(singleClusterConfig); - currentCluster = new Cluster({ + currentCluster = Cluster.createForTestingOnly({ id: "some-cluster", contextName: "some-context", preferences: { diff --git a/packages/core/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx index fcd5044639..c8f989e69a 100644 --- a/packages/core/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/extension-api/disable-cluster-pages-when-cluster-is-not-relevant.test.tsx @@ -20,7 +20,7 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); isEnabledForClusterMock = asyncFn(); @@ -41,7 +41,7 @@ describe("disable-cluster-pages-when-cluster-is-not-relevant", () => { rendered = await builder.render(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); rendererTestExtension = builder.extensions.get("test-extension-id").applicationWindows.only; diff --git a/packages/core/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx index c4cc105a40..9df97a56ab 100644 --- a/packages/core/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/extension-api/disable-sidebar-items-when-cluster-is-not-relevant.test.tsx @@ -19,7 +19,7 @@ describe("disable sidebar items when cluster is not relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); isEnabledForClusterMock = asyncFn(); @@ -51,7 +51,7 @@ describe("disable sidebar items when cluster is not relevant", () => { rendered = await builder.render(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given not yet known if extension should be enabled for the cluster", () => { diff --git a/packages/core/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx b/packages/core/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx index 57dc83d810..9f2b26fad1 100644 --- a/packages/core/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx +++ b/packages/core/src/features/cluster/extension-api/reactively-disable-cluster-pages.test.tsx @@ -19,7 +19,7 @@ describe("reactively disable cluster pages", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); someObservable = observable.box(false); @@ -40,7 +40,7 @@ describe("reactively disable cluster pages", () => { rendered = await builder.render(); - builder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); testExtensionInstance = builder.extensions.get("test-extension-id").applicationWindows.only; diff --git a/packages/core/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx index de1df7e5af..7cb40c6e4f 100644 --- a/packages/core/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/kube-object-details/extension-api/disable-kube-object-detail-items-when-cluster-is-not-relevant.test.tsx @@ -6,7 +6,8 @@ import type { RenderResult } from "@testing-library/react"; import type { ApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../../renderer/components/test-utils/get-application-builder"; import React from "react"; -import { KubeObject } from "@k8slens/kube-object"; +import type { KubeObject } from "@k8slens/kube-object"; +import { createKubeObject } from "@k8slens/kube-object"; import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable"; import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store"; import type { KubeApi } from "@k8slens/kube-api"; @@ -21,9 +22,9 @@ describe("disable kube object detail items when cluster is not relevant", () => beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { const apiManager = windowDi.inject(apiManagerInjectable); const api = { apiBase: "/api/some-api-version/some-kind", @@ -68,7 +69,7 @@ describe("disable kube object detail items when cluster is not relevant", () => showDetails("/api/some-api-version/namespaces/some-namespace/some-kind/some-name"); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given not yet known if extension should be enabled for the cluster", () => { @@ -117,7 +118,7 @@ describe("disable kube object detail items when cluster is not relevant", () => }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx b/packages/core/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx index bdeac274f1..684b76518e 100644 --- a/packages/core/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx +++ b/packages/core/src/features/cluster/kube-object-details/extension-api/reactively-hide-kube-object-detail-item.test.tsx @@ -8,7 +8,8 @@ import { getApplicationBuilder } from "../../../../renderer/components/test-util import type { IObservableValue } from "mobx"; import { runInAction, computed, observable } from "mobx"; import React from "react"; -import { KubeObject } from "@k8slens/kube-object"; +import type { KubeObject } from "@k8slens/kube-object"; +import { createKubeObject } from "@k8slens/kube-object"; import apiManagerInjectable from "../../../../common/k8s-api/api-manager/manager.injectable"; import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store"; import type { KubeApi } from "@k8slens/kube-api"; @@ -24,9 +25,9 @@ describe("reactively hide kube object detail item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { const apiManager = windowDi.inject(apiManagerInjectable); const api = { apiBase: "/api/some-api-version/some-kind", @@ -75,7 +76,7 @@ describe("reactively hide kube object detail item", () => { showDetails("/api/some-api-version/namespaces/some-namespace/some-kind/some-name"); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("renders", () => { @@ -112,7 +113,7 @@ describe("reactively hide kube object detail item", () => { }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx index 6763d589ca..c5e4de7e35 100644 --- a/packages/core/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/kube-object-menu/extension-api/disable-kube-object-menu-items-when-cluster-is-not-relevant.test.tsx @@ -14,8 +14,8 @@ import { computed, runInAction } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; -import { KubeObject } from "@k8slens/kube-object"; import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu"; +import { createKubeObject } from "@k8slens/kube-object"; describe("disable kube object menu items when cluster is not relevant", () => { let builder: ApplicationBuilder; @@ -27,9 +27,9 @@ describe("disable kube object menu items when cluster is not relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); @@ -67,7 +67,7 @@ describe("disable kube object menu items when cluster is not relevant", () => { navigateToRoute(testRoute); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given not yet known if extension should be enabled for the cluster", () => { @@ -145,7 +145,7 @@ const testRouteComponentInjectable = getInjectable({ }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx b/packages/core/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx index 68d2a27e87..f88ca0e249 100644 --- a/packages/core/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx +++ b/packages/core/src/features/cluster/kube-object-menu/extension-api/reactively-hide-kube-object-menu-item.test.tsx @@ -12,8 +12,8 @@ import { observable, runInAction, computed } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; -import { KubeObject } from "@k8slens/kube-object"; import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu"; +import { createKubeObject } from "@k8slens/kube-object"; describe("reactively hide kube object menu item", () => { let builder: ApplicationBuilder; @@ -23,9 +23,9 @@ describe("reactively hide kube object menu item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); @@ -63,7 +63,7 @@ describe("reactively hide kube object menu item", () => { navigateToRoute(testRoute); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("does not show the kube object menu item", () => { @@ -113,7 +113,7 @@ const testRouteComponentInjectable = getInjectable({ }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx index d109ffef93..6d1ee34235 100644 --- a/packages/core/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/kube-object-status-icon/extension-api/disable-kube-object-statuses-when-cluster-is-not-relevant.test.tsx @@ -15,8 +15,8 @@ import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; import { KubeObjectStatusIcon } from "../../../../renderer/components/kube-object-status-icon/kube-object-status-icon"; -import { KubeObject } from "@k8slens/kube-object"; import { KubeObjectStatusLevel } from "../../../../common/k8s-api/kube-object-status"; +import { createKubeObject } from "@k8slens/kube-object"; describe("disable kube object statuses when cluster is not relevant", () => { let builder: ApplicationBuilder; @@ -28,9 +28,9 @@ describe("disable kube object statuses when cluster is not relevant", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); @@ -68,7 +68,7 @@ describe("disable kube object statuses when cluster is not relevant", () => { navigateToRoute(testRoute); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given not yet known if extension should be enabled for the cluster", () => { @@ -145,7 +145,7 @@ const testRouteComponentInjectable = getInjectable({ }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx b/packages/core/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx index eca417fca5..82ee3d4407 100644 --- a/packages/core/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx +++ b/packages/core/src/features/cluster/kube-object-status-icon/extension-api/reactively-hide-kube-object-status.test.tsx @@ -12,9 +12,9 @@ import { observable, runInAction, computed } from "mobx"; import React from "react"; import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token"; import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token"; -import { KubeObject } from "@k8slens/kube-object"; import { KubeObjectStatusLevel } from "../../../../common/k8s-api/kube-object-status"; import { KubeObjectStatusIcon } from "../../../../renderer/components/kube-object-status-icon"; +import { createKubeObject } from "@k8slens/kube-object"; describe("reactively hide kube object status", () => { let builder: ApplicationBuilder; @@ -24,9 +24,9 @@ describe("reactively hide kube object status", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteInjectable, testRouteComponentInjectable); }); @@ -64,7 +64,7 @@ describe("reactively hide kube object status", () => { navigateToRoute(testRoute); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("does not show the kube object status", () => { @@ -117,7 +117,7 @@ const testRouteComponentInjectable = getInjectable({ }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx b/packages/core/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx index 8a730933e4..9d9d9b51eb 100644 --- a/packages/core/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx +++ b/packages/core/src/features/cluster/kube-object-status-icon/show-status-for-a-kube-object.test.tsx @@ -3,7 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { KubeObjectStatusLevel } from "../../../common/k8s-api/kube-object-status"; -import { KubeObject } from "@k8slens/kube-object"; import React from "react"; import type { DiContainer } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; @@ -20,6 +19,7 @@ import { observer } from "mobx-react"; import { kubeObjectStatusTextInjectionToken } from "../../../renderer/components/kube-object-status-icon/kube-object-status-text-injection-token"; import { KubeObjectStatusIcon } from "../../../renderer/components/kube-object-status-icon"; import { testUsingFakeTime } from "../../../test-utils/use-fake-time"; +import { createKubeObject } from "@k8slens/kube-object"; describe("show status for a kube object", () => { let builder: ApplicationBuilder; @@ -27,7 +27,7 @@ describe("show status for a kube object", () => { let warningStatusIsShown: boolean; let criticalStatusIsShown: boolean; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); builder = getApplicationBuilder(); @@ -93,7 +93,7 @@ describe("show status for a kube object", () => { }), }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register( testRouteInjectable, @@ -107,7 +107,7 @@ describe("show status for a kube object", () => { }); }); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); }); describe("given application starts and in test page", () => { @@ -311,7 +311,7 @@ const someAtomInjectable = getInjectable({ }); const getKubeObjectStub = (kind: string, apiVersion: string) => - KubeObject.create({ + createKubeObject({ apiVersion, kind, metadata: { diff --git a/packages/core/src/features/cluster/legacy-extension-adding-cluster-frame-components.test.tsx b/packages/core/src/features/cluster/legacy-extension-adding-cluster-frame-components.test.tsx index f837550f7a..9d52192e33 100644 --- a/packages/core/src/features/cluster/legacy-extension-adding-cluster-frame-components.test.tsx +++ b/packages/core/src/features/cluster/legacy-extension-adding-cluster-frame-components.test.tsx @@ -16,7 +16,7 @@ describe("legacy extension adding cluster frame components", () => { beforeEach(() => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); }); describe("given custom components for cluster view available", () => { @@ -46,7 +46,7 @@ describe("legacy extension adding cluster frame components", () => { }; rendered = await builder.render(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("renders", () => { diff --git a/packages/core/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx b/packages/core/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx index 9ceeb46f69..b844bcc183 100644 --- a/packages/core/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx +++ b/packages/core/src/features/cluster/namespaces/edit-namespace-from-new-tab.test.tsx @@ -38,9 +38,9 @@ describe("cluster/namespaces - edit namespace from new tab", () => { beforeEach(() => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", @@ -68,7 +68,7 @@ describe("cluster/namespaces - edit namespace from new tab", () => { windowDi.override(apiKubeGetInjectable, () => apiKubeGetMock); }); - builder.afterWindowStart(() => { + await builder.afterWindowStart(() => { builder.allowKubeResource({ apiName: "namespaces", group: "", diff --git a/packages/core/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx b/packages/core/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx index 99e80c22a1..9cfb002ba5 100644 --- a/packages/core/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx +++ b/packages/core/src/features/cluster/namespaces/edit-namespace-from-previously-opened-tab.test.tsx @@ -22,11 +22,11 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = beforeEach(() => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); requestKubeResourceMock = asyncFn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override( directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage", @@ -35,7 +35,7 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = windowDi.override(requestKubeResourceInjectable, () => requestKubeResourceMock); }); - builder.afterWindowStart(() => { + await builder.afterWindowStart(() => { builder.allowKubeResource({ apiName: "namespaces", group: "", @@ -47,7 +47,7 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = let rendered: RenderResult; beforeEach(async () => { - builder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFile = windowDi.inject(writeJsonFileInjectable); await writeJsonFile( @@ -123,8 +123,8 @@ describe("cluster/namespaces - edit namespaces from previously opened tab", () = // TODO: Figure out why act is needed here. In CI it works without it. await act(async () => { await requestKubeResourceMock.resolve({ - callWasSuccessful: true, - response: someNamespace, + isOk: true, + value: someNamespace, }); }); }); diff --git a/packages/core/src/features/cluster/refresh-accessibility-technical.test.ts b/packages/core/src/features/cluster/refresh-accessibility-technical.test.ts index 4851cca084..4f219b1229 100644 --- a/packages/core/src/features/cluster/refresh-accessibility-technical.test.ts +++ b/packages/core/src/features/cluster/refresh-accessibility-technical.test.ts @@ -26,6 +26,8 @@ import createKubeAuthProxyInjectable from "../../main/kube-auth-proxy/create-kub import type { Mocked } from "../../test-utils/mock-interface"; import { flushPromises } from "@k8slens/test-utils"; import addClusterInjectable from "./storage/common/add.injectable"; +import type { IncomingMessage } from "http"; +import assert from "assert"; describe("Refresh Cluster Accessibility Technical Tests", () => { let builder: ApplicationBuilder; @@ -62,12 +64,12 @@ describe("Refresh Cluster Accessibility Technical Tests", () => { mainDi.override(createAuthorizationApiInjectable, () => () => ({ createSelfSubjectRulesReview: createSelfSubjectRulesReviewMock, createSelfSubjectAccessReview: createSelfSubjectAccessReviewMock, - } as any)); + }) as unknown as AuthorizationV1Api); listNamespaceMock = asyncFn(); mainDi.override(createCoreApiInjectable, () => () => ({ listNamespace: listNamespaceMock, - } as any)); + }) as unknown as CoreV1Api); await builder.render(); }); @@ -103,11 +105,15 @@ describe("Refresh Cluster Accessibility Technical Tests", () => { }], }); - cluster = addCluster({ + const clusterResult = addCluster({ contextName: "some-cluster-context", id: "some-cluster-id", kubeConfigPath: "/some-kube-config-path", }); + + assert(clusterResult.isOk); + + cluster = clusterResult.value; clusterConnection = mainDi.inject(clusterConnectionInjectable, cluster); refreshPromise = clusterConnection.refreshAccessibilityAndMetadata(); }); @@ -123,7 +129,7 @@ describe("Refresh Cluster Accessibility Technical Tests", () => { await flushPromises(); }); - it("requests if cluster has admin permissions", async () => { + it("requests if cluster has admin permissions", () => { expect(createSelfSubjectAccessReviewMock).toBeCalledWith(anyObject({ spec: { namespace: "kube-system", @@ -140,8 +146,9 @@ describe("Refresh Cluster Accessibility Technical Tests", () => { status: { allowed: isAdmin, }, - } as PartialDeep, - } as any); + } as unknown as V1SelfSubjectAccessReview, + response: null as unknown as IncomingMessage, + }); }); it("requests if cluster has global watch permissions", () => { @@ -160,8 +167,9 @@ describe("Refresh Cluster Accessibility Technical Tests", () => { status: { allowed: globalWatch, }, - } as PartialDeep, - } as any); + } as unknown as V1SelfSubjectAccessReview, + response: null as unknown as IncomingMessage, + }); }); it("requests namespaces", () => { diff --git a/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx b/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx index 39d8ffe0d2..be2837b7aa 100644 --- a/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx +++ b/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-core.test.tsx @@ -32,16 +32,16 @@ describe("cluster - sidebar and tab navigation for core", () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(storageSaveDelayInjectable, () => 250); }); }); describe("given core registrations", () => { beforeEach(() => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register( testRouteInjectable, @@ -88,7 +88,7 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - builder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFile = windowDi.inject(writeJsonFileInjectable); await writeJsonFile( @@ -124,7 +124,7 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given state for expanded unknown sidebar items already exists, when rendered", () => { beforeEach(async () => { - builder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( @@ -154,7 +154,7 @@ describe("cluster - sidebar and tab navigation for core", () => { describe("given empty state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - builder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( diff --git a/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx b/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx index f44038887b..83065288ee 100644 --- a/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx +++ b/packages/core/src/features/cluster/sidebar-and-tab-navigation-for-extensions.test.tsx @@ -24,17 +24,17 @@ import { flushPromises } from "@k8slens/test-utils"; import { testUsingFakeTime, advanceFakeTime } from "../../test-utils/use-fake-time"; describe("cluster - sidebar and tab navigation for extensions", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - applicationBuilder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(storageSaveDelayInjectable, () => 250); windowDi.override( @@ -47,7 +47,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given extension with cluster pages and cluster page menus", () => { let someObservable: IObservableValue; - beforeEach(() => { + beforeEach(async () => { someObservable = observable.box(false); const testExtension = { @@ -126,14 +126,14 @@ describe("cluster - sidebar and tab navigation for extensions", () => { }, }; - applicationBuilder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given no state for expanded sidebar items exists, and navigated to child sidebar item, when rendered", () => { beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); - const windowDi = applicationBuilder.applicationWindow.only.di; + const windowDi = builder.applicationWindow.only.di; const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); @@ -171,7 +171,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( @@ -185,7 +185,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { ); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -207,7 +207,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given state for expanded unknown sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( @@ -221,7 +221,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { ); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders without errors", () => { @@ -237,7 +237,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given empty state for expanded sidebar items already exists, when rendered", () => { beforeEach(async () => { - applicationBuilder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFileFake = windowDi.inject(writeJsonFileInjectable); await writeJsonFileFake( @@ -248,7 +248,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { ); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders without errors", () => { @@ -266,9 +266,9 @@ describe("cluster - sidebar and tab navigation for extensions", () => { let windowDi: DiContainer; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); - windowDi = applicationBuilder.applicationWindow.only.di; + windowDi = builder.applicationWindow.only.di; }); it("renders", () => { @@ -455,7 +455,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => { describe("given extension with cluster pages and cluster page menus with explicit 'orderNumber'", () => { let someObservable: IObservableValue; - beforeEach(() => { + beforeEach(async () => { someObservable = observable.box(false); const testExtension = { @@ -528,14 +528,14 @@ describe("cluster - sidebar and tab navigation for extensions", () => { }, }; - applicationBuilder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given no state for expanded sidebar items exists, and navigated to child sidebar item, when rendered", () => { beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); - const windowDi = applicationBuilder.applicationWindow.only.di; + const windowDi = builder.applicationWindow.only.di; const navigateToRoute = windowDi.inject(navigateToRouteInjectionToken); diff --git a/packages/core/src/features/cluster/storage/cluster-storage.test.ts b/packages/core/src/features/cluster/storage/cluster-storage.test.ts index 5a0cc0ecb1..a92928605d 100644 --- a/packages/core/src/features/cluster/storage/cluster-storage.test.ts +++ b/packages/core/src/features/cluster/storage/cluster-storage.test.ts @@ -73,7 +73,7 @@ describe("cluster storage technical tests", () => { let getClusterById: GetClusterById; let clusters: IComputedValue; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); @@ -92,7 +92,7 @@ describe("cluster storage technical tests", () => { }); describe("empty config", () => { - beforeEach(async () => { + beforeEach(() => { getCustomKubeConfigFilePath = di.inject(getCustomKubeConfigFilePathInjectable); writeJsonSync("/some-directory-for-user-data/lens-cluster-store.json", {}); @@ -117,7 +117,7 @@ describe("cluster storage technical tests", () => { }); }); - it("adds new cluster to store", async () => { + it("adds new cluster to store", () => { const storedCluster = getClusterById("foo"); assert(storedCluster); @@ -216,7 +216,7 @@ describe("cluster storage technical tests", () => { expect(storedCluster.preferences.terminalCWD).toBe("/foo"); }); - it("allows getting all of the clusters", async () => { + it("allows getting all of the clusters", () => { const storedClusters = clusters.get(); expect(storedClusters.length).toBe(3); @@ -258,13 +258,13 @@ describe("cluster storage technical tests", () => { clustersPersistentStorage.loadAndStartSyncing(); }); - it("migrates to modern format with kubeconfig in a file", async () => { + it("migrates to modern format with kubeconfig in a file", () => { const configPath = clusters.get()[0].kubeConfigPath.get(); expect(readFileSync(configPath)).toBe(minimalValidKubeConfig); }); - it("migrates to modern format with icon not in file", async () => { + it("migrates to modern format with icon not in file", () => { expect(clusters.get()[0].preferences.icon).toMatch(/data:;base64,/); }); }); diff --git a/packages/core/src/features/cluster/storage/common/add.injectable.ts b/packages/core/src/features/cluster/storage/common/add.injectable.ts index ff4ad8d828..8ed9c7392e 100644 --- a/packages/core/src/features/cluster/storage/common/add.injectable.ts +++ b/packages/core/src/features/cluster/storage/common/add.injectable.ts @@ -8,9 +8,11 @@ import emitAppEventInjectable from "../../../../common/app-event-bus/emit-event. import type { ClusterModel } from "../../../../common/cluster-types"; import { Cluster } from "../../../../common/cluster/cluster"; import clustersStateInjectable from "./state.injectable"; +import type { Result } from "@k8slens/utilities"; import { setAndGet } from "@k8slens/utilities"; +import type { ZodError } from "zod"; -export type AddCluster = (clusterModel: ClusterModel) => Cluster; +export type AddCluster = (clusterModel: ClusterModel) => Result>; const addClusterInjectable = getInjectable({ id: "add-cluster", @@ -21,7 +23,16 @@ const addClusterInjectable = getInjectable({ return action((clusterModel) => { emitAppEvent({ name: "cluster", action: "add" }); - return setAndGet(clustersState, clusterModel.id, new Cluster(clusterModel)); + const result = Cluster.create(clusterModel); + + if (!result.isOk) { + return result; + } + + return { + isOk: true, + value: setAndGet(clustersState, clusterModel.id, result.value), + }; }); }, }); diff --git a/packages/core/src/features/cluster/storage/common/storage.injectable.ts b/packages/core/src/features/cluster/storage/common/storage.injectable.ts index 56ba24de06..2082fb00f2 100644 --- a/packages/core/src/features/cluster/storage/common/storage.injectable.ts +++ b/packages/core/src/features/cluster/storage/common/storage.injectable.ts @@ -38,19 +38,17 @@ const clustersPersistentStorageInjectable = getInjectable({ const newClusters = new Map(); for (const clusterModel of clusters) { - try { - let cluster = currentClusters.get(clusterModel.id); + const clusterResult = ( + currentClusters.get(clusterModel.id)?.updateModel(clusterModel) + ?? Cluster.create(clusterModel) + ); - if (cluster) { - cluster.updateModel(clusterModel); - } else { - cluster = new Cluster(clusterModel); - } - - newClusters.set(clusterModel.id, cluster); - } catch (error) { - logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${error}`); + if (!clusterResult.isOk) { + logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${clusterResult.error.toString()}`); + continue; } + + newClusters.set(clusterModel.id, clusterResult.value); } clustersState.replace(newClusters); diff --git a/packages/core/src/features/cluster/visibility-of-sidebar-items.test.tsx b/packages/core/src/features/cluster/visibility-of-sidebar-items.test.tsx index c364027dd1..bd6d44ceef 100644 --- a/packages/core/src/features/cluster/visibility-of-sidebar-items.test.tsx +++ b/packages/core/src/features/cluster/visibility-of-sidebar-items.test.tsx @@ -21,9 +21,9 @@ describe("cluster - visibility of sidebar items", () => { beforeEach(() => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteInjectable); windowDi.register(testRouteComponentInjectable); diff --git a/packages/core/src/features/cluster/workload-overview.test.tsx b/packages/core/src/features/cluster/workload-overview.test.tsx index c08dcba0f7..90df78911e 100644 --- a/packages/core/src/features/cluster/workload-overview.test.tsx +++ b/packages/core/src/features/cluster/workload-overview.test.tsx @@ -14,7 +14,7 @@ describe("workload overview", () => { beforeEach(async () => { builder = getApplicationBuilder().setEnvironmentToClusterFrame(); - builder.afterWindowStart(() => { + await builder.afterWindowStart(() => { builder.allowKubeResource({ apiName: "pods", group: "", diff --git a/packages/core/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx b/packages/core/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx index e40b7361fb..de1792023a 100644 --- a/packages/core/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx +++ b/packages/core/src/features/cluster/workloads/overview/extension-api/disable-workloads-overview-details-when-cluster-is-not-relevant.test.tsx @@ -21,7 +21,7 @@ describe("disable workloads overview details when cluster is not relevant", () = beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); isEnabledForClusterMock = asyncFn(); @@ -54,7 +54,7 @@ describe("disable workloads overview details when cluster is not relevant", () = navigateToWorkloadsOverview(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given not yet known if extension should be enabled for the cluster", () => { diff --git a/packages/core/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx b/packages/core/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx index d7db17f97b..0c239bbb02 100644 --- a/packages/core/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx +++ b/packages/core/src/features/cluster/workloads/overview/extension-api/order-of-workload-overview-details.test.tsx @@ -16,7 +16,7 @@ describe("order of workload overview details", () => { beforeEach(async () => { const builder = getApplicationBuilder(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.unoverride(getRandomIdInjectionToken); windowDi.permitSideEffects(getRandomIdInjectionToken); @@ -29,7 +29,7 @@ describe("order of workload overview details", () => { }); }); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); rendered = await builder.render(); @@ -75,7 +75,7 @@ describe("order of workload overview details", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("shows items in correct order", () => { diff --git a/packages/core/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx b/packages/core/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx index fbc8ceebca..31919285ec 100644 --- a/packages/core/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx +++ b/packages/core/src/features/cluster/workloads/overview/extension-api/reactively-hide-workloads-overview-details-item.test.tsx @@ -18,7 +18,7 @@ describe("reactively hide workloads overview details item", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); someObservable = observable.box(false); @@ -51,7 +51,7 @@ describe("reactively hide workloads overview details item", () => { navigateToWorkloadsOverview(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("does not show the workload overview detail item", () => { diff --git a/packages/core/src/features/cluster/workloads/pods.test.tsx b/packages/core/src/features/cluster/workloads/pods.test.tsx index 74d9f7e2cc..0658af0837 100644 --- a/packages/core/src/features/cluster/workloads/pods.test.tsx +++ b/packages/core/src/features/cluster/workloads/pods.test.tsx @@ -7,28 +7,20 @@ import type { RenderResult } from "@testing-library/react"; import navigateToPodsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable"; import { type ApplicationBuilder, getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; import podStoreInjectable from "../../../renderer/components/workloads-pods/store.injectable"; -import type { PodMetrics, PodStatus } from "@k8slens/kube-object"; +import type { PodStatus } from "@k8slens/kube-object"; import { Pod } from "@k8slens/kube-object"; -import type { PodMetricsApi } from "@k8slens/kube-api"; -import podMetricsApiInjectable from "../../../common/k8s-api/endpoints/pod-metrics.api.injectable"; import type { RequestMetrics } from "../../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable"; import requestMetricsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable"; describe("workloads / pods", () => { let rendered: RenderResult; - let applicationBuilder: ApplicationBuilder; - const podMetrics: PodMetrics[] = []; + let builder: ApplicationBuilder; - beforeEach(() => { - applicationBuilder = getApplicationBuilder().setEnvironmentToClusterFrame(); - applicationBuilder.namespaces.add("default"); - applicationBuilder.beforeWindowStart(({ windowDi }) => { - windowDi.override(podMetricsApiInjectable, () => ({ - list: async () => Promise.resolve(podMetrics), - } as PodMetricsApi)); - }); - applicationBuilder.afterWindowStart(() => { - applicationBuilder.allowKubeResource({ + beforeEach(async () => { + builder = await getApplicationBuilder().setEnvironmentToClusterFrame(); + builder.namespaces.add("default"); + await builder.beforeWindowStart(() => { + builder.allowKubeResource({ apiName: "pods", group: "", }); @@ -38,7 +30,7 @@ describe("workloads / pods", () => { describe("when navigating to workloads / pods view", () => { describe("given pods are loading", () => { beforeEach(async () => { - applicationBuilder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { const podStore = windowDi.inject(podStoreInjectable); podStore.items.clear(); @@ -46,8 +38,8 @@ describe("workloads / pods", () => { podStore.isLoading = true; }); - rendered = await applicationBuilder.render(); - applicationBuilder.navigateWith(navigateToPodsInjectable); + rendered = await builder.render(); + builder.navigateWith(navigateToPodsInjectable); }); it("renders", () => { @@ -61,15 +53,15 @@ describe("workloads / pods", () => { describe("given no pods", () => { beforeEach(async () => { - applicationBuilder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { const podStore = windowDi.inject(podStoreInjectable); podStore.items.clear(); podStore.isLoaded = true; }); - rendered = await applicationBuilder.render(); - applicationBuilder.navigateWith(navigateToPodsInjectable); + rendered = await builder.render(); + builder.navigateWith(navigateToPodsInjectable); }); it("renders", () => { @@ -83,7 +75,7 @@ describe("workloads / pods", () => { describe("given a namespace has pods", () => { beforeEach(async () => { - applicationBuilder.afterWindowStart(({ windowDi }) => { + await builder.afterWindowStart(({ windowDi }) => { windowDi.override(requestMetricsInjectable, () => (() => Promise.resolve({})) as unknown as RequestMetrics); const podStore = windowDi.inject(podStoreInjectable); @@ -113,8 +105,8 @@ describe("workloads / pods", () => { podStore.isLoaded = true; }); - rendered = await applicationBuilder.render(); - applicationBuilder.navigateWith(navigateToPodsInjectable); + rendered = await builder.render(); + builder.navigateWith(navigateToPodsInjectable); }); it("renders", () => { diff --git a/packages/core/src/features/command-pallet/keyboard-shortcuts.test.tsx b/packages/core/src/features/command-pallet/keyboard-shortcuts.test.tsx index e577907b89..40411ebb3e 100644 --- a/packages/core/src/features/command-pallet/keyboard-shortcuts.test.tsx +++ b/packages/core/src/features/command-pallet/keyboard-shortcuts.test.tsx @@ -12,13 +12,13 @@ describe("Command Pallet: keyboard shortcut tests", () => { let builder: ApplicationBuilder; let rendered: RenderResult; - beforeEach(async () => { + beforeEach(() => { builder = getApplicationBuilder(); }); describe("when on macOS", () => { beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(platformInjectable, () => "darwin"); }); @@ -86,7 +86,7 @@ describe("Command Pallet: keyboard shortcut tests", () => { describe("when on linux", () => { beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(platformInjectable, () => "linux"); }); diff --git a/packages/core/src/features/entity-settings/showing-settings-for-correct-entity.test.tsx b/packages/core/src/features/entity-settings/showing-settings-for-correct-entity.test.tsx index d88495c6d9..718a8855aa 100644 --- a/packages/core/src/features/entity-settings/showing-settings-for-correct-entity.test.tsx +++ b/packages/core/src/features/entity-settings/showing-settings-for-correct-entity.test.tsx @@ -23,7 +23,7 @@ describe("Showing correct entity settings", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.afterWindowStart(async ({ windowDi }) => { + await builder.afterWindowStart(async ({ windowDi }) => { clusterEntity = new KubernetesCluster({ metadata: { labels: {}, diff --git a/packages/core/src/features/extension-special-characters-in-page-registrations.test.tsx b/packages/core/src/features/extension-special-characters-in-page-registrations.test.tsx index b9760eba79..cd1a41cddc 100644 --- a/packages/core/src/features/extension-special-characters-in-page-registrations.test.tsx +++ b/packages/core/src/features/extension-special-characters-in-page-registrations.test.tsx @@ -20,7 +20,7 @@ describe("extension special characters in page registrations", () => { rendered = await builder.render(); - builder.extensions.enable(extensionWithPagesHavingSpecialCharacters); + await builder.extensions.enable(extensionWithPagesHavingSpecialCharacters); windowDi = builder.applicationWindow.only.di; }); diff --git a/packages/core/src/features/extensions/navigate/common/channel.ts b/packages/core/src/features/extensions/navigate/common/channel.ts index ec7bc967dc..dba88b292d 100644 --- a/packages/core/src/features/extensions/navigate/common/channel.ts +++ b/packages/core/src/features/extensions/navigate/common/channel.ts @@ -8,7 +8,7 @@ import type { MessageChannel } from "@k8slens/messaging"; export interface NavigateForExtensionArgs { extId: string; pageId: string | undefined; - params: Record | undefined; + params: Record | undefined; } export const navigateForExtensionChannel: MessageChannel = { diff --git a/packages/core/src/features/extensions/navigation-using-application-menu.test.ts b/packages/core/src/features/extensions/navigation-using-application-menu.test.ts index 700710dd3f..9937ef8c72 100644 --- a/packages/core/src/features/extensions/navigation-using-application-menu.test.ts +++ b/packages/core/src/features/extensions/navigation-using-application-menu.test.ts @@ -19,7 +19,7 @@ describe("extensions - navigation using application menu", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { focusWindowMock = jest.fn(); windowDi.override(focusWindowInjectable, () => focusWindowMock); diff --git a/packages/core/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts b/packages/core/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts index d86fb5978d..26d301a4ec 100644 --- a/packages/core/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts +++ b/packages/core/src/features/helm-charts/add-custom-helm-repository-in-preferences.test.ts @@ -26,7 +26,7 @@ describe("add custom helm repository in preferences", () => { let showErrorNotificationMock: jest.Mock; let rendered: RenderResult; let execFileMock: AsyncFnMock; - let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; + let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; beforeEach(async () => { jest.useFakeTimers(); @@ -40,14 +40,14 @@ describe("add custom helm repository in preferences", () => { showSuccessNotificationMock = jest.fn(); showErrorNotificationMock = jest.fn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); }); - builder.beforeWindowStart(({ windowDi }) => { - windowDi.override(requestPublicHelmRepositoriesInjectable, () => async () => []); + await builder.beforeWindowStart(({ windowDi }) => { + windowDi.override(requestPublicHelmRepositoriesInjectable, () => () => Promise.resolve([])); windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); @@ -59,7 +59,7 @@ describe("add custom helm repository in preferences", () => { }); describe("when navigating to preferences containing helm repositories", () => { - beforeEach(async () => { + beforeEach(() => { builder.preferences.navigate(); builder.preferences.navigation.click("kubernetes"); }); @@ -72,8 +72,8 @@ describe("add custom helm repository in preferences", () => { beforeEach(async () => { await Promise.all([ getActiveHelmRepositoriesMock.resolve({ - callWasSuccessful: true, - response: [{ + isOk: true, + value: [{ name: "Some active repository", url: "some-url", cacheFilePath: "/some-cache-file-for-active", @@ -189,7 +189,7 @@ describe("add custom helm repository in preferences", () => { describe("when activation rejects", () => { beforeEach(async () => { await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("Some error"), { stderr: "", }), @@ -227,8 +227,8 @@ describe("add custom helm repository in preferences", () => { ["repo", "add", "some-custom-repository", "http://some.url"], ], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); @@ -327,7 +327,7 @@ describe("add custom helm repository in preferences", () => { }); describe("when inputted maximal options", () => { - beforeEach(async () => { + beforeEach(() => { [ { selector: "username-input", value: "some-username" }, { selector: "password-input", value: "some-password" }, diff --git a/packages/core/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts b/packages/core/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts index 1791d58e98..e7c95dffe7 100644 --- a/packages/core/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts +++ b/packages/core/src/features/helm-charts/add-helm-repository-from-list-in-preferences.test.ts @@ -23,7 +23,7 @@ describe("add helm repository from list in preferences", () => { let showErrorNotificationMock: jest.Mock; let rendered: RenderResult; let execFileMock: AsyncFnMock; - let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; + let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise>; beforeEach(async () => { @@ -35,13 +35,13 @@ describe("add helm repository from list in preferences", () => { showSuccessNotificationMock = jest.fn(); showErrorNotificationMock = jest.fn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); windowDi.override(requestPublicHelmRepositoriesInjectable, () => callForPublicHelmRepositoriesMock); @@ -85,8 +85,8 @@ describe("add helm repository from list in preferences", () => { ]), getActiveHelmRepositoriesMock.resolve({ - callWasSuccessful: true, - response: [{ + isOk: true, + value: [{ name: "Some already active repository", url: "some-url", cacheFilePath: "/some-cache-file-for-active", @@ -111,7 +111,7 @@ describe("add helm repository from list in preferences", () => { }); describe("when deactive public repository is selected", () => { - beforeEach(async () => { + beforeEach(() => { getActiveHelmRepositoriesMock.mockClear(); builder.select.selectOption( @@ -142,7 +142,7 @@ describe("add helm repository from list in preferences", () => { describe("when adding rejects", () => { beforeEach(async () => { await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("Some error"), { stderr: "", }), @@ -180,8 +180,8 @@ describe("add helm repository from list in preferences", () => { ["repo", "add", "Some to be added repository", "some-other-url"], ], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); @@ -203,8 +203,8 @@ describe("add helm repository from list in preferences", () => { describe("when active repositories resolve again", () => { beforeEach(async () => { await getActiveHelmRepositoriesMock.resolve({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { name: "Some already active repository", url: "some-url", @@ -272,8 +272,8 @@ describe("add helm repository from list in preferences", () => { ["repo", "remove", "Some already active repository"], ], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/active-helm-repositories.injectable.ts b/packages/core/src/features/helm-charts/child-features/preferences/renderer/active-helm-repositories.injectable.ts index b4195a876f..83249a0462 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/active-helm-repositories.injectable.ts +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/active-helm-repositories.injectable.ts @@ -26,8 +26,8 @@ const activeHelmRepositoriesInjectable = getInjectable({ getActiveHelmRepositoriesChannel, ); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } else { showErrorNotification(result.error); diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/adding-of-public-helm-repository.tsx b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/adding-of-public-helm-repository.tsx index b01aa5460d..8f96c530a3 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/adding-of-public-helm-repository.tsx +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/adding-of-public-helm-repository.tsx @@ -19,7 +19,7 @@ import activeHelmRepositoriesInjectable from "../active-helm-repositories.inject interface Dependencies { publicRepositories: IAsyncComputed; activeRepositories: IAsyncComputed; - selectRepository: (value: SingleValue>) => void; + selectRepository: (value: SingleValue>) => Promise; } const NonInjectedAddingOfPublicHelmRepository = observer(({ @@ -45,7 +45,7 @@ const NonInjectedAddingOfPublicHelmRepository = observer(({ isLoading={valuesAreLoading} isDisabled={valuesAreLoading} options={repositoryOptions} - onChange={selectRepository} + onChange={(...args) => void selectRepository(...args)} value={dereferencesPublicRepositories} formatOptionLabel={formatOptionLabel} controlShouldRenderValue={false} diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable.ts b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable.ts index b6e29ccfa3..e5d43f4961 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable.ts +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/request-public-helm-repositories.injectable.ts @@ -24,13 +24,13 @@ const requestPublicHelmRepositoriesInjectable = getInjectable({ signal: controller.signal, }); - if (!result.callWasSuccessful) { + if (!result.isOk) { logger.warn(`Failed to download public helm repos: ${result.error}`); return []; } - return sortBy(repo => repo.name, result.response as HelmRepo[]); + return sortBy(repo => repo.name, result.value as HelmRepo[]); }; }, diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/add-helm-repository.injectable.ts b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/add-helm-repository.injectable.ts index 3c2199c490..07372f8903 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/add-helm-repository.injectable.ts +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/add-helm-repository.injectable.ts @@ -25,7 +25,7 @@ const addHelmRepositoryInjectable = getInjectable({ repository, ); - if (result.callWasSuccessful) { + if (result.isOk) { showSuccessNotification( `Helm repository ${repository.name} has been added.`, ); diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts index a33f9c39ca..494848d154 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/select-helm-repository/select-helm-repository.injectable.ts @@ -16,15 +16,15 @@ const selectHelmRepositoryInjectable = getInjectable({ const addHelmRepository = di.inject(addHelmRepositoryInjectable); const removeHelmRepository = di.inject(removeHelmRepositoryInjectable); - return (selected: SingleValue>) => { + return async (selected: SingleValue>) => { if (!selected) { return; } if (!selected.isSelected) { - addHelmRepository(selected.value); + await addHelmRepository(selected.value); } else { - removeHelmRepository(selected.value); + await removeHelmRepository(selected.value); } }; }, diff --git a/packages/core/src/features/helm-charts/child-features/preferences/renderer/helm-repositories.tsx b/packages/core/src/features/helm-charts/child-features/preferences/renderer/helm-repositories.tsx index fd3cd333d8..432e277b71 100644 --- a/packages/core/src/features/helm-charts/child-features/preferences/renderer/helm-repositories.tsx +++ b/packages/core/src/features/helm-charts/child-features/preferences/renderer/helm-repositories.tsx @@ -39,7 +39,7 @@ const NonInjectedActiveHelmRepositories = observer(({ activeHelmRepositories, re {repositories.map((repository) => ( removeRepository(repository)} + onRemove={() => void removeRepository(repository)} className={styles.repo} data-testid={`remove-helm-repository-${repository.name}`} > diff --git a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts index 76345d0315..4beb828a95 100644 --- a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts +++ b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts @@ -42,10 +42,10 @@ describe("installing helm chart from new tab", () => { let requestCreateHelmReleaseMock: AsyncFnMock; let listClusterHelmReleasesMock: AsyncFnMock; - beforeEach(() => { + beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); requestDetailedHelmReleaseMock = asyncFn(); requestHelmChartsMock = asyncFn(); @@ -54,7 +54,7 @@ describe("installing helm chart from new tab", () => { requestHelmChartValuesMock = asyncFn(); requestCreateHelmReleaseMock = asyncFn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage"); windowDi.override(requestDetailedHelmReleaseInjectable, () => requestDetailedHelmReleaseMock); windowDi.override(requestHelmChartsInjectable, () => requestHelmChartsMock); @@ -188,8 +188,8 @@ describe("installing helm chart from new tab", () => { ]); await requestHelmChartReadmeMock.resolve({ - callWasSuccessful: true, - response: "some-readme", + isOk: true, + value: "some-readme", }); }); @@ -250,8 +250,8 @@ describe("installing helm chart from new tab", () => { describe("when default configuration and versions resolve", () => { beforeEach(async () => { await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-default-configuration", + isOk: true, + value: "some-default-configuration", }); await requestHelmChartVersionsMock.resolve([ @@ -491,8 +491,8 @@ describe("installing helm chart from new tab", () => { ]); await requestHelmChartReadmeMock.resolve({ - callWasSuccessful: true, - response: "some-readme", + isOk: true, + value: "some-readme", }); }); @@ -553,8 +553,8 @@ describe("installing helm chart from new tab", () => { describe("when configuration and versions resolve", () => { beforeEach(async () => { await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-other-default-configuration", + isOk: true, + value: "some-other-default-configuration", }); await requestHelmChartVersionsMock.resolve([]); @@ -709,18 +709,22 @@ describe("installing helm chart from new tab", () => { const actual = await readJsonFile( "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; + ); - const version = actual.install_charts["some-first-tab-id"].version; - - expect(version).toBe("some-other-version"); + expect(actual).toMatchObject({ + install_charts: { + "some-first-tab-id": { + version: "some-other-version", + }, + }, + }); }); describe("when default configuration resolves", () => { beforeEach(async () => { await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-default-configuration-for-other-version", + isOk: true, + value: "some-default-configuration-for-other-version", }); }); @@ -787,11 +791,15 @@ describe("installing helm chart from new tab", () => { const actual = await readJsonFile( "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; + ); - const namespace = actual.install_charts["some-first-tab-id"].namespace; - - expect(namespace).toBe("some-other-namespace"); + expect(actual).toMatchObject({ + install_charts: { + "some-first-tab-id": { + namespace: "some-other-namespace", + }, + }, + }); }); it("when installing the chart, calls for installation with changed namespace", () => { @@ -865,8 +873,8 @@ describe("installing helm chart from new tab", () => { .selectOption("some-other-version"); await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-default-configuration-for-other-version", + isOk: true, + value: "some-default-configuration-for-other-version", }); expect(installButton).not.toHaveAttribute("disabled"); @@ -901,11 +909,15 @@ describe("installing helm chart from new tab", () => { const actual = await readJsonFile( "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; + ); - const configuration = actual.install_charts["some-first-tab-id"].values; - - expect(configuration).toBe("some-valid-configuration"); + expect(actual).toMatchObject({ + install_charts: { + "some-first-tab-id": { + values: "some-valid-configuration", + }, + }, + }); }); it("does not show spinner", () => { @@ -939,8 +951,8 @@ describe("installing helm chart from new tab", () => { .selectOption("some-other-version"); await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-default-configuration-for-other-version", + isOk: true, + value: "some-default-configuration-for-other-version", }); const input = rendered.getByTestId( @@ -970,11 +982,15 @@ describe("installing helm chart from new tab", () => { const actual = await readJsonFile( "/some-directory-for-lens-local-storage/some-cluster-id.json", - ) as any; + ); - const customName = actual.install_charts["some-first-tab-id"].releaseName; - - expect(customName).toBe("some-custom-name"); + expect(actual).toMatchObject({ + install_charts: { + "some-first-tab-id": { + releaseName: "some-custom-name", + }, + }, + }); }); it("renders", () => { diff --git a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-previously-opened-tab.test.ts b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-previously-opened-tab.test.ts index 937ac4a027..ac94238983 100644 --- a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-previously-opened-tab.test.ts +++ b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-previously-opened-tab.test.ts @@ -26,7 +26,7 @@ describe("installing helm chart from previously opened tab", () => { beforeEach(() => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); requestHelmChartVersionsMock = asyncFn(); requestHelmChartValuesMock = asyncFn(); @@ -34,7 +34,7 @@ describe("installing helm chart from previously opened tab", () => { builder.namespaces.add("default"); builder.namespaces.add("some-other-namespace"); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage"); windowDi.override(requestHelmChartVersionsInjectable, () => requestHelmChartVersionsMock); windowDi.override(requestHelmChartValuesInjectable, () => requestHelmChartValuesMock); @@ -52,7 +52,7 @@ describe("installing helm chart from previously opened tab", () => { let rendered: RenderResult; beforeEach(async () => { - builder.beforeWindowStart(async ({ windowDi }) => { + await builder.beforeWindowStart(async ({ windowDi }) => { const writeJsonFile = windowDi.inject(writeJsonFileInjectable); await writeJsonFile( @@ -129,8 +129,8 @@ describe("installing helm chart from previously opened tab", () => { describe("when configuration and version resolves", () => { beforeEach(async () => { await requestHelmChartValuesMock.resolve({ - callWasSuccessful: true, - response: "some-default-configuration", + isOk: true, + value: "some-default-configuration", }); await requestHelmChartVersionsMock.resolve([ diff --git a/packages/core/src/features/helm-charts/installing-chart/opening-dock-tab-for-installing-helm-chart.test.ts b/packages/core/src/features/helm-charts/installing-chart/opening-dock-tab-for-installing-helm-chart.test.ts index 85012f430b..d6d39b20fc 100644 --- a/packages/core/src/features/helm-charts/installing-chart/opening-dock-tab-for-installing-helm-chart.test.ts +++ b/packages/core/src/features/helm-charts/installing-chart/opening-dock-tab-for-installing-helm-chart.test.ts @@ -38,7 +38,7 @@ describe("opening dock tab for installing helm chart", () => { requestHelmChartReadmeMock = asyncFn(); requestHelmChartValuesMock = jest.fn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(directoryForLensLocalStorageInjectable, () => "/some-directory-for-lens-local-storage"); windowDi.override(hostedClusterIdInjectable, () => "some-cluster-id"); windowDi.override(requestHelmChartsInjectable, () => requestHelmChartsMock); @@ -53,7 +53,7 @@ describe("opening dock tab for installing helm chart", () => { ); }); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); }); describe("given application is started, when navigating to helm charts", () => { @@ -231,8 +231,8 @@ describe("opening dock tab for installing helm chart", () => { describe("when readme resolves", () => { beforeEach(async () => { await requestHelmChartReadmeMock.resolve({ - callWasSuccessful: true, - response: "some-readme", + isOk: true, + value: "some-readme", }); }); @@ -280,8 +280,8 @@ describe("opening dock tab for installing helm chart", () => { describe("when readme resolves", () => { beforeEach(async () => { await requestHelmChartReadmeMock.resolve({ - callWasSuccessful: true, - response: "some-readme", + isOk: true, + value: "some-readme", }); }); @@ -309,7 +309,7 @@ describe("opening dock tab for installing helm chart", () => { describe("when readme rejects", () => { beforeEach(async () => { await requestHelmChartReadmeMock.resolve({ - callWasSuccessful: false, + isOk: false, error: "some-error", }); }); diff --git a/packages/core/src/features/helm-charts/listing-active-helm-repositories-in-preferences.test.ts b/packages/core/src/features/helm-charts/listing-active-helm-repositories-in-preferences.test.ts index c554be5390..163a7cdd41 100644 --- a/packages/core/src/features/helm-charts/listing-active-helm-repositories-in-preferences.test.ts +++ b/packages/core/src/features/helm-charts/listing-active-helm-repositories-in-preferences.test.ts @@ -41,23 +41,23 @@ describe("listing active helm repositories in preferences", () => { warn: noop, }; - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(readYamlFileInjectable, () => readYamlFileMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); mainDi.override(loggerInjectionToken, () => loggerStub); }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock); - windowDi.override(requestPublicHelmRepositoriesInjectable, () => async () => []); + windowDi.override(requestPublicHelmRepositoriesInjectable, () => () => Promise.resolve([])); }); rendered = await builder.render(); }); describe("when navigating to preferences containing helm repositories", () => { - beforeEach(async () => { + beforeEach(() => { builder.preferences.navigate(); builder.preferences.navigation.click("kubernetes"); }); @@ -97,7 +97,7 @@ describe("listing active helm repositories in preferences", () => { describe("when getting configuration rejects", () => { beforeEach(async () => { await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("Some error"), { stderr: "some-error", }), @@ -134,8 +134,8 @@ describe("listing active helm repositories in preferences", () => { await execFileMock.resolveSpecific( ["some-helm-binary-path", ["env"]], { - callWasSuccessful: true, - response: "HELM_REPOSITORY_CACHE=some-helm-repository-cache-path", + isOk: true, + value: "HELM_REPOSITORY_CACHE=some-helm-repository-cache-path", }, ); }); @@ -176,8 +176,8 @@ describe("listing active helm repositories in preferences", () => { await execFileMock.resolveSpecific( ["some-helm-binary-path", ["env"]], { - callWasSuccessful: true, - response: "HELM_REPOSITORY_CONFIG=some-helm-repository-config-file.yaml", + isOk: true, + value: "HELM_REPOSITORY_CONFIG=some-helm-repository-config-file.yaml", }, ); }); @@ -218,8 +218,8 @@ describe("listing active helm repositories in preferences", () => { await execFileMock.resolveSpecific( ["some-helm-binary-path", ["env"]], { - callWasSuccessful: true, - response: [ + isOk: true, + value: [ "HELM_REPOSITORY_CONFIG=some-helm-repository-config-file.yaml", "HELM_REPOSITORY_CACHE=some-helm-repository-cache-path", ].join("\n"), @@ -249,7 +249,7 @@ describe("listing active helm repositories in preferences", () => { describe("when updating repositories reject with any other error", () => { beforeEach(async () => { await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("Some error"), { stderr: "Some error", }), @@ -284,7 +284,7 @@ describe("listing active helm repositories in preferences", () => { execFileMock.mockClear(); await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("no repositories found. You must add one before updating"), { stderr: "no repositories found. You must add one before updating", }), @@ -315,7 +315,7 @@ describe("listing active helm repositories in preferences", () => { describe("when adding default repository reject", () => { beforeEach(async () => { await execFileMock.resolve({ - callWasSuccessful: false, + isOk: false, error: Object.assign(new Error("Some error"), { stderr: "Some error", }), @@ -360,8 +360,8 @@ describe("listing active helm repositories in preferences", () => { ], ], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); @@ -427,8 +427,8 @@ describe("listing active helm repositories in preferences", () => { await execFileMock.resolveSpecific( ["some-helm-binary-path", ["repo", "update"]], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); diff --git a/packages/core/src/features/helm-charts/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts b/packages/core/src/features/helm-charts/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts index 44c5137b0a..3965661e53 100644 --- a/packages/core/src/features/helm-charts/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts +++ b/packages/core/src/features/helm-charts/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts @@ -19,7 +19,7 @@ import type { AsyncResult } from "@k8slens/utilities"; describe("remove helm repository from list of active repositories in preferences", () => { let builder: ApplicationBuilder; let rendered: RenderResult; - let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; + let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult>; let execFileMock: AsyncFnMock; beforeEach(async () => { @@ -28,21 +28,21 @@ describe("remove helm repository from list of active repositories in preferences execFileMock = asyncFn(); getActiveHelmRepositoriesMock = asyncFn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); mainDi.override(execFileInjectable, () => execFileMock); mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path"); }); - builder.beforeWindowStart(({ windowDi }) => { - windowDi.override(requestPublicHelmRepositoriesInjectable, () => async () => []); + await builder.beforeWindowStart(({ windowDi }) => { + windowDi.override(requestPublicHelmRepositoriesInjectable, () => () => Promise.resolve([])); }); rendered = await builder.render(); }); describe("when navigating to preferences containing helm repositories", () => { - beforeEach(async () => { + beforeEach(() => { builder.preferences.navigate(); builder.preferences.navigation.click("kubernetes"); }); @@ -53,9 +53,9 @@ describe("remove helm repository from list of active repositories in preferences describe("when active repositories resolve", () => { beforeEach(async () => { - getActiveHelmRepositoriesMock.resolve({ - callWasSuccessful: true, - response: [{ + await getActiveHelmRepositoriesMock.resolve({ + isOk: true, + value: [{ name: "some-active-repository", url: "some-url", cacheFilePath: "/some-cache-file", @@ -106,8 +106,8 @@ describe("remove helm repository from list of active repositories in preferences ["repo", "remove", "some-active-repository"], ], { - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }, ); }); diff --git a/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts b/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts index 195396006b..8fc823f5e9 100644 --- a/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts +++ b/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts @@ -34,9 +34,9 @@ describe("New Upgrade Helm Chart Dock Tab", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { requestHelmReleaseConfigurationMock = asyncFn(); windowDi.override(requestHelmReleaseConfigurationInjectable, () => requestHelmReleaseConfigurationMock); diff --git a/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts b/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts index 98a9e54c4c..0e681a225e 100644 --- a/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts +++ b/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts @@ -46,12 +46,12 @@ describe("showing details for helm release", () => { let showCheckedErrorNotificationMock: jest.Mock; let listClusterHelmReleasesMock: AsyncFnMock; - beforeEach(() => { + beforeEach(async () => { testUsingFakeTime("2015-10-21T07:28:00Z"); builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); requestDetailedHelmReleaseMock = asyncFn(); requestHelmReleaseConfigurationMock = asyncFn(); @@ -64,7 +64,7 @@ describe("showing details for helm release", () => { showSuccessNotificationMock = jest.fn(); showCheckedErrorNotificationMock = jest.fn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(getRandomUpgradeChartTabIdInjectable, () => () => "some-tab-id"); windowDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock); windowDi.override(showCheckedErrorInjectable, () => showCheckedErrorNotificationMock); @@ -86,7 +86,7 @@ describe("showing details for helm release", () => { builder.namespaces.add("some-other-namespace"); builder.namespaces.add("some-third-namespace"); - builder.afterWindowStart(() => { + await builder.afterWindowStart(() => { builder.namespaces.select("some-namespace"); builder.namespaces.select("some-other-namespace"); }); @@ -269,8 +269,8 @@ describe("showing details for helm release", () => { describe("when details for second release resolve", () => { beforeEach(async () => { await requestDetailedHelmReleaseMock.resolve({ - callWasSuccessful: true, - response: { + isOk: true, + value: { release: toHelmRelease({ app_version: "some-app-version", chart: "some-chart-1.0.0", @@ -381,12 +381,12 @@ describe("showing details for helm release", () => { describe("when call for release resolves with error", () => { beforeEach(async () => { await requestDetailedHelmReleaseMock.resolve({ - callWasSuccessful: false, + isOk: false, error: "some-error", }); }); - it("renders", async () => { + it("renders", () => { expect(rendered.baseElement).toMatchSnapshot(); }); @@ -410,8 +410,8 @@ describe("showing details for helm release", () => { describe("when call for release resolve with release", () => { beforeEach(async () => { await requestDetailedHelmReleaseMock.resolve({ - callWasSuccessful: true, - response: { + isOk: true, + value: { release: toHelmRelease({ app_version: "some-app-version", chart: "some-chart-1.0.0", @@ -655,7 +655,7 @@ describe("showing details for helm release", () => { requestHelmReleaseConfigurationMock.mockClear(); await requestHelmReleaseUpdateMock.resolve({ - callWasSuccessful: true, + isOk: true, }); }); @@ -694,7 +694,7 @@ describe("showing details for helm release", () => { requestHelmReleaseConfigurationMock.mockClear(); await requestHelmReleaseUpdateMock.resolve({ - callWasSuccessful: false, + isOk: false, error: "some-error", }); }); diff --git a/packages/core/src/features/hotbar/storage/common/compute-display-label.injectable.ts b/packages/core/src/features/hotbar/storage/common/compute-display-label.injectable.ts index 5900563cb2..dcf4aff44a 100644 --- a/packages/core/src/features/hotbar/storage/common/compute-display-label.injectable.ts +++ b/packages/core/src/features/hotbar/storage/common/compute-display-label.injectable.ts @@ -13,7 +13,7 @@ const computeHotbarDisplayLabelInjectable = getInjectable({ instantiate: (di): ComputeHotbarDisplayLabel => { const computeDisplayIndex = di.inject(computeDisplayIndexInjectable); - return (hotbar) => `${computeDisplayIndex(hotbar.id)}: ${hotbar.name}`; + return (hotbar) => `${computeDisplayIndex(hotbar.id)}: ${hotbar.name.get()}`; }, }); diff --git a/packages/core/src/features/hotbar/storage/common/hotbar.ts b/packages/core/src/features/hotbar/storage/common/hotbar.ts index d6030b4eaf..dfe8a1bef8 100644 --- a/packages/core/src/features/hotbar/storage/common/hotbar.ts +++ b/packages/core/src/features/hotbar/storage/common/hotbar.ts @@ -151,7 +151,7 @@ export class Hotbar { this.items[emptyCellIndex] = newItem; }); } else { - broadcastMessage(hotbarTooManyItemsChannel); + void broadcastMessage(hotbarTooManyItemsChannel); } } else if (0 <= cellIndex && cellIndex < this.items.length) { runInAction(() => { diff --git a/packages/core/src/features/hotbar/storage/main/5.0.0-alpha.2.injectable.ts b/packages/core/src/features/hotbar/storage/main/5.0.0-alpha.2.injectable.ts index adf7ff4f30..db49680e4b 100644 --- a/packages/core/src/features/hotbar/storage/main/5.0.0-alpha.2.injectable.ts +++ b/packages/core/src/features/hotbar/storage/main/5.0.0-alpha.2.injectable.ts @@ -15,7 +15,7 @@ const v500Alpha2HotbarStoreMigrationInjectable = getInjectable({ version: "5.0.0-alpha.2", run(store) { const rawHotbars = store.get("hotbars"); - const hotbars: HotbarData[] = Array.isArray(rawHotbars) ? rawHotbars : []; + const hotbars = (Array.isArray(rawHotbars) ? rawHotbars : []) as HotbarData[]; store.set("hotbars", hotbars.map(({ id, ...rest }) => ({ id: id || uuid.v4(), diff --git a/packages/core/src/features/hotbar/storage/main/5.0.0-beta.10.injectable.ts b/packages/core/src/features/hotbar/storage/main/5.0.0-beta.10.injectable.ts index c192ec3382..0bc91ee02f 100644 --- a/packages/core/src/features/hotbar/storage/main/5.0.0-beta.10.injectable.ts +++ b/packages/core/src/features/hotbar/storage/main/5.0.0-beta.10.injectable.ts @@ -6,7 +6,7 @@ import * as uuid from "uuid"; import directoryForUserDataInjectable from "../../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import catalogCatalogEntityInjectable from "../../../../common/catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable"; -import { isDefined, isErrnoException } from "@k8slens/utilities"; +import { isDefined, isErrnoException, isObject } from "@k8slens/utilities"; import joinPathsInjectable from "../../../../common/path/join-paths.injectable"; import { getInjectable } from "@ogre-tools/injectable"; import { hotbarStoreMigrationInjectionToken } from "../common/migrations-token"; @@ -46,7 +46,7 @@ const v500Beta10HotbarStoreMigrationInjectable = getInjectable({ const logger = di.inject(loggerInjectionToken); const createHotbar = di.inject(createHotbarInjectable); const rawHotbars = store.get("hotbars"); - const hotbars: HotbarData[] = Array.isArray(rawHotbars) ? rawHotbars.filter(h => h && typeof h === "object") : []; + const hotbars = (Array.isArray(rawHotbars) ? rawHotbars.filter(isObject) : []) as unknown as HotbarData[]; // Hotbars might be empty, if some of the previous migrations weren't run if (hotbars.length === 0) { @@ -57,8 +57,8 @@ const v500Beta10HotbarStoreMigrationInjectable = getInjectable({ } try { - const workspaceStoreData: Pre500WorkspaceStoreModel = readJsonSync(joinPaths(userDataPath, "lens-workspace-store.json")); - const { clusters = [] }: Pre500ClusterStoreModel = readJsonSync(joinPaths(userDataPath, "lens-cluster-store.json")); + const workspaceStoreData = readJsonSync(joinPaths(userDataPath, "lens-workspace-store.json")) as Pre500WorkspaceStoreModel; + const { clusters = [] } = readJsonSync(joinPaths(userDataPath, "lens-cluster-store.json")) as Pre500ClusterStoreModel; const workspaceHotbars = new Map(); // mapping from WorkspaceId to HotBar for (const { id, name } of workspaceStoreData.workspaces) { diff --git a/packages/core/src/features/hotbar/storage/main/5.0.0-beta.5.injectable.ts b/packages/core/src/features/hotbar/storage/main/5.0.0-beta.5.injectable.ts index 75f3868d7b..2ceff9bbfe 100644 --- a/packages/core/src/features/hotbar/storage/main/5.0.0-beta.5.injectable.ts +++ b/packages/core/src/features/hotbar/storage/main/5.0.0-beta.5.injectable.ts @@ -15,7 +15,7 @@ const v500Beta5HotbarStoreMigrationInjectable = getInjectable({ run(store) { const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); const rawHotbars = store.get("hotbars"); - const hotbars: HotbarData[] = Array.isArray(rawHotbars) ? rawHotbars : []; + const hotbars = (Array.isArray(rawHotbars) ? rawHotbars : []) as HotbarData[]; for (const hotbar of hotbars) { for (let i = 0; i < hotbar.items.length; i += 1) { diff --git a/packages/core/src/features/hotbar/storage/storage-technical.test.ts b/packages/core/src/features/hotbar/storage/storage-technical.test.ts index e7a74d362a..b024809a78 100644 --- a/packages/core/src/features/hotbar/storage/storage-technical.test.ts +++ b/packages/core/src/features/hotbar/storage/storage-technical.test.ts @@ -56,7 +56,7 @@ describe("Hotbars technical tests", () => { let addHotbar: AddHotbar; let getHotbarById: GetHotbarById; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); testCluster = getMockCatalogEntity({ @@ -241,13 +241,13 @@ describe("Hotbars technical tests", () => { }); it("throws an error if getId is invalid or returns not a string", () => { - expect(() => activeHotbar.get()?.addEntity({} as any)).toThrowError(TypeError); - expect(() => activeHotbar.get()?.addEntity({ getId: () => true } as any)).toThrowError(TypeError); + expect(() => activeHotbar.get()?.addEntity({} as never)).toThrowError(TypeError); + expect(() => activeHotbar.get()?.addEntity({ getId: () => true } as never)).toThrowError(TypeError); }); it("throws an error if getName is invalid or returns not a string", () => { - expect(() => activeHotbar.get()?.addEntity({ getId: () => "" } as any)).toThrowError(TypeError); - expect(() => activeHotbar.get()?.addEntity({ getId: () => "", getName: () => 4 } as any)).toThrowError(TypeError); + expect(() => activeHotbar.get()?.addEntity({ getId: () => "" } as never)).toThrowError(TypeError); + expect(() => activeHotbar.get()?.addEntity({ getId: () => "", getName: () => 4 } as never)).toThrowError(TypeError); }); it("does nothing when item moved to same cell", () => { diff --git a/packages/core/src/features/namespaces/route-with-sub-namespaces.test.tsx b/packages/core/src/features/namespaces/route-with-sub-namespaces.test.tsx index 095b21fa12..02a6c1fff5 100644 --- a/packages/core/src/features/namespaces/route-with-sub-namespaces.test.tsx +++ b/packages/core/src/features/namespaces/route-with-sub-namespaces.test.tsx @@ -23,7 +23,7 @@ describe("namespaces route when viewed with some subNamespaces", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); builder.namespaces.add("default"); builder.namespaces.add("foobar"); @@ -32,12 +32,12 @@ describe("namespaces route when viewed with some subNamespaces", () => { requestDeleteNormalNamespaceMock = asyncFn(); requestDeleteSubNamespaceAnchorMock = asyncFn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(requestDeleteNormalNamespaceInjectable, () => requestDeleteNormalNamespaceMock); windowDi.override(requestDeleteSubNamespaceAnchorInjectable, () => requestDeleteSubNamespaceAnchorMock); }); - builder.afterWindowStart(() => { + await builder.afterWindowStart(() => { builder.allowKubeResource({ group: "", apiName: "namespaces" }); }); diff --git a/packages/core/src/features/navigate-to-extension-page.test.tsx b/packages/core/src/features/navigate-to-extension-page.test.tsx index 24f5ec729b..8b23124c0a 100644 --- a/packages/core/src/features/navigate-to-extension-page.test.tsx +++ b/packages/core/src/features/navigate-to-extension-page.test.tsx @@ -12,6 +12,9 @@ import type { IComputedValue } from "mobx"; import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder"; import type { FakeExtensionOptions } from "../renderer/components/test-utils/get-extension-fake"; import type { LensRendererExtension } from "../extensions/lens-renderer-extension"; +import { getParamsRegistration, getPageRegistration } from "../extensions/lens-renderer-extension"; +import { getPageParamDeclaration } from "../renderer/navigation/page-param"; +import type { PageRegistration } from "../renderer/routes/page-registration"; describe("navigate to extension page", () => { let rendered: RenderResult; @@ -22,7 +25,7 @@ describe("navigate to extension page", () => { beforeEach(async () => { const builder = getApplicationBuilder(); - builder.extensions.enable(extensionWithPagesHavingParameters); + await builder.extensions.enable(extensionWithPagesHavingParameters); rendered = await builder.render(); @@ -123,60 +126,61 @@ describe("navigate to extension page", () => { }); }); +const globalPageWithParams = getPageRegistration({ + components: { + Page: ({ params }) => ( +

+
    +
  • {params.someStringParameter.get()}
  • +
  • {params.someNumberParameter.get()}
  • +
  • {params.someArrayParameter.get().join(",")}
  • +
+ + +
+ ), + }, + + params: getParamsRegistration({ + someStringParameter: "some-string-value", + someNumberParameter: getPageParamDeclaration({ + defaultValue: 42, + stringify: (value) => String(value), + parse: (value) => (value ? Number(value) : undefined), + }), + someArrayParameter: getPageParamDeclaration({ + defaultValue: ["some-array-value", "some-other-array-value"], + stringify: (value) => value.join(","), + parse: (value: string[]) => (!isEmpty(value) ? value : undefined), + }), + }), +}); const extensionWithPagesHavingParameters: FakeExtensionOptions = { id: "some-extension-id", name: "some-extension-name", rendererOptions: { globalPages: [ - { - components: { - Page: ({ params }) => ( -
-
    -
  • {params.someStringParameter.get()}
  • -
  • {params.someNumberParameter.get()}
  • -
  • {params.someArrayParameter.get().join(",")}
  • -
- - -
- ), - }, - - params: { - someStringParameter: "some-string-value", - someNumberParameter: { - defaultValue: 42, - stringify: (value) => value.toString(), - parse: (value) => (value ? Number(value) : undefined), - }, - someArrayParameter: { - defaultValue: ["some-array-value", "some-other-array-value"], - stringify: (value) => value.join(","), - parse: (value: string[]) => (!isEmpty(value) ? value : undefined), - }, - }, - }, + globalPageWithParams, { id: "some-child-page-id", components: { Page: () =>
Child page
, }, }, - ], + ] as PageRegistration[], }, }; diff --git a/packages/core/src/features/navigating-between-routes.test.tsx b/packages/core/src/features/navigating-between-routes.test.tsx index 03fd34e26b..2d23de46b4 100644 --- a/packages/core/src/features/navigating-between-routes.test.tsx +++ b/packages/core/src/features/navigating-between-routes.test.tsx @@ -23,7 +23,7 @@ describe("navigating between routes", () => { let rendered: RenderResult; let builder: ApplicationBuilder; - beforeEach(async () => { + beforeEach(() => { builder = getApplicationBuilder(); }); @@ -31,7 +31,7 @@ describe("navigating between routes", () => { let windowDi: DiContainer; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(testRouteWithoutPathParametersInjectable); windowDi.register(testRouteWithoutPathParametersComponentInjectable); @@ -107,7 +107,7 @@ describe("navigating between routes", () => { let windowDi: DiContainer; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register(routeWithOptionalPathParametersInjectable); windowDi.register(routeWithOptionalPathParametersComponentInjectable); @@ -120,7 +120,10 @@ describe("navigating between routes", () => { }); describe("when navigating to route with path parameters", () => { - let route: Route; + let route: Route<{ + someParameter?: string | undefined; + someOtherParameter?: string | undefined; + }>; beforeEach(() => { route = windowDi.inject(routeWithOptionalPathParametersInjectable); @@ -164,7 +167,10 @@ describe("navigating between routes", () => { }); describe("when navigating to route without path parameters", () => { - let route: Route; + let route: Route<{ + someParameter?: string | undefined; + someOtherParameter?: string | undefined; + }>; beforeEach(() => { route = windowDi.inject(routeWithOptionalPathParametersInjectable); @@ -202,7 +208,7 @@ const testRouteWithoutPathParametersInjectable = getInjectable({ id: "some-route", injectionToken: frontEndRouteInjectionToken, - instantiate: () => ({ + instantiate: (): Route => ({ path: "/some-path", clusterFrame: false, isEnabled: computed(() => true), diff --git a/packages/core/src/features/persistent-storage/common/create.injectable.ts b/packages/core/src/features/persistent-storage/common/create.injectable.ts index 3c2a244711..20bb9a35ef 100644 --- a/packages/core/src/features/persistent-storage/common/create.injectable.ts +++ b/packages/core/src/features/persistent-storage/common/create.injectable.ts @@ -44,7 +44,7 @@ export interface PersistentStorageParams extends Omit): void; + fromStore: (data: Partial) => void; /** * toJSON is called when syncing the store to the filesystem. It should @@ -53,7 +53,7 @@ export interface PersistentStorageParams extends Omit T; } export type CreatePersistentStorage = (params: PersistentStorageParams) => PersistentStorage; diff --git a/packages/core/src/features/persistent-storage/common/migrations.injectable.ts b/packages/core/src/features/persistent-storage/common/migrations.injectable.ts index ed3f400665..d96b1fb055 100644 --- a/packages/core/src/features/persistent-storage/common/migrations.injectable.ts +++ b/packages/core/src/features/persistent-storage/common/migrations.injectable.ts @@ -7,7 +7,7 @@ import { lifecycleEnum, getInjectable } from "@ogre-tools/injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import { getOrInsert, iter, object } from "@k8slens/utilities"; -export type AllowedSetValue = T extends (...args: any[]) => any +export type AllowedSetValue = T extends (...args: unknown[]) => unknown ? never : T extends undefined | symbol ? never @@ -26,7 +26,7 @@ export type Migrations = Partial void> export interface MigrationDeclaration { version: string; - run(store: MigrationStore): void; + run: (store: MigrationStore) => void; } const persistentStorageMigrationsInjectable = getInjectable({ diff --git a/packages/core/src/features/pod-logs/download-logs.test.tsx b/packages/core/src/features/pod-logs/download-logs.test.tsx index 8bc95f78f5..e488cfa942 100644 --- a/packages/core/src/features/pod-logs/download-logs.test.tsx +++ b/packages/core/src/features/pod-logs/download-logs.test.tsx @@ -51,13 +51,13 @@ describe("download logs options in logs dock tab", () => { builder = getApplicationBuilder(); - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); callForLogsMock = jest.fn(); getLogsMock = jest.fn(); getSplitLogsMock = jest.fn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(callForLogsInjectable, () => callForLogsMock); // Overriding internals of logsViewModelInjectable diff --git a/packages/core/src/features/population-of-logs-to-a-file/main/ipc-file-logger.test.ts b/packages/core/src/features/population-of-logs-to-a-file/main/ipc-file-logger.test.ts index f7ab5d813d..8372fd9842 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/main/ipc-file-logger.test.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/main/ipc-file-logger.test.ts @@ -87,7 +87,8 @@ describe("ipc file logger in main", () => { fileId: "some-log-file", entry: { level: "irrelevant", message: "some-log-message" }, }); - expect(logMock.mock.calls[0][0]).toEqual({ + expect(logMock).toHaveBeenCalledTimes(1); + expect(logMock).toBeCalledWith({ level: "irrelevant", message: "some-log-message", }); @@ -95,7 +96,7 @@ describe("ipc file logger in main", () => { it("logs to correct files", () => { const someLogMock = jest.fn(); - const someOthertLogMock = jest.fn(); + const someOtherLogMock = jest.fn(); createFileTransportMock.mockImplementation((fileId: string) => { if (fileId === "some-log-file") { @@ -103,7 +104,7 @@ describe("ipc file logger in main", () => { } if (fileId === "some-other-log-file") { - return { log: someOthertLogMock }; + return { log: someOtherLogMock }; } return null; @@ -119,12 +120,12 @@ describe("ipc file logger in main", () => { }); expect(someLogMock).toHaveBeenCalledTimes(1); - expect(someLogMock.mock.calls[0][0]).toEqual({ + expect(someLogMock).toBeCalledWith({ level: "irrelevant", message: "some-log-message", }); - expect(someOthertLogMock).toHaveBeenCalledTimes(1); - expect(someOthertLogMock.mock.calls[0][0]).toEqual({ + expect(someOtherLogMock).toHaveBeenCalledTimes(1); + expect(someOtherLogMock).toBeCalledWith({ level: "irrelevant", message: "some-other-log-message", }); diff --git a/packages/core/src/features/population-of-logs-to-a-file/population-of-logs-to-a-file.test.ts b/packages/core/src/features/population-of-logs-to-a-file/population-of-logs-to-a-file.test.ts index 2bfa579c34..990f08c3c5 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/population-of-logs-to-a-file.test.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/population-of-logs-to-a-file.test.ts @@ -18,7 +18,7 @@ import { runInAction } from "mobx"; describe("Population of logs to a file", () => { let builder: ApplicationBuilder; let windowDi: DiContainer; - let logWarningInRenderer: (message: string, ...args: any) => void; + let logWarningInRenderer: (message: string, ...args: unknown[]) => void; let frameSpecificWinstonLogInMainMock: jest.Mock; let frameSpecificCloseLogInMainMock: jest.Mock; @@ -32,13 +32,13 @@ describe("Population of logs to a file", () => { builder = getApplicationBuilder(); if (isClusterFrame) { - builder.setEnvironmentToClusterFrame(); + await builder.setEnvironmentToClusterFrame(); } frameSpecificWinstonLogInMainMock = jest.fn(); frameSpecificCloseLogInMainMock = jest.fn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override( createIpcFileLoggerTransportInjectable, () => (fileId: string) => @@ -51,7 +51,7 @@ describe("Population of logs to a file", () => { ); }); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.unoverride(winstonLoggerInjectable); // Now that we have the actual winston logger in use, let's not be noisy and deregister console transport @@ -82,7 +82,7 @@ describe("Population of logs to a file", () => { }); }); - it("when logging a warning in renderer, writes to frame specific Winston log", async () => { + it("when logging a warning in renderer, writes to frame specific Winston log", () => { logWarningInRenderer("some-warning"); expect(frameSpecificWinstonLogInMainMock).toHaveBeenCalledWith( { @@ -116,7 +116,7 @@ describe("Population of logs to a file", () => { }); }); - it("when logging a warning in renderer, writes to frame specific Winston log", async () => { + it("when logging a warning in renderer, writes to frame specific Winston log", () => { logWarningInRenderer("some-warning"); expect(frameSpecificWinstonLogInMainMock).toHaveBeenCalledWith( { diff --git a/packages/core/src/features/population-of-logs-to-a-file/renderer/close-renderer-log-file-id.test.ts b/packages/core/src/features/population-of-logs-to-a-file/renderer/close-renderer-log-file-id.test.ts index b6815732ae..ca6386a1bc 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/renderer/close-renderer-log-file-id.test.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/renderer/close-renderer-log-file-id.test.ts @@ -24,7 +24,7 @@ describe("close renderer file logging", () => { sendIpcMock = jest.fn(); winstonMock = { remove: jest.fn(), - } as any as winston.Logger; + } as unknown as winston.Logger; ipcTransportMock = { name: "ipc-renderer-transport" } as IpcLogTransport; di.override(winstonLoggerInjectable, () => winstonMock); diff --git a/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.injectable.ts b/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.injectable.ts index ef75f17a6d..24755ceb58 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.injectable.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.injectable.ts @@ -16,6 +16,10 @@ import { import rendererLogFileIdInjectable from "./renderer-log-file-id.injectable"; import { sendMessageToChannelInjectionToken } from "@k8slens/messaging"; +interface LogEntry extends winston.LogEntry { + [MESSAGE]: string; +} + /** * Winston uses symbol property for the actual message. * @@ -23,14 +27,14 @@ import { sendMessageToChannelInjectionToken } from "@k8slens/messaging"; */ function serializeLogForIpc( fileId: string, - entry: winston.LogEntry, + entry: LogEntry, ): IpcFileLogObject { return { fileId, entry: { level: entry.level, message: entry.message, - internalMessage: Object.getOwnPropertyDescriptor(entry, MESSAGE)?.value, + internalMessage: entry[MESSAGE], }, }; } @@ -42,7 +46,7 @@ const ipcLogTransportInjectable = getInjectable({ const fileId = di.inject(rendererLogFileIdInjectable); return new IpcLogTransport({ - sendIpcLogMessage: (entry) => + sendIpcLogMessage: (entry: LogEntry) => messageToChannel( ipcFileLoggerChannel, serializeLogForIpc(fileId, entry), diff --git a/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.ts b/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.ts index a1f6fa819e..983eda233a 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/renderer/ipc-transport.ts @@ -2,9 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { LogEntry } from "winston"; +import type winston from "winston"; import type { TransportStreamOptions } from "winston-transport"; import TransportStream from "winston-transport"; +import type { MESSAGE } from "triple-beam"; + +interface LogEntry extends winston.LogEntry { + [MESSAGE]: string; +} interface IpcLogTransportOptions extends TransportStreamOptions { sendIpcLogMessage: (entry: LogEntry) => void; diff --git a/packages/core/src/features/population-of-logs-to-a-file/renderer/renderer-log-file-id.injectable.ts b/packages/core/src/features/population-of-logs-to-a-file/renderer/renderer-log-file-id.injectable.ts index c575f48774..310095dcd0 100644 --- a/packages/core/src/features/population-of-logs-to-a-file/renderer/renderer-log-file-id.injectable.ts +++ b/packages/core/src/features/population-of-logs-to-a-file/renderer/renderer-log-file-id.injectable.ts @@ -12,11 +12,10 @@ const rendererLogFileIdInjectable = getInjectable({ instantiate: (di) => { let frameId: string; const currentlyInClusterFrame = di.inject(currentlyInClusterFrameInjectable); + const { host } = di.inject(windowLocationInjectable); + const clusterId = getClusterIdFromHost(host); - if (currentlyInClusterFrame) { - const { host } = di.inject(windowLocationInjectable); - const clusterId = getClusterIdFromHost(host); - + if (currentlyInClusterFrame && clusterId) { frameId = `cluster-${clusterId}`; } else { frameId = "root"; diff --git a/packages/core/src/features/preferences/child-features/tray/main/open-preferences/open-preferences-tray-item.injectable.ts b/packages/core/src/features/preferences/child-features/tray/main/open-preferences/open-preferences-tray-item.injectable.ts index 4d7c6f66ec..d707a088cd 100644 --- a/packages/core/src/features/preferences/child-features/tray/main/open-preferences/open-preferences-tray-item.injectable.ts +++ b/packages/core/src/features/preferences/child-features/tray/main/open-preferences/open-preferences-tray-item.injectable.ts @@ -27,12 +27,8 @@ const openPreferencesTrayItemInjectable = getInjectable({ click: pipeline( navigateToPreferences, - withErrorLoggingFor(() => "[TRAY]: Opening of preferences failed."), - - // TODO: Find out how to improve typing so that instead of - // x => withErrorSuppression(x) there could only be withErrorSuppression - (x) => withErrorSuppression(x), + withErrorSuppression, ), }; }, diff --git a/packages/core/src/features/preferences/closing-preferences.test.tsx b/packages/core/src/features/preferences/closing-preferences.test.tsx index c5bfee1515..78a840d5f4 100644 --- a/packages/core/src/features/preferences/closing-preferences.test.tsx +++ b/packages/core/src/features/preferences/closing-preferences.test.tsx @@ -25,7 +25,7 @@ describe("preferences - closing-preferences", () => { beforeEach(() => { builder = getApplicationBuilder(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { runInAction(() => { windowDi.register( testPreferenceTabInjectable, @@ -53,7 +53,7 @@ describe("preferences - closing-preferences", () => { let windowDi: DiContainer; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(observableHistoryInjectionToken, () => { const historyFake = createMemoryHistory({ initialEntries: ["/some-page"], @@ -134,7 +134,7 @@ describe("preferences - closing-preferences", () => { let windowDi: DiContainer; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(observableHistoryInjectionToken, () => { const historyFake = createMemoryHistory({ initialEntries: ["/preferences/app"], diff --git a/packages/core/src/features/preferences/extension-adding-preference-tabs.test.tsx b/packages/core/src/features/preferences/extension-adding-preference-tabs.test.tsx index 4631a6415d..7437e2b12a 100644 --- a/packages/core/src/features/preferences/extension-adding-preference-tabs.test.tsx +++ b/packages/core/src/features/preferences/extension-adding-preference-tabs.test.tsx @@ -91,7 +91,7 @@ describe("preferences: extension adding preference tabs", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("renders", () => { diff --git a/packages/core/src/features/preferences/navigation-to-application-preferences.test.tsx b/packages/core/src/features/preferences/navigation-to-application-preferences.test.tsx index 47673b4637..46476dc7f8 100644 --- a/packages/core/src/features/preferences/navigation-to-application-preferences.test.tsx +++ b/packages/core/src/features/preferences/navigation-to-application-preferences.test.tsx @@ -23,7 +23,7 @@ describe("preferences - navigation to application preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeWindowStart(() => { + await builder.beforeWindowStart(() => { builder.preferences.navigate(); }); @@ -47,7 +47,7 @@ describe("preferences - navigation to application preferences", () => { describe("when extension with application preference items gets enabled", () => { beforeEach(() => { - builder.extensions.enable( + await builder.extensions.enable( extensionStubWithApplicationPreferenceItems, ); }); @@ -70,7 +70,7 @@ describe("preferences - navigation to application preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { const navigateToProxyPreferences = windowDi.inject(navigateToProxyPreferencesInjectable); navigateToProxyPreferences(); diff --git a/packages/core/src/features/preferences/navigation-to-editor-preferences.test.ts b/packages/core/src/features/preferences/navigation-to-editor-preferences.test.ts index 51f93afa3f..b3d82c0591 100644 --- a/packages/core/src/features/preferences/navigation-to-editor-preferences.test.ts +++ b/packages/core/src/features/preferences/navigation-to-editor-preferences.test.ts @@ -9,22 +9,22 @@ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; describe("preferences - navigation to editor preferences", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let discover: Discover; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); }); describe("given in preferences, when rendered", () => { let rendered: RenderResult; beforeEach(async () => { - applicationBuilder.beforeWindowStart(() => { - applicationBuilder.preferences.navigate(); + await builder.beforeWindowStart(() => { + builder.preferences.navigate(); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); discover = discoverFor(() => rendered); }); @@ -43,7 +43,7 @@ describe("preferences - navigation to editor preferences", () => { describe("when navigating to editor preferences using navigation", () => { beforeEach(() => { - applicationBuilder.preferences.navigation.click("editor"); + builder.preferences.navigation.click("editor"); }); it("renders", () => { diff --git a/packages/core/src/features/preferences/navigation-to-extension-specific-preferences.test.tsx b/packages/core/src/features/preferences/navigation-to-extension-specific-preferences.test.tsx index e7a04a4b04..397baa0506 100644 --- a/packages/core/src/features/preferences/navigation-to-extension-specific-preferences.test.tsx +++ b/packages/core/src/features/preferences/navigation-to-extension-specific-preferences.test.tsx @@ -11,6 +11,7 @@ import type { FakeExtensionOptions } from "../../renderer/components/test-utils/ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; import logErrorInjectable from "../../common/log-error.injectable"; +import { anyString } from "jest-mock-extended"; describe("preferences - navigation to extension specific preferences", () => { let builder: ApplicationBuilder; @@ -27,7 +28,7 @@ describe("preferences - navigation to extension specific preferences", () => { beforeEach(async () => { logErrorMock = jest.fn(); - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(logErrorInjectable, () => logErrorMock); builder.preferences.navigate(); @@ -59,8 +60,8 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("given multiple extensions with specific preferences, when navigating to extension specific preferences page", () => { - beforeEach(() => { - builder.extensions.enable( + beforeEach(async () => { + await builder.extensions.enable( extensionStubWithExtensionSpecificPreferenceItems, someOtherExtensionStubWithExtensionSpecificPreferenceItems, ); @@ -94,8 +95,8 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("given multiple extensions with and without specific preferences", () => { - beforeEach(() => { - builder.extensions.enable( + beforeEach(async () => { + await builder.extensions.enable( extensionStubWithExtensionSpecificPreferenceItems, extensionStubWithoutPreferences, extensionStubWithShowInPreferencesTab, @@ -116,8 +117,8 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("when extension with specific preferences is enabled", () => { - beforeEach(() => { - builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems); + beforeEach(async () => { + await builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems); }); it("renders", () => { @@ -167,8 +168,8 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("when extension is disabled", () => { - beforeEach(() => { - builder.extensions.disable(extensionStubWithExtensionSpecificPreferenceItems); + beforeEach(async () => { + await builder.extensions.disable(extensionStubWithExtensionSpecificPreferenceItems); }); it("renders", () => { @@ -181,8 +182,8 @@ describe("preferences - navigation to extension specific preferences", () => { expect(discovered).toBeNull(); }); - it("when extension is enabled again, shows the preference page", () => { - builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems); + it("when extension is enabled again, shows the preference page", async () => { + await builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems); const { discovered } = discover.getSingleElement( "preference-page", @@ -196,16 +197,12 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("given extension with registered tab", () => { - beforeEach(() => { - builder.extensions.enable(extensionStubWithRegisteredTab); + beforeEach(async () => { + await builder.extensions.enable(extensionStubWithRegisteredTab); }); it("logs error", () => { - expect( - logErrorMock.mock.calls[0][0].startsWith( - "Tried to create preferences, but encountered references to unknown ids", - ), - ).toBe(true); + expect(logErrorMock).toBeCalledWith(anyString("Tried to create preferences, but encountered references to unknown ids")); }); it("renders", () => { @@ -264,8 +261,8 @@ describe("preferences - navigation to extension specific preferences", () => { }); describe("given extensions with tabs having same id", () => { - beforeEach(() => { - builder.extensions.enable( + beforeEach(async () => { + await builder.extensions.enable( extensionStubWithRegisteredTab, extensionStubWithSameRegisteredTab, ); diff --git a/packages/core/src/features/preferences/navigation-to-kubernetes-preferences.test.ts b/packages/core/src/features/preferences/navigation-to-kubernetes-preferences.test.ts index 06c1fda87e..90b54ad496 100644 --- a/packages/core/src/features/preferences/navigation-to-kubernetes-preferences.test.ts +++ b/packages/core/src/features/preferences/navigation-to-kubernetes-preferences.test.ts @@ -22,18 +22,18 @@ describe("preferences - navigation to kubernetes preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override( getActiveHelmRepositoriesInjectable, - () => async () => ({ callWasSuccessful: true, response: [] }), + () => () => Promise.resolve(({ isOk: true, value: [] })), ); }); - builder.beforeWindowStart(({ windowDi }) => { - windowDi.override(requestPublicHelmRepositoriesInjectable, () => async () => []); + await builder.beforeWindowStart(({ windowDi }) => { + windowDi.override(requestPublicHelmRepositoriesInjectable, () => () => Promise.resolve([])); }); - builder.beforeWindowStart(() => { + await builder.beforeWindowStart(() => { builder.preferences.navigate(); }); diff --git a/packages/core/src/features/preferences/navigation-to-proxy-preferences.test.ts b/packages/core/src/features/preferences/navigation-to-proxy-preferences.test.ts index fa22e15d17..8a1686dad2 100644 --- a/packages/core/src/features/preferences/navigation-to-proxy-preferences.test.ts +++ b/packages/core/src/features/preferences/navigation-to-proxy-preferences.test.ts @@ -9,10 +9,10 @@ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; describe("preferences - navigation to proxy preferences", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); }); describe("given in preferences, when rendered", () => { @@ -20,11 +20,11 @@ describe("preferences - navigation to proxy preferences", () => { let discover: Discover; beforeEach(async () => { - applicationBuilder.beforeWindowStart(() => { - applicationBuilder.preferences.navigate(); + await builder.beforeWindowStart(() => { + builder.preferences.navigate(); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); discover = discoverFor(() => rendered); }); @@ -43,7 +43,7 @@ describe("preferences - navigation to proxy preferences", () => { describe("when navigating to proxy preferences using navigation", () => { beforeEach(() => { - applicationBuilder.preferences.navigation.click("proxy"); + builder.preferences.navigation.click("proxy"); }); it("renders", () => { diff --git a/packages/core/src/features/preferences/navigation-to-telemetry-preferences.test.tsx b/packages/core/src/features/preferences/navigation-to-telemetry-preferences.test.tsx index ce8158cc4c..51c3903e0a 100644 --- a/packages/core/src/features/preferences/navigation-to-telemetry-preferences.test.tsx +++ b/packages/core/src/features/preferences/navigation-to-telemetry-preferences.test.tsx @@ -24,7 +24,7 @@ describe("preferences - navigation to telemetry preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeWindowStart(() => { + await builder.beforeWindowStart(() => { builder.preferences.navigate(); }); @@ -57,7 +57,7 @@ describe("preferences - navigation to telemetry preferences", () => { describe("when extension with telemetry preference items gets enabled", () => { beforeEach(() => { - builder.extensions.enable( + await builder.extensions.enable( extensionStubWithTelemetryPreferenceItems, ); }); @@ -105,7 +105,7 @@ describe("preferences - navigation to telemetry preferences", () => { }); it("given extensions but no telemetry preference items, does not show link for telemetry preferences", () => { - builder.extensions.enable({ + await builder.extensions.enable({ id: "some-test-extension-id", name: "some-test-extension-name", @@ -142,7 +142,7 @@ describe("preferences - navigation to telemetry preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(sentryDataSourceNameInjectable, () => "some-sentry-dns-url"); }); @@ -177,7 +177,7 @@ describe("preferences - navigation to telemetry preferences", () => { let discover: Discover; beforeEach(async () => { - builder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(sentryDataSourceNameInjectable, () => null); }); diff --git a/packages/core/src/features/preferences/navigation-to-terminal-preferences.test.ts b/packages/core/src/features/preferences/navigation-to-terminal-preferences.test.ts index 1542659d17..5869bbb2b0 100644 --- a/packages/core/src/features/preferences/navigation-to-terminal-preferences.test.ts +++ b/packages/core/src/features/preferences/navigation-to-terminal-preferences.test.ts @@ -9,10 +9,10 @@ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; describe("preferences - navigation to terminal preferences", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); }); describe("given in preferences, when rendered", () => { @@ -20,11 +20,11 @@ describe("preferences - navigation to terminal preferences", () => { let discover: Discover; beforeEach(async () => { - applicationBuilder.beforeWindowStart(() => { - applicationBuilder.preferences.navigate(); + await builder.beforeWindowStart(() => { + builder.preferences.navigate(); }); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); discover = discoverFor(() => rendered); }); @@ -44,7 +44,7 @@ describe("preferences - navigation to terminal preferences", () => { describe("when navigating to terminal preferences using navigation", () => { beforeEach(() => { - applicationBuilder.preferences.navigation.click("terminal"); + builder.preferences.navigation.click("terminal"); }); it("renders", () => { diff --git a/packages/core/src/features/preferences/navigation-using-application-menu.test.ts b/packages/core/src/features/preferences/navigation-using-application-menu.test.ts index 020bc25259..73d5ac7a84 100644 --- a/packages/core/src/features/preferences/navigation-using-application-menu.test.ts +++ b/packages/core/src/features/preferences/navigation-using-application-menu.test.ts @@ -10,14 +10,14 @@ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; describe("preferences - navigation using application menu", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; let discover: Discover; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); discover = discoverFor(() => rendered); }); @@ -36,7 +36,7 @@ describe("preferences - navigation using application menu", () => { describe("when navigating to preferences using application menu", () => { beforeEach(() => { - applicationBuilder.applicationMenu.click( + builder.applicationMenu.click( "root", "mac", "navigate-to-preferences", diff --git a/packages/core/src/features/preferences/navigation-using-tray.test.ts b/packages/core/src/features/preferences/navigation-using-tray.test.ts index 63d2bd5290..cab48d5145 100644 --- a/packages/core/src/features/preferences/navigation-using-tray.test.ts +++ b/packages/core/src/features/preferences/navigation-using-tray.test.ts @@ -9,14 +9,14 @@ import type { Discover } from "@k8slens/react-testing-library-discovery"; import { discoverFor } from "@k8slens/react-testing-library-discovery"; describe("show-about-using-tray", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; let discover: Discover; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); discover = discoverFor(() => rendered); }); @@ -34,8 +34,8 @@ describe("show-about-using-tray", () => { }); describe("when navigating using tray", () => { - beforeEach(async () => { - await applicationBuilder.tray.click("open-preferences"); + beforeEach(() => { + builder.tray.click("open-preferences"); }); it("renders", () => { diff --git a/packages/core/src/features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration.ts b/packages/core/src/features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration.ts index 4c76722dd5..97a8b4fc85 100644 --- a/packages/core/src/features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration.ts +++ b/packages/core/src/features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration.ts @@ -6,8 +6,8 @@ import type React from "react"; export interface AppPreferenceComponents { - Hint: React.ComponentType; - Input: React.ComponentType; + Hint: React.ComponentType>; + Input: React.ComponentType>; } export interface AppPreferenceRegistration { diff --git a/packages/core/src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts b/packages/core/src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts index 3222ccd555..9785abfa43 100644 --- a/packages/core/src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts +++ b/packages/core/src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts @@ -35,7 +35,7 @@ const discoverKubeconfigSyncKindInjectable = getInjectable({ return [path, { type: "unknown" }]; } catch (error) { - logger.warn(`[KUBECONFIG-SYNCS]: failed to stat entry: ${error}`, { error }); + logger.warn(`[KUBECONFIG-SYNCS]: failed to stat entry: ${String(error)}`, { error }); return [path, { type: "unknown" }]; } diff --git a/packages/core/src/features/preferences/renderer/removable-item/removable-item.tsx b/packages/core/src/features/preferences/renderer/removable-item/removable-item.tsx index 4aa2a04202..b20f81fc5a 100644 --- a/packages/core/src/features/preferences/renderer/removable-item/removable-item.tsx +++ b/packages/core/src/features/preferences/renderer/removable-item/removable-item.tsx @@ -10,7 +10,7 @@ import React from "react"; import { cssNames } from "@k8slens/utilities"; import { Icon } from "@k8slens/icon"; -export interface RemovableItemProps extends DOMAttributes{ +export interface RemovableItemProps extends DOMAttributes{ icon?: string; onRemove: () => void; className?: string; diff --git a/packages/core/src/features/preferences/urls-of-legacy-extensions.test.tsx b/packages/core/src/features/preferences/urls-of-legacy-extensions.test.tsx index 4b04e5500f..fc13cb8f99 100644 --- a/packages/core/src/features/preferences/urls-of-legacy-extensions.test.tsx +++ b/packages/core/src/features/preferences/urls-of-legacy-extensions.test.tsx @@ -73,7 +73,7 @@ describe("preferences: URLs of legacy extensions", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); navigate = builder.applicationWindow.only.di.inject(navigateInjectable); }); @@ -162,7 +162,7 @@ describe("preferences: URLs of legacy extensions", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); navigate = builder.applicationWindow.only.di.inject(navigateInjectable); }); @@ -258,7 +258,7 @@ describe("preferences: URLs of legacy extensions", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); navigate = builder.applicationWindow.only.di.inject(navigateInjectable); }); diff --git a/packages/core/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts b/packages/core/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts index 4c6fc62571..d1f86a559b 100644 --- a/packages/core/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts +++ b/packages/core/src/features/quitting-and-restarting-the-app/opening-application-window-using-tray.test.ts @@ -32,7 +32,7 @@ describe("opening application window using tray", () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(focusApplicationInjectable, () => focusApplicationMock); mainDi.override( @@ -48,7 +48,7 @@ describe("opening application window using tray", () => { .fn(callForApplicationWindowHtmlMock) .mockImplementationOnce(() => Promise.resolve()); - createElectronWindowMock = jest.fn((toBeDecorated): CreateElectronWindow => (configuration) => { + createElectronWindowMock = jest.fn((toBeDecorated: CreateElectronWindow): CreateElectronWindow => (configuration) => { const browserWindow = toBeDecorated(configuration); if (configuration.id === "splash") { @@ -63,7 +63,8 @@ describe("opening application window using tray", () => { }); runInAction(() => { - (mainDi as any).decorateFunction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/ban-types + (mainDi as unknown as { decorateFunction: Function }).decorateFunction( createElectronWindowInjectable, createElectronWindowMock, ); diff --git a/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts b/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts index 337b801e66..de2650ea4e 100644 --- a/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts +++ b/packages/core/src/features/quitting-and-restarting-the-app/quitting-the-app-using-application-menu.test.ts @@ -18,7 +18,7 @@ describe("quitting the app using application menu", () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { requestQuitOfAppMock = jest.fn(); mainDi.override(requestQuitOfAppInjectable, () => requestQuitOfAppMock); }); diff --git a/packages/core/src/features/resolve-system-proxy/resolve-system-proxy.test.ts b/packages/core/src/features/resolve-system-proxy/resolve-system-proxy.test.ts index 08ab6d504a..ae16118007 100644 --- a/packages/core/src/features/resolve-system-proxy/resolve-system-proxy.test.ts +++ b/packages/core/src/features/resolve-system-proxy/resolve-system-proxy.test.ts @@ -21,7 +21,7 @@ describe("resolve-system-proxy", () => { resolveSystemProxyFromElectronMock = asyncFn(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override( resolveSystemProxyFromElectronInjectable, () => resolveSystemProxyFromElectronMock, @@ -32,10 +32,8 @@ describe("resolve-system-proxy", () => { }); describe("given in main, when called with URL", () => { - beforeEach(async () => { - const resolveSystemProxyInMain = builder.mainDi.inject( - resolveSystemProxyInjectionToken, - ); + beforeEach(() => { + const resolveSystemProxyInMain = builder.mainDi.inject(resolveSystemProxyInjectionToken); actualPromise = resolveSystemProxyInMain("some-url"); }); @@ -51,19 +49,17 @@ describe("resolve-system-proxy", () => { }); it("when the call for proxy resolves, resolves with the proxy", async () => { - resolveSystemProxyFromElectronMock.resolve("some-proxy"); + await resolveSystemProxyFromElectronMock.resolve("some-proxy"); expect(await actualPromise).toBe("some-proxy"); }); }); describe("given in renderer, when called with URL", () => { - beforeEach(async () => { + beforeEach(() => { const windowDi = builder.applicationWindow.only.di; - const resolveSystemProxyInRenderer = windowDi.inject( - resolveSystemProxyInjectionToken, - ); + const resolveSystemProxyInRenderer = windowDi.inject(resolveSystemProxyInjectionToken); actualPromise = resolveSystemProxyInRenderer("some-url"); }); @@ -79,7 +75,7 @@ describe("resolve-system-proxy", () => { }); it("when the call for proxy resolves, resolves with the proxy", async () => { - resolveSystemProxyFromElectronMock.resolve("some-proxy"); + await resolveSystemProxyFromElectronMock.resolve("some-proxy"); expect(await actualPromise).toBe("some-proxy"); }); diff --git a/packages/core/src/features/routes/extension-api/reactively-disable-global-pages.test.tsx b/packages/core/src/features/routes/extension-api/reactively-disable-global-pages.test.tsx index deb4015480..5dd539b4fb 100644 --- a/packages/core/src/features/routes/extension-api/reactively-disable-global-pages.test.tsx +++ b/packages/core/src/features/routes/extension-api/reactively-disable-global-pages.test.tsx @@ -38,7 +38,7 @@ describe("reactively disable global pages", () => { rendered = await builder.render(); - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); rendererTestExtension = builder.extensions.get("test-extension-id").applicationWindows.only; }); diff --git a/packages/core/src/features/shell-sync/main/compute-shell-environment.global-override-for-injectable.ts b/packages/core/src/features/shell-sync/main/compute-shell-environment.global-override-for-injectable.ts index 9e19022f87..232e0a8f11 100644 --- a/packages/core/src/features/shell-sync/main/compute-shell-environment.global-override-for-injectable.ts +++ b/packages/core/src/features/shell-sync/main/compute-shell-environment.global-override-for-injectable.ts @@ -6,6 +6,6 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import computeShellEnvironmentInjectable from "./compute-shell-environment.injectable"; -export default getGlobalOverride(computeShellEnvironmentInjectable, () => async () => ({ - callWasSuccessful: true, -})); +export default getGlobalOverride(computeShellEnvironmentInjectable, () => () => Promise.resolve(({ + isOk: true, +}))); diff --git a/packages/core/src/features/shell-sync/main/compute-shell-environment.injectable.ts b/packages/core/src/features/shell-sync/main/compute-shell-environment.injectable.ts index 36aa385d01..1692f1adb0 100644 --- a/packages/core/src/features/shell-sync/main/compute-shell-environment.injectable.ts +++ b/packages/core/src/features/shell-sync/main/compute-shell-environment.injectable.ts @@ -18,9 +18,9 @@ const computeShellEnvironmentInjectable = getInjectable({ const computeUnixShellEnvironment = di.inject(computeUnixShellEnvironmentInjectable); if (isWindows) { - return async () => ({ - callWasSuccessful: true, - response: undefined, + return () => Promise.resolve({ + isOk: true, + value: undefined, }); } @@ -31,13 +31,13 @@ const computeShellEnvironmentInjectable = getInjectable({ clearTimeout(timeoutHandle); - if (result.callWasSuccessful) { + if (result.isOk) { return result; } if (controller.signal.aborted) { return { - callWasSuccessful: false, + isOk: false, error: `Resolving shell environment is taking very long. Please review your shell configuration: ${result.error}`, }; } diff --git a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.global-override-for-injectable.ts b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.global-override-for-injectable.ts index b923d35d5c..3be63127cb 100644 --- a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.global-override-for-injectable.ts +++ b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.global-override-for-injectable.ts @@ -6,6 +6,6 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import computeUnixShellEnvironmentInjectable from "./compute-unix-shell-environment.injectable"; -export default getGlobalOverride(computeUnixShellEnvironmentInjectable, () => async () => { - throw new Error("Tried to get unix shell env without override"); -}); +export default getGlobalOverride(computeUnixShellEnvironmentInjectable, () => () => Promise.reject( + new Error("Tried to get unix shell env without override"), +)); diff --git a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.injectable.ts b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.injectable.ts index 9f42c45937..d96be6d117 100644 --- a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.injectable.ts +++ b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.injectable.ts @@ -123,18 +123,18 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ return JSON.stringify(context, null, 4); }; - shellProcess.stdout.on("data", b => stdout.push(b)); - shellProcess.stderr.on("data", b => stderr.push(b)); + shellProcess.stdout.on("data", (b: Buffer) => stdout.push(b)); + shellProcess.stderr.on("data", (b: Buffer) => stderr.push(b)); shellProcess.on("error", (error) => { if (opts.signal.aborted) { resolve({ - callWasSuccessful: false, + isOk: false, error: `timeout: ${getErrorContext()}`, }); } else { resolve({ - callWasSuccessful: false, + isOk: false, error: `Failed to spawn ${shellPath}: ${getErrorContext({ error: String(error) })}`, }); } @@ -142,7 +142,7 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ shellProcess.on("close", (code, signal) => { if (code || signal) { return resolve({ - callWasSuccessful: false, + isOk: false, error: `Shell did not exit successfully: ${getErrorContext({ code, signal })}`, }); } @@ -156,7 +156,7 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ if (!matchedOutput) { return resolve({ - callWasSuccessful: false, + isOk: false, error: "Something has blocked the shell from producing the environment variables", }); } @@ -165,12 +165,12 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ resetEnvPairs(resolvedEnv); resolve({ - callWasSuccessful: true, - response: resolvedEnv, + isOk: true, + value: resolvedEnv, }); } catch (err) { resolve({ - callWasSuccessful: false, + isOk: false, error: String(err), }); } diff --git a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.test.ts b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.test.ts index c79b87fb96..2936c0b72a 100644 --- a/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.test.ts +++ b/packages/core/src/features/shell-sync/main/compute-unix-shell-environment.test.ts @@ -39,13 +39,13 @@ describe("computeUnixShellEnvironment technical tests", () => { beforeEach(() => { di = getDiForUnitTesting(); - spawnMock = jest.fn().mockImplementation((spawnfile, spawnargs) => { + spawnMock = jest.fn().mockImplementation((spawnfile: string, spawnargs: string[]) => { shellStdin = new MemoryStream(); shellStdout = new MemoryStream(); shellStderr = new MemoryStream(); stdinValue = ""; - shellStdin.on("data", (chunk) => { + shellStdin.on("data", (chunk: Buffer) => { stdinValue += chunk.toString(); }); @@ -57,7 +57,9 @@ describe("computeUnixShellEnvironment technical tests", () => { shellStdin, shellStdout, shellStderr, - ] as any, + null, + null, + ] as ChildProcessWithoutNullStreams["stdio"], killed: false, kill: jest.fn(), send: jest.fn(), @@ -124,7 +126,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: `Failed to spawn ${shellPath}: ${JSON.stringify({ error: "Error: some-error", stdout: "", @@ -141,7 +143,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -154,7 +156,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -177,8 +179,8 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve the env", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: true, - response: { + isOk: true, + value: { PATH: "/bin", SOME_ENV_VAR: "some-env-value", TERM: "some-other-value", @@ -230,7 +232,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: `Failed to spawn ${shellPath}: ${JSON.stringify({ error: "Error: some-error", stdout: "", @@ -247,7 +249,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -260,7 +262,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -283,8 +285,8 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve the env", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: true, - response: { + isOk: true, + value: { PATH: "/bin", SOME_ENV_VAR: "some-env-value", TERM: "some-other-value", @@ -335,7 +337,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: `Failed to spawn ${shellPath}: ${JSON.stringify({ error: "Error: some-error", stdout: "", @@ -352,7 +354,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -365,7 +367,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -388,8 +390,8 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve the env", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: true, - response: { + isOk: true, + value: { PATH: "/bin", SOME_ENV_VAR: "some-env-value", TERM: "some-other-value", @@ -439,7 +441,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: `Failed to spawn ${shellPath}: ${JSON.stringify({ error: "Error: some-error", stdout: "", @@ -456,7 +458,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -469,7 +471,7 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve with a failed call", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: false, + isOk: false, error: 'Shell did not exit successfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', }); }); @@ -492,8 +494,8 @@ describe("computeUnixShellEnvironment technical tests", () => { it("should resolve the env", async () => { await expect(unixShellEnv).resolves.toEqual({ - callWasSuccessful: true, - response: { + isOk: true, + value: { PATH: "/bin", SOME_ENV_VAR: "some-env-value", TERM: "some-other-value", diff --git a/packages/core/src/features/shell-sync/main/setup-shell.injectable.ts b/packages/core/src/features/shell-sync/main/setup-shell.injectable.ts index a212951635..e6d6b9c65f 100644 --- a/packages/core/src/features/shell-sync/main/setup-shell.injectable.ts +++ b/packages/core/src/features/shell-sync/main/setup-shell.injectable.ts @@ -28,14 +28,14 @@ const setupShellInjectable = getInjectable({ const result = await computeShellEnvironment(resolvedUserShellSetting.get()); - if (!result.callWasSuccessful) { + if (!result.isOk) { logger.error(`[SHELL-SYNC]: ${result.error}`); emitShellSyncFailed(result.error); return; } - const env = result.response; + const env = result.value; if (!env) { logger.debug("[SHELL-SYNC]: nothing to do, env not special in shells"); diff --git a/packages/core/src/features/status-bar/status-bar-items-originating-from-extensions.test.tsx b/packages/core/src/features/status-bar/status-bar-items-originating-from-extensions.test.tsx index 220a3ea6aa..fb6ed459bd 100644 --- a/packages/core/src/features/status-bar/status-bar-items-originating-from-extensions.test.tsx +++ b/packages/core/src/features/status-bar/status-bar-items-originating-from-extensions.test.tsx @@ -11,12 +11,12 @@ import type { FakeExtensionOptions } from "../../renderer/components/test-utils/ import { computed } from "mobx"; describe("status-bar-items-originating-from-extensions", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; - beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + beforeEach(async () => { + builder = getApplicationBuilder(); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await applicationBuilder.beforeWindowStart(({ windowDi }) => { windowDi.unoverride(getRandomIdInjectionToken); windowDi.permitSideEffects(getRandomIdInjectionToken); }); @@ -26,10 +26,10 @@ describe("status-bar-items-originating-from-extensions", () => { let rendered: RenderResult; beforeEach(async () => { - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); - it("when multiple extensions with status bar items are loaded, shows items in correct order", () => { + it("when multiple extensions with status bar items are loaded, shows items in correct order", async () => { const testExtension1 = { id: "some-id", name: "some-name", @@ -62,7 +62,7 @@ describe("status-bar-items-originating-from-extensions", () => { }, }; - applicationBuilder.extensions.enable(testExtension1, testExtension2); + await builder.extensions.enable(testExtension1, testExtension2); const rightSide = rendered.getByTestId("status-bar-right"); @@ -77,7 +77,7 @@ describe("status-bar-items-originating-from-extensions", () => { describe("when extension with status bar items is loaded", () => { let testExtensionOptions: FakeExtensionOptions; - beforeEach(() => { + beforeEach(async () => { testExtensionOptions = { id: "some-id", name: "some-name", @@ -119,7 +119,7 @@ describe("status-bar-items-originating-from-extensions", () => { }, }; - applicationBuilder.extensions.enable(testExtensionOptions); + await builder.extensions.enable(testExtensionOptions); }); it("renders", () => { @@ -152,8 +152,8 @@ describe("status-bar-items-originating-from-extensions", () => { expect(actual).toEqual(["left1", "left2"]); }); - it("when the extension is removed, shows there are no extension status bar items", () => { - applicationBuilder.extensions.disable(testExtensionOptions); + it("when the extension is removed, shows there are no extension status bar items", async () => { + await builder.extensions.disable(testExtensionOptions); const actual = rendered.queryAllByTestId("some-testId"); diff --git a/packages/core/src/features/top-bar/extension-api/extendability-using-extension-api.test.tsx b/packages/core/src/features/top-bar/extension-api/extendability-using-extension-api.test.tsx index 70a06574a7..70f41d0aab 100644 --- a/packages/core/src/features/top-bar/extension-api/extendability-using-extension-api.test.tsx +++ b/packages/core/src/features/top-bar/extension-api/extendability-using-extension-api.test.tsx @@ -11,12 +11,12 @@ import type { FakeExtensionOptions } from "../../../renderer/components/test-uti describe("extendability-using-extension-api", () => { let rendered: RenderResult; - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -30,7 +30,7 @@ describe("extendability-using-extension-api", () => { describe("given an extension with top-bar items is enabled", () => { let testExtension: FakeExtensionOptions; - beforeEach(() => { + beforeEach(async () => { testExtension = { id: "test-extension", name: "Test Extension", @@ -48,7 +48,7 @@ describe("extendability-using-extension-api", () => { }, }; - applicationBuilder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("renders", () => { @@ -60,8 +60,8 @@ describe("extendability-using-extension-api", () => { }); describe("when the extension is disabled", () => { - beforeEach(() => { - applicationBuilder.extensions.disable(testExtension); + beforeEach(async () => { + await builder.extensions.disable(testExtension); }); it("renders", () => { @@ -75,7 +75,7 @@ describe("extendability-using-extension-api", () => { }); describe("given an extension with a weakly typed and invalid top-bar item is enabled", () => { - beforeEach(() => { + beforeEach(async () => { const testExtension: FakeExtensionOptions = { id: "test-extension", name: "Test Extension", @@ -85,20 +85,20 @@ describe("extendability-using-extension-api", () => { { components: { // Note: this makes the item invalid. - Item: undefined, + Item: undefined as never, }, - } as any, + }, // Note: empty object makes the item invalid. - {} as any, + {} as never, // Note: non-object makes the item invalid. - undefined as any, + undefined as never, ], }, }; - applicationBuilder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("renders without blowing up", () => { diff --git a/packages/core/src/features/tray/clicking-tray-menu-item-originating-from-extension.test.ts b/packages/core/src/features/tray/clicking-tray-menu-item-originating-from-extension.test.ts index fa0afe2f70..4669937451 100644 --- a/packages/core/src/features/tray/clicking-tray-menu-item-originating-from-extension.test.ts +++ b/packages/core/src/features/tray/clicking-tray-menu-item-originating-from-extension.test.ts @@ -15,7 +15,7 @@ describe("clicking tray menu item originating from extension", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { logErrorMock = jest.fn(); mainDi.override(logErrorInjectable, () => logErrorMock); @@ -29,7 +29,7 @@ describe("clicking tray menu item originating from extension", () => { let someExtension: FakeExtensionOptions; let clickMock: jest.Mock; - beforeEach(() => { + beforeEach(async () => { clickMock = jest.fn(); someExtension = { @@ -40,7 +40,7 @@ describe("clicking tray menu item originating from extension", () => { }, }; - builder.extensions.enable(someExtension); + await builder.extensions.enable(someExtension); }); it("when item is clicked, triggers the click handler", () => { @@ -88,8 +88,8 @@ describe("clicking tray menu item originating from extension", () => { }); describe("when extension is disabled", () => { - beforeEach(() => { - builder.extensions.disable(someExtension); + beforeEach(async () => { + await builder.extensions.disable(someExtension); }); it("does not have the tray menu item from extension", () => { diff --git a/packages/core/src/features/tray/extension-adding-tray-items.test.tsx b/packages/core/src/features/tray/extension-adding-tray-items.test.tsx index 2b640be07c..c5d3e864c0 100644 --- a/packages/core/src/features/tray/extension-adding-tray-items.test.tsx +++ b/packages/core/src/features/tray/extension-adding-tray-items.test.tsx @@ -82,7 +82,7 @@ describe("preferences: extension adding tray items", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); describe("given controlled label", () => { @@ -223,7 +223,7 @@ describe("preferences: extension adding tray items", () => { }, }; - builder.extensions.enable(testExtension); + await builder.extensions.enable(testExtension); }); it("given item exists, it's shown", () => { @@ -234,7 +234,7 @@ describe("preferences: extension adding tray items", () => { ).not.toBeNull(); }); - it("given item is added, it's shown", async () => { + it("given item is added, it's shown", () => { menuItems.push({ id: "some-added", label: "some-added", @@ -249,7 +249,7 @@ describe("preferences: extension adding tray items", () => { ).not.toBeNull(); }); - it("given item is removed, it's not shown", async () => { + it("given item is removed, it's not shown", () => { menuItems.replace([]); expect( @@ -259,7 +259,7 @@ describe("preferences: extension adding tray items", () => { ).toBeNull(); }); - it("given items are removed and one added, it's shown", async () => { + it("given items are removed and one added, it's shown", () => { menuItems.replace([]); menuItems.push({ id: "some-added", diff --git a/packages/core/src/features/tray/multiple-separators-originating-from-extension.test.ts b/packages/core/src/features/tray/multiple-separators-originating-from-extension.test.ts index 83b9deb27e..24c76c564f 100644 --- a/packages/core/src/features/tray/multiple-separators-originating-from-extension.test.ts +++ b/packages/core/src/features/tray/multiple-separators-originating-from-extension.test.ts @@ -12,7 +12,7 @@ describe("multiple separators originating from extension", () => { beforeEach(async () => { builder = getApplicationBuilder(); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.unoverride(getRandomIdInjectionToken); mainDi.permitSideEffects(getRandomIdInjectionToken); }); @@ -20,7 +20,7 @@ describe("multiple separators originating from extension", () => { await builder.render(); }); - it("given extension with multiple separators, when extension is enabled, does not throw", () => { + it("given extension with multiple separators, when extension is enabled, does not throw", async () => { const someExtension = { id: "some-extension-id", name: "some-extension", @@ -30,8 +30,6 @@ describe("multiple separators originating from extension", () => { }, }; - expect(() => { - builder.extensions.enable(someExtension); - }).not.toThrow(); + await expect(builder.extensions.enable(someExtension)).resolves.toBeUndefined(); }); }); diff --git a/packages/core/src/features/user-preferences/common/preference-descriptors.injectable.ts b/packages/core/src/features/user-preferences/common/preference-descriptors.injectable.ts index afb84cb892..17ee98da13 100644 --- a/packages/core/src/features/user-preferences/common/preference-descriptors.injectable.ts +++ b/packages/core/src/features/user-preferences/common/preference-descriptors.injectable.ts @@ -10,7 +10,7 @@ import homeDirectoryPathInjectable from "../../../common/os/home-directory-path. import joinPathsInjectable from "../../../common/path/join-paths.injectable"; import { defaultThemeId } from "../../../common/vars"; import currentTimezoneInjectable from "../../../common/vars/current-timezone.injectable"; -import type { EditorConfiguration, ExtensionRegistry, KubeconfigSyncEntry, KubeconfigSyncValue, TerminalConfig } from "./preferences-helpers"; +import type { EditorConfiguration, ExtensionRegistry, KubeconfigSyncEntry, TerminalConfig } from "./preferences-helpers"; import { defaultExtensionRegistryUrlLocation, defaultEditorConfig, defaultTerminalConfig, defaultPackageMirror, getPreferenceDescriptor, packageMirrors } from "./preferences-helpers"; export type PreferenceDescriptors = ReturnType; @@ -111,7 +111,7 @@ const userPreferenceDescriptorsInjectable = getInjectable({ return res.length ? res : undefined; }, }), - syncKubeconfigEntries: getPreferenceDescriptor>({ + syncKubeconfigEntries: getPreferenceDescriptor>>({ fromStore: val => observable.map( val?.map(({ filePath, ...rest }) => [filePath, rest]) ?? [[mainKubeFolderPath, {}]], diff --git a/packages/core/src/features/user-preferences/common/preferences-helpers.ts b/packages/core/src/features/user-preferences/common/preferences-helpers.ts index 1a80dccd28..707e5090da 100644 --- a/packages/core/src/features/user-preferences/common/preferences-helpers.ts +++ b/packages/core/src/features/user-preferences/common/preferences-helpers.ts @@ -7,12 +7,10 @@ import type { editor } from "monaco-editor"; import { defaultFontSize, defaultTerminalFontFamily, defaultEditorFontFamily } from "../../../common/vars"; import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; -export interface KubeconfigSyncEntry extends KubeconfigSyncValue { +export interface KubeconfigSyncEntry { filePath: string; } -export interface KubeconfigSyncValue { -} export interface TerminalConfig { fontSize: number; fontFamily: string; @@ -24,6 +22,7 @@ export const defaultTerminalConfig: TerminalConfig = { }; export interface BaseEditorConfiguration extends Required> { + // eslint-disable-next-line @typescript-eslint/ban-types lineNumbers: NonNullable>; } @@ -87,8 +86,8 @@ export type ExtensionRegistry = { export const defaultExtensionRegistryUrlLocation = "default"; export const defaultExtensionRegistryUrl = "https://registry.npmjs.org"; -type PreferencesModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; -type UserStoreModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; +type PreferencesModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; +type UserStoreModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; export type UserStoreFlatModel = { [field in keyof PreferenceDescriptors]: UserStoreModelType; diff --git a/packages/core/src/features/weblinks/main/validate-weblink.global-override-for-injectable.ts b/packages/core/src/features/weblinks/main/validate-weblink.global-override-for-injectable.ts index 8ec03bebaf..362e6f23a0 100644 --- a/packages/core/src/features/weblinks/main/validate-weblink.global-override-for-injectable.ts +++ b/packages/core/src/features/weblinks/main/validate-weblink.global-override-for-injectable.ts @@ -6,4 +6,4 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import validateWeblinkInjectable from "./validate-weblink.injectable"; -export default getGlobalOverride(validateWeblinkInjectable, () => async () => "available"); +export default getGlobalOverride(validateWeblinkInjectable, () => () => Promise.resolve("available")); diff --git a/packages/core/src/features/welcome/banners-from-extension.test.tsx b/packages/core/src/features/welcome/banners-from-extension.test.tsx index 37aaab0666..f2340b4be3 100644 --- a/packages/core/src/features/welcome/banners-from-extension.test.tsx +++ b/packages/core/src/features/welcome/banners-from-extension.test.tsx @@ -29,7 +29,7 @@ describe("Banners from extensions", () => { describe("when an extension is enabled with a single welcome banner", () => { beforeEach(() => { - builder.extensions.enable({ + await builder.extensions.enable({ id: "some-id", name: "some-name", rendererOptions: { @@ -53,7 +53,7 @@ describe("Banners from extensions", () => { describe("when an extension is enabled with multiple banners with custom widths", () => { beforeEach(() => { - builder.extensions.enable({ + await builder.extensions.enable({ id: "some-id", name: "some-name", rendererOptions: { diff --git a/packages/core/src/features/welcome/navigation-using-application-menu.test.ts b/packages/core/src/features/welcome/navigation-using-application-menu.test.ts index 02ccf18e40..43ae1d348c 100644 --- a/packages/core/src/features/welcome/navigation-using-application-menu.test.ts +++ b/packages/core/src/features/welcome/navigation-using-application-menu.test.ts @@ -8,13 +8,13 @@ import type { ApplicationBuilder } from "../../renderer/components/test-utils/ge import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; describe("welcome - navigation using application menu", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered: RenderResult; beforeEach(async () => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); - rendered = await applicationBuilder.render(); + rendered = await builder.render(); }); it("renders", () => { @@ -29,7 +29,7 @@ describe("welcome - navigation using application menu", () => { describe("when navigated somewhere else", () => { beforeEach(() => { - applicationBuilder.applicationMenu.click( + builder.applicationMenu.click( "root", "mac", "navigate-to-preferences", @@ -48,7 +48,7 @@ describe("welcome - navigation using application menu", () => { describe("when navigated to welcome using application menu", () => { beforeEach(() => { - applicationBuilder.applicationMenu.click( + builder.applicationMenu.click( "root", "help", "navigate-to-welcome", diff --git a/packages/core/src/features/welcome/setting-welcome-page.test.tsx b/packages/core/src/features/welcome/setting-welcome-page.test.tsx index c571f3234e..bae9ef7630 100644 --- a/packages/core/src/features/welcome/setting-welcome-page.test.tsx +++ b/packages/core/src/features/welcome/setting-welcome-page.test.tsx @@ -12,31 +12,30 @@ import welcomeRouteConfigInjectable from "../../common/front-end-routing/routes/ import welcomeRouteInjectable from "../../common/front-end-routing/routes/welcome/welcome-route.injectable"; import type { Route } from "../../common/front-end-routing/front-end-route-injection-token"; - describe("setting-welcome-page", () => { - let applicationBuilder: ApplicationBuilder; + let builder: ApplicationBuilder; let rendered : RenderResult; let welcomeRoute: Route; beforeEach(() => { - applicationBuilder = getApplicationBuilder(); + builder = getApplicationBuilder(); }); describe("given configuration of welcome page route is the default", () => { beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(welcomeRouteConfigInjectable, () => "/welcome"); }); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(welcomeRouteConfigInjectable, () => "/welcome"); }); - // enable the extension even though the welcomeRoute is not overriden - applicationBuilder.extensions.enable(extensionWithWelcomePage); - rendered = await applicationBuilder.render(); + // enable the extension even though the welcomeRoute is not overridden + await builder.extensions.enable(extensionWithWelcomePage); + rendered = await builder.render(); - const windowDi = applicationBuilder.applicationWindow.only.di; + const windowDi = builder.applicationWindow.only.di; welcomeRoute = windowDi.inject(welcomeRouteInjectable); }); @@ -54,18 +53,18 @@ describe("setting-welcome-page", () => { describe("given configuration of welcome page route is set to a custom page", () => { beforeEach(async () => { - applicationBuilder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { mainDi.override(welcomeRouteConfigInjectable, () => "/extension/some-extension-name/some-welcome-page"); }); - applicationBuilder.beforeWindowStart(({ windowDi }) => { + await builder.beforeWindowStart(({ windowDi }) => { windowDi.override(welcomeRouteConfigInjectable, () => "/extension/some-extension-name/some-welcome-page"); }); - applicationBuilder.extensions.enable(extensionWithWelcomePage); - rendered = await applicationBuilder.render(); + await builder.extensions.enable(extensionWithWelcomePage); + rendered = await builder.render(); - const windowDi = applicationBuilder.applicationWindow.only.di; + const windowDi = builder.applicationWindow.only.di; welcomeRoute = windowDi.inject(welcomeRouteInjectable); }); diff --git a/packages/core/src/jest.setup.tsx b/packages/core/src/jest.setup.tsx index c511090251..de19c00ca4 100644 --- a/packages/core/src/jest.setup.tsx +++ b/packages/core/src/jest.setup.tsx @@ -9,8 +9,9 @@ import { TextEncoder, TextDecoder as TextDecoderNode } from "util"; import glob from "glob"; import path from "path"; import { enableMapSet, setAutoFreeze } from "immer"; -import type * as K8slensTooltip from "@k8slens/tooltip"; import React from "react"; +import { isObject } from "@k8slens/utilities"; +import type { TooltipDecoratorProps } from "@k8slens/tooltip"; declare global { interface InjectablePaths { @@ -39,9 +40,9 @@ global.setImmediate = setImmediate; global.fail = ((error = "Test failed without explicit error") => { console.error(error); -}) as any; +}) as typeof global.fail; -process.on("unhandledRejection", (err: any) => { +process.on("unhandledRejection", (err) => { global.fail(err); }); @@ -55,24 +56,30 @@ global.ResizeObserver = class { }; jest.mock("./renderer/components/monaco-editor/monaco-editor"); +// eslint-disable-next-line @typescript-eslint/no-unsafe-return jest.mock("@k8slens/tooltip", () => ({ ...jest.requireActual("@k8slens/tooltip"), - withTooltip: (Target => ({ tooltip, tooltipOverrideDisabled, ...props }: any) => { - if (tooltip) { - const testId = props["data-testid"]; + withTooltip (Target: TargetProps extends Pick ? React.FunctionComponent : never): React.FunctionComponent { + return ({ tooltip, tooltipOverrideDisabled, ...props }) => { + void tooltipOverrideDisabled; + const ResolvedTarget = Target as React.FunctionComponent; - return ( - <> - -
- {tooltip.children || tooltip} -
- - ); - } + if (tooltip) { + const testId = props["data-testid"] as string | undefined; - return ; - }) as typeof K8slensTooltip.withTooltip, + return ( + <> + +
+ {isObject(tooltip) ? tooltip.children : tooltip} +
+ + ); + } + + return ; + }; + }, })); jest.mock("monaco-editor"); diff --git a/packages/core/src/jest.timezone.ts b/packages/core/src/jest.timezone.ts index ec39a810e3..a0e4c84343 100644 --- a/packages/core/src/jest.timezone.ts +++ b/packages/core/src/jest.timezone.ts @@ -6,6 +6,8 @@ // Setting the timezone to UTC to ensure same timezone for CI and local environments module.exports = async () => { process.env.TZ = "UTC"; + + return Promise.resolve(); }; export {}; diff --git a/packages/core/src/main/__test__/cluster.test.ts b/packages/core/src/main/__test__/cluster.test.ts index dcc028afd6..fa7505f719 100644 --- a/packages/core/src/main/__test__/cluster.test.ts +++ b/packages/core/src/main/__test__/cluster.test.ts @@ -37,7 +37,7 @@ describe("create clusters", () => { di.override(normalizedPlatformInjectable, () => "darwin"); di.override(broadcastConnectionUpdateInjectable, () => async () => {}); di.override(createCanIInjectable, () => () => () => Promise.resolve(true)); - di.override(createRequestNamespaceListPermissionsInjectable, () => () => async () => () => true); + di.override(createRequestNamespaceListPermissionsInjectable, () => () => () => Promise.resolve(() => true)); di.override(createListNamespacesInjectable, () => () => () => Promise.resolve([ "default" ])); di.override(prometheusHandlerInjectable, () => ({ getPrometheusDetails: jest.fn(), @@ -68,7 +68,7 @@ describe("create clusters", () => { }); di.override(kubeconfigManagerInjectable, () => ({ - ensurePath: async () => "/some-proxy-kubeconfig-file", + ensurePath: () => Promise.resolve("/some-proxy-kubeconfig-file"), } as Partial as KubeconfigManager)); jest.spyOn(Kubectl.prototype, "ensureKubectl").mockReturnValue(Promise.resolve(true)); diff --git a/packages/core/src/main/__test__/kube-auth-proxy.test.ts b/packages/core/src/main/__test__/kube-auth-proxy.test.ts index 35de680e77..a489e906d6 100644 --- a/packages/core/src/main/__test__/kube-auth-proxy.test.ts +++ b/packages/core/src/main/__test__/kube-auth-proxy.test.ts @@ -26,6 +26,7 @@ import getBasenameOfPathInjectable from "../../common/path/get-basename.injectab import type { Cluster } from "../../common/cluster/cluster"; import waitUntilPortIsUsedInjectable from "../kube-auth-proxy/wait-until-port-is-used/wait-until-port-is-used.injectable"; import addClusterInjectable from "../../features/cluster/storage/common/add.injectable"; +import assert from "assert"; describe("kube auth proxy tests", () => { let spawnMock: jest.Mock; @@ -85,15 +86,19 @@ describe("kube auth proxy tests", () => { const addCluster = di.inject(addClusterInjectable); - cluster = addCluster({ + const clusterResult = addCluster({ id: "foobar", kubeConfigPath: "/minikube-config.yml", contextName: "minikube", }); + + assert(clusterResult.isOk); + + cluster = clusterResult.value; kubeAuthProxy = di.inject(createKubeAuthProxyInjectable, cluster)({}); }); - it("calling exit multiple times shouldn't throw", async () => { + it("calling exit multiple times shouldn't throw", () => { kubeAuthProxy.exit(); kubeAuthProxy.exit(); kubeAuthProxy.exit(); @@ -109,32 +114,32 @@ describe("kube auth proxy tests", () => { const stderr = mock(); const stdout = mock(); - mockedCP.stderr = stderr as any; - mockedCP.stdout = stdout as any; + mockedCP.stderr = stderr; + mockedCP.stdout = stdout; jest.spyOn(Kubectl.prototype, "checkBinary").mockReturnValueOnce(Promise.resolve(true)); jest.spyOn(Kubectl.prototype, "ensureKubectl").mockReturnValueOnce(Promise.resolve(false)); - mockedCP.on.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): ChildProcess => { + mockedCP.on.mockImplementation((event: string | symbol, listener: () => void): ChildProcess => { listeners.on(event, listener); return mockedCP; }); - stderr.on.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stderr.on.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.on(`stderr/${String(event)}`, listener); return stderr; }); - stderr.off.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stderr.off.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.off(`stderr/${String(event)}`, listener); return stderr; }); - stderr.removeListener.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stderr.removeListener.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.off(`stderr/${String(event)}`, listener); return stderr; }); - stderr.once.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stderr.once.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.once(`stderr/${String(event)}`, listener); return stderr; @@ -144,7 +149,7 @@ describe("kube auth proxy tests", () => { return stderr; }); - stdout.on.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stdout.on.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.on(`stdout/${String(event)}`, listener); if (event === "data") { @@ -153,17 +158,17 @@ describe("kube auth proxy tests", () => { return stdout; }); - stdout.once.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stdout.once.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.once(`stdout/${String(event)}`, listener); return stdout; }); - stdout.off.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stdout.off.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.off(`stdout/${String(event)}`, listener); return stdout; }); - stdout.removeListener.mockImplementation((event: string | symbol, listener: (message: any, sendHandle: any) => void): Readable => { + stdout.removeListener.mockImplementation((event: string | symbol, listener: () => void): Readable => { listeners.off(`stdout/${String(event)}`, listener); return stdout; diff --git a/packages/core/src/main/__test__/kubeconfig-manager.test.ts b/packages/core/src/main/__test__/kubeconfig-manager.test.ts index b1e700cc8e..dcc7db032c 100644 --- a/packages/core/src/main/__test__/kubeconfig-manager.test.ts +++ b/packages/core/src/main/__test__/kubeconfig-manager.test.ts @@ -43,7 +43,7 @@ describe("kubeconfig manager tests", () => { let kubeConfManager: KubeconfigManager; let ensureServerMock: AsyncFnMock<() => Promise>; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); di.override(directoryForTempInjectable, () => "/some-directory-for-temp"); @@ -85,7 +85,7 @@ describe("kubeconfig manager tests", () => { ensureAuthProxyUrl: jest.fn(), })); - clusterFake = new Cluster({ + clusterFake = Cluster.createForTestingOnly({ id: "foo", contextName: "minikube", kubeConfigPath: "/minikube-config.yml", @@ -109,7 +109,7 @@ describe("kubeconfig manager tests", () => { describe("when getPath() is called initially", () => { let getPathPromise: Promise; - beforeEach(async () => { + beforeEach(() => { getPathPromise = kubeConfManager.ensurePath(); }); @@ -220,7 +220,7 @@ describe("kubeconfig manager tests", () => { describe("when calling getPath a second time", () => { let getPathPromise: Promise; - beforeEach(async () => { + beforeEach(() => { getPathPromise = kubeConfManager.ensurePath(); }); @@ -228,7 +228,7 @@ describe("kubeconfig manager tests", () => { expect(pathExistsMock).toBeCalledTimes(1); }); - describe("when pathExists resoves to true", () => { + describe("when pathExists resoles to true", () => { beforeEach(async () => { await pathExistsMock.resolveSpecific( ["/some-directory-for-temp/kubeconfig-foo"], @@ -241,7 +241,7 @@ describe("kubeconfig manager tests", () => { }); }); - describe("when pathExists resoves to false", () => { + describe("when pathExists resoles to false", () => { beforeEach(async () => { await pathExistsMock.resolveSpecific( ["/some-directory-for-temp/kubeconfig-foo"], diff --git a/packages/core/src/main/__test__/prometheus-handler.test.ts b/packages/core/src/main/__test__/prometheus-handler.test.ts index df0e1b37c9..7ad3401681 100644 --- a/packages/core/src/main/__test__/prometheus-handler.test.ts +++ b/packages/core/src/main/__test__/prometheus-handler.test.ts @@ -29,6 +29,8 @@ const createTestPrometheusProvider = (kind: string, alwaysFail: ServiceResult): throw new Error("getQuery is not implemented."); }, getPrometheusService: async () => { + await Promise.resolve(); + switch (alwaysFail) { case ServiceResult.Success: return { @@ -83,7 +85,7 @@ describe("PrometheusHandler", () => { }], }); - cluster = new Cluster({ + cluster = Cluster.createForTestingOnly({ contextName, id: "some-cluster-id", kubeConfigPath, @@ -107,7 +109,7 @@ describe("PrometheusHandler", () => { } }); - expect(() => di.inject(prometheusHandlerInjectable, cluster).getPrometheusDetails()).rejects.toThrowError(); + await expect(() => di.inject(prometheusHandlerInjectable, cluster).getPrometheusDetails()).rejects.toThrowError(); }); it.each([ diff --git a/packages/core/src/main/__test__/static-file-route.test.ts b/packages/core/src/main/__test__/static-file-route.test.ts index 0186cbea02..b729536fbb 100644 --- a/packages/core/src/main/__test__/static-file-route.test.ts +++ b/packages/core/src/main/__test__/static-file-route.test.ts @@ -30,7 +30,7 @@ describe("static-file-route", () => { }); it("serves files under static root", async () => { - const req: any = { + const req = { url: "", }; diff --git a/packages/core/src/main/app-paths/get-electron-app-path/get-electron-app-path.test.ts b/packages/core/src/main/app-paths/get-electron-app-path/get-electron-app-path.test.ts index 1988f394b5..3ef3fc4c65 100644 --- a/packages/core/src/main/app-paths/get-electron-app-path/get-electron-app-path.test.ts +++ b/packages/core/src/main/app-paths/get-electron-app-path/get-electron-app-path.test.ts @@ -15,7 +15,6 @@ describe("get-electron-app-path", () => { const appStub = { name: "some-app-name", - getPath: (name: string) => { if (name !== "some-existing-name") { throw new Error("irrelevant"); @@ -23,10 +22,8 @@ describe("get-electron-app-path", () => { return "some-existing-app-path"; }, - - // eslint-disable-next-line unused-imports/no-unused-vars-ts - setPath: (_, __) => undefined, - } as App; + setPath: () => undefined, + } as Partial as App; di.override(electronAppInjectable, () => appStub); diff --git a/packages/core/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts b/packages/core/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts index 6cc651f7e5..881d8ff627 100644 --- a/packages/core/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts +++ b/packages/core/src/main/catalog-sources/__test__/kubeconfig-sync.test.ts @@ -33,16 +33,16 @@ import readJsonSyncInjectable from "../../../common/fs/read-json-sync.injectable import writeJsonSyncInjectable from "../../../common/fs/write-json-sync.injectable"; import type { KubeconfigManager } from "../../kubeconfig-manager/kubeconfig-manager"; import kubeconfigManagerInjectable from "../../kubeconfig-manager/kubeconfig-manager.injectable"; -import type { KubeconfigSyncValue } from "../../../features/user-preferences/common/preferences-helpers"; import kubeconfigSyncsInjectable from "../../../features/user-preferences/common/kubeconfig-syncs.injectable"; +import assert from "assert"; describe("kubeconfig-sync.source tests", () => { let computeKubeconfigDiff: ComputeKubeconfigDiff; let configToModels: ConfigToModels; - let kubeconfigSyncs: ObservableMap; + let kubeconfigSyncs: ObservableMap; let di: DiContainer; - beforeEach(async () => { + beforeEach(() => { di = getDiForUnitTesting(); di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); @@ -53,7 +53,7 @@ describe("kubeconfig-sync.source tests", () => { di.override(writeJsonSyncInjectable, () => () => { throw new Error("tried call writeJsonSync without override"); }); di.override(kubeconfigManagerInjectable, () => ({ - ensurePath: async () => "/some-proxy-kubeconfig-file", + ensurePath: () => Promise.resolve("/some-proxy-kubeconfig-file"), } as Partial as KubeconfigManager)); kubeconfigSyncs = observable.map(); @@ -191,7 +191,10 @@ describe("kubeconfig-sync.source tests", () => { expect(rootSource.size).toBe(1); - const c = rootSource.values().next().value[0] as Cluster; + const first = rootSource.values().next(); + + assert(first.done === false); + const c = first.value[0]; expect(c.kubeConfigPath.get()).toBe("/bar"); expect(c.contextName.get()).toBe("context-name"); @@ -244,7 +247,10 @@ describe("kubeconfig-sync.source tests", () => { expect(rootSource.size).toBe(2); { - const c = rootSource.values().next().value[0] as Cluster; + const first = rootSource.values().next(); + + assert(first.done === false); + const c = first.value[0]; runInAction(() => { expect(c.kubeConfigPath.get()).toBe("/bar"); @@ -286,7 +292,10 @@ describe("kubeconfig-sync.source tests", () => { expect(rootSource.size).toBe(1); { - const c = rootSource.values().next().value[0] as Cluster; + const first = rootSource.values().next(); + + assert(first.done === false); + const c = first.value[0]; expect(c.kubeConfigPath.get()).toBe("/bar"); expect(c.contextName.get()).toBe("context-name"); @@ -297,8 +306,8 @@ describe("kubeconfig-sync.source tests", () => { describe("given a config file at /foobar/config", () => { let manager: KubeconfigSyncManager; let watchInstances: Map>; - let firstReadFoobarConfigSteam: ReadStream; - let secondReadFoobarConfigSteam: ReadStream; + let firstReadFoobarConfigSteam: ReadStream | undefined; + let secondReadFoobarConfigSteam: ReadStream | undefined; let statMock: AsyncFnMock; beforeEach(() => { @@ -334,8 +343,8 @@ describe("kubeconfig-sync.source tests", () => { }); afterEach(() => { - (firstReadFoobarConfigSteam as any) = undefined; - (secondReadFoobarConfigSteam as any) = undefined; + firstReadFoobarConfigSteam = undefined; + secondReadFoobarConfigSteam = undefined; }); it("should not find any entities", () => { @@ -376,9 +385,9 @@ describe("kubeconfig-sync.source tests", () => { describe("when the data is read in", () => { beforeEach(() => { - firstReadFoobarConfigSteam.emit("data", Buffer.from(foobarConfig)); - firstReadFoobarConfigSteam.emit("end"); - firstReadFoobarConfigSteam.emit("close"); + firstReadFoobarConfigSteam?.emit("data", Buffer.from(foobarConfig)); + firstReadFoobarConfigSteam?.emit("end"); + firstReadFoobarConfigSteam?.emit("close"); }); it("should find a single entity", () => { @@ -410,9 +419,9 @@ describe("kubeconfig-sync.source tests", () => { describe("when the data is read in", () => { beforeEach(() => { - secondReadFoobarConfigSteam.emit("data", Buffer.from(foobarConfig)); - secondReadFoobarConfigSteam.emit("end"); - secondReadFoobarConfigSteam.emit("close"); + secondReadFoobarConfigSteam?.emit("data", Buffer.from(foobarConfig)); + secondReadFoobarConfigSteam?.emit("end"); + secondReadFoobarConfigSteam?.emit("close"); }); it("should still only find a single entity", () => { diff --git a/packages/core/src/main/catalog-sources/kubeconfig-sync/compute-diff.injectable.ts b/packages/core/src/main/catalog-sources/kubeconfig-sync/compute-diff.injectable.ts index d1e8f0daab..c144cc1f1c 100644 --- a/packages/core/src/main/catalog-sources/kubeconfig-sync/compute-diff.injectable.ts +++ b/packages/core/src/main/catalog-sources/kubeconfig-sync/compute-diff.injectable.ts @@ -17,6 +17,8 @@ import configToModelsInjectable from "./config-to-models.injectable"; import kubeconfigSyncLoggerInjectable from "./logger.injectable"; import clusterConnectionInjectable from "../../cluster/cluster-connection.injectable"; import getClusterByIdInjectable from "../../../features/cluster/storage/common/get-by-id.injectable"; +import type { ZodError } from "zod"; +import type { Result } from "@k8slens/utilities"; export type ComputeKubeconfigDiff = (contents: string, source: ObservableMap, filePath: string) => void; @@ -31,13 +33,13 @@ const computeKubeconfigDiffInjectable = getInjectable({ return action((contents, source, filePath) => { try { - const { config, error } = loadConfigFromString(contents); + const result = loadConfigFromString(contents); - if (error) { - logger.warn(`encountered errors while loading config: ${error.message}`, { filePath, details: error.details }); + if (result.isOk === false) { + return logger.warn(`encountered errors while loading config: ${result.error.message}`, { filePath, details: result.error.errors }); } - const rawModels = configToModels(config, filePath); + const rawModels = configToModels(result.value, filePath); const models = new Map(rawModels.map((model) => [model.contextName, model])); logger.debug(`File now has ${models.size} entries`, { filePath }); @@ -69,24 +71,37 @@ const computeKubeconfigDiffInjectable = getInjectable({ } for (const [contextName, model] of models) { - // add new clusters to the source - try { - const clusterId = createHash("md5").update(`${filePath}:${contextName}`).digest("hex"); - const cluster = getClusterById(clusterId) ?? new Cluster({ ...model, id: clusterId }); - const entity = catalogEntityFromCluster(cluster); + const clusterId = createHash("md5").update(`${filePath}:${contextName}`).digest("hex"); + const clusterResult = ((): Result> => { + const cluster = getClusterById(clusterId); - if (!filePath.startsWith(directoryForKubeConfigs)) { - entity.metadata.labels.file = filePath.replace(homedir(), "~"); + if (cluster) { + return { + isOk: true, + value: cluster, + }; } - source.set(contextName, [cluster, entity]); - logger.debug(`Added new cluster from sync`, { filePath, contextName }); - } catch (error) { - logger.warn(`Failed to create cluster from model: ${error}`, { filePath, contextName }); + return Cluster.create({ ...model, id: clusterId }); + })(); + + if (!clusterResult.isOk) { + logger.warn(`Failed to create cluster from model: ${clusterResult.error.toString()}`, { filePath, contextName }); + continue; } + + const cluster = clusterResult.value; + const entity = catalogEntityFromCluster(cluster); + + if (!filePath.startsWith(directoryForKubeConfigs)) { + entity.metadata.labels.file = filePath.replace(homedir(), "~"); + } + source.set(contextName, [cluster, entity]); + + logger.debug(`Added new cluster from sync`, { filePath, contextName }); } } catch (error) { - logger.warn(`Failed to compute diff: ${error}`, { filePath }); + logger.warn(`Failed to compute diff: ${String(error)}`, { filePath }); source.clear(); // clear source if we have failed so as to not show outdated information } diff --git a/packages/core/src/main/catalog-sources/kubeconfig-sync/config-to-models.injectable.ts b/packages/core/src/main/catalog-sources/kubeconfig-sync/config-to-models.injectable.ts index 6baad196cf..b760ed7206 100644 --- a/packages/core/src/main/catalog-sources/kubeconfig-sync/config-to-models.injectable.ts +++ b/packages/core/src/main/catalog-sources/kubeconfig-sync/config-to-models.injectable.ts @@ -19,8 +19,8 @@ const configToModelsInjectable = getInjectable({ const validConfigs: ReturnType = []; for (const { config, validationResult } of splitConfig(rootConfig)) { - if (validationResult.error) { - logger.debug(`context failed validation: ${validationResult.error}`, { context: config.currentContext, filePath }); + if (validationResult.isOk === false) { + logger.debug(`context failed validation: ${validationResult.error.toString()}`, { context: config.currentContext, filePath }); } else { validConfigs.push({ kubeConfigPath: filePath, diff --git a/packages/core/src/main/catalog-sources/kubeconfig-sync/diff-changed-kubeconfig.injectable.ts b/packages/core/src/main/catalog-sources/kubeconfig-sync/diff-changed-kubeconfig.injectable.ts index ad03c2563d..63cf2428e7 100644 --- a/packages/core/src/main/catalog-sources/kubeconfig-sync/diff-changed-kubeconfig.injectable.ts +++ b/packages/core/src/main/catalog-sources/kubeconfig-sync/diff-changed-kubeconfig.injectable.ts @@ -66,7 +66,7 @@ const diffChangedKubeconfigInjectable = getInjectable({ try { fileString += decoder.decode(chunk, { stream: true }); } catch (error) { - logger.warn(`skipping ${filePath}: ${error}`); + logger.warn(`skipping ${filePath}: ${String(error)}`); source.clear(); cleanup(); } @@ -74,7 +74,7 @@ const diffChangedKubeconfigInjectable = getInjectable({ .on("close", () => cleanup()) .on("error", error => { cleanup(); - logger.warn(`failed to read file: ${error}`, { filePath }); + logger.warn(`failed to read file: ${String(error)}`, { filePath }); }) .on("end", () => { if (!closed) { diff --git a/packages/core/src/main/catalog-sources/kubeconfig-sync/watch-file-changes.injectable.ts b/packages/core/src/main/catalog-sources/kubeconfig-sync/watch-file-changes.injectable.ts index a54db19390..69372457bb 100644 --- a/packages/core/src/main/catalog-sources/kubeconfig-sync/watch-file-changes.injectable.ts +++ b/packages/core/src/main/catalog-sources/kubeconfig-sync/watch-file-changes.injectable.ts @@ -55,7 +55,7 @@ const watchKubeconfigFileChangesInjectable = getInjectable({ let watcher: Watcher; - (async () => { + void (async () => { try { const stats = await stat(filePath); const isFolderSync = stats.isDirectory(); @@ -118,14 +118,14 @@ const watchKubeconfigFileChangesInjectable = getInjectable({ cleanupFns.delete(childFilePath); rootSource.delete(childFilePath); }) - .on("error", error => logger.error(`watching file/folder failed: ${error}`, { filePath })); + .on("error", error => logger.error(`watching file/folder failed: ${String(error)}`, { filePath })); } catch (error) { - logger.warn(`failed to start watching changes: ${error}`); + logger.warn(`failed to start watching changes: ${String(error)}`); } })(); - return [derivedSource, () => { - watcher?.close(); + return [derivedSource, async () => { + await watcher?.close(); }]; }; }, diff --git a/packages/core/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts b/packages/core/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts index cab7ff86f0..e56bb5ec19 100644 --- a/packages/core/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts +++ b/packages/core/src/main/catalog-sync-to-renderer/broadcaster.injectable.ts @@ -15,7 +15,7 @@ const catalogSyncBroadcasterInjectable = getInjectable({ return debounce( (items: CatalogEntity[]) => { - broadcastMessage(catalogItemsChannel, items); + void broadcastMessage(catalogItemsChannel, items); }, 100, { diff --git a/packages/core/src/main/catalog/__tests__/catalog-entity-registry.test.ts b/packages/core/src/main/catalog/__tests__/catalog-entity-registry.test.ts index c7cf5f1e16..6f33eaf3c1 100644 --- a/packages/core/src/main/catalog/__tests__/catalog-entity-registry.test.ts +++ b/packages/core/src/main/catalog/__tests__/catalog-entity-registry.test.ts @@ -15,22 +15,6 @@ import type { CatalogEntityRegistry } from "../entity-registry"; class InvalidEntity extends CatalogEntity { public readonly apiVersion = "entity.k8slens.dev/v1alpha1"; public readonly kind = "Invalid"; - - async onRun() { - return; - } - - public onSettingsOpen(): void { - return; - } - - public onDetailsOpen(): void { - return; - } - - public onContextMenuOpen(): void { - return; - } } describe("CatalogEntityRegistry", () => { diff --git a/packages/core/src/main/cluster-detectors/detect-cluster-metadata.test.ts b/packages/core/src/main/cluster-detectors/detect-cluster-metadata.test.ts index 833b468738..6cdb9cac9c 100644 --- a/packages/core/src/main/cluster-detectors/detect-cluster-metadata.test.ts +++ b/packages/core/src/main/cluster-detectors/detect-cluster-metadata.test.ts @@ -22,7 +22,7 @@ describe("detect-cluster-metadata", () => { let cluster: Cluster; - beforeEach(async () => { + beforeEach(() => { const di = getDiForUnitTesting(); const lastSeenDetectMock = jest.fn().mockReturnValue(Promise.resolve({ value: "some-time-stamp", accuracy: 100 })); @@ -63,7 +63,7 @@ describe("detect-cluster-metadata", () => { detectClusterMetadata = di.inject(detectClusterMetadataInjectable); - cluster = new Cluster({ + cluster = Cluster.createForTestingOnly({ id: "some-id", contextName: "some-context", kubeConfigPath: "minikube-config.yml", diff --git a/packages/core/src/main/cluster/broadcast-connection-update.injectable.ts b/packages/core/src/main/cluster/broadcast-connection-update.injectable.ts index 0079d2700d..e05802029f 100644 --- a/packages/core/src/main/cluster/broadcast-connection-update.injectable.ts +++ b/packages/core/src/main/cluster/broadcast-connection-update.injectable.ts @@ -18,7 +18,7 @@ const broadcastConnectionUpdateInjectable = getInjectable({ return (update) => { logger.debug(`[CLUSTER]: broadcasting connection update`, { ...update, meta: cluster.getMeta() }); - broadcastMessage(`cluster:${cluster.id}:connection-update`, update); + void broadcastMessage(`cluster:${cluster.id}:connection-update`, update); }; }, lifecycle: lifecycleEnum.keyedSingleton({ diff --git a/packages/core/src/main/cluster/cluster-connection.injectable.ts b/packages/core/src/main/cluster/cluster-connection.injectable.ts index f8e58ed4c1..f9a316fb0e 100644 --- a/packages/core/src/main/cluster/cluster-connection.injectable.ts +++ b/packages/core/src/main/cluster/cluster-connection.injectable.ts @@ -25,7 +25,7 @@ import broadcastMessageInjectable from "../../common/ipc/broadcast-message.injec import createListNamespacesInjectable from "../../common/cluster/list-namespaces.injectable"; import kubeAuthProxyServerInjectable from "./kube-auth-proxy-server.injectable"; import loadProxyKubeconfigInjectable from "./load-proxy-kubeconfig.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; +import { prefixedLoggerInjectable } from "@k8slens/logger"; import prometheusHandlerInjectable from "./prometheus-handler/prometheus-handler.injectable"; import removeProxyKubeconfigInjectable from "./remove-proxy-kubeconfig.injectable"; import requestApiResourcesInjectable from "./request-api-resources.injectable"; @@ -75,15 +75,15 @@ class ClusterConnection { ) {} private bindEvents() { - this.dependencies.logger.info(`[CLUSTER]: bind events`, this.cluster.getMeta()); + this.dependencies.logger.info(`bind events`, this.cluster.getMeta()); const refreshTimer = setInterval(() => { if (!this.cluster.disconnected.get()) { - this.refresh(); + void this.refresh(); } }, 30_000); // every 30s const refreshMetadataTimer = setInterval(() => { if (this.cluster.available.get()) { - this.refreshAccessibilityAndMetadata(); + void this.refreshAccessibilityAndMetadata(); } }, 900000); // every 15 minutes @@ -95,18 +95,18 @@ class ClusterConnection { ), () => clearInterval(refreshTimer), () => clearInterval(refreshMetadataTimer), - reaction(() => this.cluster.preferences.defaultNamespace, () => this.recreateProxyKubeconfig()), + reaction(() => this.cluster.preferences.defaultNamespace, () => void this.recreateProxyKubeconfig()), ); } protected async recreateProxyKubeconfig() { - this.dependencies.logger.info("[CLUSTER]: Recreating proxy kubeconfig"); + this.dependencies.logger.info("Recreating proxy kubeconfig"); try { await this.dependencies.removeProxyKubeconfig(); await this.dependencies.loadProxyKubeconfig(); } catch (error) { - this.dependencies.logger.error(`[CLUSTER]: failed to recreate proxy kubeconfig`, error); + this.dependencies.logger.error(`failed to recreate proxy kubeconfig`, error); } } @@ -118,7 +118,7 @@ class ClusterConnection { return; } - this.dependencies.logger.info(`[CLUSTER]: activate`, this.cluster.getMeta()); + this.dependencies.logger.info(`activate`, this.cluster.getMeta()); if (!this.eventsDisposer.length) { this.bindEvents(); @@ -134,7 +134,7 @@ class ClusterConnection { } catch (error) { this.dependencies.broadcastConnectionUpdate({ level: "error", - message: `Failed to start connection: ${error}`, + message: `Failed to start connection: ${String(error)}`, }); return; @@ -150,7 +150,7 @@ class ClusterConnection { } catch (error) { this.dependencies.broadcastConnectionUpdate({ level: "error", - message: `Failed to connection status: ${error}`, + message: `Failed to connection status: ${String(error)}`, }); return; @@ -166,7 +166,7 @@ class ClusterConnection { } catch (error) { this.dependencies.broadcastConnectionUpdate({ level: "error", - message: `Failed to refresh accessibility: ${error}`, + message: `Failed to refresh accessibility: ${String(error)}`, }); return; @@ -181,7 +181,7 @@ class ClusterConnection { } async reconnect() { - this.dependencies.logger.info(`[CLUSTER]: reconnect`, this.cluster.getMeta()); + this.dependencies.logger.info(`reconnect`, this.cluster.getMeta()); await this.dependencies.kubeAuthProxyServer?.restart(); runInAction(() => { @@ -191,11 +191,11 @@ class ClusterConnection { disconnect() { if (this.cluster.disconnected.get()) { - return this.dependencies.logger.debug("[CLUSTER]: already disconnected", { id: this.cluster.id }); + return this.dependencies.logger.debug("already disconnected", { id: this.cluster.id }); } runInAction(() => { - this.dependencies.logger.info(`[CLUSTER]: disconnecting`, { id: this.cluster.id }); + this.dependencies.logger.info(`disconnecting`, { id: this.cluster.id }); this.eventsDisposer(); this.dependencies.kubeAuthProxyServer?.stop(); this.cluster.disconnected.set(true); @@ -204,12 +204,12 @@ class ClusterConnection { this.cluster.ready.set(false); this.activated = false; this.cluster.allowedNamespaces.clear(); - this.dependencies.logger.info(`[CLUSTER]: disconnected`, { id: this.cluster.id }); + this.dependencies.logger.info(`disconnected`, { id: this.cluster.id }); }); } async refresh() { - this.dependencies.logger.info(`[CLUSTER]: refresh`, this.cluster.getMeta()); + this.dependencies.logger.info(`refresh`, this.cluster.getMeta()); await this.refreshConnectionStatus(); } @@ -219,7 +219,7 @@ class ClusterConnection { } async refreshMetadata() { - this.dependencies.logger.info(`[CLUSTER]: refreshMetadata`, this.cluster.getMeta()); + this.dependencies.logger.info(`refreshMetadata`, this.cluster.getMeta()); const metadata = await this.dependencies.detectClusterMetadata(this.cluster); runInAction(() => { @@ -228,8 +228,16 @@ class ClusterConnection { } private async refreshAccessibility(): Promise { - this.dependencies.logger.info(`[CLUSTER]: refreshAccessibility`, this.cluster.getMeta()); - const proxyConfig = await this.dependencies.loadProxyKubeconfig(); + this.dependencies.logger.info(`refreshAccessibility`, this.cluster.getMeta()); + const proxyConfigResult = await this.dependencies.loadProxyKubeconfig(); + + if (!proxyConfigResult.isOk) { + this.dependencies.logger.error(`PROXY CONFIG FAILED VALIDATION: ${proxyConfigResult.error.toString()}`); + + return; + } + + const proxyConfig = proxyConfigResult.value; const api = this.dependencies.createAuthorizationApi(proxyConfig); const canI = this.dependencies.createCanI(api); const requestNamespaceListPermissions = this.dependencies.createRequestNamespaceListPermissions(api); @@ -247,17 +255,17 @@ class ClusterConnection { const knownResources = await (async () => { const result = await this.dependencies.requestApiResources(this.cluster); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } if (this.cluster.knownResources.length > 0) { - this.dependencies.logger.warn(`[CLUSTER]: failed to list KUBE resources, sticking with previous list`); + this.dependencies.logger.warn(`failed to list KUBE resources, sticking with previous list`); return this.cluster.knownResources; } - this.dependencies.logger.warn(`[CLUSTER]: failed to list KUBE resources for the first time, blocking connection to cluster...`); + this.dependencies.logger.warn(`failed to list KUBE resources for the first time, blocking connection to cluster...`); this.dependencies.broadcastConnectionUpdate({ level: "error", message: "Failed to list kube API resources, please reconnect...", @@ -276,7 +284,7 @@ class ClusterConnection { this.cluster.ready.set(this.cluster.knownResources.length > 0); }); - this.dependencies.logger.debug(`[CLUSTER]: refreshed accessibility data`, this.cluster.getState()); + this.dependencies.logger.debug(`refreshed accessibility data`, this.cluster.getState()); } async refreshConnectionStatus() { @@ -298,7 +306,7 @@ class ClusterConnection { return ClusterStatus.AccessGranted; } catch (error) { - this.dependencies.logger.error(`[CLUSTER]: Failed to connect to "${this.cluster.contextName.get()}": ${error}`); + this.dependencies.logger.error(`Failed to connect to "${this.cluster.contextName.get()}": ${String(error)}`); if (isRequestError(error)) { if (error.statusCode) { @@ -348,7 +356,7 @@ class ClusterConnection { } else if (error instanceof Error || typeof error === "string") { this.dependencies.broadcastConnectionUpdate({ level: "error", - message: `${error}`, + message: `${String(error)}`, }); } else { this.dependencies.broadcastConnectionUpdate({ @@ -378,8 +386,8 @@ class ClusterConnection { if (namespaceList.length === 0 && error instanceof HttpError && error.statusCode === 403) { const { response } = error as HttpError & { response: Response }; - this.dependencies.logger.info("[CLUSTER]: listing namespaces is forbidden, broadcasting", { clusterId: this.cluster.id, error: response.body }); - this.dependencies.broadcastMessage(clusterListNamespaceForbiddenChannel, this.cluster.id); + this.dependencies.logger.info("listing namespaces is forbidden, broadcasting", { clusterId: this.cluster.id, error: response.body }); + void this.dependencies.broadcastMessage(clusterListNamespaceForbiddenChannel, this.cluster.id); } return namespaceList; @@ -407,7 +415,7 @@ const clusterConnectionInjectable = getInjectable({ { clusterVersionDetector: di.inject(clusterVersionDetectorInjectable), kubeAuthProxyServer: di.inject(kubeAuthProxyServerInjectable, cluster), - logger: di.inject(loggerInjectionToken), + logger: di.inject(prefixedLoggerInjectable, "CLUSTER"), prometheusHandler: di.inject(prometheusHandlerInjectable, cluster), broadcastConnectionUpdate: di.inject(broadcastConnectionUpdateInjectable, cluster), broadcastMessage: di.inject(broadcastMessageInjectable), diff --git a/packages/core/src/main/cluster/load-proxy-kubeconfig.injectable.ts b/packages/core/src/main/cluster/load-proxy-kubeconfig.injectable.ts index b5e5856022..60f5e1c386 100644 --- a/packages/core/src/main/cluster/load-proxy-kubeconfig.injectable.ts +++ b/packages/core/src/main/cluster/load-proxy-kubeconfig.injectable.ts @@ -2,25 +2,26 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { AsyncResult } from "@k8slens/utilities"; import type { KubeConfig } from "@kubernetes/client-node"; import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import type { ZodError } from "zod"; import type { Cluster } from "../../common/cluster/cluster"; import loadConfigFromFileInjectable from "../../common/kube-helpers/load-config-from-file.injectable"; import kubeconfigManagerInjectable from "../kubeconfig-manager/kubeconfig-manager.injectable"; -export type LoadProxyKubeconfig = () => Promise; +export type LoadProxyKubeconfig = () => AsyncResult>; const loadProxyKubeconfigInjectable = getInjectable({ id: "load-proxy-kubeconfig", - instantiate: (di, cluster) => { + instantiate: (di, cluster): LoadProxyKubeconfig => { const loadConfigFromFile = di.inject(loadConfigFromFileInjectable); const proxyKubeconfigManager = di.inject(kubeconfigManagerInjectable, cluster); return async () => { const proxyKubeconfigPath = await proxyKubeconfigManager.ensurePath(); - const { config } = await loadConfigFromFile(proxyKubeconfigPath); - return config; + return loadConfigFromFile(proxyKubeconfigPath); }; }, lifecycle: lifecycleEnum.keyedSingleton({ diff --git a/packages/core/src/main/cluster/manager.injectable.ts b/packages/core/src/main/cluster/manager.injectable.ts index e7089eb06a..b3b457e421 100644 --- a/packages/core/src/main/cluster/manager.injectable.ts +++ b/packages/core/src/main/cluster/manager.injectable.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; +import { prefixedLoggerInjectable } from "@k8slens/logger"; import addClusterInjectable from "../../features/cluster/storage/common/add.injectable"; import clustersInjectable from "../../features/cluster/storage/common/clusters.injectable"; import getClusterByIdInjectable from "../../features/cluster/storage/common/get-by-id.injectable"; @@ -22,7 +22,7 @@ const clusterManagerInjectable = getInjectable({ catalogEntityRegistry: di.inject(catalogEntityRegistryInjectable), clustersThatAreBeingDeleted: di.inject(clustersThatAreBeingDeletedInjectable), visibleCluster: di.inject(visibleClusterInjectable), - logger: di.inject(loggerInjectionToken), + logger: di.inject(prefixedLoggerInjectable, "CLUSTER-MANAGER"), addCluster: di.inject(addClusterInjectable), clusters: di.inject(clustersInjectable), getClusterById: di.inject(getClusterByIdInjectable), diff --git a/packages/core/src/main/cluster/manager.ts b/packages/core/src/main/cluster/manager.ts index e49293de8e..c88a76c6c7 100644 --- a/packages/core/src/main/cluster/manager.ts +++ b/packages/core/src/main/cluster/manager.ts @@ -5,8 +5,8 @@ import "../../common/ipc/cluster"; import type { IComputedValue, IObservableValue, ObservableSet } from "mobx"; -import { action, makeObservable, observe, reaction, toJS } from "mobx"; -import type { Cluster } from "../../common/cluster/cluster"; +import { runInAction, action, makeObservable, observe, reaction, toJS } from "mobx"; +import { Cluster } from "../../common/cluster/cluster"; import { isKubernetesCluster, KubernetesCluster, LensKubernetesClusterStatus } from "../../common/catalog-entities/kubernetes-cluster"; import { ipcMainOn } from "../../common/ipc"; import { once } from "lodash"; @@ -19,8 +19,6 @@ import type { ClusterConnection } from "./cluster-connection.injectable"; import type { GetClusterById } from "../../features/cluster/storage/common/get-by-id.injectable"; import type { AddCluster } from "../../features/cluster/storage/common/add.injectable"; -const logPrefix = "[CLUSTER-MANAGER]:"; - const lensSpecificClusterStatuses: Set = new Set(Object.values(LensKubernetesClusterStatus)); interface Dependencies { @@ -84,13 +82,14 @@ export class ClusterManager { ipcMainOn("network:online", this.onNetworkOnline); }); - @action protected updateCatalog(clusters: Cluster[]) { this.dependencies.logger.debug("[CLUSTER-MANAGER]: updating catalog from cluster store"); - for (const cluster of clusters) { - this.updateEntityFromCluster(cluster); - } + runInAction(() => { + for (const cluster of clusters) { + this.updateEntityFromCluster(cluster); + } + }); } protected updateEntityFromCluster(cluster: Cluster) { @@ -118,31 +117,31 @@ export class ClusterManager { } else { entity.status.phase = (() => { if (!cluster) { - this.dependencies.logger.silly(`${logPrefix} setting entity ${entity.getName()} to DISCONNECTED, reason="no cluster"`); + this.dependencies.logger.silly(`setting entity ${entity.getName()} to DISCONNECTED, reason="no cluster"`); return LensKubernetesClusterStatus.DISCONNECTED; } if (cluster.accessible.get()) { - this.dependencies.logger.silly(`${logPrefix} setting entity ${entity.getName()} to CONNECTED, reason="cluster is accessible"`); + this.dependencies.logger.silly(`setting entity ${entity.getName()} to CONNECTED, reason="cluster is accessible"`); return LensKubernetesClusterStatus.CONNECTED; } if (!cluster.disconnected.get()) { - this.dependencies.logger.silly(`${logPrefix} setting entity ${entity.getName()} to CONNECTING, reason="cluster is not disconnected"`); + this.dependencies.logger.silly(`setting entity ${entity.getName()} to CONNECTING, reason="cluster is not disconnected"`); return LensKubernetesClusterStatus.CONNECTING; } // Extensions are not allowed to use the Lens specific status phases if (!lensSpecificClusterStatuses.has(entity?.status?.phase)) { - this.dependencies.logger.silly(`${logPrefix} not clearing entity ${entity.getName()} status, reason="custom string"`); + this.dependencies.logger.silly(`not clearing entity ${entity.getName()} status, reason="custom string"`); return entity.status.phase; } - this.dependencies.logger.silly(`${logPrefix} setting entity ${entity.getName()} to DISCONNECTED, reason="fallthrough"`); + this.dependencies.logger.silly(`setting entity ${entity.getName()} to DISCONNECTED, reason="fallthrough"`); return LensKubernetesClusterStatus.DISCONNECTED; })(); @@ -157,12 +156,16 @@ export class ClusterManager { const cluster = this.dependencies.getClusterById(entity.getId()); if (!cluster) { - this.dependencies.addCluster({ + const result = this.dependencies.addCluster({ id: entity.getId(), kubeConfigPath: entity.spec.kubeconfigPath, contextName: entity.spec.kubeconfigContext, accessibleNamespaces: entity.spec.accessibleNamespaces ?? [], }); + + if (result.isOk === false) { + this.dependencies.logger.warn(`failed to sync cluster "${entity.getId()}" from catalog: ${result.error.toString()}`); + } } else { cluster.kubeConfigPath.set(entity.spec.kubeconfigPath); cluster.contextName.set(entity.spec.kubeconfigContext); @@ -193,7 +196,7 @@ export class ClusterManager { } protected onNetworkOffline = async () => { - this.dependencies.logger.info(`${logPrefix} network is offline`); + this.dependencies.logger.info(`network is offline`); await Promise.allSettled( this.dependencies @@ -212,7 +215,7 @@ export class ClusterManager { }; protected onNetworkOnline = async () => { - this.dependencies.logger.info(`${logPrefix} network is online`); + this.dependencies.logger.info(`network is online`); await Promise.allSettled( this.dependencies diff --git a/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.injectable.ts b/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.injectable.ts index bdc8ecf9d5..c4fb425069 100644 --- a/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.injectable.ts +++ b/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.injectable.ts @@ -7,7 +7,7 @@ import type { Cluster } from "../../../common/cluster/cluster"; import { createClusterPrometheusHandler } from "./prometheus-handler"; import getPrometheusProviderByKindInjectable from "../../prometheus/get-by-kind.injectable"; import prometheusProvidersInjectable from "../../prometheus/providers.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; +import { prefixedLoggerInjectable } from "@k8slens/logger"; import loadProxyKubeconfigInjectable from "../load-proxy-kubeconfig.injectable"; const prometheusHandlerInjectable = getInjectable({ @@ -17,7 +17,7 @@ const prometheusHandlerInjectable = getInjectable({ { getPrometheusProviderByKind: di.inject(getPrometheusProviderByKindInjectable), prometheusProviders: di.inject(prometheusProvidersInjectable), - logger: di.inject(loggerInjectionToken), + logger: di.inject(prefixedLoggerInjectable, "PROMETHEUS-HANDLER"), loadProxyKubeconfig: di.inject(loadProxyKubeconfigInjectable, cluster), }, cluster, diff --git a/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.ts b/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.ts index 81c3901750..ca124128f5 100644 --- a/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.ts +++ b/packages/core/src/main/cluster/prometheus-handler/prometheus-handler.ts @@ -33,7 +33,7 @@ interface Dependencies { export interface ClusterPrometheusHandler { setupPrometheus(preferences?: ClusterPrometheusPreferences): void; - getPrometheusDetails(): Promise; + getPrometheusDetails(): Promise; } const ensurePrometheusPath = ({ service, namespace, port }: PrometheusService) => `${namespace}/services/${service}:${port}`; @@ -57,7 +57,7 @@ export const createClusterPrometheusHandler = (...args: [Dependencies, Cluster]) const ensurePrometheusProvider = (service: PrometheusService) => { if (!prometheusProvider) { - logger.info(`[CONTEXT-HANDLER]: using ${service.kind} as prometheus provider for clusterId=${cluster.id}`); + logger.info(`using ${service.kind} as prometheus provider for clusterId=${cluster.id}`); prometheusProvider = service.kind; } @@ -76,7 +76,7 @@ export const createClusterPrometheusHandler = (...args: [Dependencies, Cluster]) return prometheusProviders.get(); }; - const getPrometheusService = async (): Promise => { + const getPrometheusService = async (): Promise => { setupPrometheus(cluster.preferences); if (prometheus && prometheusProvider) { @@ -89,7 +89,15 @@ export const createClusterPrometheusHandler = (...args: [Dependencies, Cluster]) } const providers = listPotentialProviders(); - const proxyConfig = await loadProxyKubeconfig(); + const proxyConfigResult = await loadProxyKubeconfig(); + + if (!proxyConfigResult.isOk) { + logger.error(`PROXY CONFIG FAILED VALIDATION: ${proxyConfigResult.error.toString()}`); + + return undefined; + } + + const proxyConfig = proxyConfigResult.value; const apiClient = proxyConfig.makeApiClient(CoreV1Api); const potentialServices = await Promise.allSettled( providers.map(provider => provider.getPrometheusService(apiClient)), @@ -114,6 +122,11 @@ export const createClusterPrometheusHandler = (...args: [Dependencies, Cluster]) const getPrometheusDetails: ClusterPrometheusHandler["getPrometheusDetails"] = async () => { const service = await getPrometheusService(); + + if (!service) { + return undefined; + } + const prometheusPath = ensurePrometheusPath(service); const provider = ensurePrometheusProvider(service); diff --git a/packages/core/src/main/cluster/request-api-resources.injectable.ts b/packages/core/src/main/cluster/request-api-resources.injectable.ts index 9f7eb742e7..bc8eff019b 100644 --- a/packages/core/src/main/cluster/request-api-resources.injectable.ts +++ b/packages/core/src/main/cluster/request-api-resources.injectable.ts @@ -39,18 +39,18 @@ const requestApiResourcesInjectable = getInjectable({ const result = await backoffCaller(() => apiVersionRequester.request(cluster), { onIntermediateError: (error, attempt) => { broadcastConnectionUpdate({ - message: `Failed to list kube API resource kinds, attempt ${attempt}: ${error}`, + message: `Failed to list kube API resource kinds, attempt ${attempt}: ${String(error)}`, level: "warning", }); - logger.warn(`[LIST-API-RESOURCES]: failed to list kube api resources: ${error}`, { attempt, clusterId: cluster.id }); + logger.warn(`[LIST-API-RESOURCES]: failed to list kube api resources: ${String(error)}`, { attempt, clusterId: cluster.id }); }, }); - if (!result.callWasSuccessful) { + if (!result.isOk) { return result; } - groupLists.push(...result.response); + groupLists.push(...result.value); } const apiResourceRequests = groupLists.map(async listGroup => ( @@ -60,7 +60,7 @@ const requestApiResourcesInjectable = getInjectable({ const resources: KubeApiResource[] = []; for (const result of results) { - if (!result.callWasSuccessful) { + if (!result.isOk) { broadcastConnectionUpdate({ message: `Kube APIs under "${result.listGroup.path}" may not be displayed`, level: "warning", @@ -68,12 +68,12 @@ const requestApiResourcesInjectable = getInjectable({ continue; } - resources.push(...result.response); + resources.push(...result.value); } return { - callWasSuccessful: true, - response: resources, + isOk: true, + value: resources, }; }; }, diff --git a/packages/core/src/main/cluster/request-core-api-versions.injectable.ts b/packages/core/src/main/cluster/request-core-api-versions.injectable.ts index 5b059d6f7f..6484b60feb 100644 --- a/packages/core/src/main/cluster/request-core-api-versions.injectable.ts +++ b/packages/core/src/main/cluster/request-core-api-versions.injectable.ts @@ -18,15 +18,15 @@ const requestCoreApiVersionsInjectable = getInjectable({ const { versions } = await k8sRequest(cluster, "/api") as V1APIVersions; return { - callWasSuccessful: true, - response: versions.map(version => ({ + isOk: true, + value: versions.map(version => ({ group: "", path: `/api/${version}`, })), }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: error as Error, }; } diff --git a/packages/core/src/main/cluster/request-kube-api-resources-for.injectable.ts b/packages/core/src/main/cluster/request-kube-api-resources-for.injectable.ts index 80720a9ef1..50f2277db5 100644 --- a/packages/core/src/main/cluster/request-kube-api-resources-for.injectable.ts +++ b/packages/core/src/main/cluster/request-kube-api-resources-for.injectable.ts @@ -24,8 +24,8 @@ const requestKubeApiResourcesForInjectable = getInjectable({ const { resources } = await k8sRequest(cluster, path) as V1APIResourceList; return { - callWasSuccessful: true, - response: resources.map(resource => ({ + isOk: true, + value: resources.map(resource => ({ apiName: resource.name, kind: resource.kind, group, @@ -34,7 +34,7 @@ const requestKubeApiResourcesForInjectable = getInjectable({ }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: error as Error, }; } diff --git a/packages/core/src/main/cluster/request-non-core-api-versions.injectable.ts b/packages/core/src/main/cluster/request-non-core-api-versions.injectable.ts index 7e5abbc44d..0604c068f1 100644 --- a/packages/core/src/main/cluster/request-non-core-api-versions.injectable.ts +++ b/packages/core/src/main/cluster/request-non-core-api-versions.injectable.ts @@ -19,8 +19,8 @@ const requestNonCoreApiVersionsInjectable = getInjectable({ const { groups } = (await k8sRequest(cluster, "/apis")) as V1APIGroupList; return { - callWasSuccessful: true, - response: iter.chain(groups.values()) + isOk: true, + value: iter.chain(groups.values()) .flatMap((group) => group.versions.map((version) => ({ group: group.name, @@ -31,7 +31,7 @@ const requestNonCoreApiVersionsInjectable = getInjectable({ }; } catch (error) { return { - callWasSuccessful: false, + isOk: false, error: error as Error, }; } diff --git a/packages/core/src/main/cluster/request-non-core-api-versions.test.ts b/packages/core/src/main/cluster/request-non-core-api-versions.test.ts index ca4dcd01b7..d62c32ba47 100644 --- a/packages/core/src/main/cluster/request-non-core-api-versions.test.ts +++ b/packages/core/src/main/cluster/request-non-core-api-versions.test.ts @@ -45,8 +45,8 @@ describe("requestNonCoreApiVersions", () => { it("should return empty list", async () => { expect(await versionsRequest).toEqual({ - callWasSuccessful: true, - response: [], + isOk: true, + value: [], }); }); }); @@ -64,8 +64,8 @@ describe("requestNonCoreApiVersions", () => { it("should return single entry in list", async () => { expect(await versionsRequest).toEqual({ - callWasSuccessful: true, - response: [{ + isOk: true, + value: [{ group: "some-name", path: "/apis/some-name/v1", }], @@ -92,8 +92,8 @@ describe("requestNonCoreApiVersions", () => { it("should return multiple entries in list", async () => { expect(await versionsRequest).toEqual({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { group: "some-name", path: "/apis/some-name/v1", @@ -141,8 +141,8 @@ describe("requestNonCoreApiVersions", () => { it("should return multiple entries in list", async () => { expect(await versionsRequest).toEqual({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { group: "some-name", path: "/apis/some-name/v1", diff --git a/packages/core/src/main/cluster/store-migrations/3.6.0-beta.1.injectable.ts b/packages/core/src/main/cluster/store-migrations/3.6.0-beta.1.injectable.ts index 06a3d48f9b..bdd7d96762 100644 --- a/packages/core/src/main/cluster/store-migrations/3.6.0-beta.1.injectable.ts +++ b/packages/core/src/main/cluster/store-migrations/3.6.0-beta.1.injectable.ts @@ -43,35 +43,37 @@ const v360Beta1ClusterStoreMigrationInjectable = getInjectable({ logger.info("Number of clusters to migrate: ", storedClusters.length); for (const clusterModel of storedClusters) { - /** - * migrate kubeconfig - */ - try { - const absPath = getCustomKubeConfigDirectory(clusterModel.id); - - if (!clusterModel.kubeConfig) { - continue; - } - - // take the embedded kubeconfig and dump it into a file - writeFileSync(absPath, clusterModel.kubeConfig); - - clusterModel.kubeConfigPath = absPath; - clusterModel.contextName = loadConfigFromString(readFileSync(absPath)).config.getCurrentContext(); - delete clusterModel.kubeConfig; - - } catch (error) { - logger.info(`Failed to migrate Kubeconfig for cluster "${clusterModel.id}", removing clusterModel...`, error); + const absPath = getCustomKubeConfigDirectory(clusterModel.id); + if (!clusterModel.kubeConfig) { continue; } + try { + // take the embedded kubeconfig and dump it into a file + writeFileSync(absPath, clusterModel.kubeConfig); + } catch (error) { + logger.info(`Failed to migrate Kubeconfig to local file for cluster "${clusterModel.id}", removing cluster...`, error); + continue; + } + + const result = loadConfigFromString(readFileSync(absPath)); + + if (!result.isOk) { + logger.info(`Failed to migrate Kubeconfig for cluster "${clusterModel.id}", removing cluster...`, result.error); + continue; + } + + clusterModel.kubeConfigPath = absPath; + clusterModel.contextName = result.value.getCurrentContext(); + delete clusterModel.kubeConfig; + /** * migrate cluster icon */ try { if (clusterModel.preferences?.icon) { - logger.info(`migrating ${clusterModel.preferences.icon} for ${clusterModel.preferences.clusterName}`); + logger.info(`migrating ${clusterModel.preferences.icon} for ${clusterModel.preferences.clusterName ?? clusterModel.contextName}`); const iconPath = clusterModel.preferences.icon.replace("store://", ""); const fileData = readFileBufferSync(joinPaths(userDataPath, iconPath)); diff --git a/packages/core/src/main/cluster/store-migrations/5.0.0-beta.10.injectable.ts b/packages/core/src/main/cluster/store-migrations/5.0.0-beta.10.injectable.ts index 3ba3629578..47741e8971 100644 --- a/packages/core/src/main/cluster/store-migrations/5.0.0-beta.10.injectable.ts +++ b/packages/core/src/main/cluster/store-migrations/5.0.0-beta.10.injectable.ts @@ -32,7 +32,7 @@ const v500Beta10ClusterStoreMigrationInjectable = getInjectable({ version: "5.0.0-beta.10", run(store) { try { - const workspaceData: Pre500WorkspaceStoreModel = readJsonSync(joinPaths(userDataPath, "lens-workspace-store.json")); + const workspaceData = readJsonSync(joinPaths(userDataPath, "lens-workspace-store.json")) as Pre500WorkspaceStoreModel; const workspaces = new Map(); // mapping from WorkspaceId to name for (const { id, name } of workspaceData.workspaces) { @@ -53,11 +53,6 @@ const v500Beta10ClusterStoreMigrationInjectable = getInjectable({ store.set("clusters", clusters); } catch (error) { - // KLUDGE: remove after https://github.com/streamich/memfs/pull/893 is released - if (process.env.JEST_WORKER_ID && (error as any).code === "ENOENT") { - return; - } - if (isErrnoException(error) && error.code === "ENOENT" && error.path?.endsWith("lens-workspace-store.json")) { // ignore lens-workspace-store.json being missing return; diff --git a/packages/core/src/main/cluster/update-entity-metadata.test.ts b/packages/core/src/main/cluster/update-entity-metadata.test.ts index eca53c238e..e51d512eca 100644 --- a/packages/core/src/main/cluster/update-entity-metadata.test.ts +++ b/packages/core/src/main/cluster/update-entity-metadata.test.ts @@ -6,6 +6,7 @@ import type { AppPaths } from "../../common/app-paths/app-path-injection-token"; import appPathsStateInjectable from "../../common/app-paths/app-paths-state.injectable"; import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import { KubernetesCluster } from "../../common/catalog-entities"; +import type { ClusterMetadata } from "../../common/cluster-types"; import { ClusterMetadataKey } from "../../common/cluster-types"; import { Cluster } from "../../common/cluster/cluster"; import { replaceObservableObject } from "../../common/utils/replace-observable-object"; @@ -17,7 +18,7 @@ describe("update-entity-metadata", () => { let cluster: Cluster; let entity: KubernetesCluster; let updateEntityMetadata: UpdateEntityMetadata; - let detectedMetadata: Record; + let detectedMetadata: ClusterMetadata; beforeEach(() => { const di = getDiForUnitTesting(); @@ -30,7 +31,7 @@ describe("update-entity-metadata", () => { updateEntityMetadata = di.inject(updateEntityMetadataInjectable); - cluster = new Cluster({ + cluster = Cluster.createForTestingOnly({ id: "some-id", contextName: "some-context", kubeConfigPath: "minikube-config.yml", diff --git a/packages/core/src/main/cluster/update-entity-spec.test.ts b/packages/core/src/main/cluster/update-entity-spec.test.ts index fa2c14bb5a..9c871bf6ca 100644 --- a/packages/core/src/main/cluster/update-entity-spec.test.ts +++ b/packages/core/src/main/cluster/update-entity-spec.test.ts @@ -27,7 +27,7 @@ describe("update-entity-spec", () => { updateEntitySpec = di.inject(updateEntitySpecInjectable); - cluster = new Cluster({ + cluster = Cluster.createForTestingOnly({ id: "some-id", contextName: "some-context", kubeConfigPath: "minikube-config.yml", diff --git a/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts b/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts index a20dc204ee..99f05efc8b 100644 --- a/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts +++ b/packages/core/src/main/electron-app/electron-app.global-override-for-injectable.ts @@ -182,7 +182,7 @@ export default getGlobalOverride(electronAppInjectable, () => { void enabled; throw new Error("Method not implemented."); } - setUserActivity(type: string, userInfo: any, webpageURL?: string | undefined): void { + setUserActivity(type: string, userInfo: unknown, webpageURL?: string | undefined): void { void type; void userInfo; void webpageURL; @@ -201,11 +201,11 @@ export default getGlobalOverride(electronAppInjectable, () => { showEmojiPanel(): void { throw new Error("Method not implemented."); } - startAccessingSecurityScopedResource(bookmarkData: string): Function { + startAccessingSecurityScopedResource(bookmarkData: string): () => void { void bookmarkData; throw new Error("Method not implemented."); } - updateCurrentActivity(type: string, userInfo: any): void { + updateCurrentActivity(type: string, userInfo: unknown): void { void type; void userInfo; throw new Error("Method not implemented."); diff --git a/packages/core/src/main/electron-app/features/electron-dialog.global-override-for-injectable.ts b/packages/core/src/main/electron-app/features/electron-dialog.global-override-for-injectable.ts index 117c8a3fbd..4362dac7b9 100644 --- a/packages/core/src/main/electron-app/features/electron-dialog.global-override-for-injectable.ts +++ b/packages/core/src/main/electron-app/features/electron-dialog.global-override-for-injectable.ts @@ -9,17 +9,17 @@ import electronDialogInjectable from "./electron-dialog.injectable"; export default getGlobalOverride(electronDialogInjectable, () => ({ showCertificateTrustDialog: async () => {}, showErrorBox: () => {}, - showMessageBox: async () => ({ + showMessageBox: () => Promise.resolve({ checkboxChecked: false, response: 0, }), showMessageBoxSync: () => 0, - showOpenDialog: async () => ({ + showOpenDialog: () => Promise.resolve({ canceled: true, filePaths: [], }), showOpenDialogSync: () => [], - showSaveDialog: async () => ({ + showSaveDialog: () => Promise.resolve({ canceled: true, }), showSaveDialogSync: () => "", diff --git a/packages/core/src/main/electron-app/features/show-message-popup.injectable.ts b/packages/core/src/main/electron-app/features/show-message-popup.injectable.ts index fb9f4ab871..85e1675f00 100644 --- a/packages/core/src/main/electron-app/features/show-message-popup.injectable.ts +++ b/packages/core/src/main/electron-app/features/show-message-popup.injectable.ts @@ -9,7 +9,7 @@ export interface ShowMessagePopupOptions { textWidth?: number; } -export type ShowMessagePopup = (title: string, message: string, detail: string, options?: ShowMessagePopupOptions) => void; +export type ShowMessagePopup = (title: string, message: string, detail: string, options?: ShowMessagePopupOptions) => Promise; const showMessagePopupInjectable = getInjectable({ id: "show-message-popup", diff --git a/packages/core/src/main/electron-app/runnables/dock-visibility/show-dock-for-first-opened-window.injectable.ts b/packages/core/src/main/electron-app/runnables/dock-visibility/show-dock-for-first-opened-window.injectable.ts index 9f52dcab42..b84cedeb59 100644 --- a/packages/core/src/main/electron-app/runnables/dock-visibility/show-dock-for-first-opened-window.injectable.ts +++ b/packages/core/src/main/electron-app/runnables/dock-visibility/show-dock-for-first-opened-window.injectable.ts @@ -10,10 +10,10 @@ const showDockForFirstOpenedWindowInjectable = getInjectable({ id: "show-dock-for-first-opened-window", instantiate: (di) => ({ - run: () => { + run: async () => { const app = di.inject(electronAppInjectable); - app.dock?.show(); + await app.dock?.show(); }, }), diff --git a/packages/core/src/main/electron-app/runnables/setup-deep-linking.injectable.ts b/packages/core/src/main/electron-app/runnables/setup-deep-linking.injectable.ts index cef9ffac26..81096b9101 100644 --- a/packages/core/src/main/electron-app/runnables/setup-deep-linking.injectable.ts +++ b/packages/core/src/main/electron-app/runnables/setup-deep-linking.injectable.ts @@ -36,24 +36,22 @@ const setupDeepLinkingInjectable = getInjectable({ await openDeepLinkForUrl(url); } - app.on("open-url", async (event, url) => { + app.on("open-url", (event, url) => { event.preventDefault(); - - await openDeepLinkForUrl(url); + void openDeepLinkForUrl(url); }); - app.on( - "second-instance", - async (_, secondInstanceCommandLineArguments) => { - const url = getDeepLinkUrl(secondInstanceCommandLineArguments); + app.on("second-instance", (_, secondInstanceCommandLineArguments) => { + const url = getDeepLinkUrl(secondInstanceCommandLineArguments); + void (async () => { await showApplicationWindow(); if (url) { await openDeepLinkForUrl(url); } - }, - ); + })(); + }); }, }), diff --git a/packages/core/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts b/packages/core/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts index 6fdd498910..de4e274654 100644 --- a/packages/core/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts +++ b/packages/core/src/main/electron-app/runnables/setup-ipc-main-handlers/setup-ipc-main-handlers.ts @@ -2,13 +2,13 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { IpcMainInvokeEvent } from "electron"; import { BrowserWindow, Menu } from "electron"; import type { ClusterFrameInfo } from "../../../../common/cluster-frames.injectable"; import { clusterSetFrameIdHandler, clusterStates } from "../../../../common/ipc/cluster"; import type { ClusterId } from "../../../../common/cluster-types"; import { broadcastMainChannel, broadcastMessage, ipcMainHandle, ipcMainOn } from "../../../../common/ipc"; import type { IComputedValue, ObservableMap } from "mobx"; +import type { WindowAction } from "../../../../common/ipc/window"; import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../../common/ipc/window"; import { handleWindowAction, onLocationChange } from "../../../ipc/window"; import type { ApplicationMenuItemTypes } from "../../../../features/application-menu/main/menu-items/application-menu-item-injection-token"; @@ -33,8 +33,8 @@ export const setupIpcMainHandlers = ({ clusterFrames, clusters, }: Dependencies) => { - ipcMainHandle(clusterSetFrameIdHandler, (event: IpcMainInvokeEvent, clusterId: ClusterId) => { - const cluster = getClusterById(clusterId); + ipcMainHandle(clusterSetFrameIdHandler, (event, clusterId) => { + const cluster = getClusterById(clusterId as ClusterId); if (cluster) { clusterFrames.set(cluster.id, { frameId: event.frameId, processId: event.processId }); @@ -42,13 +42,13 @@ export const setupIpcMainHandlers = ({ } }); - ipcMainHandle(windowActionHandleChannel, (event, action) => handleWindowAction(action)); + ipcMainHandle(windowActionHandleChannel, (event, action) => handleWindowAction(action as WindowAction)); ipcMainOn(windowLocationChangedChannel, () => onLocationChange()); - ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args)); + ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel as string, ...args)); - ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => { + ipcMainOn(windowOpenAppMenuAsContextMenuChannel, (event) => { const electronTemplate = getApplicationMenuTemplate(applicationMenuItemComposite.get()); const menu = Menu.buildFromTemplate(electronTemplate); diff --git a/packages/core/src/main/electron-app/runnables/setup-runnables-after-window-is-opened.injectable.ts b/packages/core/src/main/electron-app/runnables/setup-runnables-after-window-is-opened.injectable.ts index 5370c0e303..4fe8a05dc4 100644 --- a/packages/core/src/main/electron-app/runnables/setup-runnables-after-window-is-opened.injectable.ts +++ b/packages/core/src/main/electron-app/runnables/setup-runnables-after-window-is-opened.injectable.ts @@ -17,7 +17,7 @@ const setupRunnablesAfterWindowIsOpenedInjectable = getInjectable({ const app = di.inject(electronAppInjectable); app.on("browser-window-created", () => { - afterWindowIsOpened(); + void afterWindowIsOpened(); }); return undefined; diff --git a/packages/core/src/main/getDiForUnitTesting.ts b/packages/core/src/main/getDiForUnitTesting.ts index 5ceb1b8425..e856da8ae3 100644 --- a/packages/core/src/main/getDiForUnitTesting.ts +++ b/packages/core/src/main/getDiForUnitTesting.ts @@ -4,7 +4,7 @@ */ import { chunk } from "lodash/fp"; -import type { DiContainer } from "@ogre-tools/injectable"; +import type { DiContainer, Injectable } from "@ogre-tools/injectable"; import { createContainer, isInjectable } from "@ogre-tools/injectable"; import spawnInjectable from "./child-process/spawn.injectable"; import initializeExtensionsInjectable from "./start-main-application/runnables/initialize-extensions.injectable"; @@ -53,9 +53,10 @@ export function getDiForUnitTesting() { runInAction(() => { const injectables = global.injectablePaths.main.paths - .map(path => require(path)) - .flatMap(Object.values) - .filter(isInjectable); + // eslint-disable-next-line @typescript-eslint/no-var-requires + .map(path => require(path) as object) + .flatMap((value) => Object.values(value) as unknown[]) + .filter(isInjectable) as Injectable[]; for (const block of chunk(100)(injectables)) { di.register(...block); @@ -63,6 +64,7 @@ export function getDiForUnitTesting() { }); for (const globalOverridePath of global.injectablePaths.main.globalOverridePaths) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-var-requires const globalOverride = require(globalOverridePath).default as GlobalOverride; di.override(globalOverride.injectable, globalOverride.overridingInstantiate); diff --git a/packages/core/src/main/helm/__tests__/helm-service.test.ts b/packages/core/src/main/helm/__tests__/helm-service.test.ts index bd4f7c2697..f7b5e1ad8c 100644 --- a/packages/core/src/main/helm/__tests__/helm-service.test.ts +++ b/packages/core/src/main/helm/__tests__/helm-service.test.ts @@ -10,10 +10,12 @@ import type { AsyncResult } from "@k8slens/utilities"; import type { HelmRepo } from "../../../common/helm/helm-repo"; import { sortBySemverVersion } from "@k8slens/utilities"; import helmChartManagerInjectable from "../helm-chart-manager.injectable"; +import type { RepoHelmChartList } from "../../../common/k8s-api/endpoints/helm-charts.api/request-charts.injectable"; +import type { HelmChartManager } from "../helm-chart-manager"; describe("Helm Service tests", () => { - let listHelmCharts: () => Promise; - let getActiveHelmRepositoriesMock: jest.Mock>; + let listHelmCharts: () => Promise>; + let getActiveHelmRepositoriesMock: jest.MockedFunction<() => AsyncResult>; beforeEach(() => { const di = getDiForUnitTesting(); @@ -22,7 +24,7 @@ describe("Helm Service tests", () => { di.override( helmChartManagerInjectable, - (di, repo) => new HelmChartManagerFake(repo) as unknown, + (di, repo) => new HelmChartManagerFake(repo) as unknown as HelmChartManager, ); di.override(getActiveHelmRepositoriesInjectable, () => getActiveHelmRepositoriesMock); @@ -39,8 +41,8 @@ describe("Helm Service tests", () => { it("list charts with deprecated entries", async () => { getActiveHelmRepositoriesMock.mockReturnValue( Promise.resolve({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { name: "stable", url: "stableurl", @@ -157,8 +159,8 @@ describe("Helm Service tests", () => { it("list charts sorted by version in descending order", async () => { getActiveHelmRepositoriesMock.mockReturnValue( Promise.resolve({ - callWasSuccessful: true, - response: [{ + isOk: true, + value: [{ name: "bitnami", url: "bitnamiurl", cacheFilePath: "/some-cache-file-path-for-bitnami", @@ -348,7 +350,7 @@ const charts = new Map([ class HelmChartManagerFake { constructor(private repo: HelmRepo){ } - public async charts(): Promise { - return charts.get(this.repo.name) ?? {}; + public async charts(): Promise { + return Promise.resolve(charts.get(this.repo.name) ?? {}); } } diff --git a/packages/core/src/main/helm/delete-helm-release.injectable.ts b/packages/core/src/main/helm/delete-helm-release.injectable.ts index a4c08af96f..c3be156289 100644 --- a/packages/core/src/main/helm/delete-helm-release.injectable.ts +++ b/packages/core/src/main/helm/delete-helm-release.injectable.ts @@ -25,8 +25,8 @@ const deleteHelmReleaseInjectable = getInjectable({ "--kubeconfig", kubeconfigPath, ]); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } throw result.error; diff --git a/packages/core/src/main/helm/get-helm-env/get-helm-env.injectable.ts b/packages/core/src/main/helm/get-helm-env/get-helm-env.injectable.ts index e3a9969ffc..658a1411db 100644 --- a/packages/core/src/main/helm/get-helm-env/get-helm-env.injectable.ts +++ b/packages/core/src/main/helm/get-helm-env/get-helm-env.injectable.ts @@ -17,14 +17,14 @@ const getHelmEnvInjectable = getInjectable({ instantiate: (di) => { const execHelm = di.inject(execHelmInjectable); - return async (): AsyncResult => { + return async (): AsyncResult => { const result = await execHelm(["env"]); - if (!result.callWasSuccessful) { - return { callWasSuccessful: false, error: result.error.stderr }; + if (!result.isOk) { + return { isOk: false, error: result.error.stderr }; } - const lines = result.response.split(/\r?\n/); // split by new line feed + const lines = result.value.split(/\r?\n/); // split by new line feed const env: HelmEnv = {}; lines.forEach((line: string) => { @@ -35,7 +35,7 @@ const getHelmEnvInjectable = getInjectable({ } }); - return { callWasSuccessful: true, response: env }; + return { isOk: true, value: env }; }; }, }); diff --git a/packages/core/src/main/helm/get-helm-release-history.injectable.ts b/packages/core/src/main/helm/get-helm-release-history.injectable.ts index 5f8f4e5a6e..f2a54f6a57 100644 --- a/packages/core/src/main/helm/get-helm-release-history.injectable.ts +++ b/packages/core/src/main/helm/get-helm-release-history.injectable.ts @@ -2,6 +2,8 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { AsyncResult } from "@k8slens/utilities"; +import { json, result, isArray } from "@k8slens/utilities"; import { getInjectable } from "@ogre-tools/injectable"; import type { HelmReleaseRevision } from "../../common/k8s-api/endpoints/helm-releases.api/request-history.injectable"; import execHelmInjectable from "./exec-helm/exec-helm.injectable"; @@ -11,7 +13,7 @@ export interface GetHelmReleaseHistoryData { namespace: string; } -export type GetHelmReleaseHistory = (kubeconfigPath: string, data: GetHelmReleaseHistoryData) => Promise; +export type GetHelmReleaseHistory = (kubeconfigPath: string, data: GetHelmReleaseHistoryData) => AsyncResult; const getHelmReleaseHistoryInjectable = getInjectable({ id: "get-helm-release-history", @@ -19,7 +21,7 @@ const getHelmReleaseHistoryInjectable = getInjectable({ const execHelm = di.inject(execHelmInjectable); return async (kubeconfigPath, { name, namespace }) => { - const result = await execHelm([ + const helmResult = await execHelm([ "history", name, "--output", "json", @@ -27,11 +29,21 @@ const getHelmReleaseHistoryInjectable = getInjectable({ "--kubeconfig", kubeconfigPath, ]); - if (result.callWasSuccessful) { - return JSON.parse(result.response); + if (!helmResult.isOk) { + return helmResult; } - throw result.error; + const parsedResult = json.parse(helmResult.value); + + if (!parsedResult.isOk) { + return result.wrapError("Failed to parse result from 'helm history' call", parsedResult); + } + + if (!isArray(parsedResult.value)) { + return result.error(new Error("Return value from 'helm history' is not an array, as expected")); + } + + return result.ok(parsedResult.value as HelmReleaseRevision[]); }; }, }); diff --git a/packages/core/src/main/helm/get-helm-release-values.injectable.ts b/packages/core/src/main/helm/get-helm-release-values.injectable.ts index 1ef74d5820..59e533a4c8 100644 --- a/packages/core/src/main/helm/get-helm-release-values.injectable.ts +++ b/packages/core/src/main/helm/get-helm-release-values.injectable.ts @@ -37,8 +37,8 @@ const getHelmReleaseValuesInjectable = getInjectable({ const result = await execHelm(args); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } throw result.error; diff --git a/packages/core/src/main/helm/helm-chart-manager.ts b/packages/core/src/main/helm/helm-chart-manager.ts index 933861a040..6cd5562076 100644 --- a/packages/core/src/main/helm/helm-chart-manager.ts +++ b/packages/core/src/main/helm/helm-chart-manager.ts @@ -100,7 +100,7 @@ export class HelmChartManager { } } - return JSON.parse(cacheEntry.data); + return JSON.parse(cacheEntry.data) as RepoHelmChartList; } } diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-helm-manifest/call-for-helm-manifest.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-helm-manifest/call-for-helm-manifest.injectable.ts index 92a888867b..52ac4af386 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-helm-manifest/call-for-helm-manifest.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-helm-manifest/call-for-helm-manifest.injectable.ts @@ -19,7 +19,7 @@ const requestHelmManifestInjectable = getInjectable({ name: string, namespace: string, kubeconfigPath: string, - ): AsyncResult<(KubeJsonApiData | KubeJsonApiDataList)[]> => { + ): AsyncResult<(KubeJsonApiData | KubeJsonApiDataList)[], string> => { const result = await execHelm([ "get", "manifest", @@ -30,14 +30,14 @@ const requestHelmManifestInjectable = getInjectable({ kubeconfigPath, ]); - if (!result.callWasSuccessful) { - return { callWasSuccessful: false, error: result.error.message }; + if (!result.isOk) { + return { isOk: false, error: result.error.message }; } return { - callWasSuccessful: true, - response: yaml - .loadAll(result.response) + isOk: true, + value: yaml + .loadAll(result.value) .filter(isObject) as unknown as KubeJsonApiData[], }; }; diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts index 5e0a074e03..8d4f62d1b1 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts @@ -53,13 +53,13 @@ const callForKubeResourcesByManifestInjectable = getInjectable({ ], }); - if (!result.callWasSuccessful) { + if (!result.isOk) { const errorMessage = getErrorMessage(result.error); throw new Error(errorMessage); } - const output = JSON.parse(result.response) as { items: JsonObject[] }; + const output = JSON.parse(result.value) as { items: JsonObject[] }; return output.items; }; diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.injectable.ts index 031c95cdb6..1fed27ea2a 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.injectable.ts @@ -30,7 +30,7 @@ const execFileWithInputInjectable = getInjectable({ maxBuffer: 8 * 1024 * 1024 * 1024, // 8 MiB }); } catch (e) { - resolve({ callWasSuccessful: false, error: e }); + resolve({ isOk: false, error: e }); return; } @@ -51,7 +51,7 @@ const execFileWithInputInjectable = getInjectable({ }); execution.on("error", (error) => - resolve({ callWasSuccessful: false, error }), + resolve({ isOk: false, error }), ); execution.on("exit", (code, signal) => { @@ -65,8 +65,8 @@ const execFileWithInputInjectable = getInjectable({ * One of the two will always be non-null. */ resolve({ - callWasSuccessful: false, - error: `Exited via ${signal}`, + isOk: false, + error: `Exited via ${String(signal)}`, }); return; @@ -74,14 +74,14 @@ const execFileWithInputInjectable = getInjectable({ if (code !== 0) { resolve({ - callWasSuccessful: false, - error: stderr ? stderr : `Failed with error: ${signal}`, + isOk: false, + error: stderr ? stderr : `Failed with error: ${String(signal)}`, }); return; } - resolve({ callWasSuccessful: true, response: stdout }); + resolve({ isOk: true, value: stdout }); }); execution.stdin.end(input); diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.test.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.test.ts index d7b08d7a2f..c5d855cc60 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.test.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/exec-file-with-input/exec-file-with-input.test.ts @@ -9,13 +9,14 @@ import type { AsyncResult } from "@k8slens/utilities"; import nonPromiseExecFileInjectable from "./non-promise-exec-file.injectable"; import { getPromiseStatus } from "@k8slens/test-utils"; import EventEmitter from "events"; +import type { ChildProcess, execFile } from "child_process"; describe("exec-file-with-input", () => { let execFileWithInput: ExecFileWithInput; - let execFileMock: jest.Mock; + let execFileMock: jest.MockedFunction<() => ChildProcess>; let executionStub: EventEmitter & { - stdin: { end: (chunk: any) => void }; + stdin: { end: (chunk: unknown) => void }; stdout: EventEmitter; stderr: EventEmitter; }; @@ -31,9 +32,9 @@ describe("exec-file-with-input", () => { stderr: new EventEmitter(), }); - execFileMock = jest.fn(() => executionStub); + execFileMock = jest.fn(() => executionStub as ChildProcess); - di.override(nonPromiseExecFileInjectable, () => execFileMock as any); + di.override(nonPromiseExecFileInjectable, () => execFileMock as unknown as typeof execFile); execFileWithInput = di.inject(execFileWithInputInjectable); }); @@ -49,9 +50,9 @@ describe("exec-file-with-input", () => { input: "irrelevant", }); - expect(actual).toEqual({ - callWasSuccessful: false, - error: expect.any(Error), + expect(actual).toMatchInlineSnapshot({ + isOk: false, + error: {}, }); }); @@ -115,8 +116,8 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: true, - response: "some-datasome-other-data", + isOk: true, + value: "some-datasome-other-data", }); }); @@ -126,7 +127,7 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: false, + isOk: false, error: "Exited via SIGKILL", }); }); @@ -137,7 +138,7 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: false, + isOk: false, error: "Failed with error: some-signal", }); }); @@ -170,8 +171,8 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: true, - response: "some-datasome-other-data", + isOk: true, + value: "some-datasome-other-data", }); }); @@ -181,7 +182,7 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: false, + isOk: false, error: "Exited via some-signal", }); }); @@ -192,7 +193,7 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: false, + isOk: false, error: "some-errorsome-other-error", }); }); @@ -206,9 +207,9 @@ describe("exec-file-with-input", () => { const actual = await actualPromise; - expect(actual).toEqual({ - callWasSuccessful: false, - error: expect.any(Error), + expect(actual).toMatchInlineSnapshot({ + isOk: false, + error: {}, }); }); }); diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.injectable.ts index 4499591e3c..9e2da1be05 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.injectable.ts @@ -22,13 +22,13 @@ const getHelmReleaseResourcesInjectable = getInjectable({ return async (name, namespace, kubeconfigPath) => { const result = await requestHelmManifest(name, namespace, kubeconfigPath); - if (!result.callWasSuccessful) { + if (!result.isOk) { return result; } return { - callWasSuccessful: true, - response: result.response.flatMap(item => ( + isOk: true, + value: result.value.flatMap(item => ( Array.isArray(item.items) ? (item as KubeJsonApiDataList).items : item as KubeJsonApiData diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.test.ts b/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.test.ts index b8cb38d578..644f711bc7 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.test.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-resources/get-helm-release-resources.test.ts @@ -59,22 +59,22 @@ describe("get helm release resources", () => { it("when call for manifest resolves without resources, resolves without resources", async () => { await execHelmMock.resolve({ - callWasSuccessful: true, - response: "", + isOk: true, + value: "", }); const actual = await actualPromise; expect(actual).toEqual({ - callWasSuccessful: true, - response: [], + isOk: true, + value: [], }); }); it("when call to manifest resolves with resources, resolves with resources", async () => { await execHelmMock.resolve({ - callWasSuccessful: true, - response: `--- + isOk: true, + value: `--- apiVersion: v1 kind: SomeKind metadata: @@ -105,8 +105,8 @@ metadata: }); expect(await actualPromise).toEqual({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { apiVersion: "v1", kind: "SomeKind", diff --git a/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts index 9247c54153..8dac2fdb42 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts @@ -35,9 +35,9 @@ const getHelmReleaseInjectable = getInjectable({ proxyKubeconfigPath, ); - if (!releaseResult.callWasSuccessful) { + if (!releaseResult.isOk) { return { - callWasSuccessful: false, + isOk: false, error: `Failed to get helm release data: ${releaseResult.error}`, }; } @@ -48,18 +48,18 @@ const getHelmReleaseInjectable = getInjectable({ proxyKubeconfigPath, ); - if (!resourcesResult.callWasSuccessful) { + if (!resourcesResult.isOk) { return { - callWasSuccessful: false, + isOk: false, error: `Failed to get helm release resources: ${resourcesResult.error}`, }; } return { - callWasSuccessful: true, - response: { - ...releaseResult.response, - resources: resourcesResult.response, + isOk: true, + value: { + ...releaseResult.value, + resources: resourcesResult.value, }, }; }; diff --git a/packages/core/src/main/helm/helm-service/list-helm-charts.injectable.ts b/packages/core/src/main/helm/helm-service/list-helm-charts.injectable.ts index 53918baef1..6bd24d1cc5 100644 --- a/packages/core/src/main/helm/helm-service/list-helm-charts.injectable.ts +++ b/packages/core/src/main/helm/helm-service/list-helm-charts.injectable.ts @@ -19,9 +19,9 @@ const listHelmChartsInjectable = getInjectable({ return async () => { const result = await getActiveHelmRepositories(); - assert(result.callWasSuccessful); + assert(result.isOk); - const repositories = result.response; + const repositories = result.value; return object.fromEntries( await Promise.all( diff --git a/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts b/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts index a8cfd32181..965b8798a2 100644 --- a/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts +++ b/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts @@ -48,19 +48,19 @@ const updateHelmReleaseInjectable = getInjectable({ "--kubeconfig", proxyKubeconfigPath, ]); - if (result.callWasSuccessful === false) { + if (result.isOk === false) { throw result.error; // keep the same interface } const releaseResult = await getHelmRelease({ cluster, releaseName, namespace }); - if (!releaseResult.callWasSuccessful) { + if (!releaseResult.isOk) { throw releaseResult.error; // keep the same interface } return { - log: result.response, - release: releaseResult.response, + log: result.value, + release: releaseResult.value, }; } finally { await removePath(valuesFilePath); diff --git a/packages/core/src/main/helm/install-helm-chart.injectable.ts b/packages/core/src/main/helm/install-helm-chart.injectable.ts index f566c6a6f1..057ab521cb 100644 --- a/packages/core/src/main/helm/install-helm-chart.injectable.ts +++ b/packages/core/src/main/helm/install-helm-chart.injectable.ts @@ -69,11 +69,11 @@ const installHelmChartInjectable = getInjectable({ try { const result = await execHelm(args); - if (!result.callWasSuccessful) { + if (!result.isOk) { throw result.error; } - const output = result.response; + const output = result.value; const releaseName = output.split("\n")[0].split(" ")[1].trim(); return { diff --git a/packages/core/src/main/helm/list-helm-releases.injectable.ts b/packages/core/src/main/helm/list-helm-releases.injectable.ts index 7a22ab85e4..8b99fabc16 100644 --- a/packages/core/src/main/helm/list-helm-releases.injectable.ts +++ b/packages/core/src/main/helm/list-helm-releases.injectable.ts @@ -34,21 +34,21 @@ const listHelmReleasesInjectable = getInjectable({ const result = await execHelm(args); - if (!result.callWasSuccessful) { + if (!result.isOk) { return { - callWasSuccessful: false, + isOk: false, error: `Failed to list helm releases: ${result.error}`, }; } - const rawOutput = JSON.parse(result.response); + const rawOutput = JSON.parse(result.value); const output = Array.isArray(rawOutput) ? rawOutput.filter(isObject) : []; return { - callWasSuccessful: true, - response: output as unknown as ListedHelmRelease[], + isOk: true, + value: output as unknown as ListedHelmRelease[], }; }; }, diff --git a/packages/core/src/main/helm/repositories/add-helm-repository/add-helm-repository.injectable.ts b/packages/core/src/main/helm/repositories/add-helm-repository/add-helm-repository.injectable.ts index 5c77e01a89..b2dc733e86 100644 --- a/packages/core/src/main/helm/repositories/add-helm-repository/add-helm-repository.injectable.ts +++ b/packages/core/src/main/helm/repositories/add-helm-repository/add-helm-repository.injectable.ts @@ -56,14 +56,14 @@ const addHelmRepositoryInjectable = getInjectable({ const result = await execHelm(args); - if (result.callWasSuccessful) { + if (result.isOk) { return { - callWasSuccessful: true as const, + isOk: true as const, }; } return { - callWasSuccessful: false as const, + isOk: false as const, error: result.error.stderr || result.error.message, }; }; diff --git a/packages/core/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts b/packages/core/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts index 5367570d99..b5e3bb62c5 100644 --- a/packages/core/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts +++ b/packages/core/src/main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable.ts @@ -8,8 +8,8 @@ import type { ReadYamlFile } from "../../../../common/fs/read-yaml-file.injectab import readYamlFileInjectable from "../../../../common/fs/read-yaml-file.injectable"; import getHelmEnvInjectable from "../../get-helm-env/get-helm-env.injectable"; import execHelmInjectable from "../../exec-helm/exec-helm.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; import type { AsyncResult } from "@k8slens/utilities"; +import { result } from "@k8slens/utilities"; interface HelmRepositoryFromYaml { name: string; @@ -34,74 +34,47 @@ const getActiveHelmRepositoriesInjectable = getInjectable({ const readYamlFile = di.inject(readYamlFileInjectable); const execHelm = di.inject(execHelmInjectable); const getHelmEnv = di.inject(getHelmEnvInjectable); - const logger = di.inject(loggerInjectionToken); const getRepositories = getRepositoriesFor(readYamlFile); - return async (): AsyncResult => { + return async (): AsyncResult => { const envResult = await getHelmEnv(); - if (!envResult.callWasSuccessful) { - return { - callWasSuccessful: false, - error: `Error getting Helm configuration: ${envResult.error}`, - }; + if (!envResult.isOk) { + return result.wrapError("Failed to get helm configuration", envResult); } const { HELM_REPOSITORY_CONFIG: repositoryConfigFilePath, HELM_REPOSITORY_CACHE: helmRepositoryCacheDirPath, - } = envResult.response; + } = envResult.value; if (!repositoryConfigFilePath) { - const errorMessage = "Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`."; - - logger.error(errorMessage); - - return { - callWasSuccessful: false, - error: `Error getting Helm configuration: ${errorMessage}`, - }; + return result.error(new Error("Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.")); } if (!helmRepositoryCacheDirPath) { - const errorMessage = "Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`."; - - logger.error(errorMessage); - - return { - callWasSuccessful: false, - error: `Error getting Helm configuration: ${errorMessage}`, - }; + return result.error(new Error("Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.")); } const updateResult = await execHelm(["repo", "update"]); - if (!updateResult.callWasSuccessful) { + if (!updateResult.isOk) { if (!updateResult.error.stderr.includes(internalHelmErrorForNoRepositoriesFound)) { - return { - callWasSuccessful: false, - error: `Error updating Helm repositories: ${updateResult.error.stderr}`, - }; + return result.error(new Error("Failed to update helm repositories", { cause: updateResult.error.stderr })); } + const resultOfAddingDefaultRepository = await execHelm(["repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"]); - if (!resultOfAddingDefaultRepository.callWasSuccessful) { - return { - callWasSuccessful: false, - error: `Error when adding default Helm repository: ${resultOfAddingDefaultRepository.error.stderr}`, - }; + if (!resultOfAddingDefaultRepository.isOk) { + return result.error(new Error("Failed to add default helm repository", { cause: updateResult.error.stderr })); } } - return { - callWasSuccessful: true, - - response: await getRepositories( - repositoryConfigFilePath, - helmRepositoryCacheDirPath, - ), - }; + return result.ok(await getRepositories( + repositoryConfigFilePath, + helmRepositoryCacheDirPath, + )); }; }, }); diff --git a/packages/core/src/main/helm/repositories/get-active-helm-repository.injectable.ts b/packages/core/src/main/helm/repositories/get-active-helm-repository.injectable.ts index 548e04b2ec..e159723c22 100644 --- a/packages/core/src/main/helm/repositories/get-active-helm-repository.injectable.ts +++ b/packages/core/src/main/helm/repositories/get-active-helm-repository.injectable.ts @@ -15,9 +15,9 @@ const getActiveHelmRepositoryInjectable = getInjectable({ return async (name: string) => { const activeHelmRepositories = await getActiveHelmRepositories(); - assert(activeHelmRepositories.callWasSuccessful); + assert(activeHelmRepositories.isOk); - return activeHelmRepositories.response.find( + return activeHelmRepositories.value.find( (repository) => repository.name === name, ); }; diff --git a/packages/core/src/main/helm/repositories/remove-helm-repository/remove-helm-repository.injectable.ts b/packages/core/src/main/helm/repositories/remove-helm-repository/remove-helm-repository.injectable.ts index 8fb852f917..af392ccd01 100644 --- a/packages/core/src/main/helm/repositories/remove-helm-repository/remove-helm-repository.injectable.ts +++ b/packages/core/src/main/helm/repositories/remove-helm-repository/remove-helm-repository.injectable.ts @@ -24,14 +24,14 @@ const removeHelmRepositoryInjectable = getInjectable({ repo.name, ]); - if (result.callWasSuccessful) { + if (result.isOk) { return { - callWasSuccessful: true, + isOk: true, }; } return { - callWasSuccessful: false, + isOk: false, error: result.error.stderr, }; }; diff --git a/packages/core/src/main/helm/rollback-helm-release.injectable.ts b/packages/core/src/main/helm/rollback-helm-release.injectable.ts index 2b130adfb5..74ea88043e 100644 --- a/packages/core/src/main/helm/rollback-helm-release.injectable.ts +++ b/packages/core/src/main/helm/rollback-helm-release.injectable.ts @@ -27,7 +27,7 @@ const rollbackHelmReleaseInjectable = getInjectable({ "--kubeconfig", kubeconfigPath, ]); - if (!result.callWasSuccessful) { + if (!result.isOk) { throw result.error; } }; diff --git a/packages/core/src/main/ipc/window.ts b/packages/core/src/main/ipc/window.ts index b111eab243..71af1974a4 100644 --- a/packages/core/src/main/ipc/window.ts +++ b/packages/core/src/main/ipc/window.ts @@ -43,7 +43,7 @@ export function handleWindowAction(action: WindowAction) { } default: - throw new Error(`Attemped window action ${action} is unknown`); + throw new Error(`Attempted window action ${action} is unknown`); } } @@ -66,6 +66,6 @@ export function onLocationChange(): void { return false; }); - broadcastMessage("history:can-go-back", canGoBack); - broadcastMessage("history:can-go-forward", canGoForward); + void broadcastMessage("history:can-go-back", canGoBack); + void broadcastMessage("history:can-go-forward", canGoForward); } diff --git a/packages/core/src/main/kubeconfig-manager/kubeconfig-manager.ts b/packages/core/src/main/kubeconfig-manager/kubeconfig-manager.ts index 5cb87f8c52..13e2f1de7f 100644 --- a/packages/core/src/main/kubeconfig-manager/kubeconfig-manager.ts +++ b/packages/core/src/main/kubeconfig-manager/kubeconfig-manager.ts @@ -85,7 +85,7 @@ export class KubeconfigManager { return this.tempFilePath = await this.createProxyKubeconfig(); } catch (error) { - throw new Error(`Failed to create temp config for auth-proxy: ${error}`); + throw new Error(`Failed to create temp config for auth-proxy`, { cause: error }); } } @@ -100,7 +100,13 @@ export class KubeconfigManager { this.dependencies.directoryForTemp, `kubeconfig-${id}`, ); - const kubeConfig = await this.dependencies.loadKubeconfig(); + const result = await this.dependencies.loadKubeconfig(); + + if (result.isOk === false) { + throw result.error; + } + + const kubeConfig = result.value; const proxyConfig: PartialDeep = { currentContext: contextName, clusters: [ diff --git a/packages/core/src/main/kubectl/apply-all-handler.injectable.ts b/packages/core/src/main/kubectl/apply-all-handler.injectable.ts index fb5f3a040f..c82dca2f3a 100644 --- a/packages/core/src/main/kubectl/apply-all-handler.injectable.ts +++ b/packages/core/src/main/kubectl/apply-all-handler.injectable.ts @@ -27,7 +27,7 @@ const kubectlApplyAllChannelHandlerInjectable = getRequestChannelListenerInjecta if (!cluster) { return { - callWasSuccessful: false, + isOk: false, error: `No cluster found for clusterId="${clusterId}"`, }; } diff --git a/packages/core/src/main/kubectl/delete-all-handler.injectable.ts b/packages/core/src/main/kubectl/delete-all-handler.injectable.ts index b7e21b4d8e..199e92c647 100644 --- a/packages/core/src/main/kubectl/delete-all-handler.injectable.ts +++ b/packages/core/src/main/kubectl/delete-all-handler.injectable.ts @@ -27,7 +27,7 @@ const kubectlDeleteAllChannelHandlerInjectable = getRequestChannelListenerInject if (!cluster) { return { - callWasSuccessful: false, + isOk: false, error: `No cluster found for clusterId="${clusterId}"`, }; } diff --git a/packages/core/src/main/kubectl/kubectl.ts b/packages/core/src/main/kubectl/kubectl.ts index 3742444b3a..4f6c90fd45 100644 --- a/packages/core/src/main/kubectl/kubectl.ts +++ b/packages/core/src/main/kubectl/kubectl.ts @@ -160,17 +160,17 @@ export class Kubectl { ]; const execResult = await this.dependencies.execFile(path, args); - if (!execResult.callWasSuccessful) { - this.dependencies.logger.error(`Local kubectl failed to run properly (${execResult.error}), unlinking`); + if (!execResult.isOk) { + this.dependencies.logger.error(`Removing local kubectl, due to it failing to run properly: ${execResult.error.message}`); await this.dependencies.unlink(this.path); return; } - const parseResult = json.parse(execResult.response); + const parseResult = json.parse(execResult.value); - if (!parseResult.callWasSuccessful) { - this.dependencies.logger.error(`Local kubectl failed to run properly (${parseResult.error}), unlinking`); + if (!parseResult.isOk) { + this.dependencies.logger.error(`Removing local kubectl, due to it failing to run properly: ${parseResult.error.message}`); await this.dependencies.unlink(this.path); return; @@ -180,7 +180,7 @@ export class Kubectl { return true; } - const { response: output } = parseResult; + const { value: output } = parseResult; if ( !isObject(output) @@ -221,7 +221,7 @@ export class Kubectl { return true; } catch (err) { - this.dependencies.logger.error(`Could not copy the bundled kubectl to app-data: ${err}`); + this.dependencies.logger.error(`Could not copy the bundled kubectl to app-data: ${String(err)}`); return false; } diff --git a/packages/core/src/main/lens-proxy/lens-proxy.ts b/packages/core/src/main/lens-proxy/lens-proxy.ts index f1b81684ac..aadfe90b0b 100644 --- a/packages/core/src/main/lens-proxy/lens-proxy.ts +++ b/packages/core/src/main/lens-proxy/lens-proxy.ts @@ -79,7 +79,7 @@ export class LensProxy { cert: dependencies.certificate.cert, }, (req, res) => { - this.handleRequest(req as ServerIncomingMessage, res); + void this.handleRequest(req as ServerIncomingMessage, res); }, ), 500); @@ -121,14 +121,14 @@ export class LensProxy { this.dependencies.logger.info(`[LENS-PROXY]: Proxy server has started at ${address}:${port}`); this.proxyServer.on("error", (error) => { - this.dependencies.logger.info(`[LENS-PROXY]: Subsequent error: ${error}`); + this.dependencies.logger.info(`[LENS-PROXY]: Subsequent error: ${String(error)}`); }); this.dependencies.emitAppEvent({ name: "lens-proxy", action: "listen", params: { port }}); resolve(port); }) .once("error", (error) => { - this.dependencies.logger.info(`[LENS-PROXY]: Proxy server failed to start: ${error}`); + this.dependencies.logger.info(`[LENS-PROXY]: Proxy server failed to start: ${String(error)}`); reject(error); }); }); @@ -198,7 +198,7 @@ export class LensProxy { return; } - this.dependencies.logger.error(`[LENS-PROXY]: http proxy errored for cluster: ${error}`, { url: req.url }); + this.dependencies.logger.error(`[LENS-PROXY]: http proxy errored for cluster: ${String(error)}`, { url: req.url }); if (target) { this.dependencies.logger.debug(`Failed proxy to target: ${JSON.stringify(target, null, 2)}`); @@ -213,14 +213,14 @@ export class LensProxy { setTimeout(() => { this.retryCounters.set(reqId, retryCount + 1); this.handleRequest(req as ServerIncomingMessage, res) - .catch(error => this.dependencies.logger.error(`[LENS-PROXY]: failed to handle request on proxy error: ${error}`)); + .catch(error => this.dependencies.logger.error(`[LENS-PROXY]: failed to handle request on proxy error: ${String(error)}`)); }, timeoutMs); } } } try { - res.writeHead(500).end(`Oops, something went wrong.\n${error}`); + res.writeHead(500).end(`Oops, something went wrong.\n${String(error)}`); } catch (e) { this.dependencies.logger.error(`[LENS-PROXY]: Failed to write headers: `, e); } @@ -232,7 +232,7 @@ export class LensProxy { protected getRequestId(req: http.IncomingMessage): string { assert(req.headers.host); - return req.headers.host + req.url; + return req.headers.host + (req.url ?? ""); } protected async handleRequest(req: ServerIncomingMessage, res: http.ServerResponse) { diff --git a/packages/core/src/main/lens-proxy/proxy-functions/kube-api-upgrade-request.injectable.ts b/packages/core/src/main/lens-proxy/proxy-functions/kube-api-upgrade-request.injectable.ts index a8f7b03b32..68e6f053ce 100644 --- a/packages/core/src/main/lens-proxy/proxy-functions/kube-api-upgrade-request.injectable.ts +++ b/packages/core/src/main/lens-proxy/proxy-functions/kube-api-upgrade-request.injectable.ts @@ -32,7 +32,7 @@ const kubeApiUpgradeRequestInjectable = getInjectable({ }; const proxySocket = connect(connectOpts, () => { - proxySocket.write(`${req.method} ${pUrl.path} HTTP/1.1\r\n`); + proxySocket.write(`${req.method} ${pUrl.path ?? ""} HTTP/1.1\r\n`); proxySocket.write(`Host: ${clusterApiUrl.host}\r\n`); for (const [key, value] of chunk(req.rawHeaders, 2)) { @@ -52,7 +52,7 @@ const kubeApiUpgradeRequestInjectable = getInjectable({ proxySocket.setTimeout(0); socket.setTimeout(0); - proxySocket.on("data", function (chunk) { + proxySocket.on("data", function (chunk: Buffer) { socket.write(chunk); }); proxySocket.on("end", function () { diff --git a/packages/core/src/main/logger/console-format.ts b/packages/core/src/main/logger/console-format.ts index e9aeb30786..83da657630 100644 --- a/packages/core/src/main/logger/console-format.ts +++ b/packages/core/src/main/logger/console-format.ts @@ -45,7 +45,10 @@ export interface ConsoleFormatOptions { interface TransformableInfo { level: string; message: string; - [key: string | symbol]: any; + ms: string; + stack?: string; + [SPLAT]: unknown; + [key: string | symbol]: unknown; } export class ConsoleFormat { diff --git a/packages/core/src/main/navigate-to-route/navigate-to-route.injectable.ts b/packages/core/src/main/navigate-to-route/navigate-to-route.injectable.ts index 6615d976f1..a8810414c4 100644 --- a/packages/core/src/main/navigate-to-route/navigate-to-route.injectable.ts +++ b/packages/core/src/main/navigate-to-route/navigate-to-route.injectable.ts @@ -15,8 +15,7 @@ const navigateToRouteInjectable = getInjectable({ return async (route, options) => { const url = buildURL(route.path, { - // TODO: enhance typing - params: options?.parameters as any, + params: options?.parameters as object, query: options?.query, fragment: options?.fragment, }); diff --git a/packages/core/src/main/prometheus/provider.ts b/packages/core/src/main/prometheus/provider.ts index 5bd9588a06..e7ab5f05b5 100644 --- a/packages/core/src/main/prometheus/provider.ts +++ b/packages/core/src/main/prometheus/provider.ts @@ -63,7 +63,7 @@ export async function findFirstNamespacedService(client: CoreV1Api, ...selectors } } } catch (error) { - throw new Error(`Failed to list services in all namespaces: ${isRequestError(error) ? error.response?.body.message : error}`); + throw new Error(`Failed to list services in all namespaces: ${isRequestError(error) ? (error.response?.body as { message: string }).message : String(error)}`); } throw new Error(`No service found from any namespace`); @@ -83,7 +83,7 @@ export async function findNamespacedService(client: CoreV1Api, name: string, nam port: service.spec.ports[0].port, }; } catch(error) { - throw new Error(`Failed to list services in namespace="${namespace}": ${isRequestError(error) ? error.response?.body.message : error}`); + throw new Error(`Failed to list services in namespace="${namespace}": ${isRequestError(error) ? (error.response?.body as { message: string }).message : String(error)}`); } } diff --git a/packages/core/src/main/protocol-handler/__test__/router.test.ts b/packages/core/src/main/protocol-handler/__test__/router.test.ts index 48323dc986..3e0615d673 100644 --- a/packages/core/src/main/protocol-handler/__test__/router.test.ts +++ b/packages/core/src/main/protocol-handler/__test__/router.test.ts @@ -20,7 +20,7 @@ import enabledExtensionsStateInjectable from "../../../features/extensions/enabl import type { LegacyLensExtension, LensExtensionId } from "@k8slens/legacy-extensions"; import { LensMainExtension } from "../../../extensions/lens-main-extension"; -function throwIfDefined(val: any): void { +function throwIfDefined(val: unknown): void { if (val != null) { throw val; } @@ -32,7 +32,7 @@ describe("protocol router tests", () => { let enabledExtensions: ObservableMap; let broadcastMessageMock: jest.Mock; - beforeEach(async () => { + beforeEach(() => { const di = getDiForUnitTesting(); enabledExtensions = di.inject(enabledExtensionsStateInjectable); @@ -130,7 +130,7 @@ describe("protocol router tests", () => { }); it("should call most exact handler", async () => { - let called: any = 0; + let called: unknown = 0; lpr.addInternalHandler("/page", () => { called = 1; }); lpr.addInternalHandler("/page/:id", params => { called = params.pathname.id; }); @@ -146,7 +146,7 @@ describe("protocol router tests", () => { }); it("should call most exact handler for an extension", async () => { - let called: any = 0; + let called: unknown = 0; const extId = uuid.v4(); const ext = new LensMainExtension({ @@ -186,7 +186,7 @@ describe("protocol router tests", () => { }); it("should work with non-org extensions", async () => { - let called: any = 0; + let called: unknown = 0; { const extId = uuid.v4(); @@ -256,7 +256,7 @@ describe("protocol router tests", () => { }); it("should call most exact handler with 3 found handlers", async () => { - let called: any = 0; + let called: unknown = 0; lpr.addInternalHandler("/", () => { called = 2; }); lpr.addInternalHandler("/page", () => { called = 1; }); @@ -274,7 +274,7 @@ describe("protocol router tests", () => { }); it("should call most exact handler with 2 found handlers", async () => { - let called: any = 0; + let called: unknown = 0; lpr.addInternalHandler("/", () => { called = 2; }); lpr.addInternalHandler("/page", () => { called = 1; }); diff --git a/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.ts b/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.ts index 1018420b10..aa9b087d98 100644 --- a/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.ts +++ b/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.ts @@ -79,12 +79,12 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter { await this._routeToExtension(url); } } catch (error) { - this.dependencies.broadcastMessage(ProtocolHandlerInvalid, error ? String(error) : "unknown error", rawUrl); + void this.dependencies.broadcastMessage(ProtocolHandlerInvalid, error ? String(error) : "unknown error", rawUrl); if (error instanceof proto.RoutingError) { - this.dependencies.logger.error(`${proto.LensProtocolRouter.LoggingPrefix}: ${error}`, { url: error.url }); + this.dependencies.logger.error(`${proto.LensProtocolRouter.LoggingPrefix}: ${String(error)}`, { url: error.url }); } else { - this.dependencies.logger.error(`${proto.LensProtocolRouter.LoggingPrefix}: ${error}`, { rawUrl }); + this.dependencies.logger.error(`${proto.LensProtocolRouter.LoggingPrefix}: ${String(error)}`, { rawUrl }); } } } @@ -116,7 +116,7 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter { protected _routeToInternal(url: URLParse>): RouteAttempt { const rawUrl = url.toString(); // for sending to renderer const attempt = super._routeToInternal(url); - const broadcastToRenderer = () => this.dependencies.broadcastMessage(proto.ProtocolHandlerInternal, rawUrl, attempt); + const broadcastToRenderer = () => void this.dependencies.broadcastMessage(proto.ProtocolHandlerInternal, rawUrl, attempt); if (this.rendererLoaded.get()) { broadcastToRenderer(); @@ -138,7 +138,7 @@ export class LensProtocolRouterMain extends proto.LensProtocolRouter { * argument. */ const attempt = await super._routeToExtension(new URLParse(url.toString(), true)); - const broadcastToRenderer = () => this.dependencies.broadcastMessage(proto.ProtocolHandlerExtension, rawUrl, attempt); + const broadcastToRenderer = () => void this.dependencies.broadcastMessage(proto.ProtocolHandlerExtension, rawUrl, attempt); if (this.rendererLoaded.get()) { broadcastToRenderer(); diff --git a/packages/core/src/main/resource-applier/resource-applier.ts b/packages/core/src/main/resource-applier/resource-applier.ts index 639ce91eb0..615bfbb49b 100644 --- a/packages/core/src/main/resource-applier/resource-applier.ts +++ b/packages/core/src/main/resource-applier/resource-applier.ts @@ -74,8 +74,8 @@ export class ResourceApplier { const result = await this.dependencies.execFile(kubectlPath, args); - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } throw result.error.stderr || result.error.message; @@ -112,12 +112,12 @@ export class ResourceApplier { const result = await this.dependencies.execFile(kubectlPath, args); - if (result.callWasSuccessful) { + if (result.isOk) { return result; } return { - callWasSuccessful: false, + isOk: false, error: result.error.stderr || result.error.message, }; } finally { @@ -153,7 +153,7 @@ export class ResourceApplier { this.dependencies.logger.info(`[RESOURCE-APPLIER] running kubectl`, { args }); const result = await this.dependencies.execFile(kubectlPath, args); - if (result.callWasSuccessful) { + if (result.isOk) { return result; } @@ -162,7 +162,7 @@ export class ResourceApplier { const splitError = result.error.stderr.split(`.yaml": `); return { - callWasSuccessful: false, + isOk: false, error: splitError[1] || result.error.message, }; } diff --git a/packages/core/src/main/router/create-handler-for-route.injectable.ts b/packages/core/src/main/router/create-handler-for-route.injectable.ts index d01558cfe5..a277dacc99 100644 --- a/packages/core/src/main/router/create-handler-for-route.injectable.ts +++ b/packages/core/src/main/router/create-handler-for-route.injectable.ts @@ -14,7 +14,7 @@ export type CreateHandlerForRoute = (route: Route) => RouteHand interface LensServerResponse { statusCode: number; - content: any; + content: unknown; headers: { [name: string]: string; }; diff --git a/packages/core/src/main/router/route.ts b/packages/core/src/main/router/route.ts index 90b0210746..4989f20731 100644 --- a/packages/core/src/main/router/route.ts +++ b/packages/core/src/main/router/route.ts @@ -8,7 +8,7 @@ import type http from "http"; import type httpProxy from "http-proxy"; import type { LensApiResultContentType } from "./router-content-types"; import type { URLSearchParams } from "url"; -import type Joi from "joi"; +import type { SafeParseReturnType } from "zod"; export type InferParam< T extends string, @@ -27,7 +27,7 @@ export type InferParamFromPath

= : never : P extends `${infer A}/${infer B}` ? InferParam> - : InferParam; + : InferParam>; export interface LensApiRequest { path: Path; @@ -48,7 +48,7 @@ export interface ClusterLensApiRequest extends LensApiReque export interface LensApiResult { statusCode?: number; response?: Response; - error?: any; + error?: unknown; contentType?: LensApiResultContentType; headers?: Partial>; proxy?: httpProxy; @@ -68,11 +68,11 @@ export interface BaseRoutePaths { } export interface PayloadValidator { - validate(payload: unknown): Joi.ValidationResult; + safeParse(payload: unknown): SafeParseReturnType; } export interface ValidatorBaseRoutePaths extends BaseRoutePaths { - payloadValidator: PayloadValidator; + payloadSchema: PayloadValidator; } export interface Route extends BaseRoutePaths { @@ -126,13 +126,13 @@ export interface BindValidatedClusterHandler { (handler: ValidatedClusterRouteHandler): Route; } -export function payloadValidatedClusterRoute({ payloadValidator, ...parts }: ValidatorBaseRoutePaths): BindValidatedClusterHandler { +export function payloadWithSchemaClusterRoute({ payloadSchema: payloadValidator, ...parts }: ValidatorBaseRoutePaths): BindValidatedClusterHandler { const boundClusterRoute = clusterRoute(parts); return (handler) => boundClusterRoute(({ payload, ...rest }) => { - const validationResult = payloadValidator.validate(payload); + const validationResult = payloadValidator.safeParse(payload); - if (validationResult.error) { + if (!validationResult.success) { return { error: validationResult.error, statusCode: 400, @@ -140,7 +140,7 @@ export function payloadValidatedClusterRoute({ pay } return handler({ - payload: validationResult.value, + payload: validationResult.data, ...rest, }); }); diff --git a/packages/core/src/main/router/router.test.ts b/packages/core/src/main/router/router.test.ts index 4f3aee844e..2ec5653d4f 100644 --- a/packages/core/src/main/router/router.test.ts +++ b/packages/core/src/main/router/router.test.ts @@ -20,12 +20,13 @@ import normalizedPlatformInjectable from "../../common/vars/normalized-platform. import kubectlBinaryNameInjectable from "../kubectl/binary-name.injectable"; import kubectlDownloadingNormalizedArchInjectable from "../kubectl/normalized-arch.injectable"; import { runInAction } from "mobx"; +import type { ServerResponse } from "http"; describe("router", () => { let router: Router; - let routeHandlerMock: AsyncFnMock<() => any>; + let routeHandlerMock: AsyncFnMock<() => unknown>; - beforeEach(async () => { + beforeEach(() => { routeHandlerMock = asyncFn(); const di = getDiForUnitTesting(); @@ -46,7 +47,7 @@ describe("router", () => { method: "get", path: "/some-path", handler: routeHandlerMock, - } as Route), + } as Route), injectionToken: routeInjectionToken, }); @@ -62,7 +63,7 @@ describe("router", () => { let actualPromise: Promise; let clusterStub: Cluster; let requestStub: SetRequired; - let responseStub: any; + let responseStub: ServerResponse; beforeEach(() => { requestStub = new Request({ @@ -73,7 +74,7 @@ describe("router", () => { }, }) as SetRequired; - responseStub = { end: jest.fn(), setHeader: jest.fn(), write: jest.fn(), statusCode: undefined }; + responseStub = { end: jest.fn(), setHeader: jest.fn(), write: jest.fn(), statusCode: 200 } as unknown as ServerResponse; clusterStub = {} as Cluster; @@ -96,9 +97,8 @@ describe("router", () => { await actualPromise; - expect(responseStub.setHeader.mock.calls).toEqual([ - ["Content-Type", "application/json"], - ]); + expect(responseStub.setHeader).toBeCalledTimes(1); + expect(responseStub.setHeader).toBeCalledWith("Content-Type", "application/json"); }); it("given JSON content-type is specified, when handler resolves with object, resolves with JSON", async () => { @@ -117,15 +117,16 @@ describe("router", () => { }); it("resolves as plain text", () => { - expect(responseStub.setHeader.mock.calls).toEqual([["Content-Type", "text/plain"]]); + expect(responseStub.setHeader).toBeCalledTimes(1); + expect(responseStub.setHeader).toBeCalledWith("Content-Type", "text/plain"); }); - it("resolves with status code for no content", async () => { + it("resolves with status code for no content", () => { expect(responseStub.statusCode).toBe(204); }); - it("resolves without content", async () => { - expect(responseStub.end.mock.calls).toEqual([[]]); + it("resolves without content", () => { + expect(responseStub.setHeader).toBeCalledTimes(0); }); }); @@ -137,7 +138,8 @@ describe("router", () => { }); it("resolves as plain text", () => { - expect(responseStub.setHeader.mock.calls).toEqual([["Content-Type", "text/plain"]]); + expect(responseStub.setHeader).toBeCalledTimes(1); + expect(responseStub.setHeader).toBeCalledWith("Content-Type", "text/plain"); }); it('resolves with "500" status code', () => { @@ -170,9 +172,8 @@ describe("router", () => { }); it("has content type specific headers", () => { - expect(responseStub.setHeader.mock.calls).toEqual([ - ["Content-Type", scenario.contentType], - ]); + expect(responseStub.setHeader).toBeCalledTimes(1); + expect(responseStub.setHeader).toBeCalledWith("Content-Type", scenario.contentType); }); it("defaults to successful status code", () => { @@ -216,7 +217,7 @@ describe("router", () => { await actualPromise; - expect(responseStub.end.mock.calls).toEqual([[]]); + expect(responseStub.setHeader).toBeCalledTimes(0); }); it(`given content type is "${scenario.contentType}", when handler resolves with error, has error as body`, async () => { @@ -267,11 +268,9 @@ describe("router", () => { await actualPromise; - expect(responseStub.setHeader.mock.calls).toEqual([ - ["Content-Type", scenario.contentType], - ["Some-Header", "some-header-value"], - ]); - + expect(responseStub.setHeader).toBeCalledTimes(2); + expect(responseStub.setHeader).toBeCalledWith("Content-Type", scenario.contentType); + expect(responseStub.setHeader).toBeCalledWith("Some-Header", "some-header-value"); }); describe(`given content type is "${scenario.contentType}", when handler resolves with binary content`, () => { @@ -293,7 +292,7 @@ describe("router", () => { }); it("does not end with the response", () => { - expect(responseStub.end.mock.calls[0]).toEqual([]); + expect(responseStub.setHeader).toBeCalledTimes(0); }); }); }); diff --git a/packages/core/src/main/routes/files/development.injectable.ts b/packages/core/src/main/routes/files/development.injectable.ts index 98c95c7928..8e5fb9a4e9 100644 --- a/packages/core/src/main/routes/files/development.injectable.ts +++ b/packages/core/src/main/routes/files/development.injectable.ts @@ -8,6 +8,8 @@ import path from "path"; import { webpackDevServerPort } from "../../../../webpack/vars"; import type { LensApiRequest, RouteResponse } from "../../router/route"; +export const webpackDevServerPort = Number(process.env.WEBPACK_DEV_SERVER_PORT) || 9191; + const devStaticFileRouteHandlerInjectable = getInjectable({ id: "dev-static-file-route-handler", instantiate: () => { @@ -25,7 +27,7 @@ const devStaticFileRouteHandlerInjectable = getInjectable({ proxy.web(req, res, { target: proxyTarget }); - return { proxy }; + return Promise.resolve({ proxy }); }; }, }); diff --git a/packages/core/src/main/routes/helm/releases/install-chart-route.injectable.ts b/packages/core/src/main/routes/helm/releases/install-chart-route.injectable.ts index e34d54db23..069d0fc26a 100644 --- a/packages/core/src/main/routes/helm/releases/install-chart-route.injectable.ts +++ b/packages/core/src/main/routes/helm/releases/install-chart-route.injectable.ts @@ -4,27 +4,16 @@ */ import { apiPrefix } from "../../../../common/vars"; import { getRouteInjectable } from "../../../router/router.injectable"; -import Joi from "joi"; -import { payloadValidatedClusterRoute } from "../../../router/route"; -import type { InstallChartArgs } from "../../../helm/helm-service/install-helm-chart.injectable"; +import { payloadWithSchemaClusterRoute } from "../../../router/route"; import installClusterHelmChartInjectable from "../../../helm/helm-service/install-helm-chart.injectable"; +import { z } from "zod"; -const installChartArgsValidator = Joi.object({ - chart: Joi - .string() - .required(), - values: Joi - .object() - .required() - .unknown(true), - name: Joi - .string(), - namespace: Joi - .string() - .required(), - version: Joi - .string() - .required(), +const installChartArgsSchema = z.object({ + chart: z.string(), + values: z.record(z.any()), + name: z.string(), + namespace: z.string(), + version: z.string(), }); const installChartRouteInjectable = getRouteInjectable({ @@ -33,10 +22,10 @@ const installChartRouteInjectable = getRouteInjectable({ instantiate: (di) => { const installHelmChart = di.inject(installClusterHelmChartInjectable); - return payloadValidatedClusterRoute({ + return payloadWithSchemaClusterRoute({ method: "post", path: `${apiPrefix}/v2/releases`, - payloadValidator: installChartArgsValidator, + payloadSchema: installChartArgsSchema, })(async ({ payload, cluster }) => ({ response: await installHelmChart(cluster, payload), statusCode: 201, diff --git a/packages/core/src/main/routes/helm/releases/rollback-release-route.injectable.ts b/packages/core/src/main/routes/helm/releases/rollback-release-route.injectable.ts index 49a8fddb88..15911564df 100644 --- a/packages/core/src/main/routes/helm/releases/rollback-release-route.injectable.ts +++ b/packages/core/src/main/routes/helm/releases/rollback-release-route.injectable.ts @@ -4,18 +4,12 @@ */ import { apiPrefix } from "../../../../common/vars"; import { getRouteInjectable } from "../../../router/router.injectable"; -import Joi from "joi"; -import { payloadValidatedClusterRoute } from "../../../router/route"; +import { payloadWithSchemaClusterRoute } from "../../../router/route"; import rollbackClusterHelmReleaseInjectable from "../../../helm/helm-service/rollback-helm-release.injectable"; +import { z } from "zod"; -interface RollbackReleasePayload { - revision: number; -} - -const rollbackReleasePayloadValidator = Joi.object({ - revision: Joi - .number() - .required(), +const rollbackReleasePayloadValidator = z.object({ + revision: z.number(), }); const rollbackReleaseRouteInjectable = getRouteInjectable({ @@ -24,10 +18,10 @@ const rollbackReleaseRouteInjectable = getRouteInjectable({ instantiate: (di) => { const rollbackRelease = di.inject(rollbackClusterHelmReleaseInjectable); - return payloadValidatedClusterRoute({ + return payloadWithSchemaClusterRoute({ method: "put", path: `${apiPrefix}/v2/releases/{namespace}/{name}/rollback`, - payloadValidator: rollbackReleasePayloadValidator, + payloadSchema: rollbackReleasePayloadValidator, })(async ({ cluster, params, payload }) => { await rollbackRelease(cluster, { ...params, ...payload }); }); diff --git a/packages/core/src/main/routes/helm/releases/update-release-route.injectable.ts b/packages/core/src/main/routes/helm/releases/update-release-route.injectable.ts index 5993d7922d..2f1396e055 100644 --- a/packages/core/src/main/routes/helm/releases/update-release-route.injectable.ts +++ b/packages/core/src/main/routes/helm/releases/update-release-route.injectable.ts @@ -4,21 +4,14 @@ */ import { apiPrefix } from "../../../../common/vars"; import { getRouteInjectable } from "../../../router/router.injectable"; -import { payloadValidatedClusterRoute } from "../../../router/route"; -import Joi from "joi"; -import type { UpdateChartArgs } from "../../../helm/helm-service/update-helm-release.injectable"; +import { payloadWithSchemaClusterRoute } from "../../../router/route"; import updateHelmReleaseInjectable from "../../../helm/helm-service/update-helm-release.injectable"; +import { z } from "zod"; -const updateChartArgsValidator = Joi.object({ - chart: Joi - .string() - .required(), - version: Joi - .string() - .required(), - values: Joi - .string() - .required(), +const updateChartArgsSchema = z.object({ + chart: z.string(), + version: z.string(), + values: z.string(), }); const updateReleaseRouteInjectable = getRouteInjectable({ @@ -27,10 +20,10 @@ const updateReleaseRouteInjectable = getRouteInjectable({ instantiate: (di) => { const updateRelease = di.inject(updateHelmReleaseInjectable); - return payloadValidatedClusterRoute({ + return payloadWithSchemaClusterRoute({ method: "put", path: `${apiPrefix}/v2/releases/{namespace}/{release}`, - payloadValidator: updateChartArgsValidator, + payloadSchema: updateChartArgsSchema, })(async ({ cluster, params, payload }) => ({ response: await updateRelease( cluster, diff --git a/packages/core/src/main/routes/kubeconfig-route/get-service-account-route.injectable.ts b/packages/core/src/main/routes/kubeconfig-route/get-service-account-route.injectable.ts index 267a3eafe7..f79e081e07 100644 --- a/packages/core/src/main/routes/kubeconfig-route/get-service-account-route.injectable.ts +++ b/packages/core/src/main/routes/kubeconfig-route/get-service-account-route.injectable.ts @@ -19,7 +19,16 @@ const getServiceAccountRouteInjectable = getRouteInjectable({ path: `${apiPrefix}/kubeconfig/service-account/{namespace}/{account}`, })(async ({ params, cluster }) => { const loadProxyKubeconfig = di.inject(loadProxyKubeconfigInjectable, cluster); - const proxyKubeconfig = await loadProxyKubeconfig(); + const result = await loadProxyKubeconfig(); + + if (!result.isOk) { + return { + error: `Proxy kubeconfig for ${cluster.name.get()} failed: ${result.error.toString()}`, + statusCode: 404, + }; + } + + const proxyKubeconfig = result.value; const client = proxyKubeconfig.makeApiClient(CoreV1Api); const secretList = await client.listNamespacedSecret(params.namespace); diff --git a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts index bc0071431b..0190667b71 100644 --- a/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts +++ b/packages/core/src/main/routes/metrics/add-metrics-route.injectable.ts @@ -5,12 +5,12 @@ import { apiPrefix } from "../../../common/vars"; import { getRouteInjectable } from "../../router/router.injectable"; -import type { ClusterPrometheusMetadata } from "../../../common/cluster-types"; +import type { ClusterPrometheusMetadata, Metadata } from "../../../common/cluster-types"; import { ClusterMetadataKey } from "../../../common/cluster-types"; import type { Cluster } from "../../../common/cluster/cluster"; import { clusterRoute } from "../../router/route"; import { isObject } from "lodash"; -import { isRequestError, object } from "@k8slens/utilities"; +import { isRequestError, isString, isTypedArray, object } from "@k8slens/utilities"; import type { GetMetrics } from "../../get-metrics.injectable"; import getMetricsInjectable from "../../get-metrics.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; @@ -20,12 +20,12 @@ import { runInAction } from "mobx"; // This is used for backoff retry tracking. const ATTEMPTS = [false, false, false, false, true]; -const loadMetricsFor = (getMetrics: GetMetrics) => async (promQueries: string[], cluster: Cluster, prometheusPath: string, queryParams: Partial>): Promise => { +const loadMetricsFor = (getMetrics: GetMetrics) => async (promQueries: string[], cluster: Cluster, prometheusPath: string, queryParams: Partial>): Promise => { const queries = promQueries.map(p => p.trim()); - const loaders = new Map>(); + const loaders = new Map>(); - async function loadMetric(query: string): Promise { - async function loadMetricHelper(): Promise { + async function loadMetric(query: string): Promise { + async function loadMetricHelper() { for (const [attempt, lastAttempt] of ATTEMPTS.entries()) { // retry try { return await getMetrics(cluster, prometheusPath, { query, ...queryParams }); @@ -71,17 +71,19 @@ const addMetricsRouteInjectable = getRouteInjectable({ const prometheusHandler = di.inject(prometheusHandlerInjectable, cluster); try { - const { prometheusPath, provider } = await prometheusHandler.getPrometheusDetails(); + const details = await prometheusHandler.getPrometheusDetails(); - prometheusMetadata.provider = provider?.kind; - prometheusMetadata.autoDetected = !cluster.preferences.prometheusProvider?.type; - - if (!prometheusPath) { + if (!details) { prometheusMetadata.success = false; return { response: {}}; } + const { prometheusPath, provider } = details; + + prometheusMetadata.provider = provider?.kind; + prometheusMetadata.autoDetected = !cluster.preferences.prometheusProvider?.type; + // return data in same structure as query if (typeof payload === "string") { const [data] = await loadMetrics([payload], cluster, prometheusPath, queryParams); @@ -89,7 +91,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ return { response: data }; } - if (Array.isArray(payload)) { + if (isTypedArray(payload, isString)) { const data = await loadMetrics(payload, cluster, prometheusPath, queryParams); return { response: data }; @@ -119,7 +121,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ return { response: {}}; } finally { runInAction(() => { - cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata; + cluster.metadata[ClusterMetadataKey.PROMETHEUS] = prometheusMetadata as Metadata; }); } }); diff --git a/packages/core/src/main/routes/port-forward/functionality/port-forward.ts b/packages/core/src/main/routes/port-forward/functionality/port-forward.ts index 837ed92014..529fbaa705 100644 --- a/packages/core/src/main/routes/port-forward/functionality/port-forward.ts +++ b/packages/core/src/main/routes/port-forward/functionality/port-forward.ts @@ -32,7 +32,7 @@ export interface PortForwardDependencies { export class PortForward { public static portForwards: PortForward[] = []; - static getPortforward(forward: PortForwardArgs) { + static getPortForward(forward: PortForwardArgs) { return PortForward.portForwards.find((pf) => ( pf.clusterId == forward.clusterId && pf.kind == forward.kind && @@ -82,7 +82,7 @@ export class PortForward { }); this.process.stderr.on("data", (data) => { - this.dependencies.logger.debug(`[PORT-FORWARD-ROUTE]: kubectl port-forward process stderr: ${data}`); + this.dependencies.logger.debug(`[PORT-FORWARD-ROUTE]: kubectl port-forward process stderr: ${String(data)}`); }); const internalPort = await this.dependencies.getPortFromStream(this.process.stdout, { @@ -103,7 +103,7 @@ export class PortForward { } } - public async stop() { + public stop() { this.process?.kill(); } } diff --git a/packages/core/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts b/packages/core/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts index 769046c804..f94ed3f283 100644 --- a/packages/core/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts +++ b/packages/core/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts @@ -13,12 +13,12 @@ const getCurrentPortForwardRouteInjectable = getRouteInjectable({ instantiate: () => clusterRoute({ method: "get", path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}`, - })(async ({ params, query, cluster }) => { + })(({ params, query, cluster }) => { const { namespace, resourceType, resourceName } = params; const port = Number(query.get("port")); const forwardPort = Number(query.get("forwardPort")); - const portForward = PortForward.getPortforward({ + const portForward = PortForward.getPortForward({ clusterId: cluster.id, kind: resourceType, name: resourceName, namespace, port, forwardPort, }); diff --git a/packages/core/src/main/routes/port-forward/start-port-forward-route.injectable.ts b/packages/core/src/main/routes/port-forward/start-port-forward-route.injectable.ts index ad924cbe72..ac08aa74ac 100644 --- a/packages/core/src/main/routes/port-forward/start-port-forward-route.injectable.ts +++ b/packages/core/src/main/routes/port-forward/start-port-forward-route.injectable.ts @@ -28,7 +28,7 @@ const startPortForwardRouteInjectable = getRouteInjectable({ const proxyKubeconfigManager = di.inject(kubeconfigManagerInjectable, cluster); try { - let portForward = PortForward.getPortforward({ + let portForward = PortForward.getPortForward({ clusterId: cluster.id, kind: resourceType, name: resourceName, @@ -79,7 +79,7 @@ const startPortForwardRouteInjectable = getRouteInjectable({ return { response: { port: portForward.forwardPort }}; } catch (error) { logger.error( - `[PORT-FORWARD-ROUTE]: failed to open a port-forward: ${error}`, + `[PORT-FORWARD-ROUTE]: failed to open a port-forward: ${String(error)}`, { namespace, port, resourceType, resourceName }, ); diff --git a/packages/core/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts b/packages/core/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts index 372dc34aac..f750182143 100644 --- a/packages/core/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts +++ b/packages/core/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts @@ -17,17 +17,17 @@ const stopCurrentPortForwardRouteInjectable = getRouteInjectable({ return clusterRoute({ method: "delete", path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}`, - })(async ({ params, query, cluster }) => { + })(({ params, query, cluster }) => { const { namespace, resourceType, resourceName } = params; const port = Number(query.get("port")); const forwardPort = Number(query.get("forwardPort")); - const portForward = PortForward.getPortforward({ + const portForward = PortForward.getPortForward({ clusterId: cluster.id, kind: resourceType, name: resourceName, namespace, port, forwardPort, }); try { - await portForward?.stop(); + portForward?.stop(); return { response: { status: true }}; } catch (error) { diff --git a/packages/core/src/main/routes/resource-applier/create-resource-route.injectable.ts b/packages/core/src/main/routes/resource-applier/create-resource-route.injectable.ts index a2d8766170..e728b3fb00 100644 --- a/packages/core/src/main/routes/resource-applier/create-resource-route.injectable.ts +++ b/packages/core/src/main/routes/resource-applier/create-resource-route.injectable.ts @@ -4,17 +4,17 @@ */ import { getRouteInjectable } from "../../router/router.injectable"; import { apiPrefix } from "../../../common/vars"; -import { payloadValidatedClusterRoute } from "../../router/route"; -import Joi from "joi"; +import { payloadWithSchemaClusterRoute } from "../../router/route"; import resourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable"; +import { z } from "zod"; const createResourceRouteInjectable = getRouteInjectable({ id: "create-resource-route", - instantiate: (di) => payloadValidatedClusterRoute({ + instantiate: (di) => payloadWithSchemaClusterRoute({ method: "post", path: `${apiPrefix}/stack`, - payloadValidator: Joi.string(), + payloadSchema: z.string(), })(async ({ cluster, payload }) => { const resourceApplier = di.inject(resourceApplierInjectable, cluster); diff --git a/packages/core/src/main/routes/resource-applier/patch-resource-route.injectable.ts b/packages/core/src/main/routes/resource-applier/patch-resource-route.injectable.ts index 6cac0436f5..2409d0dc43 100644 --- a/packages/core/src/main/routes/resource-applier/patch-resource-route.injectable.ts +++ b/packages/core/src/main/routes/resource-applier/patch-resource-route.injectable.ts @@ -4,46 +4,30 @@ */ import { getRouteInjectable } from "../../router/router.injectable"; import { apiPrefix } from "../../../common/vars"; -import { payloadValidatedClusterRoute } from "../../router/route"; -import Joi from "joi"; -import type { Patch } from "rfc6902"; +import { payloadWithSchemaClusterRoute } from "../../router/route"; import resourceApplierInjectable from "../../resource-applier/create-resource-applier.injectable"; +import { z } from "zod"; +import type { Patch } from "rfc6902"; -interface PatchResourcePayload { - name: string; - kind: string; - patch: Patch; - ns?: string; -} - -const patchResourcePayloadValidator = Joi.object({ - name: Joi - .string() - .required(), - kind: Joi - .string() - .required(), - ns: Joi - .string() - .optional(), - patch: Joi - .array() - .allow( - Joi.object({ - op: Joi - .string() - .required(), - }).unknown(true), - ), +const patchResourcePayloadSchema = z.object({ + name: z.string(), + kind: z.string(), + ns: z.string().optional(), + patch: z.array(z.object({ + op: z.string(), + path: z.string(), + value: z.any().optional(), + from: z.string().optional(), + })), }); const patchResourceRouteInjectable = getRouteInjectable({ id: "patch-resource-route", - instantiate: (di) => payloadValidatedClusterRoute({ + instantiate: (di) => payloadWithSchemaClusterRoute({ method: "patch", path: `${apiPrefix}/stack`, - payloadValidator: patchResourcePayloadValidator, + payloadSchema: patchResourcePayloadSchema, })(async ({ cluster, payload }) => { const resourceApplier = di.inject(resourceApplierInjectable, cluster); @@ -51,7 +35,7 @@ const patchResourceRouteInjectable = getRouteInjectable({ response: await resourceApplier.patch( payload.name, payload.kind, - payload.patch, + payload.patch as Patch, payload.ns, ), }); diff --git a/packages/core/src/main/shell-session/local-shell-session/local-shell-session.ts b/packages/core/src/main/shell-session/local-shell-session/local-shell-session.ts index b066702266..fcc39ccd06 100644 --- a/packages/core/src/main/shell-session/local-shell-session/local-shell-session.ts +++ b/packages/core/src/main/shell-session/local-shell-session/local-shell-session.ts @@ -44,12 +44,10 @@ export class LocalShellSession extends ShellSession { throw new Error("PTYSHELL is not defined with the environment"); } - const args = await this.getShellArgs(shell); - - await this.openShellProcess(shell, args, env); + await this.openShellProcess(shell, this.getShellArgs(shell), env); } - protected async getShellArgs(shell: string): Promise { + protected getShellArgs(shell: string): string[] { const pathFromPreferences = this.dependencies.state.kubectlBinariesPath || this.kubectl.getBundledPath(); const kubectlPathDir = this.dependencies.state.downloadKubectlBinaries ? this.dependencies.directoryContainingKubectl @@ -61,7 +59,7 @@ export class LocalShellSession extends ShellSession { case "bash": return ["--init-file", this.dependencies.joinPaths(this.dependencies.directoryContainingKubectl, ".bash_set_path")]; case "fish": - return ["--login", "--init-command", `export PATH="${kubectlPathDir}:${this.dependencies.directoryForBinaries}:$PATH"; export KUBECONFIG="${await this.dependencies.proxyKubeconfigPath}"`]; + return ["--login", "--init-command", `export PATH="${kubectlPathDir}:${this.dependencies.directoryForBinaries}:$PATH"; export KUBECONFIG="${this.dependencies.proxyKubeconfigPath}"`]; case "zsh": return ["--login"]; default: diff --git a/packages/core/src/main/shell-session/local-shell-session/techincal.test.ts b/packages/core/src/main/shell-session/local-shell-session/techincal.test.ts index f38870df51..25ab8ce42b 100644 --- a/packages/core/src/main/shell-session/local-shell-session/techincal.test.ts +++ b/packages/core/src/main/shell-session/local-shell-session/techincal.test.ts @@ -54,12 +54,12 @@ describe("technical unit tests for local shell sessions", () => { di.override(spawnPtyInjectable, () => spawnPtyMock); di.override(createKubectlInjectable, () => () => ({ - binDir: async () => "/some-kubectl-binary-dir", + binDir: () => Promise.resolve("/some-kubectl-binary-dir"), getBundledPath: () => "/some-bundled-kubectl-path", }) as Partial as Kubectl); di.override(kubeconfigManagerInjectable, () => ({ - ensurePath: async () => "/some-proxy-kubeconfig-file", + ensurePath: () => Promise.resolve("/some-proxy-kubeconfig-file"), } as Partial as KubeconfigManager)); openLocalShellSession = di.inject(openLocalShellSessionInjectable); @@ -97,7 +97,7 @@ describe("technical unit tests for local shell sessions", () => { once: jest.fn(() => websocket), } as Partial as WebSocket; - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-kube-config-path", diff --git a/packages/core/src/main/shell-session/node-shell-session/node-shell-session.ts b/packages/core/src/main/shell-session/node-shell-session/node-shell-session.ts index b564b33073..506084e5ae 100644 --- a/packages/core/src/main/shell-session/node-shell-session/node-shell-session.ts +++ b/packages/core/src/main/shell-session/node-shell-session/node-shell-session.ts @@ -40,7 +40,15 @@ export class NodeShellSession extends ShellSession { } public async open() { - const proxyKubeconfig = await this.dependencies.loadProxyKubeconfig(); + const proxyConfigResult = await this.dependencies.loadProxyKubeconfig(); + + if (!proxyConfigResult.isOk) { + this.dependencies.logger.error(`PROXY CONFIG FAILED VALIDATION: ${proxyConfigResult.error.toString()}`); + + return; + } + + const proxyKubeconfig = proxyConfigResult.value; const coreApi = proxyKubeconfig.makeApiClient(CoreV1Api); const cleanup = once(() => { diff --git a/packages/core/src/main/shell-session/shell-env-modifier/modify-terminal-shell-env.injectable.ts b/packages/core/src/main/shell-session/shell-env-modifier/modify-terminal-shell-env.injectable.ts index 908ee8bd30..096a32d905 100644 --- a/packages/core/src/main/shell-session/shell-env-modifier/modify-terminal-shell-env.injectable.ts +++ b/packages/core/src/main/shell-session/shell-env-modifier/modify-terminal-shell-env.injectable.ts @@ -37,7 +37,7 @@ const modifyTerminalShellEnvInjectable = getInjectable({ const ctx = { catalogEntity: entity }; // clone it so the passed value is not also modified - env = JSON.parse(JSON.stringify(env)); + env = JSON.parse(JSON.stringify(env)) as Partial>; env = modifiers.reduce((env, modifier) => modifier(ctx, env), env); } diff --git a/packages/core/src/main/shell-session/shell-session.ts b/packages/core/src/main/shell-session/shell-session.ts index caabf6eacb..4219cbaf7e 100644 --- a/packages/core/src/main/shell-session/shell-session.ts +++ b/packages/core/src/main/shell-session/shell-session.ts @@ -10,7 +10,7 @@ import { clearKubeconfigEnvVars } from "../utils/clear-kube-env-vars"; import path from "path"; import os from "os"; import type * as pty from "node-pty"; -import { getOrInsertWith } from "@k8slens/utilities"; +import { getOrInsertWith, json } from "@k8slens/utilities"; import { type TerminalMessage, TerminalChannels } from "../../common/terminal/channels"; import type { Logger } from "@k8slens/logger"; import type { ComputeShellEnvironment } from "../../features/shell-sync/main/compute-shell-environment.injectable"; @@ -250,7 +250,7 @@ export abstract class ShellSession { const data = rawData.toString(); try { - const message: TerminalMessage = JSON.parse(data); + const message = JSON.parse(data) as TerminalMessage; switch (message.type) { case TerminalChannels.STDIN: @@ -312,7 +312,7 @@ export abstract class ShellSession { this.dependencies.shellSessionEnvs.set(clusterId, env); } else { // refresh env in the background - this.getShellEnv().then((shellEnv: any) => { + void this.getShellEnv().then((shellEnv) => { this.dependencies.shellSessionEnvs.set(clusterId, shellEnv); }); } @@ -324,14 +324,14 @@ export abstract class ShellSession { const shell = this.dependencies.userShellSetting.get(); const result = await this.dependencies.computeShellEnvironment(shell); const rawEnv = (() => { - if (result.callWasSuccessful) { - return result.response ?? process.env; + if (result.isOk) { + return result.value ?? process.env; } return process.env; })(); - const env = clearKubeconfigEnvVars(JSON.parse(JSON.stringify(rawEnv))); + const env = clearKubeconfigEnvVars(json.clone(rawEnv)); const pathStr = [this.dependencies.directoryContainingKubectl, ...this.getPathEntries(), env.PATH].join(path.delimiter); delete env.DEBUG; // don't pass DEBUG into shells diff --git a/packages/core/src/main/start-main-application/lens-window/application-window/__test__/session-certificate-verifier.test.ts b/packages/core/src/main/start-main-application/lens-window/application-window/__test__/session-certificate-verifier.test.ts index a8db1947a3..00f779b839 100644 --- a/packages/core/src/main/start-main-application/lens-window/application-window/__test__/session-certificate-verifier.test.ts +++ b/packages/core/src/main/start-main-application/lens-window/application-window/__test__/session-certificate-verifier.test.ts @@ -60,7 +60,7 @@ describe("sessionCertificateVerifier", () => { sessionCertificateVerifier({ certificate: { data: lensProxyCertificate.cert }, - } as any, callback); + } as Electron.Request, callback); expect(callback).toHaveBeenCalledWith(ChromiumNetError.SUCCESS); }); @@ -71,7 +71,7 @@ describe("sessionCertificateVerifier", () => { sessionCertificateVerifier({ certificate: { data: externalCertificate }, - } as any, callback); + } as Electron.Request, callback); expect(callback).toHaveBeenCalledWith(ChromiumNetError.RESULT_FROM_CHROMIUM); }); diff --git a/packages/core/src/main/start-main-application/lens-window/application-window/create-electron-window.injectable.ts b/packages/core/src/main/start-main-application/lens-window/application-window/create-electron-window.injectable.ts index 59c6c857b2..7ed2e31147 100644 --- a/packages/core/src/main/start-main-application/lens-window/application-window/create-electron-window.injectable.ts +++ b/packages/core/src/main/start-main-application/lens-window/application-window/create-electron-window.injectable.ts @@ -101,7 +101,7 @@ const createElectronWindowInjectable = getInjectable({ try { browserWindow.setIcon(iconFileName); } catch (err) { - logger.warn(`Error while setting window icon ${err}`); + logger.warn(`Error while setting window icon ${String(err)}`); } } else { logger.warn(`No suitable icon found for task bar.`); @@ -141,11 +141,15 @@ const createElectronWindowInjectable = getInjectable({ ); }) .setWindowOpenHandler((details) => { - openLinkInBrowser(details.url).catch((error) => { - logger.error("[CREATE-ELECTRON-WINDOW]: failed to open browser", { - error, - }); - }); + void (async () => { + try { + await openLinkInBrowser(details.url); + } catch (error) { + logger.error("[CREATE-ELECTRON-WINDOW]: failed to open browser", { + error, + }); + } + })(); return { action: "deny" }; }); diff --git a/packages/core/src/main/start-main-application/lens-window/navigate-for-extension.injectable.ts b/packages/core/src/main/start-main-application/lens-window/navigate-for-extension.injectable.ts index dfec478f7d..4a1957bf87 100644 --- a/packages/core/src/main/start-main-application/lens-window/navigate-for-extension.injectable.ts +++ b/packages/core/src/main/start-main-application/lens-window/navigate-for-extension.injectable.ts @@ -14,7 +14,7 @@ import { navigateForExtensionChannel } from "../../../features/extensions/naviga export type NavigateForExtension = ( extId: string, pageId?: string, - params?: Record, + params?: Record, frameId?: number ) => Promise; @@ -26,12 +26,7 @@ const navigateForExtensionInjectable = getInjectable({ const clusterFrames = di.inject(clusterFramesInjectable); const showApplicationWindow = di.inject(showApplicationWindowInjectable); - return async ( - extId: string, - pageId?: string, - params?: Record, - frameId?: number, - ) => { + return async (extId, pageId, params, frameId) => { await showApplicationWindow(); const applicationWindow = getApplicationWindow(); diff --git a/packages/core/src/main/start-main-application/runnables/initialize-extensions.injectable.ts b/packages/core/src/main/start-main-application/runnables/initialize-extensions.injectable.ts index 93fa9fccec..2952b1865f 100644 --- a/packages/core/src/main/start-main-application/runnables/initialize-extensions.injectable.ts +++ b/packages/core/src/main/start-main-application/runnables/initialize-extensions.injectable.ts @@ -9,6 +9,7 @@ import extensionLoaderInjectable from "../../../extensions/extension-loader/exte import showErrorPopupInjectable from "../../electron-app/features/show-error-popup.injectable"; import { onLoadOfApplicationInjectionToken } from "@k8slens/application"; import setupShellInjectable from "../../../features/shell-sync/main/setup-shell.injectable"; +import { hasStringProperty, isObject } from "@k8slens/utilities"; const initializeExtensionsInjectable = getInjectable({ id: "initialize-extensions", @@ -38,14 +39,14 @@ const initializeExtensionsInjectable = getInjectable({ extensionLoader.addExtension(extension); }) .on("remove", (lensExtensionId) => { - extensionLoader.removeExtension(lensExtensionId); + void extensionLoader.removeExtension(lensExtensionId); }); extensionLoader.initExtensions(extensions); - } catch (error: any) { + } catch (error) { showErrorPopup( "Lens Error", - `Could not load extensions${error?.message ? `: ${error.message}` : ""}`, + `Could not load extensions${isObject(error) && hasStringProperty(error, "message") ? `: ${error.message}` : ""}`, ); console.error(error); diff --git a/packages/core/src/main/start-main-application/runnables/root-frame-has-rendered/channel-listener.injectable.ts b/packages/core/src/main/start-main-application/runnables/root-frame-has-rendered/channel-listener.injectable.ts index 4769c12256..62b0ccee90 100644 --- a/packages/core/src/main/start-main-application/runnables/root-frame-has-rendered/channel-listener.injectable.ts +++ b/packages/core/src/main/start-main-application/runnables/root-frame-has-rendered/channel-listener.injectable.ts @@ -12,8 +12,9 @@ const rootFrameRenderedChannelListenerInjectable = getMessageChannelListenerInje channel: rootFrameHasRenderedChannel, getHandler: (di) => { const runMany = runManyFor(di); + const runManyAfterRootFrameIsReady = runMany(afterRootFrameIsReadyInjectionToken); - return runMany(afterRootFrameIsReadyInjectionToken); + return () => void runManyAfterRootFrameIsReady(); }, }); diff --git a/packages/core/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts b/packages/core/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts index 25f44c14a8..46da9baeb4 100644 --- a/packages/core/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts +++ b/packages/core/src/main/start-main-application/runnables/setup-lens-proxy.injectable.ts @@ -15,6 +15,7 @@ import fetchInjectable from "../../../common/fetch/fetch.injectable"; import { Agent } from "https"; import { buildVersionInitializable } from "../../../features/vars/build-version/common/token"; import { buildVersionInitializationInjectable } from "../../../features/vars/build-version/main/init.injectable"; +import { hasStringProperty, isObject } from "@k8slens/utilities"; const setupLensProxyInjectable = getInjectable({ id: "setup-lens-proxy", @@ -34,8 +35,8 @@ const setupLensProxyInjectable = getInjectable({ try { logger.info("🔌 Starting LensProxy"); await lensProxy.listen(); // lensProxy.port available - } catch (error: any) { - showErrorPopup("Lens Error", `Could not start proxy: ${error?.message || "unknown error"}`); + } catch (error) { + showErrorPopup("Lens Error", `Could not start proxy: ${isObject(error) && hasStringProperty(error, "message") ? error.message : "unknown error"}`); return forceAppExit(); } @@ -59,13 +60,13 @@ const setupLensProxyInjectable = getInjectable({ logger.info("⚡ LensProxy connection OK"); } catch (error) { - logger.error(`🛑 LensProxy: failed connection test: ${error}`); + logger.error(`🛑 LensProxy: failed connection test: ${String(error)}`); const hostsPath = isWindows ? "C:\\windows\\system32\\drivers\\etc\\hosts" : "/etc/hosts"; const message = [ - `Failed connection test: ${error}`, + `Failed connection test: ${String(error)}`, "Check to make sure that no other versions of Lens are running", `Check ${hostsPath} to make sure that it is clean and that the localhost loopback is at the top and set to 127.0.0.1`, "If you have HTTP_PROXY or http_proxy set in your environment, make sure that the localhost and the ipv4 loopback address 127.0.0.1 are added to the NO_PROXY environment variable.", diff --git a/packages/core/src/main/tray/electron-tray/electron-tray.injectable.ts b/packages/core/src/main/tray/electron-tray/electron-tray.injectable.ts index d9947a2959..786d29afeb 100644 --- a/packages/core/src/main/tray/electron-tray/electron-tray.injectable.ts +++ b/packages/core/src/main/tray/electron-tray/electron-tray.injectable.ts @@ -18,7 +18,7 @@ export interface MinimalTrayMenuItem { parentId: string | null; enabled: boolean; label?: string; - click?: () => Promise | void; + click?: () => void; tooltip?: string; separator?: boolean; } @@ -52,7 +52,7 @@ const electronTrayInjectable = getInjectable({ if (isWindows) { tray.on("click", () => { showApplicationWindow() - .catch(error => logger.error(`${TRAY_LOG_PREFIX}: Failed to open lens`, { error })); + .catch((error: unknown) => logger.error(`${TRAY_LOG_PREFIX}: Failed to open lens`, { error })); }); } }, diff --git a/packages/core/src/main/tray/tray-menu-item/implementations/about-app-tray-item.injectable.ts b/packages/core/src/main/tray/tray-menu-item/implementations/about-app-tray-item.injectable.ts index c6da2c3f14..c86b770ece 100644 --- a/packages/core/src/main/tray/tray-menu-item/implementations/about-app-tray-item.injectable.ts +++ b/packages/core/src/main/tray/tray-menu-item/implementations/about-app-tray-item.injectable.ts @@ -32,7 +32,7 @@ const aboutAppTrayItemInjectable = getInjectable({ click: pipeline( async () => { await showApplicationWindow(); - showAbout(); + await showAbout(); }, withErrorLoggingFor(() => "[TRAY]: Opening of show about failed."), withErrorSuppression, diff --git a/packages/core/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts b/packages/core/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts index dc6dbf37fe..9b161e4d75 100644 --- a/packages/core/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts +++ b/packages/core/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts @@ -71,15 +71,10 @@ const toItemInjectablesFor = (extension: LensMainExtension, withErrorLoggingFor: click: () => { const decorated = pipeline( registration.click || (() => {}), - withErrorLoggingFor( - () => - `[TRAY]: Clicking of tray item "${trayItemId}" from extension "${extension.sanitizedExtensionId}" failed.`, + () => `[TRAY]: Clicking of tray item "${trayItemId}" from extension "${extension.sanitizedExtensionId}" failed.`, ), - - // TODO: Find out how to improve typing so that instead of - // x => withErrorSuppression(x) there could only be withErrorSuppression - (x) => withErrorSuppression(x), + withErrorSuppression, ); return decorated(registration); diff --git a/packages/core/src/main/utils/get-port-from-stream.injectable.ts b/packages/core/src/main/utils/get-port-from-stream.injectable.ts index 854230eb73..d303d97132 100644 --- a/packages/core/src/main/utils/get-port-from-stream.injectable.ts +++ b/packages/core/src/main/utils/get-port-from-stream.injectable.ts @@ -48,12 +48,13 @@ const getPortFromStreamInjectable = getInjectable({ const handler = (data: unknown) => { const logItem = String(data); const match = args.lineRegex.match(logItem); + const { address } = match.groups ?? {}; logLines.push(logItem); - if (match.matched) { + if (match.matched && address) { // use unknown protocol so that there is no default port - const addr = new URLParse(`s://${match.groups?.address?.trim()}`); + const addr = new URLParse(`s://${address.trim()}`); args.onFind?.(); stream.off("data", handler); diff --git a/packages/core/src/main/utils/http-responses.ts b/packages/core/src/main/utils/http-responses.ts index 0707621369..a80363709d 100644 --- a/packages/core/src/main/utils/http-responses.ts +++ b/packages/core/src/main/utils/http-responses.ts @@ -11,7 +11,7 @@ import type http from "http"; * @param content The data or its JSON stringified version of it * @param status [200] The status code to respond with */ -export function respondJson(res: http.ServerResponse, content: Object | string, status = 200) { +export function respondJson(res: http.ServerResponse, content: object | string, status = 200) { const normalizedContent = typeof content === "object" ? JSON.stringify(content) : content; diff --git a/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.test.ts b/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.test.ts index 9ee9c86459..e514243d2a 100644 --- a/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.test.ts +++ b/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-from-electron.test.ts @@ -32,7 +32,7 @@ describe("technical: resolve-system-proxy-from-electron", () => { di.override( resolveSystemProxyWindowInjectable, - async () => ({ + () => Promise.resolve({ webContents: { session: { resolveProxy: resolveSystemProxyMock, @@ -59,21 +59,21 @@ describe("technical: resolve-system-proxy-from-electron", () => { }); it("when call for proxy, resolves with the proxy", async () => { - resolveSystemProxyMock.resolve("some-proxy"); + await resolveSystemProxyMock.resolve("some-proxy"); expect(await actualPromise).toBe("some-proxy"); }); }); describe("given there are unexpected issues, when called with URL", () => { - let error: any; + let error: unknown; beforeEach(async () => { resolveSystemProxyMock = asyncFn(); di.override( resolveSystemProxyWindowInjectable, - async () => ({ + () => Promise.resolve({ webContents: { session: { resolveProxy: () => { @@ -98,7 +98,7 @@ describe("technical: resolve-system-proxy-from-electron", () => { }); it("throws error", () => { - expect(error.message).toBe("unexpected error"); + expect((error as Error).message).toBe("unexpected error"); }); it("logs error", () => { diff --git a/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-window.global-override-for-injectable.ts b/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-window.global-override-for-injectable.ts index 680101b998..e19c48d6c3 100644 --- a/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-window.global-override-for-injectable.ts +++ b/packages/core/src/main/utils/resolve-system-proxy/resolve-system-proxy-window.global-override-for-injectable.ts @@ -9,7 +9,7 @@ import resolveSystemProxyWindowInjectable from "./resolve-system-proxy-window.in export default getGlobalOverride( resolveSystemProxyWindowInjectable, - async () => ({ + () => Promise.resolve({ webContents: { session: { resolveProxy: () => "DIRECT", diff --git a/packages/core/src/renderer/api/catalog/entity/__tests__/metrics-enabled.test.ts b/packages/core/src/renderer/api/catalog/entity/__tests__/metrics-enabled.test.ts index c248133541..1422fddcf7 100644 --- a/packages/core/src/renderer/api/catalog/entity/__tests__/metrics-enabled.test.ts +++ b/packages/core/src/renderer/api/catalog/entity/__tests__/metrics-enabled.test.ts @@ -18,7 +18,7 @@ describe("metrics-enabled", () => { beforeEach(() => { di = getDiForUnitTesting(); - cluster = new Cluster({ contextName: "irrelevant", id: "irrelevant", kubeConfigPath: "irrelevant" }); + cluster = Cluster.createForTestingOnly({ contextName: "irrelevant", id: "irrelevant", kubeConfigPath: "irrelevant" }); const observableCluster = observable.box(cluster); di.override(activeEntityInternalClusterInjectable, () => observableCluster); diff --git a/packages/core/src/renderer/api/catalog/entity/registry.ts b/packages/core/src/renderer/api/catalog/entity/registry.ts index afcf308da6..aaf503938c 100644 --- a/packages/core/src/renderer/api/catalog/entity/registry.ts +++ b/packages/core/src/renderer/api/catalog/entity/registry.ts @@ -3,12 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { computed, observable, makeObservable, action } from "mobx"; +import { computed, observable, makeObservable, action, runInAction } from "mobx"; import { ipcRendererOn } from "../../../../common/ipc"; import type { CatalogCategory, CatalogEntity, CatalogEntityData, CatalogCategoryRegistry, CatalogEntityKindData } from "../../../../common/catalog"; -import "../../../../common/catalog-entities"; -import { iter } from "@k8slens/utilities"; import type { Disposer } from "@k8slens/utilities"; +import { iter } from "@k8slens/utilities"; import { once } from "lodash"; import { CatalogRunEvent } from "../../../../common/catalog/catalog-run-event"; import { ipcRenderer } from "electron"; @@ -17,7 +16,7 @@ import { isMainFrame } from "process"; import type { Navigate } from "../../../navigation/navigate.injectable"; import type { Logger } from "@k8slens/logger"; -export type EntityFilter = (entity: CatalogEntity) => any; +export type EntityFilter = (entity: CatalogEntity) => unknown; export type CatalogEntityOnBeforeRun = (event: CatalogRunEvent) => void | Promise; interface Dependencies { @@ -83,19 +82,19 @@ export class CatalogEntityRegistry { } init() { - ipcRendererOn(catalogItemsChannel, (event, items: (CatalogEntityData & CatalogEntityKindData)[]) => { - this.updateItems(items); + ipcRendererOn(catalogItemsChannel, (event, items) => { + this.updateItems(items as (CatalogEntityData & CatalogEntityKindData)[]); }); // Make sure that we get items ASAP and not the next time one of them changes ipcRenderer.send(catalogInitChannel); if (isMainFrame) { - ipcRendererOn(catalogEntityRunListener, (event, id: string) => { - const entity = this.getById(id); + ipcRendererOn(catalogEntityRunListener, (event, id) => { + const entity = this.getById(id as string); if (entity) { - this.onRun(entity); + void this.onRun(entity); } }); } @@ -197,8 +196,10 @@ export class CatalogEntityRegistry { * @param fn The function that should return a truthy value if that entity should be sent currently "active" * @returns A function to remove that filter */ - @action addCatalogFilter(fn: EntityFilter): Disposer { - this.filters.add(fn); + addCatalogFilter(fn: EntityFilter): Disposer { + runInAction(() => { + this.filters.add(fn); + }); return once(() => void this.filters.delete(fn)); } @@ -208,8 +209,10 @@ export class CatalogEntityRegistry { * @param onBeforeRun The function that should return a boolean if the onRun of catalog entity should be triggered. * @returns A function to remove that hook */ - @action addOnBeforeRun(onBeforeRun: CatalogEntityOnBeforeRun): Disposer { - this.onBeforeRunHooks.add(onBeforeRun); + addOnBeforeRun(onBeforeRun: CatalogEntityOnBeforeRun): Disposer { + runInAction(() => { + this.onBeforeRunHooks.add(onBeforeRun); + }); return once(() => void this.onBeforeRunHooks.delete(onBeforeRun)); } diff --git a/packages/core/src/renderer/api/terminal-api.ts b/packages/core/src/renderer/api/terminal-api.ts index 7e78fd4343..665fc727bc 100644 --- a/packages/core/src/renderer/api/terminal-api.ts +++ b/packages/core/src/renderer/api/terminal-api.ts @@ -67,7 +67,7 @@ export class TerminalApi extends WebSocketApi { this.emitStatus("Connecting ..."); } - const authTokenArray = await ipcRenderer.invoke("cluster:shell-api", this.dependencies.hostedClusterId, this.query.id); + const authTokenArray = (await ipcRenderer.invoke("cluster:shell-api", this.dependencies.hostedClusterId, this.query.id)) as unknown; if (!(authTokenArray instanceof Uint8Array)) { throw new TypeError("ShellApi token is not a Uint8Array"); diff --git a/packages/core/src/renderer/api/websocket-api.ts b/packages/core/src/renderer/api/websocket-api.ts index eddeda0049..98cc7a4ed2 100644 --- a/packages/core/src/renderer/api/websocket-api.ts +++ b/packages/core/src/renderer/api/websocket-api.ts @@ -193,7 +193,7 @@ export class WebSocketApi extends (EventEmitter this.writeLog("%cCLOSE", `color:${error ? "red" : "black"};font-weight:bold;`, evt); } - protected writeLog(...data: any[]) { + protected writeLog(...data: unknown[]) { if (this.params.logging) { console.debug(...data); } diff --git a/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts b/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts index b24cfb6ebf..c310585efc 100644 --- a/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts +++ b/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts @@ -25,7 +25,7 @@ const listenUnloadInjectable = getInjectable({ const frameRoutingId = di.inject(frameRoutingIdInjectable); logger.info( - `[CLUSTER-FRAME] Unload dashboard, clusterId=${hostedCluster?.id}, frameId=${frameRoutingId}`, + `[CLUSTER-FRAME] Unload dashboard, clusterId=${String(hostedCluster?.id)}, frameId=${frameRoutingId}`, ); } else { logger.info("[ROOT-FRAME]: Unload app"); diff --git a/packages/core/src/renderer/before-frame-starts/runnables/setup-auto-registration.injectable.ts b/packages/core/src/renderer/before-frame-starts/runnables/setup-auto-registration.injectable.ts deleted file mode 100644 index 158c21509f..0000000000 --- a/packages/core/src/renderer/before-frame-starts/runnables/setup-auto-registration.injectable.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import autoRegistrationEmitterInjectable from "../../../common/k8s-api/api-manager/auto-registration-emitter.injectable"; -import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; -import type { KubeApi } from "@k8slens/kube-api"; -import { beforeClusterFrameStartsSecondInjectionToken } from "../tokens"; - -const setupAutoRegistrationInjectable = getInjectable({ - id: "setup-auto-registration", - instantiate: (di) => ({ - run: () => { - const autoRegistrationEmitter = di.inject(autoRegistrationEmitterInjectable); - const beforeApiManagerInitializationApis: KubeApi[] = []; - let initialized = false; - - const autoInitKubeApi = (api: KubeApi) => { - apiManager.registerApi(api); - }; - - autoRegistrationEmitter - .on("kubeApi", (api) => { - if (initialized) { - autoInitKubeApi(api); - } else { - beforeApiManagerInitializationApis.push(api); - } - }); - - // NOTE: this MUST happen after the event emitter listeners are registered - const apiManager = di.inject(apiManagerInjectable); - - beforeApiManagerInitializationApis.forEach(autoInitKubeApi); - initialized = true; - }, - }), - injectionToken: beforeClusterFrameStartsSecondInjectionToken, -}); - -export default setupAutoRegistrationInjectable; diff --git a/packages/core/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts b/packages/core/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts index 5261e39bb9..2950ea7998 100644 --- a/packages/core/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts +++ b/packages/core/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts @@ -36,12 +36,12 @@ const setupKubernetesClusterContextMenuOpenInjectable = getInjectable({ const loadKubeconfig = di.inject(loadKubeconfigInjectable, cluster); - const result = await loadKubeconfig(true); + const result = await loadKubeconfig(); - if (result.error) { + if (result.isOk === false) { logger.error("[KUBERNETES-CLUSTER]: failed to parse kubeconfig file", result.error); } else { - openDeleteClusterDialog(result.config, cluster); + openDeleteClusterDialog(result.value, cluster); } }, }); diff --git a/packages/core/src/renderer/bootstrap.tsx b/packages/core/src/renderer/bootstrap.tsx index 7d76798520..c9a73b05dd 100644 --- a/packages/core/src/renderer/bootstrap.tsx +++ b/packages/core/src/renderer/bootstrap.tsx @@ -36,7 +36,7 @@ export async function bootstrap(di: DiContainerForInjection) { try { await initializeApp(); } catch (error) { - console.error(`[BOOTSTRAP]: view initialization error: ${error}`, { + console.error(`[BOOTSTRAP]: view initialization error: ${String(error)}`, { origin: location.href, isTopFrameView: process.isMainFrame, }); diff --git a/packages/core/src/renderer/components/__tests__/cronjob.store.test.ts b/packages/core/src/renderer/components/__tests__/cronjob.store.test.ts index 9c5c8cafa6..fd79d15203 100644 --- a/packages/core/src/renderer/components/__tests__/cronjob.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/cronjob.store.test.ts @@ -127,7 +127,7 @@ describe("CronJob Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/daemonset.store.test.ts b/packages/core/src/renderer/components/__tests__/daemonset.store.test.ts index afed95c7a1..0f73fe4684 100644 --- a/packages/core/src/renderer/components/__tests__/daemonset.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/daemonset.store.test.ts @@ -144,7 +144,7 @@ describe("DaemonSet Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/deployments.store.test.ts b/packages/core/src/renderer/components/__tests__/deployments.store.test.ts index 31a4460bd6..35947de28f 100644 --- a/packages/core/src/renderer/components/__tests__/deployments.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/deployments.store.test.ts @@ -216,7 +216,7 @@ describe("Deployment Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/job.store.test.ts b/packages/core/src/renderer/components/__tests__/job.store.test.ts index 1d43c32a5d..4fbf651c62 100644 --- a/packages/core/src/renderer/components/__tests__/job.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/job.store.test.ts @@ -181,7 +181,7 @@ describe("Job Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/pods.store.test.ts b/packages/core/src/renderer/components/__tests__/pods.store.test.ts index a8735d39c7..bf8b7b357f 100644 --- a/packages/core/src/renderer/components/__tests__/pods.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/pods.store.test.ts @@ -127,7 +127,7 @@ describe("Pod Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/replicaset.store.test.ts b/packages/core/src/renderer/components/__tests__/replicaset.store.test.ts index 296da6e6a2..387643f764 100644 --- a/packages/core/src/renderer/components/__tests__/replicaset.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/replicaset.store.test.ts @@ -144,7 +144,7 @@ describe("ReplicaSet Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/__tests__/statefulset.store.test.ts b/packages/core/src/renderer/components/__tests__/statefulset.store.test.ts index 05c90c0beb..90e14ea7be 100644 --- a/packages/core/src/renderer/components/__tests__/statefulset.store.test.ts +++ b/packages/core/src/renderer/components/__tests__/statefulset.store.test.ts @@ -144,7 +144,7 @@ describe("StatefulSet Store tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/activate-entity-command/activate-entity-command.tsx b/packages/core/src/renderer/components/activate-entity-command/activate-entity-command.tsx index 631415d804..29ddd7c74c 100644 --- a/packages/core/src/renderer/components/activate-entity-command/activate-entity-command.tsx +++ b/packages/core/src/renderer/components/activate-entity-command/activate-entity-command.tsx @@ -28,7 +28,7 @@ const NonInjectedActivateEntityCommand = observer(({ menuPortalTarget={null} onChange={(option) => { if (option) { - broadcastMessage(catalogEntityRunListener, option.value.getId()); + void broadcastMessage(catalogEntityRunListener, option.value.getId()); closeCommandOverlay(); } }} diff --git a/packages/core/src/renderer/components/add-cluster/add-cluster.tsx b/packages/core/src/renderer/components/add-cluster/add-cluster.tsx index 073523439e..040532b04c 100644 --- a/packages/core/src/renderer/components/add-cluster/add-cluster.tsx +++ b/packages/core/src/renderer/components/add-cluster/add-cluster.tsx @@ -49,7 +49,11 @@ function getContexts(config: KubeConfig): Map { splitConfig(config) .map(({ config, validationResult }) => [config.currentContext, { config, - error: validationResult.error?.toString(), + error: ( + !validationResult.isOk + ? validationResult.error?.toString() + : undefined + ), }]), ); } @@ -78,36 +82,41 @@ class NonInjectedAddCluster extends React.Component { } readonly refreshContexts = debounce(action(() => { - const { config, error } = loadConfigFromString(this.customConfig.trim() || "{}"); + const result = loadConfigFromString(this.customConfig.trim() || "{}"); - this.kubeContexts.replace(getContexts(config)); + if (!result.isOk) { + this.errors.push(result.error.toString()); + } else { + const contexts = getContexts(result.value); - if (error) { - this.errors.push(error.toString()); + this.kubeContexts.replace(contexts); + + if (contexts.size === 0) { + this.errors.push('No contexts defined, either missing the "contexts" field, or it is empty.'); + } } - if (config.contexts.length === 0) { - this.errors.push('No contexts defined, either missing the "contexts" field, or it is empty.'); - } }), 500); - addClusters = action(async () => { + addClusters = () => { this.isWaiting = true; this.props.emitAppEvent({ name: "cluster-add", action: "click" }); - try { - const absPath = this.props.getCustomKubeConfigDirectory(uuid.v4()); + void (async () => { + try { + const absPath = this.props.getCustomKubeConfigDirectory(uuid.v4()); - await fse.ensureDir(this.props.getDirnameOfPath(absPath)); - await fse.writeFile(absPath, this.customConfig.trim(), { encoding: "utf-8", mode: 0o600 }); + await fse.ensureDir(this.props.getDirnameOfPath(absPath)); + await fse.writeFile(absPath, this.customConfig.trim(), { encoding: "utf-8", mode: 0o600 }); - this.props.showSuccessNotification(`Successfully added ${this.kubeContexts.size} new cluster(s)`); + this.props.showSuccessNotification(`Successfully added ${this.kubeContexts.size} new cluster(s)`); - return this.props.navigateToCatalog(); - } catch (error) { - this.props.showErrorNotification(`Failed to add clusters: ${error}`); - } - }); + return this.props.navigateToCatalog(); + } catch (error) { + this.props.showErrorNotification(`Failed to add clusters: ${String(error)}`); + } + })(); + }; render() { return ( diff --git a/packages/core/src/renderer/components/add-remove-buttons/add-remove-buttons.tsx b/packages/core/src/renderer/components/add-remove-buttons/add-remove-buttons.tsx index b243f64e6d..99056d0794 100644 --- a/packages/core/src/renderer/components/add-remove-buttons/add-remove-buttons.tsx +++ b/packages/core/src/renderer/components/add-remove-buttons/add-remove-buttons.tsx @@ -11,7 +11,7 @@ import { cssNames } from "@k8slens/utilities"; import { Button } from "@k8slens/button"; import { Icon } from "@k8slens/icon"; -export interface AddRemoveButtonsProps extends React.HTMLAttributes { +export interface AddRemoveButtonsProps extends React.HTMLAttributes { onAdd?: () => void; onRemove?: () => void; addTooltip?: StrictReactNode; diff --git a/packages/core/src/renderer/components/catalog/catalog-add-button.tsx b/packages/core/src/renderer/components/catalog/catalog-add-button.tsx index 0bc96ff5ee..1ef38c4f10 100644 --- a/packages/core/src/renderer/components/catalog/catalog-add-button.tsx +++ b/packages/core/src/renderer/components/catalog/catalog-add-button.tsx @@ -8,7 +8,7 @@ import React from "react"; import { SpeedDial, SpeedDialAction } from "@material-ui/lab"; import { Icon } from "@k8slens/icon"; import { observer } from "mobx-react"; -import { observable, makeObservable, action } from "mobx"; +import { observable, action } from "mobx"; import type { CatalogCategory, CatalogEntityAddMenu } from "../../api/catalog-entity"; import { EventEmitter } from "events"; import type { CatalogCategoryRegistry } from "../../../common/catalog"; @@ -16,7 +16,6 @@ import { withInjectables } from "@ogre-tools/injectable-react"; import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable"; import type { Navigate } from "../../navigation/navigate.injectable"; import navigateInjectable from "../../navigation/navigate.injectable"; -import autoBindReact from "auto-bind/react"; export interface CatalogAddButtonProps { category: CatalogCategory; @@ -31,14 +30,8 @@ interface Dependencies { @observer class NonInjectedCatalogAddButton extends React.Component { - @observable protected isOpen = false; - @observable menuItems = new Map(); - - constructor(props: CatalogAddButtonProps & Dependencies) { - super(props); - makeObservable(this); - autoBindReact(this); - } + protected readonly isOpen = observable.box(false); + readonly menuItems = observable.map(); componentDidMount() { this.updateMenuItems(); @@ -54,8 +47,7 @@ class NonInjectedCatalogAddButton extends React.Component { this.menuItems.clear(); if (this.props.category) { @@ -64,7 +56,7 @@ class NonInjectedCatalogAddButton extends React.Component { if (category instanceof EventEmitter) { @@ -82,20 +74,20 @@ class NonInjectedCatalogAddButton extends React.Component { + this.isOpen.set(true); + }); - onClose() { - this.isOpen = false; - } + onClose = action(() => { + this.isOpen.set(false); + }); - onButtonClick() { + onButtonClick = () => { const defaultAction = this.items.find(item => item.defaultAction)?.onClick; const clickAction = defaultAction || (this.items.length === 1 ? this.items[0].onClick : null); - clickAction?.(); - } + void clickAction?.(); + }; get items() { const { category } = this.props; @@ -113,7 +105,7 @@ class NonInjectedCatalogAddButton extends React.Component} @@ -128,7 +120,7 @@ class NonInjectedCatalogAddButton extends React.Component { evt.stopPropagation(); - menuItem.onClick(); + void menuItem.onClick(); }} TooltipClasses={{ popper: "catalogSpeedDialPopper", diff --git a/packages/core/src/renderer/components/catalog/catalog-entity-store.injectable.ts b/packages/core/src/renderer/components/catalog/catalog-entity-store.injectable.ts index a6dd9b701c..97b34e19b5 100644 --- a/packages/core/src/renderer/components/catalog/catalog-entity-store.injectable.ts +++ b/packages/core/src/renderer/components/catalog/catalog-entity-store.injectable.ts @@ -57,7 +57,9 @@ const catalogEntityStoreInjectable = getInjectable({ reaction(() => entities.get(), loadAll), reaction(() => activeCategory.get(), loadAll, { delay: 100 }), ), - onRun: entity => catalogEntityRegistry.onRun(entity), + onRun: entity => { + void catalogEntityRegistry.onRun(entity); + }, failedLoading: false, getTotalCount: () => entities.get().length, isLoaded: true, diff --git a/packages/core/src/renderer/components/catalog/catalog.tsx b/packages/core/src/renderer/components/catalog/catalog.tsx index 6739d3541a..785d17d38b 100644 --- a/packages/core/src/renderer/components/catalog/catalog.tsx +++ b/packages/core/src/renderer/components/catalog/catalog.tsx @@ -98,7 +98,7 @@ class NonInjectedCatalog extends React.Component { return catalogPreviousActiveTabStorage.get() || browseCatalogTab; } - async componentDidMount() { + componentDidMount() { const { catalogEntityStore, catalogPreviousActiveTabStorage, @@ -109,30 +109,32 @@ class NonInjectedCatalog extends React.Component { disposeOnUnmount(this, [ catalogEntityStore.watch(), - reaction(() => this.routeActiveTab, async (routeTab) => { + reaction(() => this.routeActiveTab, (routeTab) => { catalogPreviousActiveTabStorage.set(this.routeActiveTab); - try { - if (routeTab !== browseCatalogTab) { - // we need to wait because extensions might take a while to load - await when(() => Boolean(catalogCategoryRegistry.filteredItems.find(i => i.getId() === routeTab)), { timeout: 5_000 }); + void (async () => { + try { + if (routeTab !== browseCatalogTab) { + // we need to wait because extensions might take a while to load + await when(() => Boolean(catalogCategoryRegistry.filteredItems.find(i => i.getId() === routeTab)), { timeout: 5_000 }); + } + + const item = catalogCategoryRegistry.filteredItems.find(i => i.getId() === routeTab); + + runInAction(() => { + this.activeTab = routeTab; + catalogEntityStore.activeCategory.set(item); + }); + } catch (error) { + logger.warn("Failed to find route tab", error); + showErrorNotification(( +

+ {"Unknown category: "} + {routeTab} +

+ )); } - - const item = catalogCategoryRegistry.filteredItems.find(i => i.getId() === routeTab); - - runInAction(() => { - this.activeTab = routeTab; - catalogEntityStore.activeCategory.set(item); - }); - } catch (error) { - logger.warn("Failed to find route tab", error); - showErrorNotification(( -

- {"Unknown category: "} - {routeTab} -

- )); - } + })(); }, { fireImmediately: true }), // If active category is filtered out, automatically switch to the first category reaction(() => [...catalogCategoryRegistry.filteredItems], (categories) => { diff --git a/packages/core/src/renderer/components/catalog/columns/render-named-category-column-cell.injectable.tsx b/packages/core/src/renderer/components/catalog/columns/render-named-category-column-cell.injectable.tsx index 0abec71f0c..e26c5ae00b 100644 --- a/packages/core/src/renderer/components/catalog/columns/render-named-category-column-cell.injectable.tsx +++ b/packages/core/src/renderer/components/catalog/columns/render-named-category-column-cell.injectable.tsx @@ -10,6 +10,7 @@ import { Avatar } from "../../avatar"; import type { RegisteredAdditionalCategoryColumn } from "../custom-category-columns"; import { Icon } from "@k8slens/icon"; import { prevDefault } from "@k8slens/utilities"; +import type { KubernetesCluster } from "../../../../common/catalog-entities"; const renderNamedCategoryColumnCellInjectable = getInjectable({ id: "render-named-category-column-cell", @@ -35,12 +36,12 @@ const renderNamedCategoryColumnCellInjectable = getInjectable({ - {entity.spec.icon?.material && } + {(entity as KubernetesCluster).spec.icon?.material && } {entity.getName()} catalogEntityRegistry.onRun(entity)} + onRun={() => void catalogEntityRegistry.onRun(entity)} /> ); }); diff --git a/packages/core/src/renderer/components/catalog/entity-details/on-catalog-click.injectable.ts b/packages/core/src/renderer/components/catalog/entity-details/on-catalog-click.injectable.ts index bae2121f57..011346b66d 100644 --- a/packages/core/src/renderer/components/catalog/entity-details/on-catalog-click.injectable.ts +++ b/packages/core/src/renderer/components/catalog/entity-details/on-catalog-click.injectable.ts @@ -20,7 +20,7 @@ const onCatalogEntityListClickInjectable = getInjectable({ if (selectedCatalogEntityParam.get() === entity.getId()) { selectedCatalogEntityParam.clear(); } else if (selectedCatalogEntityParam.get() === undefined) { - catalogEntityRegistry.onRun(entity); + void catalogEntityRegistry.onRun(entity); } else { selectedCatalogEntityParam.set(entity.getId()); } diff --git a/packages/core/src/renderer/components/catalog/entity-details/view.tsx b/packages/core/src/renderer/components/catalog/entity-details/view.tsx index e2b52c5331..61bb72e965 100644 --- a/packages/core/src/renderer/components/catalog/entity-details/view.tsx +++ b/packages/core/src/renderer/components/catalog/entity-details/view.tsx @@ -19,6 +19,7 @@ import isDevelopmentInjectable from "../../../../common/vars/is-development.inje import type { IComputedValue } from "mobx"; import type { CatalogEntityDetailsComponent } from "./token"; import catalogEntityDetailItemsInjectable from "./detail-items.injectable"; +import type { KubernetesCluster } from "../../../../common/catalog-entities"; export interface CatalogEntityDetailsProps { entity: Entity; @@ -54,13 +55,13 @@ class NonInjectedCatalogEntityDetails extends Comp title={entity.getName()} colorHash={`${entity.getName()}-${entity.getSource()}`} size={128} - src={entity.spec.icon?.src} + src={(entity as KubernetesCluster).spec.icon?.src} data-testid="detail-panel-hot-bar-icon" - background={entity.spec.icon?.background} + background={(entity as KubernetesCluster).spec.icon?.background} onClick={onRun} className={styles.avatar} > - {entity.spec.icon?.material && } + {(entity as KubernetesCluster).spec.icon?.material && } {entity.isEnabled() && (
diff --git a/packages/core/src/renderer/components/catalog/get-label-badges.injectable.tsx b/packages/core/src/renderer/components/catalog/get-label-badges.injectable.tsx index b7168734f1..4be1260cee 100644 --- a/packages/core/src/renderer/components/catalog/get-label-badges.injectable.tsx +++ b/packages/core/src/renderer/components/catalog/get-label-badges.injectable.tsx @@ -7,10 +7,10 @@ import React from "react"; import { getInjectable } from "@ogre-tools/injectable"; import type { CatalogEntity } from "../../api/catalog-entity"; import searchUrlPageParamInjectable from "../input/search-url-page-param.injectable"; -import { KubeObject } from "@k8slens/kube-object"; +import { stringifyLabels } from "@k8slens/kube-object"; import { Badge } from "../badge"; -export type GetLabelBadges = (entity: CatalogEntity, onClick?: (evt: React.MouseEvent) => void) => JSX.Element[]; +export type GetLabelBadges = (entity: CatalogEntity, onClick?: (evt: React.MouseEvent) => void) => JSX.Element[]; const getLabelBadgesInjectable = getInjectable({ id: "get-label-badges", @@ -18,7 +18,7 @@ const getLabelBadgesInjectable = getInjectable({ const searchUrlParam = di.inject(searchUrlPageParamInjectable); return (entity, onClick) => ( - KubeObject.stringifyLabels(entity.metadata.labels) + stringifyLabels(entity.metadata.labels) .map(label => ( { + void name; + const { textColorPrimary, borderFaintColor, chartStripesColor } = activeTheme.get().colors; const { datasets: rawDatasets = [], ...rest } = data; const datasets = rawDatasets @@ -99,7 +101,7 @@ const NonInjectedBarChart = observer(({ displayFormats: { minute: "x", }, - parser: timestamp => moment.unix(parseInt(timestamp)), + parser: (timestamp: unknown) => moment.unix(parseInt(String(timestamp))), }, }], yAxes: [{ diff --git a/packages/core/src/renderer/components/chart/chart.tsx b/packages/core/src/renderer/components/chart/chart.tsx index 27ab820a19..08c3808772 100644 --- a/packages/core/src/renderer/components/chart/chart.tsx +++ b/packages/core/src/renderer/components/chart/chart.tsx @@ -106,7 +106,7 @@ export class Chart extends React.Component { if (!this.chart) return; - this.chart.options = ChartJS.helpers.configMerge(this.chart.options, options); + this.chart.options = (ChartJS.helpers.configMerge as (...options: (ChartJS.ChartOptions | undefined)[]) => ChartJS.ChartOptions)(this.chart.options, options); this.memoizeDataProps(); @@ -141,6 +141,8 @@ export class Chart extends React.Component { // Merge other fields const { data: _data, ...props } = next; + void _data; + datasets[index] = { ...datasets[index], ...props, diff --git a/packages/core/src/renderer/components/chart/options.ts b/packages/core/src/renderer/components/chart/options.ts index 24a6dc5fd4..db38e4d679 100644 --- a/packages/core/src/renderer/components/chart/options.ts +++ b/packages/core/src/renderer/components/chart/options.ts @@ -36,10 +36,10 @@ const memoryLikeOptions: ChartOptions = { return ""; } - const { label, data } = datasets[datasetIndex]; + const { label = "", data } = datasets[datasetIndex]; if (!data) { - return label ?? ""; + return label; } const value = data[index] as { y: number }; @@ -78,10 +78,10 @@ export const metricTabOptions: Record = { return ""; } - const { label, data } = datasets[datasetIndex]; + const { label = "", data } = datasets[datasetIndex]; if (!data) { - return label ?? ""; + return label; } const value = data[index] as ChartPoint; @@ -106,15 +106,15 @@ export const metricTabOptions: Record = { return ""; } - const { label, data } = datasets[datasetIndex]; + const { label = "", data } = datasets[datasetIndex]; if (!data) { - return label ?? ""; + return label; } const value = data[index] as ChartPoint; - return `${label}: ${value.y}`; + return `${label}: ${String(value.y)}`; }, }, }, @@ -134,10 +134,10 @@ export const metricTabOptions: Record = { return ""; } - const { label, data } = datasets[datasetIndex]; + const { label = "", data } = datasets[datasetIndex]; if (!data) { - return label ?? ""; + return label; } const value = data[index] as { y: string }; diff --git a/packages/core/src/renderer/components/chart/pie-chart.tsx b/packages/core/src/renderer/components/chart/pie-chart.tsx index 9db4bca62f..c2d3f355a7 100644 --- a/packages/core/src/renderer/components/chart/pie-chart.tsx +++ b/packages/core/src/renderer/components/chart/pie-chart.tsx @@ -16,8 +16,7 @@ import { withInjectables } from "@ogre-tools/injectable-react"; import type { IComputedValue } from "mobx"; import activeThemeInjectable from "../../themes/active.injectable"; -export interface PieChartProps extends ChartProps { -} +export type PieChartProps = ChartProps; export interface PieChartData extends ChartJS.ChartData { datasets?: PieChartDataSets[]; @@ -73,7 +72,7 @@ const NonInjectedPieChart = observer(({ return tooltipLabelCustomizer ? tooltipLabelCustomizer(percentLabel) - : `${dataset.label}: ${percentLabel}`; + : `${dataset.label ?? ""}: ${percentLabel}`; }, }, filter: ({ datasetIndex, index }, { datasets = [] }) => { @@ -118,6 +117,6 @@ export const PieChart = withInjectables(NonInjected }), }); -ChartJS.Tooltip.positioners.cursor = function (elements: any, position: { x: number; y: number }) { +ChartJS.Tooltip.positioners.cursor = function (elements: unknown, position: { x: number; y: number }) { return position; }; diff --git a/packages/core/src/renderer/components/chart/zebra-stripes.plugin.ts b/packages/core/src/renderer/components/chart/zebra-stripes.plugin.ts index 020429530f..c13a38d563 100644 --- a/packages/core/src/renderer/components/chart/zebra-stripes.plugin.ts +++ b/packages/core/src/renderer/components/chart/zebra-stripes.plugin.ts @@ -30,7 +30,7 @@ export class ZebraStripesPlugin implements PluginServiceRegistrationOptions { } getOptions(chart: ChartJS): ZebraStripesOptions | undefined { - return chart.options.plugins?.ZebraStripes; + return chart.options.plugins?.ZebraStripes as ZebraStripesOptions; } getLastUpdate(chart: ChartJS) { diff --git a/packages/core/src/renderer/components/cluster-manager/cluster-frame-handler.ts b/packages/core/src/renderer/components/cluster-manager/cluster-frame-handler.ts index f07a4ec2d2..3cc165deff 100644 --- a/packages/core/src/renderer/components/cluster-manager/cluster-frame-handler.ts +++ b/packages/core/src/renderer/components/cluster-manager/cluster-frame-handler.ts @@ -34,8 +34,7 @@ export class ClusterFrameHandler { return Boolean(this.views.get(clusterId)?.isLoaded); } - @action - public initView(clusterId: ClusterId) { + public initView = action((clusterId: ClusterId) => { const cluster = this.dependencies.getClusterById(clusterId); if (!cluster) { @@ -102,7 +101,7 @@ export class ClusterFrameHandler { ); }, ); - } + }); private prevVisibleClusterChange?: Disposer; @@ -110,7 +109,7 @@ export class ClusterFrameHandler { // Clear the previous when ASAP this.prevVisibleClusterChange?.(); - this.dependencies.logger.info(`[LENS-VIEW]: refreshing iframe views, visible cluster id=${clusterId}`); + this.dependencies.logger.info(`[LENS-VIEW]: refreshing iframe views, visible cluster id=${String(clusterId)}`); this.dependencies.emitClusterVisibility(null); for (const { frame: view } of this.views.values()) { diff --git a/packages/core/src/renderer/components/cluster-manager/cluster-status.tsx b/packages/core/src/renderer/components/cluster-manager/cluster-status.tsx index e72d4872c2..3791812fa1 100644 --- a/packages/core/src/renderer/components/cluster-manager/cluster-status.tsx +++ b/packages/core/src/renderer/components/cluster-manager/cluster-status.tsx @@ -143,7 +143,7 @@ class NonInjectedClusterStatus extends React.Component void this.reconnect()} waiting={this.isReconnecting} /> { bindEvents() { disposeOnUnmount(this, [ - reaction(() => this.clusterId, async (clusterId) => { + reaction(() => this.clusterId, (clusterId) => { // TODO: replace with better handling if (!this.clusterId) { return; @@ -86,7 +86,7 @@ class NonInjectedClusterView extends React.Component { this.props.clusterFrames.setVisibleCluster(clusterId); this.props.clusterFrames.initView(clusterId); - this.props.requestClusterActivation({ clusterId }); + void this.props.requestClusterActivation({ clusterId }); this.props.entityRegistry.activeEntity = clusterId; }, { fireImmediately: true, diff --git a/packages/core/src/renderer/components/cluster-settings/__tests__/cluster-local-terminal-settings.test.tsx b/packages/core/src/renderer/components/cluster-settings/__tests__/cluster-local-terminal-settings.test.tsx index 7abaf8ac15..7451bba047 100644 --- a/packages/core/src/renderer/components/cluster-settings/__tests__/cluster-local-terminal-settings.test.tsx +++ b/packages/core/src/renderer/components/cluster-settings/__tests__/cluster-local-terminal-settings.test.tsx @@ -47,7 +47,7 @@ describe("ClusterLocalTerminalSettings", () => { getContextObject: () => ({}), })); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some/path", @@ -67,7 +67,7 @@ describe("ClusterLocalTerminalSettings", () => { getContextObject: () => ({ namespace: "blat" }), })); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some/path", @@ -87,7 +87,7 @@ describe("ClusterLocalTerminalSettings", () => { getContextObject: () => ({}), })); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some/path", @@ -107,7 +107,7 @@ describe("ClusterLocalTerminalSettings", () => { }); it("should save the new CWD if path is a directory", async () => { - statMock.mockImplementation(async (path) => { + statMock.mockImplementation((path) => { expect(path).toBe("/foobar"); return { @@ -119,7 +119,7 @@ describe("ClusterLocalTerminalSettings", () => { getContextObject: () => ({}), })); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some/path", @@ -136,7 +136,7 @@ describe("ClusterLocalTerminalSettings", () => { }); it("should not save the new CWD if path is a file", async () => { - statMock.mockImplementation(async (path) => { + statMock.mockImplementation((path) => { expect(path).toBe("/foobar"); return { @@ -149,7 +149,7 @@ describe("ClusterLocalTerminalSettings", () => { getContextObject: () => ({}), })); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some/path", diff --git a/packages/core/src/renderer/components/cluster-settings/__tests__/icon-settings.test.tsx b/packages/core/src/renderer/components/cluster-settings/__tests__/icon-settings.test.tsx index 4c88f34503..5f200c34c7 100644 --- a/packages/core/src/renderer/components/cluster-settings/__tests__/icon-settings.test.tsx +++ b/packages/core/src/renderer/components/cluster-settings/__tests__/icon-settings.test.tsx @@ -62,7 +62,7 @@ describe("Icon settings", () => { di = getDiForUnitTesting(); const render = renderFor(di); - const cluster = new Cluster({ + const cluster = Cluster.createForTestingOnly({ contextName: "some-context", id: "some-id", kubeConfigPath: "/some/path/to/kubeconfig", @@ -128,7 +128,7 @@ describe("Icon settings", () => { expect(rendered.baseElement).toMatchSnapshot(); }); - it("does not have any external components", async () => { + it("does not have any external components", () => { expect(rendered.queryByTestId("test-react-component")).not.toBeInTheDocument(); }); }); @@ -140,11 +140,11 @@ describe("Icon settings", () => { }); }); - it("renders external component", async () => { + it("renders external component", () => { expect(rendered.queryByTestId("my-react-component")).toBeInTheDocument(); }); - it("external component has cluster preferences in props", async () => { + it("external component has cluster preferences in props", () => { expect(rendered.getByText(/some-cluster-name/)).toBeInTheDocument(); }); }); diff --git a/packages/core/src/renderer/components/cluster-settings/icon-settings.tsx b/packages/core/src/renderer/components/cluster-settings/icon-settings.tsx index a802807c17..1f862fbb49 100644 --- a/packages/core/src/renderer/components/cluster-settings/icon-settings.tsx +++ b/packages/core/src/renderer/components/cluster-settings/icon-settings.tsx @@ -35,18 +35,21 @@ const NonInjectedClusterIconSetting = observer((props: ClusterIconSettingProps & const { cluster, entity } = props; const menuId = `menu-actions-for-cluster-icon-settings-for-${entity.getId()}`; - const onIconPick = async ([file]: File[]) => { + const onIconPick = ([file]: File[]) => { if (!file) { return; } - try { - const buf = Buffer.from(await file.arrayBuffer()); + void (async () => { + try { + const buf = Buffer.from(await file.arrayBuffer()); + + cluster.preferences.icon = `data:${file.type};base64,${buf.toString("base64")}`; + } catch (e) { + props.showErrorNotification(String(e)); + } + })(); - cluster.preferences.icon = `data:${file.type};base64,${buf.toString("base64")}`; - } catch (e) { - props.showErrorNotification(String(e)); - } }; const onUploadClick = () => { @@ -64,7 +67,7 @@ const NonInjectedClusterIconSetting = observer((props: ClusterIconSettingProps & accept="image/*" label={( (NonInjectedClusterIconSetting, { getProps: (di, props) => { const computedInjectMany = di.inject(computedInjectManyInjectable); - + return { ...props, menuItems: computedInjectMany(clusterIconSettingsMenuInjectionToken), diff --git a/packages/core/src/renderer/components/cluster-settings/local-terminal-setting-presenter.injectable.ts b/packages/core/src/renderer/components/cluster-settings/local-terminal-setting-presenter.injectable.ts index caa5021dac..ccfbd1ecad 100644 --- a/packages/core/src/renderer/components/cluster-settings/local-terminal-setting-presenter.injectable.ts +++ b/packages/core/src/renderer/components/cluster-settings/local-terminal-setting-presenter.injectable.ts @@ -24,11 +24,16 @@ const localTerminalSettingPresenterInjectable = getInjectable({ instantiate: async (di, cluster: Cluster): Promise => { const loadKubeconfig = di.inject(loadKubeconfigInjectable, cluster); - const kubeconfig = await loadKubeconfig(); + const result = await loadKubeconfig(); + if (result.isOk === false) { + throw result.error; + } + + const kubeConfig = result.value; const directory = observable.box(cluster.preferences.terminalCWD || ""); const defaultNamespace = observable.box(cluster.preferences.defaultNamespace || ""); - const placeholderDefaultNamespace = kubeconfig.getContextObject(cluster.contextName.get())?.namespace || "default"; + const placeholderDefaultNamespace = kubeConfig.getContextObject(cluster.contextName.get())?.namespace || "default"; return { directory: { diff --git a/packages/core/src/renderer/components/cluster-settings/local-terminal-settings.tsx b/packages/core/src/renderer/components/cluster-settings/local-terminal-settings.tsx index 0548a7c3a3..d98a31ba93 100644 --- a/packages/core/src/renderer/components/cluster-settings/local-terminal-settings.tsx +++ b/packages/core/src/renderer/components/cluster-settings/local-terminal-settings.tsx @@ -59,7 +59,7 @@ const NonInjectedClusterLocalTerminalSetting = observer((props: Dependencies & C const dir = resolveTilde(directory); const result = await validateDirectory(dir); - if (result.callWasSuccessful) { + if (result.isOk) { runInAction(() => { cluster.preferences.terminalCWD = dir; presenter.directory.set(dir); @@ -85,11 +85,11 @@ const NonInjectedClusterLocalTerminalSetting = observer((props: Dependencies & C const setAndCommitDirectory = (newPath: string) => { presenter.directory.set(newPath); - commitDirectory(newPath); + void commitDirectory(newPath); }; const openFilePicker = () => { - openPathPickingDialog({ + void openPathPickingDialog({ message: "Choose Working Directory", buttonLabel: "Pick", properties: ["openDirectory", "showHiddenFiles"], @@ -106,7 +106,7 @@ const NonInjectedClusterLocalTerminalSetting = observer((props: Dependencies & C value={presenter.directory.get()} data-testid="working-directory" onChange={value => presenter.directory.set(value)} - onBlur={() => commitDirectory(presenter.directory.get())} + onBlur={() => void commitDirectory(presenter.directory.get())} placeholder={isWindows ? "$USERPROFILE" : "$HOME"} iconRight={( <> diff --git a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx index 4a1d7b5b66..98a3cf929a 100644 --- a/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx +++ b/packages/core/src/renderer/components/cluster-settings/prometheus-setting.tsx @@ -16,6 +16,7 @@ import type { MetricProviderInfo, RequestMetricsProviders } from "../../../commo import { withInjectables } from "@ogre-tools/injectable-react"; import requestMetricsProvidersInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-providers.injectable"; import productNameInjectable from "../../../common/vars/product-name.injectable"; +import { noop } from "@k8slens/utilities"; export interface ClusterPrometheusSettingProps { cluster: Cluster; @@ -90,7 +91,8 @@ class NonInjectedClusterPrometheusSetting extends React.Component { this.loading = false; this.loadedOptions.replace(values.map(provider => [provider.id, provider])); - }); + }) + .catch(noop); } parsePrometheusPath = () => { diff --git a/packages/core/src/renderer/components/cluster/store.injectable.ts b/packages/core/src/renderer/components/cluster/store.injectable.ts index cf0ce6888b..073a7ae9b8 100644 --- a/packages/core/src/renderer/components/cluster/store.injectable.ts +++ b/packages/core/src/renderer/components/cluster/store.injectable.ts @@ -2,17 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; - import { ClusterStore } from "./store"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import clusterApiInjectable from "../../../common/k8s-api/endpoints/cluster.api.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import assert from "assert"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; -const clusterStoreInjectable = getInjectable({ +const clusterStoreInjectable = getKubeStoreInjectable({ id: "cluster-store", instantiate: (di) => { @@ -24,7 +22,6 @@ const clusterStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, clusterApi); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default clusterStoreInjectable; diff --git a/packages/core/src/renderer/components/command-palette/command-container.tsx b/packages/core/src/renderer/components/command-palette/command-container.tsx index bc8f38141b..1b284a8919 100644 --- a/packages/core/src/renderer/components/command-palette/command-container.tsx +++ b/packages/core/src/renderer/components/command-palette/command-container.tsx @@ -15,17 +15,14 @@ import commandOverlayInjectable from "./command-overlay.injectable"; import type { ipcRendererOn } from "../../../common/ipc"; import { broadcastMessage } from "../../../common/ipc"; import { withInjectables } from "@ogre-tools/injectable-react"; -import type { AddWindowEventListener } from "../../window/event-listener.injectable"; -import windowAddEventListenerInjectable from "../../window/event-listener.injectable"; import type { IComputedValue } from "mobx"; import matchedClusterIdInjectable from "../../navigation/matched-cluster-id.injectable"; import hostedClusterIdInjectable from "../../cluster-frame-context/hosted-cluster-id.injectable"; import isMacInjectable from "../../../common/vars/is-mac.injectable"; import legacyOnChannelListenInjectable from "../../ipc/legacy-channel-listen.injectable"; -import { onKeyboardShortcut } from "@k8slens/utilities"; +import { addWindowEventListener, onKeyboardShortcut } from "@k8slens/utilities"; interface Dependencies { - addWindowEventListener: AddWindowEventListener; commandOverlay: CommandOverlay; clusterId: ClusterId | undefined; matchedClusterId: IComputedValue; @@ -36,7 +33,7 @@ interface Dependencies { @observer class NonInjectedCommandContainer extends React.Component { componentDidMount() { - const { clusterId, addWindowEventListener, commandOverlay, matchedClusterId, isMac } = this.props; + const { clusterId, commandOverlay, matchedClusterId, isMac } = this.props; const action = clusterId ? () => commandOverlay.open() @@ -44,7 +41,7 @@ class NonInjectedCommandContainer extends React.Component { const matchedId = matchedClusterId.get(); if (matchedId) { - broadcastMessage(`command-palette:${matchedClusterId}:open`); + void broadcastMessage(`command-palette:${matchedId}:open`); } else { commandOverlay.open(); } @@ -92,7 +89,6 @@ export const CommandContainer = withInjectables(NonInjectedCommand getProps: (di, props) => ({ ...props, clusterId: di.inject(hostedClusterIdInjectable), - addWindowEventListener: di.inject(windowAddEventListenerInjectable), commandOverlay: di.inject(commandOverlayInjectable), matchedClusterId: di.inject(matchedClusterIdInjectable), isMac: di.inject(isMacInjectable), diff --git a/packages/core/src/renderer/components/command-palette/command-dialog.tsx b/packages/core/src/renderer/components/command-palette/command-dialog.tsx index 7a4a44651f..bea757d8f2 100644 --- a/packages/core/src/renderer/components/command-palette/command-dialog.tsx +++ b/packages/core/src/renderer/components/command-palette/command-dialog.tsx @@ -56,7 +56,7 @@ const NonInjectedCommandDialog = observer(({ const { forceRootFrame = false } = opts; if (forceRootFrame) { - broadcastMessage(IpcRendererNavigationEvents.NAVIGATE_IN_APP, url); + void broadcastMessage(IpcRendererNavigationEvents.NAVIGATE_IN_APP, url); } else { navigate(url); } diff --git a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.test.tsx b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.test.tsx index 5b1865c692..8e7d31fdc7 100644 --- a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.test.tsx +++ b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.test.tsx @@ -7,6 +7,7 @@ import React from "react"; import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import { Cluster } from "../../../common/cluster/cluster"; +import type { HorizontalPodAutoscalerMetricSpec } from "@k8slens/kube-object"; import { HorizontalPodAutoscaler } from "@k8slens/kube-object"; import hostedClusterInjectable from "../../cluster-frame-context/hosted-cluster.injectable"; import { getDiForUnitTesting } from "../../getDiForUnitTesting"; @@ -50,7 +51,7 @@ describe("", () => { di.override(directoryForUserDataInjectable, () => "/some-user-store-path"); di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", @@ -353,7 +354,6 @@ describe("", () => { spec: { ...hpaV2.spec, metrics: [ - // @ts-ignore { resource: { name: "cpu", @@ -362,7 +362,7 @@ describe("", () => { averageUtilization: 50, }, }, - }, + } as HorizontalPodAutoscalerMetricSpec, ], }, }, @@ -383,7 +383,6 @@ describe("", () => { ...hpaV2.spec, metrics: [ { - // @ts-ignore type: "Unusual", resource: { name: "cpu", @@ -392,7 +391,7 @@ describe("", () => { averageUtilization: 50, }, }, - }, + } as unknown as HorizontalPodAutoscalerMetricSpec, ], }, }, diff --git a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.tsx b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.tsx index 372dce684a..4333441078 100644 --- a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.tsx +++ b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/details.tsx @@ -25,9 +25,6 @@ import { loggerInjectionToken } from "@k8slens/logger"; import getHorizontalPodAutoscalerMetrics from "./get-metrics.injectable"; import { getMetricName } from "./get-metric-name"; -export interface HpaDetailsProps extends KubeObjectDetailsProps { -} - interface Dependencies { apiManager: ApiManager; logger: Logger; @@ -36,13 +33,13 @@ interface Dependencies { } @observer -class NonInjectedHorizontalPodAutoscalerDetails extends React.Component { - private renderTargetLink(target: HorizontalPodAutoscalerMetricTarget | undefined) { +class NonInjectedHorizontalPodAutoscalerDetails extends React.Component { + private renderTargetLink(hpa: HorizontalPodAutoscaler, target: HorizontalPodAutoscalerMetricTarget | undefined) { if (!target) { return null; } - const { object: hpa, apiManager, getDetailsUrl } = this.props; + const { apiManager, getDetailsUrl } = this.props; const { kind, name } = target; const objectUrl = getDetailsUrl(apiManager.lookupApiLink(target, hpa)); @@ -56,9 +53,7 @@ class NonInjectedHorizontalPodAutoscalerDetails extends React.Component { const metricName = getMetricName(metric); @@ -79,7 +74,7 @@ class NonInjectedHorizontalPodAutoscalerDetails extends React.Component {metricName} {" "} - {this.renderTargetLink(metric.object?.describedObject)} + {this.renderTargetLink(hpa, metric.object?.describedObject)} ); } @@ -168,7 +163,7 @@ class NonInjectedHorizontalPodAutoscalerDetails extends React.Component Metrics
- {this.renderMetrics()} + {this.renderMetrics(hpa)}
)} @@ -177,7 +172,7 @@ class NonInjectedHorizontalPodAutoscalerDetails extends React.Component(NonInjectedHorizontalPodAutoscalerDetails, { +export const HorizontalPodAutoscalerDetails = withInjectables(NonInjectedHorizontalPodAutoscalerDetails, { getProps: (di, props) => ({ ...props, apiManager: di.inject(apiManagerInjectable), diff --git a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/store.injectable.ts b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/store.injectable.ts index 5298ad27dd..ce6d3d7ccd 100644 --- a/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/store.injectable.ts +++ b/packages/core/src/renderer/components/config-horizontal-pod-autoscalers/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import horizontalPodAutoscalerApiInjectable from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { HorizontalPodAutoscalerStore } from "./store"; -const horizontalPodAutoscalerStoreInjectable = getInjectable({ +const horizontalPodAutoscalerStoreInjectable = getKubeStoreInjectable({ id: "horizontal-pod-autoscaler-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "horizontalPodAutoscalerStore is only available in certain environments"); @@ -23,7 +22,6 @@ const horizontalPodAutoscalerStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default horizontalPodAutoscalerStoreInjectable; diff --git a/packages/core/src/renderer/components/config-leases/lease-details.tsx b/packages/core/src/renderer/components/config-leases/lease-details.tsx index 1a943df617..714d8428bb 100644 --- a/packages/core/src/renderer/components/config-leases/lease-details.tsx +++ b/packages/core/src/renderer/components/config-leases/lease-details.tsx @@ -9,17 +9,18 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { Lease } from "@k8slens/kube-object"; - -export interface LeaseDetailsProps extends KubeObjectDetailsProps { -} +import { Lease } from "@k8slens/kube-object"; @observer -export class LeaseDetails extends React.Component { +export class LeaseDetails extends React.Component { render() { const { object: lease } = this.props; + if (!(lease instanceof Lease)) { + return null; + } + return (
diff --git a/packages/core/src/renderer/components/config-leases/leases.tsx b/packages/core/src/renderer/components/config-leases/leases.tsx index f9ac5259bb..81397aab26 100644 --- a/packages/core/src/renderer/components/config-leases/leases.tsx +++ b/packages/core/src/renderer/components/config-leases/leases.tsx @@ -25,8 +25,7 @@ enum columnId { age = "age", } -export interface LeaseProps extends KubeObjectDetailsProps { -} +export type LeaseProps = KubeObjectDetailsProps; interface Dependencies { leaseStore: LeaseStore; diff --git a/packages/core/src/renderer/components/config-leases/store.injectable.ts b/packages/core/src/renderer/components/config-leases/store.injectable.ts index 7d6fc96d4a..940354a526 100644 --- a/packages/core/src/renderer/components/config-leases/store.injectable.ts +++ b/packages/core/src/renderer/components/config-leases/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import leaseApiInjectable from "../../../common/k8s-api/endpoints/lease.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { LeaseStore } from "./store"; -const leaseStoreInjectable = getInjectable({ +const leaseStoreInjectable = getKubeStoreInjectable({ id: "lease-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "leaseStore is only available in certain environments"); @@ -23,7 +22,6 @@ const leaseStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default leaseStoreInjectable; diff --git a/packages/core/src/renderer/components/config-limit-ranges/limit-range-details.tsx b/packages/core/src/renderer/components/config-limit-ranges/limit-range-details.tsx index b906b34a83..c092ce7a73 100644 --- a/packages/core/src/renderer/components/config-limit-ranges/limit-range-details.tsx +++ b/packages/core/src/renderer/components/config-limit-ranges/limit-range-details.tsx @@ -16,9 +16,6 @@ import type { Logger } from "@k8slens/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; import { loggerInjectionToken } from "@k8slens/logger"; -export interface LimitRangeDetailsProps extends KubeObjectDetailsProps { -} - function renderLimit(limit: LimitRangeItem, part: LimitPart, resource: Resource) { const resourceLimit = limit[part]?.[resource]; @@ -58,7 +55,7 @@ interface Dependencies { } @observer -class NonInjectedLimitRangeDetails extends React.Component { +class NonInjectedLimitRangeDetails extends React.Component { render() { const { object: limitRange, logger } = this.props; @@ -104,7 +101,7 @@ class NonInjectedLimitRangeDetails extends React.Component(NonInjectedLimitRangeDetails, { +export const LimitRangeDetails = withInjectables(NonInjectedLimitRangeDetails, { getProps: (di, props) => ({ ...props, logger: di.inject(loggerInjectionToken), diff --git a/packages/core/src/renderer/components/config-limit-ranges/store.injectable.ts b/packages/core/src/renderer/components/config-limit-ranges/store.injectable.ts index ea7ec9ef4e..e3e81ce087 100644 --- a/packages/core/src/renderer/components/config-limit-ranges/store.injectable.ts +++ b/packages/core/src/renderer/components/config-limit-ranges/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import limitRangeApiInjectable from "../../../common/k8s-api/endpoints/limit-range.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { LimitRangeStore } from "./store"; -const limitRangeStoreInjectable = getInjectable({ +const limitRangeStoreInjectable = getKubeStoreInjectable({ id: "limit-range-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "limitRangeStore is only available in certain environments"); @@ -23,7 +22,6 @@ const limitRangeStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default limitRangeStoreInjectable; diff --git a/packages/core/src/renderer/components/config-maps/config-map-details.tsx b/packages/core/src/renderer/components/config-maps/config-map-details.tsx index b97738e813..2a691c3cae 100644 --- a/packages/core/src/renderer/components/config-maps/config-map-details.tsx +++ b/packages/core/src/renderer/components/config-maps/config-map-details.tsx @@ -22,9 +22,6 @@ import showErrorNotificationInjectable from "../notifications/show-error-notific import { loggerInjectionToken } from "@k8slens/logger"; import { MonacoEditor } from "../monaco-editor"; -export interface ConfigMapDetailsProps extends KubeObjectDetailsProps { -} - interface Dependencies { configMapStore: ConfigMapStore; logger: Logger; @@ -33,11 +30,11 @@ interface Dependencies { } @observer -class NonInjectedConfigMapDetails extends React.Component { +class NonInjectedConfigMapDetails extends React.Component { @observable isSaving = false; @observable data = observable.map(); - constructor(props: ConfigMapDetailsProps & Dependencies) { + constructor(props: KubeObjectDetailsProps & Dependencies) { super(props); makeObservable(this); } @@ -45,7 +42,7 @@ class NonInjectedConfigMapDetails extends React.Component { - const { object: configMap } = this.props; + const configMap = this.props.object as ConfigMap; if (configMap) { this.data.replace(configMap.data); // refresh @@ -54,8 +51,8 @@ class NonInjectedConfigMapDetails extends React.Component { - const { object: configMap, configMapStore } = this.props; + save = (configMap: ConfigMap) => { + const { configMapStore } = this.props; void (async () => { try { @@ -129,7 +126,7 @@ class NonInjectedConfigMapDetails extends React.Component this.save(configMap)} /> ) @@ -139,7 +136,7 @@ class NonInjectedConfigMapDetails extends React.Component(NonInjectedConfigMapDetails, { +export const ConfigMapDetails = withInjectables(NonInjectedConfigMapDetails, { getProps: (di, props) => ({ ...props, configMapStore: di.inject(configMapStoreInjectable), diff --git a/packages/core/src/renderer/components/config-maps/store.injectable.ts b/packages/core/src/renderer/components/config-maps/store.injectable.ts index aae6da809d..34c59fa82f 100644 --- a/packages/core/src/renderer/components/config-maps/store.injectable.ts +++ b/packages/core/src/renderer/components/config-maps/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import configMapApiInjectable from "../../../common/k8s-api/endpoints/config-map.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { ConfigMapStore } from "./store"; -const configMapStoreInjectable = getInjectable({ +const configMapStoreInjectable = getKubeStoreInjectable({ id: "config-map-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "configMapStore is only available in certain environments"); @@ -23,7 +22,6 @@ const configMapStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default configMapStoreInjectable; diff --git a/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configuration-store.injectable.ts b/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configuration-store.injectable.ts index 3767ec8b2f..b911f5e5ee 100644 --- a/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configuration-store.injectable.ts +++ b/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configuration-store.injectable.ts @@ -2,15 +2,13 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import { MutatingWebhookConfigurationStore } from "./mutating-webhook-configuration-store"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; -import mutatingWebhookConfigurationApiInjectable - from "../../../common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable"; +import mutatingWebhookConfigurationApiInjectable from "../../../common/k8s-api/endpoints/mutating-webhook-configuration-api.injectable"; -const mutatingWebhookConfigurationStoreInjectable = getInjectable({ +const mutatingWebhookConfigurationStoreInjectable = getKubeStoreInjectable({ id: "mutating-webhook-configuration-store", instantiate: (di) => { const api = di.inject(mutatingWebhookConfigurationApiInjectable); @@ -20,7 +18,6 @@ const mutatingWebhookConfigurationStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default mutatingWebhookConfigurationStoreInjectable; diff --git a/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configurations-details.tsx b/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configurations-details.tsx index 5d871ba147..e9e2eac8c5 100644 --- a/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configurations-details.tsx +++ b/packages/core/src/renderer/components/config-mutating-webhook-configurations/mutating-webhook-configurations-details.tsx @@ -6,17 +6,18 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { MutatingWebhookConfiguration } from "@k8slens/kube-object"; +import { MutatingWebhookConfiguration } from "@k8slens/kube-object"; import { WebhookConfig } from "./webhook-config"; -export interface MutatingWebhookDetailsProps extends KubeObjectDetailsProps { -} - @observer -export class MutatingWebhookDetails extends React.Component { +export class MutatingWebhookDetails extends React.Component { render() { const { object: webhookConfig } = this.props; + if (!(webhookConfig instanceof MutatingWebhookConfiguration)) { + return null; + } + return (
diff --git a/packages/core/src/renderer/components/config-pod-disruption-budgets/__tests__/pod-distruption-budgets.test.tsx b/packages/core/src/renderer/components/config-pod-disruption-budgets/__tests__/pod-distruption-budgets.test.tsx index c423962e68..29e8f00a46 100644 --- a/packages/core/src/renderer/components/config-pod-disruption-budgets/__tests__/pod-distruption-budgets.test.tsx +++ b/packages/core/src/renderer/components/config-pod-disruption-budgets/__tests__/pod-distruption-budgets.test.tsx @@ -10,14 +10,13 @@ import { renderFor } from "../../test-utils/renderFor"; import { PodDisruptionBudgets } from "../pod-disruption-budgets"; import storesAndApisCanBeCreatedInjectable from "../../../stores-apis-can-be-created.injectable"; import selectedNamespacesStorageInjectable from "../../../../features/namespace-filtering/renderer/storage.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import maybeKubeApiInjectable from "../../../../common/k8s-api/maybe-kube-api.injectable"; import podDisruptionBudgetStoreInjectable from "../store.injectable"; -import siblingTabsInjectable from "../../../routes/sibling-tabs.injectable"; import { Cluster } from "../../../../common/cluster/cluster"; import hostedClusterInjectable from "../../../cluster-frame-context/hosted-cluster.injectable"; -import userPreferencesStateInjectable from "../../../../features/user-preferences/common/state.injectable"; import type { DiContainer } from "@ogre-tools/injectable"; +import type { PodDisruptionBudgetStore } from "../store"; +import type { PodDisruptionBudgetApi } from "@k8slens/kube-api"; +import type { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store"; describe("", () => { let di: DiContainer; @@ -38,19 +37,19 @@ describe("", () => { const getPodDisruptionBudgetStoreInjectableMock = (pdb: PodDisruptionBudget) => ({ api: { kind: "PodDisruptionBudget", - }, + } as PodDisruptionBudgetApi, getByPath: () => pdb, getTotalCount: () => 1, contextItems: [pdb], - pickOnlySelected: (items: any[]) => items, + pickOnlySelected: (items) => items, isSelectedAll: () => false, isSelected: () => true, - }) as any; + }) as Partial as (PodDisruptionBudgetStore & KubeObjectStore); beforeEach(() => { di = getDiForUnitTesting(); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", @@ -58,16 +57,6 @@ describe("", () => { di.override(storesAndApisCanBeCreatedInjectable, () => true); di.override(selectedNamespacesStorageInjectable, () => ({ get: () => ({}), - }) as any); - di.override(loggerInjectionToken, () => null); - di.override(maybeKubeApiInjectable, () => (() => null) as any); - di.override(siblingTabsInjectable, () => ({ get: () => [] } as any)); - di.override(userPreferencesStateInjectable, () => ({ - hiddenTableColumns: { - get: () => ({ - has: () => false, - }), - } as any, })); }); diff --git a/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets-details.tsx b/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets-details.tsx index 5fb5b20085..79af5a0289 100644 --- a/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets-details.tsx +++ b/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets-details.tsx @@ -10,18 +10,19 @@ import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import { Badge } from "../badge"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { PodDisruptionBudget } from "@k8slens/kube-object"; +import { PodDisruptionBudget } from "@k8slens/kube-object"; -export interface PodDisruptionBudgetDetailsProps extends KubeObjectDetailsProps { -} - -export const PodDisruptionBudgetDetails = observer((props: PodDisruptionBudgetDetailsProps) => { +export const PodDisruptionBudgetDetails = observer((props: KubeObjectDetailsProps) => { const { object: pdb } = props; if (!pdb) { return null; } + if (!(pdb instanceof PodDisruptionBudget)) { + return null; + } + const selectors = pdb.getSelectors(); return ( diff --git a/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets.tsx b/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets.tsx index e48f757ede..c281f45f67 100644 --- a/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets.tsx +++ b/packages/core/src/renderer/components/config-pod-disruption-budgets/pod-disruption-budgets.tsx @@ -28,8 +28,7 @@ enum columnId { age = "age", } -export interface PodDisruptionBudgetsProps extends KubeObjectDetailsProps { -} +export type PodDisruptionBudgetsProps = KubeObjectDetailsProps; interface Dependencies { podDisruptionBudgetStore: PodDisruptionBudgetStore; diff --git a/packages/core/src/renderer/components/config-pod-disruption-budgets/store.injectable.ts b/packages/core/src/renderer/components/config-pod-disruption-budgets/store.injectable.ts index 860a44a9ba..d8de50069e 100644 --- a/packages/core/src/renderer/components/config-pod-disruption-budgets/store.injectable.ts +++ b/packages/core/src/renderer/components/config-pod-disruption-budgets/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import podDisruptionBudgetApiInjectable from "../../../common/k8s-api/endpoints/pod-disruption-budget.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { PodDisruptionBudgetStore } from "./store"; -const podDisruptionBudgetStoreInjectable = getInjectable({ +const podDisruptionBudgetStoreInjectable = getKubeStoreInjectable({ id: "pod-disruption-budget-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "podDisruptionBudgetStore is only available in certain environments"); @@ -23,7 +22,6 @@ const podDisruptionBudgetStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default podDisruptionBudgetStoreInjectable; diff --git a/packages/core/src/renderer/components/config-priority-classes/priority-classes-details.tsx b/packages/core/src/renderer/components/config-priority-classes/priority-classes-details.tsx index 4836365987..2cba36d01d 100644 --- a/packages/core/src/renderer/components/config-priority-classes/priority-classes-details.tsx +++ b/packages/core/src/renderer/components/config-priority-classes/priority-classes-details.tsx @@ -9,17 +9,21 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { PriorityClass } from "@k8slens/kube-object"; - -export interface PriorityClassesDetailsProps extends KubeObjectDetailsProps { -} +import { PriorityClass } from "@k8slens/kube-object"; @observer -export class PriorityClassesDetails extends React.Component { - +export class PriorityClassesDetails extends React.Component { render() { const { object: pc } = this.props; + if (!pc) { + return null; + } + + if (!(pc instanceof PriorityClass)) { + return null; + } + return (
@@ -33,7 +37,6 @@ export class PriorityClassesDetails extends React.Component {pc.getGlobalDefault()} -
); } diff --git a/packages/core/src/renderer/components/config-priority-classes/priority-classes.tsx b/packages/core/src/renderer/components/config-priority-classes/priority-classes.tsx index f167d6b06e..fbef6fa631 100644 --- a/packages/core/src/renderer/components/config-priority-classes/priority-classes.tsx +++ b/packages/core/src/renderer/components/config-priority-classes/priority-classes.tsx @@ -25,8 +25,7 @@ enum columnId { age = "age", } -export interface PriorityClassesProps extends KubeObjectDetailsProps { -} +export type PriorityClassesProps = KubeObjectDetailsProps; interface Dependencies { priorityClassStore: PriorityClassStore; diff --git a/packages/core/src/renderer/components/config-priority-classes/store.injectable.ts b/packages/core/src/renderer/components/config-priority-classes/store.injectable.ts index c7f06f0d4f..50919cf6a2 100644 --- a/packages/core/src/renderer/components/config-priority-classes/store.injectable.ts +++ b/packages/core/src/renderer/components/config-priority-classes/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import priorityClassApiInjectable from "../../../common/k8s-api/endpoints/priority-class.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForClusterScopedResourcesInjectable from "../../cluster-frame-context/for-cluster-scoped-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { PriorityClassStore } from "./store"; -const priorityClassStoreInjectable = getInjectable({ +const priorityClassStoreInjectable = getKubeStoreInjectable({ id: "priority-class-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "priorityClassStore is only available in certain environments"); @@ -23,7 +22,6 @@ const priorityClassStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default priorityClassStoreInjectable; diff --git a/packages/core/src/renderer/components/config-resource-quotas/add-dialog/view.tsx b/packages/core/src/renderer/components/config-resource-quotas/add-dialog/view.tsx index b656f70ed0..f668b01ef8 100644 --- a/packages/core/src/renderer/components/config-resource-quotas/add-dialog/view.tsx +++ b/packages/core/src/renderer/components/config-resource-quotas/add-dialog/view.tsx @@ -28,8 +28,7 @@ import resourceQuotaApiInjectable from "../../../../common/k8s-api/endpoints/res import type { ShowCheckedErrorNotification } from "../../notifications/show-checked-error.injectable"; import showCheckedErrorNotificationInjectable from "../../notifications/show-checked-error.injectable"; -export interface AddQuotaDialogProps extends DialogProps { -} +export type AddQuotaDialogProps = DialogProps; interface Dependencies { resourceQuotaApi: ResourceQuotaApi; diff --git a/packages/core/src/renderer/components/config-resource-quotas/resource-quota-details.tsx b/packages/core/src/renderer/components/config-resource-quotas/resource-quota-details.tsx index c4b4ecd2f7..14bed797bf 100644 --- a/packages/core/src/renderer/components/config-resource-quotas/resource-quota-details.tsx +++ b/packages/core/src/renderer/components/config-resource-quotas/resource-quota-details.tsx @@ -17,9 +17,6 @@ import type { Logger } from "@k8slens/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; import { loggerInjectionToken } from "@k8slens/logger"; -export interface ResourceQuotaDetailsProps extends KubeObjectDetailsProps { -} - function transformUnit(name: string, value: string): number | undefined { if (name.includes("memory") || name.includes("storage")) { return unitsToBytes(value); @@ -82,7 +79,7 @@ interface Dependencies { } @observer -class NonInjectedResourceQuotaDetails extends React.Component { +class NonInjectedResourceQuotaDetails extends React.Component { render() { const { object: quota } = this.props; @@ -132,7 +129,7 @@ class NonInjectedResourceQuotaDetails extends React.Component(NonInjectedResourceQuotaDetails, { +export const ResourceQuotaDetails = withInjectables(NonInjectedResourceQuotaDetails, { getProps: (di, props) => ({ ...props, logger: di.inject(loggerInjectionToken), diff --git a/packages/core/src/renderer/components/config-resource-quotas/store.injectable.ts b/packages/core/src/renderer/components/config-resource-quotas/store.injectable.ts index 7cee0bf257..a4fabbca40 100644 --- a/packages/core/src/renderer/components/config-resource-quotas/store.injectable.ts +++ b/packages/core/src/renderer/components/config-resource-quotas/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import resourceQuotaApiInjectable from "../../../common/k8s-api/endpoints/resource-quota.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { ResourceQuotaStore } from "./store"; -const resourceQuotaStoreInjectable = getInjectable({ +const resourceQuotaStoreInjectable = getKubeStoreInjectable({ id: "resource-quota-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "resourceQuotaStore is only available in certain environments"); @@ -23,7 +22,6 @@ const resourceQuotaStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default resourceQuotaStoreInjectable; diff --git a/packages/core/src/renderer/components/config-runtime-classes/runtime-classes-details.tsx b/packages/core/src/renderer/components/config-runtime-classes/runtime-classes-details.tsx index 3d791a559d..b5358e03aa 100644 --- a/packages/core/src/renderer/components/config-runtime-classes/runtime-classes-details.tsx +++ b/packages/core/src/renderer/components/config-runtime-classes/runtime-classes-details.tsx @@ -9,18 +9,24 @@ import React from "react"; import { observer } from "mobx-react"; import { DrawerItem } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { RuntimeClass } from "@k8slens/kube-object"; +import { RuntimeClass } from "@k8slens/kube-object"; import { Badge } from "../badge"; import { RuntimeClassDetailsTolerations } from "./runtime-classes-details-tolerations"; -export interface RuntimeClassesDetailsProps extends KubeObjectDetailsProps { -} - @observer -export class RuntimeClassesDetails extends React.Component { +export class RuntimeClassesDetails extends React.Component { render() { const { object: rc } = this.props; + + if (!rc) { + return null; + } + + if (!(rc instanceof RuntimeClass)) { + return null; + } + const nodeSelector = rc.getNodeSelectors(); return ( diff --git a/packages/core/src/renderer/components/config-runtime-classes/runtime-classes.tsx b/packages/core/src/renderer/components/config-runtime-classes/runtime-classes.tsx index e3cc559195..ba3ca9b984 100644 --- a/packages/core/src/renderer/components/config-runtime-classes/runtime-classes.tsx +++ b/packages/core/src/renderer/components/config-runtime-classes/runtime-classes.tsx @@ -24,8 +24,7 @@ enum columnId { age = "age", } -export interface RuntimeClassesProps extends KubeObjectDetailsProps { -} +export type RuntimeClassesProps = KubeObjectDetailsProps; interface Dependencies { runtimeClassStore: RuntimeClassStore; diff --git a/packages/core/src/renderer/components/config-runtime-classes/store.injectable.ts b/packages/core/src/renderer/components/config-runtime-classes/store.injectable.ts index afe686eccb..34c4e8ab10 100644 --- a/packages/core/src/renderer/components/config-runtime-classes/store.injectable.ts +++ b/packages/core/src/renderer/components/config-runtime-classes/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import runtimeClassApiInjectable from "../../../common/k8s-api/endpoints/runtime-class.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForClusterScopedResourcesInjectable from "../../cluster-frame-context/for-cluster-scoped-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { RuntimeClassStore } from "./store"; -const runtimeClassStoreInjectable = getInjectable({ +const runtimeClassStoreInjectable = getKubeStoreInjectable({ id: "runtime-class-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "runtimeClassStore is only available in certain environments"); @@ -23,7 +22,6 @@ const runtimeClassStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default runtimeClassStoreInjectable; diff --git a/packages/core/src/renderer/components/config-secrets/__tests__/secret-details.test.tsx b/packages/core/src/renderer/components/config-secrets/__tests__/secret-details.test.tsx index 82e184820f..98ecebe698 100644 --- a/packages/core/src/renderer/components/config-secrets/__tests__/secret-details.test.tsx +++ b/packages/core/src/renderer/components/config-secrets/__tests__/secret-details.test.tsx @@ -27,7 +27,7 @@ describe("SecretDetails tests", () => { di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); di.override(storesAndApisCanBeCreatedInjectable, () => true); - di.override(hostedClusterInjectable, () => new Cluster({ + di.override(hostedClusterInjectable, () => Cluster.createForTestingOnly({ contextName: "some-context-name", id: "some-cluster-id", kubeConfigPath: "/some-path-to-a-kubeconfig", diff --git a/packages/core/src/renderer/components/config-secrets/add-dialog/view.tsx b/packages/core/src/renderer/components/config-secrets/add-dialog/view.tsx index db46d2b597..ab4e86ad57 100644 --- a/packages/core/src/renderer/components/config-secrets/add-dialog/view.tsx +++ b/packages/core/src/renderer/components/config-secrets/add-dialog/view.tsx @@ -31,8 +31,7 @@ import isAddSecretDialogOpenInjectable from "./is-open.injectable"; import type { ShowCheckedErrorNotification } from "../../notifications/show-checked-error.injectable"; import showCheckedErrorNotificationInjectable from "../../notifications/show-checked-error.injectable"; -export interface AddSecretDialogProps extends Partial { -} +export type AddSecretDialogProps = Partial; interface SecretTemplateField { key: string; diff --git a/packages/core/src/renderer/components/config-secrets/secret-details.tsx b/packages/core/src/renderer/components/config-secrets/secret-details.tsx index 398488f65a..ab86122a06 100644 --- a/packages/core/src/renderer/components/config-secrets/secret-details.tsx +++ b/packages/core/src/renderer/components/config-secrets/secret-details.tsx @@ -25,9 +25,6 @@ import showSuccessNotificationInjectable from "../notifications/show-success-not import type { ShowCheckedErrorNotification } from "../notifications/show-checked-error.injectable"; import showCheckedErrorNotificationInjectable from "../notifications/show-checked-error.injectable"; -export interface SecretDetailsProps extends KubeObjectDetailsProps { -} - interface Dependencies { secretStore: SecretStore; logger: Logger; @@ -36,12 +33,12 @@ interface Dependencies { } @observer -class NonInjectedSecretDetails extends React.Component { +class NonInjectedSecretDetails extends React.Component { @observable isSaving = false; @observable data: Partial> = {}; @observable revealSecret = observable.set(); - constructor(props: SecretDetailsProps & Dependencies) { + constructor(props: KubeObjectDetailsProps & Dependencies) { super(props); makeObservable(this); } @@ -49,7 +46,7 @@ class NonInjectedSecretDetails extends React.Component { - const { object: secret } = this.props; + const secret = this.props.object as Secret; if (secret) { this.data = secret.data; @@ -59,9 +56,7 @@ class NonInjectedSecretDetails extends React.Component { - const { object: secret } = this.props; - + saveSecret = (secret: Secret) => { void (async () => { this.isSaving = true; @@ -125,7 +120,7 @@ class NonInjectedSecretDetails extends React.Component this.saveSecret(secret)} /> ); @@ -165,13 +160,13 @@ class NonInjectedSecretDetails extends React.Component {secret.type}
- {this.renderData()} + {this.renderData(secret)}
); } } -export const SecretDetails = withInjectables(NonInjectedSecretDetails, { +export const SecretDetails = withInjectables(NonInjectedSecretDetails, { getProps: (di, props) => ({ ...props, logger: di.inject(loggerInjectionToken), diff --git a/packages/core/src/renderer/components/config-secrets/store.injectable.ts b/packages/core/src/renderer/components/config-secrets/store.injectable.ts index 5fbbda1c95..6255b84051 100644 --- a/packages/core/src/renderer/components/config-secrets/store.injectable.ts +++ b/packages/core/src/renderer/components/config-secrets/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import secretApiInjectable from "../../../common/k8s-api/endpoints/secret.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { SecretStore } from "./store"; -const secretStoreInjectable = getInjectable({ +const secretStoreInjectable = getKubeStoreInjectable({ id: "secret-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "secretStore is only available in certain environments"); @@ -23,7 +22,6 @@ const secretStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default secretStoreInjectable; diff --git a/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configuration-store.injectable.ts b/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configuration-store.injectable.ts index bcb89907e6..38d03a4eaf 100644 --- a/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configuration-store.injectable.ts +++ b/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configuration-store.injectable.ts @@ -2,15 +2,14 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import { ValidatingWebhookConfigurationStore } from "./validating-webhook-configuration-store"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import validatingWebhookConfigurationApiInjectable from "../../../common/k8s-api/endpoints/validating-webhook-configuration-api.injectable"; -const validatingWebhookConfigurationStoreInjectable = getInjectable({ +const validatingWebhookConfigurationStoreInjectable = getKubeStoreInjectable({ id: "validating-webhook-configuration-store", instantiate: (di) => { const api = di.inject(validatingWebhookConfigurationApiInjectable); @@ -20,7 +19,6 @@ const validatingWebhookConfigurationStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default validatingWebhookConfigurationStoreInjectable; diff --git a/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configurations-details.tsx b/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configurations-details.tsx index 63c83161ed..ab80845f29 100644 --- a/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configurations-details.tsx +++ b/packages/core/src/renderer/components/config-validating-webhook-configurations/validating-webhook-configurations-details.tsx @@ -7,16 +7,21 @@ import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import { WebhookConfig } from "../config-mutating-webhook-configurations/webhook-config"; -import type { ValidatingWebhookConfiguration } from "@k8slens/kube-object"; - -export interface ValidatingWebhookProps extends KubeObjectDetailsProps { -} +import { ValidatingWebhookConfiguration } from "@k8slens/kube-object"; @observer -export class ValidatingWebhookDetails extends React.Component { +export class ValidatingWebhookDetails extends React.Component { render() { const { object: webhookConfig } = this.props; + if (!webhookConfig) { + return null; + } + + if (!(webhookConfig instanceof ValidatingWebhookConfiguration)) { + return null; + } + return (
@@ -29,7 +34,7 @@ export class ValidatingWebhookDetails extends React.Component ( ))} -
+
); } } diff --git a/packages/core/src/renderer/components/config-vertical-pod-autoscalers/store.injectable.ts b/packages/core/src/renderer/components/config-vertical-pod-autoscalers/store.injectable.ts index 03962b9bc9..56d9e3e3c3 100644 --- a/packages/core/src/renderer/components/config-vertical-pod-autoscalers/store.injectable.ts +++ b/packages/core/src/renderer/components/config-vertical-pod-autoscalers/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import { loggerInjectionToken } from "@k8slens/logger"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import verticalPodAutoscalerApiInjectable from "../../../common/k8s-api/endpoints/vertical-pod-autoscaler.api.injectable"; import clusterFrameContextForNamespacedResourcesInjectable from "../../cluster-frame-context/for-namespaced-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { VerticalPodAutoscalerStore } from "./store"; -const verticalPodAutoscalerStoreInjectable = getInjectable({ +const verticalPodAutoscalerStoreInjectable = getKubeStoreInjectable({ id: "vertical-pod-autoscaler-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "verticalPodAutoscalerStore is only available in certain environments"); @@ -23,7 +22,6 @@ const verticalPodAutoscalerStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default verticalPodAutoscalerStoreInjectable; diff --git a/packages/core/src/renderer/components/config-vertical-pod-autoscalers/vpa-details.tsx b/packages/core/src/renderer/components/config-vertical-pod-autoscalers/vpa-details.tsx index 5be321960a..75783cb8b8 100644 --- a/packages/core/src/renderer/components/config-vertical-pod-autoscalers/vpa-details.tsx +++ b/packages/core/src/renderer/components/config-vertical-pod-autoscalers/vpa-details.tsx @@ -23,9 +23,6 @@ import { withInjectables } from "@ogre-tools/injectable-react"; import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; import getDetailsUrlInjectable from "../kube-detail-params/get-details-url.injectable"; -export interface VpaDetailsProps extends KubeObjectDetailsProps { -} - interface Dependencies { apiManager: ApiManager; getDetailsUrl: GetDetailsUrl; @@ -33,11 +30,8 @@ interface Dependencies { } @observer -class NonInjectedVpaDetails extends React.Component { - renderStatus(status: VerticalPodAutoscalerStatus) { - const { recommendation } = status; - const { object: vpa } = this.props; - +class NonInjectedVpaDetails extends React.Component { + renderStatus(vpa: VerticalPodAutoscaler, { recommendation }: VerticalPodAutoscalerStatus) { return (
Status @@ -59,7 +53,7 @@ class NonInjectedVpaDetails extends React.Component ( + .map(({ containerName, target, lowerBound, upperBound, uncappedTarget }) => (
{`Container Recommendation for ${containerName ?? ""}`} @@ -198,7 +192,7 @@ class NonInjectedVpaDetails extends React.Component - {vpa.status && this.renderStatus(vpa.status)} + {vpa.status && this.renderStatus(vpa, vpa.status)} {updatePolicy && this.renderUpdatePolicy(updatePolicy)} {resourcePolicy && this.renderResourcePolicy(resourcePolicy)} @@ -208,7 +202,7 @@ class NonInjectedVpaDetails extends React.Component(NonInjectedVpaDetails, { +export const VpaDetails = withInjectables(NonInjectedVpaDetails, { getProps: (di, props) => ({ ...props, apiManager: di.inject(apiManagerInjectable), diff --git a/packages/core/src/renderer/components/confirm-dialog/confirm-dialog.tsx b/packages/core/src/renderer/components/confirm-dialog/confirm-dialog.tsx index 17b91bab4d..7a59e1ffa2 100644 --- a/packages/core/src/renderer/components/confirm-dialog/confirm-dialog.tsx +++ b/packages/core/src/renderer/components/confirm-dialog/confirm-dialog.tsx @@ -10,7 +10,7 @@ import type { IObservableValue } from "mobx"; import { observable, makeObservable, computed } from "mobx"; import { observer } from "mobx-react"; import type { StrictReactNode } from "@k8slens/utilities"; -import { cssNames, noop, prevDefault } from "@k8slens/utilities"; +import { cssNames, prevDefault } from "@k8slens/utilities"; import type { ButtonProps } from "@k8slens/button"; import { Button } from "@k8slens/button"; import type { DialogProps } from "../dialog"; @@ -21,12 +21,11 @@ import { withInjectables } from "@ogre-tools/injectable-react"; import confirmDialogStateInjectable from "./state.injectable"; import showErrorNotificationInjectable from "../notifications/show-error-notification.injectable"; -export interface ConfirmDialogProps extends Partial { -} +export type ConfirmDialogProps = Partial; export interface ConfirmDialogParams extends ConfirmDialogBooleanParams { - ok?: () => any | Promise; - cancel?: () => any | Promise; + ok?: () => unknown | Promise; + cancel?: () => unknown | Promise; } export interface ConfirmDialogBooleanParams { @@ -44,8 +43,8 @@ interface Dependencies { } const defaultParams = { - ok: noop, - cancel: noop, + ok: (() => {}) as NonNullable, + cancel: (() => {}) as NonNullable, labelOk: "Ok", labelCancel: "Cancel", icon: , @@ -68,7 +67,7 @@ class NonInjectedConfirmDialog extends React.Component { try { this.isSaving = true; - await (async () => this.params.ok())(); + await (async () => await this.params.ok())(); } catch (error) { this.props.showErrorNotification( <> @@ -94,28 +93,30 @@ class NonInjectedConfirmDialog extends React.Component { - try { - await Promise.resolve(this.params.cancel()); - } catch (error) { - this.props.showErrorNotification( - <> -

Cancelling action failed:

-

- {( - error instanceof Error - ? error.message - : typeof error === "string" - ? error - : "Unknown error occurred while cancelling" - )} -

- , - ); - } finally { - this.isSaving = false; - this.props.state.set(undefined); - } + close = () => { + void (async () => { + try { + await Promise.resolve(this.params.cancel()); + } catch (error) { + this.props.showErrorNotification(( + <> +

Cancelling action failed:

+

+ {( + error instanceof Error + ? error.message + : typeof error === "string" + ? error + : "Unknown error occurred while cancelling" + )} +

+ + )); + } finally { + this.isSaving = false; + this.props.state.set(undefined); + } + })(); }; render() { diff --git a/packages/core/src/renderer/components/custom-resource-definitions/details.tsx b/packages/core/src/renderer/components/custom-resource-definitions/details.tsx index f9efa63b18..d27c04b61a 100644 --- a/packages/core/src/renderer/components/custom-resource-definitions/details.tsx +++ b/packages/core/src/renderer/components/custom-resource-definitions/details.tsx @@ -19,15 +19,12 @@ import type { Logger } from "@k8slens/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; import { loggerInjectionToken } from "@k8slens/logger"; -export interface CustomResourceDefinitionDetailsProps extends KubeObjectDetailsProps { -} - interface Dependencies { logger: Logger; } @observer -class NonInjectedCustomResourceDefinitionDetails extends React.Component { +class NonInjectedCustomResourceDefinitionDetails extends React.Component { render() { const { object: crd } = this.props; @@ -159,7 +156,7 @@ class NonInjectedCustomResourceDefinitionDetails extends React.Component(NonInjectedCustomResourceDefinitionDetails, { +export const CustomResourceDefinitionDetails = withInjectables(NonInjectedCustomResourceDefinitionDetails, { getProps: (di, props) => ({ ...props, logger: di.inject(loggerInjectionToken), diff --git a/packages/core/src/renderer/components/custom-resource-definitions/store.injectable.ts b/packages/core/src/renderer/components/custom-resource-definitions/store.injectable.ts index fe956beb9d..ff3fd9346d 100644 --- a/packages/core/src/renderer/components/custom-resource-definitions/store.injectable.ts +++ b/packages/core/src/renderer/components/custom-resource-definitions/store.injectable.ts @@ -2,16 +2,15 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; -import { kubeObjectStoreInjectionToken } from "../../../common/k8s-api/api-manager/kube-object-store-token"; +import { getKubeStoreInjectable } from "../../../common/k8s-api/api-manager/kube-object-store-token"; import customResourceDefinitionApiInjectable from "../../../common/k8s-api/endpoints/custom-resource-definition.api.injectable"; import { loggerInjectionToken } from "@k8slens/logger"; import clusterFrameContextForClusterScopedResourcesInjectable from "../../cluster-frame-context/for-cluster-scoped-resources.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import { CustomResourceDefinitionStore } from "./store"; -const customResourceDefinitionStoreInjectable = getInjectable({ +const customResourceDefinitionStoreInjectable = getKubeStoreInjectable({ id: "custom-resource-definition-store", instantiate: (di) => { assert(di.inject(storesAndApisCanBeCreatedInjectable), "customResourceDefinitionStore is only available in certain environments"); @@ -23,7 +22,6 @@ const customResourceDefinitionStoreInjectable = getInjectable({ logger: di.inject(loggerInjectionToken), }, api); }, - injectionToken: kubeObjectStoreInjectionToken, }); export default customResourceDefinitionStoreInjectable; diff --git a/packages/core/src/renderer/components/delete-cluster-dialog/save-kubeconfig.global-override-for-injectable.ts b/packages/core/src/renderer/components/delete-cluster-dialog/save-kubeconfig.global-override-for-injectable.ts index 7fce77a2b1..78e42e65de 100644 --- a/packages/core/src/renderer/components/delete-cluster-dialog/save-kubeconfig.global-override-for-injectable.ts +++ b/packages/core/src/renderer/components/delete-cluster-dialog/save-kubeconfig.global-override-for-injectable.ts @@ -6,6 +6,6 @@ import { getGlobalOverride } from "@k8slens/test-utils"; import saveKubeconfigInjectable from "./save-kubeconfig.injectable"; -export default getGlobalOverride(saveKubeconfigInjectable, () => async () => { - throw new Error("tried to save a mondified kubeconfig without override"); -}); +export default getGlobalOverride(saveKubeconfigInjectable, () => () => Promise.reject( + new Error("tried to save a modified kubeconfig without override"), +)); diff --git a/packages/core/src/renderer/components/delete-cluster-dialog/view.tsx b/packages/core/src/renderer/components/delete-cluster-dialog/view.tsx index 0625692777..09ee6e8078 100644 --- a/packages/core/src/renderer/components/delete-cluster-dialog/view.tsx +++ b/packages/core/src/renderer/components/delete-cluster-dialog/view.tsx @@ -68,7 +68,7 @@ class NonInjectedDeleteClusterDialog extends React.Component { this.props.removeEntityFromAllHotbars(cluster.id); await this.props.requestDeleteCluster(cluster.id); } catch(error) { - this.props.showErrorNotification(`Cannot remove cluster, failed to process config file. ${error}`); + this.props.showErrorNotification(`Cannot remove cluster, failed to process config file. ${String(error)}`); } finally { await this.props.requestClearClusterAsDeleting(cluster.id); this.close(); @@ -236,7 +236,7 @@ class NonInjectedDeleteClusterDialog extends React.Component { label="Cancel" />
, diff --git a/packages/core/src/renderer/components/extensions/extensions.tsx b/packages/core/src/renderer/components/extensions/extensions.tsx index dcb6a4b70f..0bf12bcd8d 100644 --- a/packages/core/src/renderer/components/extensions/extensions.tsx +++ b/packages/core/src/renderer/components/extensions/extensions.tsx @@ -45,7 +45,7 @@ interface Dependencies { } const NonInjectedExtensions = ({ installOnDrop }: Dependencies) => ( - + void installOnDrop(files)}> installExtensionFromInput(installPath)} + onSubmit={() => void installExtensionFromInput(installPath)} iconRight={( installExtensionFromInput(installPath)} + onClick={() => void installExtensionFromInput(installPath)} />
diff --git a/packages/core/src/renderer/components/extensions/installed-extensions.tsx b/packages/core/src/renderer/components/extensions/installed-extensions.tsx index ed188dce6e..0cfe5e0c32 100644 --- a/packages/core/src/renderer/components/extensions/installed-extensions.tsx +++ b/packages/core/src/renderer/components/extensions/installed-extensions.tsx @@ -11,7 +11,6 @@ import { MenuActions, MenuItem } from "../menu"; import { Spinner } from "../spinner"; import { cssNames } from "@k8slens/utilities"; import { observer } from "mobx-react"; -import type { Row } from "react-table"; import extensionDiscoveryInjectable from "../../../extensions/extension-discovery/extension-discovery.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; import extensionInstallationStateStoreInjectable from "../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable"; @@ -27,9 +26,6 @@ import enableExtensionInjectable from "./enable-extension.injectable"; import userExtensionsInjectable from "./user-extensions/user-extensions.injectable"; import type { ExtensionDiscovery } from "../../../extensions/extension-discovery/extension-discovery"; -export interface InstalledExtensionsProps { -} - interface Dependencies { extensionDiscovery: ExtensionDiscovery; extensionInstallationStateStore: ExtensionInstallationStateStore; @@ -54,7 +50,7 @@ const NonInjectedInstalledExtensions = observer(({ confirmUninstallExtension, enableExtension, disableExtension, -}: Dependencies & InstalledExtensionsProps) => { +}: Dependencies) => { if (!extensionDiscovery.isLoaded) { return
; } @@ -88,7 +84,7 @@ const NonInjectedInstalledExtensions = observer(({ Header: "Name", accessor: "extension", width: 200, - sortType: (rowA: Row, rowB: Row) => { // Custom sorting for extension name + sortType: (rowA, rowB) => { // Custom sorting for extension name const nameA = extensions[rowA.index].manifest.name; const nameB = extensions[rowB.index].manifest.name; @@ -153,7 +149,7 @@ const NonInjectedInstalledExtensions = observer(({ confirmUninstallExtension(extension)} + onClick={() => void confirmUninstallExtension(extension)} > Uninstall @@ -173,7 +169,7 @@ const NonInjectedInstalledExtensions = observer(({ ); }); -export const InstalledExtensions = withInjectables(NonInjectedInstalledExtensions, { +export const InstalledExtensions = withInjectables(NonInjectedInstalledExtensions, { getProps: (di, props) => ({ ...props, extensionDiscovery: di.inject(extensionDiscoveryInjectable), diff --git a/packages/core/src/renderer/components/extensions/notice.tsx b/packages/core/src/renderer/components/extensions/notice.tsx index af4de297c2..ad84f4de9a 100644 --- a/packages/core/src/renderer/components/extensions/notice.tsx +++ b/packages/core/src/renderer/components/extensions/notice.tsx @@ -8,7 +8,7 @@ import type { DOMAttributes } from "react"; import React from "react"; import { cssNames } from "@k8slens/utilities"; -export interface NoticeProps extends DOMAttributes { +export interface NoticeProps extends DOMAttributes { className?: string; } diff --git a/packages/core/src/renderer/components/extensions/uninstall-extension.injectable.tsx b/packages/core/src/renderer/components/extensions/uninstall-extension.injectable.tsx index 132e13d46c..8a1487fe3e 100644 --- a/packages/core/src/renderer/components/extensions/uninstall-extension.injectable.tsx +++ b/packages/core/src/renderer/components/extensions/uninstall-extension.injectable.tsx @@ -60,7 +60,7 @@ const uninstallExtensionInjectable = getInjectable({ const message = getMessageFromError(error); logger.info( - `[EXTENSION-UNINSTALL]: uninstalling ${displayName} has failed: ${error}`, + `[EXTENSION-UNINSTALL]: uninstalling ${displayName} has failed: ${String(error)}`, { error }, ); showErrorNotification( diff --git a/packages/core/src/renderer/components/file-picker/file-picker.tsx b/packages/core/src/renderer/components/file-picker/file-picker.tsx index 9bc44f1f21..f1305ae4aa 100644 --- a/packages/core/src/renderer/components/file-picker/file-picker.tsx +++ b/packages/core/src/renderer/components/file-picker/file-picker.tsx @@ -82,7 +82,7 @@ const defaultProps = { @observer class DefaultedFilePicker extends React.Component { - static defaultProps = defaultProps as Object; + static defaultProps = defaultProps as object; @observable status = FileInputStatus.CLEAR; @observable errorText?: string; @@ -215,7 +215,7 @@ class DefaultedFilePicker extends React.Component this.handlePickFiles(event.target.files)} + onChange={(event) => void this.handlePickFiles(event.target.files)} /> ); diff --git a/packages/core/src/renderer/components/helm-charts/details/readme-of-selected-helm-chart.injectable.ts b/packages/core/src/renderer/components/helm-charts/details/readme-of-selected-helm-chart.injectable.ts index 8aa61a74da..64fcb9611b 100644 --- a/packages/core/src/renderer/components/helm-charts/details/readme-of-selected-helm-chart.injectable.ts +++ b/packages/core/src/renderer/components/helm-charts/details/readme-of-selected-helm-chart.injectable.ts @@ -32,7 +32,7 @@ const readmeOfSelectedHelmChartInjectable = getInjectable({ chartVersion.getVersion(), ); - return result.callWasSuccessful ? result.response : ""; + return result.isOk ? result.value : ""; }, valueWhenPending: "", diff --git a/packages/core/src/renderer/components/helm-charts/helm-chart-details.tsx b/packages/core/src/renderer/components/helm-charts/helm-chart-details.tsx index ef331a133a..910e7818ee 100644 --- a/packages/core/src/renderer/components/helm-charts/helm-chart-details.tsx +++ b/packages/core/src/renderer/components/helm-charts/helm-chart-details.tsx @@ -56,14 +56,13 @@ class NonInjectedHelmChartDetails extends Component { const chart = this.props.versionSelection.value.get(); assert(chart); - this.props.createInstallChartTab(chart); this.props.hideDetails(); - } + }; renderIntroduction(selectedChart: HelmChart) { const testId = selectedChart.getFullName("-"); diff --git a/packages/core/src/renderer/components/helm-releases/dialog/dialog.tsx b/packages/core/src/renderer/components/helm-releases/dialog/dialog.tsx index 55292b5ef9..0289907669 100644 --- a/packages/core/src/renderer/components/helm-releases/dialog/dialog.tsx +++ b/packages/core/src/renderer/components/helm-releases/dialog/dialog.tsx @@ -24,8 +24,7 @@ import requestHelmReleaseHistoryInjectable from "../../../../common/k8s-api/endp import type { ShowCheckedErrorNotification } from "../../notifications/show-checked-error.injectable"; import showCheckedErrorNotificationInjectable from "../../notifications/show-checked-error.injectable"; -export interface ReleaseRollbackDialogProps extends DialogProps { -} +export type ReleaseRollbackDialogProps = DialogProps; interface Dependencies { rollbackRelease: RollbackRelease; diff --git a/packages/core/src/renderer/components/helm-releases/release-details/release-details-content.tsx b/packages/core/src/renderer/components/helm-releases/release-details/release-details-content.tsx index 9ec1ea7e9a..4824e24bb1 100644 --- a/packages/core/src/renderer/components/helm-releases/release-details/release-details-content.tsx +++ b/packages/core/src/renderer/components/helm-releases/release-details/release-details-content.tsx @@ -167,7 +167,7 @@ const ReleaseValues = observer(({ releaseId, configuration, onlyUserSuppliedValu void onlyUserSuppliedValuesAreShown.toggle()} disabled={configurationIsLoading} data-testid="user-supplied-values-only-checkbox" /> @@ -184,7 +184,7 @@ const ReleaseValues = observer(({ releaseId, configuration, onlyUserSuppliedValu label="Save" waiting={configuration.isSaving.get()} disabled={configurationIsLoading} - onClick={configuration.save} + onClick={() => void configuration.save()} data-testid="helm-release-configuration-save-button" /> diff --git a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/release-details-model.injectable.tsx b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/release-details-model.injectable.tsx index 728ad4bbcb..b287a7c94b 100644 --- a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/release-details-model.injectable.tsx +++ b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/release-details-model.injectable.tsx @@ -138,7 +138,7 @@ export class ReleaseDetailsModel { this.configuration.isSaving.set(false); }); - if (!result.callWasSuccessful) { + if (!result.isOk) { this.dependencies.showCheckedErrorNotification( result.error, "Unknown error occurred while updating release", @@ -181,7 +181,7 @@ export class ReleaseDetailsModel { clusterId: this.dependencies.clusterId, }); - if (!result.callWasSuccessful) { + if (!result.isOk) { runInAction(() => { this.loadingError.set(result.error); }); @@ -190,7 +190,7 @@ export class ReleaseDetailsModel { } runInAction(() => { - this.detailedRelease.set(result.response); + this.detailedRelease.set(result.value); }); await this.loadConfiguration(); diff --git a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts index d1f02f4edd..e9a5aeb0f5 100644 --- a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts +++ b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts @@ -38,20 +38,20 @@ const requestDetailedHelmReleaseInjectable = getInjectable({ if (!release) { return { - callWasSuccessful: false, + isOk: false, error: `Release ${releaseName} didn't exist in ${namespace} namespace.`, }; } - if (!detailsResult.callWasSuccessful) { + if (!detailsResult.isOk) { return detailsResult; } return { - callWasSuccessful: true, - response: { + isOk: true, + value: { release: toHelmRelease(release), - details: detailsResult.response, + details: detailsResult.value, }, }; }; diff --git a/packages/core/src/renderer/components/helm-releases/release-menu.tsx b/packages/core/src/renderer/components/helm-releases/release-menu.tsx index 51a2d903af..4d4d1dc518 100644 --- a/packages/core/src/renderer/components/helm-releases/release-menu.tsx +++ b/packages/core/src/renderer/components/helm-releases/release-menu.tsx @@ -22,7 +22,7 @@ export interface HelmReleaseMenuProps extends MenuActionsProps { } interface Dependencies { - deleteRelease: (release: HelmRelease) => Promise; + deleteRelease: (release: HelmRelease) => Promise; createUpgradeChartTab: (release: HelmRelease) => void; openRollbackDialog: OpenHelmReleaseRollbackDialog; } diff --git a/packages/core/src/renderer/components/helm-releases/removable-releases.ts b/packages/core/src/renderer/components/helm-releases/removable-releases.ts index 0b5692a7d1..eb3455cfa9 100644 --- a/packages/core/src/renderer/components/helm-releases/removable-releases.ts +++ b/packages/core/src/renderer/components/helm-releases/removable-releases.ts @@ -10,7 +10,7 @@ import type { HelmRelease } from "../../../common/k8s-api/endpoints/helm-release interface Dependencies { releases: IAsyncComputed; releaseSelectionStatus: ObservableMap; - deleteRelease: (release: HelmRelease) => Promise; + deleteRelease: (release: HelmRelease) => Promise; } export interface RemovableHelmRelease extends HelmRelease { diff --git a/packages/core/src/renderer/components/hotbar/hotbar-entity-icon.tsx b/packages/core/src/renderer/components/hotbar/hotbar-entity-icon.tsx index 1d61f78a57..0c3077052e 100644 --- a/packages/core/src/renderer/components/hotbar/hotbar-entity-icon.tsx +++ b/packages/core/src/renderer/components/hotbar/hotbar-entity-icon.tsx @@ -15,6 +15,7 @@ import type { IClassName } from "@k8slens/utilities"; import { cssNames } from "@k8slens/utilities"; import { Icon } from "@k8slens/icon"; import { HotbarIcon } from "./hotbar-icon"; +import type { KubernetesCluster } from "../../../common/catalog-entities/kubernetes-cluster"; import { LensKubernetesClusterStatus } from "../../../common/catalog-entities/kubernetes-cluster"; import type { VisitEntityContextMenu } from "../../../common/catalog/visit-entity-context-menu.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; @@ -100,9 +101,9 @@ class NonInjectedHotbarEntityIcon extends React.Component this.onMenuOpen()} diff --git a/packages/core/src/renderer/components/hotbar/hotbar-menu.tsx b/packages/core/src/renderer/components/hotbar/hotbar-menu.tsx index a91e29b82b..50f4d3f104 100644 --- a/packages/core/src/renderer/components/hotbar/hotbar-menu.tsx +++ b/packages/core/src/renderer/components/hotbar/hotbar-menu.tsx @@ -123,7 +123,7 @@ const NonInjectedHotbarMenu = observer((props: Dependencies & HotbarMenuProps) = key={index} index={index} entity={entity} - onClick={() => entityRegistry.onRun(entity)} + onClick={() => void entityRegistry.onRun(entity)} className={cssNames({ isDragging: snapshot.isDragging })} remove={removeItem} add={addItem} @@ -133,7 +133,7 @@ const NonInjectedHotbarMenu = observer((props: Dependencies & HotbarMenuProps) = uid={`hotbar-icon-${item.entity.uid}`} title={item.entity.name} source={item.entity.source ?? "local"} - tooltip={`${item.entity.name} (${item.entity.source})`} + tooltip={`${item.entity.name} (${item.entity.source ?? ""})`} menuItems={[ { title: "Remove from Hotbar", diff --git a/packages/core/src/renderer/components/input/drop-file-input.tsx b/packages/core/src/renderer/components/input/drop-file-input.tsx index 0dd3385be6..199d97a4b9 100644 --- a/packages/core/src/renderer/components/input/drop-file-input.tsx +++ b/packages/core/src/renderer/components/input/drop-file-input.tsx @@ -7,12 +7,11 @@ import "./drop-file-input.scss"; import React from "react"; import type { IClassName } from "@k8slens/utilities"; import { cssNames } from "@k8slens/utilities"; -import { observable, makeObservable } from "mobx"; +import { observable } from "mobx"; import { observer } from "mobx-react"; import type { Logger } from "@k8slens/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; import { loggerInjectionToken } from "@k8slens/logger"; -import autoBindReact from "auto-bind/react"; export interface DropFileInputProps extends React.DOMAttributes { className?: IClassName; @@ -30,47 +29,45 @@ interface Dependencies { @observer class NonInjectedDropFileInput extends React.Component & Dependencies> { - @observable dropAreaActive = false; - dragCounter = 0; // Counter preventing firing onDragLeave() too early (https://stackoverflow.com/questions/7110353/html5-dragleave-fired-when-hovering-a-child-element) + readonly dropAreaActive = observable.box(false); - constructor(props: DropFileInputProps & Dependencies) { - super(props); - makeObservable(this); - autoBindReact(this); - } + /** + * Counter preventing firing onDragLeave() too early (https://stackoverflow.com/questions/7110353/html5-dragleave-fired-when-hovering-a-child-element) + */ + dragCounter = 0; - onDragEnter() { + onDragEnter = () => { this.dragCounter++; - this.dropAreaActive = true; - } + this.dropAreaActive.set(true); + }; - onDragLeave() { + onDragLeave = () => { this.dragCounter--; if (this.dragCounter == 0) { - this.dropAreaActive = false; + this.dropAreaActive.set(false); } - } + }; - onDragOver(evt: React.DragEvent) { + onDragOver = (evt: React.DragEvent) => { if (this.props.onDragOver) { this.props.onDragOver(evt); } evt.preventDefault(); // enable onDrop()-callback evt.dataTransfer.dropEffect = "move"; - } + }; - onDrop(evt: React.DragEvent) { + onDrop = (evt: React.DragEvent) => { if (this.props.onDrop) { this.props.onDrop(evt); } - this.dropAreaActive = false; + this.dropAreaActive.set(false); const files = Array.from(evt.dataTransfer.files); if (files.length > 0) { this.props.onDropFiles(files, { evt }); } - } + }; render() { const { onDragEnter, onDragLeave, onDragOver, onDrop } = this; diff --git a/packages/core/src/renderer/components/input/file-input.tsx b/packages/core/src/renderer/components/input/file-input.tsx index 07d6c7f2a8..0b313b3532 100644 --- a/packages/core/src/renderer/components/input/file-input.tsx +++ b/packages/core/src/renderer/components/input/file-input.tsx @@ -4,74 +4,83 @@ */ import type { InputHTMLAttributes } from "react"; -import React from "react"; +import React, { useRef } from "react"; -export interface FileInputSelection { +export interface FileInputSelection { file: File; - data?: T | any; // not available when readAsTexts={false} + data: ReadAsText extends true ? string : undefined; error?: string; } -export interface FileInputProps extends InputHTMLAttributes { - id?: string; // could be used with