diff --git a/.eslintrc.js b/.eslintrc.js index 8a0ee2141f..21ec260be5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,7 +6,7 @@ module.exports = { node: true, browser: true, }, - extends: ['airbnb-typescript', 'prettier', 'plugin:prettier/recommended'], + extends: ['airbnb-typescript', 'prettier', 'plugin:prettier/recommended', 'plugin:storybook/recommended'], plugins: ['@typescript-eslint', 'import', 'prettier'], parser: '@typescript-eslint/parser', rules: { diff --git a/.gitignore b/.gitignore index f25ae39dd6..6094fc1800 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,6 @@ static/ .env* .npmrc + +*storybook.log +storybook-static diff --git a/.storybook/RootStoryLayout.tsx b/.storybook/RootStoryLayout.tsx new file mode 100644 index 0000000000..1bca114cd4 --- /dev/null +++ b/.storybook/RootStoryLayout.tsx @@ -0,0 +1,28 @@ +import React, { FC, PropsWithChildren } from 'react' +import { StoryContext } from '@storybook/react-vite' + +export interface Parameters { + storyLayout?: FC> +} + +/** + * Note: for use in Storybook preview config + * + * Define parameters.storyLayout as React component, and it will be used as root layout of the story + */ +export const RootStoryLayout = ({ + children, + storyContext, +}: Required>) => { + const { storyLayout } = storyContext.parameters + if (!storyLayout) { + return <>{children} + } + if (React.isValidElement(storyLayout)) { + // @ts-ignore + return React.cloneElement(storyLayout, { storyContext }, children) + } + + const StoryLayout = storyLayout + return {children} +} diff --git a/.storybook/Story.context.ts b/.storybook/Story.context.ts new file mode 100644 index 0000000000..c9308d0183 --- /dev/null +++ b/.storybook/Story.context.ts @@ -0,0 +1,16 @@ +import { createContext, useContext } from 'react' +import { StoryContext } from '@storybook/react-vite' + +const Context = createContext(null) + +export const StoryContextProvider = Context.Provider + +export const useStoryContext = () => { + const context = useContext(Context) + if (!context) + throw new Error('useStoryContext must be used within StoryContextProvider') + return context +} + +export const useStoryParameter = (parameterKey: string): T | undefined => + useStoryContext().parameters[parameterKey] diff --git a/.storybook/helpers/styles.ts b/.storybook/helpers/styles.ts new file mode 100644 index 0000000000..773cde5260 --- /dev/null +++ b/.storybook/helpers/styles.ts @@ -0,0 +1,13 @@ +import styled from 'styled-components' +import { Theme } from 'uiSrc/components/base/theme/types' + +export const StyledContainer = styled.div` + padding: 50px; + height: max-content; + overflow: hidden; + overflow-y: auto; + background-color: ${({ theme }: { theme: Theme }) => + theme.semantic.color.background.neutral100}; + border: 2px solid + ${({ theme }: { theme: Theme }) => theme.semantic.color.border.neutral500}; +` diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 0000000000..a5654b5999 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,27 @@ +import type { StorybookConfig } from '@storybook/react-vite' +import { mergeConfig } from 'vite' +import vc from './vite.config' + +const config: StorybookConfig = { + async viteFinal(inlineConfig) { + // return the customized config + return mergeConfig(inlineConfig, vc) + }, + stories: [ + '../stories/**/*.mdx', + '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)', + '../redisinsight/ui/src/**/*.stories.@(js|jsx|mjs|ts|tsx)', + '../redisinsight/ui/src/**/*.mdx', + ], + addons: [ + '@storybook/addon-a11y', + '@storybook/addon-docs', + '@storybook/addon-links', + '@storybook/addon-themes', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, +} +export default config diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 0000000000..a3407dc6d5 --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,46 @@ + + diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx new file mode 100644 index 0000000000..c21141eebb --- /dev/null +++ b/.storybook/preview.tsx @@ -0,0 +1,88 @@ +import React from 'react' +import type { Parameters, Preview } from '@storybook/react-vite' +import { withThemeFromJSXProvider } from '@storybook/addon-themes' +import { + createGlobalStyle, + ThemeProvider as StyledThemeProvider, +} from 'styled-components' +import { CommonStyles, themeDark, themeLight, themeOld } from '@redis-ui/styles' +import 'modern-normalize/modern-normalize.css' +import '@redis-ui/styles/normalized-styles.css' +import '@redis-ui/styles/fonts.css' +import { RootStoryLayout } from './RootStoryLayout' +import { StoryContextProvider } from './Story.context' +import { useStoryContext } from 'storybook/internal/preview-api' +import { TooltipProvider } from '@redis-ui/components' +import { type Theme } from 'uiSrc/components/base/theme/types' +// import { store } from 'uiSrc/utils/test-utils' +import { Provider } from 'react-redux' +import { store } from 'uiSrc/slices/store' +import Router from 'uiSrc/Router' + +const parameters: Parameters = { + parameters: { + layout: 'centered', + }, + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + disableSaveFromUI: true, + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + expanded: true, + sort: 'requiredFirst', + exclude: ['theme'], + }, + docs: { + toc: true, + controls: { + sort: 'requiredFirst', + }, + }, + options: { + storySort: { + method: 'alphabetical', + order: ['Getting Started', 'Playground', '*'], + }, + }, +} + +const GlobalStoryStyles = createGlobalStyle` + .sb-show-main, .docs-story { + background: ${({ theme }: { theme: Theme }) => theme.globals.body.bgColor}; + color: ${({ theme }: { theme: Theme }) => theme.globals.body.textColor}; + } +` + +const preview: Preview = { + parameters, + decorators: [ + (Story) => ( + + + + + + + + + + + + + ), + withThemeFromJSXProvider({ + themes: { + light: themeLight, + dark: themeDark, + obsolete: themeOld, + }, + defaultTheme: 'light', + Provider: StyledThemeProvider, + GlobalStyles: GlobalStoryStyles, + }), + ], +} + +export default preview diff --git a/.storybook/redis-theme.ts b/.storybook/redis-theme.ts new file mode 100644 index 0000000000..d7132815fc --- /dev/null +++ b/.storybook/redis-theme.ts @@ -0,0 +1,20 @@ +import { create } from '@storybook/theming/create'; + +export default create({ + base: 'light', + + brandTitle: 'Redis UI', + brandUrl: 'https://github.com/redislabsdev/redis-ui', + brandImage: 'logo.svg', + brandTarget: '_blank', + + colorPrimary: '#001D2D', + colorSecondary: '#FF4438', + + // UI + appBg: '#001D2D', + + // Toolbar default and active colors + barBg: '#F0F0F0', + textMutedColor: '#5C707A' +}); diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json new file mode 100644 index 0000000000..73ad17f9f1 --- /dev/null +++ b/.storybook/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "jsx": "react", + "types": ["node", "vite/client"], + "module": "ESNext" + }, + "include": [ + "./**/*" + ] +} diff --git a/.storybook/vite.config.ts b/.storybook/vite.config.ts new file mode 100644 index 0000000000..fdf5b02586 --- /dev/null +++ b/.storybook/vite.config.ts @@ -0,0 +1,140 @@ +import 'dotenv/config' +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import svgr from 'vite-plugin-svgr' +import fixReactVirtualized from 'esbuild-plugin-react-virtualized' +import { reactClickToComponent } from 'vite-plugin-react-click-to-component' +import { ViteEjsPlugin } from 'vite-plugin-ejs' +import { fileURLToPath, URL } from 'url' +import path from 'path' +import { defaultConfig } from 'uiSrc/config/default' + +const base = '/' + +/** + * @type {import('vite').UserConfig} + */ +export default defineConfig({ + base, + plugins: [ + react(), + svgr({ include: ['../**/*.svg?react'] }), + reactClickToComponent(), + ViteEjsPlugin(), + // Inject app info to window global object via custom plugin + { + name: 'app-info', + transformIndexHtml(html) { + const script = `` + + return html.replace(//, `\n ${script}`) + }, + }, + ], + resolve: { + alias: { + lodash: 'lodash-es', + '@elastic/eui$': '@elastic/eui/optimize/lib', + '@redislabsdev/redis-ui-components': '@redis-ui/components', + '@redislabsdev/redis-ui-styles': '@redis-ui/styles', + '@redislabsdev/redis-ui-icons': '@redis-ui/icons', + '@redislabsdev/redis-ui-table': '@redis-ui/table', + uiSrc: fileURLToPath(new URL('../redisinsight/ui/src', import.meta.url)), + apiSrc: fileURLToPath( + new URL('../redisinsight/api/src', import.meta.url), + ), + }, + }, + server: { + fs: { + allow: ['..', '../node_modules/monaco-editor', 'static', 'defaults'], + }, + }, + envPrefix: 'RI_', + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString() + } + + if (id.includes('ui/src/assets')) { + return 'assets' + } + return 'index' + }, + }, + }, + commonjsOptions: { + exclude: ['./packages'], + }, + target: 'es2020', + }, + optimizeDeps: { + include: ['monaco-editor', 'monaco-yaml/yaml.worker'], + exclude: [ + 'react-json-tree', + 'redisinsight-plugin-sdk', + 'plotly.js-dist-min', + '@antv/x6', + '@antv/x6-react-shape', + '@antv/hierarchy', + 'class-transformer', + 'keytar', + '@nestjs/common', + '@nestjs/core', + '@nestjs/event-emitter', + '@nestjs/platform-express', + '@nestjs/platform-socket.io', + '@nestjs/serve-static', + '@nestjs/swagger', + '@nestjs/typeorm', + '@nestjs/websockets', + 'nestjs-form-data', + ], + esbuildOptions: { + // fix for https://github.com/bvaughn/react-virtualized/issues/1722 + plugins: [fixReactVirtualized], + }, + }, + css: { + preprocessorOptions: { + scss: { + // add @layer app for css ordering. Styles without layer have the highest priority + // https://github.com/vitejs/vite/issues/3924 + additionalData: (source: string, filename: string) => { + if (path.extname(filename) === '.scss') { + const skipFiles = ['/main.scss', '/App.scss'] + if (skipFiles.every((file) => !filename.endsWith(file))) { + return ` + @use "uiSrc/styles/mixins/_eui.scss"; + @use "uiSrc/styles/mixins/_global.scss"; + @layer app { ${source} } + ` + } + } + return source + }, + }, + }, + }, + define: { + global: 'globalThis', + 'process.env': {}, + riConfig: defaultConfig, + }, + // hack: apply proxy path to monaco webworker + experimental: { + renderBuiltUrl() { + return { relative: true } + }, + }, +}) diff --git a/babel.config.cjs b/babel.config.cjs index 743f8c6d02..e1a13dd131 100644 --- a/babel.config.cjs +++ b/babel.config.cjs @@ -10,5 +10,12 @@ module.exports = (api) => { [require('@babel/preset-react'), { development }], [require('babel-preset-vite'), { env: true, glob: false }], ], + // added to support storybook + plugins: [ + [ + require('@babel/plugin-proposal-decorators'), + { version: '2023-11', decoratorsBeforeExport: true }, + ], + ], }; }; diff --git a/jest.config.cjs b/jest.config.cjs index db3d34c823..a617de9f34 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -4,6 +4,7 @@ require('dotenv').config({ path: './redisinsight/ui/.env.test' }); module.exports = { testEnvironmentOptions: { url: 'http://localhost/', + customExportConditions: [''], }, moduleNameMapper: { '\\.(jpg|jpeg|png|ico|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': @@ -40,9 +41,9 @@ module.exports = { setupFilesAfterEnv: ['/redisinsight/ui/src/setup-tests.ts'], moduleDirectories: ['node_modules', 'redisinsight/node_modules'], moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json'], - testEnvironment: 'jest-environment-jsdom', + testEnvironment: 'jest-fixed-jsdom', transformIgnorePatterns: [ - 'node_modules/(?!(monaco-editor|react-monaco-editor|brotli-dec-wasm)/)', + 'node_modules/(?!(monaco-editor|react-monaco-editor|brotli-dec-wasm|until-async)/)', ], // TODO: add tests for plugins modulePathIgnorePatterns: [ diff --git a/package.json b/package.json index abaca7e5f8..d10a8ee3b8 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,9 @@ "test:cov": "cross-env NODE_OPTIONS='' jest ./redisinsight/ui --testLocationInResults --json --outputFile=\"report/coverage/report.json\" --silent --coverage --no-cache --forceExit -w 3", "test:cov:unit": "jest ./redisinsight/ui --group=-component --coverage -w 1", "test:cov:component": "jest ./redisinsight/ui --group=component --coverage -w 1", - "type-check:ui": "tsc --project redisinsight/ui --noEmit" + "type-check:ui": "tsc --project redisinsight/ui --noEmit", + "sb": "storybook dev -p 6006", + "build-sb": "storybook build" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -103,12 +105,18 @@ "**/form-data": "^4.0.4" }, "devDependencies": { + "@babel/plugin-proposal-decorators": "^7.28.0", "@babel/preset-env": "^7.23.2", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.2", "@electron/rebuild": "^3.7.1", "@faker-js/faker": "^8.4.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@storybook/addon-a11y": "^9.1.11", + "@storybook/addon-docs": "^9.1.11", + "@storybook/addon-links": "^9.1.11", + "@storybook/addon-themes": "^9.1.11", + "@storybook/react-vite": "^9.1.11", "@svgr/webpack": "^8.1.0", "@teamsupercell/typings-for-css-modules-loader": "^2.4.0", "@testing-library/jest-dom": "^6.2.0", @@ -182,6 +190,7 @@ "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-sonarjs": "^2.0.4", + "eslint-plugin-storybook": "^9.1.11", "file-loader": "^6.0.0", "fishery": "^2.3.1", "google-auth-library": "^9.0.0", @@ -191,6 +200,7 @@ "ioredis-mock": "^5.5.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-fixed-jsdom": "^0.0.10", "jest-html-reporters": "^3.1.7", "jest-runner-groups": "^2.2.0", "jest-when": "^3.2.1", @@ -198,7 +208,7 @@ "lint-staged": "^10.2.11", "mini-css-extract-plugin": "2.7.2", "moment": "^2.29.3", - "msw": "^1.3.4", + "msw": "^2.11.5", "patch-package": "^8.0.0", "postinstall-postinstall": "^2.1.0", "prettier": "3.5.2", @@ -210,6 +220,7 @@ "skip-postinstall": "^1.0.0", "socket.io-mock": "^1.3.2", "source-map-support": "^0.5.19", + "storybook": "^9.1.11", "style-loader": "^2.0.0", "supertest": "^4.0.2", "terser-webpack-plugin": "^5.3.10", diff --git a/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.stories.tsx b/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.stories.tsx new file mode 100644 index 0000000000..00555a6009 --- /dev/null +++ b/redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import AnalyticsTabs from './index' + +const meta = { + component: AnalyticsTabs, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx index d5c31832c4..245cc7ae81 100644 --- a/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx +++ b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.spec.tsx @@ -63,7 +63,7 @@ describe('AutoRefresh', () => { render() fireEvent.click(screen.getByTestId('refresh-btn')) - expect(onRefresh).toBeCalled() + expect(onRefresh).toHaveBeenCalled() }) it('refresh text should contain "Last refresh" time with disabled auto-refresh', async () => { @@ -170,22 +170,23 @@ describe('AutoRefresh', () => { }) expect(screen.getByTestId(INLINE_ITEM_EDITOR)).toHaveValue('1') - screen.getByTestId(/apply-btn/).click() + await userEvent.click(screen.getByTestId(/apply-btn/)) + // screen.getByTestId(/apply-btn/).click() await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(1) + expect(onRefresh).toHaveBeenCalledTimes(1) await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(2) + expect(onRefresh).toHaveBeenCalledTimes(2) await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(3) + expect(onRefresh).toHaveBeenCalledTimes(3) }) it('should respect minimumRefreshRate when setting refresh rate', async () => { @@ -279,7 +280,7 @@ describe('AutoRefresh', () => { screen.getByTestId(/apply-btn/).click() - await act(() => { + await act(async () => { rerender( { await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(0) + expect(onRefresh).toHaveBeenCalledTimes(0) await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(0) + expect(onRefresh).toHaveBeenCalledTimes(0) - await act(() => { + await act(async () => { rerender( { await act(async () => { await new Promise((r) => setTimeout(r, 1300)) }) - expect(onRefresh).toBeCalledTimes(1) + expect(onRefresh).toHaveBeenCalledTimes(1) }) it('refresh tooltip text should contain disabled refresh button reason message when button disabled', async () => { diff --git a/redisinsight/ui/src/components/auto-refresh/AutoRefresh.stories.tsx b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.stories.tsx new file mode 100644 index 0000000000..0124271e50 --- /dev/null +++ b/redisinsight/ui/src/components/auto-refresh/AutoRefresh.stories.tsx @@ -0,0 +1,60 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' +import React from 'react' +import AutoRefresh from './index' +import { + DATABASE_OVERVIEW_MINIMUM_REFRESH_INTERVAL, + DATABASE_OVERVIEW_REFRESH_INTERVAL, +} from 'uiSrc/constants' +import { StyledContainer } from '../../../../../.storybook/helpers/styles' + +const meta = { + component: AutoRefresh, + parameters: { + layout: 'centered', + }, + decorators: [ + (Story) => { + return ( + + + + ) + }, + ], +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const AutoRefreshDefault: Story = { + args: { + postfix: 'default', + loading: false, + onRefresh: () => {}, + onRefreshClicked: () => {}, + onEnableAutoRefresh: () => {}, + enableAutoRefreshDefault: true, + defaultRefreshRate: DATABASE_OVERVIEW_REFRESH_INTERVAL, + minimumRefreshRate: parseInt(DATABASE_OVERVIEW_MINIMUM_REFRESH_INTERVAL), + lastRefreshTime: Date.now(), + }, +} +export const AutoRefreshDatabaseOverview: Story = { + args: { + displayText: false, + displayLastRefresh: false, + iconSize: 'S', + loading: false, + enableAutoRefreshDefault: true, + lastRefreshTime: 100, + containerClassName: '', + postfix: 'overview', + testid: 'auto-refresh-overview', + defaultRefreshRate: DATABASE_OVERVIEW_REFRESH_INTERVAL, + minimumRefreshRate: parseInt(DATABASE_OVERVIEW_MINIMUM_REFRESH_INTERVAL), + onRefresh: () => {}, + onRefreshClicked: () => {}, + onEnableAutoRefresh: () => {}, + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/ActionIconButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/ActionIconButton.stories.tsx new file mode 100644 index 0000000000..f17ae59ec6 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/ActionIconButton.stories.tsx @@ -0,0 +1,40 @@ +// Action Icon Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { ActionIconButton } from './ActionIconButton' +import { ActiveActiveIcon } from 'uiSrc/components/base/icons' + +const actionIconMeta = { + component: ActionIconButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta + +export default actionIconMeta +type ActionIconStory = StoryObj + +export const ActionIconDefault: ActionIconStory = { + args: { + icon: ActiveActiveIcon, + 'aria-label': 'More actions', + }, +} + +export const ActionIconSmall: ActionIconStory = { + args: { + icon: ActiveActiveIcon, + size: 'S', + 'aria-label': 'Filter', + }, +} + +export const ActionIconDisabled: ActionIconStory = { + args: { + icon: ActiveActiveIcon, + disabled: true, + 'aria-label': 'Search', + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/Button.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/Button.stories.tsx new file mode 100644 index 0000000000..a21516f55b --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/Button.stories.tsx @@ -0,0 +1,57 @@ +// Base Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { Button } from './index' + +const baseMeta = { + component: Button, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta + +export default baseMeta +type BaseStory = StoryObj + +export const Default: BaseStory = { + args: { + children: 'Base Button', + }, +} + +export const Small: BaseStory = { + args: { + children: 'Small Button', + size: 'small', + }, +} + +export const Medium: BaseStory = { + args: { + children: 'Medium Button', + size: 'medium', + }, +} + +export const Large: BaseStory = { + args: { + children: 'Large Button', + size: 'large', + }, +} + +export const Disabled: BaseStory = { + args: { + children: 'Disabled Button', + disabled: true, + }, +} + +export const Loading: BaseStory = { + args: { + children: 'Loading Button', + loading: true, + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/DestructiveButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/DestructiveButton.stories.tsx new file mode 100644 index 0000000000..003db3a697 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/DestructiveButton.stories.tsx @@ -0,0 +1,43 @@ +// Destructive Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { DestructiveButton } from './DestructiveButton' + +const destructiveMeta = { + component: DestructiveButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta +export default destructiveMeta + +type DestructiveStory = StoryObj + +export const DestructiveDefault: DestructiveStory = { + args: { + children: 'Delete', + }, +} + +export const DestructiveSmall: DestructiveStory = { + args: { + children: 'Remove', + size: 'small', + }, +} + +export const DestructiveDisabled: DestructiveStory = { + args: { + children: 'Cannot Delete', + disabled: true, + }, +} + +export const DestructiveLoading: DestructiveStory = { + args: { + children: 'Deleting...', + loading: true, + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/EmptyButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/EmptyButton.stories.tsx new file mode 100644 index 0000000000..db4eaca840 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/EmptyButton.stories.tsx @@ -0,0 +1,50 @@ +// Empty Button Stories +import { EmptyButton } from './EmptyButton' +import { Meta, StoryObj } from '@storybook/react-vite' +import { fn } from 'storybook/test' + +const emptyMeta = { + component: EmptyButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta +export default emptyMeta + +type EmptyStory = StoryObj + +export const EmptyDefault: EmptyStory = { + args: { + children: 'Empty Button', + }, +} + +export const EmptySmall: EmptyStory = { + args: { + children: 'Small Empty', + size: 'small', + }, +} + +export const EmptyMedium: EmptyStory = { + args: { + children: 'Medium Empty', + size: 'medium', + }, +} + +export const EmptyLarge: EmptyStory = { + args: { + children: 'Large Empty', + size: 'large', + }, +} + +export const EmptyDisabled: EmptyStory = { + args: { + children: 'Disabled Empty', + disabled: true, + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/IconButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/IconButton.stories.tsx new file mode 100644 index 0000000000..f7914a7cf8 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/IconButton.stories.tsx @@ -0,0 +1,54 @@ +// Icon Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { IconButton } from './IconButton' + +const iconMeta = { + component: IconButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta +export default iconMeta +type IconStory = StoryObj + +export const IconDefault: IconStory = { + args: { + icon: 'ActiveActiveIcon', + 'aria-label': 'Add', + }, +} + +export const IconSmall: IconStory = { + args: { + icon: 'EditIcon', + size: 'S', + 'aria-label': 'Edit', + }, +} + +export const IconMedium: IconStory = { + args: { + icon: 'DeleteIcon', + size: 'M', + 'aria-label': 'Delete', + }, +} + +export const IconLarge: IconStory = { + args: { + icon: 'InfoIcon', + size: 'L', + 'aria-label': 'Settings', + }, +} + +export const IconDisabled: IconStory = { + args: { + icon: 'ActiveActiveIcon', + disabled: true, + 'aria-label': 'Close', + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/PrimaryButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/PrimaryButton.stories.tsx new file mode 100644 index 0000000000..c969d22f06 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/PrimaryButton.stories.tsx @@ -0,0 +1,50 @@ +// Primary Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { PrimaryButton } from './PrimaryButton' + +const primaryMeta = { + component: PrimaryButton, + tags: ['autodocs'], + args: { onClick: fn() }, + parameters: { + layout: 'centered', + }, +} satisfies Meta + +export default primaryMeta +type PrimaryStory = StoryObj + +export const PrimaryDefault: PrimaryStory = { + args: { + children: 'Primary Button', + }, +} + +export const PrimarySmall: PrimaryStory = { + args: { + children: 'Small Primary', + size: 'small', + }, +} + +export const PrimaryLarge: PrimaryStory = { + args: { + children: 'Large Primary', + size: 'large', + }, +} + +export const PrimaryDisabled: PrimaryStory = { + args: { + children: 'Disabled Primary', + disabled: true, + }, +} + +export const PrimaryLoading: PrimaryStory = { + args: { + children: 'Loading Primary', + loading: true, + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/SecondaryButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/SecondaryButton.stories.tsx new file mode 100644 index 0000000000..d14b6733e3 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/SecondaryButton.stories.tsx @@ -0,0 +1,72 @@ +// Secondary Button Stories +import { fn } from 'storybook/test' +import type { Meta, StoryObj } from '@storybook/react-vite' +import { SecondaryButton } from './SecondaryButton' +import { InfoIcon } from 'uiSrc/components/base/icons' + +const secondaryMeta = { + component: SecondaryButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta +export default secondaryMeta +type SecondaryStory = StoryObj + +export const SecondaryDefault: SecondaryStory = { + args: { + children: 'Secondary Button', + }, +} + +export const SecondaryFilled: SecondaryStory = { + args: { + children: 'Secondary Filled', + filled: true, + }, +} + +export const SecondaryInverted: SecondaryStory = { + args: { + children: 'Secondary Inverted', + inverted: true, + }, +} + +export const SecondarySmall: SecondaryStory = { + args: { + children: 'Small Secondary', + size: 'small', + }, +} + +export const SecondaryDisabled: SecondaryStory = { + args: { + children: 'Disabled Secondary', + disabled: true, + }, +} + +export const SecondaryLoading: SecondaryStory = { + args: { + children: 'Loading Secondary', + loading: true, + }, +} + +export const SecondaryIcon: SecondaryStory = { + args: { + children: 'Secondary Icon Default', + icon: InfoIcon, + }, +} + +export const SecondaryIconRight: SecondaryStory = { + args: { + children: 'Secondary Icon Right', + icon: InfoIcon, + iconSide: 'right', + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/ToggleButton.stories.tsx b/redisinsight/ui/src/components/base/forms/buttons/ToggleButton.stories.tsx new file mode 100644 index 0000000000..c99553d279 --- /dev/null +++ b/redisinsight/ui/src/components/base/forms/buttons/ToggleButton.stories.tsx @@ -0,0 +1,51 @@ +// Toggle Button Stories +import { ToggleButton } from './ToggleButton' +import { fn } from 'storybook/test' +import { Meta, StoryObj } from '@storybook/react-vite' + +const toggleMeta = { + component: ToggleButton, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + args: { onClick: fn() }, +} satisfies Meta + +export default toggleMeta + +type ToggleStory = StoryObj + +export const ToggleOff: ToggleStory = { + args: { + children: 'Toggle Off', + pressed: false, + 'aria-label': 'Toggle feature', + }, +} + +export const ToggleOn: ToggleStory = { + args: { + children: 'Toggle On', + pressed: true, + 'aria-label': 'Toggle feature', + }, +} + +export const ToggleDisabled: ToggleStory = { + args: { + children: 'Toggle Disabled', + pressed: false, + disabled: true, + 'aria-label': 'Toggle feature', + }, +} + +export const ToggleDisabledOn: ToggleStory = { + args: { + children: 'Toggle Disabled On', + pressed: true, + disabled: true, + 'aria-label': 'Toggle feature', + }, +} diff --git a/redisinsight/ui/src/components/base/forms/buttons/button.styles.ts b/redisinsight/ui/src/components/base/forms/buttons/button.styles.ts index 4890bbb51c..cb86834bee 100644 --- a/redisinsight/ui/src/components/base/forms/buttons/button.styles.ts +++ b/redisinsight/ui/src/components/base/forms/buttons/button.styles.ts @@ -1,16 +1,13 @@ import React from 'react' import { Button } from '@redis-ui/components' -import { buttonSizes } from '@redis-ui/components/dist/Button/Button.types' import { IconType } from 'uiSrc/components/base/icons' -export type BaseButtonProps = Omit< - React.ComponentProps, - 'size' -> & { +type RedisUiButtonProps = React.ComponentProps +export type BaseButtonProps = Omit & { icon?: IconType iconSide?: 'left' | 'right' loading?: boolean - size?: (typeof buttonSizes)[number] | 's' | 'm' | 'l' + size?: RedisUiButtonProps['size'] | 's' | 'm' | 'l' } export type ButtonProps = Omit export type SecondaryButtonProps = ButtonProps & { diff --git a/redisinsight/ui/src/components/bottom-group-components/BottomGroupComponents.stories.tsx b/redisinsight/ui/src/components/bottom-group-components/BottomGroupComponents.stories.tsx new file mode 100644 index 0000000000..28ad997d42 --- /dev/null +++ b/redisinsight/ui/src/components/bottom-group-components/BottomGroupComponents.stories.tsx @@ -0,0 +1,77 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' +import React, { useEffect } from 'react' +import { useDispatch } from 'react-redux' + +import BottomGroupComponents from './BottomGroupComponents' +import { + openCliHelper, + openCli, + resetCliHelperSettings, +} from 'uiSrc/slices/cli/cli-settings' +import { showMonitor } from 'uiSrc/slices/cli/monitor' + +import { StyledContainer } from '../../../../../.storybook/helpers/styles' + +const meta = { + component: BottomGroupComponents, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const CLI: Story = { + decorators: [ + (Story) => { + const dispatch = useDispatch() + + useEffect(() => { + dispatch(resetCliHelperSettings()) + dispatch(openCli()) + }, [dispatch]) + + return ( + + + + ) + }, + ], +} +export const CLIHelper: Story = { + decorators: [ + (Story) => { + const dispatch = useDispatch() + + useEffect(() => { + dispatch(resetCliHelperSettings()) + dispatch(openCliHelper()) + }, [dispatch]) + + return ( + + + + ) + }, + ], +} + +export const Monitor: Story = { + decorators: [ + (Story) => { + const dispatch = useDispatch() + + useEffect(() => { + dispatch(resetCliHelperSettings()) + dispatch(showMonitor()) + }, [dispatch]) + + return ( + + + + ) + }, + ], +} diff --git a/redisinsight/ui/src/components/bottom-group-components/components/bottom-group-minimized/BottomGroupMinimized.stories.tsx b/redisinsight/ui/src/components/bottom-group-components/components/bottom-group-minimized/BottomGroupMinimized.stories.tsx new file mode 100644 index 0000000000..f2aa02058c --- /dev/null +++ b/redisinsight/ui/src/components/bottom-group-components/components/bottom-group-minimized/BottomGroupMinimized.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +import BottomGroupMinimized from './BottomGroupMinimized'; + +const meta = { + component: BottomGroupMinimized, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; \ No newline at end of file diff --git a/redisinsight/ui/src/components/charts/area-chart/AreaChart.stories.tsx b/redisinsight/ui/src/components/charts/area-chart/AreaChart.stories.tsx new file mode 100644 index 0000000000..1c16309a75 --- /dev/null +++ b/redisinsight/ui/src/components/charts/area-chart/AreaChart.stories.tsx @@ -0,0 +1,25 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' +import AreaChart from './index' + +const areaChart = { + component: AreaChart, + args: { + width: 400, + height: 200, + name: 'test', + data: [ + { x: 1, y: 0, xlabel: '', ylabel: '' }, + { x: 5, y: 10, xlabel: '', ylabel: '' }, + { x: 10, y: 20, xlabel: '', ylabel: '' }, + { x: 2, y: 30, xlabel: '', ylabel: '' }, + { x: 30, y: 40, xlabel: '', ylabel: '' }, + { x: 15, y: 50000, xlabel: '', ylabel: '' }, + ], + }, +} satisfies Meta + +export default areaChart + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/charts/area-chart/AreaChart.tsx b/redisinsight/ui/src/components/charts/area-chart/AreaChart.tsx index e0390c1c5a..dda7d22bb8 100644 --- a/redisinsight/ui/src/components/charts/area-chart/AreaChart.tsx +++ b/redisinsight/ui/src/components/charts/area-chart/AreaChart.tsx @@ -21,7 +21,7 @@ export enum AreaChartDataType { Bytes = 'bytes', } -interface IProps { +export interface IProps { name?: string data?: AreaChartData[] dataType?: AreaChartDataType diff --git a/redisinsight/ui/src/components/charts/bar-chart/BarChart.stories.tsx b/redisinsight/ui/src/components/charts/bar-chart/BarChart.stories.tsx new file mode 100644 index 0000000000..b27728f3ff --- /dev/null +++ b/redisinsight/ui/src/components/charts/bar-chart/BarChart.stories.tsx @@ -0,0 +1,31 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import BarChart from './BarChart' + +const barCharMeta = { + component: BarChart, + args: { + width: 600, + height: 200, + name: 'test', + data: [ + { x: 1, y: 0, xlabel: 'one', ylabel: 'zero' }, + { x: 5, y: 0.1, xlabel: 'five', ylabel: 'point one' }, + { x: 10, y: 20, xlabel: '', ylabel: '' }, + { x: 2, y: 30, xlabel: '', ylabel: '' }, + { x: 30, y: 40, xlabel: '', ylabel: '' }, + { x: 15, y: 500, xlabel: '', ylabel: '' }, + ], + }, +} satisfies Meta + +export default barCharMeta + +type Story = StoryObj + +export const Default: Story = {} +export const ThinnerBars: Story = { + args: { + barWidth: 10, + }, +} diff --git a/redisinsight/ui/src/components/charts/bar-chart/BarChart.tsx b/redisinsight/ui/src/components/charts/bar-chart/BarChart.tsx index a59a63a118..20e8d8b409 100644 --- a/redisinsight/ui/src/components/charts/bar-chart/BarChart.tsx +++ b/redisinsight/ui/src/components/charts/bar-chart/BarChart.tsx @@ -21,7 +21,7 @@ export enum BarChartDataType { Bytes = 'bytes', } -interface IProps { +export interface IProps { name?: string data?: BarChartData[] dataType?: BarChartDataType diff --git a/redisinsight/ui/src/components/charts/donut-chart/DonutChart.stories.tsx b/redisinsight/ui/src/components/charts/donut-chart/DonutChart.stories.tsx new file mode 100644 index 0000000000..6e756d46ea --- /dev/null +++ b/redisinsight/ui/src/components/charts/donut-chart/DonutChart.stories.tsx @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import DonutChart from './index' + +const donutChartMeta = { + component: DonutChart, + args: { + width: 400, + height: 200, + name: 'test', + data: [ + { value: 1, name: 'A', color: [0, 0, 0] }, + { value: 5, name: 'B', color: [10, 10, 10] }, + { value: 10, name: 'C', color: [20, 20, 20] }, + { value: 2, name: 'D', color: [30, 30, 30] }, + { value: 30, name: 'E', color: [40, 40, 40] }, + { value: 15, name: 'F', color: [50, 50, 50] }, + ], + }, +} satisfies Meta + +export default donutChartMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/charts/donut-chart/DonutChart.tsx b/redisinsight/ui/src/components/charts/donut-chart/DonutChart.tsx index d7139e1303..c1a200a297 100644 --- a/redisinsight/ui/src/components/charts/donut-chart/DonutChart.tsx +++ b/redisinsight/ui/src/components/charts/donut-chart/DonutChart.tsx @@ -18,7 +18,7 @@ export interface ChartData { } } -interface IProps { +export interface IProps { name?: string data: ChartData[] width?: number diff --git a/redisinsight/ui/src/components/cli/Cli/Cli.stories.tsx b/redisinsight/ui/src/components/cli/Cli/Cli.stories.tsx new file mode 100644 index 0000000000..53123a986d --- /dev/null +++ b/redisinsight/ui/src/components/cli/Cli/Cli.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import Cli from './Cli' + +const cliMeta = { + component: Cli, +} satisfies Meta + +export default cliMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/cli/CliWrapper.stories.tsx b/redisinsight/ui/src/components/cli/CliWrapper.stories.tsx new file mode 100644 index 0000000000..75126529ea --- /dev/null +++ b/redisinsight/ui/src/components/cli/CliWrapper.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliWrapper from './CliWrapper' + +const cliWrapperMeta = { + component: CliWrapper, +} satisfies Meta + +export default cliWrapperMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.stories.tsx new file mode 100644 index 0000000000..d241108b1e --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.stories.tsx @@ -0,0 +1,31 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliBody from './CliBody' + +const cliBodyMeta = { + component: CliBody, +} satisfies Meta + +export default cliBodyMeta + +type Story = StoryObj + +export const Default: Story = { + args: { + data: [], + command: '', + error: '', + setCommand: () => {}, + onSubmit: () => {}, + }, +} + +export const WithInput: Story = { + args: { + data: ['test\n', 'test2\n', 'test3\n'], + command: 'INFO', + error: '', + setCommand: () => {}, + onSubmit: () => {}, + }, +} diff --git a/redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.stories.tsx new file mode 100644 index 0000000000..9ba4d71244 --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliBodyWrapper from './CliBodyWrapper' + +const cliBodyWrapperMeta = { + component: CliBodyWrapper, +} satisfies Meta + +export default cliBodyWrapperMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/cli/components/cli-header/CliHeader.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-header/CliHeader.stories.tsx new file mode 100644 index 0000000000..d6ec049d06 --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-header/CliHeader.stories.tsx @@ -0,0 +1,13 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliHeader from './CliHeader' + +const cliHeaderMeta = { + component: CliHeader, +} satisfies Meta + +export default cliHeaderMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/cli/components/cli-input/CliAutocomplete/CliAutocomplete.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-input/CliAutocomplete/CliAutocomplete.stories.tsx new file mode 100644 index 0000000000..87e7c3080e --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-input/CliAutocomplete/CliAutocomplete.stories.tsx @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliAutocomplete from './index' + +const cliAutocompleteMeta = { + component: CliAutocomplete, + args: { + commandName: 'scan', + provider: 'redis', + arguments: [ + { + name: 'cursor', + type: 'integer', + }, + { + token: 'MATCH', + name: 'pattern', + type: 'pattern', + optional: true, + }, + { + token: 'COUNT', + name: 'count', + type: 'integer', + optional: true, + }, + { + token: 'TYPE', + name: 'type', + type: 'string', + optional: true, + }, + ], + }, +} satisfies Meta + +export default cliAutocompleteMeta + +type Story = StoryObj + +export const Default: Story = { + args: { + wordsTyped: 5, + }, +} diff --git a/redisinsight/ui/src/components/cli/components/cli-input/CliInput/CliInput.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-input/CliInput/CliInput.stories.tsx new file mode 100644 index 0000000000..61efa363cc --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-input/CliInput/CliInput.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliInput from './index' + +const cliInputMeta = { + component: CliInput, + args: { + command: 'SCAN', + setInputEl: () => {}, + setCommand: () => {}, + onKeyDown: () => {}, + dbIndex: 0, + }, +} satisfies Meta + +export default cliInputMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/cli/components/cli-input/CliInputWrapper.stories.tsx b/redisinsight/ui/src/components/cli/components/cli-input/CliInputWrapper.stories.tsx new file mode 100644 index 0000000000..5b13c658f7 --- /dev/null +++ b/redisinsight/ui/src/components/cli/components/cli-input/CliInputWrapper.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CliInputWrapper from './CliInputWrapper' + +const cliInputWrapperMeta = { + component: CliInputWrapper, + args: { + command: 'SCAN', + wordsTyped: 1, + setInputEl: () => {}, + setCommand: () => {}, + onKeyDown: () => {}, + }, +} satisfies Meta + +export default cliInputWrapperMeta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/redisinsight/ui/src/components/code-block/CodeBlock.stories.tsx b/redisinsight/ui/src/components/code-block/CodeBlock.stories.tsx new file mode 100644 index 0000000000..e02507d777 --- /dev/null +++ b/redisinsight/ui/src/components/code-block/CodeBlock.stories.tsx @@ -0,0 +1,24 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import CodeBlock from './CodeBlock' + +const codeBlockMeta = { + component: CodeBlock, +} satisfies Meta + +export default codeBlockMeta + +type Story = StoryObj + +export const Default: Story = { + args: { + children: 'console.log("Hello, World!");', + }, +}; + +export const WithCopyButton: Story = { + args: { + children: 'redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001', + isCopyable: true, + }, +}; diff --git a/redisinsight/ui/src/components/global-url-handler/GlobalUrlHandler.spec.tsx b/redisinsight/ui/src/components/global-url-handler/GlobalUrlHandler.spec.tsx index 3adccc6b33..5412181e8a 100644 --- a/redisinsight/ui/src/components/global-url-handler/GlobalUrlHandler.spec.tsx +++ b/redisinsight/ui/src/components/global-url-handler/GlobalUrlHandler.spec.tsx @@ -1,7 +1,12 @@ import React from 'react' -import { cloneDeep } from 'lodash' import reactRouterDom from 'react-router-dom' -import { act, cleanup, mockedStore, render } from 'uiSrc/utils/test-utils' +import { + act, + cleanup, + createMockedStore, + mockedStore, + render, +} from 'uiSrc/utils/test-utils' import { appRedirectionSelector, @@ -45,13 +50,15 @@ jest.mock('uiSrc/utils/routing', () => ({ let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() }) const fromUrl = 'redisinsight://databases/connect?redisUrl=redis://default:password@localhost:6379&databaseAlias=My Name&redirect=workbench?guidePath=/quick-guides/document/introduction.md&cloudBdbId=1232&subscriptionType=fixed&planMemoryLimit=30&memoryLimitMeasurementUnit=mb&free=true&target=_blank' +const renderGlobalUrlHandler = () => render(, { store }) + describe('GlobalUrlHandler', () => { beforeEach(() => { reactRouterDom.useLocation = jest @@ -60,11 +67,11 @@ describe('GlobalUrlHandler', () => { }) it('should render', () => { - expect(render()).toBeTruthy() + expect(renderGlobalUrlHandler()).toBeTruthy() }) it('should not call any actions by default', () => { - render() + renderGlobalUrlHandler() expect(store.getActions()).toEqual([]) }) @@ -77,7 +84,7 @@ describe('GlobalUrlHandler', () => { .mockReturnValueOnce({ replace: replaceMock }) reactRouterDom.useLocation = jest.fn().mockReturnValueOnce({ search }) - render() + renderGlobalUrlHandler() expect(store.getActions()).toEqual([ setFromUrl(decodeURIComponent(fromUrl)), ]) @@ -99,7 +106,7 @@ describe('GlobalUrlHandler', () => { ;(appRedirectionSelector as jest.Mock).mockReturnValueOnce({ fromUrl }) await act(async () => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(fromUrl) @@ -130,7 +137,7 @@ describe('GlobalUrlHandler', () => { ;(appRedirectionSelector as jest.Mock).mockReturnValueOnce({ fromUrl }) await act(async () => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(fromUrl) @@ -158,9 +165,7 @@ describe('GlobalUrlHandler', () => { fromUrl, }) - await act(() => { - render() - }) + renderGlobalUrlHandler() const actionUrl = new URL(fromUrl) const fromParams = new URLSearchParams(actionUrl.search) @@ -194,7 +199,7 @@ describe('GlobalUrlHandler', () => { }) await act(() => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(url) @@ -246,7 +251,7 @@ describe('GlobalUrlHandler', () => { }) await act(() => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(url) @@ -296,7 +301,7 @@ describe('GlobalUrlHandler', () => { }) await act(() => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(url) @@ -347,7 +352,7 @@ describe('GlobalUrlHandler', () => { }) await act(() => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(url) @@ -398,7 +403,7 @@ describe('GlobalUrlHandler', () => { }) await act(() => { - render() + renderGlobalUrlHandler() }) const actionUrl = new URL(url) diff --git a/redisinsight/ui/src/components/main-router/constants/commonRoutes.ts b/redisinsight/ui/src/components/main-router/constants/commonRoutes.ts index b20420c6ec..bac6df49ce 100644 --- a/redisinsight/ui/src/components/main-router/constants/commonRoutes.ts +++ b/redisinsight/ui/src/components/main-router/constants/commonRoutes.ts @@ -6,6 +6,7 @@ import { SentinelDatabasesResultPage, SentinelPage, } from 'uiSrc/pages/autodiscover-sentinel' + import { LAZY_LOAD } from '../config' const LazySettingsPage = lazy(() => import('uiSrc/pages/settings')) diff --git a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx index af6c001d88..2f5a29c627 100644 --- a/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx +++ b/redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.spec.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { fireEvent, render, screen } from 'uiSrc/utils/test-utils' +import { fireEvent, render, screen, act } from 'uiSrc/utils/test-utils' import { OAuthProvider } from 'uiSrc/components/oauth/oauth-select-plan/constants' import notificationsReducer, { @@ -19,24 +19,22 @@ const createTestStore = () => getDefaultMiddleware({ serializableCheck: false }), }) -const renderToast = (notification: InfiniteMessage) => { +const renderToast = async (notification: InfiniteMessage) => { const store = createTestStore() render( <> - {/* */} , { store }, ) - - store.dispatch(addInfiniteNotification(notification)) + await act(async () => store.dispatch(addInfiniteNotification(notification))) } describe('INFINITE_MESSAGES', () => { describe('AUTHENTICATING', () => { it('should render message', async () => { - renderToast(INFINITE_MESSAGES.AUTHENTICATING()) + await renderToast(INFINITE_MESSAGES.AUTHENTICATING()) // Wait for the notification to appear const title = await screen.findByText('Authenticating…') diff --git a/redisinsight/ui/src/components/oauth/oauth-connect-free-db/OAuthConnectFreeDb.spec.tsx b/redisinsight/ui/src/components/oauth/oauth-connect-free-db/OAuthConnectFreeDb.spec.tsx index 356f3d3777..8ac9ac0fe9 100644 --- a/redisinsight/ui/src/components/oauth/oauth-connect-free-db/OAuthConnectFreeDb.spec.tsx +++ b/redisinsight/ui/src/components/oauth/oauth-connect-free-db/OAuthConnectFreeDb.spec.tsx @@ -1,12 +1,6 @@ import React from 'react' import { cloneDeep } from 'lodash' -import { - act, - cleanup, - fireEvent, - mockedStore, - render, -} from 'uiSrc/utils/test-utils' +import { cleanup, mockedStore, render, userEvent } from 'uiSrc/utils/test-utils' import { getRedisModulesSummary, sendEventTelemetry, @@ -15,6 +9,7 @@ import { import { freeInstancesSelector, setDefaultInstance, + setDefaultInstanceSuccess, } from 'uiSrc/slices/instances/instances' import { OAuthSocialSource } from 'uiSrc/slices/interfaces' import { setCapability } from 'uiSrc/slices/app/context' @@ -63,10 +58,8 @@ describe('OAuthConnectFreeDb', () => { const { queryByTestId } = render() - await act(() => - fireEvent.click( - queryByTestId('connect-free-db-btn') as HTMLButtonElement, - ), + await userEvent.click( + queryByTestId('connect-free-db-btn') as HTMLButtonElement, ) expect(sendEventTelemetry).toHaveBeenCalledWith({ @@ -86,6 +79,7 @@ describe('OAuthConnectFreeDb', () => { tutorialPopoverShown: false, }), setDefaultInstance(), + setDefaultInstanceSuccess(), ] expect(store.getActions()).toEqual(expectedActions) }) diff --git a/redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/OAuthCreateDb.spec.tsx b/redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/OAuthCreateDb.spec.tsx index 492aa35d8e..54e43c1798 100644 --- a/redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/OAuthCreateDb.spec.tsx +++ b/redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/OAuthCreateDb.spec.tsx @@ -3,6 +3,7 @@ import { cloneDeep } from 'lodash' import { act, cleanup, + expectActionsToContain, fireEvent, mockedStore, render, @@ -86,7 +87,7 @@ describe('OAuthCreateDb', () => { expect(screen.getByTestId('sso-email')).toBeInTheDocument() - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.CLOUD_SIGN_IN_SOCIAL_ACCOUNT_SELECTED, eventData: { accountOption: OAuthStrategy.SSO, @@ -107,7 +108,7 @@ describe('OAuthCreateDb', () => { fireEvent.click(screen.getByTestId('btn-submit')) }) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.CLOUD_SIGN_IN_SSO_OPTION_PROCEEDED, eventData: { action: OAuthSocialAction.Create, @@ -124,7 +125,7 @@ describe('OAuthCreateDb', () => { fireEvent.click(screen.getByTestId('google-oauth')) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.CLOUD_SIGN_IN_SOCIAL_ACCOUNT_SELECTED, eventData: { accountOption: OAuthStrategy.Google, @@ -174,7 +175,7 @@ describe('OAuthCreateDb', () => { expect(store.getActions()).toEqual(expectedActions) }) - it('should call proper actions after click create without recommened settings', async () => { + it('should call proper actions after click create without recommended settings', async () => { ;(oauthCloudUserSelector as jest.Mock).mockReturnValue({ data: {} }) render() @@ -193,6 +194,6 @@ describe('OAuthCreateDb', () => { setSocialDialogState(null), getPlans(), ] - expect(store.getActions()).toEqual(expectedActions) + expectActionsToContain(store.getActions(), expectedActions) }) }) diff --git a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/assistance-chat/AssistanceChat.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/assistance-chat/AssistanceChat.spec.tsx index 72b3887820..21c5c45a43 100644 --- a/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/assistance-chat/AssistanceChat.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/assistance-chat/AssistanceChat.spec.tsx @@ -3,6 +3,7 @@ import { cloneDeep } from 'lodash' import { act, cleanup, + expectActionsToContain, fireEvent, mockedStore, mockedStoreFn, @@ -122,7 +123,7 @@ describe('AssistanceChat', () => { sendQuestion(expect.objectContaining({ content: 'test' })), ]) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.AI_CHAT_MESSAGE_SENT, eventData: { chat: AiChatType.Assistance, @@ -155,7 +156,7 @@ describe('AssistanceChat', () => { await waitForRiPopoverVisible() - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.AI_CHAT_BOT_TERMS_DISPLAYED, eventData: { chat: AiChatType.Assistance, @@ -167,7 +168,7 @@ describe('AssistanceChat', () => { fireEvent.click(screen.getByTestId('ai-accept-agreements')) }) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.AI_CHAT_BOT_TERMS_ACCEPTED, eventData: { chat: AiChatType.Assistance, @@ -204,12 +205,12 @@ describe('AssistanceChat', () => { fireEvent.click(screen.getByTestId('ai-chat-restart-confirm')) }) - expect(store.getActions()).toEqual([ + expectActionsToContain(store.getActions(), [ ...afterRenderActions, removeAssistantChatHistory(), ]) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.AI_CHAT_SESSION_RESTARTED, eventData: { chat: AiChatType.Assistance, diff --git a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.spec.tsx b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.spec.tsx index a28920a016..2d4b27c9c8 100644 --- a/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.spec.tsx +++ b/redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.spec.tsx @@ -15,7 +15,7 @@ import { } from 'uiSrc/utils/test-utils' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { updateRecommendation } from 'uiSrc/slices/recommendations/recommendations' +import {updateRecommendation, updateRecommendationSuccess} from 'uiSrc/slices/recommendations/recommendations' import { INSTANCE_ID_MOCK } from 'uiSrc/mocks/handlers/instances/instancesHandlers' import { MOCK_RECOMMENDATIONS } from 'uiSrc/constants/mocks/mock-recommendations' import { findTutorialPath } from 'uiSrc/utils' @@ -214,7 +214,7 @@ describe('Recommendation', () => { ) }) - const expectedActions = [updateRecommendation()] + const expectedActions = [updateRecommendation(), updateRecommendationSuccess({})] expect(store.getActions()).toEqual(expectedActions) expect(screen.getByTestId('toggle-hide-searchJSON-btn')).toBeInTheDocument() diff --git a/redisinsight/ui/src/components/upload-file/UploadFile.spec.tsx b/redisinsight/ui/src/components/upload-file/UploadFile.spec.tsx index 78df6a001e..bc2e608f3b 100644 --- a/redisinsight/ui/src/components/upload-file/UploadFile.spec.tsx +++ b/redisinsight/ui/src/components/upload-file/UploadFile.spec.tsx @@ -35,7 +35,7 @@ describe('UploadFile', () => { const fileInput = screen.getByTestId('upload-input-file') fireEvent.change(fileInput, { target: { files: [file] } }) - await waitFor(() => expect(onFileChange).toBeCalled()) + await waitFor(() => expect(onFileChange).toHaveBeenCalled()) await waitFor(() => expect(screen.getByTestId('upload-input-file')).toHaveValue(''), ) diff --git a/redisinsight/ui/src/components/upload-file/UploadFile.tsx b/redisinsight/ui/src/components/upload-file/UploadFile.tsx index 854f7b1316..bda8521e89 100644 --- a/redisinsight/ui/src/components/upload-file/UploadFile.tsx +++ b/redisinsight/ui/src/components/upload-file/UploadFile.tsx @@ -16,13 +16,11 @@ const UploadFile = (props: Props) => { const { onFileChange, onClick, accept, id = 'upload-input-file' } = props const handleFileChange = (e: React.ChangeEvent) => { - if (e.target.files && e.target.files[0]) { - const reader = new FileReader() - reader.onload = async (e) => { - onFileChange(e?.target?.result as string) - } - reader.readAsText(e.target.files[0]) - // reset input value after reading file + if (e.target.files && e.target.files.length > 0) { + const fileBlob = e.target.files[0] + fileBlob.text().then((text) => { + onFileChange(text) + }) e.target.value = '' } } diff --git a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx index 1b36360e63..173aa7fa7b 100644 --- a/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx +++ b/redisinsight/ui/src/electron/components/ConfigOAuth/ConfigOAuth.spec.tsx @@ -1,6 +1,10 @@ import React from 'react' -import { cloneDeep } from 'lodash' -import { cleanup, mockedStore, render } from 'uiSrc/utils/test-utils' +import { + cleanup, + createMockedStore, + mockedStore, + render, +} from 'uiSrc/utils/test-utils' import { CloudAuthStatus, @@ -48,13 +52,17 @@ jest.mock('uiSrc/slices/instances/cloud', () => ({ let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() window.app = { cloudOauthCallback: jest.fn(), } as any }) +const renderConfigOAuth = () => { + return render(, { store }) +} + describe('ConfigOAuth', () => { it('should render', () => { expect(render()).toBeTruthy() @@ -68,7 +76,7 @@ describe('ConfigOAuth', () => { window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), ) - render() + renderConfigOAuth() const expectedActions = [ setJob({ @@ -95,7 +103,7 @@ describe('ConfigOAuth', () => { error: 'error', }), ) - render() + renderConfigOAuth() const expectedActions = [ setOAuthCloudSource(null), @@ -127,7 +135,7 @@ describe('ConfigOAuth', () => { window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), ) - render() + renderConfigOAuth() const afterCallbackActions = [ setJob({ @@ -165,7 +173,7 @@ describe('ConfigOAuth', () => { window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), ) - render() + renderConfigOAuth() const afterCallbackActions = [ setJob({ @@ -204,7 +212,7 @@ describe('ConfigOAuth', () => { window.app?.cloudOauthCallback.mockImplementation((cb: any) => cb(undefined, { status: CloudAuthStatus.Succeed }), ) - render() + renderConfigOAuth() const afterCallbackActions = [ setJob({ diff --git a/redisinsight/ui/src/mocks/handlers/ai/assistantHandlers.ts b/redisinsight/ui/src/mocks/handlers/ai/assistantHandlers.ts new file mode 100644 index 0000000000..bb1b055b47 --- /dev/null +++ b/redisinsight/ui/src/mocks/handlers/ai/assistantHandlers.ts @@ -0,0 +1,46 @@ +import { http, HttpHandler, HttpResponse } from 'msw' +import { ApiEndpoints } from 'uiSrc/constants' +import { getMswURL } from 'uiSrc/utils/test-utils' + +const handlers: HttpHandler[] = [ + http.get<{ id: string }>( + getMswURL(`/${ApiEndpoints.AI_ASSISTANT_CHATS}/:id`), + async ({ params }) => { + const { id } = params + + return HttpResponse.json({ id, messages: [] }, { status: 200 }) + }, + ), + http.post<{ id: string }, { content: string }>( + getMswURL(`/${ApiEndpoints.AI_ASSISTANT_CHATS}/:id/messages`), + async ({ request }) => { + const { content } = await request.json() + + return HttpResponse.json([content], { status: 200 }) + }, + ), + http.post<{ id: string }, { content: string }>( + getMswURL(`/${ApiEndpoints.AI_ASSISTANT_CHATS}`), + async ({ request }) => { + const { content } = await request.json() + + return HttpResponse.json([content], { status: 200 }) + }, + ), + http.delete<{ id: string }>( + getMswURL(`/${ApiEndpoints.AI_ASSISTANT_CHATS}/:id`), + async () => { + return HttpResponse.text('', { status: 200 }) + }, + ), + http.options(getMswURL(`/${ApiEndpoints.AI_ASSISTANT_CHATS}*`), () => { + return new Response(null, { + status: 200, + headers: { + Allow: 'GET,HEAD,POST,DELETE', + }, + }) + }), +] + +export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/ai/index.ts b/redisinsight/ui/src/mocks/handlers/ai/index.ts new file mode 100644 index 0000000000..b69ef1d10e --- /dev/null +++ b/redisinsight/ui/src/mocks/handlers/ai/index.ts @@ -0,0 +1,5 @@ +import { HttpHandler } from 'msw' +import assistant from 'uiSrc/mocks/handlers/ai/assistantHandlers' + +const handlers: HttpHandler[] = [...assistant] +export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/analytics/clusterDetailsHandlers.ts b/redisinsight/ui/src/mocks/handlers/analytics/clusterDetailsHandlers.ts index b4c71937cb..de082a4ec2 100644 --- a/redisinsight/ui/src/mocks/handlers/analytics/clusterDetailsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/analytics/clusterDetailsHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getUrl } from 'uiSrc/utils' import { getMswURL } from 'uiSrc/utils/test-utils' @@ -11,12 +11,13 @@ import { Database as DatabaseInstanceResponse } from 'apiSrc/modules/database/mo export const INSTANCE_ID_MOCK = 'instanceId' -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // useGetClusterDetailsQuery - rest.get( + http.get( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.CLUSTER_DETAILS)), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(CLUSTER_DETAILS_DATA_MOCK)), + async () => { + return HttpResponse.json(CLUSTER_DETAILS_DATA_MOCK, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/analytics/dbAnalysisHistoryHandlers.ts b/redisinsight/ui/src/mocks/handlers/analytics/dbAnalysisHistoryHandlers.ts index c20f63f3d5..cac3d30647 100644 --- a/redisinsight/ui/src/mocks/handlers/analytics/dbAnalysisHistoryHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/analytics/dbAnalysisHistoryHandlers.ts @@ -1,16 +1,23 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getUrl } from 'uiSrc/utils' import { getMswURL } from 'uiSrc/utils/test-utils' export const INSTANCE_ID_MOCK = 'instanceId' -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchDBAnalysisReportsHistory - rest.get( + http.get( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.DATABASE_ANALYSIS)), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(DB_ANALYSIS_HISTORY_DATA_MOCK)), + async () => { + return HttpResponse.json(DB_ANALYSIS_HISTORY_DATA_MOCK, { status: 200 }) + }, + ), + http.post( + getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.DATABASE_ANALYSIS)), + async () => { + return HttpResponse.json({}, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/analytics/index.ts b/redisinsight/ui/src/mocks/handlers/analytics/index.ts index b01bff277b..bfc42dc65f 100644 --- a/redisinsight/ui/src/mocks/handlers/analytics/index.ts +++ b/redisinsight/ui/src/mocks/handlers/analytics/index.ts @@ -1,10 +1,7 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import clusterDetails from './clusterDetailsHandlers' import dbAnalysisHistory from './dbAnalysisHistoryHandlers' -const handlers: RestHandler>[] = [].concat( - clusterDetails, - dbAnalysisHistory, -) +const handlers: HttpHandler[] = [...clusterDetails, ...dbAnalysisHistory] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts b/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts index b4a791a953..1dcd9676f0 100644 --- a/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/app/featureHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' @@ -92,12 +92,13 @@ export const FEATURES_DATA_MOCK = { }, } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // get features - rest.get<(typeof FEATURES_DATA_MOCK)[]>( + http.get( getMswURL(ApiEndpoints.FEATURES), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(FEATURES_DATA_MOCK)), + async () => { + return HttpResponse.json(FEATURES_DATA_MOCK, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/app/index.ts b/redisinsight/ui/src/mocks/handlers/app/index.ts index 3378c6eae4..7751df87df 100644 --- a/redisinsight/ui/src/mocks/handlers/app/index.ts +++ b/redisinsight/ui/src/mocks/handlers/app/index.ts @@ -1,12 +1,8 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import info from './infoHandlers' import telemetry from './telemetryHandlers' import featureHandlers from './featureHandlers' -const handlers: RestHandler>[] = [].concat( - info, - telemetry, - featureHandlers, -) +const handlers: HttpHandler[] = [...info, ...telemetry, ...featureHandlers] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/app/infoHandlers.ts b/redisinsight/ui/src/mocks/handlers/app/infoHandlers.ts index cdea01f50f..76d644173e 100644 --- a/redisinsight/ui/src/mocks/handlers/app/infoHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/app/infoHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { Database as DatabaseInstanceResponse } from 'apiSrc/modules/database/models/database' @@ -11,12 +11,13 @@ export const APP_INFO_DATA_MOCK = { buildType: 'ELECTRON', } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchServerInfo - rest.get( + http.get( getMswURL(ApiEndpoints.INFO), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(APP_INFO_DATA_MOCK)), + async () => { + return HttpResponse.json(APP_INFO_DATA_MOCK, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/app/telemetryHandlers.ts b/redisinsight/ui/src/mocks/handlers/app/telemetryHandlers.ts index c2cc153724..b8d0750ff1 100644 --- a/redisinsight/ui/src/mocks/handlers/app/telemetryHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/app/telemetryHandlers.ts @@ -1,18 +1,16 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // sendEventTelemetry - rest.post( - getMswURL(ApiEndpoints.ANALYTICS_SEND_EVENT), - async (req, res, ctx) => res(ctx.status(200)), - ), + http.post(getMswURL(ApiEndpoints.ANALYTICS_SEND_EVENT), async () => { + return HttpResponse.text('', { status: 200 }) + }), // sendPageViewTelemetry - rest.post( - getMswURL(ApiEndpoints.ANALYTICS_SEND_PAGE), - async (req, res, ctx) => res(ctx.status(200)), - ), + http.post(getMswURL(ApiEndpoints.ANALYTICS_SEND_PAGE), async () => { + return HttpResponse.text('', { status: 200 }) + }), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/browser/bulkActionsHandlers.ts b/redisinsight/ui/src/mocks/handlers/browser/bulkActionsHandlers.ts index 5ea28a186e..4e20333303 100644 --- a/redisinsight/ui/src/mocks/handlers/browser/bulkActionsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/browser/bulkActionsHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' @@ -6,16 +6,19 @@ import { IBulkActionOverview } from 'uiSrc/slices/interfaces' import { bulkActionOverviewFactory } from 'uiSrc/mocks/factories/browser/bulkActions/bulkActionOverview.factory' import { INSTANCE_ID_MOCK } from '../instances/instancesHandlers' -const handlers: RestHandler[] = [ - rest.post( +const handlers: HttpHandler[] = [ + http.post( getMswURL( getUrl( INSTANCE_ID_MOCK, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(bulkActionOverviewFactory.build())), + async () => { + return HttpResponse.json(bulkActionOverviewFactory.build(), { + status: 200, + }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/browser/index.ts b/redisinsight/ui/src/mocks/handlers/browser/index.ts index 2635a980be..3f8ba9c2a9 100644 --- a/redisinsight/ui/src/mocks/handlers/browser/index.ts +++ b/redisinsight/ui/src/mocks/handlers/browser/index.ts @@ -1,10 +1,7 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import redisearch from './redisearchHandlers' import bulkActions from './bulkActionsHandlers' -const handlers: RestHandler>[] = [].concat( - redisearch, - bulkActions, -) +const handlers: HttpHandler[] = [...redisearch, ...bulkActions] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/browser/redisearchHandlers.ts b/redisinsight/ui/src/mocks/handlers/browser/redisearchHandlers.ts index de3b7e1c61..f2162e2fca 100644 --- a/redisinsight/ui/src/mocks/handlers/browser/redisearchHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/browser/redisearchHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl, stringToBuffer } from 'uiSrc/utils' @@ -16,21 +16,25 @@ export const REDISEARCH_LIST_DATA_MOCK = { ), } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchRedisearchListAction - rest.get( + http.get( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH)), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(REDISEARCH_LIST_DATA_MOCK)), + async () => { + return HttpResponse.json(REDISEARCH_LIST_DATA_MOCK, { status: 200 }) + }, ), - rest.post( + http.post( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH_INFO)), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(indexInfoFactory.build())), + async () => { + return HttpResponse.json(indexInfoFactory.build(), { status: 200 }) + }, ), - rest.delete( + http.delete( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH)), - async (_req, res, ctx) => res(ctx.status(204)), + async () => { + return HttpResponse.text('', { status: 204 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/content/createRedisButtonsHandlers.ts b/redisinsight/ui/src/mocks/handlers/content/createRedisButtonsHandlers.ts index eea21c89a0..d75477f49c 100644 --- a/redisinsight/ui/src/mocks/handlers/content/createRedisButtonsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/content/createRedisButtonsHandlers.ts @@ -1,16 +1,15 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { ConnectionType } from 'uiSrc/slices/interfaces' import { getMswResourceURL } from 'uiSrc/utils/test-utils' -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchContentAction - rest.get( + http.get( getMswResourceURL(ApiEndpoints.CONTENT_CREATE_DATABASE), - async (req, res, ctx) => - res( - ctx.status(200), - ctx.json([ + async () => { + return HttpResponse.json( + [ { id: 'e37cc441-a4f2-402c-8bdb-fc2413cbbaff', host: 'localhost', @@ -64,8 +63,10 @@ const handlers: RestHandler[] = [ name: 'mymaster', }, }, - ]), - ), + ], + { status: 200 }, + ) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/content/index.ts b/redisinsight/ui/src/mocks/handlers/content/index.ts index b7bfd09f30..e126f60d9e 100644 --- a/redisinsight/ui/src/mocks/handlers/content/index.ts +++ b/redisinsight/ui/src/mocks/handlers/content/index.ts @@ -1,6 +1,5 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' - +import { HttpHandler } from 'msw' import crb from './createRedisButtonsHandlers' -const handlers: RestHandler[] = [].concat(crb) +const handlers: HttpHandler[] = [...crb] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/index.ts b/redisinsight/ui/src/mocks/handlers/index.ts index b02d9fceb0..73eb183109 100644 --- a/redisinsight/ui/src/mocks/handlers/index.ts +++ b/redisinsight/ui/src/mocks/handlers/index.ts @@ -1,4 +1,3 @@ -import { MockedRequest, RestHandler } from 'msw' import instances from './instances' import content from './content' import app from './app' @@ -10,18 +9,20 @@ import tutorials from './tutorials' import rdi from './rdi' import user from './user' import workbench from './workbench' +import ai from './ai' // @ts-ignore -export const handlers: RestHandler[] = [].concat( - instances, - content, - app, - analytics, - browser, - recommendations, - cloud, - tutorials, - rdi, - user, - workbench, -) +export const handlers = [ + ...instances, + ...content, + ...app, + ...analytics, + ...browser, + ...recommendations, + ...cloud, + ...tutorials, + ...rdi, + ...user, + ...workbench, + ...ai, +] diff --git a/redisinsight/ui/src/mocks/handlers/instances/caCertsHandlers.ts b/redisinsight/ui/src/mocks/handlers/instances/caCertsHandlers.ts index da4632ff4c..8a90272971 100644 --- a/redisinsight/ui/src/mocks/handlers/instances/caCertsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/instances/caCertsHandlers.ts @@ -1,20 +1,25 @@ -import { DefaultBodyType, MockedRequest, rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' -const handlers: RestHandler>[] = [ - rest.post(getMswURL(ApiEndpoints.CA_CERTIFICATES), (req, res, ctx) => { - const { username } = req.body +interface CaCertRequestBody { + username: string +} - return res( - ctx.json({ +const handlers: HttpHandler[] = [ + http.post( + getMswURL(ApiEndpoints.CA_CERTIFICATES), + async ({ request }) => { + const { username } = await request.clone().json() + + return HttpResponse.json({ id: 'f79e82e8-c34a-4dc7-a49e-9fadc0979fda', username, firstName: 'John', lastName: 'Maverick', - }), - ) - }), + }) + }, + ), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/instances/index.ts b/redisinsight/ui/src/mocks/handlers/instances/index.ts index ad522838c5..e396dbb47c 100644 --- a/redisinsight/ui/src/mocks/handlers/instances/index.ts +++ b/redisinsight/ui/src/mocks/handlers/instances/index.ts @@ -1,10 +1,7 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import instances from './instancesHandlers' import caCerts from './caCertsHandlers' -const handlers: RestHandler>[] = [].concat( - instances, - caCerts, -) +const handlers: HttpHandler[] = [...instances, ...caCerts] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts b/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts index 4c2bb18dc4..783c9224d5 100644 --- a/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/instances/instancesHandlers.ts @@ -1,12 +1,9 @@ -import { rest, RestHandler } from 'msw' -import { RedisNodeInfoResponse } from 'src/modules/database/dto/redis-info.dto' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { ConnectionType, Instance } from 'uiSrc/slices/interfaces' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' import { MOCK_INFO_API_RESPONSE } from 'uiSrc/mocks/data/instances' -import { Database as DatabaseInstanceResponse } from 'apiSrc/modules/database/models/database' -import { ExportDatabase } from 'apiSrc/modules/database/models/export-database' export const INSTANCE_ID_MOCK = 'instanceId' export const INSTANCES_MOCK: Instance[] = [ @@ -72,43 +69,53 @@ export const INSTANCES_MOCK: Instance[] = [ export const getDatabasesApiSpy = jest .fn() - .mockImplementation(async (_req, res, ctx) => - res(ctx.status(200), ctx.json(INSTANCES_MOCK)), + .mockImplementation(async () => + HttpResponse.json(INSTANCES_MOCK, { status: 200 }), ) -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchInstancesAction - rest.get( - getMswURL(ApiEndpoints.DATABASES), - getDatabasesApiSpy, - ), - rest.post( - getMswURL(ApiEndpoints.DATABASES_EXPORT), - async (_req, res, ctx) => res(ctx.status(200), ctx.json(INSTANCES_MOCK)), - ), - rest.get( - getMswURL(getUrl(INSTANCE_ID_MOCK)), - async (_req, res, ctx) => res(ctx.status(200), ctx.json(INSTANCES_MOCK[0])), - ), - rest.get( + http.get(getMswURL(ApiEndpoints.DATABASES), getDatabasesApiSpy), + http.post(getMswURL(ApiEndpoints.DATABASES_EXPORT), async () => { + return HttpResponse.json(INSTANCES_MOCK, { status: 200 }) + }), + http.get(getMswURL(getUrl(INSTANCE_ID_MOCK)), async () => { + return HttpResponse.json(INSTANCES_MOCK[0], { status: 200 }) + }), + http.get( getMswURL(`/${ApiEndpoints.DATABASES}/:id/info`), // getMswURL(getUrl(INSTANCE_ID_MOCK, 'info')), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(MOCK_INFO_API_RESPONSE)), + async () => { + return HttpResponse.json(MOCK_INFO_API_RESPONSE, { status: 200 }) + }, ), -] - -// rest.post(`${ApiEndpoints.INSTANCE}`, (req, res, ctx) => { -// const { username } = req.body + http.get(getMswURL(`${ApiEndpoints.DATABASES}/:id/connect`), async () => { + return HttpResponse.text('', { status: 200 }) + }), + http.post< + any, + { + name: string + host: string + port: number + username: string + timeout: number + tls: boolean + }, + Partial + >(getMswURL(`${ApiEndpoints.DATABASES}`), async ({ request }) => { + const { username } = await request.json() -// return res( -// ctx.json({ -// id: 'f79e82e8-c34a-4dc7-a49e-9fadc0979fda', -// username, -// firstName: 'John', -// lastName: 'Maverick', -// }), -// ) -// }), + return HttpResponse.json( + { + id: 'f79e82e8-c34a-4dc7-a49e-9fadc0979fda', + username, + host: 'localhost', + port: 6379, + }, + { status: 201 }, + ) + }), +] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/misc/index.ts b/redisinsight/ui/src/mocks/handlers/misc/index.ts new file mode 100644 index 0000000000..17ea7658cd --- /dev/null +++ b/redisinsight/ui/src/mocks/handlers/misc/index.ts @@ -0,0 +1,15 @@ +import { getMswURL } from 'uiSrc/utils/test-utils' +import { ApiEndpoints } from 'uiSrc/constants' +import { http, HttpHandler, HttpResponse } from 'msw' +import { USER_SETTINGS_DATA_MOCK } from 'uiSrc/mocks/handlers/user/userSettingsHandlers' + +const apiSettings = getMswURL(ApiEndpoints.SETTINGS) + +export const handlers: HttpHandler[] = [ + http.get(apiSettings, async () => { + return HttpResponse.json(USER_SETTINGS_DATA_MOCK, { status: 200 }) + }), + http.patch(apiSettings, async () => { + return HttpResponse.json(USER_SETTINGS_DATA_MOCK, { status: 200 }) + }), +] diff --git a/redisinsight/ui/src/mocks/handlers/oauth/cloud.ts b/redisinsight/ui/src/mocks/handlers/oauth/cloud.ts index 1f348910e0..178effea0d 100644 --- a/redisinsight/ui/src/mocks/handlers/oauth/cloud.ts +++ b/redisinsight/ui/src/mocks/handlers/oauth/cloud.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { getMswURL } from 'uiSrc/utils/test-utils' import { ApiEndpoints } from 'uiSrc/constants' import { OAUTH_CLOUD_CAPI_KEYS_DATA } from 'uiSrc/mocks/data/oauth' @@ -16,16 +16,22 @@ export const CLOUD_ME_DATA_MOCK = { data: {}, } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetch cloud capi keys - rest.get(getMswURL(ApiEndpoints.CLOUD_CAPI_KEYS), async (_req, res, ctx) => - res(ctx.status(200), ctx.json(OAUTH_CLOUD_CAPI_KEYS_DATA)), - ), + http.get(getMswURL(ApiEndpoints.CLOUD_CAPI_KEYS), async () => { + return HttpResponse.json(OAUTH_CLOUD_CAPI_KEYS_DATA, { status: 200 }) + }), // fetch user profile - rest.get(getMswURL(ApiEndpoints.CLOUD_ME), async (_req, res, ctx) => - res(ctx.status(200), ctx.json(CLOUD_ME_DATA_MOCK)), - ), + http.get(getMswURL(ApiEndpoints.CLOUD_ME), async () => { + return HttpResponse.json(CLOUD_ME_DATA_MOCK, { status: 200 }) + }), + http.get(getMswURL(ApiEndpoints.CLOUD_SUBSCRIPTION_PLANS), async () => { + return HttpResponse.json(CLOUD_ME_DATA_MOCK, { status: 200 }) + }), + http.post(getMswURL(ApiEndpoints.CLOUD_ME_JOBS), async () => { + return HttpResponse.json(CLOUD_ME_DATA_MOCK, { status: 200 }) + }), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/oauth/index.ts b/redisinsight/ui/src/mocks/handlers/oauth/index.ts index 5f7f4b401f..28ed0859ec 100644 --- a/redisinsight/ui/src/mocks/handlers/oauth/index.ts +++ b/redisinsight/ui/src/mocks/handlers/oauth/index.ts @@ -1,6 +1,6 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import cloud from './cloud' -const handlers: RestHandler>[] = [].concat(cloud) +const handlers: HttpHandler[] = [...cloud] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/rdi/index.ts b/redisinsight/ui/src/mocks/handlers/rdi/index.ts index 8307bf5c42..2d38ab7bd4 100644 --- a/redisinsight/ui/src/mocks/handlers/rdi/index.ts +++ b/redisinsight/ui/src/mocks/handlers/rdi/index.ts @@ -1,11 +1,8 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import rdiHandler from './rdiHandler' import rdiStrategiesHandler from './rdiPipelineStrategiesHandlers' // @ts-ignore -const handlers: RestHandler>[] = [].concat( - rdiHandler, - rdiStrategiesHandler, -) +const handlers: HttpHandler[] = [...rdiHandler, ...rdiStrategiesHandler] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/rdi/rdiHandler.ts b/redisinsight/ui/src/mocks/handlers/rdi/rdiHandler.ts index 7be4f7c50e..bf85f3ab89 100644 --- a/redisinsight/ui/src/mocks/handlers/rdi/rdiHandler.ts +++ b/redisinsight/ui/src/mocks/handlers/rdi/rdiHandler.ts @@ -1,45 +1,56 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' import { ApiEndpoints } from 'uiSrc/constants' -import { Rdi as RdiInstanceResponse } from 'apiSrc/modules/rdi/models/rdi' -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetch rdi instances - rest.get( - getMswURL(getUrl(ApiEndpoints.RDI_INSTANCES)), - async (_req, res, ctx) => - res( - ctx.status(200), - ctx.json([ - { - id: '1', - name: 'My first integration', - url: 'redis-12345.c253.us-central1-1.gce.cloud.redislabs.com:12345', - lastConnection: new Date(), - version: '1.2', - type: 'api', - username: 'user', - }, - ]), - ), + http.get(getMswURL(getUrl(ApiEndpoints.RDI_INSTANCES)), async () => { + return HttpResponse.json( + [ + { + id: '1', + name: 'My first integration', + url: 'redis-12345.c253.us-central1-1.gce.cloud.redislabs.com:12345', + lastConnection: new Date(), + version: '1.2', + type: 'api', + username: 'user', + }, + ], + { status: 200 }, + ) + }), + http.get( + getMswURL(`/${ApiEndpoints.RDI_INSTANCES}/:id/pipeline`), + async () => { + return HttpResponse.json( + { + jobs: [ + { name: 'job1', value: 'value' }, + { name: 'job2', value: 'value' }, + ], + config: { field: 'value' }, + }, + { status: 200 }, + ) + }, ), // create rdi instance - rest.post(getMswURL(ApiEndpoints.RDI_INSTANCES), async (_req, res, ctx) => - res(ctx.status(200), ctx.json({})), - ), + http.post(getMswURL(ApiEndpoints.RDI_INSTANCES), async () => { + return HttpResponse.json({}, { status: 200 }) + }), // update rdi instance - rest.patch( - getMswURL(getUrl('1', ApiEndpoints.RDI_INSTANCES)), - async (_req, res, ctx) => res(ctx.status(200), ctx.json({})), - ), + http.patch(getMswURL(getUrl('1', ApiEndpoints.RDI_INSTANCES)), async () => { + return HttpResponse.json({}, { status: 200 }) + }), // delete rdi instance - rest.delete(getMswURL(ApiEndpoints.RDI_INSTANCES), async (_req, res, ctx) => - res(ctx.status(200), ctx.json({})), - ), + http.delete(getMswURL(ApiEndpoints.RDI_INSTANCES), async () => { + return HttpResponse.json({}, { status: 200 }) + }), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/rdi/rdiPipelineStrategiesHandlers.ts b/redisinsight/ui/src/mocks/handlers/rdi/rdiPipelineStrategiesHandlers.ts index bc27841b0b..429f2b5b02 100644 --- a/redisinsight/ui/src/mocks/handlers/rdi/rdiPipelineStrategiesHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/rdi/rdiPipelineStrategiesHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { getMswURL } from 'uiSrc/utils/test-utils' import { getRdiUrl } from 'uiSrc/utils' import { ApiEndpoints } from 'uiSrc/constants' @@ -38,12 +38,13 @@ const MOCK_RDI_STRATEGIES = { ], } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetch rdi strategies - rest.get( + http.get( getMswURL(getRdiUrl('rdiInstanceId', ApiEndpoints.RDI_PIPELINE_STRATEGIES)), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(MOCK_RDI_STRATEGIES)), + async () => { + return HttpResponse.json(MOCK_RDI_STRATEGIES, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/recommendations/index.ts b/redisinsight/ui/src/mocks/handlers/recommendations/index.ts index a3b1be2c99..1db07d6605 100644 --- a/redisinsight/ui/src/mocks/handlers/recommendations/index.ts +++ b/redisinsight/ui/src/mocks/handlers/recommendations/index.ts @@ -1,10 +1,7 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import recommendations from './recommendationsHandler' import readRecommendations from './recommendationsReadHandler' -const handlers: RestHandler>[] = [].concat( - recommendations, - readRecommendations, -) +const handlers: HttpHandler[] = [...recommendations, ...readRecommendations] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsHandler.ts b/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsHandler.ts index 52840f5d28..b9353f3eef 100644 --- a/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsHandler.ts +++ b/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsHandler.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' @@ -13,16 +13,19 @@ export const RECOMMENDATIONS_DATA_MOCK = { totalUnread: 1, } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // fetchRecommendationsAction - rest.get( + http.get( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.RECOMMENDATIONS)), - async (req, res, ctx) => - res(ctx.status(200), ctx.json(RECOMMENDATIONS_DATA_MOCK)), + async () => { + return HttpResponse.json(RECOMMENDATIONS_DATA_MOCK, { status: 200 }) + }, ), - rest.delete( + http.delete( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.RECOMMENDATIONS)), - async (req, res, ctx) => res(ctx.status(200)), + async () => { + return HttpResponse.text('', { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsReadHandler.ts b/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsReadHandler.ts index 199f2b8af4..50876d89cf 100644 --- a/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsReadHandler.ts +++ b/redisinsight/ui/src/mocks/handlers/recommendations/recommendationsReadHandler.ts @@ -1,8 +1,8 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' -import { Recommendation as RecommendationResponse } from 'apiSrc/modules/database-recommendations/models/recommendation' +import { DatabaseRecommendation as RecommendationResponse } from 'apiSrc/modules/database-recommendation/models/database-recommendation' import { INSTANCE_ID_MOCK } from '../instances/instancesHandlers' const EMPTY_RECOMMENDATIONS_MOCK = { @@ -10,12 +10,13 @@ const EMPTY_RECOMMENDATIONS_MOCK = { totalUnread: 0, } -const handlers: RestHandler[] = [ +const handlers: HttpHandler[] = [ // readRecommendationsAction - rest.patch( + http.patch( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.RECOMMENDATIONS_READ)), - async (req, res, ctx) => - res(ctx.status(200), ctx.json(EMPTY_RECOMMENDATIONS_MOCK)), + async () => { + return HttpResponse.json(EMPTY_RECOMMENDATIONS_MOCK, { status: 200 }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/tutorials/index.ts b/redisinsight/ui/src/mocks/handlers/tutorials/index.ts index c4579ea423..459dc153ad 100644 --- a/redisinsight/ui/src/mocks/handlers/tutorials/index.ts +++ b/redisinsight/ui/src/mocks/handlers/tutorials/index.ts @@ -1,9 +1,7 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import tutorials from './tutorialsHandlers' // @ts-ignore -const handlers: RestHandler>[] = [].concat( - tutorials, -) +const handlers: HttpHandler[] = [...tutorials] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/tutorials/tutorialsHandlers.ts b/redisinsight/ui/src/mocks/handlers/tutorials/tutorialsHandlers.ts index 1743552690..3cae2e1fbe 100644 --- a/redisinsight/ui/src/mocks/handlers/tutorials/tutorialsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/tutorials/tutorialsHandlers.ts @@ -1,15 +1,13 @@ -import { DefaultBodyType, MockedRequest, rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' -const handlers: RestHandler>[] = [ - rest.post(getMswURL(ApiEndpoints.CUSTOM_TUTORIALS), (_, res, ctx) => - res( - ctx.json({ - id: 'f79e82e8-c34a-4dc7-a49e-9fadc0979fda', - }), - ), - ), +const handlers: HttpHandler[] = [ + http.post(getMswURL(ApiEndpoints.CUSTOM_TUTORIALS), () => { + return HttpResponse.json({ + id: 'f79e82e8-c34a-4dc7-a49e-9fadc0979fda', + }) + }), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/user/index.ts b/redisinsight/ui/src/mocks/handlers/user/index.ts index 2a82a9fb3f..55004ce9b1 100644 --- a/redisinsight/ui/src/mocks/handlers/user/index.ts +++ b/redisinsight/ui/src/mocks/handlers/user/index.ts @@ -1,8 +1,6 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import userSettings from './userSettingsHandlers' -const handlers: RestHandler>[] = [].concat( - userSettings, -) +const handlers: HttpHandler[] = [...userSettings] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/user/userSettingsHandlers.ts b/redisinsight/ui/src/mocks/handlers/user/userSettingsHandlers.ts index 9dc0bc3433..4c21d97500 100644 --- a/redisinsight/ui/src/mocks/handlers/user/userSettingsHandlers.ts +++ b/redisinsight/ui/src/mocks/handlers/user/userSettingsHandlers.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' @@ -16,10 +16,15 @@ export const USER_SETTINGS_DATA_MOCK = { }, } -const handlers: RestHandler[] = [ - rest.get(getMswURL(ApiEndpoints.SETTINGS), async (_req, res, ctx) => - res(ctx.status(200), ctx.json(USER_SETTINGS_DATA_MOCK)), - ), +const apiSettings = getMswURL(ApiEndpoints.SETTINGS) + +const handlers: HttpHandler[] = [ + http.get(apiSettings, async () => { + return HttpResponse.json(USER_SETTINGS_DATA_MOCK, { status: 200 }) + }), + http.patch(apiSettings, async () => { + return HttpResponse.json(USER_SETTINGS_DATA_MOCK, { status: 200 }) + }), ] export default handlers diff --git a/redisinsight/ui/src/mocks/handlers/workbench/commands.ts b/redisinsight/ui/src/mocks/handlers/workbench/commands.ts index 2f197b93fa..85e0ff0548 100644 --- a/redisinsight/ui/src/mocks/handlers/workbench/commands.ts +++ b/redisinsight/ui/src/mocks/handlers/workbench/commands.ts @@ -1,4 +1,4 @@ -import { rest, RestHandler } from 'msw' +import { http, HttpHandler, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' @@ -6,13 +6,16 @@ import { CommandExecution } from 'uiSrc/slices/interfaces' import { commandExecutionFactory } from 'uiSrc/mocks/factories/workbench/commandExectution.factory' import { INSTANCE_ID_MOCK } from '../instances/instancesHandlers' -const handlers: RestHandler[] = [ - rest.post( +const handlers: HttpHandler[] = [ + http.post( getMswURL( getUrl(INSTANCE_ID_MOCK, ApiEndpoints.WORKBENCH_COMMAND_EXECUTIONS), ), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(commandExecutionFactory.buildList(1))), + async () => { + return HttpResponse.json(commandExecutionFactory.buildList(1), { + status: 200, + }) + }, ), ] diff --git a/redisinsight/ui/src/mocks/handlers/workbench/index.ts b/redisinsight/ui/src/mocks/handlers/workbench/index.ts index 85701ab6a7..b55ba3bdf0 100644 --- a/redisinsight/ui/src/mocks/handlers/workbench/index.ts +++ b/redisinsight/ui/src/mocks/handlers/workbench/index.ts @@ -1,8 +1,6 @@ -import { DefaultBodyType, MockedRequest, RestHandler } from 'msw' +import { HttpHandler } from 'msw' import commands from './commands' -const handlers: RestHandler>[] = [].concat( - commands, -) +const handlers: HttpHandler[] = [...commands] export default handlers diff --git a/redisinsight/ui/src/mocks/res/responseComposition.ts b/redisinsight/ui/src/mocks/res/responseComposition.ts index 07d8ba08f8..55059a5405 100644 --- a/redisinsight/ui/src/mocks/res/responseComposition.ts +++ b/redisinsight/ui/src/mocks/res/responseComposition.ts @@ -1,8 +1,11 @@ -import { rest } from 'msw' +import { http, HttpResponse } from 'msw' import { DEFAULT_ERROR_MESSAGE } from 'uiSrc/utils' export const errorHandlers = [ - rest.all('*', (_req, res, ctx) => - res(ctx.status(500), ctx.json({ message: DEFAULT_ERROR_MESSAGE })), - ), + http.all('*', () => { + return HttpResponse.json( + { message: DEFAULT_ERROR_MESSAGE }, + { status: 500 }, + ) + }), ] diff --git a/redisinsight/ui/src/mocks/server.ts b/redisinsight/ui/src/mocks/server.ts index ada76a1ced..7df6b7a00b 100644 --- a/redisinsight/ui/src/mocks/server.ts +++ b/redisinsight/ui/src/mocks/server.ts @@ -1,5 +1,17 @@ import { setupServer } from 'msw/node' +import { http, HttpResponse } from 'msw' import { handlers } from './handlers' // Setup requests interception using the given handlers. -export const mswServer = setupServer(...handlers) +export const mswServer = setupServer( + ...handlers, + http.all( + '*', + jest + .fn() + .mockImplementation(async ({ request }) => { + console.warn(`[MSW] Unhandled request: ${request.method} ${request.url}`) + return HttpResponse.json({}, { status: 200 }) + }), + ), +) diff --git a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummaryButton/BulkDeleteSummaryButton.spec.tsx b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummaryButton/BulkDeleteSummaryButton.spec.tsx index ff2ba0a6f0..b62efe4866 100644 --- a/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummaryButton/BulkDeleteSummaryButton.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummaryButton/BulkDeleteSummaryButton.spec.tsx @@ -2,12 +2,9 @@ import React from 'react' import { render, screen } from '@testing-library/react' import BulkDeleteSummaryButton from './BulkDeleteSummaryButton' -const readBlobContent = (blob: Blob) => - new Promise((resolve) => { - const reader = new FileReader() - reader.onload = () => resolve(reader.result) - reader.readAsText(blob) - }) +const readBlobContent = async (blob: Blob): Promise => { + return blob.text() +} const defaultRenderProps = { pattern: 'test-pattern', diff --git a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx index b73c20e8b8..5bc3637c6a 100644 --- a/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.spec.tsx @@ -2,7 +2,7 @@ import { cloneDeep, set } from 'lodash' import React from 'react' import { cleanup, - clearStoreActions, + expectActionsToContain, fireEvent, initialStateDefault, mockedStore, @@ -68,10 +68,13 @@ describe('FilterKeyType', () => { await userEvent.click(screen.getByTestId(filterSelectId)) await userEvent.click(await findByText('Hash')) - const expectedActions = [setFilter(KeyTypes.Hash), resetBrowserTree(), loadKeys()] - expect(clearStoreActions(store.getActions())).toEqual( - clearStoreActions(expectedActions), - ) + const expectedActions = [ + setFilter(KeyTypes.Hash), + resetBrowserTree(), + loadKeys(), + ] + + expectActionsToContain(store.getActions(), expectedActions) }) it('should be disabled filter with database redis version < 6.0', () => { diff --git a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx index 516b5c50d8..43a9a08f63 100644 --- a/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx +++ b/redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.spec.tsx @@ -1,4 +1,4 @@ -import { cloneDeep } from 'lodash' +import { merge } from 'lodash' import React from 'react' import { instance, mock } from 'ts-mockito' import { useSelector } from 'react-redux' @@ -7,13 +7,16 @@ import { cleanup, clearStoreActions, fireEvent, + initialStateDefault, mockedStore, + mockStore, render, screen, userEvent, } from 'uiSrc/utils/test-utils' import { loadList, + loadListSuccess, redisearchListSelector, setSelectedIndex, } from 'uiSrc/slices/browser/redisearch' @@ -25,11 +28,25 @@ import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { changeSearchMode, fetchKeys } from 'uiSrc/slices/browser/keys' import { BrowserStorageItem } from 'uiSrc/constants' import RediSearchIndexesList, { Props } from './RediSearchIndexesList' +import { INSTANCE_ID_MOCK } from 'uiSrc/mocks/handlers/instances/instancesHandlers' +import { setStoreRef } from 'uiSrc/utils/test-store' +import { REDISEARCH_LIST_DATA_MOCK } from 'uiSrc/mocks/handlers/browser/redisearchHandlers' let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = mockStore( + merge({}, initialStateDefault, { + connections: { + instances: { + connectedInstance: { + id: INSTANCE_ID_MOCK, + }, + }, + }, + }), + ) + setStoreRef(store) store.clearActions() }) @@ -74,6 +91,10 @@ jest.mock('uiSrc/services', () => ({ }, })) +const renderRediSearchIndexesList = (props: Props) => { + return render(, { store }) +} + describe('RediSearchIndexesList', () => { beforeEach(() => { const state: any = store.getState() @@ -109,9 +130,7 @@ describe('RediSearchIndexesList', () => { }) it('should render', () => { - expect( - render(), - ).toBeTruthy() + expect(renderRediSearchIndexesList(instance(mockedProps))).toBeTruthy() const searchInput = screen.getByTestId('select-search-mode') expect(searchInput).toBeInTheDocument() }) @@ -123,9 +142,7 @@ describe('RediSearchIndexesList', () => { modules: [], })) - expect( - render(), - ).toBeTruthy() + expect(renderRediSearchIndexesList(instance(mockedProps))).toBeTruthy() const expectedActions = [ changeSearchMode(SearchMode.Pattern), @@ -143,9 +160,7 @@ describe('RediSearchIndexesList', () => { }) it('"loadList" should be called after render', () => { - const { rerender } = render( - , - ) + const { rerender } = renderRediSearchIndexesList(instance(mockedProps)) ;(connectedInstanceSelector as jest.Mock).mockImplementation(() => ({ host: '123.23.1.1', @@ -162,12 +177,10 @@ describe('RediSearchIndexesList', () => { it('"onCreateIndex" should be called after click Create Index', async () => { const onCreateIndexMock = jest.fn() - const { findByText } = render( - , - ) + const { findByText } = renderRediSearchIndexesList({ + ...instance(mockedProps), + onCreateIndex: onCreateIndexMock, + }) await userEvent.click(screen.getByTestId('select-search-mode')) await userEvent.click((await findByText('Create Index')) || document) @@ -187,9 +200,7 @@ describe('RediSearchIndexesList', () => { selectedIndex: null, }) - const { queryByText } = render( - , - ) + const { queryByText } = renderRediSearchIndexesList(instance(mockedProps)) ;(connectedInstanceSelector as jest.Mock).mockImplementation(() => ({ host: '123.123.1.1', @@ -199,7 +210,11 @@ describe('RediSearchIndexesList', () => { await userEvent.click(screen.getByTestId('select-search-mode')) await userEvent.click(queryByText(bufferToString(index)) || document) - const expectedActions = [setSelectedIndex(index), loadList()] + const expectedActions = [ + setSelectedIndex(index), + loadList(), + loadListSuccess(REDISEARCH_LIST_DATA_MOCK.indexes), + ] expect(clearStoreActions(store.getActions())).toEqual( clearStoreActions(expectedActions), @@ -214,7 +229,7 @@ describe('RediSearchIndexesList', () => { modules: [{ name: RedisDefaultModules.Search }], })) - render() + renderRediSearchIndexesList(instance(mockedProps)) const afterRenderActions = [...store.getActions()] diff --git a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/styles.module.scss b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/styles.module.scss index 6fbdc7109e..7612d653e4 100644 --- a/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/styles.module.scss +++ b/redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/styles.module.scss @@ -1,4 +1,5 @@ .container { max-height: 234px; scroll-padding-bottom: 60px; + padding: 18px; } diff --git a/redisinsight/ui/src/pages/cluster-details/ClusterDetailsPage.spec.tsx b/redisinsight/ui/src/pages/cluster-details/ClusterDetailsPage.spec.tsx index a5d2bd9609..95feebed70 100644 --- a/redisinsight/ui/src/pages/cluster-details/ClusterDetailsPage.spec.tsx +++ b/redisinsight/ui/src/pages/cluster-details/ClusterDetailsPage.spec.tsx @@ -38,7 +38,7 @@ describe('ClusterDetailsPage', () => { }) it('should call fetchClusterDetailsAction after rendering', async () => { - await act(() => { + await act(async () => { render() }) diff --git a/redisinsight/ui/src/pages/home/components/add-database-screen/AddDatabaseScreen.spec.tsx b/redisinsight/ui/src/pages/home/components/add-database-screen/AddDatabaseScreen.spec.tsx index cb99791219..59d510b202 100644 --- a/redisinsight/ui/src/pages/home/components/add-database-screen/AddDatabaseScreen.spec.tsx +++ b/redisinsight/ui/src/pages/home/components/add-database-screen/AddDatabaseScreen.spec.tsx @@ -8,6 +8,7 @@ import { mockedStore, cleanup, act, + expectActionsToContain, } from 'uiSrc/utils/test-utils' import { defaultInstanceChanging } from 'uiSrc/slices/instances/instances' @@ -35,7 +36,7 @@ describe('AddDatabaseScreen', () => { fireEvent.click(screen.getByTestId('btn-submit')) }) - expect(store.getActions()).toEqual([defaultInstanceChanging()]) + expectActionsToContain(store.getActions(), [defaultInstanceChanging()]) }) it('should disable test connection and submit buttons when connection url is invalid', async () => { diff --git a/redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.stories.tsx b/redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.stories.tsx new file mode 100644 index 0000000000..ce4af9fb91 --- /dev/null +++ b/redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.stories.tsx @@ -0,0 +1,76 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import { ConnectionType, Instance } from 'uiSrc/slices/interfaces' +import DatabasesListWrapper from './DatabasesListWrapper' + +const mockInstances: Instance[] = [ + { + id: 'e37cc441-a4f2-402c-8bdb-fc2413cbbaff', + host: 'localhost', + port: 6379, + name: 'localhost', + username: null, + password: null, + connectionType: ConnectionType.Standalone, + nameFromProvider: null, + new: true, + modules: [], + version: null, + lastConnection: new Date('2021-04-22T09:03:56.917Z'), + provider: 'provider', + }, + { + id: 'a0db1bc8-a353-4c43-a856-b72f4811d2d4', + host: 'localhost', + port: 12000, + name: 'oea123123', + username: null, + password: null, + connectionType: ConnectionType.Standalone, + nameFromProvider: null, + tls: true, + modules: [], + version: null, + }, +] + +const meta = { + component: DatabasesListWrapper, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + instances: mockInstances, + loading: false, + editedInstance: null, + onEditInstance: () => {}, + onDeleteInstances: () => {}, + onManageInstanceTags: () => {}, + }, +} + +export const Loading: Story = { + args: { + instances: [], + loading: true, + editedInstance: null, + onEditInstance: () => {}, + onDeleteInstances: () => {}, + onManageInstanceTags: () => {}, + }, +} + +export const Empty: Story = { + args: { + instances: [], + loading: false, + editedInstance: null, + onEditInstance: () => {}, + onDeleteInstances: () => {}, + onManageInstanceTags: () => {}, + }, +} diff --git a/redisinsight/ui/src/pages/home/components/db-status/DbStatus.spec.tsx b/redisinsight/ui/src/pages/home/components/db-status/DbStatus.spec.tsx index 022736c619..a93689d4ab 100644 --- a/redisinsight/ui/src/pages/home/components/db-status/DbStatus.spec.tsx +++ b/redisinsight/ui/src/pages/home/components/db-status/DbStatus.spec.tsx @@ -18,8 +18,22 @@ jest.mock('uiSrc/telemetry', () => ({ const mockedProps = mock() const daysToMs = (days: number) => days * 60 * 60 * 24 * 1000 +let mockDate: Date describe('DbStatus', () => { + beforeEach(() => { + jest.clearAllMocks() + + // Set up fake timers + jest.useFakeTimers() + mockDate = new Date('2024-11-22T12:00:00Z') + jest.setSystemTime(mockDate) + }) + + afterEach(() => { + jest.useRealTimers() + }) + it('should render', () => { expect(render()).toBeTruthy() }) @@ -108,7 +122,7 @@ describe('DbStatus', () => { await waitForRiTooltipVisible(1_000) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.CLOUD_NOT_USED_DB_NOTIFICATION_VIEWED, eventData: { capability: expect.any(String), diff --git a/redisinsight/ui/src/pages/home/components/db-status/DbStatus.tsx b/redisinsight/ui/src/pages/home/components/db-status/DbStatus.tsx index 45312c3e9b..d6768e97fe 100644 --- a/redisinsight/ui/src/pages/home/components/db-status/DbStatus.tsx +++ b/redisinsight/ui/src/pages/home/components/db-status/DbStatus.tsx @@ -88,7 +88,10 @@ const DbStatus = (props: Props) => { ) if (isFree && daysDiff >= LAST_CONNECTION_L) { - return renderWarningTooltip(CHECK_CLOUD_DATABASE, 'checkIfDeleted') + return renderWarningTooltip( + CHECK_CLOUD_DATABASE, + WarningTypes.CheckIfDeleted, + ) } if (isFree && daysDiff >= LAST_CONNECTION_SM) { diff --git a/redisinsight/ui/src/pages/instance/instanceConnectionLost.spec.tsx b/redisinsight/ui/src/pages/instance/instanceConnectionLost.spec.tsx index 310a90ee94..89b1569902 100644 --- a/redisinsight/ui/src/pages/instance/instanceConnectionLost.spec.tsx +++ b/redisinsight/ui/src/pages/instance/instanceConnectionLost.spec.tsx @@ -1,7 +1,7 @@ import React from 'react' import { fireEvent, screen, waitFor, within } from '@testing-library/react' -import { cloneDeep, set } from 'lodash' -import { rest } from 'msw' +import { cloneDeep } from 'lodash' +import { http, HttpResponse } from 'msw' import { mswServer } from 'uiSrc/mocks/server' import { getMswURL, @@ -54,17 +54,17 @@ describe('instanceConnectionLost', () => { ) mswServer.use( - rest.get( + http.get( getMswURL(`${ApiEndpoints.DATABASES}/instanceId/overview`), - async (_, res, ctx) => { + async () => { if (type === 'error') { - return res( - ctx.status(503), - ctx.json({ error: 'test', code: 'serviceUnavailable' }), + return HttpResponse.json( + { error: 'test', code: 'serviceUnavailable' }, + { status: 503 }, ) } - return res(ctx.status(200), ctx.json(INSTANCES_MOCK)) + return HttpResponse.json(INSTANCES_MOCK, { status: 200 }) }, ), ) diff --git a/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.spec.tsx b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.spec.tsx index 4bc3e2032b..734bc01319 100644 --- a/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.spec.tsx @@ -1,7 +1,6 @@ import { EuiInMemoryTable } from '@elastic/eui' import React from 'react' import { instance, mock } from 'ts-mockito' -import { cloneDeep } from 'lodash' import ItemList, { Props as ItemListProps, @@ -9,17 +8,17 @@ import ItemList, { import { RdiInstance } from 'uiSrc/slices/interfaces' import { TelemetryEvent, sendEventTelemetry } from 'uiSrc/telemetry' import { - act, cleanup, - fireEvent, + createMockedStore, mockedStore, render, screen, + userEvent, } from 'uiSrc/utils/test-utils' import { - resetConnectedInstance, setDefaultInstance, + setDefaultInstanceSuccess, } from 'uiSrc/slices/rdi/instances' import RdiInstancesListWrapper, { Props } from './RdiInstancesListWrapper' @@ -115,19 +114,20 @@ const mockRdiInstancesList = (props: ItemListProps) => { let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() }) +const renderRdiInstancesListWrapper = (props: Props) => + render(, { store }) + describe('RdiInstancesListWrapper', () => { beforeAll(() => { ;(ItemList as jest.Mock).mockImplementation(mockRdiInstancesList) }) it('should render', () => { - expect( - render(), - ).toBeTruthy() + expect(renderRdiInstancesListWrapper(instance(mockedProps))).toBeTruthy() }) it('should call proper telemetry on delete multiple instances', async () => { @@ -135,11 +135,9 @@ describe('RdiInstancesListWrapper', () => { ;(sendEventTelemetry as jest.Mock).mockImplementation( () => sendEventTelemetryMock, ) - render() + renderRdiInstancesListWrapper(instance(mockedProps)) - await act(() => { - fireEvent.click(screen.getByTestId('onDelete-btn')) - }) + await userEvent.click(screen.getByTestId('onDelete-btn')) expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.RDI_INSTANCE_MULTIPLE_DELETE_CLICKED, @@ -151,13 +149,11 @@ describe('RdiInstancesListWrapper', () => { }) it('should call proper action on rdi alias click', async () => { - render() + renderRdiInstancesListWrapper(instance(mockedProps)) - await act(() => { - fireEvent.click(screen.getByTestId('rdi-alias-1')) - }) + await userEvent.click(screen.getByTestId('rdi-alias-1')) - const expectedActions = [setDefaultInstance()] + const expectedActions = [setDefaultInstance(), setDefaultInstanceSuccess()] expect(store.getActions()).toEqual(expectedActions) }) @@ -167,12 +163,10 @@ describe('RdiInstancesListWrapper', () => { ;(sendEventTelemetry as jest.Mock).mockImplementation( () => sendEventTelemetryMock, ) - render() + renderRdiInstancesListWrapper(instance(mockedProps)) - await act(() => { - const copyHostPortButtons = screen.getAllByLabelText(/Copy url/i) - fireEvent.click(copyHostPortButtons[0]) - }) + const copyHostPortButtons = screen.getAllByLabelText(/Copy url/i) + await userEvent.click(copyHostPortButtons[0]) expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.RDI_INSTANCE_URL_COPIED, @@ -188,11 +182,9 @@ describe('RdiInstancesListWrapper', () => { ;(sendEventTelemetry as jest.Mock).mockImplementation( () => sendEventTelemetryMock, ) - render() + renderRdiInstancesListWrapper(instance(mockedProps)) - await act(() => { - fireEvent.click(screen.getByTestId('delete-instance-2-icon')) - }) + await userEvent.click(screen.getByTestId('delete-instance-2-icon')) expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.RDI_INSTANCE_SINGLE_DELETE_CLICKED, @@ -208,17 +200,13 @@ describe('RdiInstancesListWrapper', () => { ;(sendEventTelemetry as jest.Mock).mockImplementation( () => sendEventTelemetryMock, ) - render( - {}} - />, - ) - - await act(() => { - fireEvent.click(screen.getByTestId('onTableChange-btn')) + renderRdiInstancesListWrapper({ + ...instance(mockedProps), + onEditInstance: () => {}, }) + await userEvent.click(screen.getByTestId('onTableChange-btn')) + expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.RDI_INSTANCE_LIST_SORTED, eventData: { field: 'name', direction: 'asc' }, @@ -231,11 +219,9 @@ describe('RdiInstancesListWrapper', () => { ;(sendEventTelemetry as jest.Mock).mockImplementation( () => sendEventTelemetryMock, ) - render() + renderRdiInstancesListWrapper(instance(mockedProps)) - await act(() => { - fireEvent.click(screen.getByTestId('rdi-alias-1')) - }) + await userEvent.click(screen.getByTestId('rdi-alias-1')) expect(sendEventTelemetry).toBeCalledWith({ event: TelemetryEvent.OPEN_RDI_CLICKED, diff --git a/redisinsight/ui/src/pages/rdi/instance/components/header/components/fetch-pipeline-popover/FetchPipelinePopover.spec.tsx b/redisinsight/ui/src/pages/rdi/instance/components/header/components/fetch-pipeline-popover/FetchPipelinePopover.spec.tsx index fb16ece451..22b29fb269 100644 --- a/redisinsight/ui/src/pages/rdi/instance/components/header/components/fetch-pipeline-popover/FetchPipelinePopover.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/instance/components/header/components/fetch-pipeline-popover/FetchPipelinePopover.spec.tsx @@ -3,10 +3,12 @@ import { cloneDeep } from 'lodash' import { act, cleanup, + expectActionsToContain, fireEvent, mockedStore, render, screen, + userEvent, } from 'uiSrc/utils/test-utils' import { getPipeline, rdiPipelineSelector } from 'uiSrc/slices/rdi/pipeline' import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' @@ -57,9 +59,7 @@ describe('FetchPipelinePopover', () => { expect(screen.queryByTestId('confirm-btn')).not.toBeInTheDocument() - await act(() => { - fireEvent.click(screen.getByTestId('upload-pipeline-btn')) - }) + await userEvent.click(screen.getByTestId('upload-pipeline-btn')) expect(screen.queryByTestId('upload-confirm-btn')).toBeInTheDocument() }) @@ -67,16 +67,16 @@ describe('FetchPipelinePopover', () => { it('should call proper actions', async () => { render() - await act(() => { + await act(async () => { fireEvent.click(screen.getByTestId('upload-pipeline-btn')) }) - await act(() => { + await act(async () => { fireEvent.click(screen.getByTestId('upload-confirm-btn')) }) const expectedActions = [getPipeline()] - expect(store.getActions()).toEqual(expectedActions) + expectActionsToContain(store.getActions(), expectedActions) }) it('should call proper telemetry event', async () => { @@ -87,11 +87,11 @@ describe('FetchPipelinePopover', () => { render() - await act(() => { + await act(async () => { fireEvent.click(screen.getByTestId('upload-pipeline-btn')) }) - expect(sendEventTelemetry).toBeCalledWith({ + expect(sendEventTelemetry).toHaveBeenCalledWith({ event: TelemetryEvent.RDI_PIPELINE_UPLOAD_FROM_SERVER_CLICKED, eventData: { id: 'rdiInstanceId', diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx index b91809ba89..f4a7524479 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/PipelineManagementPage.spec.tsx @@ -1,10 +1,14 @@ import React from 'react' -import { cloneDeep } from 'lodash' import reactRouterDom, { BrowserRouter } from 'react-router-dom' import { instance, mock } from 'ts-mockito' import { useFormikContext } from 'formik' -import { render, cleanup, mockedStore } from 'uiSrc/utils/test-utils' +import { + render, + cleanup, + mockedStore, + createMockedStore, +} from 'uiSrc/utils/test-utils' import { appContextPipelineManagement, setLastPageContext, @@ -29,10 +33,18 @@ jest.mock('formik') let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() }) +const renderPipelineManagement = (props: Props) => + render( + + + , + { store }, + ) + describe('PipelineManagementPage', () => { beforeEach(() => { const mockUseFormikContext = { @@ -43,13 +55,7 @@ describe('PipelineManagementPage', () => { }) it('should render', () => { - expect( - render( - - - , - ), - ).toBeTruthy() + expect(renderPipelineManagement(instance(mockedProps))).toBeTruthy() }) it('should redirect to the config tab by default', () => { @@ -59,11 +65,7 @@ describe('PipelineManagementPage', () => { pathname: Pages.rdiPipelineManagement('rdiInstanceId'), }) - render( - - - , - ) + renderPipelineManagement(instance(mockedProps)) expect(pushMock).toBeCalledWith(Pages.rdiPipelineConfig('rdiInstanceId')) }) @@ -78,11 +80,7 @@ describe('PipelineManagementPage', () => { pathname: Pages.rdiPipelineManagement('rdiInstanceId'), }) - render( - - - , - ) + renderPipelineManagement(instance(mockedProps)) expect(pushMock).toBeCalledWith(Pages.rdiPipelineConfig('rdiInstanceId')) }) @@ -92,11 +90,7 @@ describe('PipelineManagementPage', () => { .fn() .mockReturnValue({ pathname: Pages.rdiPipelineConfig('rdiInstanceId') }) - const { unmount } = render( - - - , - ) + const { unmount } = renderPipelineManagement(instance(mockedProps)) unmount() const expectedActions = [ diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx index a2c7b605a5..2822c3e50d 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx @@ -6,7 +6,7 @@ import { render, fireEvent, screen, - initialStateDefault, + initialStateDefault, createMockedStore, } from 'uiSrc/utils/test-utils' import { getPipeline, @@ -69,7 +69,7 @@ jest.mock('uiSrc/components/base/display', () => { let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() ;(rdiPipelineSelector as jest.Mock).mockReturnValue({ ...initialStateDefault.rdi.pipeline, @@ -79,9 +79,11 @@ beforeEach(() => { }) }) +const renderSourcePipelineDialog = () => render(, { store }) + describe('SourcePipelineDialog', () => { it('should not show dialog by default and not set isOpenDialog to true', () => { - render() + renderSourcePipelineDialog() expect( screen.queryByTestId('file-source-pipeline-dialog'), @@ -96,7 +98,7 @@ describe('SourcePipelineDialog', () => { isOpenDialog: true, }) - render() + renderSourcePipelineDialog() expect( screen.queryByTestId('file-source-pipeline-dialog'), @@ -110,7 +112,7 @@ describe('SourcePipelineDialog', () => { data: { config: 'some config' }, }) - render() + renderSourcePipelineDialog() expect(store.getActions()).toEqual([]) }) @@ -122,7 +124,7 @@ describe('SourcePipelineDialog', () => { data: null, }) - render() + renderSourcePipelineDialog() expect(store.getActions()).toEqual([]) }) @@ -134,7 +136,7 @@ describe('SourcePipelineDialog', () => { data: { config: '' }, }) - render() + renderSourcePipelineDialog() expect(store.getActions()).toEqual([setPipelineDialogState(true)]) }) @@ -153,7 +155,7 @@ describe('SourcePipelineDialog', () => { }) it('should call proper actions after select fetch from server option', () => { - render() + renderSourcePipelineDialog() fireEvent.click(screen.getByTestId('server-source-pipeline-dialog')) @@ -170,7 +172,7 @@ describe('SourcePipelineDialog', () => { }) it('should call proper actions after select empty pipeline option', () => { - render() + renderSourcePipelineDialog() fireEvent.click(screen.getByTestId('empty-source-pipeline-dialog')) @@ -199,7 +201,7 @@ describe('SourcePipelineDialog', () => { isOpenDialog: true, }) - render() + renderSourcePipelineDialog() fireEvent.click(screen.getByTestId('file-source-pipeline-dialog')) diff --git a/redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.spec.tsx b/redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.spec.tsx index b38148124a..d0b6d3ce06 100644 --- a/redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.spec.tsx +++ b/redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.spec.tsx @@ -3,19 +3,20 @@ import { cloneDeep } from 'lodash' import { instance, mock } from 'ts-mockito' import { - fireEvent, - render, + act, cleanup, + expectActionsToContain, + fireEvent, mockedStore, + render, screen, - act, } from 'uiSrc/utils/test-utils' import { getPipelineStrategies, rdiPipelineStrategiesSelector, } from 'uiSrc/slices/rdi/pipeline' import { RdiPipelineTabs } from 'uiSrc/slices/interfaces' -import { NO_TEMPLATE_LABEL, INGEST_OPTION } from './constants' +import { INGEST_OPTION, NO_TEMPLATE_LABEL } from './constants' import TemplateForm, { Props } from './TemplateForm' const mockedProps = mock() @@ -58,18 +59,17 @@ describe('TemplateForm', () => { fireEvent.click(screen.getByTestId('template-cancel-btn')) - expect(mockClosePopover).toBeCalled() + expect(mockClosePopover).toHaveBeenCalled() }) it('should fetch rdi strategies on initial', async () => { - await act(() => { + await act(async () => { render() }) const expectedActions = [getPipelineStrategies()] - expect(store.getActions().slice(0, expectedActions.length)).toEqual( - expectedActions, - ) + + expectActionsToContain(store.getActions(), expectedActions) }) it('apply btn should be disabled if there is any value', () => { diff --git a/redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.spec.tsx b/redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.spec.tsx index 824863e637..32c2f226bd 100644 --- a/redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.spec.tsx +++ b/redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.spec.tsx @@ -1,8 +1,8 @@ import React from 'react' -import { cloneDeep } from 'lodash' import { act, cleanup, + createMockedStore, fireEvent, mockedStore, render, @@ -34,7 +34,7 @@ jest.mock('uiSrc/slices/oauth/cloud', () => ({ let store: typeof mockedStore beforeEach(() => { cleanup() - store = cloneDeep(mockedStore) + store = createMockedStore() store.clearActions() }) @@ -43,13 +43,17 @@ jest.mock('uiSrc/telemetry', () => ({ sendEventTelemetry: jest.fn(), })) +const renderCloudSettings = () => { + return render(, { store }) +} + describe('CloudSettings', () => { it('should show delete popover and call proper action on delete', async () => { ;(oauthCapiKeysSelector as jest.Mock).mockReturnValue({ data: OAUTH_CLOUD_CAPI_KEYS_DATA, loading: false, }) - render() + renderCloudSettings() await userEvent.click(screen.getByTestId('delete-key-btn')) await waitForRiPopoverVisible() @@ -64,11 +68,11 @@ describe('CloudSettings', () => { }) it('should render', () => { - expect(render()).toBeTruthy() + expect(renderCloudSettings()).toBeTruthy() }) it('should get api keys after render', () => { - render() + renderCloudSettings() expect(store.getActions()).toEqual([getCapiKeys()]) }) @@ -79,7 +83,7 @@ describe('CloudSettings', () => { loading: false, }) - render() + renderCloudSettings() expect(screen.getByTestId('delete-key-btn')).toBeDisabled() }) @@ -92,7 +96,7 @@ describe('CloudSettings', () => { data: OAUTH_CLOUD_CAPI_KEYS_DATA, loading: false, }) - render() + renderCloudSettings() fireEvent.click(screen.getByTestId('delete-key-btn')) await waitForRiPopoverVisible() diff --git a/redisinsight/ui/src/pages/vector-search/manage-indexes/IndexSection.spec.tsx b/redisinsight/ui/src/pages/vector-search/manage-indexes/IndexSection.spec.tsx index e91a53b2f7..4e045db6c7 100644 --- a/redisinsight/ui/src/pages/vector-search/manage-indexes/IndexSection.spec.tsx +++ b/redisinsight/ui/src/pages/vector-search/manage-indexes/IndexSection.spec.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Provider } from 'react-redux' -import { rest } from 'msw' +import { http, HttpResponse } from 'msw' import { configureStore, combineReducers } from '@reduxjs/toolkit' import { mswServer } from 'uiSrc/mocks/server' import { @@ -130,9 +130,11 @@ describe('IndexSection', () => { // Override the MSW handler to return an error for this test mswServer.use( - rest.post( + http.post( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH_INFO)), - async (_req, res, ctx) => res(ctx.status(200), ctx.json(mockIndexInfo)), + async () => { + return HttpResponse.json(mockIndexInfo, { status: 200 }) + }, ), ) @@ -183,9 +185,11 @@ describe('IndexSection', () => { // Override the MSW handler to return an error for this test mswServer.use( - rest.post( + http.post( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH_INFO)), - async (_req, res, ctx) => res(ctx.status(200), ctx.json(mockIndexInfo)), + async () => { + return HttpResponse.json(mockIndexInfo, { status: 200 }) + }, ), ) @@ -344,16 +348,16 @@ describe('IndexSection', () => { it('should handle deletion failure gracefully', async () => { // Override the MSW handler to return an error for this test mswServer.use( - rest.delete( + http.delete( getMswURL(getUrl(INSTANCE_ID_MOCK, ApiEndpoints.REDISEARCH)), - async (_req, res, ctx) => - res( - ctx.status(500), - ctx.json({ + async () => + HttpResponse.json( + { error: 'Internal Server Error', statusCode: 500, message: 'Failed to delete index', - }), + }, + { status: 500 }, ), ), ) diff --git a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx index 9ab632376f..9329ca195e 100644 --- a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx +++ b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx @@ -1,5 +1,5 @@ /** - * @jest-environment jsdom + * @jest-environment jest-fixed-jsdom */ import React from 'react' import { render, screen, fireEvent } from 'uiSrc/utils/test-utils' diff --git a/redisinsight/ui/src/services/executeQuery.spec.ts b/redisinsight/ui/src/services/executeQuery.spec.ts index fa03231810..0315c4c8f6 100644 --- a/redisinsight/ui/src/services/executeQuery.spec.ts +++ b/redisinsight/ui/src/services/executeQuery.spec.ts @@ -1,9 +1,9 @@ -import { rest } from 'msw' +import { http, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { mswServer } from 'uiSrc/mocks/server' import { getMswURL } from 'uiSrc/utils/test-utils' import { getUrl } from 'uiSrc/utils' -import { RunQueryMode, ResultsMode } from 'uiSrc/slices/interfaces' +import { ResultsMode, RunQueryMode } from 'uiSrc/slices/interfaces' import executeQuery from './executeQuery' describe('executeQuery', () => { @@ -27,19 +27,19 @@ describe('executeQuery', () => { const mockResponse = [{ id: '1', databaseId: instanceId }] mswServer.use( - rest.post( + http.post( getMswURL( getUrl(instanceId, ApiEndpoints.WORKBENCH_COMMAND_EXECUTIONS), ), - async (req, res, ctx) => { - const body = await req.json() + async ({ request }) => { + const body = await request.json() expect(body).toEqual({ commands: [command], mode: RunQueryMode.ASCII, resultsMode: ResultsMode.Default, type: 'SEARCH', }) - return res(ctx.status(200), ctx.json(mockResponse)) + return HttpResponse.json(mockResponse, { status: 200 }) }, ), ) @@ -52,11 +52,13 @@ describe('executeQuery', () => { const mockResponse = [{ id: '1', databaseId: instanceId }] mswServer.use( - rest.post( + http.post( getMswURL( getUrl(instanceId, ApiEndpoints.WORKBENCH_COMMAND_EXECUTIONS), ), - async (_req, res, ctx) => res(ctx.status(200), ctx.json(mockResponse)), + async () => { + return HttpResponse.json(mockResponse, { status: 200 }) + }, ), ) @@ -69,11 +71,13 @@ describe('executeQuery', () => { it('invokes onFail and rethrows on error', async () => { mswServer.use( - rest.post( + http.post( getMswURL( getUrl(instanceId, ApiEndpoints.WORKBENCH_COMMAND_EXECUTIONS), ), - async (_req, res, ctx) => res(ctx.status(500)), + async () => { + return HttpResponse.text('', { status: 500 }) + }, ), ) diff --git a/redisinsight/ui/src/services/hooks/useLoadData.spec.ts b/redisinsight/ui/src/services/hooks/useLoadData.spec.ts index ba76b335cc..5840d731b8 100644 --- a/redisinsight/ui/src/services/hooks/useLoadData.spec.ts +++ b/redisinsight/ui/src/services/hooks/useLoadData.spec.ts @@ -1,5 +1,5 @@ -import { renderHook, act } from '@testing-library/react-hooks' -import { rest } from 'msw' +import { act, renderHook } from '@testing-library/react-hooks' +import { http, HttpResponse } from 'msw' import { ApiEndpoints } from 'uiSrc/constants' import { mswServer } from 'uiSrc/mocks/server' import { getMswURL } from 'uiSrc/utils/test-utils' @@ -33,17 +33,17 @@ describe('useLoadData', () => { } mswServer.use( - rest.post( + http.post( getMswURL( getUrl( instanceId, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (req, res, ctx) => { - const body = await req.json() + async ({ request }) => { + const body = await request.json() expect(body).toEqual({ collectionName }) - return res(ctx.status(200), ctx.json(mockResponse)) + return HttpResponse.json(mockResponse, { status: 200 }) }, ), ) @@ -68,16 +68,16 @@ describe('useLoadData', () => { }) mswServer.use( - rest.post( + http.post( getMswURL( getUrl( instanceId, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (_, res, ctx) => { + async () => { await requestPromise - return res(ctx.status(200), ctx.json(mockResponse)) + return HttpResponse.json(mockResponse, { status: 200 }) }, ), ) @@ -109,15 +109,16 @@ describe('useLoadData', () => { const errorMessage = 'Network error occurred' mswServer.use( - rest.post( + http.post( getMswURL( getUrl( instanceId, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (_, res, ctx) => - res(ctx.status(500), ctx.json({ message: errorMessage })), + async () => { + return HttpResponse.json({ message: errorMessage }, { status: 500 }) + }, ), ) @@ -141,19 +142,22 @@ describe('useLoadData', () => { // Mock first call to fail, second to succeed mswServer.use( - rest.post( + http.post( getMswURL( getUrl( instanceId, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (_, res, ctx) => { + async () => { callCount++ if (callCount === 1) { - return res(ctx.status(500), ctx.json({ message: 'Server error' })) + return HttpResponse.json( + { message: 'Server error' }, + { status: 500 }, + ) } - return res(ctx.status(200), ctx.json(mockResponse)) + return HttpResponse.json(mockResponse, { status: 200 }) }, ), ) @@ -186,17 +190,17 @@ describe('useLoadData', () => { let callCount = 0 mswServer.use( - rest.post( + http.post( getMswURL( getUrl( instanceId, ApiEndpoints.BULK_ACTIONS_IMPORT_VECTOR_COLLECTION, ), ), - async (_, res, ctx) => { + async () => { callCount++ const response = callCount === 1 ? mockResponse1 : mockResponse2 - return res(ctx.status(200), ctx.json(response)) + return HttpResponse.json(response, { status: 200 }) }, ), ) @@ -225,12 +229,12 @@ describe('useLoadData', () => { const requestBodies: any[] = [] mswServer.use( - rest.post( + http.post( '*/bulk-actions/import/vector-collection', - async (req, res, ctx) => { - const body = await req.json() + async ({ request }) => { + const body = await request.json() requestBodies.push(body) - return res(ctx.status(200), ctx.json(mockResponse)) + return HttpResponse.json(mockResponse, { status: 200 }) }, ), ) diff --git a/redisinsight/ui/src/setup-tests.ts b/redisinsight/ui/src/setup-tests.ts index 19a1417e53..0d03910326 100644 --- a/redisinsight/ui/src/setup-tests.ts +++ b/redisinsight/ui/src/setup-tests.ts @@ -15,14 +15,35 @@ class ResizeObserver { disconnect() {} } +class File extends Blob { + constructor(fileBits: any[], fileName: string, options?: any) { + super(fileBits, options) + this.name = fileName + } + + lastModified = Date.now() + + name = 'test-file' + + webkitRelativePath = '' +} + Object.defineProperty(window, 'ResizeObserver', { writable: true, configurable: true, value: ResizeObserver, }) +Object.defineProperty(window, 'File', { + writable: true, + configurable: true, + value: File, +}) + beforeAll(() => { - mswServer.listen() + mswServer.listen({ + onUnhandledRequest: 'bypass' + }) }) afterEach(() => { diff --git a/redisinsight/ui/src/slices/tests/app/connectivity.spec.ts b/redisinsight/ui/src/slices/tests/app/connectivity.spec.ts index 5ba9e95b6d..de539d652e 100644 --- a/redisinsight/ui/src/slices/tests/app/connectivity.spec.ts +++ b/redisinsight/ui/src/slices/tests/app/connectivity.spec.ts @@ -1,5 +1,5 @@ import { cloneDeep } from 'lodash' -import { rest } from 'msw' +import { http, HttpResponse } from 'msw' import { waitFor } from '@testing-library/react' import { cleanup, @@ -88,9 +88,11 @@ describe('app connectivity slice', () => { id: '123', // Match the test database ID } - const getDbOverviewMock = jest.fn((_req, res, ctx) => res(ctx.json({}))) + const getDbOverviewMock = jest.fn(() => { + return HttpResponse.json({}) + }) mswServer.use( - rest.get( + http.get( getMswURL(`${ApiEndpoints.DATABASES}/123/overview`), getDbOverviewMock, ), @@ -128,14 +130,14 @@ describe('app connectivity slice', () => { jest.spyOn(store, 'dispatch').mockImplementation((action: any) => { testStore.dispatch(action) }) - const getDbOverviewMock = jest.fn((_req, res, ctx) => - res( - ctx.status(503), - ctx.json({ code: 'serviceUnavailable', message: 'Test error' }), - ), - ) + const getDbOverviewMock = jest.fn(() => { + return HttpResponse.json( + { code: 'serviceUnavailable', message: 'Test error' }, + { status: 503 }, + ) + }) mswServer.use( - rest.get( + http.get( getMswURL(`${ApiEndpoints.DATABASES}/123/overview`), getDbOverviewMock, ), @@ -173,14 +175,15 @@ describe('app connectivity slice', () => { jest.spyOn(store, 'dispatch').mockImplementation((action: any) => { testStore.dispatch(action) }) - const getDbOverviewMock = jest.fn((_req, res, ctx) => - res( - ctx.status(503), - ctx.json({ code: 'serviceUnavailable', message: 'Test error' }), - ), - ) + + const getDbOverviewMock = jest.fn(async () => { + return HttpResponse.json( + { code: 'serviceUnavailable', message: 'Test error' }, + { status: 503 }, + ) + }) mswServer.use( - rest.get( + http.get( getMswURL(`${ApiEndpoints.DATABASES}/123/overview`), // ID 123 in URL getDbOverviewMock, ), diff --git a/redisinsight/ui/src/slices/tests/app/init.spec.ts b/redisinsight/ui/src/slices/tests/app/init.spec.ts index 8c54a82708..6f8ea0596a 100644 --- a/redisinsight/ui/src/slices/tests/app/init.spec.ts +++ b/redisinsight/ui/src/slices/tests/app/init.spec.ts @@ -1,5 +1,5 @@ import { cloneDeep } from 'lodash' -import { rest } from 'msw' +import { http, HttpResponse } from 'msw' import reducer, { appInitSelector, FAILED_TO_FETCH_CSRF_TOKEN_ERROR, @@ -131,9 +131,11 @@ describe('init slice', () => { it('failed to init data', async () => { mswServer.use( - rest.get<(typeof FEATURES_DATA_MOCK)[]>( + http.get( getMswURL(ApiEndpoints.FEATURES), - async (_req, res, ctx) => res(ctx.status(500)), + async () => { + return HttpResponse.text('', { status: 500 }) + }, ), ) @@ -152,11 +154,13 @@ describe('init slice', () => { }) it('failed to init csrf', async () => { - riConfig.api.csrfEndpoint = 'http://localhost/csrf' + riConfig.api.csrfEndpoint = 'csrf' mswServer.use( - rest.get( + http.get( getMswURL(riConfig.api.csrfEndpoint), - async (_req, res, ctx) => res(ctx.status(500)), + async () => { + return HttpResponse.text('', { status: 500 }) + }, ), ) @@ -167,7 +171,7 @@ describe('init slice', () => { const expectedActions = [ initializeAppState(), fetchCsrfToken(), - fetchCsrfTokenFail({ error: 'Network Error' }), + fetchCsrfTokenFail({ error: 'Request failed with status code 500' }), initializeAppStateFail({ error: FAILED_TO_FETCH_CSRF_TOKEN_ERROR }), ] @@ -189,10 +193,11 @@ describe('init slice', () => { // Arrange mswServer.use( - rest.get<(typeof FEATURES_DATA_MOCK)[]>( + http.get( getMswURL(ApiEndpoints.FEATURES), - async (_req, res, ctx) => - res(ctx.status(200), ctx.json(newFeatureFlags)), + async () => { + return HttpResponse.json(newFeatureFlags, { status: 200 }) + }, ), ) diff --git a/redisinsight/ui/src/utils/test-utils.tsx b/redisinsight/ui/src/utils/test-utils.tsx index 99af3ed33d..0bd9a3dca7 100644 --- a/redisinsight/ui/src/utils/test-utils.tsx +++ b/redisinsight/ui/src/utils/test-utils.tsx @@ -168,6 +168,11 @@ const initialStateDefault: RootState = { export const mockStore = configureMockStore([thunk]) export const mockedStore = mockStore(initialStateDefault) export const mockedStoreFn = () => mockStore(initialStateDefault) +export const createMockedStore = () => { + const store = mockStore(initialStateDefault) + setStoreRef(store) + return store +} // Set the mock store reference for the dynamic store wrapper // This ensures that store-dynamic works correctly in tests @@ -389,7 +394,7 @@ Object.defineProperty(window, 'sessionStorage', { value: sessionStorageMock }) const scrollIntoViewMock = jest.fn() window.HTMLElement.prototype.scrollIntoView = scrollIntoViewMock -const matchMediaMock = () => ({ +const matchMediaMock = (_: any) => ({ matches: false, addEventListener: jest.fn(), removeEventListener: jest.fn(), @@ -402,6 +407,7 @@ Object.defineProperty(window, 'matchMedia', { export const getMswResourceURL = (path: string = '') => RESOURCES_BASE_URL.concat(path) + export const getMswURL = (path: string = '') => apiService.defaults.baseURL?.concat( path.startsWith('/') ? path.slice(1) : path, @@ -441,6 +447,18 @@ export const mockFeatureFlags = ( }) } +/** + * Helper function to check if expected actions are contained within actual store actions + * @param actualActions - The actual actions dispatched to the store + * @param expectedActions - The expected actions that should be present + */ +const expectActionsToContain = ( + actualActions: any[], + expectedActions: any[], +) => { + expect(actualActions).toEqual(expect.arrayContaining(expectedActions)) +} + // re-export everything export * from '@testing-library/react' // override render method @@ -454,4 +472,5 @@ export { waitForRiTooltipVisible, waitForRiTooltipHidden, waitForRiPopoverVisible, + expectActionsToContain, } diff --git a/stories/Playground.mdx b/stories/Playground.mdx new file mode 100644 index 0000000000..6c10308879 --- /dev/null +++ b/stories/Playground.mdx @@ -0,0 +1,18 @@ +import * as PlaygroundStories from './playground/Playground.stories'; +import { Meta, Canvas } from '@storybook/addon-docs/blocks'; + + + +## Playground + +### Theme + + + +### Icons + + + +### Colors + + diff --git a/stories/Start.mdx b/stories/Start.mdx new file mode 100644 index 0000000000..5aebb1f32d --- /dev/null +++ b/stories/Start.mdx @@ -0,0 +1,10 @@ +import { Meta } from "@storybook/addon-docs/blocks"; + + + +## Start + +### Docs +Redis Insight is a visual tool that provides capabilities to design, develop, and optimize your Redis application. + +Query, analyse and interact with your Redis data. [Download it here](https://redis.io/insight/#insight-form)! diff --git a/stories/playground/Colors.tsx b/stories/playground/Colors.tsx new file mode 100644 index 0000000000..4a17e7727c --- /dev/null +++ b/stories/playground/Colors.tsx @@ -0,0 +1,174 @@ +import React, { useState } from 'react' +import styled from 'styled-components' +import { useTheme } from '@redis-ui/styles' +import { Col, Grid, Row } from 'uiSrc/components/base/layout/flex' +import { Text } from 'uiSrc/components/base/text' +import { Title } from 'uiSrc/components/base/text/Title' +import { type Theme as ThemeType } from 'uiSrc/components/base/theme/types' +import { ColorText } from 'uiSrc/components/base/text' +import SearchInput from 'uiSrc/components/base/inputs/SearchInput' + +const StyledColorContainer = styled(Col).attrs({ + gap: 'l', + justify: 'start', +})` + max-height: 600px; + height: 600px; + overflow-y: auto; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral300}; +` + +const StyledColorItem = styled(Col).attrs({ + gap: 's', + justify: 'center', + align: 'center', +})` + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral300}; + opacity: 0.8; + padding: 5px; + min-width: 100; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral500}; +` + +const ColorSquare = styled.div<{ + $color: any +}>` + width: 40px; + height: 40px; + border: 1px solid; + background-color: ${({ $color }) => $color}; +` +const ColorItem = ({ + color, + colorName, +}: { + color: string + colorName: string +}) => ( + + + {colorName} + + + + {color} + + +) +const ColorSectionTitle = ({ title }: { title: string }) => ( + + {title} + +) + +const ColorSection = ({ + title, + colors, +}: { + title: string + colors: [string, string][] +}) => ( + <> + + + {colors.map(([colorName, color]) => ( + + ))} + + +) + +export const Colors = () => { + const theme = useTheme() + const { color: rootColors, semantic } = theme + const { color: semanticColors } = semantic + const [search, setSearch] = useState('') + // Create regex pattern: each character from search with .* in between + // Escape special regex characters + const escapedSearch = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pattern = escapedSearch.split('').join('.*') + const regex = new RegExp(pattern, 'i') + let semanticCount = 0 + + const filteredSemanticColors = Object.keys(semanticColors).reduce( + (acc, colorSection) => { + const tempColors = semanticColors[colorSection as keyof typeof semanticColors] + Object.entries(tempColors).forEach(([colorName, color]) => { + if (!search || regex.test(colorName)) { + semanticCount++ + if (acc[colorSection] === undefined) { + acc[colorSection] = {} + } + acc[colorSection][colorName] = color + } + }) + return acc + }, + {} as Record>, + ) + const filteredRootColors = Object.entries(rootColors).filter( + ([colorName]) => { + if (!search) { + return true + } + // Create regex pattern: each character from search with .* in between + // Escape special regex characters + const escapedSearch = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pattern = escapedSearch.split('').join('.*') + const regex = new RegExp(pattern, 'i') + return regex.test(colorName) + }, + ) + + return ( + + + setSearch(value)} + value={search} + variant="underline" + /> + {search !== '' ? ( + + + {search} + + :  found {filteredRootColors.length + semanticCount}{' '} + colors + + ) : ( + {filteredRootColors.length + semanticCount} colors + )} + + + + + {Object.entries(filteredSemanticColors).map(([colorSection, colors]) => ( + + ))} + + ) +} diff --git a/stories/playground/Gallery.tsx b/stories/playground/Gallery.tsx new file mode 100644 index 0000000000..224e3cd065 --- /dev/null +++ b/stories/playground/Gallery.tsx @@ -0,0 +1,107 @@ +import React, { useState } from 'react' +import { FlexItem, Grid } from 'uiSrc/components/base/layout/flex' +import { AllIconsType, RiIcon } from 'uiSrc/components/base/icons/RiIcon' +import * as Icons from 'uiSrc/components/base/icons/iconRegistry' +import styled from 'styled-components' +import { Text } from 'uiSrc/components/base/text' +import { type Theme as ThemeType } from 'uiSrc/components/base/theme/types' +import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { SearchInput } from 'uiSrc/components/base/inputs' +import { ColorText } from '../../redisinsight/ui/src/components/base/text' + +const skip = [ + 'IconProps', + 'Icon', + 'IconSizeType', + 'IconColorType', + 'ColorIconProps', + 'MonochromeIconProps', + 'IconType', +] + +const StyledContainer = styled(Grid).attrs({ + columns: 3, + gap: 'm', + centered: true, + responsive: true, +})` + height: 600px; + width: 100%; + overflow-y: scroll; + flex-shrink: 0; + flex-grow: 0; + gap: 1rem; +` + +const StyledIcon = styled(FlexItem)` + height: 70px; + padding: 5px; + align-items: center; + justify-content: center; + gap: 1rem; + svg { + display: block; + } + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral300}; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral500}; +` + +export const Gallery = () => { + const [search, setSearch] = useState('') + const filteredIcons = Object.keys(Icons).filter((icon) => { + if (skip.includes(icon)) { + return false + } + if (!search) { + return true + } + // Create regex pattern: each character from search with .* in between + // Escape special regex characters + const escapedSearch = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + const pattern = escapedSearch.split('').join('.*') + const regex = new RegExp(pattern, 'i') + return regex.test(icon) + }) + return ( + + + setSearch(value)} + value={search} + variant="underline" + /> + {search !== '' ? ( + + + {search} + + :  found {filteredIcons.length} icons + + ) : ( + {filteredIcons.length} icons + )} + + + {filteredIcons.map((icon) => { + return ( + + + + {icon} + + + ) + })} + + + ) +} diff --git a/stories/playground/Playground.stories.tsx b/stories/playground/Playground.stories.tsx new file mode 100644 index 0000000000..3e43c7e83e --- /dev/null +++ b/stories/playground/Playground.stories.tsx @@ -0,0 +1,24 @@ +import React from 'react' +import { Meta, StoryObj } from '@storybook/react-vite' +import { PlaygroundPage } from './PlaygroundPage' +import { Theme } from './Theme' +import { Colors } from './Colors' +import { Gallery } from './Gallery' + +export default { + title: 'Playground', + component: PlaygroundPage, + tags: ['skip-test', '!autodocs', '!dev'], +} satisfies Meta + +export const ThemeStory: StoryObj = { + render: () => , +} + +export const ColorsStory: StoryObj = { + render: () => , +} + +export const GalleryStory: StoryObj = { + render: () => , +} diff --git a/stories/playground/PlaygroundPage.tsx b/stories/playground/PlaygroundPage.tsx new file mode 100644 index 0000000000..3ba82f03c5 --- /dev/null +++ b/stories/playground/PlaygroundPage.tsx @@ -0,0 +1,143 @@ +import React, { useState } from 'react' +import { Col, Row } from 'uiSrc/components/base/layout/flex' +import { Title } from 'uiSrc/components/base/text/Title' +import { Theme } from './Theme' +import { Gallery } from './Gallery' +import { Colors } from './Colors' +import styled, { ThemeProvider } from 'styled-components' +import { themeDark, themeLight, themeOld } from '@redis-ui/styles' +import { type Theme as ThemeType } from 'uiSrc/components/base/theme/types' +import { Text } from 'uiSrc/components/base/text' + +export const Container = styled(Row).attrs({ gap: 'm' })` + padding: 2rem; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100}; + max-width: 100%; +` +export const MainContent = styled(Col).attrs({ gap: 'xl', align: 'center' })` + flex-grow: 1; +` +const NavContainer = styled(Col).attrs({ gap: 'm', grow: false })` + height: 100%; + min-width: 200px; + background-color: rgb( + from + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100} + r g b / 0.75 + ); +` + +const NavContent = styled.ul` + position: sticky; + top: 10px; + z-index: 100; + list-style: none; + display: flex; + flex-direction: column; + gap: 10px; +` + +export const PlaygroundPage = () => { + const [uiTheme, setUiTheme] = useState(themeLight) + + return ( + + + + + Playground + + +
  • + +
  • +
  • + + Theme + +
  • +
  • + + Icons + +
  • +
  • + + Colors + +
  • +
    +
    + + + + Theme + + + + Icons + + + + Colors + + + + + + ) +} diff --git a/stories/playground/Theme.tsx b/stories/playground/Theme.tsx new file mode 100644 index 0000000000..028d13dee6 --- /dev/null +++ b/stories/playground/Theme.tsx @@ -0,0 +1,333 @@ +import React, { useMemo, useState } from 'react' +import styled, { css } from 'styled-components' +import { useTheme } from '@redis-ui/styles' +import ReactMonacoEditor from 'react-monaco-editor' +import { Col, Grid, Row } from 'uiSrc/components/base/layout/flex' +import Tabs, { TabInfo } from 'uiSrc/components/base/layout/tabs' +import { ColorText, Text, Title } from 'uiSrc/components/base/text' +import { RiTooltip } from 'uiSrc/components' +import MonacoEnvironmentInitializer from 'uiSrc/components/MonacoEnvironmentInitializer/MonacoEnvironmentInitializer' +import { type Theme as ThemeType } from 'uiSrc/components/base/theme/types' + +enum ThemeTabs { + raw = 'raw', + formatted = 'formatted', +} + +/** + * Converts a CSS value to pixels if it's not already in pixels + * @param value CSS value (e.g., '1rem', '10px', '50%') + * @returns The original value and the calculated pixel value if applicable + */ +const convertToPixels = (value: string) => { + // If it's already in pixels, return as is + if (value.endsWith('px')) { + return { original: value, pixels: value } + } + + // Handle rem values + if (value.endsWith('rem')) { + const remValue = parseFloat(value) + // Get the root font size (default to 16px if not set) + const rootFontSize = + parseFloat(getComputedStyle(document.documentElement).fontSize) || 16 + const pixelValue = remValue * rootFontSize + return { original: value, pixels: `${pixelValue.toFixed(2)}px` } + } + + // Handle em values (would need the element's font size) + // This is more complex as it depends on the parent element + + // For other units, return null for pixels + return { original: value, pixels: null } +} + +export const Theme = () => { + const theme = useTheme() + const monacoOptions = { + readOnly: true, + automaticLayout: true, + minimap: { + enabled: false, + }, + } + const [viewTab, setViewTab] = useState(ThemeTabs.raw) + const tabs: TabInfo[] = useMemo(() => { + const visibleTabs: TabInfo[] = [ + { + value: ThemeTabs.raw, + content: ( + + ), + label: ( + + Raw + + ), + }, + { + value: ThemeTabs.formatted, + content: ( + + + Name:  + <ColorText variant="semiBold" color="accent"> + {theme.name} + </ColorText> + + Core + Spaces + + Shadows + + Fonts + + + ), + label: ( + + Formatted + + ), + }, + ] + + return visibleTabs + }, [viewTab, theme.name]) + const handleTabChange = (id: string) => { + if (viewTab === id) return + setViewTab(id as ThemeTabs) + } + return ( + + + + + ) +} + +const FontFacesContainer = styled(Col).attrs({ + gap: 'l', + align: 'stretch', +})` + padding: 10px; + opacity: 0.8; + min-width: 200px; + flex-grow: 1; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100}; +` + +const StyledFontItem = styled.div` + flex-grow: 1; + padding: 10px; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral500}; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100}; +` + +const Fonts = ({ + fonts, +}: { + fonts: { + fontFamily: Record + fontSize: Record + } +}) => ( + + + Font faces + + {Object.entries(fonts.fontFamily).map(([name, value]) => ( + +
    +
    + + {name} + +
    +
    + + {value} + +
    +
    +
    + ))} + + Font sizes + + + {Object.entries(fonts.fontSize).map(([name, value]) => ( + + ))} +
    +) + +const FontItem = ({ + name, + value, + fontFaces, +}: { + name: string + value: string + fontFaces: Record +}) => { + const { pixels } = convertToPixels(value) + + return ( + +
    +
    + + {name} + +
    +
    + + {value} {pixels && `(${pixels})`} + + {Object.values(fontFaces).map((fontFace) => ( + + Sample text 0124 ,.;: + + ))} +
    +
    +
    + ) +} + +const ThemeContainer = styled(Grid).attrs({ + columns: 4, + gap: 'm', + centered: true, + responsive: true, +})` + padding: 10px; + flex-grow: 1; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100}; +` + +const Shadows = ({ shadows }: { shadows: Record }) => ( + + {Object.entries(shadows).map(([name, value]) => ( + + ))} + +) + +const StyledItemContainer = styled(Col).attrs({ + gap: 'l', + align: 'start', +})` + opacity: 0.8; + padding: 30px; + min-width: 200px; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral500}; + background-color: ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.background.neutral100}; +` +const StyledShadowItem = styled.div<{ + $value: string + children?: React.ReactNode +}>` + width: 100%; + height: 35px; + display: flex; + justify-content: center; + align-items: center; + background-color: transparent; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral500}; + box-shadow: ${({ $value }) => css` + ${$value} + `}; +` + +const ShadowItem = ({ name, value }: { name: string; value: string }) => { + return ( + + + + {name} + + + + ) +} + +const Spaces = ({ spaces }: { spaces: Record }) => ( + + {Object.entries(spaces).map(([name, value]) => ( + + ))} + +) +const StyledSpaceItem = styled.div` + width: 50px; + height: 15px; + background-color: transparent; + border: 1px solid + ${({ theme }: { theme: ThemeType }) => + theme.semantic.color.border.neutral800}; +` +const SpaceItem = ({ name, value }: { name: string; value: string }) => { + const { pixels } = convertToPixels(value) + + return ( + +
    +
    + + {name} + +
    +
    + + {value} {pixels && `(${pixels})`} + +
    +
    + + + + + +
    + ) +} diff --git a/yarn.lock b/yarn.lock index 36c7707888..00db30e016 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== -"@adobe/css-tools@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" - integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== +"@adobe/css-tools@^4.4.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" + integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -20,7 +20,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.7", "@babel/code-frame@^7.27.1": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== @@ -55,21 +55,21 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9": - version "7.25.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6" - integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9", "@babel/core@^7.28.0": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" + integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helpers" "^7.25.7" - "@babel/parser" "^7.25.8" - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.8" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.4" + "@babel/types" "^7.28.4" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -85,13 +85,13 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.25.7", "@babel/generator@^7.28.0", "@babel/generator@^7.7.2": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" - integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== +"@babel/generator@^7.25.0", "@babel/generator@^7.28.3", "@babel/generator@^7.7.2": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== dependencies: - "@babel/parser" "^7.28.0" - "@babel/types" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" @@ -103,7 +103,7 @@ dependencies: "@babel/types" "^7.27.3" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.2", "@babel/helper-compilation-targets@^7.25.7", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.2", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== @@ -168,14 +168,14 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.25.2", "@babel/helper-module-transforms@^7.25.7", "@babel/helper-module-transforms@^7.27.1": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== +"@babel/helper-module-transforms@^7.25.2", "@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== dependencies: "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" + "@babel/traverse" "^7.28.3" "@babel/helper-optimise-call-expression@^7.27.1": version "7.27.1" @@ -239,20 +239,20 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helpers@^7.25.0", "@babel/helpers@^7.25.7": - version "7.27.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" - integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== +"@babel/helpers@^7.25.0", "@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.27.6" + "@babel/types" "^7.28.4" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.8", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" - integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== dependencies: - "@babel/types" "^7.28.0" + "@babel/types" "^7.28.4" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": version "7.27.1" @@ -302,6 +302,15 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-decorators" "^7.24.7" +"@babel/plugin-proposal-decorators@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz#419c8acc31088e05a774344c021800f7ddc39bf0" + integrity sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-decorators" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" @@ -335,7 +344,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.7": +"@babel/plugin-syntax-decorators@^7.24.7", "@babel/plugin-syntax-decorators@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz#ee7dd9590aeebc05f9d4c8c0560007b05979a63d" integrity sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A== @@ -1057,7 +1066,7 @@ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== -"@babel/template@^7.25.0", "@babel/template@^7.25.7", "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": +"@babel/template@^7.25.0", "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== @@ -1066,23 +1075,23 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.25.2", "@babel/traverse@^7.25.7", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.4.5": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== +"@babel/traverse@^7.25.2", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.4.5": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" + integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" + "@babel/generator" "^7.28.3" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" + "@babel/parser" "^7.28.4" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" + "@babel/types" "^7.28.4" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.2", "@babel/types@^7.25.8", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.28.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9" - integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" @@ -1321,130 +1330,135 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== +"@esbuild/aix-ppc64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz#2ae33300598132cc4cf580dbbb28d30fed3c5c49" + integrity sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg== + +"@esbuild/android-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz#927708b3db5d739d6cb7709136924cc81bec9b03" + integrity sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ== + +"@esbuild/android-arm@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.11.tgz#571f94e7f4068957ec4c2cfb907deae3d01b55ae" + integrity sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg== + +"@esbuild/android-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.11.tgz#8a3bf5cae6c560c7ececa3150b2bde76e0fb81e6" + integrity sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g== + +"@esbuild/darwin-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz#0a678c4ac4bf8717e67481e1a797e6c152f93c84" + integrity sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w== + +"@esbuild/darwin-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz#70f5e925a30c8309f1294d407a5e5e002e0315fe" + integrity sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ== + +"@esbuild/freebsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz#4ec1db687c5b2b78b44148025da9632397553e8a" + integrity sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA== + +"@esbuild/freebsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz#4c81abd1b142f1e9acfef8c5153d438ca53f44bb" + integrity sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw== + +"@esbuild/linux-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz#69517a111acfc2b93aa0fb5eaeb834c0202ccda5" + integrity sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA== + +"@esbuild/linux-arm@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz#58dac26eae2dba0fac5405052b9002dac088d38f" + integrity sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw== + +"@esbuild/linux-ia32@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz#b89d4efe9bdad46ba944f0f3b8ddd40834268c2b" + integrity sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw== + +"@esbuild/linux-loong64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz#11f603cb60ad14392c3f5c94d64b3cc8b630fbeb" + integrity sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw== + +"@esbuild/linux-mips64el@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz#b7d447ff0676b8ab247d69dac40a5cf08e5eeaf5" + integrity sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ== + +"@esbuild/linux-ppc64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz#b3a28ed7cc252a61b07ff7c8fd8a984ffd3a2f74" + integrity sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw== + +"@esbuild/linux-riscv64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz#ce75b08f7d871a75edcf4d2125f50b21dc9dc273" + integrity sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww== + +"@esbuild/linux-s390x@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz#cd08f6c73b6b6ff9ccdaabbd3ff6ad3dca99c263" + integrity sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw== + +"@esbuild/linux-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz#3c3718af31a95d8946ebd3c32bb1e699bdf74910" + integrity sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ== + +"@esbuild/netbsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz#b4c767082401e3a4e8595fe53c47cd7f097c8077" + integrity sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg== + +"@esbuild/netbsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz#f2a930458ed2941d1f11ebc34b9c7d61f7a4d034" + integrity sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A== + +"@esbuild/openbsd-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz#b4ae93c75aec48bc1e8a0154957a05f0641f2dad" + integrity sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg== + +"@esbuild/openbsd-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz#b42863959c8dcf9b01581522e40012d2c70045e2" + integrity sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw== + +"@esbuild/openharmony-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz#b2e717141c8fdf6bddd4010f0912e6b39e1640f1" + integrity sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ== + +"@esbuild/sunos-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz#9fbea1febe8778927804828883ec0f6dd80eb244" + integrity sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA== + +"@esbuild/win32-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz#501539cedb24468336073383989a7323005a8935" + integrity sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q== + +"@esbuild/win32-ia32@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz#8ac7229aa82cef8f16ffb58f1176a973a7a15343" + integrity sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA== + +"@esbuild/win32-x64@0.25.11": + version "0.25.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz#5ecda6f3fe138b7e456f4e429edde33c823f392f" + integrity sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.7.0": version "4.7.0" @@ -1539,6 +1553,43 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@inquirer/ansi@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.1.tgz#994f7dd16a00c547a7b110e04bf4f4eca1857929" + integrity sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw== + +"@inquirer/confirm@^5.0.0": + version "5.1.19" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.19.tgz#bf28b420898999eb7479ab55623a3fbaf1453ff4" + integrity sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ== + dependencies: + "@inquirer/core" "^10.3.0" + "@inquirer/type" "^3.0.9" + +"@inquirer/core@^10.3.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.0.tgz#342e4fd62cbd33ea62089364274995dbec1f2ffe" + integrity sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA== + dependencies: + "@inquirer/ansi" "^1.0.1" + "@inquirer/figures" "^1.0.14" + "@inquirer/type" "^3.0.9" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.14.tgz#12a7bfd344a83ae6cc5d6004b389ed11f6db6be4" + integrity sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ== + +"@inquirer/type@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.9.tgz#f7f9696e9276e4e1ae9332767afb9199992e31d9" + integrity sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w== + "@isaacs/balanced-match@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" @@ -1771,6 +1822,15 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@joshwooding/vite-plugin-react-docgen-typescript@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz#f630b93ed13d5d07483c0ead42db793053b364a9" + integrity sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw== + dependencies: + glob "^10.0.0" + magic-string "^0.30.0" + react-docgen-typescript "^2.2.2" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.12" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" @@ -1779,6 +1839,14 @@ "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -1792,10 +1860,10 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" - integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -1805,10 +1873,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.21", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" - integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.21", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1842,6 +1910,13 @@ resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz#190d4663fa03688d85b31f415641c763cb376f29" integrity sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg== +"@mdx-js/react@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38" @@ -1872,27 +1947,17 @@ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407" integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ== -"@mswjs/cookies@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" - integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== +"@mswjs/interceptors@^0.39.1": + version "0.39.8" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.39.8.tgz#0a2cf4cf26a731214ca4156273121f67dff7ebf8" + integrity sha512-2+BzZbjRO7Ct61k8fMNHEtoKjeWI9pIlHFTqBwZ5icHpqszIgEZbjb1MW5Z0+bITTCTl3gk4PDBxs9tA/csXvA== dependencies: - "@types/set-cookie-parser" "^2.4.0" - set-cookie-parser "^2.4.6" - -"@mswjs/interceptors@^0.17.10": - version "0.17.10" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" - integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== - dependencies: - "@open-draft/until" "^1.0.3" - "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.8.3" - debug "^4.3.3" - headers-polyfill "3.2.5" - outvariant "^1.2.1" - strict-event-emitter "^0.2.4" - web-encoding "^1.1.5" + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -1938,10 +2003,23 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -2672,6 +2750,94 @@ resolved "https://registry.yarnpkg.com/@stablelib/snappy/-/snappy-1.0.2.tgz#ebc9875639dcc3d9cf847a10599a8ed4246e870d" integrity sha512-bROi7u2tJsTA4PQMpoI3Za33upkUqryXqWpYMxqoEAN6iW0/2icycoREgzNuzgSVpq6rIT98mc6tewnlTBXRwQ== +"@storybook/addon-a11y@^9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-9.1.11.tgz#4d856216f77aea4997a2731c65dc424143e8f0b5" + integrity sha512-cM0ermYo2wBIMPImcNIqayXvjhWnLguxClaFWxtsC6T3U2suC5lH6Y/8+znFJODqCWFWNnM1mDwWYVimufvYcg== + dependencies: + "@storybook/global" "^5.0.0" + axe-core "^4.2.0" + +"@storybook/addon-docs@^9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-9.1.11.tgz#b2353e635ae20f240c519af40b63e2f46afda91a" + integrity sha512-mui6s3CwH1Oj5/1+y+YDcttLUKdvkyghmUioB6L7Hsix2yv3J0ju6JXRo+hCYisvKaPvLS7+1xQAd0mgYKKanA== + dependencies: + "@mdx-js/react" "^3.0.0" + "@storybook/csf-plugin" "9.1.11" + "@storybook/icons" "^1.4.0" + "@storybook/react-dom-shim" "9.1.11" + react "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + react-dom "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + ts-dedent "^2.0.0" + +"@storybook/addon-links@^9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-9.1.11.tgz#261175ad0d108314d3d98128343d1afdb49fc9c0" + integrity sha512-HHejK5ivHYCxIK91efHo1i5g7eoUcj3IxdKhlUY7rMcgNulQoOzLuNqh8ZLd0aForumTM0C7mJIZLRzpz84WeA== + dependencies: + "@storybook/global" "^5.0.0" + +"@storybook/addon-themes@^9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/addon-themes/-/addon-themes-9.1.11.tgz#21af71d29d39e47c5aa3e697170adc5c910fcbd9" + integrity sha512-Hsbw7zZiGLpgrzcO5geXp/EeCRDni+xAZgL12ijB1aUrRF4k0JatdYqE9h2C8Ui6Jb+Nk929M9YwNdmdrKvn6g== + dependencies: + ts-dedent "^2.0.0" + +"@storybook/builder-vite@9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-9.1.11.tgz#707eb03723a03bb29040ca1abfb97281c094e4e6" + integrity sha512-P3ZTZIN14Z6s8Xd6R9XtZdKEFWsxFlJ6N2JEGY46Hw8mqLFbCj+xRAvQE2Vz79wHX8Q0UP7yls243Hx9PG9NYw== + dependencies: + "@storybook/csf-plugin" "9.1.11" + ts-dedent "^2.0.0" + +"@storybook/csf-plugin@9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-9.1.11.tgz#208e8e0dbb2325707c169baf63905f6721da5c2b" + integrity sha512-3K8ZhGHyzrbhhhfWDmjatMZRxHdskw74fKPrI8JS4PXxJulXJJQDR7SQmpSjWAe+vc1oCAqfr4tLSZwi6Lmstg== + dependencies: + unplugin "^1.3.1" + +"@storybook/global@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== + +"@storybook/icons@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.6.0.tgz#9fa6eb9c82922b79f75a2cf83c38af30ba7fd696" + integrity sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw== + +"@storybook/react-dom-shim@9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-9.1.11.tgz#6afd9a36f8a29abeec97b712c56977feb54a84fe" + integrity sha512-f9coD3PK/Avhtmo77B1WFU6ARRYLeuS1QoSo132BUCESyB0ak9BdimOSpIzNAXEZQrHYkNw6Ln3+0FD3vqnPrA== + +"@storybook/react-vite@^9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-9.1.11.tgz#71f42c6a6d3152fd40f900d052c309ccd980f8e2" + integrity sha512-PwvCEA8WM3prQEoRFmDr7Do4s/9WTd7Ifuvw3XUrPmMJpfCubqgk0/hWzwlGl4I6STbt0nXAls4sCm3SVKnMqg== + dependencies: + "@joshwooding/vite-plugin-react-docgen-typescript" "0.6.1" + "@rollup/pluginutils" "^5.0.2" + "@storybook/builder-vite" "9.1.11" + "@storybook/react" "9.1.11" + find-up "^7.0.0" + magic-string "^0.30.0" + react-docgen "^8.0.0" + resolve "^1.22.8" + tsconfig-paths "^4.2.0" + +"@storybook/react@9.1.11": + version "9.1.11" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-9.1.11.tgz#6b5271b425870ff15689af6b7074c7ef0fe7e48e" + integrity sha512-qiJSusHJ3A//RSaG1/7OdIXcT1IWBUpVxzZ3PetPky2XZdXQKJb9ACSYzUrfeOyyidl85stg6KjLSXuDeaA7Bg== + dependencies: + "@storybook/global" "^5.0.0" + "@storybook/react-dom-shim" "9.1.11" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -2778,84 +2944,84 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/core-darwin-arm64@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.16.tgz#2cd45d709ce76d448d96bf8d0006849541436611" - integrity sha512-UOCcH1GvjRnnM/LWT6VCGpIk0OhHRq6v1U6QXuPt5wVsgXnXQwnf5k3sG5Cm56hQHDvhRPY6HCsHi/p0oek8oQ== - -"@swc/core-darwin-x64@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.16.tgz#a5bc7d8b1dd850adb0bb95c6b5c742b92201fd01" - integrity sha512-t3bgqFoYLWvyVtVL6KkFNCINEoOrIlyggT/kJRgi1y0aXSr0oVgcrQ4ezJpdeahZZ4N+Q6vT3ffM30yIunELNA== - -"@swc/core-linux-arm-gnueabihf@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.16.tgz#961744908ee5cbb79bc009dcf58cc8b831111f38" - integrity sha512-DvHuwvEF86YvSd0lwnzVcjOTZ0jcxewIbsN0vc/0fqm9qBdMMjr9ox6VCam1n3yYeRtj4VFgrjeNFksqbUejdQ== - -"@swc/core-linux-arm64-gnu@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.16.tgz#43713be3f26757d82d2745dc25f8b63400e0a3d0" - integrity sha512-9Uu5YlPbyCvbidjKtYEsPpyZlu16roOZ5c2tP1vHfnU9bgf5Tz5q5VovSduNxPHx+ed2iC1b1URODHvDzbbDuQ== - -"@swc/core-linux-arm64-musl@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.16.tgz#394a7d030f3a61902bd3947bb9d70d26d42f3c81" - integrity sha512-/YZq/qB1CHpeoL0eMzyqK5/tYZn/rzKoCYDviFU4uduSUIJsDJQuQA/skdqUzqbheOXKAd4mnJ1hT04RbJ8FPQ== - -"@swc/core-linux-x64-gnu@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.16.tgz#71eb108b784f9d551ee8a35ebcdaed972f567981" - integrity sha512-UUjaW5VTngZYDcA8yQlrFmqs1tLi1TxbKlnaJwoNhel9zRQ0yG1YEVGrzTvv4YApSuIiDK18t+Ip927bwucuVQ== - -"@swc/core-linux-x64-musl@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.16.tgz#10dbaedb4e3dfc7268e3a9a66ad3431471ef035b" - integrity sha512-aFhxPifevDTwEDKPi4eRYWzC0p/WYJeiFkkpNU5Uc7a7M5iMWPAbPFUbHesdlb9Jfqs5c07oyz86u+/HySBNPQ== - -"@swc/core-win32-arm64-msvc@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.16.tgz#80247adff6c245ff32b44d773c1a148858cd655f" - integrity sha512-bTD43MbhIHL2s5QgCwyleaGwl96Gk/scF2TaVKdUe4QlJCDV/YK9h5oIBAp63ckHtE8GHlH4c8dZNBiAXn4Org== - -"@swc/core-win32-ia32-msvc@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.16.tgz#e540afc3ccf3224267b4ddfb408f9d9737984686" - integrity sha512-/lmZeAN/qV5XbK2SEvi8e2RkIg8FQNYiSA8y2/Zb4gTUMKVO5JMLH0BSWMiIKMstKDPDSxMWgwJaQHF8UMyPmQ== - -"@swc/core-win32-x64-msvc@1.4.16": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.16.tgz#f880939fca32c181adfe7e3abd2b6b7857bd3489" - integrity sha512-BPAfFfODWXtUu6SwaTTftDHvcbDyWBSI/oanUeRbQR5vVWkXoQ3cxLTsDluc3H74IqXS5z1Uyoe0vNo2hB1opA== +"@swc/core-darwin-arm64@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz#7638c073946f9297753ed9a2eb198d07b2336a24" + integrity sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ== + +"@swc/core-darwin-x64@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz#18061167378f0fb285e17818494bc6c89dd07551" + integrity sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng== + +"@swc/core-linux-arm-gnueabihf@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz#4c8062bd598049b5b9b0beb762e075e76b4c23c3" + integrity sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ== + +"@swc/core-linux-arm64-gnu@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz#7222d321197ea9304e387933e87d775849fc1ae6" + integrity sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw== + +"@swc/core-linux-arm64-musl@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz#51e7958deaf37edc212bd9dc0ea1476f151d2bea" + integrity sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ== + +"@swc/core-linux-x64-gnu@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz#3476beab93ab03e92844d955ca9d9289aa4a5993" + integrity sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA== + +"@swc/core-linux-x64-musl@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz#f4934b1e77e2a297909bb3ab977836205c36e5e0" + integrity sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q== + +"@swc/core-win32-arm64-msvc@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz#5084c107435cfc82d4d901bfb388dc319d38a236" + integrity sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw== + +"@swc/core-win32-ia32-msvc@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz#f8b2e28bc51b30467e316ed736a130c1324b9880" + integrity sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw== + +"@swc/core-win32-x64-msvc@1.13.5": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz#13883cf3c63bf11b787e28dcdf75ca0cc49efa83" + integrity sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q== "@swc/core@^1.3.107": - version "1.4.16" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.16.tgz#d175bae2acfecd53bcbd4293f1fba5ec316634a0" - integrity sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA== + version "1.13.5" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.13.5.tgz#93874b831d3bd121560e6fcd688972b7fc7baa26" + integrity sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ== dependencies: - "@swc/counter" "^0.1.2" - "@swc/types" "^0.1.5" + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.24" optionalDependencies: - "@swc/core-darwin-arm64" "1.4.16" - "@swc/core-darwin-x64" "1.4.16" - "@swc/core-linux-arm-gnueabihf" "1.4.16" - "@swc/core-linux-arm64-gnu" "1.4.16" - "@swc/core-linux-arm64-musl" "1.4.16" - "@swc/core-linux-x64-gnu" "1.4.16" - "@swc/core-linux-x64-musl" "1.4.16" - "@swc/core-win32-arm64-msvc" "1.4.16" - "@swc/core-win32-ia32-msvc" "1.4.16" - "@swc/core-win32-x64-msvc" "1.4.16" - -"@swc/counter@^0.1.2", "@swc/counter@^0.1.3": + "@swc/core-darwin-arm64" "1.13.5" + "@swc/core-darwin-x64" "1.13.5" + "@swc/core-linux-arm-gnueabihf" "1.13.5" + "@swc/core-linux-arm64-gnu" "1.13.5" + "@swc/core-linux-arm64-musl" "1.13.5" + "@swc/core-linux-x64-gnu" "1.13.5" + "@swc/core-linux-x64-musl" "1.13.5" + "@swc/core-win32-arm64-msvc" "1.13.5" + "@swc/core-win32-ia32-msvc" "1.13.5" + "@swc/core-win32-x64-msvc" "1.13.5" + +"@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@swc/types@^0.1.5": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" - integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== +"@swc/types@^0.1.24": + version "0.1.25" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" + integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== dependencies: "@swc/counter" "^0.1.3" @@ -2903,18 +3069,16 @@ lz-string "^1.4.4" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.2.0.tgz#b572bd5cd6b29314487bac7ba393188e4987b4f7" - integrity sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw== +"@testing-library/jest-dom@^6.2.0", "@testing-library/jest-dom@^6.6.3": + version "6.9.1" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" + integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== dependencies: - "@adobe/css-tools" "^4.3.2" - "@babel/runtime" "^7.9.2" + "@adobe/css-tools" "^4.4.0" aria-query "^5.0.0" - chalk "^3.0.0" css.escape "^1.5.1" dom-accessibility-api "^0.6.3" - lodash "^4.17.15" + picocolors "^1.1.1" redent "^3.0.0" "@testing-library/react-hooks@^8.0.1": @@ -2934,10 +3098,10 @@ "@testing-library/dom" "^8.5.0" "@types/react-dom" "^18.0.0" -"@testing-library/user-event@^14.4.3": - version "14.4.3" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.4.3.tgz#af975e367743fa91989cd666666aec31a8f50591" - integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q== +"@testing-library/user-event@^14.4.3", "@testing-library/user-event@^14.6.1": + version "14.6.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" + integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== "@tootallnate/once@2": version "2.0.0" @@ -3000,12 +3164,12 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.20.7": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.28.2" "@types/body-parser@*": version "1.19.2" @@ -3025,6 +3189,13 @@ "@types/node" "*" "@types/responselike" "^1.0.0" +"@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" + "@types/chroma-js@^2.0.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.0.tgz#476a16ae848c77478079d6749236fdb98837b92c" @@ -3044,11 +3215,6 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cookiejar@*": version "2.1.2" resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" @@ -3264,18 +3430,28 @@ "@types/d3-transition" "*" "@types/d3-zoom" "*" -"@types/debug@^4.0.0", "@types/debug@^4.1.6", "@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== +"@types/debug@^4.0.0", "@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + "@types/detect-port@^1.3.0": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/detect-port/-/detect-port-1.3.2.tgz#8c06a975e472803b931ee73740aeebd0a2eb27ae" integrity sha512-xxgAGA2SAU4111QefXPSp5eGbDm/hW6zhvYl9IeEPZEry9F4d66QAHm5qpUXjb6IsevZV/7emAEx5MhP6O192g== +"@types/doctrine@^0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f" + integrity sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA== + "@types/dompurify@^3.0.5": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-3.0.5.tgz#02069a2fcb89a163bacf1a788f73cb415dd75cb7" @@ -3290,7 +3466,23 @@ dependencies: electron-store "*" -"@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -3420,11 +3612,6 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/js-levenshtein@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz#ba05426a43f9e4e30b631941e0aa17bf0c890ed5" - integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== - "@types/js-yaml@^4.0.9": version "4.0.9" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" @@ -3458,7 +3645,7 @@ resolved "https://registry.yarnpkg.com/@types/json-dup-key-validator/-/json-dup-key-validator-1.0.2.tgz#30120b573e6ccfa0eac5c9a3f07d384805fa9dce" integrity sha512-zJSAGITlz2nFT7xcKsvns8UifwSJpKuhgsdZj7+WoxiixiGnIefNiLK2uNhEICRkI9S2ccU6RYdqPS7iJRtU7Q== -"@types/json-schema@^7.0.0", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.0", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -3492,6 +3679,11 @@ dependencies: "@types/unist" "*" +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -3701,6 +3893,11 @@ resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz#294aaadf24ac6580b8fbd1fe3ab7b59fe85f9ef3" integrity sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg== +"@types/resolve@^1.20.2": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" + integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== + "@types/responselike@^1.0.0": version "1.0.3" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" @@ -3719,9 +3916,9 @@ integrity sha512-fiOyEgyqJY2Mv9k72WG4XoY4fVE31byiSUrEFcNh+MgHcH3HuJmoz2J7ktO3YizBrN6/RuaH1tY5J/5I5BJHJQ== "@types/semver@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" - integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== + version "7.7.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" + integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== "@types/send@*": version "0.17.1" @@ -3740,18 +3937,16 @@ "@types/node" "*" "@types/send" "*" -"@types/set-cookie-parser@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz#b6a955219b54151bfebd4521170723df5e13caad" - integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== - dependencies: - "@types/node" "*" - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/statuses@^2.0.4": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz#66748315cc9a96d63403baa8671b2c124f8633aa" + integrity sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA== + "@types/styled-components@^5.1.34": version "5.1.34" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.34.tgz#4107df8ef8a7eaba4fa6b05f78f93fba4daf0300" @@ -3878,13 +4073,13 @@ "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.37.0.tgz#0594352e32a4ac9258591b88af77b5653800cdfe" - integrity sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA== +"@typescript-eslint/project-service@8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.46.1.tgz#07be0e6f27fa90a17d8e5f6996ee02329c9a8c2e" + integrity sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.37.0" - "@typescript-eslint/types" "^8.37.0" + "@typescript-eslint/tsconfig-utils" "^8.46.1" + "@typescript-eslint/types" "^8.46.1" debug "^4.3.4" "@typescript-eslint/scope-manager@7.16.1": @@ -3903,18 +4098,18 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz#a31a3c80ca2ef4ed58de13742debb692e7d4c0a4" - integrity sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA== +"@typescript-eslint/scope-manager@8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz#590dd2e65e95af646bdaf50adeae9af39e25e8c1" + integrity sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A== dependencies: - "@typescript-eslint/types" "8.37.0" - "@typescript-eslint/visitor-keys" "8.37.0" + "@typescript-eslint/types" "8.46.1" + "@typescript-eslint/visitor-keys" "8.46.1" -"@typescript-eslint/tsconfig-utils@8.37.0", "@typescript-eslint/tsconfig-utils@^8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz#47a2760d265c6125f8e7864bc5c8537cad2bd053" - integrity sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg== +"@typescript-eslint/tsconfig-utils@8.46.1", "@typescript-eslint/tsconfig-utils@^8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz#24405888560175c6c209c39df11ac06a2efef9d7" + integrity sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g== "@typescript-eslint/type-utils@7.16.1": version "7.16.1" @@ -3946,10 +4141,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@8.37.0", "@typescript-eslint/types@^8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.37.0.tgz#09517aa9625eb3c68941dde3ac8835740587b6ff" - integrity sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ== +"@typescript-eslint/types@8.46.1", "@typescript-eslint/types@^8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.1.tgz#4c5479538ec10b5508b8e982e172911c987446d8" + integrity sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ== "@typescript-eslint/typescript-estree@7.16.1": version "7.16.1" @@ -3979,15 +4174,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz#a07e4574d8e6e4355a558f61323730c987f5fcbc" - integrity sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg== +"@typescript-eslint/typescript-estree@8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz#1c146573b942ebe609c156c217ceafdc7a88e6ed" + integrity sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg== dependencies: - "@typescript-eslint/project-service" "8.37.0" - "@typescript-eslint/tsconfig-utils" "8.37.0" - "@typescript-eslint/types" "8.37.0" - "@typescript-eslint/visitor-keys" "8.37.0" + "@typescript-eslint/project-service" "8.46.1" + "@typescript-eslint/tsconfig-utils" "8.46.1" + "@typescript-eslint/types" "8.46.1" + "@typescript-eslint/visitor-keys" "8.46.1" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -4015,15 +4210,15 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.37.0.tgz#189ea59b2709f5d898614611f091a776751ee335" - integrity sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A== +"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.8.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.1.tgz#c572184d9227d66b10a954b90249a20c48b22452" + integrity sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.37.0" - "@typescript-eslint/types" "8.37.0" - "@typescript-eslint/typescript-estree" "8.37.0" + "@typescript-eslint/scope-manager" "8.46.1" + "@typescript-eslint/types" "8.46.1" + "@typescript-eslint/typescript-estree" "8.46.1" "@typescript-eslint/visitor-keys@7.16.1": version "7.16.1" @@ -4041,12 +4236,12 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz#cdb6a6bd3e8d6dd69bd70c1bdda36e2d18737455" - integrity sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w== +"@typescript-eslint/visitor-keys@8.46.1": + version "8.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz#da35f1d58ec407419d68847cfd358b32746ac315" + integrity sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA== dependencies: - "@typescript-eslint/types" "8.37.0" + "@typescript-eslint/types" "8.46.1" eslint-visitor-keys "^4.2.1" "@ungap/structured-clone@^1.2.0": @@ -4072,125 +4267,168 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.0" -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@vitest/mocker@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" + integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== + dependencies: + "@vitest/spy" "3.2.4" + estree-walker "^3.0.3" + magic-string "^0.30.17" -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@vitest/pretty-format@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== + dependencies: + tinyrainbow "^2.0.0" -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== + dependencies: + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: - "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^2.1.1": @@ -4208,10 +4446,10 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@xmldom/xmldom@^0.8.3", "@xmldom/xmldom@^0.8.8": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== +"@xmldom/xmldom@^0.8.8": + version "0.8.11" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz#b79de2d67389734c57c52595f7a7305e30c2d608" + integrity sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -4228,11 +4466,6 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -4251,10 +4484,10 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== +acorn-import-phases@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" @@ -4266,7 +4499,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.0.5, acorn@^8.1.0, acorn@^8.15.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.0.4, acorn@^8.0.5, acorn@^8.1.0, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.4.1, acorn@^8.8.1, acorn@^8.9.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -4388,7 +4621,7 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -4598,6 +4831,11 @@ assert@^2.1.0: object.assign "^4.1.4" util "^0.12.5" +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + ast-metadata-inferer@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz#85081bf30308acd4c35fb8694658b4c5f6f3ee60" @@ -4610,6 +4848,13 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + dependencies: + tslib "^2.0.1" + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -4657,10 +4902,10 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@^4.10.0: - version "4.10.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.3.tgz#04145965ac7894faddbac30861e5d8f11bfd14fc" - integrity sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg== +axe-core@^4.10.0, axe-core@^4.2.0: + version "4.11.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.0.tgz#16f74d6482e343ff263d4f4503829e9ee91a86b6" + integrity sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ== axios@^1.12.2: version "1.12.2" @@ -4845,6 +5090,18 @@ base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +baseline-browser-mapping@^2.8.9: + version "2.8.14" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.14.tgz#b73b0ae23efcb967e30b381c09a1a001777ec927" + integrity sha512-GM9c0cWWR8Ga7//Ves/9KRgTS8nLausCkP3CGiFLrnwA2CDUluXgaQqvrULoR2Ujrd/mz/lkX87F5BHFsNr5sQ== + +better-opn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4855,11 +5112,6 @@ bignumber.js@^9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -4899,7 +5151,7 @@ brace@^0.11.1: resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== -braces@^3.0.3, braces@~3.0.2: +braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -4920,14 +5172,15 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.25.1: - version "4.25.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" - integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.25.1, browserslist@^4.26.3: + version "4.26.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.3.tgz#40fbfe2d1cd420281ce5b1caa8840049c79afb56" + integrity sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w== dependencies: - caniuse-lite "^1.0.30001726" - electron-to-chromium "^1.5.173" - node-releases "^2.0.19" + baseline-browser-mapping "^2.8.9" + caniuse-lite "^1.0.30001746" + electron-to-chromium "^1.5.227" + node-releases "^2.0.21" update-browserslist-db "^1.1.3" bs-logger@^0.2.6: @@ -5132,10 +5385,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001687, caniuse-lite@^1.0.30001726: - version "1.0.30001727" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" - integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001687, caniuse-lite@^1.0.30001746: + version "1.0.30001749" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz#21a43b923577932097fe32bcaabb6da7f4677632" + integrity sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q== ccount@^1.0.0: version "1.1.0" @@ -5147,6 +5400,17 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -5156,14 +5420,6 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -5212,25 +5468,10 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.4.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.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" - optionalDependencies: - fsevents "~2.3.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== chownr@^2.0.0: version "2.0.0" @@ -5258,9 +5499,9 @@ ci-info@^3.2.0, ci-info@^3.7.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== classnames@*, classnames@^2.2.6, classnames@^2.3.1: version "2.3.2" @@ -5299,10 +5540,10 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== cliui@^7.0.2: version "7.0.4" @@ -5540,7 +5781,7 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie@^0.4.2, cookie@^0.7.0: +cookie@^0.7.0, cookie@^1.0.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -6211,6 +6452,11 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-equal@^2.0.5: version "2.2.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" @@ -6698,10 +6944,10 @@ electron-store@*, electron-store@^8.0.0: conf "^10.2.0" type-fest "^2.17.0" -electron-to-chromium@^1.5.173: - version "1.5.185" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.185.tgz#b4f9189c4ef652ddf9f1bb37529e2b79f865e912" - integrity sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ== +electron-to-chromium@^1.5.227: + version "1.5.233" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz#05db98476cee317527d6c48934571e13ad6b6f58" + integrity sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg== electron-updater@^6.6.2: version "6.6.2" @@ -6790,10 +7036,10 @@ enhanced-resolve@^0.9.1: memory-fs "^0.2.0" tapable "^0.1.8" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.3, enhanced-resolve@^5.7.0: + version "5.18.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -6957,9 +7203,9 @@ es-iterator-helpers@^1.0.19, es-iterator-helpers@^1.2.1: safe-array-concat "^1.1.3" es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" @@ -7004,36 +7250,44 @@ esbuild-plugin-react-virtualized@^1.0.4: resolved "https://registry.yarnpkg.com/esbuild-plugin-react-virtualized/-/esbuild-plugin-react-virtualized-1.0.4.tgz#b8911ce8fae4636daa87cfa898752170f5d45609" integrity sha512-/Y+82TBduHox0/uhJlTgUqi3ZWN+qZPF0xy9crkHQE2AOOdm76l6VY2F0Mdfvue9hqXz2FOlKHlHUVXNalHLzA== -esbuild@^0.21.3, esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== +esbuild-register@^3.5.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + +"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", esbuild@^0.21.3, esbuild@^0.25.0: + version "0.25.11" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.11.tgz#0f31b82f335652580f75ef6897bba81962d9ae3d" + integrity sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" + "@esbuild/aix-ppc64" "0.25.11" + "@esbuild/android-arm" "0.25.11" + "@esbuild/android-arm64" "0.25.11" + "@esbuild/android-x64" "0.25.11" + "@esbuild/darwin-arm64" "0.25.11" + "@esbuild/darwin-x64" "0.25.11" + "@esbuild/freebsd-arm64" "0.25.11" + "@esbuild/freebsd-x64" "0.25.11" + "@esbuild/linux-arm" "0.25.11" + "@esbuild/linux-arm64" "0.25.11" + "@esbuild/linux-ia32" "0.25.11" + "@esbuild/linux-loong64" "0.25.11" + "@esbuild/linux-mips64el" "0.25.11" + "@esbuild/linux-ppc64" "0.25.11" + "@esbuild/linux-riscv64" "0.25.11" + "@esbuild/linux-s390x" "0.25.11" + "@esbuild/linux-x64" "0.25.11" + "@esbuild/netbsd-arm64" "0.25.11" + "@esbuild/netbsd-x64" "0.25.11" + "@esbuild/openbsd-arm64" "0.25.11" + "@esbuild/openbsd-x64" "0.25.11" + "@esbuild/openharmony-arm64" "0.25.11" + "@esbuild/sunos-x64" "0.25.11" + "@esbuild/win32-arm64" "0.25.11" + "@esbuild/win32-ia32" "0.25.11" + "@esbuild/win32-x64" "0.25.11" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -7366,6 +7620,13 @@ eslint-plugin-sonarjs@^2.0.4: typescript "5.6.2" vue-eslint-parser "9.4.3" +eslint-plugin-storybook@^9.1.11: + version "9.1.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.11.tgz#766ea56917cfc1ad0da2fae7c034202ec11a3fff" + integrity sha512-T2yef3AuBHpg78o8ipMk+r8AX3nzHnaqaXS61VQWy9JNvp6Zr91u+E6UIHK1PSB3NwonX23fdcy+K8MTBXjO/A== + dependencies: + "@typescript-eslint/utils" "^8.8.1" + eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -7472,7 +7733,7 @@ esprima@1.2.2: resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7506,12 +7767,19 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -events@^3.2.0, events@^3.3.0: +events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -7587,15 +7855,6 @@ extend@^3.0.0, extend@^3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -7698,13 +7957,6 @@ fengari@^0.1.4: sprintf-js "^1.1.1" tmp "^0.0.33" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -7774,6 +8026,15 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" + integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== + dependencies: + locate-path "^7.2.0" + path-exists "^5.0.0" + unicorn-magic "^0.1.0" + find-yarn-workspace-root@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" @@ -8041,7 +8302,7 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -8060,7 +8321,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.3.10, glob@^10.3.12, glob@^10.4.1: +glob@^10.0.0, glob@^10.3.10, glob@^10.3.12, glob@^10.4.1: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -8471,10 +8732,10 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -headers-polyfill@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" - integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== history@^4.9.0: version "4.10.1" @@ -8571,9 +8832,9 @@ html-void-elements@^2.0.0: integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== html-webpack-plugin@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + version "5.6.4" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz#d8cb0f7edff7745ae7d6cccb0bff592e9f7f7959" + integrity sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -8679,13 +8940,6 @@ iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" @@ -8785,27 +9039,6 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@^8.2.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - 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" - internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" @@ -8901,13 +9134,6 @@ is-bigint@^1.1.0: dependencies: has-bigints "^1.0.2" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" @@ -9004,7 +9230,7 @@ is-generator-function@^1.0.10, is-generator-function@^1.0.7: has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -9467,6 +9693,11 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" +jest-fixed-jsdom@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/jest-fixed-jsdom/-/jest-fixed-jsdom-0.0.10.tgz#6f4042d42f2130a0debc85ec0b9e348c4c2de57b" + integrity sha512-WaEVX+FripJh+Hn/7dysIgqP66h0KT1NNC22NGmNYANExtCoYNk1q2yjwwcdSboBMkkhn0NtmvKad/cmisnCLg== + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -9732,11 +9963,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -10129,6 +10355,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -10219,6 +10452,11 @@ loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -10265,6 +10503,13 @@ lz4js@^0.2.0: resolved "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz#09f1a397cb2158f675146c3351dde85058cb322f" integrity sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg== +magic-string@^0.30.0, magic-string@^0.30.17: + version "0.30.19" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9" + integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -11078,35 +11323,34 @@ msgpackr@^1.10.1: optionalDependencies: msgpackr-extract "^3.0.2" -msw@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.4.tgz#76ad0396a9c7fff07c6893ce4d3997787dc8fd55" - integrity sha512-XxA/VomMIYLlgpFS00eQanBWIAT9gto4wxrRt9y58WBXJs1I0lQYRIWk7nKcY/7X6DhkKukcDgPcyAvkEc1i7w== - dependencies: - "@mswjs/cookies" "^0.2.2" - "@mswjs/interceptors" "^0.17.10" - "@open-draft/until" "^1.0.3" - "@types/cookie" "^0.4.1" - "@types/js-levenshtein" "^1.1.1" - chalk "^4.1.1" - chokidar "^3.4.2" - cookie "^0.4.2" +msw@^2.11.5: + version "2.11.5" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.11.5.tgz#69572ab70a60b5d72c8b6aed344595a7604241c0" + integrity sha512-atFI4GjKSJComxcigz273honh8h4j5zzpk5kwG4tGm0TPcYne6bqmVrufeRll6auBeouIkXqZYXxVbWSWxM3RA== + dependencies: + "@inquirer/confirm" "^5.0.0" + "@mswjs/interceptors" "^0.39.1" + "@open-draft/deferred-promise" "^2.2.0" + "@types/statuses" "^2.0.4" + cookie "^1.0.2" graphql "^16.8.1" - headers-polyfill "3.2.5" - inquirer "^8.2.0" + headers-polyfill "^4.0.2" is-node-process "^1.2.0" - js-levenshtein "^1.1.6" - node-fetch "^2.6.7" - outvariant "^1.4.0" - path-to-regexp "^6.2.0" - strict-event-emitter "^0.4.3" - type-fest "^2.19.0" - yargs "^17.3.1" + outvariant "^1.4.3" + path-to-regexp "^6.3.0" + picocolors "^1.1.1" + rettime "^0.7.0" + statuses "^2.0.2" + strict-event-emitter "^0.5.1" + tough-cookie "^6.0.0" + type-fest "^4.26.1" + until-async "^3.0.2" + yargs "^17.7.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== nanoid@^3.3.11: version "3.3.11" @@ -11169,10 +11413,10 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.7, node-fetch@^2.6.9: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== +node-fetch@^2.6.9: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -11186,10 +11430,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.21: + version "2.0.23" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.23.tgz#2ecf3d7ba571ece05c67c77e5b7b1b6fb9e18cea" + integrity sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg== noms@0.0.0: version "0.0.0" @@ -11224,7 +11468,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -11359,7 +11603,7 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.0.3, open@^8.4.0: +open@^8.0.3, open@^8.0.4, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -11397,7 +11641,7 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -ora@^5.1.0, ora@^5.4.1: +ora@^5.1.0: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -11430,10 +11674,10 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -outvariant@^1.2.1, outvariant@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.0.tgz#e742e4bda77692da3eca698ef5bfac62d9fba06e" - integrity sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw== +outvariant@^1.4.0, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== own-keys@^1.0.1: version "1.0.1" @@ -11463,6 +11707,13 @@ p-limit@^3.0.2, p-limit@^3.1.0, "p-limit@^3.1.0 ": dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -11484,6 +11735,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -11609,6 +11867,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -11639,7 +11902,7 @@ path-to-regexp@^1.7.0, path-to-regexp@^1.9.0: dependencies: isarray "0.0.1" -path-to-regexp@^6.2.0, path-to-regexp@^6.3.0: +path-to-regexp@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== @@ -11649,6 +11912,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + pe-library@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-0.4.1.tgz#e269be0340dcb13aa6949d743da7d658c3e2fbea" @@ -11683,7 +11951,7 @@ picocolors@^1.0.0, picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -11832,25 +12100,25 @@ postcss-minify-selectors@^6.0.4: postcss-selector-parser "^6.0.16" postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" @@ -11944,7 +12212,7 @@ postcss-reduce-transforms@^6.0.2: dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: version "6.0.16" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== @@ -11952,6 +12220,14 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-svgo@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.3.tgz#1d6e180d6df1fa8a3b30b729aaa9161e94f04eaa" @@ -12274,6 +12550,34 @@ react-day-picker@^8.6.0: resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-8.10.1.tgz#4762ec298865919b93ec09ba69621580835b8e80" integrity sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA== +react-docgen-typescript@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz#033428b4a6a639d050ac8baf2a5195c596521713" + integrity sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg== + +react-docgen@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-8.0.2.tgz#450efcac75813e3d614d7bd15eb4066e2e7bcbf5" + integrity sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA== + dependencies: + "@babel/core" "^7.28.0" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.2" + "@types/babel__core" "^7.20.5" + "@types/babel__traverse" "^7.20.7" + "@types/doctrine" "^0.0.9" + "@types/resolve" "^1.20.2" + doctrine "^3.0.0" + resolve "^1.22.1" + strip-indent "^4.0.0" + +"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.0.tgz#00ed1e959c365e9a9d48f8918377465466ec3af8" + integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== + dependencies: + scheduler "^0.27.0" + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -12551,6 +12855,11 @@ react-window@^1.8.5, react-window@^1.8.6: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" +"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.0.tgz#d33dd1721698f4376ae57a54098cb47fc75d93a5" + integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -12650,18 +12959,22 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - readline-sync@^1.4.9: version "1.4.10" resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== +recast@^0.23.5: + version "0.23.11" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz#8885570bb28cf773ba1dc600da7f502f7883f73f" + integrity sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== + dependencies: + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tiny-invariant "^1.3.3" + tslib "^2.0.1" + rechoir@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" @@ -12965,7 +13278,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4, resolve@^1.22.8: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -13003,6 +13316,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +rettime@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rettime/-/rettime-0.7.0.tgz#c040f1a65e396eaa4b8346dd96ed937edc79d96f" + integrity sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -13085,11 +13403,6 @@ rollup@^4.20.0: "@rollup/rollup-win32-x64-msvc" "4.52.2" fsevents "~2.3.2" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -13102,10 +13415,10 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -rxjs@^7.4.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== +rxjs@^7.4.0, rxjs@^7.5.1, rxjs@^7.8.1: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" @@ -13154,7 +13467,7 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: es-errors "^1.3.0" is-regex "^1.2.1" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -13300,6 +13613,11 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + schema-utils@^2.0.1: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" @@ -13309,7 +13627,7 @@ schema-utils@^2.0.1: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -13318,10 +13636,10 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0, schema-utils@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== +schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -13354,18 +13672,13 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" -serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: +serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -set-cookie-parser@^2.4.6: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -13476,7 +13789,7 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -13750,6 +14063,11 @@ static-eval@2.0.2: dependencies: escodegen "^1.8.1" +statuses@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + stop-iteration-iterator@^1.0.0, stop-iteration-iterator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" @@ -13758,6 +14076,24 @@ stop-iteration-iterator@^1.0.0, stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" +storybook@^9.1.11: + version "9.1.11" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-9.1.11.tgz#0dc63afabaa26478e9995565e0dc9355adadaea3" + integrity sha512-shRR8GLKoa6qSVxgC37ojtON4n+ZCFbzxL3t69qrVmMpcKqxOyZRUI933Xoi6+RQMyzqRfgkib5dvoLIGO1V4Q== + dependencies: + "@storybook/global" "^5.0.0" + "@testing-library/jest-dom" "^6.6.3" + "@testing-library/user-event" "^14.6.1" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/spy" "3.2.4" + better-opn "^3.0.2" + esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" + esbuild-register "^3.5.0" + recast "^0.23.5" + semver "^7.6.2" + ws "^8.18.0" + stream-shift@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" @@ -13773,17 +14109,10 @@ streamx@^2.15.0: optionalDependencies: bare-events "^2.2.0" -strict-event-emitter@^0.2.4: - version "0.2.8" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" - integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== - dependencies: - events "^3.3.0" - -strict-event-emitter@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" - integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== string-argv@0.3.1: version "0.3.1" @@ -13981,6 +14310,11 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" +strip-indent@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz#aba13de189d4ad9a17f6050e76554ac27585c7af" + integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -14129,10 +14463,10 @@ tapable@^0.1.8: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" integrity sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ== -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tapable@^2.0.0, tapable@^2.2.0, tapable@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== tar-stream@^3.1.7: version "3.1.7" @@ -14163,24 +14497,24 @@ temp-file@^3.4.0: async-exit-hook "^2.0.1" fs-extra "^10.0.0" -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: - "@jridgewell/trace-mapping" "^0.3.20" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" -terser@^5.10.0, terser@^5.26.0: - version "5.28.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.28.1.tgz#bf00f7537fd3a798c352c2d67d67d65c915d1b28" - integrity sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA== +terser@^5.10.0, terser@^5.31.1: + version "5.44.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" + integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" + acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" @@ -14225,7 +14559,7 @@ through2@^2.0.1, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -14237,10 +14571,10 @@ tiny-async-pool@1.3.0: dependencies: semver "^5.5.0" -tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tiny-invariant@^1.0.2, tiny-invariant@^1.0.6, tiny-invariant@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-typed-emitter@^2.1.0: version "2.1.0" @@ -14252,6 +14586,28 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" + integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== + +tldts-core@^7.0.17: + version "7.0.17" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.17.tgz#dadfee3750dd272ed219d7367beb7cbb2ff29eb8" + integrity sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g== + +tldts@^7.0.5: + version "7.0.17" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.17.tgz#a6cdc067b9e80ea05f3be471c0ea410688cc78b2" + integrity sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ== + dependencies: + tldts-core "^7.0.17" + tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" @@ -14298,6 +14654,13 @@ tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.0.tgz#11e418b7864a2c0d874702bc8ce0f011261940e5" + integrity sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w== + dependencies: + tldts "^7.0.5" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -14362,6 +14725,11 @@ ts-api-utils@^2.1.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== +ts-dedent@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + ts-jest@^29.2.5: version "29.2.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" @@ -14433,7 +14801,7 @@ tsconfig-paths@^3.15.0, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2: +tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -14452,7 +14820,7 @@ tslib@^1.10.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.8.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -14501,7 +14869,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^2.17.0, type-fest@^2.19.0: +type-fest@^2.17.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -14511,6 +14879,11 @@ type-fest@^3.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== +type-fest@^4.26.1: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + typed-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" @@ -14627,6 +15000,11 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + unified@^10.0.0, unified@^10.1.1: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" @@ -14794,6 +15172,19 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unplugin@^1.3.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.16.1.tgz#a844d2e3c3b14a4ac2945c42be80409321b61199" + integrity sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w== + dependencies: + acorn "^8.14.0" + webpack-virtual-modules "^0.6.2" + +until-async@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/until-async/-/until-async-3.0.2.tgz#447f1531fdd7bb2b4c7a98869bdb1a4c2a23865f" + integrity sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw== + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -14888,7 +15279,7 @@ util-extend@^1.0.1: resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== -util@^0.12.3, util@^0.12.5: +util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -15147,10 +15538,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== +watchpack@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" + integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -15162,15 +15553,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-encoding@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - web-namespaces@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" @@ -15237,25 +15619,32 @@ webpack-merge@^5.10.0, webpack-merge@^5.7.3: flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== +webpack-sources@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" + integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== + +webpack-virtual-modules@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" + integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== webpack@^5.95.0: - version "5.95.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" - integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" + version "5.102.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.102.1.tgz#1003a3024741a96ba99c37431938bf61aad3d988" + integrity sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.8" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.15.0" + acorn-import-phases "^1.0.3" + browserslist "^4.26.3" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" + enhanced-resolve "^5.17.3" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -15265,11 +15654,11 @@ webpack@^5.95.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" + schema-utils "^4.3.3" + tapable "^2.3.0" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.4" + webpack-sources "^3.3.3" whatwg-encoding@^2.0.0: version "2.0.0" @@ -15428,7 +15817,12 @@ ws@^7.3.1, ws@^7.5.10: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.11.0, ws@~8.17.1: +ws@^8.11.0, ws@^8.18.0: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +ws@~8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== @@ -15551,6 +15945,16 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== + +yoctocolors-cjs@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" + integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"