From b89b1b6a7a671f971aee34005ded228d4ca8fc0a Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 29 Mar 2022 15:05:01 -0600 Subject: [PATCH 01/27] test(snap-preact): adding testing for createController methods --- packages/snap-preact/package.json | 2 +- .../RecommendationInstantiator.test.tsx | 7 + packages/snap-preact/src/Snap.test.tsx | 12 + packages/snap-preact/src/Snap.tsx | 2 +- .../src/components/BranchOverride.test.tsx | 7 + .../createAutocompleteController.test.ts | 217 ++++++++++++++++ .../src/create/createFinderController.test.ts | 232 ++++++++++++++++++ .../createRecommendationController.test.ts | 217 ++++++++++++++++ .../src/create/createSearchController.test.ts | 216 ++++++++++++++++ packages/snap-preact/src/create/index.ts | 2 +- 10 files changed, 911 insertions(+), 3 deletions(-) create mode 100644 packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx create mode 100644 packages/snap-preact/src/Snap.test.tsx create mode 100644 packages/snap-preact/src/components/BranchOverride.test.tsx create mode 100644 packages/snap-preact/src/create/createAutocompleteController.test.ts create mode 100644 packages/snap-preact/src/create/createFinderController.test.ts create mode 100644 packages/snap-preact/src/create/createRecommendationController.test.ts create mode 100644 packages/snap-preact/src/create/createSearchController.test.ts diff --git a/packages/snap-preact/package.json b/packages/snap-preact/package.json index 8ecc816bb..160f83f6f 100644 --- a/packages/snap-preact/package.json +++ b/packages/snap-preact/package.json @@ -16,7 +16,7 @@ "dev": "tsc --watch", "format": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", - "test": "jest --passWithNoTests", + "test": "jest", "test:watch": "jest --watch" }, "dependencies": { diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx new file mode 100644 index 000000000..fd3be7242 --- /dev/null +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx @@ -0,0 +1,7 @@ +import { RecommendationInstantiator } from './RecommendationInstantiator'; + +describe('RecommendationInstantiator', () => { + it('exists', () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/snap-preact/src/Snap.test.tsx b/packages/snap-preact/src/Snap.test.tsx new file mode 100644 index 000000000..10b4bed21 --- /dev/null +++ b/packages/snap-preact/src/Snap.test.tsx @@ -0,0 +1,12 @@ +import { Snap } from './Snap'; + +describe('Snap Preact', () => { + it('throws if configuration is not provided', () => { + const config = {}; + + expect(() => { + // @ts-ignore - testing bad instantiation + const snap = new Snap(); + }).toThrow(); + }); +}); diff --git a/packages/snap-preact/src/Snap.tsx b/packages/snap-preact/src/Snap.tsx index 8f172d396..c3fc65387 100644 --- a/packages/snap-preact/src/Snap.tsx +++ b/packages/snap-preact/src/Snap.tsx @@ -62,7 +62,7 @@ export type SnapConfig = { }[]; autocomplete?: { config: AutocompleteControllerConfig; - targeters: ExtendedTarget[]; + targeters?: ExtendedTarget[]; services?: SnapControllerServices; url?: UrlTranslatorConfig; context?: ContextVariables; diff --git a/packages/snap-preact/src/components/BranchOverride.test.tsx b/packages/snap-preact/src/components/BranchOverride.test.tsx new file mode 100644 index 000000000..959959c13 --- /dev/null +++ b/packages/snap-preact/src/components/BranchOverride.test.tsx @@ -0,0 +1,7 @@ +import { BranchOverride } from './BranchOverride'; + +describe('BranchOverride Component', () => { + it('renders', () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/snap-preact/src/create/createAutocompleteController.test.ts b/packages/snap-preact/src/create/createAutocompleteController.test.ts new file mode 100644 index 000000000..0ad9480ea --- /dev/null +++ b/packages/snap-preact/src/create/createAutocompleteController.test.ts @@ -0,0 +1,217 @@ +import { Client } from '@searchspring/snap-client'; +import { AutocompleteStore } from '@searchspring/snap-store-mobx'; +import { UrlManager, UrlTranslator, reactLinker } from '@searchspring/snap-url-manager'; +import { EventManager } from '@searchspring/snap-event-manager'; +import { Profiler } from '@searchspring/snap-profiler'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; + +import { createAutocompleteController } from './index'; + +import type { SnapAutocompleteControllerConfig } from '../types'; +import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; + +const createConfig: SnapAutocompleteControllerConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + config: { + meta: { + cache: { + purgeable: false, + }, + }, + }, + }, + controller: { + id: 'ac', + selector: '.inputelem', + }, + context: { + shopper: { + id: 'snapdev', + }, + custom: { + testing: true, + }, + }, +}; + +describe('createAutocompleteController', () => { + beforeEach(() => { + delete window.searchspring; + }); + + it('throws when incomplete configuration is used', () => { + expect(() => { + // @ts-ignore - testing invalid config passed + const controller = createAutocompleteController({}); + }).toThrow(); + + expect(() => { + const bareConfig = { + controller: { + id: 'ac', + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createAutocompleteController(bareConfig); + }).toThrow(); + + expect(() => { + const bareConfig = { + client: { + globals: { + siteId: 'xxxxxx', + }, + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createAutocompleteController(bareConfig); + }).toThrow(); + }); + + it('creates an autocomplete controller', () => { + const controller = createAutocompleteController(createConfig); + + expect(controller).toBeDefined(); + expect(controller.id).toBe(createConfig.controller.id); + expect(controller.context).toBe(createConfig.context); + expect(controller.config.selector).toBe(createConfig.controller.selector); + + // services + expect(controller.client).toBeDefined(); + expect(controller.store).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + expect(controller.eventManager).toBeDefined(); + expect(controller.profiler).toBeDefined(); + expect(controller.log).toBeDefined(); + expect(controller.tracker).toBeDefined(); + + // other + expect(controller.urlManager.detached).toBeDefined(); + expect(controller.client.globals.siteId).toBe(createConfig.client.globals.siteId); + expect(controller.client.config.meta.cache.purgeable).toBe(createConfig.client.config.meta.cache.purgeable); + expect(controller.tracker.globals.siteId).toBe(createConfig.client.globals.siteId); + }); + + it('creates an autocomplete controller with custom UrlTranslator config', () => { + const customUrlConfig = { + ...createConfig, + url: { + settings: { + coreType: 'query', + customType: 'query', + }, + parameters: { + core: { + query: { name: 'query', type: 'query' }, + page: { name: 'p', type: 'query' }, + }, + }, + }, + }; + const controller = createAutocompleteController(customUrlConfig as SnapAutocompleteControllerConfig); + + expect(controller).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + // check for custom settings + for (const [key, value] of Object.entries(customUrlConfig.url.settings)) { + expect(translatorConfig.settings[key]).toBe(value); + } + // check for custom parameter configuration + for (const [key, value] of Object.entries(customUrlConfig.url.parameters.core)) { + expect(translatorConfig.parameters.core[key]).toStrictEqual(value); + } + }); + + describe('custom services', () => { + it('creates an autocomplete controller with custom Client service', () => { + const clientConfig = { siteId: 'custom' }; + const customClient = new Client(clientConfig); + + const controller = createAutocompleteController(createConfig, { client: customClient }); + + expect(controller).toBeDefined(); + expect(controller.client).toBe(customClient); + expect(controller.client.globals.siteId).toBe(clientConfig.siteId); + }); + + it('creates an autocomplete controller with custom Store service', () => { + const storeConfig = { + ...createConfig.controller, + settings: { + facets: { + pinFiltered: false, + }, + }, + }; + const customUrlManager = new UrlManager(new UrlTranslator(), reactLinker); + const customStore = new AutocompleteStore(storeConfig, { urlManager: customUrlManager }); + + const controller = createAutocompleteController(createConfig, { store: customStore }); + + expect(controller).toBeDefined(); + expect(controller.store).toBe(customStore); + }); + + it('creates an autocomplete controller with custom UrlManager service', () => { + const customTranslatorConfig = { + settings: { + coreType: 'hash', + }, + } as UrlTranslatorConfig; + const customUrlManager = new UrlManager(new UrlTranslator(customTranslatorConfig), reactLinker); + const controller = createAutocompleteController(createConfig, { urlManager: customUrlManager }); + + expect(controller).toBeDefined(); + expect(controller.urlManager.detached).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + expect(translatorConfig.settings.coreType).toBe(customTranslatorConfig.settings.coreType); + }); + + it('creates an autocomplete controller with custom EventManager service', () => { + const customEventManager = new EventManager(); + + const controller = createAutocompleteController(createConfig, { eventManager: customEventManager }); + + expect(controller).toBeDefined(); + expect(controller.eventManager).toBe(customEventManager); + }); + + it('creates an autocomplete controller with custom Profiler service', () => { + const customProfiler = new Profiler('customProfiler'); + + const controller = createAutocompleteController(createConfig, { profiler: customProfiler }); + + expect(controller).toBeDefined(); + expect(controller.profiler).toBe(customProfiler); + expect(controller.profiler.namespace).toBe('customProfiler'); + }); + + it('creates an autocomplete controller with custom Logger service', () => { + const customLogger = new Logger('customLogger'); + + const controller = createAutocompleteController(createConfig, { logger: customLogger }); + + expect(controller).toBeDefined(); + expect(controller.log).toBe(customLogger); + }); + + it('creates an autocomplete controller with custom Tracker service', () => { + const customTracker = new Tracker({ siteId: 'custom' }); + + const controller = createAutocompleteController(createConfig, { tracker: customTracker }); + + expect(controller).toBeDefined(); + expect(controller.tracker).toBe(customTracker); + expect(controller.tracker.globals.siteId).toBe('custom'); + }); + }); +}); diff --git a/packages/snap-preact/src/create/createFinderController.test.ts b/packages/snap-preact/src/create/createFinderController.test.ts new file mode 100644 index 000000000..2dca590f7 --- /dev/null +++ b/packages/snap-preact/src/create/createFinderController.test.ts @@ -0,0 +1,232 @@ +import { Client } from '@searchspring/snap-client'; +import { FinderStore } from '@searchspring/snap-store-mobx'; +import { UrlManager, UrlTranslator, reactLinker } from '@searchspring/snap-url-manager'; +import { EventManager } from '@searchspring/snap-event-manager'; +import { Profiler } from '@searchspring/snap-profiler'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; + +import { createFinderController } from './index'; + +import type { SnapFinderControllerConfig } from '../types'; +import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; + +const createConfig: SnapFinderControllerConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + config: { + meta: { + cache: { + purgeable: false, + }, + }, + }, + }, + controller: { + id: 'finder', + url: '/', + fields: [ + { + field: 'size_footwear', + label: 'Size', + }, + { + field: 'color_family', + label: 'Color', + }, + { + field: 'brand', + label: 'Brand', + }, + ], + }, + context: { + shopper: { + id: 'snapdev', + }, + custom: { + testing: true, + }, + }, +}; + +describe('createFinderController', () => { + beforeEach(() => { + delete window.searchspring; + }); + + it('throws when incomplete configuration is used', () => { + expect(() => { + // @ts-ignore - testing invalid config passed + const controller = createFinderController({}); + }).toThrow(); + + expect(() => { + const bareConfig = { + controller: { + id: 'ac', + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createFinderController(bareConfig); + }).toThrow(); + + expect(() => { + const bareConfig = { + client: { + globals: { + siteId: 'xxxxxx', + }, + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createFinderController(bareConfig); + }).toThrow(); + }); + + it('creates an finder controller', () => { + const controller = createFinderController(createConfig); + + expect(controller).toBeDefined(); + expect(controller.id).toBe(createConfig.controller.id); + expect(controller.context).toBe(createConfig.context); + expect(controller.config.url).toBe(createConfig.controller.url); + expect(controller.config.fields).toStrictEqual(createConfig.controller.fields); + + // services + expect(controller.client).toBeDefined(); + expect(controller.store).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + expect(controller.eventManager).toBeDefined(); + expect(controller.profiler).toBeDefined(); + expect(controller.log).toBeDefined(); + expect(controller.tracker).toBeDefined(); + + // other + expect(controller.urlManager.detached).toBeDefined(); + expect(controller.client.globals.siteId).toBe(createConfig.client.globals.siteId); + expect(controller.client.config.meta.cache.purgeable).toBe(createConfig.client.config.meta.cache.purgeable); + expect(controller.tracker.globals.siteId).toBe(createConfig.client.globals.siteId); + }); + + it('creates an finder controller with custom UrlTranslator config', () => { + const customUrlConfig = { + ...createConfig, + url: { + settings: { + coreType: 'query', + customType: 'query', + }, + parameters: { + core: { + query: { name: 'query', type: 'query' }, + page: { name: 'p', type: 'query' }, + }, + }, + }, + }; + const controller = createFinderController(customUrlConfig as SnapFinderControllerConfig); + + expect(controller).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + // check for custom settings + for (const [key, value] of Object.entries(customUrlConfig.url.settings)) { + expect(translatorConfig.settings[key]).toBe(value); + } + // check for custom parameter configuration + for (const [key, value] of Object.entries(customUrlConfig.url.parameters.core)) { + expect(translatorConfig.parameters.core[key]).toStrictEqual(value); + } + }); + + describe('custom services', () => { + it('creates an finder controller with custom Client service', () => { + const clientConfig = { siteId: 'custom' }; + const customClient = new Client(clientConfig); + + const controller = createFinderController(createConfig, { client: customClient }); + + expect(controller).toBeDefined(); + expect(controller.client).toBe(customClient); + expect(controller.client.globals.siteId).toBe(clientConfig.siteId); + }); + + it('creates an finder controller with custom Store service', () => { + const storeConfig = { + ...createConfig.controller, + settings: { + facets: { + pinFiltered: false, + }, + }, + }; + const customUrlManager = new UrlManager(new UrlTranslator(), reactLinker); + const customStore = new FinderStore(storeConfig, { urlManager: customUrlManager }); + + const controller = createFinderController(createConfig, { store: customStore }); + + expect(controller).toBeDefined(); + expect(controller.store).toBe(customStore); + }); + + it('creates an finder controller with custom UrlManager service', () => { + const customTranslatorConfig = { + settings: { + coreType: 'hash', + }, + } as UrlTranslatorConfig; + const customUrlManager = new UrlManager(new UrlTranslator(customTranslatorConfig), reactLinker); + const controller = createFinderController(createConfig, { urlManager: customUrlManager }); + + expect(controller).toBeDefined(); + expect(controller.urlManager.detached).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + expect(translatorConfig.settings.coreType).toBe(customTranslatorConfig.settings.coreType); + }); + + it('creates an finder controller with custom EventManager service', () => { + const customEventManager = new EventManager(); + + const controller = createFinderController(createConfig, { eventManager: customEventManager }); + + expect(controller).toBeDefined(); + expect(controller.eventManager).toBe(customEventManager); + }); + + it('creates an finder controller with custom Profiler service', () => { + const customProfiler = new Profiler('customProfiler'); + + const controller = createFinderController(createConfig, { profiler: customProfiler }); + + expect(controller).toBeDefined(); + expect(controller.profiler).toBe(customProfiler); + expect(controller.profiler.namespace).toBe('customProfiler'); + }); + + it('creates an finder controller with custom Logger service', () => { + const customLogger = new Logger('customLogger'); + + const controller = createFinderController(createConfig, { logger: customLogger }); + + expect(controller).toBeDefined(); + expect(controller.log).toBe(customLogger); + }); + + it('creates an finder controller with custom Tracker service', () => { + const customTracker = new Tracker({ siteId: 'custom' }); + + const controller = createFinderController(createConfig, { tracker: customTracker }); + + expect(controller).toBeDefined(); + expect(controller.tracker).toBe(customTracker); + expect(controller.tracker.globals.siteId).toBe('custom'); + }); + }); +}); diff --git a/packages/snap-preact/src/create/createRecommendationController.test.ts b/packages/snap-preact/src/create/createRecommendationController.test.ts new file mode 100644 index 000000000..a5ddc0039 --- /dev/null +++ b/packages/snap-preact/src/create/createRecommendationController.test.ts @@ -0,0 +1,217 @@ +import { Client } from '@searchspring/snap-client'; +import { RecommendationStore } from '@searchspring/snap-store-mobx'; +import { UrlManager, UrlTranslator, reactLinker } from '@searchspring/snap-url-manager'; +import { EventManager } from '@searchspring/snap-event-manager'; +import { Profiler } from '@searchspring/snap-profiler'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; + +import { createRecommendationController } from './index'; + +import type { SnapRecommendationControllerConfig } from '../types'; +import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; + +const createConfig: SnapRecommendationControllerConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + config: { + meta: { + cache: { + purgeable: false, + }, + }, + }, + }, + controller: { + id: 'recommendation', + tag: 'profile', + }, + context: { + shopper: { + id: 'snapdev', + }, + custom: { + testing: true, + }, + }, +}; + +describe('createRecommendationController', () => { + beforeEach(() => { + delete window.searchspring; + }); + + it('throws when incomplete configuration is used', () => { + expect(() => { + // @ts-ignore - testing invalid config passed + const controller = createRecommendationController({}); + }).toThrow(); + + expect(() => { + const bareConfig = { + controller: { + id: 'ac', + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createRecommendationController(bareConfig); + }).toThrow(); + + expect(() => { + const bareConfig = { + client: { + globals: { + siteId: 'xxxxxx', + }, + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createRecommendationController(bareConfig); + }).toThrow(); + }); + + it('creates an recommendation controller', () => { + const controller = createRecommendationController(createConfig); + + expect(controller).toBeDefined(); + expect(controller.id).toBe(createConfig.controller.id); + expect(controller.context).toBe(createConfig.context); + expect(controller.config.tag).toBe(createConfig.controller.tag); + + // services + expect(controller.client).toBeDefined(); + expect(controller.store).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + expect(controller.eventManager).toBeDefined(); + expect(controller.profiler).toBeDefined(); + expect(controller.log).toBeDefined(); + expect(controller.tracker).toBeDefined(); + + // other + expect(controller.urlManager.detached).toBeDefined(); + expect(controller.client.globals.siteId).toBe(createConfig.client.globals.siteId); + expect(controller.client.config.meta.cache.purgeable).toBe(createConfig.client.config.meta.cache.purgeable); + expect(controller.tracker.globals.siteId).toBe(createConfig.client.globals.siteId); + }); + + it('creates an recommendation controller with custom UrlTranslator config', () => { + const customUrlConfig = { + ...createConfig, + url: { + settings: { + coreType: 'query', + customType: 'query', + }, + parameters: { + core: { + query: { name: 'query', type: 'query' }, + page: { name: 'p', type: 'query' }, + }, + }, + }, + }; + const controller = createRecommendationController(customUrlConfig as SnapRecommendationControllerConfig); + + expect(controller).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + // check for custom settings + for (const [key, value] of Object.entries(customUrlConfig.url.settings)) { + expect(translatorConfig.settings[key]).toBe(value); + } + // check for custom parameter configuration + for (const [key, value] of Object.entries(customUrlConfig.url.parameters.core)) { + expect(translatorConfig.parameters.core[key]).toStrictEqual(value); + } + }); + + describe('custom services', () => { + it('creates an recommendation controller with custom Client service', () => { + const clientConfig = { siteId: 'custom' }; + const customClient = new Client(clientConfig); + + const controller = createRecommendationController(createConfig, { client: customClient }); + + expect(controller).toBeDefined(); + expect(controller.client).toBe(customClient); + expect(controller.client.globals.siteId).toBe(clientConfig.siteId); + }); + + it('creates an recommendation controller with custom Store service', () => { + const storeConfig = { + ...createConfig.controller, + settings: { + facets: { + pinFiltered: false, + }, + }, + }; + const customUrlManager = new UrlManager(new UrlTranslator(), reactLinker); + const customStore = new RecommendationStore(storeConfig, { urlManager: customUrlManager }); + + const controller = createRecommendationController(createConfig, { store: customStore }); + + expect(controller).toBeDefined(); + expect(controller.store).toBe(customStore); + }); + + it('creates an recommendation controller with custom UrlManager service', () => { + const customTranslatorConfig = { + settings: { + coreType: 'hash', + }, + } as UrlTranslatorConfig; + const customUrlManager = new UrlManager(new UrlTranslator(customTranslatorConfig), reactLinker); + const controller = createRecommendationController(createConfig, { urlManager: customUrlManager }); + + expect(controller).toBeDefined(); + expect(controller.urlManager.detached).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + expect(translatorConfig.settings.coreType).toBe(customTranslatorConfig.settings.coreType); + }); + + it('creates an recommendation controller with custom EventManager service', () => { + const customEventManager = new EventManager(); + + const controller = createRecommendationController(createConfig, { eventManager: customEventManager }); + + expect(controller).toBeDefined(); + expect(controller.eventManager).toBe(customEventManager); + }); + + it('creates an recommendation controller with custom Profiler service', () => { + const customProfiler = new Profiler('customProfiler'); + + const controller = createRecommendationController(createConfig, { profiler: customProfiler }); + + expect(controller).toBeDefined(); + expect(controller.profiler).toBe(customProfiler); + expect(controller.profiler.namespace).toBe('customProfiler'); + }); + + it('creates an recommendation controller with custom Logger service', () => { + const customLogger = new Logger('customLogger'); + + const controller = createRecommendationController(createConfig, { logger: customLogger }); + + expect(controller).toBeDefined(); + expect(controller.log).toBe(customLogger); + }); + + it('creates an recommendation controller with custom Tracker service', () => { + const customTracker = new Tracker({ siteId: 'custom' }); + + const controller = createRecommendationController(createConfig, { tracker: customTracker }); + + expect(controller).toBeDefined(); + expect(controller.tracker).toBe(customTracker); + expect(controller.tracker.globals.siteId).toBe('custom'); + }); + }); +}); diff --git a/packages/snap-preact/src/create/createSearchController.test.ts b/packages/snap-preact/src/create/createSearchController.test.ts new file mode 100644 index 000000000..1cc061adb --- /dev/null +++ b/packages/snap-preact/src/create/createSearchController.test.ts @@ -0,0 +1,216 @@ +import { Client } from '@searchspring/snap-client'; +import { SearchStore } from '@searchspring/snap-store-mobx'; +import { UrlManager, UrlTranslator, reactLinker } from '@searchspring/snap-url-manager'; +import { EventManager } from '@searchspring/snap-event-manager'; +import { Profiler } from '@searchspring/snap-profiler'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; + +import { createSearchController } from './index'; + +import type { SnapSearchControllerConfig } from '../types'; +import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; + +const createConfig: SnapSearchControllerConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + config: { + meta: { + cache: { + purgeable: false, + }, + }, + }, + }, + controller: { + id: 'search', + }, + context: { + shopper: { + id: 'snapdev', + }, + custom: { + testing: true, + }, + }, +}; + +describe('createSearchController', () => { + beforeEach(() => { + delete window.searchspring; + }); + + it('throws when incomplete configuration is used', () => { + expect(() => { + // @ts-ignore - testing invalid config passed + const controller = createSearchController({}); + }).toThrow(); + + expect(() => { + const bareConfig = { + controller: { + id: 'ac', + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createSearchController(bareConfig); + }).toThrow(); + + expect(() => { + const bareConfig = { + client: { + globals: { + siteId: 'xxxxxx', + }, + }, + }; + + // @ts-ignore - testing invalid config passed + const controller = createSearchController(bareConfig); + }).toThrow(); + }); + + it('creates an search controller', () => { + const controller = createSearchController(createConfig); + + expect(controller).toBeDefined(); + expect(controller.id).toBe(createConfig.controller.id); + expect(controller.context).toBe(createConfig.context); + expect(controller.config.tag).toBe(createConfig.controller.tag); + + // services + expect(controller.client).toBeDefined(); + expect(controller.store).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + expect(controller.eventManager).toBeDefined(); + expect(controller.profiler).toBeDefined(); + expect(controller.log).toBeDefined(); + expect(controller.tracker).toBeDefined(); + + // other + expect(controller.urlManager.detached).not.toBeDefined(); + expect(controller.client.globals.siteId).toBe(createConfig.client.globals.siteId); + expect(controller.client.config.meta.cache.purgeable).toBe(createConfig.client.config.meta.cache.purgeable); + expect(controller.tracker.globals.siteId).toBe(createConfig.client.globals.siteId); + }); + + it('creates an search controller with custom UrlTranslator config', () => { + const customUrlConfig = { + ...createConfig, + url: { + settings: { + coreType: 'query', + customType: 'query', + }, + parameters: { + core: { + query: { name: 'query', type: 'query' }, + page: { name: 'p', type: 'query' }, + }, + }, + }, + }; + const controller = createSearchController(customUrlConfig as SnapSearchControllerConfig); + + expect(controller).toBeDefined(); + expect(controller.urlManager).toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + // check for custom settings + for (const [key, value] of Object.entries(customUrlConfig.url.settings)) { + expect(translatorConfig.settings[key]).toBe(value); + } + // check for custom parameter configuration + for (const [key, value] of Object.entries(customUrlConfig.url.parameters.core)) { + expect(translatorConfig.parameters.core[key]).toStrictEqual(value); + } + }); + + describe('custom services', () => { + it('creates an search controller with custom Client service', () => { + const clientConfig = { siteId: 'custom' }; + const customClient = new Client(clientConfig); + + const controller = createSearchController(createConfig, { client: customClient }); + + expect(controller).toBeDefined(); + expect(controller.client).toBe(customClient); + expect(controller.client.globals.siteId).toBe(clientConfig.siteId); + }); + + it('creates an search controller with custom Store service', () => { + const storeConfig = { + ...createConfig.controller, + settings: { + facets: { + pinFiltered: false, + }, + }, + }; + const customUrlManager = new UrlManager(new UrlTranslator(), reactLinker); + const customStore = new SearchStore(storeConfig, { urlManager: customUrlManager }); + + const controller = createSearchController(createConfig, { store: customStore }); + + expect(controller).toBeDefined(); + expect(controller.store).toBe(customStore); + }); + + it('creates an search controller with custom UrlManager service', () => { + const customTranslatorConfig = { + settings: { + coreType: 'hash', + }, + } as UrlTranslatorConfig; + const customUrlManager = new UrlManager(new UrlTranslator(customTranslatorConfig), reactLinker); + const controller = createSearchController(createConfig, { urlManager: customUrlManager }); + + expect(controller).toBeDefined(); + expect(controller.urlManager.detached).not.toBeDefined(); + + const translatorConfig = controller.urlManager.getTranslatorConfig() as UrlTranslatorConfig; + expect(translatorConfig.settings.coreType).toBe(customTranslatorConfig.settings.coreType); + }); + + it('creates an search controller with custom EventManager service', () => { + const customEventManager = new EventManager(); + + const controller = createSearchController(createConfig, { eventManager: customEventManager }); + + expect(controller).toBeDefined(); + expect(controller.eventManager).toBe(customEventManager); + }); + + it('creates an search controller with custom Profiler service', () => { + const customProfiler = new Profiler('customProfiler'); + + const controller = createSearchController(createConfig, { profiler: customProfiler }); + + expect(controller).toBeDefined(); + expect(controller.profiler).toBe(customProfiler); + expect(controller.profiler.namespace).toBe('customProfiler'); + }); + + it('creates an search controller with custom Logger service', () => { + const customLogger = new Logger('customLogger'); + + const controller = createSearchController(createConfig, { logger: customLogger }); + + expect(controller).toBeDefined(); + expect(controller.log).toBe(customLogger); + }); + + it('creates an search controller with custom Tracker service', () => { + const customTracker = new Tracker({ siteId: 'custom' }); + + const controller = createSearchController(createConfig, { tracker: customTracker }); + + expect(controller).toBeDefined(); + expect(controller.tracker).toBe(customTracker); + expect(controller.tracker.globals.siteId).toBe('custom'); + }); + }); +}); diff --git a/packages/snap-preact/src/create/index.ts b/packages/snap-preact/src/create/index.ts index ea9c9f714..abb054811 100644 --- a/packages/snap-preact/src/create/index.ts +++ b/packages/snap-preact/src/create/index.ts @@ -1,4 +1,4 @@ export { default as createAutocompleteController } from './createAutocompleteController'; export { default as createFinderController } from './createFinderController'; -export { default as createRecommendationsController } from './createRecommendationController'; +export { default as createRecommendationController } from './createRecommendationController'; export { default as createSearchController } from './createSearchController'; From 4dbfc4cf372d6eb5d6096519b4704cc50d5e9790 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:09:37 -0600 Subject: [PATCH 02/27] refactor(controllers): refactored typing for controllers to utilize a shared enum for `type` --- .../src/Autocomplete/AutocompleteController.ts | 4 ++-- packages/snap-controller/src/Finder/FinderController.ts | 3 ++- .../src/Recommendation/RecommendationController.ts | 3 ++- packages/snap-controller/src/Search/SearchController.ts | 3 ++- packages/snap-controller/src/types.ts | 7 +++++++ packages/snap-preact/src/types.ts | 6 ++++++ 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts index 25b933cde..63828c4cb 100644 --- a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts +++ b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts @@ -1,9 +1,9 @@ import deepmerge from 'deepmerge'; import { StorageStore, StorageType, ErrorType } from '@searchspring/snap-store-mobx'; -import { url } from '@searchspring/snap-toolbox'; import { AbstractController } from '../Abstract/AbstractController'; import { getSearchParams } from '../utils/getParams'; +import { ControllerTypes } from '../types'; import type { AutocompleteStore } from '@searchspring/snap-store-mobx'; import type { @@ -45,7 +45,7 @@ type AutocompleteTrackMethods = { }; export class AutocompleteController extends AbstractController { - public type = 'autocomplete'; + public type = ControllerTypes.autocomplete; public store: AutocompleteStore; public config: AutocompleteControllerConfig; public storage: StorageStore; diff --git a/packages/snap-controller/src/Finder/FinderController.ts b/packages/snap-controller/src/Finder/FinderController.ts index 516f6dced..e7dbe22fb 100644 --- a/packages/snap-controller/src/Finder/FinderController.ts +++ b/packages/snap-controller/src/Finder/FinderController.ts @@ -4,6 +4,7 @@ import { ErrorType } from '@searchspring/snap-store-mobx'; import { AbstractController } from '../Abstract/AbstractController'; import { getSearchParams } from '../utils/getParams'; +import { ControllerTypes } from '../types'; import type { FinderStore } from '@searchspring/snap-store-mobx'; import type { FinderControllerConfig, BeforeSearchObj, AfterSearchObj, ControllerServices, NextEvent, ContextVariables } from '../types'; @@ -14,7 +15,7 @@ const defaultConfig: FinderControllerConfig = { }; export class FinderController extends AbstractController { - public type = 'finder'; + public type = ControllerTypes.finder; public store: FinderStore; config: FinderControllerConfig; diff --git a/packages/snap-controller/src/Recommendation/RecommendationController.ts b/packages/snap-controller/src/Recommendation/RecommendationController.ts index 739f3bcf9..a4d233435 100644 --- a/packages/snap-controller/src/Recommendation/RecommendationController.ts +++ b/packages/snap-controller/src/Recommendation/RecommendationController.ts @@ -3,6 +3,7 @@ import deepmerge from 'deepmerge'; import { BeaconType, BeaconCategory } from '@searchspring/snap-tracker'; import { LogMode } from '@searchspring/snap-logger'; import { AbstractController } from '../Abstract/AbstractController'; +import { ControllerTypes } from '../types'; import { ErrorType } from '@searchspring/snap-store-mobx'; import type { BeaconEvent } from '@searchspring/snap-tracker'; @@ -29,7 +30,7 @@ const defaultConfig: RecommendationControllerConfig = { }; export class RecommendationController extends AbstractController { - public type = 'recommendation'; + public type = ControllerTypes.recommendation; public store: RecommendationStore; config: RecommendationControllerConfig; events = { diff --git a/packages/snap-controller/src/Search/SearchController.ts b/packages/snap-controller/src/Search/SearchController.ts index 81641f4a3..c543a57ec 100644 --- a/packages/snap-controller/src/Search/SearchController.ts +++ b/packages/snap-controller/src/Search/SearchController.ts @@ -3,6 +3,7 @@ import deepmerge from 'deepmerge'; import { AbstractController } from '../Abstract/AbstractController'; import { StorageStore, StorageType, ErrorType } from '@searchspring/snap-store-mobx'; import { getSearchParams } from '../utils/getParams'; +import { ControllerTypes } from '../types'; import type { BeaconEvent } from '@searchspring/snap-tracker'; import type { SearchStore } from '@searchspring/snap-store-mobx'; @@ -41,7 +42,7 @@ type SearchTrackMethods = { }; export class SearchController extends AbstractController { - public type = 'search'; + public type = ControllerTypes.search; public store: SearchStore; config: SearchControllerConfig; storage: StorageStore; diff --git a/packages/snap-controller/src/types.ts b/packages/snap-controller/src/types.ts index 11584ae75..677027396 100644 --- a/packages/snap-controller/src/types.ts +++ b/packages/snap-controller/src/types.ts @@ -45,6 +45,13 @@ export type AfterStoreObj = { response: any; }; +export enum ControllerTypes { + search = 'search', + autocomplete = 'autocomplete', + finder = 'finder', + recommendation = 'recommendation', +} + export type ControllerServices = { client: Client; store: AbstractStore; diff --git a/packages/snap-preact/src/types.ts b/packages/snap-preact/src/types.ts index 277df3e08..9cf69158a 100644 --- a/packages/snap-preact/src/types.ts +++ b/packages/snap-preact/src/types.ts @@ -24,6 +24,12 @@ export type SnapControllerServices = { tracker?: Tracker; }; +export type SnapControllerConfigs = + | SnapSearchControllerConfig + | SnapAutocompleteControllerConfig + | SnapFinderControllerConfig + | SnapRecommendationControllerConfig; + export type RootComponent = React.ElementType<{ controller: AbstractController }>; export type SnapSearchControllerConfig = { From f980caee18e3625f28b3accfb1dbbe2c18171674 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:13:25 -0600 Subject: [PATCH 03/27] fix(recommendationcontroller): fixing bug which did not allow for instantiator branch param change --- .../src/Recommendation/RecommendationController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap-controller/src/Recommendation/RecommendationController.ts b/packages/snap-controller/src/Recommendation/RecommendationController.ts index a4d233435..480312613 100644 --- a/packages/snap-controller/src/Recommendation/RecommendationController.ts +++ b/packages/snap-controller/src/Recommendation/RecommendationController.ts @@ -243,8 +243,8 @@ export class RecommendationController extends AbstractController { const params = { tag: this.config.tag, batched: this.config.batched, - ...this.config.globals, branch: this.config.branch || 'production', + ...this.config.globals, }; const shopperId = this.tracker.context.shopperId; const cart = this.tracker.cookies.cart.get(); From 0b273d2c40eedbd8901d732cb6df8d3748a886c7 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:14:27 -0600 Subject: [PATCH 04/27] refactor(snapify): correcting import after namechange in previous commit --- packages/snap-preact-components/src/utilities/snapify.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/snap-preact-components/src/utilities/snapify.ts b/packages/snap-preact-components/src/utilities/snapify.ts index 6ef1a26c1..9f97cb9a0 100644 --- a/packages/snap-preact-components/src/utilities/snapify.ts +++ b/packages/snap-preact-components/src/utilities/snapify.ts @@ -1,6 +1,6 @@ import { h, render } from 'preact'; /* searchspring imports */ -import { createSearchController, createAutocompleteController, createRecommendationsController } from '@searchspring/snap-preact'; +import { createSearchController, createAutocompleteController, createRecommendationController } from '@searchspring/snap-preact'; import type { SearchController, AutocompleteController, @@ -21,7 +21,7 @@ export class Snapify { return controllers[id]; } - const cntrlr: RecommendationController = (controllers[id] = createRecommendationsController({ client, controller: config })); + const cntrlr: RecommendationController = (controllers[id] = createRecommendationController({ client, controller: config })); cntrlr.on('afterStore', async ({ controller }: { controller: RecommendationController }, next) => { controller.log.debug('controller', controller); From 4baee3cb44bdd3900d73d156f7788212f6377d89 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:19:55 -0600 Subject: [PATCH 05/27] feat(instantiator-recommendation): param plugin support, services included or passed in constructor --- .../RecommendationInstantiator.tsx | 91 ++++++++++--------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx index e3669800f..b59461568 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx @@ -2,16 +2,21 @@ import { render } from 'preact'; import deepmerge from 'deepmerge'; import { DomTargeter, getContext } from '@searchspring/snap-toolbox'; +import { Client } from '@searchspring/snap-client'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; -import type { Logger } from '@searchspring/snap-logger'; +import type { ClientConfig, ClientGlobals } from '@searchspring/snap-client'; import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; -import type { Client } from '@searchspring/snap-client'; -import type { Tracker } from '@searchspring/snap-tracker'; import type { AbstractController, RecommendationController, Attachments, ContextVariables } from '@searchspring/snap-controller'; import type { Middleware } from '@searchspring/snap-event-manager'; import type { SnapControllerServices, RootComponent } from '../types'; export type RecommendationInstantiatorConfig = { + client?: { + globals: ClientGlobals; + config?: ClientConfig; + }; components: { [name: string]: () => Promise | RootComponent; }; @@ -22,34 +27,33 @@ export type RecommendationInstantiatorConfig = { limit?: number; } & Attachments; selector?: string; - services?: SnapControllerServices; url?: UrlTranslatorConfig; context?: ContextVariables; }; export type RecommendationInstantiatorServices = { - client: Client; - logger: Logger; - tracker: Tracker; + client?: Client; + logger?: Logger; + tracker?: Tracker; }; export class RecommendationInstantiator { - controllers: { + public client: Client; + public tracker: Tracker; + public logger: Logger; + public controllers: { [key: string]: RecommendationController; } = {}; - client: Client; - tracker: Tracker; - logger: Logger; - config: RecommendationInstantiatorConfig; - context: ContextVariables; - uses: Attachments[] = []; - plugins: { (cntrlr: AbstractController): Promise }[] = []; - middleware: { event: string; func: Middleware[] }[] = []; + public config: RecommendationInstantiatorConfig; + public context: ContextVariables; public targeter: DomTargeter; - constructor(config: RecommendationInstantiatorConfig, { client, logger, tracker }: RecommendationInstantiatorServices, context?: ContextVariables) { + private uses: Attachments[] = []; + private plugins: { func: (cntrlr: AbstractController, ...args) => Promise; args: unknown[] }[] = []; + private middleware: { event: string; func: Middleware[] }[] = []; + + constructor(config: RecommendationInstantiatorConfig, services?: RecommendationInstantiatorServices, context?: ContextVariables) { this.config = config; - this.context = deepmerge(context || {}, config.context || {}); if (!this.config) { throw new Error(`Recommendation Instantiator config is required`); @@ -59,13 +63,18 @@ export class RecommendationInstantiator { throw new Error(`Recommendation Instantiator config must contain 'branch' property`); } - if (!this.config.components || typeof this.config.components != 'object') { + if (!this.config.components || typeof this.config.components != 'object' || !Object.keys(this.config.components).length) { throw new Error(`Recommendation Instantiator config must contain 'components' mapping property`); } - this.client = client; - this.tracker = tracker; - this.logger = logger; + if ((!services?.client || !services?.tracker) && !this.config?.client?.globals?.siteId) { + throw new Error(`Recommendation Instantiator config must contain a valid config.client.globals.siteId value`); + } + + this.context = deepmerge(context || {}, config.context || {}); + this.client = services?.client || new Client(this.config.client.globals, this.config.client.config); + this.tracker = services?.tracker || new Tracker(this.config.client.globals); + this.logger = services?.logger || new Logger('RecommendationInstantiator '); const profileCount = {}; this.targeter = new DomTargeter( @@ -142,7 +151,7 @@ export class RecommendationInstantiator { const defaultGlobals = { limits: 20, }; - const globals = deepmerge(deepmerge(defaultGlobals, this.config.config?.globals || {}), contextGlobals); + const globals = deepmerge(deepmerge(defaultGlobals, this.config.client?.globals || {}), contextGlobals); const controllerConfig = { id: `recommend_${tag + (profileCount[tag] - 1)}`, @@ -154,56 +163,54 @@ export class RecommendationInstantiator { }; const createRecommendationController = (await import('../create/createRecommendationController')).default; - const client = this.config.services?.client || this.client; - const tracker = this.config.services?.tracker || this.tracker; - const recs = createRecommendationController( + const controller = createRecommendationController( { url: this.config.url || {}, controller: controllerConfig, context, }, - { client, tracker } + { client: this.client, tracker: this.tracker } ); - this.uses.forEach((attachements) => recs.use(attachements)); - this.plugins.forEach((plugin) => recs.plugin(plugin)); - this.middleware.forEach((middleware) => recs.on(middleware.event, ...middleware.func)); + this.uses.forEach((attachements) => controller.use(attachements)); + this.plugins.forEach((plugin) => controller.plugin(plugin.func, ...plugin.args)); + this.middleware.forEach((middleware) => controller.on(middleware.event, ...middleware.func)); - await recs.search(); + await controller.search(); - recs.addTargeter(this.targeter); + controller.addTargeter(this.targeter); - this.controllers[recs.config.id] = recs; + this.controllers[controller.config.id] = controller; - const profileVars = recs.store.profile.display.templateParameters; - const component = recs.store.profile.display.template?.component; + const profileVars = controller.store.profile.display.templateParameters; + const component = controller.store.profile.display.template?.component; if (!profileVars) { - recs.log.error(`profile failed to load!`); + this.logger.error(`profile '${tag}' found on ${elem} is missing templateParameters!`); return; } if (!component) { - recs.log.error(`template does not support components!`); + this.logger.error(`profile '${tag}' found on ${elem} is missing component!`); return; } - const RecommendationsComponent = this.config.components && (await this.config.components[component]()); + const RecommendationsComponent = this.config.components[component] && (await this.config.components[component]()); if (!RecommendationsComponent) { - recs.log.error(`component '${profileVars.component}' not found!`); + this.logger.error(`profile '${tag}' found on ${elem} is expecting component mapping for '${component}' - verify instantiator config.`); return; } setTimeout(() => { - render(, injectedElem); + render(, injectedElem); }); } ); } - public plugin(func: (cntrlr: AbstractController) => Promise): void { - this.plugins.push(func); + public plugin(func: (cntrlr: AbstractController, ...args) => Promise, ...args: unknown[]): void { + this.plugins.push({ func, args }); } public on(event: string, ...func: Middleware[]): void { From c7d3d5c98342fd7980158dac01476c6b73e720e4 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:21:18 -0600 Subject: [PATCH 06/27] test(instantiator-recommendations): adding missing mockClient method, mock data and testing --- .../RecommendationInstantiator.test.tsx | 369 +++++++++++++++++- .../snap-shared/src/MockClient/MockClient.ts | 4 + .../recommend/profile/8uyt2m/default.json | 20 +- .../profile/8uyt2m/missingComponent.json | 16 + .../profile/8uyt2m/missingParameters.json | 16 + 5 files changed, 410 insertions(+), 15 deletions(-) create mode 100644 packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingComponent.json create mode 100644 packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingParameters.json diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx index fd3be7242..06144f49f 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx @@ -1,7 +1,370 @@ -import { RecommendationInstantiator } from './RecommendationInstantiator'; +import { RecommendationInstantiator, RecommendationInstantiatorConfig } from './RecommendationInstantiator'; +import type { PluginGrouping } from '@searchspring/snap-controller'; + +import { Logger } from '@searchspring/snap-logger'; +import { MockClient } from '@searchspring/snap-shared'; + +const DEFAULT_PROFILE = 'trending'; + +const Component = (props) => { + const controller = props.controller; + return
{controller.type}
; +}; + +const wait = (time = 1) => { + return new Promise((resolve) => { + setTimeout(resolve, time); + }); +}; + +const baseConfig: RecommendationInstantiatorConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + }, + components: { + Default: async () => Component, + }, + config: { + branch: 'production', + }, +}; describe('RecommendationInstantiator', () => { - it('exists', () => { - expect(true).toBe(true); + beforeEach(() => { + delete window.searchspring; + }); + + it('throws if configuration is not provided', () => { + expect(() => { + // @ts-ignore - testing bad instantiation + const recommendationInstantiator = new RecommendationInstantiator(); + }).toThrow(); + }); + + it('throws if configuration is missing branch config', () => { + const invalidConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + }, + components: { + Default: async () => Component, + }, + config: {}, + }; + + expect(() => { + // @ts-ignore - testing bad instantiation + const recommendationInstantiator = new RecommendationInstantiator(invalidConfig); + }).toThrow(); + }); + + it('throws if configuration is missing client globals', () => { + const invalidConfig = { + components: { + Default: async () => Component, + }, + config: { + branch: 'production', + }, + }; + + expect(() => { + // @ts-ignore - testing bad instantiation + const recommendationInstantiator = new RecommendationInstantiator(invalidConfig); + }).toThrow(); + }); + + it('throws if configuration is not complete', () => { + const invalidConfig = { + components: { + Default: async () => Component, + }, + config: { + branch: 'production', + }, + }; + + expect(() => { + // @ts-ignore - testing bad instantiation + const recommendationInstantiator = new RecommendationInstantiator(invalidConfig); + }).toThrow(); + }); + + it('throws if configuration is missing component mapping', () => { + const invalidConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + }, + components: {}, + config: { + branch: 'production', + }, + }; + + expect(() => { + // @ts-ignore - testing bad instantiation + const recommendationInstantiator = new RecommendationInstantiator(invalidConfig); + }).toThrow(); + }); + + it('creates a proper RecommendationInstantiator object with minimal configuration', () => { + const recommendationInstantiator = new RecommendationInstantiator(baseConfig); + + // services are defined + expect(recommendationInstantiator.logger).toBeDefined(); + expect(recommendationInstantiator.client).toBeDefined(); + expect(recommendationInstantiator.tracker).toBeDefined(); + + // properties are defined + expect(recommendationInstantiator.config).toStrictEqual(baseConfig); + expect(recommendationInstantiator.context).toStrictEqual({}); + expect(recommendationInstantiator.controllers).toStrictEqual({}); + + // @ts-ignore - checking private property + expect(recommendationInstantiator.client.globals.siteId).toBe(baseConfig.client.globals.siteId); + }); + + it('skips creation and logs a warning when it finds a target without a profile', async () => { + document.body.innerHTML = ``; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + expect(() => { + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(0); + expect(clientSpy).toHaveBeenCalledTimes(0); + }).toThrow(); + }); + + it('logs an error when the profile response does not contain templateParameters', async () => { + document.body.innerHTML = ``; + + const logger = new Logger('RecommendationInstantiator '); + const loggerSpy = jest.spyOn(logger, 'error'); + const client = new MockClient(baseConfig.client.globals, {}); + client.mockData.updateConfig({ recommend: { profile: 'missingParameters' } }); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { logger, client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledTimes(1); + }); + + it('logs an error when the profile response does not contain a component', async () => { + document.body.innerHTML = ``; + + const logger = new Logger('RecommendationInstantiator '); + const loggerSpy = jest.spyOn(logger, 'error'); + const client = new MockClient(baseConfig.client.globals, {}); + client.mockData.updateConfig({ recommend: { profile: 'missingComponent' } }); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { logger, client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledTimes(1); + }); + + it('logs an error when the profile response does not find a mapped component', async () => { + document.body.innerHTML = ``; + + const logger = new Logger('RecommendationInstantiator '); + const loggerSpy = jest.spyOn(logger, 'error'); + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const modifiedConfig = { + ...baseConfig, + components: { + Recs: () => Component, + }, + }; + + const recommendationInstantiator = new RecommendationInstantiator(modifiedConfig, { logger, client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledTimes(1); + }); + + it('creates a controllers when it finds a target', async () => { + document.body.innerHTML = ``; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controllers[controllerId]; + expect(controllerId).toBe(`recommend_${controller.context.profile}${index}`); + }); + expect(clientSpy).toHaveBeenCalledTimes(1); + }); + + it('creates a controller for each target it finds', async () => { + document.body.innerHTML = ` + + + `; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(3); + Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controllers[controllerId]; + expect(controllerId).toBe(`recommend_${controller.context.profile}${index}`); + }); + expect(clientSpy).toHaveBeenCalledTimes(3); + }); + + it('makes the context found on the target available', async () => { + document.body.innerHTML = ``; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + await wait(); + expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controllers[controllerId]; + expect(controller.context).toStrictEqual({ + profile: 'trending', + shopper: { + id: 'snapdev', + }, + product: 'sku1', + options: { + branch: 'testing', + categories: ['cats'], + limit: 5, + siteId: 'abc123', + }, + }); + }); + + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(clientSpy).toHaveBeenCalledWith({ + batched: true, + branch: 'testing', + categories: ['cats'], + limits: 5, + product: 'sku1', + shopper: 'snapdev', + siteId: 'abc123', + tag: 'trending', + }); + }); + + it('will utilize attachments (plugins / middleware) added via methods upon creation of controllers', async () => { + document.body.innerHTML = ``; + + const plugin = jest.fn(); + const plugin2 = jest.fn(); + const plugin3 = jest.fn(); + const plugin4 = jest.fn(); + const middlewareFn = jest.fn(); + const middleware = async (things, next) => { + middlewareFn(); + await next(); + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + recommendationInstantiator.plugin(plugin, 'param1', { thing: 'here' }); + recommendationInstantiator.plugin(plugin2); + recommendationInstantiator.on('beforeSearch', middleware); + recommendationInstantiator.on('afterSearch', middleware); + recommendationInstantiator.on('afterStore', middleware); + recommendationInstantiator.use({ + plugins: [[plugin3, 'p1', 'p2', 'p3'] as PluginGrouping, [plugin4] as PluginGrouping], + middleware: { + beforeSearch: middleware, + afterSearch: middleware, + afterStore: middleware, + }, + }); + await wait(); + + Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controllers[controllerId]; + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(middlewareFn).toHaveBeenCalledTimes(6); + expect(plugin).toHaveBeenCalledTimes(1); + expect(plugin).toHaveBeenCalledWith(controller, 'param1', { thing: 'here' }); + expect(plugin2).toHaveBeenCalledTimes(1); + expect(plugin2).toHaveBeenCalledWith(controller); + expect(plugin3).toHaveBeenCalledTimes(1); + expect(plugin3).toHaveBeenCalledWith(controller, 'p1', 'p2', 'p3'); + expect(plugin4).toHaveBeenCalledTimes(1); + expect(plugin4).toHaveBeenCalledWith(controller); + }); + }); + + it('will utilize config based attachments (plugins / middleware) on created controllers', async () => { + document.body.innerHTML = ``; + + const plugin = jest.fn(); + const plugin2 = jest.fn(); + const middlewareFn = jest.fn(); + const middleware = async (things, next) => { + middlewareFn(); + await next(); + }; + + const attachmentConfig = { + ...baseConfig, + config: { + branch: baseConfig.config.branch, + plugins: [[plugin, 'param1', { thing: 'here' }] as PluginGrouping, [plugin2] as PluginGrouping], + middleware: { + beforeSearch: middleware, + afterSearch: middleware, + afterStore: middleware, + }, + }, + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const clientSpy = jest.spyOn(client, 'recommend'); + + const recommendationInstantiator = new RecommendationInstantiator(attachmentConfig as RecommendationInstantiatorConfig, { client }); + await wait(); + + Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controllers[controllerId]; + expect(clientSpy).toHaveBeenCalledTimes(1); + expect(middlewareFn).toHaveBeenCalledTimes(3); + expect(plugin).toHaveBeenCalledTimes(1); + expect(plugin).toHaveBeenCalledWith(controller, 'param1', { thing: 'here' }); + expect(plugin2).toHaveBeenCalledTimes(1); + expect(plugin2).toHaveBeenCalledWith(controller); + }); }); }); diff --git a/packages/snap-shared/src/MockClient/MockClient.ts b/packages/snap-shared/src/MockClient/MockClient.ts index 95de7ff7f..491bc2e08 100644 --- a/packages/snap-shared/src/MockClient/MockClient.ts +++ b/packages/snap-shared/src/MockClient/MockClient.ts @@ -36,6 +36,10 @@ export class MockClient extends Client { return Promise.all([this.meta() as MetaResponseModel, autocompleteData as AutocompleteResponseModel]); } + async recommend() { + return this.mockData.recommend(); + } + async trending(): Promise { return this.mockData.trending(); } diff --git a/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/default.json b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/default.json index 1bf594151..874ace59a 100644 --- a/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/default.json +++ b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/default.json @@ -1,21 +1,17 @@ { "profile": { "tag": "trending", - "placement": "home-page", + "placement": "product-page", "display": { "threshold": 4, "template": { - "name": "preactTest", - "uuid": "34fdf15e-7ee1-447f-94c5-ea91086062e1", - "markup": "RecsHorizontalComponent", - "styles": ".preact-header {\r\n color: blue;\r\n}" + "name": "smc__production", + "uuid": "aefcf718-8514-44c3-bff6-80c15dbc42fc", + "component": "Default", + "branch": "production", + "group": "smc" }, - "templateParameters": { - "headerText": "Preact Recommended Products", - "count": 12, - "component": "Recs2", - "extraVar": "" - } + "templateParameters": { "headerText": "Trending Products" } } } -} \ No newline at end of file +} diff --git a/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingComponent.json b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingComponent.json new file mode 100644 index 000000000..bfc8711f0 --- /dev/null +++ b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingComponent.json @@ -0,0 +1,16 @@ +{ + "profile": { + "tag": "trending", + "placement": "product-page", + "display": { + "threshold": 4, + "template": { + "name": "smc__production", + "uuid": "aefcf718-8514-44c3-bff6-80c15dbc42fc", + "branch": "production", + "group": "smc" + }, + "templateParameters": { "headerText": "Trending Products" } + } + } +} diff --git a/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingParameters.json b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingParameters.json new file mode 100644 index 000000000..fedf35dd3 --- /dev/null +++ b/packages/snap-shared/src/MockData/recommend/profile/8uyt2m/missingParameters.json @@ -0,0 +1,16 @@ +{ + "profile": { + "tag": "trending", + "placement": "product-page", + "display": { + "threshold": 4, + "template": { + "name": "smc__production", + "uuid": "aefcf718-8514-44c3-bff6-80c15dbc42fc", + "component": "Default", + "branch": "production", + "group": "smc" + } + } + } +} From b1cd99061de3176a3554c0f523098a17a0efdc4a Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:28:48 -0600 Subject: [PATCH 07/27] feat(snap-preact): added services as constructor param, async onTarget and heavily refactored --- packages/snap-preact/src/Snap.tsx | 300 ++++++++++++++++-------------- 1 file changed, 164 insertions(+), 136 deletions(-) diff --git a/packages/snap-preact/src/Snap.tsx b/packages/snap-preact/src/Snap.tsx index c3fc65387..070c7dbb0 100644 --- a/packages/snap-preact/src/Snap.tsx +++ b/packages/snap-preact/src/Snap.tsx @@ -6,6 +6,7 @@ import { Logger, LogMode } from '@searchspring/snap-logger'; import { Tracker } from '@searchspring/snap-tracker'; import { version, DomTargeter, url, cookies, featureFlags } from '@searchspring/snap-toolbox'; import { getContext } from '@searchspring/snap-toolbox'; +import { ControllerTypes } from '@searchspring/snap-controller'; import type { ClientConfig, ClientGlobals } from '@searchspring/snap-client'; import type { @@ -27,10 +28,10 @@ import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; import { default as createSearchController } from './create/createSearchController'; import { RecommendationInstantiator, RecommendationInstantiatorConfig } from './Instantiators/RecommendationInstantiator'; -import type { SnapControllerServices, RootComponent } from './types'; +import type { SnapControllerServices, SnapControllerConfigs, RootComponent } from './types'; -const BRANCH_COOKIE = 'ssBranch'; -const SS_DEV_COOKIE = 'ssDev'; +export const BRANCH_COOKIE = 'ssBranch'; +export const SS_DEV_COOKIE = 'ssDev'; type ExtendedTarget = Target & { name?: string; @@ -45,7 +46,7 @@ type ExtendedTarget = Target & { export type SnapConfig = { context?: ContextVariables; url?: UrlTranslatorConfig; - client: { + client?: { globals: ClientGlobals; config?: ClientConfig; }; @@ -84,14 +85,48 @@ export type SnapConfig = { }; }; -type ControllerTypes = SearchController | AutocompleteController | FinderController | RecommendationController; -enum DynamicImportNames { - SEARCH = 'searchController', - AUTOCOMPLETE = 'autocompleteController', - FINDER = 'finderController', - RECOMMENDATION = 'recommendationController', -} +type SnapServices = { + client?: Client; + tracker?: Tracker; + logger?: Logger; +}; +type Controllers = SearchController | AutocompleteController | FinderController | RecommendationController; + +const COMPONENT_ERROR = `Uncaught Error - Invalid value passed as the component. +This usually happens when you pass a JSX Element, and not a function that returns the component, in the snap config. + + instead of - + + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + component: , + }, + ] + + or - + + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + component: Content, + }, + ] + + please try - + + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + component: () => Content + }, + ] + +The error above happened in the following targeter in the Snap Config`; export class Snap { config: SnapConfig; logger: Logger; @@ -99,11 +134,11 @@ export class Snap { tracker: Tracker; context: ContextVariables; _controllerPromises: { - [controllerConfigId: string]: Promise; + [controllerConfigId: string]: Promise; }; controllers: { - [controllerConfigId: string]: ControllerTypes; + [controllerConfigId: string]: Controllers; }; _instantiatorPromises: { @@ -114,69 +149,72 @@ export class Snap { return this._instantiatorPromises[id] || Promise.reject(`getInstantiator could not find instantiator with id: ${id}`); }; - public getController = (id: string): Promise => { + public getController = (id: string): Promise => { return this._controllerPromises[id] || Promise.reject(`getController could not find controller with id: ${id}`); }; - public getControllers = (...controllerIds: string[]): Promise => { + public getControllers = (...controllerIds: string[]): Promise => { const getControllerPromises = []; controllerIds.forEach((id) => getControllerPromises.push(this.getController(id))); return Promise.all(getControllerPromises); }; - public createController = ( - type: DynamicImportNames, + public createController = async ( + type: keyof typeof ControllerTypes, config: ControllerConfigs, - services: SnapControllerServices, - urlConfig: UrlTranslatorConfig, - resolve: (value?: ControllerTypes | PromiseLike) => void, - context?: ContextVariables - ): Promise => { + services?: SnapControllerServices, + urlConfig?: UrlTranslatorConfig, + context?: ContextVariables, + callback?: (value?: Controllers | PromiseLike) => void | Promise + ): Promise => { let importPromise; switch (type) { - case DynamicImportNames.SEARCH: + case ControllerTypes.search: importPromise = import('./create/createSearchController'); break; - case DynamicImportNames.AUTOCOMPLETE: + case ControllerTypes.autocomplete: importPromise = import('./create/createAutocompleteController'); break; - case DynamicImportNames.FINDER: + case ControllerTypes.finder: importPromise = import('./create/createFinderController'); break; - case DynamicImportNames.RECOMMENDATION: + case ControllerTypes.recommendation: importPromise = import('./create/createRecommendationController'); break; } - return importPromise.then((_) => { - if (!this.controllers[config.id]) { - this.controllers[config.id] = _.default( - { - url: deepmerge(this.config.url || {}, urlConfig || {}), - controller: config, - context: deepmerge(this.context || {}, context || {}), - }, - { - client: services?.client || this.client, - store: services?.store, - urlManager: services?.urlManager, - eventManager: services?.eventManager, - profiler: services?.profiler, - logger: services?.logger, - tracker: services?.tracker || this.tracker, - } - ); - resolve(this.controllers[config.id]); - } + if (!this.controllers[config.id]) { + const creationFunc: (config: SnapControllerConfigs, services: SnapControllerServices) => Controllers = (await importPromise).default; - return this.controllers[config.id]; - }); + this.controllers[config.id] = creationFunc( + { + url: deepmerge(this.config.url || {}, urlConfig || {}), + controller: config, + context: deepmerge(this.context || {}, context || {}), + }, + { + client: services?.client || this.client, + store: services?.store, + urlManager: services?.urlManager, + eventManager: services?.eventManager, + profiler: services?.profiler, + logger: services?.logger, + tracker: services?.tracker || this.tracker, + } + ); + } + + if (callback) { + await callback(this.controllers[config.id]); + } + + return this.controllers[config.id]; }; - constructor(config: SnapConfig) { + constructor(config: SnapConfig, services?: SnapServices) { this.config = config; - this.logger = new Logger('Snap Preact '); + this.logger = services?.logger || new Logger('Snap Preact '); let globalContext: ContextVariables = {}; try { @@ -191,14 +229,16 @@ export class Snap { isMergeableObject: isPlainObject, }); - this.context = deepmerge(globalContext || {}, this.config.context || {}); + this.context = deepmerge(this.config.context || {}, globalContext || {}, { + isMergeableObject: isPlainObject, + }); - if (!this.config?.client?.globals?.siteId) { + if ((!services?.client || !services?.tracker) && !this.config?.client?.globals?.siteId) { throw new Error(`Snap: config provided must contain a valid config.client.globals.siteId value`); } - this.client = new Client(this.config.client.globals, this.config.client.config); - this.tracker = new Tracker(this.config.client.globals); + this.client = services?.client || new Client(this.config.client.globals, this.config.client.config); + this.tracker = services?.tracker || new Tracker(this.config.client.globals); this._controllerPromises = {}; this._instantiatorPromises = {}; this.controllers = {}; @@ -318,7 +358,7 @@ export class Snap { const targetFunction = async (target, elem, originalElem) => { runSearch(); const onTarget = target.onTarget as OnTarget; - onTarget && onTarget(target, elem, originalElem); + onTarget && (await onTarget(target, elem, originalElem)); try { const Component = await (target as ExtendedTarget).component(); @@ -326,48 +366,11 @@ export class Snap { render(, elem); }); } catch (err) { - this.logger.error( - `Uncaught Error - Invalid value passed as the component. - This usually happens when you pass a JSX Element, and not a function that returns the component, in the snap config. - - instead of - - - targeters: [ - { - selector: '#searchspring-content', - hideTarget: true, - component: , - }, - ] - - or - - - targeters: [ - { - selector: '#searchspring-content', - hideTarget: true, - component: Content, - }, - ] - - please try - - - targeters: [ - { - selector: '#searchspring-content', - hideTarget: true, - component: () => Content - }, - ] - - -The error above happened in the following targeter in the Snap Config`, - target - ); + this.logger.error(COMPONENT_ERROR, target); } }; - controller?.targeters?.forEach(async (target, target_index) => { + controller?.targeters?.forEach((target, target_index) => { if (!target.selector) { throw new Error(`Targets at index ${target_index} missing selector value (string).`); } @@ -412,36 +415,43 @@ The error above happened in the following targeter in the Snap Config`, const targetFunction = async (target, elem, originalElem) => { const onTarget = target.onTarget as OnTarget; - onTarget && onTarget(target, elem, originalElem); + onTarget && (await onTarget(target, elem, originalElem)); - const Component = (await (target as ExtendedTarget).component()) as React.ElementType<{ - controller: AutocompleteController; - input: HTMLInputElement | string | Element; - }>; + try { + const Component = (await (target as ExtendedTarget).component()) as React.ElementType<{ + controller: AutocompleteController; + input: HTMLInputElement | string | Element; + }>; - setTimeout(() => { - render(, elem); - }); + setTimeout(() => { + render(, elem); + }); + } catch (err) { + this.logger.error(COMPONENT_ERROR, target); + } }; if (!controller?.targeters || controller?.targeters.length === 0) { this.createController( - DynamicImportNames.AUTOCOMPLETE, + ControllerTypes.autocomplete, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); } - controller?.targeters?.forEach(async (target, target_index) => { + controller?.targeters?.forEach((target, target_index) => { if (!target.selector) { throw new Error(`Targets at index ${target_index} missing selector value (string).`); } if (!target.component) { throw new Error(`Targets at index ${target_index} missing component value (Component).`); } + const targeter = new DomTargeter( [ { @@ -461,12 +471,14 @@ The error above happened in the following targeter in the Snap Config`, ], async (target, elem, originalElem) => { const cntrlr = await this.createController( - DynamicImportNames.AUTOCOMPLETE, + ControllerTypes.autocomplete, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); runBind(); targetFunction({ controller: cntrlr, ...target }, elem, originalElem); @@ -495,27 +507,33 @@ The error above happened in the following targeter in the Snap Config`, }; const targetFunction = async (target, elem, originalElem) => { const onTarget = target.onTarget as OnTarget; - onTarget && onTarget(target, elem, originalElem); + onTarget && (await onTarget(target, elem, originalElem)); - const Component = await (target as ExtendedTarget).component(); + try { + const Component = await (target as ExtendedTarget).component(); - setTimeout(() => { - render(, elem); - }); + setTimeout(() => { + render(, elem); + }); + } catch (err) { + this.logger.error(COMPONENT_ERROR, target); + } }; if (!controller?.targeters || controller?.targeters.length === 0) { this.createController( - DynamicImportNames.FINDER, + ControllerTypes.finder, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); } - controller?.targeters?.forEach(async (target, target_index) => { + controller?.targeters?.forEach((target, target_index) => { if (!target.selector) { throw new Error(`Targets at index ${target_index} missing selector value (string).`); } @@ -524,12 +542,14 @@ The error above happened in the following targeter in the Snap Config`, } const targeter = new DomTargeter([{ ...target }], async (target, elem, originalElem) => { const cntrlr = await this.createController( - DynamicImportNames.FINDER, + ControllerTypes.finder, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); runSearch(); targetFunction({ controller: cntrlr, ...target }, elem, originalElem); @@ -557,27 +577,33 @@ The error above happened in the following targeter in the Snap Config`, }; const targetFunction = async (target, elem, originalElem) => { const onTarget = target.onTarget as OnTarget; - onTarget && onTarget(target, elem, originalElem); + onTarget && (await onTarget(target, elem, originalElem)); - const Component = await (target as ExtendedTarget).component(); + try { + const Component = await (target as ExtendedTarget).component(); - setTimeout(() => { - render(, elem); - }); + setTimeout(() => { + render(, elem); + }); + } catch (err) { + this.logger.error(COMPONENT_ERROR, target); + } }; if (!controller?.targeters || controller?.targeters.length === 0) { this.createController( - DynamicImportNames.RECOMMENDATION, + ControllerTypes.recommendation, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); } - controller?.targeters?.forEach(async (target, target_index) => { + controller?.targeters?.forEach((target, target_index) => { if (!target.selector) { throw new Error(`Targets at index ${target_index} missing selector value (string).`); } @@ -586,12 +612,14 @@ The error above happened in the following targeter in the Snap Config`, } const targeter = new DomTargeter([{ ...target }], async (target, elem, originalElem) => { const cntrlr = await this.createController( - DynamicImportNames.RECOMMENDATION, + ControllerTypes.recommendation, controller.config, controller.services, controller.url, - resolve, - controller.context + controller.context, + (cntrlr) => { + resolve(cntrlr); + } ); runSearch(); targetFunction({ controller: cntrlr, ...target }, elem, originalElem); @@ -614,9 +642,9 @@ The error above happened in the following targeter in the Snap Config`, return new RecommendationInstantiator( this.config.instantiators.recommendation, { - client: this.config.instantiators.recommendation?.services?.client || this.client, - tracker: this.config.instantiators.recommendation?.services?.tracker || this.tracker, - logger: this.config.instantiators.recommendation?.services?.logger || this.logger, + client: this.client, + tracker: this.tracker, + logger: this.logger, }, this.context ); From a7dd631144ca06bddc6613638660fdb58b9494e5 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 5 Apr 2022 01:29:18 -0600 Subject: [PATCH 08/27] test(snap-preact): adding testing --- packages/snap-preact/src/Snap.test.tsx | 1084 +++++++++++++++++++++++- 1 file changed, 1081 insertions(+), 3 deletions(-) diff --git a/packages/snap-preact/src/Snap.test.tsx b/packages/snap-preact/src/Snap.test.tsx index 10b4bed21..f03da19dc 100644 --- a/packages/snap-preact/src/Snap.test.tsx +++ b/packages/snap-preact/src/Snap.test.tsx @@ -1,12 +1,1090 @@ -import { Snap } from './Snap'; +import { MockClient } from '@searchspring/snap-shared'; +import { Tracker } from '@searchspring/snap-tracker'; +import { Logger } from '@searchspring/snap-logger'; +import { cookies } from '@searchspring/snap-toolbox'; + +import type { + SearchControllerConfig, + AutocompleteControllerConfig, + FinderControllerConfig, + RecommendationControllerConfig, +} from '@searchspring/snap-controller'; + +import { Snap, BRANCH_COOKIE } from './Snap'; +import { AutocompleteStore } from '@searchspring/snap-store-mobx'; + +const baseConfig = { + client: { + globals: { + siteId: '8uyt2m', + }, + }, +}; + +const Component = (props) => { + const controller = props.controller; + return
{controller.type}
; +}; + +const wait = (time = 1) => { + return new Promise((resolve) => { + setTimeout(resolve, time); + }); +}; describe('Snap Preact', () => { - it('throws if configuration is not provided', () => { - const config = {}; + beforeEach(() => { + delete window.searchspring; + cookies.unset(BRANCH_COOKIE); + document.body.innerHTML = `
`; + }); + + it('throws if configuration is not provided', () => { expect(() => { // @ts-ignore - testing bad instantiation const snap = new Snap(); }).toThrow(); }); + + it('throws if configuration is not complete', () => { + const config = { + client: {}, + }; + + expect(() => { + // @ts-ignore - testing bad instantiation + const snap = new Snap(config); + }).toThrow(); + }); + + it('uses the logger to log an error when no context is found', () => { + document.body.innerHTML = ''; + + const logger = new Logger('Snap Preact '); + const spy = jest.spyOn(logger, 'error'); + const snap = new Snap(baseConfig, { logger }); + expect(spy).toHaveBeenCalledWith('failed to find global context'); + }); + + it('creates a proper Snap object with minimal configuration', () => { + const snap = new Snap(baseConfig); + + // services are defined + expect(snap.logger).toBeDefined(); + expect(snap.client).toBeDefined(); + expect(snap.tracker).toBeDefined(); + + // properties are defined + expect(snap.config).toStrictEqual(baseConfig); + expect(snap.context).toStrictEqual({}); + expect(snap.controllers).toStrictEqual({}); + + // @ts-ignore - checking private property + expect(snap.client.globals.siteId).toBe(baseConfig.client.globals.siteId); + }); + + it('merges config found in context and prioritizes the config found in the context', () => { + document.body.innerHTML = ``; + + const snap = new Snap(baseConfig); + + // @ts-ignore - checking private property + expect(snap.client.globals.siteId).toBe('yyyyyy'); + }); + + it('merges contexts and prioritizes the context found in the script', () => { + document.body.innerHTML = ``; + + const contextConfig = { + ...baseConfig, + context: { + shopper: { + id: 'snapdevconfig', + }, + }, + }; + + const snap = new Snap(contextConfig); + expect(snap.context.shopper.id).toBe('snapdevscript'); + }); + + it('has branch override functionality', () => { + const branchParam = 'override'; + cookies.set(BRANCH_COOKIE, branchParam, 'Lax', 3600000); + + const logger = new Logger('Snap Preact '); + const spy = jest.spyOn(logger, 'warn'); + const snap = new Snap(baseConfig, { logger }); + expect(spy).toHaveBeenCalledWith(`...loading build... '${branchParam}'`); + }); + + it('exposes itself globally on the window', () => { + const snap = new Snap(baseConfig); + expect(window.searchspring).toBeDefined(); + expect(window.searchspring.context).toBe(snap.context); + expect(window.searchspring.client).toBe(snap.client); + }); + + it('automatically tracks the shopper id when provided', () => { + const contextConfig = { + ...baseConfig, + context: { + shopper: { + id: 'snapdev', + }, + }, + }; + + const tracker = new Tracker(baseConfig.client.globals); + const spy = jest.spyOn(tracker.track.shopper, 'login'); + const snap = new Snap(contextConfig, { tracker }); + expect(spy).toHaveBeenCalledWith({ id: contextConfig.context.shopper.id }); + }); + + it('automatically sets the shopper cart when provided', () => { + const contextConfig = { + ...baseConfig, + context: { + shopper: { + id: 'snapdev', + cart: [{ sku: 'sku1' }, { sku: 'sku2' }, { sku: 'sku3' }], + }, + }, + }; + + const tracker = new Tracker(baseConfig.client.globals); + const spy = jest.spyOn(tracker.cookies.cart, 'set'); + const snap = new Snap(contextConfig, { tracker }); + expect(spy).toHaveBeenCalledWith(['sku1', 'sku2', 'sku3']); + }); + + describe('creates search controllers via config', () => { + it(`can create a search controller`, () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + settings: { + redirects: { + merchandising: false, + }, + }, + }, + }, + ], + }, + }; + const snap = new Snap(searchConfig); + + const search = snap.controllers.search; + expect(search).toBeDefined(); + expect(search.id).toBe('search'); + expect(search.type).toBe('search'); + expect((search.config as SearchControllerConfig).settings.redirects.merchandising).toBe(false); + + // it has not searched and is not searching + expect(search.store.loading).toBe(false); + expect(search.store.loaded).toBe(false); + }); + + it(`can create multiple search controllers`, () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'searchOne', + }, + }, + { + config: { + id: 'searchTwo', + }, + }, + ], + }, + }; + const snap = new Snap(searchConfig); + + expect(snap.controllers.searchOne).toBeDefined(); + expect(snap.controllers.searchTwo).toBeDefined(); + }); + + it(`does not run the controller 'search' method when a targeter is NOT found`, async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + targeters: [ + { + selector: '#searchspring-dne', + hideTarget: true, + component: () => { + return Component; + }, + }, + ], + }, + ], + }, + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const spy = jest.spyOn(client, 'search'); + const snap = new Snap(searchConfig, { client }); + + const search = snap.controllers.search; + expect(search).toBeDefined(); + + await wait(); + + expect(spy).toHaveBeenCalledTimes(0); + expect(search.store.loading).toBe(false); + expect(search.store.loaded).toBe(false); + }); + + it(`logs an error when targeter has invalid configuration`, async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + component: () => Component, + }, + ], + }, + ], + }, + }; + + const logger = new Logger(); + const spy = jest.spyOn(logger, 'error'); + + new Snap(searchConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(0); + + // @ts-ignore - allowing for invalid component + searchConfig.controllers.search[0].targeters[0].component = Component; + new Snap(searchConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(1); + + delete searchConfig.controllers.search[0].targeters[0].selector; + new Snap(searchConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(2); + + searchConfig.controllers.search[0].targeters[0].selector = '#searchspring-content'; + delete searchConfig.controllers.search[0].targeters[0].component; + new Snap(searchConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(3); + }); + + it(`runs the controller 'search' method when a targeter selector is found`, async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + component: () => { + return Component; + }, + }, + ], + }, + ], + }, + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const spy = jest.spyOn(client, 'search'); + const snap = new Snap(searchConfig, { client }); + + const search = snap.controllers.search; + expect(search).toBeDefined(); + + await wait(); + + expect(spy).toHaveBeenCalledTimes(1); + expect(search.store.loading).toBe(false); + expect(search.store.loaded).toBe(true); + }); + + it(`runs the onTarget function when a targeter selector is found`, async () => { + const onTarget = jest.fn(); + + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + targeters: [ + { + selector: '#searchspring-content', + hideTarget: true, + onTarget, + component: () => Component, + }, + ], + }, + ], + }, + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const snap = new Snap(searchConfig, { client }); + + const search = snap.controllers.search; + expect(search).toBeDefined(); + + await wait(); + + expect(onTarget).toHaveBeenCalledTimes(1); + }); + + it(`runs the controller 'search' method when prefetch is set when selector not found`, async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + targeters: [ + { + prefetch: true, + selector: '#searchspring-dne', + hideTarget: true, + component: () => { + return Component; + }, + }, + ], + }, + ], + }, + }; + + const client = new MockClient(baseConfig.client.globals, {}); + const spy = jest.spyOn(client, 'search'); + const snap = new Snap(searchConfig, { client }); + + const search = snap.controllers.search; + expect(search).toBeDefined(); + + await wait(); + + expect(spy).toHaveBeenCalledTimes(1); + expect(search.store.loading).toBe(false); + expect(search.store.loaded).toBe(true); + }); + }); + + describe('creates autocomplete controllers via config', () => { + it(`can create an autocomplete controller`, async () => { + const acConfig = { + ...baseConfig, + controllers: { + autocomplete: [ + { + config: { + id: 'ac', + selector: '.ss-ac-input', + settings: { + initializeFromUrl: false, + }, + }, + }, + ], + }, + }; + const snap = new Snap(acConfig); + + const autocomplete = await snap.getController('ac'); + expect(autocomplete.id).toBe('ac'); + expect(autocomplete.type).toBe('autocomplete'); + expect((autocomplete.config as AutocompleteControllerConfig).settings.initializeFromUrl).toBe(false); + + // it has not searched and is not searching + expect(autocomplete.store.loading).toBe(false); + expect(autocomplete.store.loaded).toBe(false); + }); + + it(`can create multiple autocomplete controllers`, async () => { + const acConfig = { + ...baseConfig, + controllers: { + autocomplete: [ + { + config: { + selector: '.ss-ac-input-one', + id: 'acOne', + }, + }, + { + config: { + selector: '.ss-ac-input-two', + id: 'acTwo', + }, + }, + ], + }, + }; + const snap = new Snap(acConfig); + const [acOne, acTwo] = await snap.getControllers('acOne', 'acTwo'); + expect(acOne.id).toBe('acOne'); + expect(acOne.type).toBe('autocomplete'); + expect(acTwo.id).toBe('acTwo'); + expect(acTwo.type).toBe('autocomplete'); + }); + + it(`logs an error when targeter has invalid configuration`, async () => { + document.body.innerHTML = ``; + + const acConfig = { + ...baseConfig, + controllers: { + autocomplete: [ + { + config: { + selector: '.ss-ac-input', + id: 'ac', + }, + targeters: [ + { + selector: '.ss-ac-input', + hideTarget: true, + component: async () => Component, + }, + ], + }, + ], + }, + }; + + const logger = new Logger(); + const spy = jest.spyOn(logger, 'error'); + + new Snap(acConfig, { logger }); + await wait(); + expect(spy).toHaveBeenCalledTimes(0); + + delete acConfig.controllers.autocomplete[0].targeters[0].selector; + new Snap(acConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(1); + + acConfig.controllers.autocomplete[0].targeters[0].selector = '#searchspring-content'; + delete acConfig.controllers.autocomplete[0].targeters[0].component; + new Snap(acConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(2); + }); + + it(`creates targeter provided in config`, async () => { + document.body.innerHTML = ``; + + const acConfig = { + ...baseConfig, + controllers: { + autocomplete: [ + { + config: { + selector: '.ss-ac-input', + id: 'ac', + }, + targeters: [ + { + name: 'acTarget', + selector: '.ss-ac-input', + hideTarget: true, + component: async () => Component, + }, + ], + }, + ], + }, + }; + const snap = new Snap(acConfig); + const ac = await snap.getController('ac'); + await wait(); + expect(ac.id).toBe('ac'); + expect(ac.targeters.acTarget).toBeDefined(); + expect((ac.store as AutocompleteStore).state.input).toBeUndefined(); + }); + + it(`runs the onTarget function when a targeter selector is found`, async () => { + const onTarget = jest.fn(); + + document.body.innerHTML = ``; + + const acConfig = { + ...baseConfig, + controllers: { + autocomplete: [ + { + config: { + selector: '.ss-ac-input', + id: 'ac', + }, + targeters: [ + { + selector: '.ss-ac-input', + hideTarget: true, + component: async () => Component, + onTarget, + }, + ], + }, + ], + }, + }; + const snap = new Snap(acConfig); + const ac = await snap.getController('ac'); + await wait(); + expect(onTarget).toHaveBeenCalledTimes(1); + }); + }); + + describe('creates finder controllers via config', () => { + it(`can create a finder controller`, async () => { + const finderConfig = { + ...baseConfig, + controllers: { + finder: [ + { + config: { + id: 'finder', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + }, + ], + }, + }; + const snap = new Snap(finderConfig); + + const finder = await snap.getController('finder'); + expect(finder.id).toBe('finder'); + expect(finder.type).toBe('finder'); + + // it has not searched and is not searching + expect(finder.store.loading).toBe(false); + expect(finder.store.loaded).toBe(false); + }); + + it(`can create multiple finder controllers`, async () => { + const finderConfig = { + ...baseConfig, + controllers: { + finder: [ + { + config: { + id: 'finderOne', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + }, + { + config: { + id: 'finderTwo', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + }, + ], + }, + }; + const snap = new Snap(finderConfig); + const [finderOne, finderTwo] = await snap.getControllers('finderOne', 'finderTwo'); + expect(finderOne.id).toBe('finderOne'); + expect(finderOne.type).toBe('finder'); + expect(finderTwo.id).toBe('finderTwo'); + expect(finderTwo.type).toBe('finder'); + }); + + it(`logs an error when targeter has invalid configuration`, async () => { + document.body.innerHTML = `
`; + + const finderConfig = { + ...baseConfig, + controllers: { + finder: [ + { + config: { + id: 'finder', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + targeters: [ + { + name: 'finder_hierarchy', + selector: '#searchspring-finder-hierarchy', + component: async () => Component, + }, + ], + }, + ], + }, + }; + + const logger = new Logger(); + const spy = jest.spyOn(logger, 'error'); + + new Snap(finderConfig, { logger }); + await wait(); + expect(spy).toHaveBeenCalledTimes(0); + + delete finderConfig.controllers.finder[0].targeters[0].selector; + new Snap(finderConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(1); + + finderConfig.controllers.finder[0].targeters[0].selector = '#searchspring-content'; + delete finderConfig.controllers.finder[0].targeters[0].component; + new Snap(finderConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(2); + }); + + it(`creates targeter provided in config`, async () => { + document.body.innerHTML = `
`; + + const finderConfig = { + ...baseConfig, + controllers: { + finder: [ + { + config: { + id: 'finder', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + targeters: [ + { + name: 'finderTargeter', + selector: '#searchspring-finder-hierarchy', + component: async () => Component, + }, + ], + }, + ], + }, + }; + const snap = new Snap(finderConfig); + const finder = await snap.getController('finder'); + await wait(); + expect(finder.id).toBe('finder'); + expect(finder.targeters.finderTargeter).toBeDefined(); + }); + + it(`runs the onTarget function when a targeter selector is found`, async () => { + const onTarget = jest.fn(); + + document.body.innerHTML = `
`; + + const finderConfig = { + ...baseConfig, + controllers: { + finder: [ + { + config: { + id: 'finder', + url: '/', + fields: [ + { + field: 'ss_category_hierarchy', + }, + ], + }, + targeters: [ + { + name: 'finderTargeter', + selector: '#searchspring-finder-hierarchy', + component: async () => Component, + onTarget, + }, + ], + }, + ], + }, + }; + const snap = new Snap(finderConfig); + const finder = await snap.getController('finder'); + await wait(); + expect(onTarget).toHaveBeenCalledTimes(1); + }); + }); + + describe('creates recommendation controllers via config', () => { + it(`can create a recommendation controller`, async () => { + const recommendationConfig = { + ...baseConfig, + controllers: { + recommendation: [ + { + config: { + id: 'trendingRecs', + tag: 'trending', + }, + }, + ], + }, + }; + const snap = new Snap(recommendationConfig); + + const finder = await snap.getController('trendingRecs'); + expect(finder.id).toBe('trendingRecs'); + expect(finder.type).toBe('recommendation'); + + // it has not searched and is not searching + expect(finder.store.loading).toBe(false); + expect(finder.store.loaded).toBe(false); + }); + + it(`can create multiple recommendation controllers`, async () => { + const recommendationConfig = { + ...baseConfig, + controllers: { + recommendation: [ + { + config: { + id: 'trendingRecsOne', + tag: 'trending', + }, + }, + { + config: { + id: 'trendingRecsTwo', + tag: 'trending', + }, + }, + ], + }, + }; + const snap = new Snap(recommendationConfig); + const [trendingRecsOne, trendingRecsTwo] = await snap.getControllers('trendingRecsOne', 'trendingRecsTwo'); + expect(trendingRecsOne.id).toBe('trendingRecsOne'); + expect(trendingRecsOne.type).toBe('recommendation'); + expect(trendingRecsTwo.id).toBe('trendingRecsTwo'); + expect(trendingRecsTwo.type).toBe('recommendation'); + }); + + it(`logs an error when targeter has invalid configuration`, async () => { + document.body.innerHTML = ``; + + const recommendationConfig = { + ...baseConfig, + controllers: { + recommendation: [ + { + config: { + id: 'trendingRecs', + tag: 'trending', + }, + targeters: [ + { + name: 'recsTargeter', + selector: '#ss-trending-recs', + component: async () => Component, + }, + ], + }, + ], + }, + }; + + const logger = new Logger(); + const spy = jest.spyOn(logger, 'error'); + + new Snap(recommendationConfig, { logger }); + await wait(); + expect(spy).toHaveBeenCalledTimes(0); + + delete recommendationConfig.controllers.recommendation[0].targeters[0].selector; + new Snap(recommendationConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(1); + + recommendationConfig.controllers.recommendation[0].targeters[0].selector = '#ss-trending-recs'; + delete recommendationConfig.controllers.recommendation[0].targeters[0].component; + new Snap(recommendationConfig, { logger }); + expect(spy).toHaveBeenCalledTimes(2); + }); + + it(`creates targeter provided in config`, async () => { + document.body.innerHTML = ``; + + const recommendationConfig = { + ...baseConfig, + controllers: { + recommendation: [ + { + config: { + id: 'trendingRecs', + tag: 'trending', + }, + targeters: [ + { + name: 'recsTargeter', + selector: '#ss-trending-recs', + component: async () => Component, + }, + ], + }, + ], + }, + }; + const snap = new Snap(recommendationConfig); + const recommendation = await snap.getController('trendingRecs'); + await wait(); + expect(recommendation.id).toBe('trendingRecs'); + expect(recommendation.targeters.recsTargeter).toBeDefined(); + }); + + it(`runs the onTarget function when a targeter selector is found`, async () => { + const onTarget = jest.fn(); + + document.body.innerHTML = ``; + + const recommendationConfig = { + ...baseConfig, + controllers: { + recommendation: [ + { + config: { + id: 'trendingRecs', + tag: 'trending', + }, + targeters: [ + { + name: 'recsTargeter', + selector: '#ss-trending-recs', + component: async () => Component, + onTarget, + }, + ], + }, + ], + }, + }; + const snap = new Snap(recommendationConfig); + const recommendation = await snap.getController('trendingRecs'); + await wait(); + expect(onTarget).toHaveBeenCalledTimes(1); + }); + }); + + describe(`the 'getInstantiator' method`, () => { + it('rejects if requested instantiator does not exist', async () => { + const snap = new Snap(baseConfig); + + await expect(async () => { + await snap.getInstantiator('recommendations'); + }).rejects.toBe(`getInstantiator could not find instantiator with id: recommendations`); + }); + + it('returns an instantiator when the requested id exists', async () => { + const instantiatorConfig = { + ...baseConfig, + instantiators: { + recommendation: { + components: {}, + config: { + branch: 'production', + }, + }, + }, + }; + const snap = new Snap(instantiatorConfig); + + const instantiator = await snap.getInstantiator('recommendations'); + expect(instantiator).toBeDefined(); + expect(instantiator.config.config.branch).toBe('production'); + }); + }); + + describe(`the 'getController(s)' method`, () => { + it('rejects if requested controller does not exist', async () => { + const snap = new Snap(baseConfig); + + await expect(async () => { + await snap.getController('search'); + }).rejects.toBe(`getController could not find controller with id: search`); + }); + + it('returns a controller with the requested id when it exists', async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'search', + }, + }, + ], + }, + }; + const snap = new Snap(searchConfig); + + const search = await snap.getController('search'); + expect(search).toBeDefined(); + expect(search.id).toBe('search'); + }); + + it('rejects if requested controller does not exist', async () => { + const snap = new Snap(baseConfig); + + await expect(async () => { + const [searchOne, searchTwo] = await snap.getControllers('searchOne', 'searchTwo'); + }).rejects.toBe(`getController could not find controller with id: searchOne`); + }); + + it('rejects if requested controller does not exist', async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'searchOne', + }, + }, + ], + }, + }; + const snap = new Snap(searchConfig); + + await expect(async () => { + const [searchOne, searchTwo] = await snap.getControllers('searchOne', 'searchTwo'); + }).rejects.toBe(`getController could not find controller with id: searchTwo`); + }); + + it('returns controllers with the requested ids when they exists', async () => { + const searchConfig = { + ...baseConfig, + controllers: { + search: [ + { + config: { + id: 'searchOne', + }, + }, + { + config: { + id: 'searchTwo', + }, + }, + ], + }, + }; + const snap = new Snap(searchConfig); + + const [searchOne, searchTwo] = await snap.getControllers('searchOne', 'searchTwo'); + expect(searchOne).toBeDefined(); + expect(searchOne.id).toBe('searchOne'); + expect(searchTwo).toBeDefined(); + expect(searchTwo.id).toBe('searchTwo'); + }); + }); + + describe(`the 'createController' method`, () => { + it('can create a search controller', async () => { + const snap = new Snap(baseConfig); + const searchConfig = { + id: 's', + }; + + const search = await snap.createController('search', searchConfig); + expect(search.id).toBe(searchConfig.id); + expect(search.type).toBe('search'); + }); + + it('can create an autocomplete controller', async () => { + const snap = new Snap(baseConfig); + const autocompleteConfig = { + id: 'ac', + }; + + const autocomplete = await snap.createController('autocomplete', autocompleteConfig); + expect(autocomplete.id).toBe(autocompleteConfig.id); + expect(autocomplete.type).toBe('autocomplete'); + }); + + it('can create a finder controller', async () => { + const snap = new Snap(baseConfig); + const finderConfig = { + id: 'f', + }; + + const finder = await snap.createController('finder', finderConfig); + expect(finder.id).toBe(finderConfig.id); + expect(finder.type).toBe('finder'); + }); + + it('can create a recommendation controller', async () => { + const snap = new Snap(baseConfig); + const recommendationConfig = { + tag: 'profile', + id: 'rec', + }; + + const recommendation = await snap.createController('recommendation', recommendationConfig); + expect(recommendation.id).toBe(recommendationConfig.id); + expect(recommendation.type).toBe('recommendation'); + }); + + it('executes an optional callback function when creating a controller', async () => { + const snap = new Snap(baseConfig); + const searchConfig = { + id: 's', + }; + + const callback = jest.fn(); + const search = await snap.createController('search', searchConfig, undefined, undefined, undefined, callback); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(search); + }); + }); }); From e5fedfb9f67d8f7e837684c43b19b08051460e48 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 15 Apr 2022 20:37:25 -0600 Subject: [PATCH 09/27] test(snapify): adding createController functions to Snapfiy storybook helper --- .../src/utilities/snapify.ts | 77 ++++++++++++++++--- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/packages/snap-preact-components/src/utilities/snapify.ts b/packages/snap-preact-components/src/utilities/snapify.ts index 9f97cb9a0..5d8f56c40 100644 --- a/packages/snap-preact-components/src/utilities/snapify.ts +++ b/packages/snap-preact-components/src/utilities/snapify.ts @@ -1,14 +1,24 @@ import { h, render } from 'preact'; -/* searchspring imports */ -import { createSearchController, createAutocompleteController, createRecommendationController } from '@searchspring/snap-preact'; -import type { - SearchController, - AutocompleteController, - RecommendationController, - SearchControllerConfig, - AutocompleteControllerConfig, - RecommendationControllerConfig, -} from '@searchspring/snap-controller'; + +import { SearchController, AutocompleteController, RecommendationController } from '@searchspring/snap-controller'; +import { Client } from '@searchspring/snap-client'; +import { SearchStore, AutocompleteStore, RecommendationStore } from '@searchspring/snap-store-mobx'; +import { UrlManager, UrlTranslator, reactLinker } from '@searchspring/snap-url-manager'; +import { EventManager } from '@searchspring/snap-event-manager'; +import { Profiler } from '@searchspring/snap-profiler'; +import { Logger } from '@searchspring/snap-logger'; +import { Tracker } from '@searchspring/snap-tracker'; + +import type { ClientConfig, ClientGlobals } from '@searchspring/snap-client'; +import type { SearchControllerConfig, AutocompleteControllerConfig, RecommendationControllerConfig } from '@searchspring/snap-controller'; + +type CreateConfig = { + client: { + globals?: ClientGlobals; + config?: ClientConfig; + }; + controller: SearchControllerConfig | AutocompleteControllerConfig | RecommendationControllerConfig; +}; const controllers = {}; const client = { @@ -71,3 +81,50 @@ export class Snapify { return cntrlr; } } + +function createSearchController(config: CreateConfig): SearchController { + const urlManager = new UrlManager(new UrlTranslator(), reactLinker); + + const cntrlr = new SearchController(config.controller as SearchControllerConfig, { + client: new Client(config.client.globals, config.client.config), + store: new SearchStore(config.controller as SearchControllerConfig, { urlManager }), + urlManager, + eventManager: new EventManager(), + profiler: new Profiler(), + logger: new Logger(), + tracker: new Tracker(config.client.globals), + }); + + return cntrlr; +} + +function createRecommendationController(config: CreateConfig): RecommendationController { + const urlManager = new UrlManager(new UrlTranslator(), reactLinker).detach(true); + const cntrlr = new RecommendationController(config.controller as RecommendationControllerConfig, { + client: new Client(config.client.globals, config.client.config), + store: new RecommendationStore(config.controller as RecommendationControllerConfig, { urlManager }), + urlManager, + eventManager: new EventManager(), + profiler: new Profiler(), + logger: new Logger(), + tracker: new Tracker(config.client.globals), + }); + + return cntrlr; +} + +function createAutocompleteController(config: CreateConfig): AutocompleteController { + const urlManager = new UrlManager(new UrlTranslator(), reactLinker).detach(); + + const cntrlr = new AutocompleteController(config.controller as AutocompleteControllerConfig, { + client: new Client(config.client.globals, config.client.config), + store: new AutocompleteStore(config.controller as AutocompleteControllerConfig, { urlManager }), + urlManager, + eventManager: new EventManager(), + profiler: new Profiler(), + logger: new Logger(), + tracker: new Tracker(config.client.globals), + }); + + return cntrlr; +} From 81a4dc97e1de4bb07b8ee91ad9455a02833eb406 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 20:39:20 -0600 Subject: [PATCH 10/27] refactor(branchoverride): move BranchOverride component into the component library --- .../BranchOverride/BranchOverride.stories.tsx | 126 +++++++ .../BranchOverride/BranchOverride.test.tsx | 251 ++++++++++++++ .../BranchOverride/BranchOverride.tsx | 327 ++++++++++++++++++ .../Organisms/BranchOverride/index.ts | 1 + .../Organisms/BranchOverride/readme.md | 64 ++++ packages/snap-preact-components/src/index.ts | 1 + .../src/components/BranchOverride.test.tsx | 7 - .../src/components/BranchOverride.ts | 1 + .../src/components/BranchOverride.tsx | 238 ------------- 9 files changed, 771 insertions(+), 245 deletions(-) create mode 100644 packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx create mode 100644 packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx create mode 100644 packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx create mode 100644 packages/snap-preact-components/src/components/Organisms/BranchOverride/index.ts create mode 100644 packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md delete mode 100644 packages/snap-preact/src/components/BranchOverride.test.tsx create mode 100644 packages/snap-preact/src/components/BranchOverride.ts delete mode 100644 packages/snap-preact/src/components/BranchOverride.tsx diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx new file mode 100644 index 000000000..7225fd5e5 --- /dev/null +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx @@ -0,0 +1,126 @@ +import { h, Fragment } from 'preact'; + +import { ArgsTable, PRIMARY_STORY } from '@storybook/addon-docs/blocks'; + +import { BranchOverride } from './BranchOverride'; +import { componentArgs } from '../../../utilities'; +import Readme from '../BranchOverride/readme.md'; + +export default { + title: `Organisms/BranchOverride`, + component: BranchOverride, + parameters: { + docs: { + page: () => ( +
+ + +
+ ), + }, + }, + decorators: [ + (Story) => ( +
+ +
+ ), + ], + argTypes: { + name: { + description: 'bundle branch name', + type: { required: true }, + table: { + type: { + summary: 'string', + }, + }, + control: { type: 'text' }, + }, + details: { + description: 'Object containing details for branch override', + type: { required: false }, + table: { + type: { + summary: '{ url: string; lastModified: string }', + }, + }, + control: { type: 'object' }, + }, + error: { + description: 'URL of the branch resource', + type: { required: false }, + table: { + type: { + summary: '{ message: string; description: string }', + }, + }, + control: { type: 'object' }, + }, + onRemoveClick: { + description: 'optional function to run on remove button click', + table: { + type: { + summary: '(e: Event, name: string, url: string) => void', + }, + }, + action: 'onRemoveClick', + }, + darkMode: { + description: 'force dark darkMode', + type: { required: false }, + table: { + type: { + summary: 'boolean', + }, + }, + control: { type: 'boolean' }, + }, + ...componentArgs, + }, +}; + +const Template = (args) => ; + +export const Auto = Template.bind({}); +Auto.args = { + name: 'next', + details: { + url: 'https://snapui.searchspring.io/y56s6x/next/bundle.js', + lastModified: '1 Feb 2022 1:02:03 GMT', + }, +}; + +export const Dark = Template.bind({}); +Dark.args = { + name: 'next', + details: { + url: 'https://snapui.searchspring.io/y56s6x/next/bundle.js', + lastModified: '1 Feb 2022 1:02:03 GMT', + }, + darkMode: true, +}; + +export const Error = Template.bind({}); +Error.args = { + name: 'testing', + error: { + message: 'Branch not found!', + description: 'Incorrect branch name or branch no longer exists.', + }, +}; + +export const Light = Template.bind({}); +Light.args = { + name: 'next', + details: { + url: 'https://snapui.searchspring.io/y56s6x/next/bundle.js', + lastModified: '1 Feb 2022 1:02:03 GMT', + }, + darkMode: false, +}; diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx new file mode 100644 index 000000000..b9121415e --- /dev/null +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx @@ -0,0 +1,251 @@ +import { h } from 'preact'; + +import { render, waitFor } from '@testing-library/preact'; +import userEvent from '@testing-library/user-event'; + +import { BranchOverride } from './BranchOverride'; +import { ThemeProvider } from '../../../providers'; + +describe('BranchOverride Component', () => { + const { location } = window; + + beforeAll(() => { + delete window.location; + + // @ts-ignore + window.location = { + href: 'https://www.merch.com?branch=branch', + }; + }); + + afterAll(() => jest.clearAllMocks); + + const branch = 'branch'; + const url = 'https://snapui.searchspring.io/y56s6x/branch/bundle.js'; + const lastModified = '07 Jan 2022 22:42:39 GMT'; + + const props = { + name: branch, + details: { + url, + lastModified, + }, + }; + + it('displays branch bundle details', async () => { + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement.classList).toHaveLength(2); + + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('rgba(255, 255, 255, 0.95)'); + }); + + // branch name + const bottomLeftElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__left'); + expect(bottomLeftElement).toBeInTheDocument(); + expect(bottomLeftElement.innerHTML).toContain(branch); + + // branch modified date + const bottomRightElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__right'); + expect(bottomRightElement).toBeInTheDocument(); + expect(bottomRightElement.innerHTML).toContain(lastModified); + }); + + it('can set dark mode', async () => { + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('rgba(59, 35, 173, 0.9)'); + }); + }); + + it('can be collapsed and uncollapsed', async () => { + const rendered = render(); + + // wait for rendering of component + let overrideElement; + await waitFor(() => { + overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).not.toHaveClass('ss__branch-override--collapsed'); + }); + + const collapseButton = overrideElement.querySelector('.ss__branch-override__top__collapse'); + expect(collapseButton).toBeInTheDocument(); + userEvent.click(collapseButton); + await waitFor(() => expect(overrideElement).toHaveClass('ss__branch-override--collapsed')); + + userEvent.click(overrideElement); + await waitFor(() => expect(overrideElement).not.toHaveClass('ss__branch-override--collapsed')); + }); + + it(`has a remove button that calls 'onRemove'`, async () => { + const removeFn = jest.fn(); + const rendered = render(); + + // wait for rendering of component + let overrideElement; + await waitFor(() => { + overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + }); + + const closeButton = overrideElement.querySelector('.ss__branch-override__top__button'); + expect(closeButton).toBeInTheDocument(); + userEvent.click(closeButton); + expect(removeFn).toHaveBeenCalledTimes(1); + }); + + it('displays branch failure on bad branch', async () => { + const error = { + message: 'Branch not found...', + description: 'Unable to find the branch.', + }; + + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('rgba(130, 6, 6, 0.9)'); + }); + + // branch name + const bottomRightElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__right'); + expect(bottomRightElement).toBeInTheDocument(); + expect(bottomRightElement.innerHTML).toContain('bad'); + }); + + it('can disable styles', async () => { + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement.classList).toHaveLength(1); + }); + }); + + it('can add additional styles', async () => { + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('blue'); + }); + }); + + it('can add additional styles when default styles are disabled', async () => { + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('blue'); + }); + }); + + it('renders with classname', async () => { + const className = 'classy'; + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).toHaveClass(className); + }); + }); + + describe('component theming works', () => { + it('is themeable with ThemeProvider', async () => { + const globalTheme = { + components: { + branchOverride: { + className: 'classy', + }, + }, + }; + + const rendered = render( + + + + ); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).toHaveClass(globalTheme.components.branchOverride.className); + }); + }); + + it('is themeable with theme prop', async () => { + const propTheme = { + components: { + branchOverride: { + className: 'classy', + }, + }, + }; + + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).toHaveClass(propTheme.components.branchOverride.className); + }); + }); + + it('the theme prop overrides ThemeProvider', async () => { + const globalTheme = { + components: { + branchOverride: { + className: 'not classy', + }, + }, + }; + const propTheme = { + components: { + branchOverride: { + className: 'classy', + }, + }, + }; + + const rendered = render( + + + + ); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).toHaveClass(propTheme.components.branchOverride.className); + expect(overrideElement).not.toHaveClass(globalTheme.components.branchOverride.className); + }); + }); + }); +}); diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx new file mode 100644 index 000000000..5e9086dfb --- /dev/null +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx @@ -0,0 +1,327 @@ +/** @jsx jsx */ +import { h, Fragment } from 'preact'; + +import { jsx, css } from '@emotion/react'; +import classnames from 'classnames'; +import { useState, useEffect } from 'preact/hooks'; +import { Icon, IconProps } from '../../Atoms/Icon/Icon'; + +import { ComponentProps } from '../../../types'; +import { defined } from '../../../utilities'; +import { Theme, useTheme } from '../../../providers'; + +const CSS = { + override: ({ theme }) => + css({ + width: '360px', + height: '120px', + overflow: 'hidden', + fontSize: '14px', + position: 'fixed', + zIndex: 9999, + cursor: 'auto', + bottom: '50px', + right: 0, + background: theme.main.background, + color: theme.main.color, + border: theme.main.border, + borderRight: 0, + borderTopLeftRadius: '5px', + borderBottomLeftRadius: '5px', + boxShadow: theme.main.boxShadow, + transition: 'height ease 0.2s, right ease 0.5s 0.2s', + '&.ss__branch-override--collapsed': { + transition: 'height ease 0.5s 0.5s, right ease 0.5s', + right: '-316px', + height: '50px', + cursor: 'pointer', + }, + '.ss__branch-override__top': { + padding: '10px', + background: theme.top.background, + borderBottom: theme.top.border, + '.ss__branch-override__top__logo': { + display: 'inline-block', + height: '30px', + verticalAlign: 'middle', + }, + '.ss__branch-override__top__collapse': { + display: 'inline-block', + float: 'right', + padding: '5px', + cursor: 'pointer', + }, + '.ss__branch-override__top__button': { + borderRadius: '5px', + padding: '6px', + height: '100%', + lineHeight: '14px', + textAlign: 'center', + cursor: 'pointer', + fontSize: '10px', + border: theme.top.button.border, + color: theme.top.button.color, + float: 'right', + marginRight: '14px', + }, + }, + '.ss__branch-override__bottom': { + padding: '10px 15px', + fontSize: '12px', + '.ss__branch-override__bottom__left': { + fontWeight: 'bold', + fontStyle: theme.bottom.branch.style, + color: theme.bottom.branch.color, + fontSize: '14px', + lineHeight: '20px', + display: 'inline-flex', + alignItems: 'center', + maxWidth: '180px', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + svg: { + marginRight: '10px', + }, + }, + '.ss__branch-override__bottom__right': { + float: 'right', + fontStyle: 'italic', + color: theme.bottom.additional.color, + fontSize: '12px', + lineHeight: '20px', + }, + '.ss__branch-override__bottom__content': { + marginTop: '10px', + }, + }, + }), +}; + +const darkTheme = { + main: { + border: '0', + background: 'rgba(59, 35, 173, 0.9)', + color: '#fff', + boxShadow: '#4c3ce2 1px 1px 3px 0px', + }, + top: { + background: 'rgba(59, 35, 173, 0.3)', + border: '1px solid #4c3de1', + logo: { + src: 'https://snapui.searchspring.io/searchspring_light.svg', + }, + button: { + border: '1px solid #fff', + color: '#fff', + content: 'STOP PREVIEW', + }, + close: { + fill: '#fff', + }, + }, + bottom: { + content: 'Preview functionality may differ from production.', + branch: { + color: '#03cee1', + style: 'italic', + }, + additional: { + color: '#03cee1', + }, + }, +}; + +const lightTheme = { + main: { + border: '1px solid #ccc', + background: 'rgba(255, 255, 255, 0.95)', + color: '#515151', + boxShadow: 'rgba(81, 81, 81, 0.5) 1px 1px 3px 0px', + }, + top: { + border: '1px solid #ccc', + logo: { + src: 'https://snapui.searchspring.io/searchspring.svg', + }, + button: { + border: '1px solid #515151', + color: '#515151', + content: 'STOP PREVIEW', + }, + close: { + fill: '#515151', + }, + }, + bottom: { + content: 'Preview functionality may differ from production?', + branch: { + color: '#3a23ad', + style: 'italic', + }, + additional: { + color: '#3a23ad', + }, + }, +}; + +const failureTheme = { + main: { + border: '0', + background: 'rgba(130, 6, 6, 0.9)', + color: '#fff', + boxShadow: 'rgba(130, 6, 6, 0.4) 1px 1px 3px 0px', + }, + top: { + background: 'rgba(130, 6, 6, 0.3)', + border: '1px solid #760000', + logo: { + src: 'https://snapui.searchspring.io/searchspring_light.svg', + }, + button: { + border: '1px solid #fff', + color: '#fff', + content: 'REMOVE', + }, + close: { + fill: '#fff', + }, + }, + bottom: { + content: 'Incorrect branch name or branch no longer exists.', + branch: { + color: '#be9628', + style: 'italic', + }, + additional: { + color: '#be9628', + }, + }, +}; + +const themes = { + darkTheme, + lightTheme, + failureTheme, +}; + +export const BranchOverride = (properties: BranchOverrideProps): JSX.Element => { + const globalTheme: Theme = useTheme(); + const theme = { ...globalTheme, ...properties.theme }; + + let props: BranchOverrideProps = { + // global theme + ...globalTheme?.components?.branchOverride, + // props + ...properties, + ...properties.theme?.components?.branchOverride, + }; + + const { name, details, error, className, darkMode, disableStyles, style, onRemoveClick } = props; + + const subProps: BranchOverrideSubProps = { + icon: { + // default props + className: 'ss__facet__dropdown__icon', + size: '12px', + // global theme + ...globalTheme?.components?.icon, + // inherited props + ...defined({ + disableStyles, + }), + // component theme overrides + theme: props.theme, + }, + }; + + const prefersDark = typeof darkMode == 'boolean' ? darkMode : window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)').matches : false; + const [themeName, setThemeName] = useState(prefersDark ? 'darkTheme' : 'lightTheme'); + const [collapsed, setCollapsed] = useState(0); + + if (error) { + setThemeName('failureTheme'); + } + + const styling: { css?: any } = {}; + if (!disableStyles) { + styling.css = [CSS.override({ theme: themes[themeName] }), style]; + } else if (style) { + styling.css = [style]; + } + + return ( + (details || error) && + name && ( +
{ + e.preventDefault(); + e.stopPropagation(); + setCollapsed(0); + }} + > +
+ + +
{ + e.preventDefault(); + e.stopPropagation(); + setCollapsed(1); + }} + > + +
+ +
{ + e.preventDefault(); + e.stopPropagation(); + onRemoveClick && onRemoveClick(e, name); + }} + > + {themes[themeName].top.button.content} +
+
+ +
+ + {error ? ( + <> + + {error.message} + + ) : ( + name + )} + + + {details?.lastModified || name} +
{error?.description || themes[themeName].bottom.content}
+
+
+ ) + ); +}; + +interface BranchOverrideSubProps { + icon: IconProps; +} + +export interface BranchOverrideProps extends ComponentProps { + name: string; + error?: { + message: string; + description: string; + }; + details?: { + url: string; + lastModified: string; + }; + onRemoveClick?: (e, name: string) => void; + darkMode?: boolean; +} diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/index.ts b/packages/snap-preact-components/src/components/Organisms/BranchOverride/index.ts new file mode 100644 index 000000000..a09d183f8 --- /dev/null +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/index.ts @@ -0,0 +1 @@ +export * from './BranchOverride'; diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md b/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md new file mode 100644 index 000000000..987a2746a --- /dev/null +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md @@ -0,0 +1,64 @@ +# BranchOverride + +Renders a popup to show when a branch override is in place. +Executed `onRemoveClick` prop when the remove button is clicked. +Must have `name` and either `details` or `error` props to render. + +## Components Used +- Icon + +## Usage + +### name +The required `name` prop expects a string containing the name of the override branch. + +```jsx + +``` + +### details +The `details` prop expects an object containing strings for the `url` and `lastModified` date of the override branch bundle. + +```jsx +const details = { + url: 'https://snapui.searchspring.io/y56s6x/next/bundle.js', + lastModified: '1 Feb 2022 1:02:03 GMT' +}; + + +``` + +### error +The `error` prop expects an object containing strings for the `message` and `description` of the error. + +```jsx +const error = { + message: 'Branch not found!', + description: 'Incorrect branch name or branch no longer exists.' +}; + + +``` + +### onRemoveClick +The `onRemoveClick` prop is a function to be called when the 'remove' button is clicked + +```jsx +const whenRemoved = (e, name) => { + console.log(`removed the ${} branch`); +}; + + +``` + +### darkMode +The `darkMode` prop is used to set the component styling to prefer dark. By default the component will auto detect the browser preference. + +```jsx +const details = { + url: 'https://snapui.searchspring.io/y56s6x/next/bundle.js', + lastModified: '1 Feb 2022 1:02:03 GMT' +}; + + +``` \ No newline at end of file diff --git a/packages/snap-preact-components/src/index.ts b/packages/snap-preact-components/src/index.ts index 3a89725d5..870409c90 100644 --- a/packages/snap-preact-components/src/index.ts +++ b/packages/snap-preact-components/src/index.ts @@ -29,6 +29,7 @@ export * from './components/Molecules/FacetSlider'; // ORGANISMS export * from './components/Organisms/Autocomplete'; +export * from './components/Organisms/BranchOverride'; export * from './components/Organisms/Facet'; export * from './components/Organisms/Facets'; export * from './components/Organisms/FilterSummary'; diff --git a/packages/snap-preact/src/components/BranchOverride.test.tsx b/packages/snap-preact/src/components/BranchOverride.test.tsx deleted file mode 100644 index 959959c13..000000000 --- a/packages/snap-preact/src/components/BranchOverride.test.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { BranchOverride } from './BranchOverride'; - -describe('BranchOverride Component', () => { - it('renders', () => { - expect(true).toBe(true); - }); -}); diff --git a/packages/snap-preact/src/components/BranchOverride.ts b/packages/snap-preact/src/components/BranchOverride.ts new file mode 100644 index 000000000..7b613a396 --- /dev/null +++ b/packages/snap-preact/src/components/BranchOverride.ts @@ -0,0 +1 @@ +export { BranchOverride } from '@searchspring/snap-preact-components'; diff --git a/packages/snap-preact/src/components/BranchOverride.tsx b/packages/snap-preact/src/components/BranchOverride.tsx deleted file mode 100644 index 3c14d277f..000000000 --- a/packages/snap-preact/src/components/BranchOverride.tsx +++ /dev/null @@ -1,238 +0,0 @@ -import { useState, useEffect } from 'preact/hooks'; -import { url, cookies } from '@searchspring/snap-toolbox'; - -type FileHeaderDetails = { - lastModified: string; -}; - -const icons = { - 'close-thin': - 'M56 5.638l-22.362 22.362 22.362 22.362-5.638 5.638-22.362-22.362-22.362 22.362-5.638-5.638 22.362-22.362-22.362-22.362 5.638-5.638 22.362 22.362 22.362-22.362z', - warn: 'M31.2981 5.28228C29.8323 2.74341 26.1677 2.74341 24.7019 5.28228L0.515899 47.1737C-0.94992 49.7126 0.88235 52.8861 3.81399 52.8861H52.186C55.1176 52.8861 56.9499 49.7126 55.4841 47.1737L31.2981 5.28228ZM25.2229 35.0037L24.8264 18.837C24.8264 18.655 24.8923 18.4729 25.047 18.3686C25.1794 18.2387 25.3776 18.1601 25.5759 18.1601H30.4241C30.6223 18.1601 30.8206 18.238 30.953 18.3686C31.1071 18.4729 31.1736 18.655 31.1736 18.837L30.7988 35.0037C30.7988 35.3679 30.4682 35.6542 30.0493 35.6542H25.9724C25.5759 35.6542 25.2453 35.3679 25.2229 35.0037ZM25.1788 43.9593V39.0131C25.1788 38.5447 25.487 38.1541 25.8618 38.1541H30.0929C30.4894 38.1541 30.82 38.5447 30.82 39.0131V43.9593C30.82 44.4277 30.4894 44.8183 30.0929 44.8183H25.8618C25.487 44.8183 25.1788 44.4277 25.1788 43.9593Z', -}; - -const fetchBundleDetails = async (url: string): Promise => { - return new Promise((resolve, reject) => { - const request = new XMLHttpRequest(); - request.open('HEAD', url, true); - - request.onreadystatechange = () => { - if (request.readyState === XMLHttpRequest.DONE) { - const status = request.status; - if (status === 0 || (status >= 200 && status < 400)) { - resolve({ - lastModified: request.getResponseHeader('Last-Modified').split(',')[1], - }); - } else { - reject(); - } - } - }; - - request.onerror = () => reject(); - - request.send(); - }); -}; - -const darkTheme = { - main: { - border: '0', - background: 'rgba(59, 35, 173, 0.9)', - color: '#fff', - boxShadow: '#4c3ce2 1px 1px 3px 0px', - }, - top: { - background: 'rgba(59, 35, 173, 0.3)', - border: '1px solid #4c3de1', - logo: { - src: 'https://snapui.searchspring.io/searchspring_light.svg', - }, - button: { - border: '1px solid #fff', - content: 'STOP PREVIEW', - }, - close: { - fill: '#fff', - }, - }, - details: { - content: 'Preview functionality may differ from production.', - branch: { - color: '#03cee1', - style: 'italic', - }, - additional: { - color: '#03cee1', - }, - }, -}; - -const lightTheme = { - main: { - border: '1px solid #ccc', - background: 'rgba(255, 255, 255, 0.9)', - color: '#515151', - boxShadow: 'rgba(81, 81, 81, 0.5) 1px 1px 3px 0px', - }, - top: { - background: 'rgba(255, 255, 255, 0.3)', - border: '1px solid #ccc', - logo: { - src: 'https://snapui.searchspring.io/searchspring.svg', - }, - button: { - border: '1px solid #515151', - content: 'STOP PREVIEW', - }, - close: { - fill: '#515151', - }, - }, - details: { - content: 'Preview functionality may differ from production.', - branch: { - color: '#3a23ad', - style: 'italic', - }, - additional: { - color: '#3a23ad', - }, - }, -}; - -const failureTheme = { - main: { - border: '0', - background: 'rgba(130, 6, 6, 0.9)', - color: '#fff', - boxShadow: 'rgba(130, 6, 6, 0.4) 1px 1px 3px 0px', - }, - top: { - background: 'rgba(130, 6, 6, 0.3)', - border: '1px solid #760000', - logo: { - src: 'https://snapui.searchspring.io/searchspring_light.svg', - }, - button: { - border: '1px solid #fff', - content: 'REMOVE', - }, - close: { - fill: '#fff', - }, - }, - details: { - content: 'Incorrect branch name or branch no longer exists.', - branch: { - color: '#be9628', - style: 'none', - }, - additional: { - color: '#be9628', - }, - }, -}; - -const themes = { - darkTheme, - lightTheme, - failureTheme, -}; - -export const BranchOverride = (props: { branch: string; cookieName: string; bundleUrl: string }): JSX.Element => { - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - const [themeName, setThemeName] = useState(prefersDark ? 'darkTheme' : 'lightTheme'); - const [details, setDetails] = useState(null); - useEffect(() => { - async function getDetails() { - try { - const details = await fetchBundleDetails(props.bundleUrl); - setDetails(details); - } catch (err) { - setThemeName('failureTheme'); - setDetails('failure'); - } - } - getDetails(); - }, []); - - return ( - props.branch && - details && ( -
{ - e.preventDefault(); - e.stopPropagation(); - const popup = document.querySelector('.ss__branch-override') as HTMLDivElement; - popup.style.transition = 'height ease 0.2s, right ease 0.5s 0.2s'; - popup.style.right = '-1px'; - popup.style.height = '120px'; - popup.style.cursor = 'auto'; - }} - > -
- - -
{ - e.preventDefault(); - e.stopPropagation(); - const popup = document.querySelector('.ss__branch-override') as HTMLDivElement; - popup.style.transition = 'height ease 0.5s 0.5s, right ease 0.5s'; - popup.style.right = '-316px'; - popup.style.height = '50px'; - popup.style.cursor = 'pointer'; - }} - > - - - -
- -
{ - e.preventDefault(); - e.stopPropagation(); - cookies.unset(props.cookieName); - const urlState = url(window.location.href); - delete urlState.params.query['branch']; - window.location.href = urlState.url(); - }} - > - {themes[themeName].top.button.content} -
-
- -
- - {details == 'failure' ? ( - <> - - - - Branch not found! - - ) : ( - props.branch - )} - - - - {details?.lastModified || props.branch} - -
- {themes[themeName].details.content} -
-
- ) - ); -}; From 1b0d753e547c467e96870644dd800263d65ee1e7 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 20:40:58 -0600 Subject: [PATCH 11/27] refactor(components): changes necessary to get BranchOverride working in the component library --- package-lock.json | 4336 ++++++++--------- packages/snap-preact-components/package.json | 9 +- .../src/components/Atoms/Icon/Icon.tsx | 1 + .../Molecules/Carousel/Carousel.tsx | 6 +- .../components/Molecules/Carousel/styles.ts | 14 + packages/snap-preact/jest.config.js | 6 + packages/snap-preact/package.json | 1 + 7 files changed, 2189 insertions(+), 2184 deletions(-) create mode 100644 packages/snap-preact-components/src/components/Molecules/Carousel/styles.ts diff --git a/package-lock.json b/package-lock.json index 032d15123..e9eb4a575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,32 +58,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "engines": { @@ -103,9 +103,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -149,11 +149,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -174,15 +174,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" @@ -279,24 +279,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -314,12 +302,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -337,13 +325,13 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -405,11 +393,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -470,12 +458,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" }, "engines": { @@ -483,9 +471,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -496,9 +484,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -589,14 +577,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", - "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", + "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-create-class-features-plugin": "^7.17.9", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "@babel/plugin-syntax-decorators": "^7.17.0", "charcodes": "^0.2.0" }, @@ -1190,9 +1179,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.16.7" @@ -1331,14 +1320,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1349,13 +1338,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -1525,12 +1514,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "dependencies": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" }, "engines": { "node": ">=6.9.0" @@ -1858,9 +1847,9 @@ } }, "node_modules/@babel/register": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.0.tgz", - "integrity": "sha512-UNZsMAZ7uKoGHo1HlEXfteEOYssf64n/PNLHGqOKq/bgYcu/4LrQWAHJwSCb3BRZK8Hi5gkJdRcwrGTO2wtRCg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.7.tgz", + "integrity": "sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -1908,9 +1897,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1919,9 +1908,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", - "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", + "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", "dev": true, "dependencies": { "core-js-pure": "^3.20.2", @@ -1945,17 +1934,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2012,6 +2001,16 @@ "node": ">=0.1.95" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@commitlint/config-validator": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz", @@ -2037,9 +2036,9 @@ } }, "node_modules/@commitlint/load": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.1.tgz", - "integrity": "sha512-oSpz0jTyVI/A1AIImxJINTLDOMB8YF7lWGm+Jg5wVWM0r7ucpuhyViVvpSRTgvL0z09oIxlctyFGWUQQpI42uw==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.3.tgz", + "integrity": "sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==", "dev": true, "optional": true, "dependencies": { @@ -2397,9 +2396,9 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", - "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", "dependencies": { "@babel/helper-module-imports": "^7.12.13", "@babel/plugin-syntax-jsx": "^7.12.13", @@ -2583,14 +2582,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", - "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", "dependencies": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.2", + "@emotion/serialize": "^1.0.3", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" @@ -2609,9 +2608,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", "dependencies": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -2708,16 +2707,16 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -2727,15 +2726,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3469,6 +3459,12 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "dev": true + }, "node_modules/@lerna/add": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz", @@ -6026,14 +6022,14 @@ } }, "node_modules/@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "dev": true, "dependencies": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", + "@octokit/request": "^5.6.3", "@octokit/request-error": "^2.0.5", "@octokit/types": "^6.0.3", "before-after-hook": "^2.2.0", @@ -6161,9 +6157,9 @@ "dev": true }, "node_modules/@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", "dev": true, "funding": { "type": "opencollective", @@ -6235,9 +6231,9 @@ "link": true }, "node_modules/@searchspring/snapi-types": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@searchspring/snapi-types/-/snapi-types-0.1.24.tgz", - "integrity": "sha512-GUuTDK64GOnGvYphj5lpaD36sm+68QC93i5qgliR80nRIIHrsJaUzTlsKLI0Mpek8VrpsD1q/wC5Ubj3thm11g==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@searchspring/snapi-types/-/snapi-types-0.1.25.tgz", + "integrity": "sha512-X5aIsL9UPKTREcE0GxaRo+Wbny4QlP+RvNKqROMSdmICDEYi51Q6dDZKg0PrivPUEcuQPLs2f3/noUOUO2QgSA==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -6268,17 +6264,17 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.19.tgz", - "integrity": "sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.22.tgz", + "integrity": "sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -6310,18 +6306,18 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.19.tgz", - "integrity": "sha512-yn8MTE7lctO48Rdw+DmmA1wKdf5eyAbA/vrug5ske/U2WPgGc65sApzwT8BItZfuyAMjuT5RnCWwd7o6hGRgGQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.22.tgz", + "integrity": "sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -6347,20 +6343,20 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.19.tgz", - "integrity": "sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.22.tgz", + "integrity": "sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/node-logger": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" @@ -6383,22 +6379,22 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.19.tgz", - "integrity": "sha512-vbV8sjepMVEuwhTDBHjO3E6vXluG7RiEeozV1QVuS9lGhjQdvUPdZ9rDNUcP6WHhTdEkS/ffTMaGIy1v8oZd7g==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "6.4.19", - "@storybook/addon-backgrounds": "6.4.19", - "@storybook/addon-controls": "6.4.19", - "@storybook/addon-docs": "6.4.19", - "@storybook/addon-measure": "6.4.19", - "@storybook/addon-outline": "6.4.19", - "@storybook/addon-toolbars": "6.4.19", - "@storybook/addon-viewport": "6.4.19", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/node-logger": "6.4.19", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.22.tgz", + "integrity": "sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "6.4.22", + "@storybook/addon-backgrounds": "6.4.22", + "@storybook/addon-controls": "6.4.22", + "@storybook/addon-docs": "6.4.22", + "@storybook/addon-measure": "6.4.22", + "@storybook/addon-outline": "6.4.22", + "@storybook/addon-toolbars": "6.4.22", + "@storybook/addon-viewport": "6.4.22", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/node-logger": "6.4.22", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" @@ -6409,8 +6405,8 @@ }, "peerDependencies": { "@babel/core": "^7.9.6", - "@storybook/vue": "6.4.19", - "@storybook/web-components": "6.4.19", + "@storybook/vue": "6.4.22", + "@storybook/web-components": "6.4.22", "babel-loader": "^8.0.0", "lit-html": "^1.4.1 || ^2.0.0-rc.3", "react": "^16.8.0 || ^17.0.0", @@ -6481,9 +6477,9 @@ } }, "node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.19.tgz", - "integrity": "sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.22.tgz", + "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -6495,21 +6491,21 @@ "@mdx-js/loader": "^1.6.22", "@mdx-js/mdx": "^1.6.22", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/postinstall": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/source-loader": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/postinstall": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/source-loader": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "acorn": "^7.4.1", "acorn-jsx": "^5.3.1", "acorn-walk": "^7.2.0", @@ -6538,12 +6534,12 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/angular": "6.4.19", - "@storybook/html": "6.4.19", - "@storybook/react": "6.4.19", - "@storybook/vue": "6.4.19", - "@storybook/vue3": "6.4.19", - "@storybook/web-components": "6.4.19", + "@storybook/angular": "6.4.22", + "@storybook/html": "6.4.22", + "@storybook/react": "6.4.22", + "@storybook/vue": "6.4.22", + "@storybook/vue3": "6.4.22", + "@storybook/web-components": "6.4.22", "lit": "^2.0.0", "lit-html": "^1.4.1 || ^2.0.0", "react": "^16.8.0 || ^17.0.0", @@ -6797,16 +6793,16 @@ } }, "node_modules/@storybook/addon-links": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.19.tgz", - "integrity": "sha512-ebFHYlGDQkHSmI5QEJb1NxGNToVOLgjKkxXUe+JXX7AfHvrWiXVrN/57aOtBPZzj4h2jRPRTZgwR5glhPIlfEQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.22.tgz", + "integrity": "sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", + "@storybook/router": "6.4.22", "@types/qs": "^6.9.5", "core-js": "^3.8.2", "global": "^4.4.0", @@ -6833,16 +6829,16 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.19.tgz", - "integrity": "sha512-PXeU0AlpnGEvnzBQ6snkzmlIpwE0ci8LdFtL1Vz1V1Xk5fbuETWYuEkPuk1oZ7L9igB9cfT32SyJlE5MC1iaGg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.22.tgz", + "integrity": "sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "global": "^4.4.0" @@ -6865,16 +6861,16 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.19.tgz", - "integrity": "sha512-7ZDXo8qrms6dx0KRP9PInXIie82h5g9XCNrGOUdfZkQPvgofJVj0kNv6p+WOiGiaVfKPC5KMgIofqzBTFV+k6Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.22.tgz", + "integrity": "sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -6899,15 +6895,15 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.19.tgz", - "integrity": "sha512-2UtuX9yB1rD/CAZv1etnOnunfPTvsEKEg/J2HYMKE1lhenWC5muIUXvDXCXvwDC65WviPJ56nFNKaKK1Zz7JDg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.22.tgz", + "integrity": "sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" }, @@ -6929,17 +6925,17 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.19.tgz", - "integrity": "sha512-T1hdImxbLj8suQSTbp6HSA1LLHOlqaNK5jjnqzEOoAxY0O8LNPXMJ2jKIeT2fPQ0v+tWGU3tbwf+3xFq0parVQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.22.tgz", + "integrity": "sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -6964,18 +6960,18 @@ } }, "node_modules/@storybook/addons": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.19.tgz", - "integrity": "sha512-QNyRYhpqmHV8oJxxTBdkRlLSbDFhpBvfvMfIrIT1UXb/eemdBZTaCGVvXZ9UixoEEI7f8VwAQ44IvkU5B1509w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.22.tgz", + "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", "dev": true, "dependencies": { - "@storybook/api": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/api": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/router": "6.4.22", + "@storybook/theming": "6.4.22", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -6991,18 +6987,18 @@ } }, "node_modules/@storybook/api": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.19.tgz", - "integrity": "sha512-aDvea+NpQCBjpNp9YidO1Pr7fzzCp15FSdkG+2ihGQfv5raxrN+IIJnGUXecpe71nvlYiB+29UXBVK7AL0j51Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.22.tgz", + "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", "dev": true, "dependencies": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -7024,9 +7020,9 @@ } }, "node_modules/@storybook/builder-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.19.tgz", - "integrity": "sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.22.tgz", + "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -7050,22 +7046,22 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "autoprefixer": "^9.8.6", @@ -7139,9 +7135,9 @@ "dev": true }, "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/builder-webpack4/node_modules/@webassemblyjs/ast": { @@ -7798,13 +7794,19 @@ "node": ">=4.0.0" } }, + "node_modules/@storybook/builder-webpack4/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/@storybook/builder-webpack4/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -8404,9 +8406,9 @@ "dev": true }, "node_modules/@storybook/builder-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.19.tgz", - "integrity": "sha512-AWM4YMN1gPaf7jfntqZTCGpIQ1tF6YRU1JtczPG4ox28rTaO6NMfOBi9aRhBre/59pPOh9bF6u2gu/MIHmRW+w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.22.tgz", + "integrity": "sha512-vvQ0HgkIIVz+cmaCXIRor0UFZbGZqh4aV0ISSof60BjdW5ld+R+XCr/bdTU6Zg8b2fL9CXh7/LE6fImnIMpRIA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -8429,21 +8431,21 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.1", @@ -8510,9 +8512,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/builder-webpack5/node_modules/babel-plugin-macros": { @@ -8604,10 +8606,20 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { "nanoid": "^3.3.1", "picocolors": "^1.0.0", @@ -8615,10 +8627,6 @@ }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/@storybook/builder-webpack5/node_modules/postcss-modules-extract-imports": { @@ -8736,14 +8744,14 @@ } }, "node_modules/@storybook/channel-postmessage": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.19.tgz", - "integrity": "sha512-E5h/itFzQ/6M08LR4kqlgqqmeO3tmavI+nUAlZrkCrotpJFNMHE2i0PQHg0TkFJrRDpYcrwD+AjUW4IwdqrisQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.22.tgz", + "integrity": "sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==", "dev": true, "dependencies": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "qs": "^6.10.0", @@ -8755,13 +8763,13 @@ } }, "node_modules/@storybook/channel-websocket": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.19.tgz", - "integrity": "sha512-cXKwQjIXttfdUyZlcHORelUmJ5nUKswsnCA/qy7IRWpZjD8yQJcNk1dYC+tTHDVqFgdRT89pL0hRRB1rlaaR8Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.22.tgz", + "integrity": "sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==", "dev": true, "dependencies": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "telejson": "^5.3.2" @@ -8772,9 +8780,9 @@ } }, "node_modules/@storybook/channels": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.19.tgz", - "integrity": "sha512-EwyoncFvTfmIlfsy8jTfayCxo2XchPkZk/9txipugWSmc057HdklMKPLOHWP0z5hLH0IbVIKXzdNISABm36jwQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.22.tgz", + "integrity": "sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==", "dev": true, "dependencies": { "core-js": "^3.8.2", @@ -8787,18 +8795,18 @@ } }, "node_modules/@storybook/client-api": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.19.tgz", - "integrity": "sha512-OCrT5Um3FDvZnimQKwWtwsaI+5agPwq2i8YiqlofrI/NPMKp0I7DEkCGwE5IRD1Q8BIKqHcMo5tTmfYi0AxyOg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.22.tgz", + "integrity": "sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/qs": "^6.9.5", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -8823,9 +8831,9 @@ } }, "node_modules/@storybook/client-logger": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.19.tgz", - "integrity": "sha512-zmg/2wyc9W3uZrvxaW4BfHcr40J0v7AGslqYXk9H+ERLVwIvrR4NhxQFaS6uITjBENyRDxwzfU3Va634WcmdDQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.22.tgz", + "integrity": "sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==", "dev": true, "dependencies": { "core-js": "^3.8.2", @@ -8837,15 +8845,15 @@ } }, "node_modules/@storybook/components": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.19.tgz", - "integrity": "sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.22.tgz", + "integrity": "sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==", "dev": true, "dependencies": { "@popperjs/core": "^2.6.0", - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "@types/color-convert": "^2.0.0", "@types/overlayscrollbars": "^1.12.0", "@types/react-syntax-highlighter": "11.0.5", @@ -8895,20 +8903,20 @@ "dev": true }, "node_modules/@storybook/core": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.19.tgz", - "integrity": "sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.22.tgz", + "integrity": "sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==", "dev": true, "dependencies": { - "@storybook/core-client": "6.4.19", - "@storybook/core-server": "6.4.19" + "@storybook/core-client": "6.4.22", + "@storybook/core-server": "6.4.22" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/builder-webpack5": "6.4.19", + "@storybook/builder-webpack5": "6.4.22", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0", "webpack": "*" @@ -8923,21 +8931,21 @@ } }, "node_modules/@storybook/core-client": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.19.tgz", - "integrity": "sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.22.tgz", + "integrity": "sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channel-websocket": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channel-websocket": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/preview-web": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/ui": "6.4.22", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", @@ -8965,9 +8973,9 @@ } }, "node_modules/@storybook/core-common": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.19.tgz", - "integrity": "sha512-X1pJJkO48DFxl6iyEemIKqRkJ7j9/cBh3BRBUr+xZHXBvnD0GKDXIocwh0PjSxSC6XSu3UCQnqtKi3PbjRl8Dg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.22.tgz", + "integrity": "sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -8991,7 +8999,7 @@ "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.4.19", + "@storybook/node-logger": "6.4.22", "@storybook/semver": "^7.3.2", "@types/node": "^14.0.10", "@types/pretty-hrtime": "^1.0.0", @@ -9054,9 +9062,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/core-common/node_modules/@webassemblyjs/ast": { @@ -9620,13 +9628,19 @@ "node": ">=0.10.0" } }, + "node_modules/@storybook/core-common/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/@storybook/core-common/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -9928,9 +9942,9 @@ "dev": true }, "node_modules/@storybook/core-events": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.19.tgz", - "integrity": "sha512-KICzUw6XVQUJzFSCXfvhfHAuyhn4Q5J4IZEfuZkcGJS4ODkrO6tmpdYE5Cfr+so95Nfp0ErWiLUuodBsW9/rtA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.22.tgz", + "integrity": "sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==", "dev": true, "dependencies": { "core-js": "^3.8.2" @@ -9941,22 +9955,22 @@ } }, "node_modules/@storybook/core-server": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.19.tgz", - "integrity": "sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.22.tgz", + "integrity": "sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/manager-webpack4": "6.4.19", - "@storybook/node-logger": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/manager-webpack4": "6.4.22", + "@storybook/node-logger": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/node": "^14.0.10", "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", @@ -9994,8 +10008,8 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/builder-webpack5": "6.4.19", - "@storybook/manager-webpack5": "6.4.19", + "@storybook/builder-webpack5": "6.4.22", + "@storybook/manager-webpack5": "6.4.22", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, @@ -10012,9 +10026,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/core-server/node_modules/@webassemblyjs/ast": { @@ -10502,13 +10516,19 @@ "node": ">=0.10.0" } }, + "node_modules/@storybook/core-server/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/@storybook/core-server/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -10757,9 +10777,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.19.tgz", - "integrity": "sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.22.tgz", + "integrity": "sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -10834,20 +10854,20 @@ } }, "node_modules/@storybook/manager-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.19.tgz", - "integrity": "sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.22.tgz", + "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "babel-loader": "^8.0.0", @@ -10897,9 +10917,9 @@ "dev": true }, "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/manager-webpack4/node_modules/@webassemblyjs/ast": { @@ -11586,13 +11606,19 @@ "node": ">=4.0.0" } }, + "node_modules/@storybook/manager-webpack4/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/@storybook/manager-webpack4/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -12303,20 +12329,20 @@ "dev": true }, "node_modules/@storybook/manager-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.19.tgz", - "integrity": "sha512-hVjWhWAOgWaymBy0HeRskN+MfKLpqLP4Txfw+3Xqg1qplgexV0w2O4BQrS/SNEH4V/1qF9h8XTsk3L3oQIj3Mg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.22.tgz", + "integrity": "sha512-BMkOMselT4jOn7EQGt748FurM5ewtDfZtOQPCVK8MZX+HYE2AgjNOzm562TYODIxk12Fkhgj3EIz7GGMe1U3RA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", @@ -12357,9 +12383,9 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/@storybook/manager-webpack5/node_modules/ansi-styles": { @@ -12576,10 +12602,20 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { "nanoid": "^3.3.1", "picocolors": "^1.0.0", @@ -12587,10 +12623,6 @@ }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/@storybook/manager-webpack5/node_modules/postcss-modules-extract-imports": { @@ -12831,9 +12863,9 @@ } }, "node_modules/@storybook/node-logger": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.19.tgz", - "integrity": "sha512-hO2Aar3PgPnPtNq2fVgiuGlqo3EEVR6TKVBXMq7foL3tN2k4BQFKLDHbm5qZQQntyYKurKsRUGKPJFPuI1ov/w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.22.tgz", + "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", "dev": true, "dependencies": { "@types/npmlog": "^4.1.2", @@ -12986,9 +13018,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.19.tgz", - "integrity": "sha512-/0tHHxyIV82zt1rw4BW70GmrQbDVu9IJPAxOqFzGjC1fNojwJ53mK6FfUsOzbhG5mWk5p0Ip5+zr74moP119AA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.22.tgz", + "integrity": "sha512-LdIvA+l70Mp5FSkawOC16uKocefc+MZLYRHqjTjgr7anubdi6y7W4n9A7/Yw4IstZHoknfL88qDj/uK5N+Ahzw==", "dev": true, "dependencies": { "core-js": "^3.8.2" @@ -12999,17 +13031,17 @@ } }, "node_modules/@storybook/preact": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/preact/-/preact-6.4.19.tgz", - "integrity": "sha512-A9+X5AMLRE4hstzbOj/NUoybMVyRzxMzXTb/hPUoLtj+nKNIXhDu++7QRQcx+fmbuDyRJgnLKGuFzKpvGBRavA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/preact/-/preact-6.4.22.tgz", + "integrity": "sha512-F13t8zBYQvgFBxaKJ1/iazeGtT6lqEBYo2jFPWQ5k5XheGyO/KEtqb/4+WTmWZBmj9JK2Z1ZhfjsP5RfMJdw3Q==", "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.12.12", - "@storybook/addons": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-common": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-common": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -13132,17 +13164,17 @@ } }, "node_modules/@storybook/preview-web": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.19.tgz", - "integrity": "sha512-jqltoBv5j7lvnxEfV9w8dLX9ASWGuvgz97yg8Yo5FqkftEwrHJenyvMGcTgDJKJPorF+wiz/9aIqnmd3LCAcZQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.22.tgz", + "integrity": "sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", "global": "^4.4.0", @@ -13164,12 +13196,12 @@ } }, "node_modules/@storybook/router": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.19.tgz", - "integrity": "sha512-KWWwIzuyeEIWVezkCihwY2A76Il9tUNg0I410g9qT7NrEsKyqXGRYOijWub7c1GGyNjLqz0jtrrehtixMcJkuA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.22.tgz", + "integrity": "sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==", "dev": true, "dependencies": { - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -13207,13 +13239,13 @@ } }, "node_modules/@storybook/source-loader": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.19.tgz", - "integrity": "sha512-XqTsqddRglvfW7mhyjwoqd/B8L6samcBehhO0OEbsFp6FPWa9eXuObCxtRYIcjcSIe+ksbW3D/54ppEs1L/g1Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.22.tgz", + "integrity": "sha512-O4RxqPgRyOgAhssS6q1Rtc8LiOvPBpC1EqhCYWRV3K+D2EjFarfQMpjgPj18hC+QzpUSfzoBZYqsMECewEuLNw==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "estraverse": "^5.2.0", @@ -13245,14 +13277,14 @@ } }, "node_modules/@storybook/store": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.19.tgz", - "integrity": "sha512-N9/ZjemRHGfT3InPIbqQqc6snkcfnf3Qh9oOr0smbfaVGJol//KOX65kzzobtzFcid0WxtTDZ3HmgFVH+GvuhQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.22.tgz", + "integrity": "sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==", "dev": true, "dependencies": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -13276,15 +13308,15 @@ } }, "node_modules/@storybook/theming": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.19.tgz", - "integrity": "sha512-V4pWmTvAxmbHR6B3jA4hPkaxZPyExHvCToy7b76DpUTpuHihijNDMAn85KhOQYIeL9q14zP/aiz899tOHsOidg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.22.tgz", + "integrity": "sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==", "dev": true, "dependencies": { "@emotion/core": "^10.1.1", "@emotion/is-prop-valid": "^0.8.6", "@emotion/styled": "^10.0.27", - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "deep-object-diff": "^1.1.0", "emotion-theming": "^10.0.27", @@ -13304,21 +13336,21 @@ } }, "node_modules/@storybook/ui": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.19.tgz", - "integrity": "sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.22.tgz", + "integrity": "sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==", "dev": true, "dependencies": { "@emotion/core": "^10.1.1", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "copy-to-clipboard": "^3.3.1", "core-js": "^3.8.2", "core-js-pure": "^3.8.2", @@ -13360,9 +13392,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.3.tgz", - "integrity": "sha512-9LId28I+lx70wUiZjLvi1DB/WT2zGOxUh46glrSNMaWVx849kKAluezVzZrXJfTKKoQTmEOutLes/bHg4Bj3aA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", + "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", "dev": true, "peer": true, "dependencies": { @@ -13456,9 +13488,9 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz", - "integrity": "sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", + "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", "dev": true, "dependencies": { "@babel/runtime": "^7.9.2", @@ -13761,9 +13793,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -13793,9 +13825,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", + "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" @@ -13998,9 +14030,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/mdast": { @@ -14031,9 +14063,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", + "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", "dev": true }, "node_modules/@types/node-fetch": { @@ -14090,9 +14122,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", + "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", "dev": true }, "node_modules/@types/pretty-hrtime": { @@ -14102,9 +14134,9 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", "dev": true }, "node_modules/@types/qs": { @@ -14120,9 +14152,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.44", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", + "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -14225,15 +14257,15 @@ } }, "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "node_modules/@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz", + "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==", "dev": true, "dependencies": { "source-map": "^0.6.1" @@ -14260,9 +14292,9 @@ } }, "node_modules/@types/webpack-env": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.3.tgz", - "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==", + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz", + "integrity": "sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==", "dev": true }, "node_modules/@types/webpack-sources": { @@ -14286,9 +14318,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", - "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "dependencies": { "@types/node": "*" @@ -14310,9 +14342,9 @@ "dev": true }, "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "dependencies": { @@ -14320,14 +14352,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz", + "integrity": "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/type-utils": "5.20.0", + "@typescript-eslint/utils": "5.20.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -14353,14 +14385,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz", + "integrity": "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", "debug": "^4.3.2" }, "engines": { @@ -14380,13 +14412,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", + "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -14397,12 +14429,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz", + "integrity": "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.20.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -14423,9 +14455,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", + "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -14436,13 +14468,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", + "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -14463,15 +14495,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", + "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -14487,12 +14519,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", + "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.20.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -14810,9 +14842,9 @@ "dev": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/abbrev": { @@ -15017,9 +15049,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -15340,14 +15372,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15357,14 +15390,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15487,9 +15521,9 @@ } }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -15680,13 +15714,13 @@ } }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -15715,32 +15749,6 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/babel-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", @@ -16235,21 +16243,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "dev": true, "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, - "node_modules/bonjour/node_modules/array-flatten": { + "node_modules/bonjour-service/node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", @@ -16516,12 +16522,22 @@ } }, "node_modules/browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -16531,10 +16547,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bs-logger": { @@ -16584,12 +16596,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -16823,13 +16829,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/capture-exit": { "version": "2.0.0", @@ -17015,13 +17027,19 @@ "rimraf": "^3.0.2" } }, + "node_modules/chrome-launcher/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/chrome-launcher/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -17162,9 +17180,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "node_modules/clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -17207,9 +17225,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -17218,7 +17236,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" + "@colors/colors": "1.5.0" } }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { @@ -17491,16 +17509,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -18127,13 +18135,19 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "node_modules/copy-concurrently/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/copy-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -18170,9 +18184,9 @@ } }, "node_modules/core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", + "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -18181,12 +18195,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.0.tgz", + "integrity": "sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", + "browserslist": "^4.20.2", "semver": "7.0.0" }, "funding": { @@ -18204,9 +18218,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.0.tgz", + "integrity": "sha512-ylOC9nVy0ak1N+fPIZj00umoZHgUVqmucklP5RT5N+vJof38klKn8Ze6KGyvchdClvEBr6LcQqJpI216LUMqYA==", "dev": true, "hasInstallScript": true, "funding": { @@ -18246,14 +18260,14 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.6.tgz", - "integrity": "sha512-2nEotziYJWtNtoTjKbchj9QrdTT6DBxCvqjNKoDKARw+e2yZmTQCa07uRrykLIZuvSgp69YXLH89UHc0WhdMfQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", + "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", "dev": true, "optional": true, "dependencies": { "cosmiconfig": "^7", - "ts-node": "^10.6.0" + "ts-node": "^10.7.0" }, "engines": { "node": ">=12", @@ -18753,10 +18767,20 @@ } }, "node_modules/css-loader/node_modules/postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { "nanoid": "^3.3.1", "picocolors": "^1.0.0", @@ -18764,10 +18788,6 @@ }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/css-loader/node_modules/postcss-modules-extract-imports": { @@ -18830,14 +18850,14 @@ } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, @@ -18846,9 +18866,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -18968,9 +18988,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "node_modules/cypress/node_modules/ansi-styles": { @@ -19383,15 +19403,15 @@ } }, "node_modules/dayjs": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz", - "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", + "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", "dev": true }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -19477,23 +19497,6 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -19560,15 +19563,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-property": { @@ -19584,28 +19591,6 @@ "node": ">=0.10.0" } }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -19731,9 +19716,9 @@ "dev": true }, "node_modules/dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "dependencies": { "asap": "^2.0.0", @@ -19795,22 +19780,15 @@ "dev": true }, "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "dependencies": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, "node_modules/doctrine": { @@ -19841,9 +19819,9 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { "domelementtype": "^2.0.1", @@ -19879,9 +19857,9 @@ } }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -19903,9 +19881,9 @@ } }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -20129,9 +20107,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.81", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.81.tgz", - "integrity": "sha512-Gs7xVpIZ7tYYSDA+WgpzwpPvfGwUk3KSIjJ0akuj5XQHFdyQnsUoM76EA4CIHXNLPiVwTwOFay9RMb0ChG3OBw==" + "version": "1.4.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.113.tgz", + "integrity": "sha512-s30WKxp27F3bBH6fA07FYL2Xm/FYnYrKpMjHr3XVCTUb9anAyZn/BeZfPWgTZGAbJeT4NxNwISSbLcYZvggPMA==" }, "node_modules/element-resize-detector": { "version": "1.2.4", @@ -20247,9 +20225,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -20337,9 +20315,9 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -20348,15 +20326,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -20407,6 +20385,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -20544,12 +20531,12 @@ } }, "node_modules/eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", + "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.2.0", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -20608,9 +20595,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", - "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", "dev": true, "dependencies": { "array-includes": "^3.1.4", @@ -21892,9 +21879,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.8.3", @@ -22773,9 +22760,9 @@ } }, "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -22857,9 +22844,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/gzip-size": { @@ -22988,6 +22975,18 @@ "node": ">=0.10.0" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -23370,9 +23369,9 @@ } }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "node_modules/html-escaper": { @@ -23403,12 +23402,15 @@ } }, "node_modules/html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/html-void-elements": { @@ -23541,9 +23543,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", @@ -23695,9 +23697,9 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", @@ -23981,9 +23983,9 @@ } }, "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -24466,9 +24468,9 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -24498,15 +24500,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -24565,10 +24558,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -26976,12 +26972,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "bin": { "json5": "lib/cli.js" }, @@ -27045,12 +27038,12 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", + "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", "dev": true, "dependencies": { - "array-includes": "^3.1.3", + "array-includes": "^3.1.4", "object.assign": "^4.1.2" }, "engines": { @@ -27287,14 +27280,14 @@ } }, "node_modules/libnpmaccess/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" @@ -27384,14 +27377,14 @@ } }, "node_modules/libnpmpublish/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" @@ -27469,9 +27462,9 @@ "dev": true }, "node_modules/lighthouse-stack-packs": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.7.0.tgz", - "integrity": "sha512-ggLg9V6Hs31Qcn29L2fwKsaQq8L5t+mIv3lNqwd85bc7zFxpMVybK71b4w2OeBLpa0H8gATIi9fxPlP+9moMDA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.8.1.tgz", + "integrity": "sha512-LSCu9Ugt9NPvRfBNzAjMDLvYev9r/93OTmbIWt9iXwiCmd999I/zneRTwsFLtlQWGKwNbDHS9vXnU+KpXUb1qg==", "dev": true }, "node_modules/lighthouse/node_modules/ansi-styles": { @@ -27787,9 +27780,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "12.3.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.5.tgz", - "integrity": "sha512-oOH36RUs1It7b9U/C7Nl/a0sLfoIBcMB8ramiB3nuJ6brBqzsWiUAFSR5DQ3yyP/OR7XKMpijtgKl2DV1lQ3lA==", + "version": "12.3.8", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.8.tgz", + "integrity": "sha512-0+UpNaqIwKRSGAFOCcpuYNIv/j5QGVC+xUVvmSdxHO+IfIGoHbFLo3XcPmV/LLnsVj5EAncNHVtlITSoY5qWGQ==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -27802,6 +27795,7 @@ "micromatch": "^4.0.4", "normalize-path": "^3.0.0", "object-inspect": "^1.12.0", + "pidtree": "^0.5.0", "string-argv": "^0.3.1", "supports-color": "^9.2.1", "yaml": "^1.10.2" @@ -27817,9 +27811,9 @@ } }, "node_modules/lint-staged/node_modules/supports-color": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", - "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", + "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", "dev": true, "engines": { "node": ">=12" @@ -27981,9 +27975,9 @@ } }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "engines": { "node": ">=6.11.5" @@ -28608,9 +28602,9 @@ } }, "node_modules/marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -28978,13 +28972,13 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -29022,21 +29016,21 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -29105,7 +29099,8 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "node_modules/minimist-options": { "version": "4.1.0", @@ -29331,9 +29326,9 @@ } }, "node_modules/mobx": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.4.2.tgz", - "integrity": "sha512-b4xQJYiH8sb0sEbfq/Ws3N77DEJtSihUFD1moeiz2jNoJ5B+mqJutt54ouO9iEfkp7Wk4jQDsVUOh7DPEW3wEw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.5.0.tgz", + "integrity": "sha512-pHZ/cySF00FVENDWIDzJyoObFahK6Eg4d0papqm6d7yMkxWTZ/S/csqJX1A3PsYy4t5k3z2QnlwuCfMW5lSEwA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -29413,13 +29408,19 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "node_modules/move-concurrently/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/move-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -29452,24 +29453,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "dev": true, "dependencies": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, "node_modules/multimatch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", @@ -29512,9 +29507,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -29567,9 +29562,9 @@ "dev": true }, "node_modules/nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, "node_modules/nice-try": { @@ -29637,9 +29632,9 @@ } }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -29685,6 +29680,12 @@ "minipass": "^2.6.0" } }, + "node_modules/node-gyp/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/node-gyp/node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -29705,12 +29706,12 @@ } }, "node_modules/node-gyp/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -29867,9 +29868,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" }, "node_modules/nopt": { "version": "4.0.3", @@ -30253,22 +30254,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -30892,14 +30877,14 @@ } }, "node_modules/pacote/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "dependencies": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { "node": ">= 10" @@ -31209,6 +31194,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", + "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", @@ -31255,12 +31252,12 @@ } }, "node_modules/polished": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz", - "integrity": "sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.16.7" + "@babel/runtime": "^7.17.8" }, "engines": { "node": ">=10" @@ -31289,13 +31286,19 @@ "ms": "^2.1.1" } }, + "node_modules/portfinder/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -31429,9 +31432,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -31454,9 +31457,9 @@ "dev": true }, "node_modules/preact": { - "version": "10.6.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.6.tgz", - "integrity": "sha512-dgxpTFV2vs4vizwKohYKkk7g7rmp1wOOcfd4Tz3IB3Wi+ivZzsn/SpeKJhRENSE+n8sUfsAl4S3HiCVT923ABw==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.1.tgz", + "integrity": "sha512-MufnRFz39aIhs9AMFisonjzTud1PK1bY+jcJLo6m2T9Uh8AqjD77w11eAAawmjUogoGOnipECq7e/1RClIKsxg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -31481,15 +31484,18 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-bytes": { @@ -31550,9 +31556,9 @@ } }, "node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", "dev": true, "engines": { "node": ">=6" @@ -32135,9 +32141,9 @@ "dev": true }, "node_modules/react-helmet-async": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.2.3.tgz", - "integrity": "sha512-mCk2silF53Tq/YaYdkl2sB+/tDoPnaxN7dFS/6ZLJb/rhUY2EWGI5Xj2b4jHppScMqY45MbgPSwTxDchKpZ5Kw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", @@ -32147,8 +32153,8 @@ "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0", - "react-dom": "^16.6.0 || ^17.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-inspector": { @@ -32210,9 +32216,9 @@ } }, "node_modules/react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", "dev": true, "dependencies": { "history": "^5.2.0" @@ -32222,13 +32228,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", "dev": true, "dependencies": { "history": "^5.2.0", - "react-router": "6.2.2" + "react-router": "6.3.0" }, "peerDependencies": { "react": ">=16.8", @@ -32703,6 +32709,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -32727,9 +32742,9 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -32749,13 +32764,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -33765,9 +33781,9 @@ } }, "node_modules/sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", + "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -33877,21 +33893,21 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "node-forge": "^1.2.0" + "node-forge": "^1" }, "engines": { "node": ">=10" } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -35074,9 +35090,9 @@ } }, "node_modules/store2": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.1.tgz", - "integrity": "sha512-iJtHSGmNgAUx0b/MCS6ASGxb//hGrHHRgzvN+K5bvkBTN7A9RTpPSf1WSp+nPGvWCJ1jRnvY7MKnuqfoi3OEqg==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.2.tgz", + "integrity": "sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==", "dev": true }, "node_modules/stream-browserify": { @@ -35240,9 +35256,9 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -35270,18 +35286,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" }, "funding": { @@ -35702,9 +35718,9 @@ } }, "node_modules/terser": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", - "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "dependencies": { "acorn": "^8.5.0", @@ -36080,9 +36096,9 @@ } }, "node_modules/ts-jest": { - "version": "27.1.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.3.tgz", - "integrity": "sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==", + "version": "27.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", + "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -36104,7 +36120,6 @@ "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", - "esbuild": "~0.14.0", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, @@ -36387,9 +36402,9 @@ } }, "node_modules/typedoc": { - "version": "0.22.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.13.tgz", - "integrity": "sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ==", + "version": "0.22.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz", + "integrity": "sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==", "dev": true, "dependencies": { "glob": "^7.2.0", @@ -36462,9 +36477,9 @@ } }, "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -36475,9 +36490,9 @@ } }, "node_modules/uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", "dev": true, "optional": true, "bin": { @@ -36922,9 +36937,9 @@ } }, "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -37240,9 +37255,9 @@ } }, "node_modules/update-notifier/node_modules/widest-line/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -37413,12 +37428,12 @@ } }, "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", "dev": true, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -37521,9 +37536,9 @@ "dev": true }, "node_modules/v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "optional": true }, @@ -38078,9 +38093,9 @@ } }, "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -38357,9 +38372,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -38367,29 +38382,28 @@ "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" }, @@ -38409,9 +38423,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -38436,18 +38450,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -38499,21 +38501,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", @@ -39215,55 +39202,56 @@ }, "packages/snap-client": { "name": "@searchspring/snap-client", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-toolbox": "^0.23.1", "deepmerge": "^4.2.2" } }, "packages/snap-controller": { "name": "@searchspring/snap-controller", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-toolbox": "^0.23.1", "deepmerge": "^4.2.2" }, "devDependencies": { - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-tracker": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0" + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1" } }, "packages/snap-event-manager": { "name": "@searchspring/snap-event-manager", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT" }, "packages/snap-logger": { "name": "@searchspring/snap-logger", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT" }, "packages/snap-preact": { "name": "@searchspring/snap-preact", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-controller": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", - "@searchspring/snap-tracker": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-preact-components": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "deepmerge": "^4.2.2", "intersection-observer": "^0.12.0", "is-plain-object": "^5.0.0" @@ -39274,12 +39262,19 @@ }, "packages/snap-preact-components": { "name": "@searchspring/snap-preact-components", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { "@emotion/react": "^11.7.1", - "@searchspring/snap-preact": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "classnames": "^2.3.1", "deepmerge": "^4.2.2", "mobx-react-lite": "^3.2.3", @@ -39288,13 +39283,13 @@ }, "devDependencies": { "@mdx-js/loader": "^1.6.22", - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-controller": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "@storybook/addon-actions": "^6.4.9", "@storybook/addon-controls": "^6.4.9", "@storybook/addon-docs": "^6.4.9", @@ -39360,9 +39355,9 @@ } }, "packages/snap-preact-components/node_modules/@storybook/addon-docs": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.19.tgz", - "integrity": "sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.22.tgz", + "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", @@ -39374,21 +39369,21 @@ "@mdx-js/loader": "^1.6.22", "@mdx-js/mdx": "^1.6.22", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/postinstall": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/source-loader": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/postinstall": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/source-loader": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "acorn": "^7.4.1", "acorn-jsx": "^5.3.1", "acorn-walk": "^7.2.0", @@ -39417,12 +39412,12 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/angular": "6.4.19", - "@storybook/html": "6.4.19", - "@storybook/react": "6.4.19", - "@storybook/vue": "6.4.19", - "@storybook/vue3": "6.4.19", - "@storybook/web-components": "6.4.19", + "@storybook/angular": "6.4.22", + "@storybook/html": "6.4.22", + "@storybook/react": "6.4.22", + "@storybook/vue": "6.4.22", + "@storybook/vue3": "6.4.22", + "@storybook/web-components": "6.4.22", "lit": "^2.0.0", "lit-html": "^1.4.1 || ^2.0.0", "react": "^16.8.0 || ^17.0.0", @@ -39677,11 +39672,11 @@ }, "packages/snap-preact-demo": { "name": "@searchspring/snap-preact-demo", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-preact": "^0.22.0", - "@searchspring/snap-preact-components": "^0.22.0", + "@searchspring/snap-preact": "^0.23.1", + "@searchspring/snap-preact-components": "^0.23.1", "deepmerge": "^4.2.2", "mobx": "^6.3.12", "mobx-react": "^7.2.1", @@ -39715,41 +39710,41 @@ }, "packages/snap-profiler": { "name": "@searchspring/snap-profiler", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT" }, "packages/snap-shared": { "name": "@searchspring/snap-shared", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "devDependencies": { - "@searchspring/snap-client": "^0.22.0" + "@searchspring/snap-client": "^0.23.1" } }, "packages/snap-store-mobx": { "name": "@searchspring/snap-store-mobx", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-toolbox": "^0.23.1", "mobx": "^6.3.12" }, "devDependencies": { - "@searchspring/snap-url-manager": "^0.22.0" + "@searchspring/snap-url-manager": "^0.23.1" } }, "packages/snap-toolbox": { "name": "@searchspring/snap-toolbox", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT" }, "packages/snap-tracker": { "name": "@searchspring/snap-tracker", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", "deepmerge": "^4.2.2", "uuid": "^8.3.2" } @@ -39764,7 +39759,7 @@ }, "packages/snap-url-manager": { "name": "@searchspring/snap-url-manager", - "version": "0.22.0", + "version": "0.23.1", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -39790,29 +39785,29 @@ } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==" + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.17.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", - "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.2", - "@babel/parser": "^7.17.3", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { @@ -39824,9 +39819,9 @@ } }, "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -39860,11 +39855,11 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -39878,15 +39873,15 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", - "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", "@babel/helper-optimise-call-expression": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7" @@ -39955,21 +39950,12 @@ } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "requires": { - "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { @@ -39981,12 +39967,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { @@ -39998,13 +39984,13 @@ } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", @@ -40051,11 +40037,11 @@ } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -40098,19 +40084,19 @@ } }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", + "@babel/traverse": "^7.17.9", "@babel/types": "^7.17.0" } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -40118,9 +40104,9 @@ } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==" + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", @@ -40175,14 +40161,15 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz", - "integrity": "sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz", + "integrity": "sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-create-class-features-plugin": "^7.17.9", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "@babel/plugin-syntax-decorators": "^7.17.0", "charcodes": "^0.2.0" } @@ -40574,9 +40561,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz", - "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" @@ -40661,25 +40648,25 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -40783,12 +40770,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", - "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { @@ -41027,9 +41014,9 @@ } }, "@babel/register": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.0.tgz", - "integrity": "sha512-UNZsMAZ7uKoGHo1HlEXfteEOYssf64n/PNLHGqOKq/bgYcu/4LrQWAHJwSCb3BRZK8Hi5gkJdRcwrGTO2wtRCg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.17.7.tgz", + "integrity": "sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -41064,17 +41051,17 @@ } }, "@babel/runtime": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.2.tgz", - "integrity": "sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz", + "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==", "dev": true, "requires": { "core-js-pure": "^3.20.2", @@ -41092,17 +41079,17 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", + "@babel/generator": "^7.17.9", "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", + "@babel/parser": "^7.17.9", "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -41146,6 +41133,13 @@ "minimist": "^1.2.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, "@commitlint/config-validator": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz", @@ -41165,9 +41159,9 @@ "optional": true }, "@commitlint/load": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.1.tgz", - "integrity": "sha512-oSpz0jTyVI/A1AIImxJINTLDOMB8YF7lWGm+Jg5wVWM0r7ucpuhyViVvpSRTgvL0z09oIxlctyFGWUQQpI42uw==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.3.tgz", + "integrity": "sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==", "dev": true, "optional": true, "requires": { @@ -41452,9 +41446,9 @@ "dev": true }, "@emotion/babel-plugin": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", - "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", + "version": "11.9.2", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz", + "integrity": "sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==", "requires": { "@babel/helper-module-imports": "^7.12.13", "@babel/plugin-syntax-jsx": "^7.12.13", @@ -41631,23 +41625,23 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.2.tgz", - "integrity": "sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", "requires": { "@babel/runtime": "^7.13.10", "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.2", + "@emotion/serialize": "^1.0.3", "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -41738,28 +41732,22 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", - "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -42317,6 +42305,12 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==", + "dev": true + }, "@lerna/add": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@lerna/add/-/add-4.0.0.tgz", @@ -44371,14 +44365,14 @@ } }, "@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "dev": true, "requires": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", + "@octokit/request": "^5.6.3", "@octokit/request-error": "^2.0.5", "@octokit/types": "^6.0.3", "before-after-hook": "^2.2.0", @@ -44498,9 +44492,9 @@ "dev": true }, "@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", "dev": true }, "@searchspring/browserslist-config-snap": { @@ -44518,21 +44512,21 @@ "@searchspring/snap-client": { "version": "file:packages/snap-client", "requires": { - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-toolbox": "^0.23.1", "deepmerge": "^4.2.2" } }, "@searchspring/snap-controller": { "version": "file:packages/snap-controller", "requires": { - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", - "@searchspring/snap-tracker": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "deepmerge": "^4.2.2" } }, @@ -44545,15 +44539,16 @@ "@searchspring/snap-preact": { "version": "file:packages/snap-preact", "requires": { - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-controller": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", - "@searchspring/snap-tracker": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-preact-components": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "@types/react": "^17.0.20", "deepmerge": "^4.2.2", "intersection-observer": "^0.12.0", @@ -44565,15 +44560,15 @@ "requires": { "@emotion/react": "^11.7.1", "@mdx-js/loader": "^1.6.22", - "@searchspring/snap-client": "^0.22.0", - "@searchspring/snap-controller": "^0.22.0", - "@searchspring/snap-event-manager": "^0.22.0", - "@searchspring/snap-logger": "^0.22.0", - "@searchspring/snap-preact": "^0.22.0", - "@searchspring/snap-profiler": "^0.22.0", - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "@storybook/addon-actions": "^6.4.9", "@storybook/addon-controls": "^6.4.9", "@storybook/addon-docs": "^6.4.9", @@ -44635,9 +44630,9 @@ } }, "@storybook/addon-docs": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.19.tgz", - "integrity": "sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.22.tgz", + "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -44649,21 +44644,21 @@ "@mdx-js/loader": "^1.6.22", "@mdx-js/mdx": "^1.6.22", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/postinstall": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/source-loader": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/postinstall": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/source-loader": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "acorn": "^7.4.1", "acorn-jsx": "^5.3.1", "acorn-walk": "^7.2.0", @@ -44845,8 +44840,8 @@ "@babel/runtime": "^7.16.7", "@lhci/cli": "^0.8.2", "@searchspring/browserslist-config-snap": "^1.0.5", - "@searchspring/snap-preact": "^0.22.0", - "@searchspring/snap-preact-components": "^0.22.0", + "@searchspring/snap-preact": "^0.23.1", + "@searchspring/snap-preact-components": "^0.23.1", "babel-loader": "^8.2.3", "core-js": "^3.20.2", "css-loader": "^6.5.1", @@ -44872,14 +44867,14 @@ "@searchspring/snap-shared": { "version": "file:packages/snap-shared", "requires": { - "@searchspring/snap-client": "^0.22.0" + "@searchspring/snap-client": "^0.23.1" } }, "@searchspring/snap-store-mobx": { "version": "file:packages/snap-store-mobx", "requires": { - "@searchspring/snap-toolbox": "^0.22.0", - "@searchspring/snap-url-manager": "^0.22.0", + "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "mobx": "^6.3.12" } }, @@ -44889,8 +44884,8 @@ "@searchspring/snap-tracker": { "version": "file:packages/snap-tracker", "requires": { - "@searchspring/snap-store-mobx": "^0.22.0", - "@searchspring/snap-toolbox": "^0.22.0", + "@searchspring/snap-store-mobx": "^0.23.1", + "@searchspring/snap-toolbox": "^0.23.1", "deepmerge": "^4.2.2", "uuid": "^8.3.2" }, @@ -44910,9 +44905,9 @@ } }, "@searchspring/snapi-types": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@searchspring/snapi-types/-/snapi-types-0.1.24.tgz", - "integrity": "sha512-GUuTDK64GOnGvYphj5lpaD36sm+68QC93i5qgliR80nRIIHrsJaUzTlsKLI0Mpek8VrpsD1q/wC5Ubj3thm11g==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@searchspring/snapi-types/-/snapi-types-0.1.25.tgz", + "integrity": "sha512-X5aIsL9UPKTREcE0GxaRo+Wbny4QlP+RvNKqROMSdmICDEYi51Q6dDZKg0PrivPUEcuQPLs2f3/noUOUO2QgSA==", "dev": true }, "@sindresorhus/is": { @@ -44940,17 +44935,17 @@ } }, "@storybook/addon-actions": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.19.tgz", - "integrity": "sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.22.tgz", + "integrity": "sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -44966,18 +44961,18 @@ } }, "@storybook/addon-backgrounds": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.19.tgz", - "integrity": "sha512-yn8MTE7lctO48Rdw+DmmA1wKdf5eyAbA/vrug5ske/U2WPgGc65sApzwT8BItZfuyAMjuT5RnCWwd7o6hGRgGQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.22.tgz", + "integrity": "sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -44987,42 +44982,42 @@ } }, "@storybook/addon-controls": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.19.tgz", - "integrity": "sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.22.tgz", + "integrity": "sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/node-logger": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" } }, "@storybook/addon-essentials": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.19.tgz", - "integrity": "sha512-vbV8sjepMVEuwhTDBHjO3E6vXluG7RiEeozV1QVuS9lGhjQdvUPdZ9rDNUcP6WHhTdEkS/ffTMaGIy1v8oZd7g==", - "dev": true, - "requires": { - "@storybook/addon-actions": "6.4.19", - "@storybook/addon-backgrounds": "6.4.19", - "@storybook/addon-controls": "6.4.19", - "@storybook/addon-docs": "6.4.19", - "@storybook/addon-measure": "6.4.19", - "@storybook/addon-outline": "6.4.19", - "@storybook/addon-toolbars": "6.4.19", - "@storybook/addon-viewport": "6.4.19", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/node-logger": "6.4.19", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.22.tgz", + "integrity": "sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==", + "dev": true, + "requires": { + "@storybook/addon-actions": "6.4.22", + "@storybook/addon-backgrounds": "6.4.22", + "@storybook/addon-controls": "6.4.22", + "@storybook/addon-docs": "6.4.22", + "@storybook/addon-measure": "6.4.22", + "@storybook/addon-outline": "6.4.22", + "@storybook/addon-toolbars": "6.4.22", + "@storybook/addon-viewport": "6.4.22", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/node-logger": "6.4.22", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" @@ -45065,9 +45060,9 @@ } }, "@storybook/addon-docs": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.19.tgz", - "integrity": "sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.22.tgz", + "integrity": "sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -45079,21 +45074,21 @@ "@mdx-js/loader": "^1.6.22", "@mdx-js/mdx": "^1.6.22", "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/postinstall": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/source-loader": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/postinstall": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/source-loader": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "acorn": "^7.4.1", "acorn-jsx": "^5.3.1", "acorn-walk": "^7.2.0", @@ -45263,16 +45258,16 @@ } }, "@storybook/addon-links": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.19.tgz", - "integrity": "sha512-ebFHYlGDQkHSmI5QEJb1NxGNToVOLgjKkxXUe+JXX7AfHvrWiXVrN/57aOtBPZzj4h2jRPRTZgwR5glhPIlfEQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.22.tgz", + "integrity": "sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", + "@storybook/router": "6.4.22", "@types/qs": "^6.9.5", "core-js": "^3.8.2", "global": "^4.4.0", @@ -45283,32 +45278,32 @@ } }, "@storybook/addon-measure": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.19.tgz", - "integrity": "sha512-PXeU0AlpnGEvnzBQ6snkzmlIpwE0ci8LdFtL1Vz1V1Xk5fbuETWYuEkPuk1oZ7L9igB9cfT32SyJlE5MC1iaGg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.22.tgz", + "integrity": "sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "global": "^4.4.0" } }, "@storybook/addon-outline": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.19.tgz", - "integrity": "sha512-7ZDXo8qrms6dx0KRP9PInXIie82h5g9XCNrGOUdfZkQPvgofJVj0kNv6p+WOiGiaVfKPC5KMgIofqzBTFV+k6Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.22.tgz", + "integrity": "sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -45317,31 +45312,31 @@ } }, "@storybook/addon-toolbars": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.19.tgz", - "integrity": "sha512-2UtuX9yB1rD/CAZv1etnOnunfPTvsEKEg/J2HYMKE1lhenWC5muIUXvDXCXvwDC65WviPJ56nFNKaKK1Zz7JDg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.22.tgz", + "integrity": "sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" } }, "@storybook/addon-viewport": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.19.tgz", - "integrity": "sha512-T1hdImxbLj8suQSTbp6HSA1LLHOlqaNK5jjnqzEOoAxY0O8LNPXMJ2jKIeT2fPQ0v+tWGU3tbwf+3xFq0parVQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.22.tgz", + "integrity": "sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", @@ -45350,18 +45345,18 @@ } }, "@storybook/addons": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.19.tgz", - "integrity": "sha512-QNyRYhpqmHV8oJxxTBdkRlLSbDFhpBvfvMfIrIT1UXb/eemdBZTaCGVvXZ9UixoEEI7f8VwAQ44IvkU5B1509w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.22.tgz", + "integrity": "sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==", "dev": true, "requires": { - "@storybook/api": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/api": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/router": "6.4.22", + "@storybook/theming": "6.4.22", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -45369,18 +45364,18 @@ } }, "@storybook/api": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.19.tgz", - "integrity": "sha512-aDvea+NpQCBjpNp9YidO1Pr7fzzCp15FSdkG+2ihGQfv5raxrN+IIJnGUXecpe71nvlYiB+29UXBVK7AL0j51Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.22.tgz", + "integrity": "sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==", "dev": true, "requires": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -45394,9 +45389,9 @@ } }, "@storybook/builder-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.19.tgz", - "integrity": "sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.22.tgz", + "integrity": "sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -45420,22 +45415,22 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "autoprefixer": "^9.8.6", @@ -45493,9 +45488,9 @@ "dev": true }, "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "@webassemblyjs/ast": { @@ -46030,13 +46025,19 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-limit": { @@ -46499,9 +46500,9 @@ } }, "@storybook/builder-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.19.tgz", - "integrity": "sha512-AWM4YMN1gPaf7jfntqZTCGpIQ1tF6YRU1JtczPG4ox28rTaO6NMfOBi9aRhBre/59pPOh9bF6u2gu/MIHmRW+w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.22.tgz", + "integrity": "sha512-vvQ0HgkIIVz+cmaCXIRor0UFZbGZqh4aV0ISSof60BjdW5ld+R+XCr/bdTU6Zg8b2fL9CXh7/LE6fImnIMpRIA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -46524,21 +46525,21 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/preview-web": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/store": "6.4.22", + "@storybook/theming": "6.4.22", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.1", @@ -46588,9 +46589,9 @@ } }, "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "babel-plugin-macros": { @@ -46654,9 +46655,9 @@ "requires": {} }, "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, "requires": { "nanoid": "^3.3.1", @@ -46735,14 +46736,14 @@ } }, "@storybook/channel-postmessage": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.19.tgz", - "integrity": "sha512-E5h/itFzQ/6M08LR4kqlgqqmeO3tmavI+nUAlZrkCrotpJFNMHE2i0PQHg0TkFJrRDpYcrwD+AjUW4IwdqrisQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.22.tgz", + "integrity": "sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==", "dev": true, "requires": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "qs": "^6.10.0", @@ -46750,22 +46751,22 @@ } }, "@storybook/channel-websocket": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.19.tgz", - "integrity": "sha512-cXKwQjIXttfdUyZlcHORelUmJ5nUKswsnCA/qy7IRWpZjD8yQJcNk1dYC+tTHDVqFgdRT89pL0hRRB1rlaaR8Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.22.tgz", + "integrity": "sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==", "dev": true, "requires": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "global": "^4.4.0", "telejson": "^5.3.2" } }, "@storybook/channels": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.19.tgz", - "integrity": "sha512-EwyoncFvTfmIlfsy8jTfayCxo2XchPkZk/9txipugWSmc057HdklMKPLOHWP0z5hLH0IbVIKXzdNISABm36jwQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.22.tgz", + "integrity": "sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==", "dev": true, "requires": { "core-js": "^3.8.2", @@ -46774,18 +46775,18 @@ } }, "@storybook/client-api": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.19.tgz", - "integrity": "sha512-OCrT5Um3FDvZnimQKwWtwsaI+5agPwq2i8YiqlofrI/NPMKp0I7DEkCGwE5IRD1Q8BIKqHcMo5tTmfYi0AxyOg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.22.tgz", + "integrity": "sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/qs": "^6.9.5", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -46802,9 +46803,9 @@ } }, "@storybook/client-logger": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.19.tgz", - "integrity": "sha512-zmg/2wyc9W3uZrvxaW4BfHcr40J0v7AGslqYXk9H+ERLVwIvrR4NhxQFaS6uITjBENyRDxwzfU3Va634WcmdDQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.22.tgz", + "integrity": "sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==", "dev": true, "requires": { "core-js": "^3.8.2", @@ -46812,15 +46813,15 @@ } }, "@storybook/components": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.19.tgz", - "integrity": "sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.22.tgz", + "integrity": "sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==", "dev": true, "requires": { "@popperjs/core": "^2.6.0", - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "@types/color-convert": "^2.0.0", "@types/overlayscrollbars": "^1.12.0", "@types/react-syntax-highlighter": "11.0.5", @@ -46861,31 +46862,31 @@ } }, "@storybook/core": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.19.tgz", - "integrity": "sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.22.tgz", + "integrity": "sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==", "dev": true, "requires": { - "@storybook/core-client": "6.4.19", - "@storybook/core-server": "6.4.19" + "@storybook/core-client": "6.4.22", + "@storybook/core-server": "6.4.22" } }, "@storybook/core-client": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.19.tgz", - "integrity": "sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.22.tgz", + "integrity": "sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channel-websocket": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/channel-websocket": "6.4.22", + "@storybook/client-api": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/preview-web": "6.4.22", + "@storybook/store": "6.4.22", + "@storybook/ui": "6.4.22", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", @@ -46899,9 +46900,9 @@ } }, "@storybook/core-common": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.19.tgz", - "integrity": "sha512-X1pJJkO48DFxl6iyEemIKqRkJ7j9/cBh3BRBUr+xZHXBvnD0GKDXIocwh0PjSxSC6XSu3UCQnqtKi3PbjRl8Dg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.22.tgz", + "integrity": "sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -46925,7 +46926,7 @@ "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.4.19", + "@storybook/node-logger": "6.4.22", "@storybook/semver": "^7.3.2", "@types/node": "^14.0.10", "@types/pretty-hrtime": "^1.0.0", @@ -46972,9 +46973,9 @@ } }, "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "@webassemblyjs/ast": { @@ -47446,13 +47447,19 @@ "to-regex": "^3.0.2" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-limit": { @@ -47682,31 +47689,31 @@ } }, "@storybook/core-events": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.19.tgz", - "integrity": "sha512-KICzUw6XVQUJzFSCXfvhfHAuyhn4Q5J4IZEfuZkcGJS4ODkrO6tmpdYE5Cfr+so95Nfp0ErWiLUuodBsW9/rtA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.22.tgz", + "integrity": "sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==", "dev": true, "requires": { "core-js": "^3.8.2" } }, "@storybook/core-server": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.19.tgz", - "integrity": "sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.22.tgz", + "integrity": "sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/builder-webpack4": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/manager-webpack4": "6.4.19", - "@storybook/node-logger": "6.4.19", + "@storybook/csf-tools": "6.4.22", + "@storybook/manager-webpack4": "6.4.22", + "@storybook/node-logger": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/node": "^14.0.10", "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", @@ -47741,9 +47748,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "@webassemblyjs/ast": { @@ -48159,13 +48166,19 @@ "to-regex": "^3.0.2" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "readable-stream": { @@ -48370,9 +48383,9 @@ } }, "@storybook/csf-tools": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.19.tgz", - "integrity": "sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.22.tgz", + "integrity": "sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -48431,20 +48444,20 @@ } }, "@storybook/manager-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.19.tgz", - "integrity": "sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.22.tgz", + "integrity": "sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "babel-loader": "^8.0.0", @@ -48481,9 +48494,9 @@ "dev": true }, "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "@webassemblyjs/ast": { @@ -49042,13 +49055,19 @@ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "normalize-package-data": { @@ -49595,20 +49614,20 @@ } }, "@storybook/manager-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.19.tgz", - "integrity": "sha512-hVjWhWAOgWaymBy0HeRskN+MfKLpqLP4Txfw+3Xqg1qplgexV0w2O4BQrS/SNEH4V/1qF9h8XTsk3L3oQIj3Mg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.22.tgz", + "integrity": "sha512-BMkOMselT4jOn7EQGt748FurM5ewtDfZtOQPCVK8MZX+HYE2AgjNOzm562TYODIxk12Fkhgj3EIz7GGMe1U3RA==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core-client": "6.4.22", + "@storybook/core-common": "6.4.22", + "@storybook/node-logger": "6.4.22", + "@storybook/theming": "6.4.22", + "@storybook/ui": "6.4.22", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", @@ -49636,9 +49655,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "ansi-styles": { @@ -49792,9 +49811,9 @@ } }, "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, "requires": { "nanoid": "^3.3.1", @@ -49964,9 +49983,9 @@ } }, "@storybook/node-logger": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.19.tgz", - "integrity": "sha512-hO2Aar3PgPnPtNq2fVgiuGlqo3EEVR6TKVBXMq7foL3tN2k4BQFKLDHbm5qZQQntyYKurKsRUGKPJFPuI1ov/w==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.22.tgz", + "integrity": "sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==", "dev": true, "requires": { "@types/npmlog": "^4.1.2", @@ -50084,26 +50103,26 @@ } }, "@storybook/postinstall": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.19.tgz", - "integrity": "sha512-/0tHHxyIV82zt1rw4BW70GmrQbDVu9IJPAxOqFzGjC1fNojwJ53mK6FfUsOzbhG5mWk5p0Ip5+zr74moP119AA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.22.tgz", + "integrity": "sha512-LdIvA+l70Mp5FSkawOC16uKocefc+MZLYRHqjTjgr7anubdi6y7W4n9A7/Yw4IstZHoknfL88qDj/uK5N+Ahzw==", "dev": true, "requires": { "core-js": "^3.8.2" } }, "@storybook/preact": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/preact/-/preact-6.4.19.tgz", - "integrity": "sha512-A9+X5AMLRE4hstzbOj/NUoybMVyRzxMzXTb/hPUoLtj+nKNIXhDu++7QRQcx+fmbuDyRJgnLKGuFzKpvGBRavA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/preact/-/preact-6.4.22.tgz", + "integrity": "sha512-F13t8zBYQvgFBxaKJ1/iazeGtT6lqEBYo2jFPWQ5k5XheGyO/KEtqb/4+WTmWZBmj9JK2Z1ZhfjsP5RfMJdw3Q==", "dev": true, "requires": { "@babel/plugin-transform-react-jsx": "^7.12.12", - "@storybook/addons": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-common": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/core": "6.4.22", + "@storybook/core-common": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", "global": "^4.4.0", @@ -50189,17 +50208,17 @@ } }, "@storybook/preview-web": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.19.tgz", - "integrity": "sha512-jqltoBv5j7lvnxEfV9w8dLX9ASWGuvgz97yg8Yo5FqkftEwrHJenyvMGcTgDJKJPorF+wiz/9aIqnmd3LCAcZQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.22.tgz", + "integrity": "sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/channel-postmessage": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.22", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", "global": "^4.4.0", @@ -50213,12 +50232,12 @@ } }, "@storybook/router": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.19.tgz", - "integrity": "sha512-KWWwIzuyeEIWVezkCihwY2A76Il9tUNg0I410g9qT7NrEsKyqXGRYOijWub7c1GGyNjLqz0jtrrehtixMcJkuA==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.22.tgz", + "integrity": "sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==", "dev": true, "requires": { - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -50242,13 +50261,13 @@ } }, "@storybook/source-loader": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.19.tgz", - "integrity": "sha512-XqTsqddRglvfW7mhyjwoqd/B8L6samcBehhO0OEbsFp6FPWa9eXuObCxtRYIcjcSIe+ksbW3D/54ppEs1L/g1Q==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.22.tgz", + "integrity": "sha512-O4RxqPgRyOgAhssS6q1Rtc8LiOvPBpC1EqhCYWRV3K+D2EjFarfQMpjgPj18hC+QzpUSfzoBZYqsMECewEuLNw==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "estraverse": "^5.2.0", @@ -50268,14 +50287,14 @@ } }, "@storybook/store": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.19.tgz", - "integrity": "sha512-N9/ZjemRHGfT3InPIbqQqc6snkcfnf3Qh9oOr0smbfaVGJol//KOX65kzzobtzFcid0WxtTDZ3HmgFVH+GvuhQ==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.22.tgz", + "integrity": "sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/core-events": "6.4.22", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -50291,15 +50310,15 @@ } }, "@storybook/theming": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.19.tgz", - "integrity": "sha512-V4pWmTvAxmbHR6B3jA4hPkaxZPyExHvCToy7b76DpUTpuHihijNDMAn85KhOQYIeL9q14zP/aiz899tOHsOidg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.22.tgz", + "integrity": "sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==", "dev": true, "requires": { "@emotion/core": "^10.1.1", "@emotion/is-prop-valid": "^0.8.6", "@emotion/styled": "^10.0.27", - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.22", "core-js": "^3.8.2", "deep-object-diff": "^1.1.0", "emotion-theming": "^10.0.27", @@ -50311,21 +50330,21 @@ } }, "@storybook/ui": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.19.tgz", - "integrity": "sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg==", + "version": "6.4.22", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.22.tgz", + "integrity": "sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==", "dev": true, "requires": { "@emotion/core": "^10.1.1", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.22", + "@storybook/api": "6.4.22", + "@storybook/channels": "6.4.22", + "@storybook/client-logger": "6.4.22", + "@storybook/components": "6.4.22", + "@storybook/core-events": "6.4.22", + "@storybook/router": "6.4.22", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.22", "copy-to-clipboard": "^3.3.1", "core-js": "^3.8.2", "core-js-pure": "^3.8.2", @@ -50356,9 +50375,9 @@ } }, "@testing-library/dom": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.3.tgz", - "integrity": "sha512-9LId28I+lx70wUiZjLvi1DB/WT2zGOxUh46glrSNMaWVx849kKAluezVzZrXJfTKKoQTmEOutLes/bHg4Bj3aA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", + "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", "dev": true, "peer": true, "requires": { @@ -50430,9 +50449,9 @@ } }, "@testing-library/jest-dom": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz", - "integrity": "sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", + "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", "dev": true, "requires": { "@babel/runtime": "^7.9.2", @@ -50667,9 +50686,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -50699,9 +50718,9 @@ } }, "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", + "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -50904,9 +50923,9 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/mdast": { @@ -50937,9 +50956,9 @@ "dev": true }, "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", + "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", "dev": true }, "@types/node-fetch": { @@ -50995,9 +51014,9 @@ "dev": true }, "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", + "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", "dev": true }, "@types/pretty-hrtime": { @@ -51007,9 +51026,9 @@ "dev": true }, "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", "dev": true }, "@types/qs": { @@ -51025,9 +51044,9 @@ "dev": true }, "@types/react": { - "version": "17.0.40", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz", - "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==", + "version": "17.0.44", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", + "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", "dev": true, "requires": { "@types/prop-types": "*", @@ -51130,15 +51149,15 @@ } }, "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz", + "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -51165,9 +51184,9 @@ } }, "@types/webpack-env": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.3.tgz", - "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==", + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.4.tgz", + "integrity": "sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==", "dev": true }, "@types/webpack-sources": { @@ -51190,9 +51209,9 @@ } }, "@types/ws": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.2.tgz", - "integrity": "sha512-VXI82ykONr5tacHEojnErTQk+KQSoYbW1NB6iz6wUwrNd+BqfkfggQNoNdCqhJSzbNumShPERbM+Pc5zpfhlbw==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "requires": { "@types/node": "*" @@ -51214,9 +51233,9 @@ "dev": true }, "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "requires": { @@ -51224,14 +51243,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz", + "integrity": "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/type-utils": "5.20.0", + "@typescript-eslint/utils": "5.20.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -51241,52 +51260,52 @@ } }, "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz", + "integrity": "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", + "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0" } }, "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz", + "integrity": "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.14.0", + "@typescript-eslint/utils": "5.20.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", + "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", + "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -51295,26 +51314,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", + "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", + "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.14.0", + "@typescript-eslint/types": "5.20.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -51618,9 +51637,9 @@ "dev": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "abbrev": { @@ -51779,9 +51798,9 @@ }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -52025,25 +52044,27 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.map": { @@ -52146,9 +52167,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -52294,13 +52315,13 @@ } }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -52315,26 +52336,6 @@ "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } } } }, @@ -52748,18 +52749,16 @@ } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" }, "dependencies": { "array-flatten": { @@ -52979,12 +52978,12 @@ } }, "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" @@ -53031,12 +53030,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -53223,9 +53216,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001314", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz", - "integrity": "sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==" + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" }, "capture-exit": { "version": "2.0.0", @@ -53359,13 +53352,19 @@ "rimraf": "^3.0.2" }, "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -53484,9 +53483,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -53514,12 +53513,12 @@ } }, "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", "dev": true, "requires": { - "colors": "1.4.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" }, "dependencies": { @@ -53733,13 +53732,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, "columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -54245,13 +54237,19 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "rimraf": { @@ -54281,18 +54279,18 @@ } }, "core-js": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", - "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz", + "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==", "dev": true }, "core-js-compat": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", - "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.0.tgz", + "integrity": "sha512-WwA7xbfRGrk8BGaaHlakauVXrlYmAIkk8PNGb1FDQS+Rbrewc3pgFfwJFRw6psmJVAll7Px9UHRYE16oRQnwAQ==", "dev": true, "requires": { - "browserslist": "^4.19.1", + "browserslist": "^4.20.2", "semver": "7.0.0" }, "dependencies": { @@ -54305,9 +54303,9 @@ } }, "core-js-pure": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", - "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.0.tgz", + "integrity": "sha512-ylOC9nVy0ak1N+fPIZj00umoZHgUVqmucklP5RT5N+vJof38klKn8Ze6KGyvchdClvEBr6LcQqJpI216LUMqYA==", "dev": true }, "core-util-is": { @@ -54336,14 +54334,14 @@ } }, "cosmiconfig-typescript-loader": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.6.tgz", - "integrity": "sha512-2nEotziYJWtNtoTjKbchj9QrdTT6DBxCvqjNKoDKARw+e2yZmTQCa07uRrykLIZuvSgp69YXLH89UHc0WhdMfQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", + "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", "dev": true, "optional": true, "requires": { "cosmiconfig": "^7", - "ts-node": "^10.6.0" + "ts-node": "^10.7.0" } }, "cp-file": { @@ -54746,9 +54744,9 @@ "requires": {} }, "postcss": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", - "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, "requires": { "nanoid": "^3.3.1", @@ -54795,22 +54793,22 @@ } }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "css.escape": { @@ -54910,9 +54908,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.13.tgz", + "integrity": "sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==", "dev": true }, "ansi-styles": { @@ -55212,15 +55210,15 @@ "dev": true }, "dayjs": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz", - "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", + "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -55282,20 +55280,6 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -55350,12 +55334,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "define-property": { @@ -55368,22 +55353,6 @@ "isobject": "^3.0.1" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -55485,9 +55454,9 @@ } }, "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", @@ -55542,22 +55511,12 @@ "dev": true }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { @@ -55585,9 +55544,9 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -55616,9 +55575,9 @@ "dev": true }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domexception": { @@ -55631,9 +55590,9 @@ } }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -55829,9 +55788,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.81", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.81.tgz", - "integrity": "sha512-Gs7xVpIZ7tYYSDA+WgpzwpPvfGwUk3KSIjJ0akuj5XQHFdyQnsUoM76EA4CIHXNLPiVwTwOFay9RMb0ChG3OBw==" + "version": "1.4.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.113.tgz", + "integrity": "sha512-s30WKxp27F3bBH6fA07FYL2Xm/FYnYrKpMjHr3XVCTUb9anAyZn/BeZfPWgTZGAbJeT4NxNwISSbLcYZvggPMA==" }, "element-resize-detector": { "version": "1.2.4", @@ -55932,9 +55891,9 @@ } }, "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -56000,9 +55959,9 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -56011,15 +55970,15 @@ "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -56063,6 +56022,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -56163,12 +56131,12 @@ } }, "eslint": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", - "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", + "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.0", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -56286,9 +56254,9 @@ "requires": {} }, "eslint-plugin-react": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.3.tgz", - "integrity": "sha512-MzW6TuCnDOcta67CkpDyRfRsEVx9FNMDV8wZsDqe1luHPdGTrQIUaUXD27Ja3gHsdOIs/cXzNchWGlqm+qRVRg==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz", + "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -57221,9 +57189,9 @@ "dev": true }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz", + "integrity": "sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", @@ -57918,9 +57886,9 @@ } }, "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -57980,9 +57948,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "gzip-size": { @@ -58074,6 +58042,15 @@ } } }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -58382,9 +58359,9 @@ } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-escaper": { @@ -58409,9 +58386,9 @@ } }, "html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, "html-void-elements": { @@ -58513,9 +58490,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -58623,9 +58600,9 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", @@ -58839,9 +58816,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -59192,9 +59169,9 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -59212,12 +59189,6 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -59258,10 +59229,13 @@ "dev": true }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-ssh": { "version": "1.3.3", @@ -61068,12 +61042,9 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonc-parser": { "version": "3.0.0", @@ -61119,12 +61090,12 @@ } }, "jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz", + "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==", "dev": true, "requires": { - "array-includes": "^3.1.3", + "array-includes": "^3.1.4", "object.assign": "^4.1.2" } }, @@ -61308,14 +61279,14 @@ } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" } } } @@ -61389,14 +61360,14 @@ } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" } } } @@ -61693,9 +61664,9 @@ } }, "lighthouse-stack-packs": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.7.0.tgz", - "integrity": "sha512-ggLg9V6Hs31Qcn29L2fwKsaQq8L5t+mIv3lNqwd85bc7zFxpMVybK71b4w2OeBLpa0H8gATIi9fxPlP+9moMDA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.8.1.tgz", + "integrity": "sha512-LSCu9Ugt9NPvRfBNzAjMDLvYev9r/93OTmbIWt9iXwiCmd999I/zneRTwsFLtlQWGKwNbDHS9vXnU+KpXUb1qg==", "dev": true }, "lilconfig": { @@ -61710,9 +61681,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "lint-staged": { - "version": "12.3.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.5.tgz", - "integrity": "sha512-oOH36RUs1It7b9U/C7Nl/a0sLfoIBcMB8ramiB3nuJ6brBqzsWiUAFSR5DQ3yyP/OR7XKMpijtgKl2DV1lQ3lA==", + "version": "12.3.8", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.8.tgz", + "integrity": "sha512-0+UpNaqIwKRSGAFOCcpuYNIv/j5QGVC+xUVvmSdxHO+IfIGoHbFLo3XcPmV/LLnsVj5EAncNHVtlITSoY5qWGQ==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -61725,15 +61696,16 @@ "micromatch": "^4.0.4", "normalize-path": "^3.0.0", "object-inspect": "^1.12.0", + "pidtree": "^0.5.0", "string-argv": "^0.3.1", "supports-color": "^9.2.1", "yaml": "^1.10.2" }, "dependencies": { "supports-color": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz", - "integrity": "sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", + "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", "dev": true } } @@ -61854,9 +61826,9 @@ } }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { @@ -62346,9 +62318,9 @@ "requires": {} }, "marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true }, "marky": { @@ -62647,13 +62619,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "miller-rabin": { @@ -62681,18 +62653,18 @@ "dev": true }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -62746,7 +62718,8 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minimist-options": { "version": "4.1.0", @@ -62930,9 +62903,9 @@ } }, "mobx": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.4.2.tgz", - "integrity": "sha512-b4xQJYiH8sb0sEbfq/Ws3N77DEJtSihUFD1moeiz2jNoJ5B+mqJutt54ouO9iEfkp7Wk4jQDsVUOh7DPEW3wEw==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.5.0.tgz", + "integrity": "sha512-pHZ/cySF00FVENDWIDzJyoObFahK6Eg4d0papqm6d7yMkxWTZ/S/csqJX1A3PsYy4t5k3z2QnlwuCfMW5lSEwA==" }, "mobx-react": { "version": "7.3.0", @@ -62974,13 +62947,19 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "rimraf": { @@ -63006,21 +62985,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "dev": true, "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, "multimatch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", @@ -63056,9 +63029,9 @@ "optional": true }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "nanomatch": { @@ -63099,9 +63072,9 @@ "dev": true }, "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, "nice-try": { @@ -63162,9 +63135,9 @@ } }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, "node-gyp": { @@ -63201,6 +63174,12 @@ "minipass": "^2.6.0" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -63221,12 +63200,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "rimraf": { @@ -63358,9 +63337,9 @@ } }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" }, "nopt": { "version": "4.0.3", @@ -63665,16 +63644,6 @@ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -64135,14 +64104,14 @@ } }, "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "requires": { "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" + "debug": "^4.3.3", + "socks": "^2.6.2" } } } @@ -64414,6 +64383,12 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pidtree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", + "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", + "dev": true + }, "pify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", @@ -64445,12 +64420,12 @@ } }, "polished": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz", - "integrity": "sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", "dev": true, "requires": { - "@babel/runtime": "^7.16.7" + "@babel/runtime": "^7.17.8" } }, "portfinder": { @@ -64473,13 +64448,19 @@ "ms": "^2.1.1" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -64585,9 +64566,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", - "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -64601,9 +64582,9 @@ "dev": true }, "preact": { - "version": "10.6.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.6.6.tgz", - "integrity": "sha512-dgxpTFV2vs4vizwKohYKkk7g7rmp1wOOcfd4Tz3IB3Wi+ivZzsn/SpeKJhRENSE+n8sUfsAl4S3HiCVT923ABw==" + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.1.tgz", + "integrity": "sha512-MufnRFz39aIhs9AMFisonjzTud1PK1bY+jcJLo6m2T9Uh8AqjD77w11eAAawmjUogoGOnipECq7e/1RClIKsxg==" }, "prelude-ls": { "version": "1.2.1", @@ -64618,9 +64599,9 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true }, "pretty-bytes": { @@ -64665,9 +64646,9 @@ "dev": true }, "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", "dev": true }, "process": { @@ -65119,9 +65100,9 @@ "dev": true }, "react-helmet-async": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.2.3.tgz", - "integrity": "sha512-mCk2silF53Tq/YaYdkl2sB+/tDoPnaxN7dFS/6ZLJb/rhUY2EWGI5Xj2b4jHppScMqY45MbgPSwTxDchKpZ5Kw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -65176,9 +65157,9 @@ "requires": {} }, "react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", "dev": true, "requires": { "history": "^5.2.0" @@ -65196,13 +65177,13 @@ } }, "react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", "dev": true, "requires": { "history": "^5.2.0", - "react-router": "6.2.2" + "react-router": "6.3.0" }, "dependencies": { "history": { @@ -65574,6 +65555,14 @@ "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "dev": true + } } }, "regenerate": { @@ -65597,9 +65586,9 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -65616,13 +65605,14 @@ } }, "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -66412,9 +66402,9 @@ } }, "sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", + "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -66480,18 +66470,18 @@ "dev": true }, "selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^1.2.0" + "node-forge": "^1" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -67454,9 +67444,9 @@ "dev": true }, "store2": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.1.tgz", - "integrity": "sha512-iJtHSGmNgAUx0b/MCS6ASGxb//hGrHHRgzvN+K5bvkBTN7A9RTpPSf1WSp+nPGvWCJ1jRnvY7MKnuqfoi3OEqg==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.13.2.tgz", + "integrity": "sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==", "dev": true }, "stream-browserify": { @@ -67600,9 +67590,9 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "is-fullwidth-code-point": { @@ -67623,18 +67613,18 @@ } }, "string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" } }, @@ -67930,9 +67920,9 @@ } }, "terser": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", - "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { "acorn": "^8.5.0", @@ -68212,9 +68202,9 @@ "dev": true }, "ts-jest": { - "version": "27.1.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.3.tgz", - "integrity": "sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==", + "version": "27.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", + "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", "dev": true, "requires": { "bs-logger": "0.x", @@ -68410,9 +68400,9 @@ } }, "typedoc": { - "version": "0.22.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.13.tgz", - "integrity": "sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ==", + "version": "0.22.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz", + "integrity": "sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==", "dev": true, "requires": { "glob": "^7.2.0", @@ -68470,15 +68460,15 @@ } }, "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", "dev": true, "optional": true }, @@ -68803,9 +68793,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "boxen": { @@ -69046,9 +69036,9 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "string-width": { @@ -69183,9 +69173,9 @@ "requires": {} }, "use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", "dev": true, "requires": {} }, @@ -69271,9 +69261,9 @@ "dev": true }, "v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "optional": true }, @@ -69733,9 +69723,9 @@ "dev": true }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -69932,9 +69922,9 @@ } }, "webpack-dev-server": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", - "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz", + "integrity": "sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -69942,37 +69932,36 @@ "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.2.2", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", + "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "default-gateway": "^6.0.3", - "del": "^6.0.0", - "express": "^4.17.1", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", + "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" }, "dependencies": { "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -69990,12 +69979,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -70031,15 +70014,6 @@ "ajv-keywords": "^5.0.0" } }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, "webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", diff --git a/packages/snap-preact-components/package.json b/packages/snap-preact-components/package.json index 454cf3d98..b8b3ac573 100644 --- a/packages/snap-preact-components/package.json +++ b/packages/snap-preact-components/package.json @@ -26,8 +26,15 @@ }, "dependencies": { "@emotion/react": "^11.7.1", - "@searchspring/snap-preact": "^0.23.1", + "@searchspring/snap-client": "^0.23.1", + "@searchspring/snap-controller": "^0.23.1", + "@searchspring/snap-event-manager": "^0.23.1", + "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-profiler": "^0.23.1", + "@searchspring/snap-store-mobx": "^0.23.1", "@searchspring/snap-toolbox": "^0.23.1", + "@searchspring/snap-tracker": "^0.23.1", + "@searchspring/snap-url-manager": "^0.23.1", "classnames": "^2.3.1", "deepmerge": "^4.2.2", "mobx-react-lite": "^3.2.3", diff --git a/packages/snap-preact-components/src/components/Atoms/Icon/Icon.tsx b/packages/snap-preact-components/src/components/Atoms/Icon/Icon.tsx index 8b40e0f8a..996e2423d 100644 --- a/packages/snap-preact-components/src/components/Atoms/Icon/Icon.tsx +++ b/packages/snap-preact-components/src/components/Atoms/Icon/Icon.tsx @@ -14,6 +14,7 @@ const CSS = { fill: color || theme.colors?.primary, width: width || size, height: height || size, + position: 'relative', }), }; diff --git a/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx b/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx index 7462a3964..067e4363f 100644 --- a/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx +++ b/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx @@ -2,12 +2,13 @@ import { h, Fragment } from 'preact'; import { useState, useRef } from 'preact/hooks'; -import { jsx, css } from '@emotion/react'; +import { jsx, css, Global } from '@emotion/react'; import classnames from 'classnames'; import { observer } from 'mobx-react-lite'; import deepmerge from 'deepmerge'; import SwiperCore, { Pagination, Navigation } from 'swiper/core'; -import 'swiper/swiper.min.css'; + +import { styles } from './styles'; import { Icon, IconProps } from '../../Atoms/Icon/Icon'; import { Swiper, SwiperSlide } from 'swiper/react'; @@ -228,6 +229,7 @@ export const Carousel = observer((properties: CarouselProps): JSX.Element => { {...styling} className={classnames('ss__carousel', vertical ? 'ss__carousel-vertical' : '', className)} > +
.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-container-multirow>.swiper-wrapper{flex-wrap:wrap}.swiper-container-multirow-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-container-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-container-pointer-events{touch-action:pan-y}.swiper-container-pointer-events.swiper-container-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-container-3d{perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-container-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-container-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-container-horizontal.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-container-vertical.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}`; diff --git a/packages/snap-preact/jest.config.js b/packages/snap-preact/jest.config.js index ca224b4d4..8559ec0ed 100644 --- a/packages/snap-preact/jest.config.js +++ b/packages/snap-preact/jest.config.js @@ -2,4 +2,10 @@ const rootConfig = require('../../jest.base.config.json'); module.exports = { ...rootConfig, displayName: 'snap-preact', + moduleNameMapper: { + '^react$': 'preact/compat', + '^react-dom/test-utils$': 'preact/test-utils', + '^react-dom$': 'preact/compat', + '\\.(css|less|sass|scss)$': '/__mocks__/styleMock.js', + }, }; diff --git a/packages/snap-preact/package.json b/packages/snap-preact/package.json index 160f83f6f..ab4db759a 100644 --- a/packages/snap-preact/package.json +++ b/packages/snap-preact/package.json @@ -24,6 +24,7 @@ "@searchspring/snap-controller": "^0.23.1", "@searchspring/snap-event-manager": "^0.23.1", "@searchspring/snap-logger": "^0.23.1", + "@searchspring/snap-preact-components": "^0.23.1", "@searchspring/snap-profiler": "^0.23.1", "@searchspring/snap-store-mobx": "^0.23.1", "@searchspring/snap-toolbox": "^0.23.1", From fb520c425933f4a5b09ed2e71bc04422d099e961 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 20:41:40 -0600 Subject: [PATCH 12/27] refactor(snap-preact): move XHR bundle request into a utility function instead of in the component --- .../getBundleDetails/getBundleDetails.test.ts | 66 +++++++++++++++++++ .../src/getBundleDetails/getBundleDetails.ts | 29 ++++++++ 2 files changed, 95 insertions(+) create mode 100644 packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts create mode 100644 packages/snap-preact/src/getBundleDetails/getBundleDetails.ts diff --git a/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts b/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts new file mode 100644 index 000000000..561bfe1b3 --- /dev/null +++ b/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts @@ -0,0 +1,66 @@ +import { getBundleDetails } from './getBundleDetails'; + +const xhrMock: Partial = { + DONE: 4, + open: jest.fn(), + send: jest.fn(), + setRequestHeader: jest.fn(), + status: 200, + readyState: 4, +}; + +jest.spyOn(window, 'XMLHttpRequest').mockImplementation(() => xhrMock as XMLHttpRequest); + +describe('getBundleDetails function', () => { + beforeAll(() => { + const modifiedDate = '07 Jan 2022 22:42:39 GMT'; + xhrMock.getResponseHeader = jest.fn(() => { + // return "Last-Modified" date + return `Fri, ${modifiedDate}`; + }); + + delete window.location; + + // @ts-ignore + window.location = { + href: 'https://www.merch.com?branch=branch', + }; + }); + + afterAll(() => jest.clearAllMocks); + + it('fetches bundle details from requested bundle URL', () => { + const url = 'https://snapui.searchspring.io/siteId/next/bundle.js'; + // @ts-ignore + xhrMock.status = 200; + + jest.spyOn(window, 'XMLHttpRequest').mockImplementation(() => xhrMock as XMLHttpRequest); + + const fetchPromise = getBundleDetails(url).then((details) => { + expect(details.lastModified).toBe('07 Jan 2022 22:42:39 GMT'); + expect(details.url).toBe(url); + }); + + expect(xhrMock.open).toBeCalledWith('HEAD', url, true); + (xhrMock.onreadystatechange as EventListener)(new Event('')); + + return fetchPromise; + }); + + it('rejects when bundle is not found', async () => { + const url = 'https://snapui.searchspring.io/siteId/dne/bundle.js'; + // @ts-ignore + xhrMock.status = 403; + + const fetchPromise = getBundleDetails(url); + + expect(xhrMock.open).toBeCalledWith('HEAD', url, true); + (xhrMock.onreadystatechange as EventListener)(new Event('')); + + try { + await fetchPromise; + } catch (e) { + expect(e).toStrictEqual({ description: 'Incorrect branch name or branch no longer exists.', message: 'Branch not found!' }); + } + }); +}); diff --git a/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts b/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts new file mode 100644 index 000000000..7d3598014 --- /dev/null +++ b/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts @@ -0,0 +1,29 @@ +type BundleDetails = { + url: string; + lastModified: string; +}; + +export const getBundleDetails = async (url: string): Promise => { + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open('HEAD', url, true); + + request.onreadystatechange = () => { + if (request.readyState === request.DONE) { + const status = request.status; + if (status === 0 || (status >= 200 && status < 400)) { + resolve({ + url, + lastModified: request.getResponseHeader('Last-Modified').split(',')[1].trim(), + }); + } else { + reject({ message: 'Branch not found!', description: 'Incorrect branch name or branch no longer exists.' }); + } + } + }; + + request.onerror = () => reject(); + + request.send(); + }); +}; From 7491f2951da3b115168ffc21187edde751cfe3fe Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 20:44:00 -0600 Subject: [PATCH 13/27] refactor(snap-preact): utilize getBundleDetails utility function and refactor to use BundleOverride --- packages/snap-preact/src/Snap.tsx | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/snap-preact/src/Snap.tsx b/packages/snap-preact/src/Snap.tsx index 070c7dbb0..9be2fac5a 100644 --- a/packages/snap-preact/src/Snap.tsx +++ b/packages/snap-preact/src/Snap.tsx @@ -28,6 +28,7 @@ import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; import { default as createSearchController } from './create/createSearchController'; import { RecommendationInstantiator, RecommendationInstantiatorConfig } from './Instantiators/RecommendationInstantiator'; +import { getBundleDetails } from './getBundleDetails/getBundleDetails'; import type { SnapControllerServices, SnapControllerConfigs, RootComponent } from './types'; export const BRANCH_COOKIE = 'ssBranch'; @@ -269,11 +270,11 @@ export class Snap { this.logger.setMode(LogMode.DEVELOPMENT); this.logger.warn(`...loading build... '${branchParam}'`); - // append script with new branch in path + // append branch override script const script = document.createElement('script'); const src = `https://snapui.searchspring.io/${this.config.client.globals.siteId}/${branchParam}/bundle.js`; script.src = src; - script.setAttribute(BRANCH_COOKIE, ''); + script.setAttribute(BRANCH_COOKIE, branchParam); document.head.appendChild(script); new DomTargeter( @@ -284,15 +285,35 @@ export class Snap { action: 'append', // before, after, append, prepend element: () => { const branchContainer = document.createElement('div'); - branchContainer.className = 'ss__branch--target'; + branchContainer.id = 'searchspring-branch-override'; return branchContainer; }, }, }, ], async (target, elem) => { + let bundleDetails, error; + try { + bundleDetails = await getBundleDetails(src); + } catch (err) { + error = err; + } + const BranchOverride = (await import('./components/BranchOverride')).BranchOverride; - render(, elem); + render( + { + cookies.unset(BRANCH_COOKIE); + const urlState = url(window.location.href); + delete urlState.params.query['branch']; + window.location.href = urlState.url(); + }} + />, + elem + ); } ); From 725331ce2604e2b930b8aea94cd3b67b5fe63536 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 20:44:44 -0600 Subject: [PATCH 14/27] test(snap-preact): adding testing of Snap config API --- packages/snap-preact/src/Snap.test.tsx | 23 +++--- packages/snap-preact/src/integration.test.tsx | 77 +++++++++++++++++++ 2 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 packages/snap-preact/src/integration.test.tsx diff --git a/packages/snap-preact/src/Snap.test.tsx b/packages/snap-preact/src/Snap.test.tsx index f03da19dc..bca016bc9 100644 --- a/packages/snap-preact/src/Snap.test.tsx +++ b/packages/snap-preact/src/Snap.test.tsx @@ -1,3 +1,4 @@ +import 'whatwg-fetch'; import { MockClient } from '@searchspring/snap-shared'; import { Tracker } from '@searchspring/snap-tracker'; import { Logger } from '@searchspring/snap-logger'; @@ -35,7 +36,6 @@ const wait = (time = 1) => { describe('Snap Preact', () => { beforeEach(() => { delete window.searchspring; - cookies.unset(BRANCH_COOKIE); document.body.innerHTML = `
`; }); @@ -117,6 +117,8 @@ describe('Snap Preact', () => { const spy = jest.spyOn(logger, 'warn'); const snap = new Snap(baseConfig, { logger }); expect(spy).toHaveBeenCalledWith(`...loading build... '${branchParam}'`); + + cookies.unset(BRANCH_COOKIE); }); it('exposes itself globally on the window', () => { @@ -276,22 +278,22 @@ describe('Snap Preact', () => { const logger = new Logger(); const spy = jest.spyOn(logger, 'error'); + // valid config - no errors logged new Snap(searchConfig, { logger }); expect(spy).toHaveBeenCalledTimes(0); - // @ts-ignore - allowing for invalid component - searchConfig.controllers.search[0].targeters[0].component = Component; - new Snap(searchConfig, { logger }); - expect(spy).toHaveBeenCalledTimes(1); - + // invalid config - logs error due to missing selector delete searchConfig.controllers.search[0].targeters[0].selector; + delete window.searchspring.controller.search; new Snap(searchConfig, { logger }); - expect(spy).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenCalledTimes(1); + // invalid config - logs error due to missing component searchConfig.controllers.search[0].targeters[0].selector = '#searchspring-content'; delete searchConfig.controllers.search[0].targeters[0].component; + delete window.searchspring.controller.search; new Snap(searchConfig, { logger }); - expect(spy).toHaveBeenCalledTimes(3); + expect(spy).toHaveBeenCalledTimes(2); }); it(`runs the controller 'search' method when a targeter selector is found`, async () => { @@ -929,13 +931,16 @@ describe('Snap Preact', () => { ...baseConfig, instantiators: { recommendation: { - components: {}, + components: { + thing: () => Component, + }, config: { branch: 'production', }, }, }, }; + const snap = new Snap(instantiatorConfig); const instantiator = await snap.getInstantiator('recommendations'); diff --git a/packages/snap-preact/src/integration.test.tsx b/packages/snap-preact/src/integration.test.tsx new file mode 100644 index 000000000..b21600336 --- /dev/null +++ b/packages/snap-preact/src/integration.test.tsx @@ -0,0 +1,77 @@ +import { h } from 'preact'; + +import '@testing-library/jest-dom/extend-expect'; +import { waitFor } from '@testing-library/preact'; +import userEvent from '@testing-library/user-event'; + +import { Snap, BRANCH_COOKIE } from './Snap'; + +const baseConfig = { + client: { + globals: { + siteId: 'xxxxxx', + }, + }, +}; +const context = { + config: {}, + shopper: { + id: 'snapdev', + }, +}; + +const xhrMock: Partial = { + DONE: 4, + open: jest.fn(), + send: jest.fn(), + setRequestHeader: jest.fn(), + status: 200, + readyState: 4, +}; + +const modifiedDate = '07 Jan 2022 22:42:39 GMT'; + +jest.spyOn(window, 'XMLHttpRequest').mockImplementation(() => xhrMock as XMLHttpRequest); + +describe('Snap Preact Integration', () => { + beforeAll(() => { + xhrMock.getResponseHeader = jest.fn(() => { + // return "Last-Modified" date + return `Fri, ${modifiedDate}`; + }); + + delete window.location; + + // @ts-ignore + window.location = { + href: 'https://www.merch.com?branch=branch', + }; + }); + + beforeEach(() => { + const contextString = `config = ${JSON.stringify(context.config)}; shopper = ${JSON.stringify(context.shopper)};`; + document.body.innerHTML = ``; + }); + + afterAll(() => jest.clearAllMocks); + + it(`automatically grabs context from #searchspring-context using 'getContext'`, () => { + const snap = new Snap(baseConfig); + + expect(snap.context).toStrictEqual(context); + }); + + it(`takes the branch param from the URL and add a new script block`, async () => { + const url = 'https://snapui.searchspring.io/xxxxxx/branch/bundle.js'; + + // handle mock XHR of bundle file + expect(xhrMock.open).toBeCalledWith('HEAD', url, true); + + // wait for rendering of new script block + await waitFor(() => { + const overrideElement = document.querySelector(`script[${BRANCH_COOKIE}]`); + expect(overrideElement).toBeInTheDocument(); + expect(overrideElement).toHaveAttribute('src', url); + }); + }); +}); From dbf76f617b34abafbbf170385e423fadecb8e517 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 18 Apr 2022 21:24:19 -0600 Subject: [PATCH 15/27] refactor(branchoverride-component): changing '?' in component text to a period '.' --- .../src/components/Organisms/BranchOverride/BranchOverride.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx index 5e9086dfb..b0e6023b5 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx @@ -154,7 +154,7 @@ const lightTheme = { }, }, bottom: { - content: 'Preview functionality may differ from production?', + content: 'Preview functionality may differ from production.', branch: { color: '#3a23ad', style: 'italic', From e59fe40e52e0f70e15658606a308e4e44a2e8ecf Mon Sep 17 00:00:00 2001 From: Dennis Konieczek Date: Tue, 19 Apr 2022 17:58:51 -0400 Subject: [PATCH 16/27] refactor(urlmanager): enable strict mode, add typing, update tests --- .../src/Translators/Url/UrlTranslator.test.ts | 106 +++++++------- .../src/Translators/Url/UrlTranslator.ts | 132 +++++++++--------- .../src/UrlManager/UrlManager.ts | 6 +- .../snap-url-manager/src/integration.test.ts | 18 +-- packages/snap-url-manager/src/types.ts | 4 +- packages/snap-url-manager/tsconfig.json | 3 +- 6 files changed, 139 insertions(+), 130 deletions(-) diff --git a/packages/snap-url-manager/src/Translators/Url/UrlTranslator.test.ts b/packages/snap-url-manager/src/Translators/Url/UrlTranslator.test.ts index 37720db89..cff3a8673 100644 --- a/packages/snap-url-manager/src/Translators/Url/UrlTranslator.test.ts +++ b/packages/snap-url-manager/src/Translators/Url/UrlTranslator.test.ts @@ -1,4 +1,4 @@ -import { UrlTranslator } from './UrlTranslator'; +import { UrlTranslator, CoreMap } from './UrlTranslator'; import { UrlState, ParamLocationType } from '../../types'; describe('UrlTranslator', () => { @@ -68,7 +68,7 @@ describe('UrlTranslator', () => { const queryString = new customTranslator({ urlRoot: '/search#view:grid', - parameters: { core: { page: { type: 'hash' as ParamLocationType } } }, + parameters: { core: { page: { type: 'hash' } } }, }); const params = { @@ -127,19 +127,19 @@ describe('UrlTranslator', () => { expect(defaultConfig.settings).toEqual({ corePrefix: '', - customType: ParamLocationType.HASH, + customType: ParamLocationType.hash, rootParams: true, }); expect(defaultConfig.parameters.core).toEqual({ - query: { name: 'q', type: ParamLocationType.QUERY }, - oq: { name: 'oq', type: ParamLocationType.QUERY }, - rq: { name: 'rq', type: ParamLocationType.QUERY }, - tag: { name: 'tag', type: ParamLocationType.QUERY }, - page: { name: 'page', type: ParamLocationType.QUERY }, - pageSize: { name: 'pageSize', type: ParamLocationType.HASH }, - sort: { name: 'sort', type: ParamLocationType.HASH }, - filter: { name: 'filter', type: ParamLocationType.HASH }, + query: { name: 'q', type: ParamLocationType.query }, + oq: { name: 'oq', type: ParamLocationType.query }, + rq: { name: 'rq', type: ParamLocationType.query }, + tag: { name: 'tag', type: ParamLocationType.query }, + page: { name: 'page', type: ParamLocationType.query }, + pageSize: { name: 'pageSize', type: ParamLocationType.hash }, + sort: { name: 'sort', type: ParamLocationType.hash }, + filter: { name: 'filter', type: ParamLocationType.hash }, }); expect(defaultConfig.parameters.custom).toEqual({}); @@ -153,20 +153,20 @@ describe('UrlTranslator', () => { }); const config = queryString.getConfig(); - expect(config.settings.customType).toEqual(ParamLocationType.HASH); + expect(config.settings.customType).toEqual(ParamLocationType.hash); }); it('can set the type of all core params with one setting', () => { const queryString = new UrlTranslator({ settings: { - coreType: ParamLocationType.HASH, + coreType: ParamLocationType.hash, }, }); const config = queryString.getConfig(); Object.keys(config.parameters.core).forEach((coreKey) => { - const coreParamConfig = config.parameters.core[coreKey]; - expect(coreParamConfig.type).toEqual(ParamLocationType.HASH); + const coreParamConfig = config.parameters.core[coreKey as keyof CoreMap]; + expect(coreParamConfig.type).toEqual(ParamLocationType.hash); }); }); @@ -179,14 +179,14 @@ describe('UrlTranslator', () => { const config = queryString.getConfig(); expect(config.parameters.core).toEqual({ - query: { name: 'q', type: ParamLocationType.QUERY }, - oq: { name: 'oq', type: ParamLocationType.QUERY }, - rq: { name: 'rq', type: ParamLocationType.QUERY }, - tag: { name: 'tag', type: ParamLocationType.QUERY }, - page: { name: 'page', type: ParamLocationType.QUERY }, - pageSize: { name: 'pageSize', type: ParamLocationType.HASH }, - sort: { name: 'sort', type: ParamLocationType.HASH }, - filter: { name: 'filter', type: ParamLocationType.HASH }, + query: { name: 'q', type: ParamLocationType.query }, + oq: { name: 'oq', type: ParamLocationType.query }, + rq: { name: 'rq', type: ParamLocationType.query }, + tag: { name: 'tag', type: ParamLocationType.query }, + page: { name: 'page', type: ParamLocationType.query }, + pageSize: { name: 'pageSize', type: ParamLocationType.hash }, + sort: { name: 'sort', type: ParamLocationType.hash }, + filter: { name: 'filter', type: ParamLocationType.hash }, }); }); }); @@ -214,8 +214,10 @@ describe('UrlTranslator', () => { expect(params.query).toBe('correct'); - expect(params.filter.color).toEqual(['blue']); - expect(params.filter.brand).toEqual(['nike', 'adidas']); + expect(params).toHaveProperty('filter', { + color: ['blue'], + brand: ['nike', 'adidas'], + }); }); it('deserializes core state correctly', () => { @@ -255,7 +257,7 @@ describe('UrlTranslator', () => { '/#/q:shoes/oq:shoez/rq:shiny/tag:taggy/page:7/pageSize:40/filter:color:red/filter:color:orange/filter:brand:adidas/filter:price:99.99:299.99/sort:name:desc'; const queryString = new UrlTranslator({ settings: { - coreType: ParamLocationType.HASH, + coreType: ParamLocationType.hash, }, }); const params: UrlState = queryString.deserialize(url); @@ -291,7 +293,7 @@ describe('UrlTranslator', () => { '?q=shoes&oq=shoez&rq=shiny&tag=taggy&page=7&pageSize=40&filter.color=red&filter.color=orange&filter.brand=adidas&filter.price.low=99.99&filter.price.high=299.99&sort.name=desc'; const queryString = new UrlTranslator({ settings: { - coreType: ParamLocationType.QUERY, + coreType: ParamLocationType.query, }, }); const params: UrlState = queryString.deserialize(url); @@ -327,7 +329,7 @@ describe('UrlTranslator', () => { '?q=shoes&oq=shoez&rq=shiny&tag=taggy&page=7&pageSize=40&filter.color=red&filter.color=orange&filter.brand=adidas&filter.price.low=99.99&filter.price.high=299.99&sort.name=desc'; const queryString = new UrlTranslator({ settings: { - coreType: ParamLocationType.HASH, + coreType: ParamLocationType.hash, }, }); const params: UrlState = queryString.deserialize(url); @@ -348,14 +350,14 @@ describe('UrlTranslator', () => { const queryString = new UrlTranslator({ parameters: { core: { - query: { name: 'query', type: ParamLocationType.HASH }, - oq: { name: 'originalQuery', type: ParamLocationType.HASH }, - rq: { name: 'refinedQuery', type: ParamLocationType.HASH }, - tag: { name: 'landingPage', type: ParamLocationType.HASH }, - page: { name: 'p', type: ParamLocationType.HASH }, - pageSize: { name: 'size', type: ParamLocationType.QUERY }, - filter: { name: 'facet', type: ParamLocationType.QUERY }, - sort: { name: 'order', type: ParamLocationType.QUERY }, + query: { name: 'query', type: ParamLocationType.hash }, + oq: { name: 'originalQuery', type: ParamLocationType.hash }, + rq: { name: 'refinedQuery', type: ParamLocationType.hash }, + tag: { name: 'landingPage', type: ParamLocationType.hash }, + page: { name: 'p', type: ParamLocationType.hash }, + pageSize: { name: 'size', type: ParamLocationType.query }, + filter: { name: 'facet', type: ParamLocationType.query }, + sort: { name: 'order', type: ParamLocationType.query }, }, }, }); @@ -450,7 +452,7 @@ describe('UrlTranslator', () => { parameters: { core: { filter: { - type: ParamLocationType.QUERY, + type: ParamLocationType.query, }, }, }, @@ -632,7 +634,7 @@ describe('UrlTranslator', () => { const translator = new UrlTranslator({ settings: { - coreType: ParamLocationType.HASH, + coreType: ParamLocationType.hash, }, }); @@ -666,7 +668,7 @@ describe('UrlTranslator', () => { const translator = new UrlTranslator({ settings: { - coreType: ParamLocationType.QUERY, + coreType: ParamLocationType.query, }, }); @@ -701,14 +703,14 @@ describe('UrlTranslator', () => { const translator = new UrlTranslator({ parameters: { core: { - query: { name: 'query', type: ParamLocationType.HASH }, - oq: { name: 'originalQuery', type: ParamLocationType.HASH }, - rq: { name: 'refinedQuery', type: ParamLocationType.HASH }, - tag: { name: 'landingPage', type: ParamLocationType.HASH }, - page: { name: 'p', type: ParamLocationType.HASH }, - pageSize: { name: 'size', type: ParamLocationType.QUERY }, - filter: { name: 'facet', type: ParamLocationType.QUERY }, - sort: { name: 'order', type: ParamLocationType.QUERY }, + query: { name: 'query', type: ParamLocationType.hash }, + oq: { name: 'originalQuery', type: ParamLocationType.hash }, + rq: { name: 'refinedQuery', type: ParamLocationType.hash }, + tag: { name: 'landingPage', type: ParamLocationType.hash }, + page: { name: 'p', type: ParamLocationType.hash }, + pageSize: { name: 'size', type: ParamLocationType.query }, + filter: { name: 'facet', type: ParamLocationType.query }, + sort: { name: 'order', type: ParamLocationType.query }, }, }, }); @@ -835,11 +837,11 @@ describe('UrlTranslator', () => { parameters: { core: { query: { name: 'search' }, - sort: { name: 'order', type: ParamLocationType.QUERY }, + sort: { name: 'order', type: ParamLocationType.query }, }, custom: { - ga: { type: ParamLocationType.HASH }, - googs: { type: ParamLocationType.QUERY }, + ga: { type: ParamLocationType.hash }, + googs: { type: ParamLocationType.query }, }, }, }; @@ -859,7 +861,7 @@ describe('UrlTranslator', () => { const config = { urlRoot: 'https://www.website.com/search.html', settings: { - customType: ParamLocationType.HASH, + customType: ParamLocationType.hash, }, }; const translator = new UrlTranslator(config); @@ -878,7 +880,7 @@ describe('UrlTranslator', () => { const config = { urlRoot: 'https://www.website.com/search.html', settings: { - customType: ParamLocationType.QUERY, + customType: ParamLocationType.query, }, }; const translator = new UrlTranslator(config); diff --git a/packages/snap-url-manager/src/Translators/Url/UrlTranslator.ts b/packages/snap-url-manager/src/Translators/Url/UrlTranslator.ts index bee9a1656..fe7ca0f99 100644 --- a/packages/snap-url-manager/src/Translators/Url/UrlTranslator.ts +++ b/packages/snap-url-manager/src/Translators/Url/UrlTranslator.ts @@ -5,64 +5,68 @@ import { UrlState, Translator, UrlStateSort, RangeValueProperties, UrlStateFilte type UrlParameter = { key: Array; value: string; - type: ParamLocationType; + type: keyof typeof ParamLocationType; }; type MapOptions = { - name?: string; - type?: ParamLocationType; + name: string; + type: keyof typeof ParamLocationType; }; -type CoreMap = { - query?: MapOptions; - oq?: MapOptions; - rq?: MapOptions; - tag?: MapOptions; - page?: MapOptions; - pageSize?: MapOptions; - sort?: MapOptions; - filter?: MapOptions; +type UnnamedMapOptions = { + type: keyof typeof ParamLocationType; +}; + +export type CoreMap = { + query: MapOptions; + oq: MapOptions; + rq: MapOptions; + tag: MapOptions; + page: MapOptions; + pageSize: MapOptions; + sort: MapOptions; + filter: MapOptions; }; type CustomMap = { - [param: string]: { - type?: ParamLocationType; - }; + [param: string]: UnnamedMapOptions; }; export type UrlTranslatorParametersConfig = { - core?: CoreMap; - custom?: CustomMap; + core: CoreMap; + custom: CustomMap; }; export type UrlTranslatorConfig = { - urlRoot?: string; - settings?: { - corePrefix?: string; - coreType?: ParamLocationType; - customType?: ParamLocationType; - rootParams?: boolean; + urlRoot: string; + settings: { + corePrefix: string; + coreType?: keyof typeof ParamLocationType; + customType: keyof typeof ParamLocationType; + rootParams: boolean; }; - parameters?: UrlTranslatorParametersConfig; + parameters: UrlTranslatorParametersConfig; }; +type DeepPartial = Partial<{ [P in keyof T]: DeepPartial }>; + const defaultConfig: UrlTranslatorConfig = { urlRoot: '', settings: { corePrefix: '', - customType: ParamLocationType.HASH, + customType: ParamLocationType.hash, rootParams: true, }, parameters: { core: { - query: { name: 'q', type: ParamLocationType.QUERY }, - oq: { name: 'oq', type: ParamLocationType.QUERY }, - rq: { name: 'rq', type: ParamLocationType.QUERY }, - tag: { name: 'tag', type: ParamLocationType.QUERY }, - page: { name: 'page', type: ParamLocationType.QUERY }, - pageSize: { name: 'pageSize', type: ParamLocationType.HASH }, - sort: { name: 'sort', type: ParamLocationType.HASH }, - filter: { name: 'filter', type: ParamLocationType.HASH }, + query: { name: 'q', type: ParamLocationType.query }, + oq: { name: 'oq', type: ParamLocationType.query }, + rq: { name: 'rq', type: ParamLocationType.query }, + tag: { name: 'tag', type: ParamLocationType.query }, + page: { name: 'page', type: ParamLocationType.query }, + pageSize: { name: 'pageSize', type: ParamLocationType.hash }, + sort: { name: 'sort', type: ParamLocationType.hash }, + filter: { name: 'filter', type: ParamLocationType.hash }, }, custom: {}, }, @@ -74,29 +78,31 @@ export class UrlTranslator implements Translator { protected config: UrlTranslatorConfig; protected reverseMapping: Record = {}; - constructor(config: UrlTranslatorConfig = {}) { - this.config = deepmerge(defaultConfig, config); + constructor(config?: DeepPartial) { + this.config = deepmerge(defaultConfig, (config as UrlTranslatorConfig) || {}); + + Object.keys(this.config.parameters.core).forEach((param: string) => { + const coreParam = this.config.parameters.core[param as keyof CoreMap]; - Object.keys(this.config.parameters.core).forEach((param) => { // param prefix if (this.config.settings.corePrefix) { - this.config.parameters.core[param].name = this.config.settings.corePrefix + this.config.parameters.core[param].name; + coreParam.name = this.config.settings.corePrefix + coreParam.name; } // global type override - const paramType = this.config.settings.coreType; - if (paramType && Object.values(ParamLocationType).includes(paramType)) { - this.config.parameters.core[param].type = (config?.parameters?.core && config?.parameters?.core[param]?.type) || paramType; + const paramType = this.config.settings?.coreType; + if (paramType && Object.values(ParamLocationType).includes(paramType as ParamLocationType)) { + coreParam.type = (config?.parameters?.core && coreParam.type) || paramType; } // create reverse mapping for quick lookup later - this.reverseMapping[this.config.parameters.core[param].name] = param; + this.reverseMapping[coreParam.name] = param; }); - const implicit = this.config.settings.customType; - if (implicit && !Object.values(ParamLocationType).includes(implicit)) { + const implicit = this.config.settings?.customType; + if (implicit && !Object.values(ParamLocationType).includes(implicit as ParamLocationType)) { // invalid type specified - falling back to hash as implicit type - this.config.settings.customType = ParamLocationType.HASH; + this.config.settings.customType = ParamLocationType.hash; } } @@ -133,7 +139,7 @@ export class UrlTranslator implements Translator { .filter((v) => v) .map((kvPair) => { const [key, value] = kvPair.split('=').map((v) => decodeURIComponent(v.replace(/\+/g, ' '))); - return { key: key.split('.'), value, type: ParamLocationType.QUERY }; + return { key: key.split('.'), value, type: ParamLocationType.query }; }) .filter((param) => { // remove core fields that do not contain a value @@ -143,7 +149,7 @@ export class UrlTranslator implements Translator { } protected parseHashString(hashString: string): Array { - const params = []; + const params: Array = []; const justHashString = hashString.split('#').join('/') || ''; justHashString .split('/') @@ -159,15 +165,15 @@ export class UrlTranslator implements Translator { }) .forEach((decodedHashEntries) => { if (decodedHashEntries.length == 1) { - params.push({ key: [decodedHashEntries[0]], value: undefined, type: ParamLocationType.HASH }); + params.push({ key: [decodedHashEntries[0]], value: '', type: ParamLocationType.hash }); } else if (decodedHashEntries.length && decodedHashEntries.length <= 3) { const [value, ...keys] = decodedHashEntries.reverse(); - params.push({ key: keys.reverse(), value, type: ParamLocationType.HASH }); + params.push({ key: keys.reverse(), value, type: ParamLocationType.hash }); } else if (decodedHashEntries.length && decodedHashEntries.length == 4) { // range filter const [path0, path1, low, high] = decodedHashEntries; - params.push({ key: [path0, path1, 'low'], value: low, type: ParamLocationType.HASH }); - params.push({ key: [path0, path1, 'high'], value: high, type: ParamLocationType.HASH }); + params.push({ key: [path0, path1, 'low'], value: low, type: ParamLocationType.hash }); + params.push({ key: [path0, path1, 'high'], value: high, type: ParamLocationType.hash }); } }); @@ -177,15 +183,15 @@ export class UrlTranslator implements Translator { // parse params into state protected paramsToState(params: Array): UrlState { - const coreOtherParams = [], - coreFilterParams = [], - coreSortParams = [], - otherParams = []; + const coreOtherParams: Array = [], + coreFilterParams: Array = [], + coreSortParams: Array = [], + otherParams: Array = []; params?.forEach((param) => { const coreStateKey = this.reverseMapping[param.key[0]]; - const coreConfig: MapOptions = this.config.parameters.core[coreStateKey]; - const customStateKey: MapOptions = this.config.parameters.custom[param.key[0]]; + const coreConfig: MapOptions = this.config.parameters.core[coreStateKey as keyof CoreMap]; + const customStateKey: UnnamedMapOptions = this.config.parameters.custom[param.key[0]]; if (coreStateKey) { // core state @@ -354,8 +360,8 @@ export class UrlTranslator implements Translator { const rootUrlParams = this.config.settings.rootParams ? this.parseUrlParams(this.config.urlRoot) : []; const stateParams = this.stateToParams(state); const params = [...rootUrlParams, ...stateParams]; - const queryParams = params.filter((p) => p.type == ParamLocationType.QUERY); - const hashParams = params.filter((p) => p.type == ParamLocationType.HASH); + const queryParams = params.filter((p) => p.type == ParamLocationType.query); + const hashParams = params.filter((p) => p.type == ParamLocationType.hash); const paramString = (queryParams.length @@ -423,7 +429,7 @@ export class UrlTranslator implements Translator { typeof value[RangeValueProperties.LOW] != 'undefined' && typeof value[RangeValueProperties.HIGH] != 'undefined' ) { - if (filterConfig.type == ParamLocationType.QUERY) { + if (filterConfig.type == ParamLocationType.query) { return [ { key: [filterConfig.name, key, RangeValueProperties.LOW], @@ -436,7 +442,7 @@ export class UrlTranslator implements Translator { type: filterConfig.type, }, ]; - } else if (filterConfig.type == ParamLocationType.HASH) { + } else if (filterConfig.type == ParamLocationType.hash) { return [ { key: [filterConfig.name, key, '' + (value[RangeValueProperties.LOW] ?? '*')], @@ -478,7 +484,7 @@ export class UrlTranslator implements Translator { }) .map((param) => { if (CORE_FIELDS.includes(param) && !except.includes(param)) { - const paramConfig = this.config.parameters.core[param]; + const paramConfig = this.config.parameters.core[param as keyof CoreMap]; if (param == 'page' && state[param] == 1) { // do not include page 1 } else { @@ -512,9 +518,9 @@ export class UrlTranslator implements Translator { }) ); } else { - params = params.concat({ key: [...currentPath, key], value: undefined, type }); + params = params.concat({ key: [...currentPath, key], value: '', type }); } - } else if (typeof value == 'object' && Object.keys(value).length) { + } else if (typeof value == 'object' && Object.keys(value || {}).length) { addRecursive(value as Record, [...currentPath, key]); } else { const customConfig = this.config.parameters.custom[currentPath[0] || key]; diff --git a/packages/snap-url-manager/src/UrlManager/UrlManager.ts b/packages/snap-url-manager/src/UrlManager/UrlManager.ts index 468271f76..8fd0d9f15 100644 --- a/packages/snap-url-manager/src/UrlManager/UrlManager.ts +++ b/packages/snap-url-manager/src/UrlManager/UrlManager.ts @@ -273,7 +273,7 @@ export class UrlManager { return this.linker(this); } - subscribe(cb: (prev: ImmutableObject, next?: ImmutableObject) => void): () => void { + subscribe(cb: (prev?: ImmutableObject, next?: ImmutableObject) => void): () => void { return this.watcherPool.subscribe(() => { const prevState = this.prevState; const state = this.mergedState; @@ -287,7 +287,7 @@ function removeArrayDuplicates(array: Array | any): Array | any { if (Array.isArray(array) && array.length) { return array.reduce( (accu, item) => { - if (!accu.some((keep) => compareObjects(keep, item))) { + if (!accu.some((keep: unknown) => compareObjects(keep, item))) { accu.push(item); } @@ -299,7 +299,7 @@ function removeArrayDuplicates(array: Array | any): Array | any { return array; } -function arrayConcatMerger(current: unknown, other: unknown): Array { +function arrayConcatMerger(current: unknown, other: unknown): Array | undefined { if (current instanceof Array && other instanceof Array) { return removeArrayDuplicates([...current, ...other]); } diff --git a/packages/snap-url-manager/src/integration.test.ts b/packages/snap-url-manager/src/integration.test.ts index 736bb26f3..fbd3b5062 100644 --- a/packages/snap-url-manager/src/integration.test.ts +++ b/packages/snap-url-manager/src/integration.test.ts @@ -1,6 +1,6 @@ import { UrlManager } from './UrlManager/UrlManager'; import { QueryStringTranslator, UrlTranslator } from './Translators'; -import { ParamLocationType } from './types'; +import { UrlState, ParamLocationType } from './types'; let url = ''; @@ -195,15 +195,15 @@ describe('UrlManager Integration Tests', () => { return url; } - go(_url) { + go(_url: string) { url = _url; } - serialize(state) { + serialize(state: UrlState) { return '#' + JSON.stringify(state); } - deserialize(url) { + deserialize(url: string) { return JSON.parse(url.replace(/^#/, '') || '{}'); } } @@ -225,15 +225,15 @@ describe('UrlManager Integration Tests', () => { return window.location.hash; } - go(hash) { + go(hash: string) { window.location.hash = hash; } - serialize(state) { + serialize(state: UrlState) { return '#' + super.serialize(state).split('?').pop(); } - deserialize(url) { + deserialize(url: string) { return super.deserialize('?' + url.replace(/^\#?\/*/, '')); } } @@ -456,8 +456,8 @@ describe('UrlManager Integration Tests', () => { query: { name: 'search' }, }, custom: { - store: { type: ParamLocationType.HASH }, - view: { type: ParamLocationType.QUERY }, + store: { type: ParamLocationType.hash }, + view: { type: ParamLocationType.query }, }, }, }; diff --git a/packages/snap-url-manager/src/types.ts b/packages/snap-url-manager/src/types.ts index 2244fe415..5ee92b560 100644 --- a/packages/snap-url-manager/src/types.ts +++ b/packages/snap-url-manager/src/types.ts @@ -51,6 +51,6 @@ export interface TranslatorConfig { } export enum ParamLocationType { - HASH = 'hash', - QUERY = 'query', + hash = 'hash', + query = 'query', } diff --git a/packages/snap-url-manager/tsconfig.json b/packages/snap-url-manager/tsconfig.json index 86a882798..dc2e50e03 100644 --- a/packages/snap-url-manager/tsconfig.json +++ b/packages/snap-url-manager/tsconfig.json @@ -4,6 +4,7 @@ "src" ], "compilerOptions": { - "outDir": "./dist/esm" + "outDir": "./dist/esm", + "strict": true, } } \ No newline at end of file From 533785a63924a6266ff2470414242ac0244c64a8 Mon Sep 17 00:00:00 2001 From: Dennis Konieczek Date: Wed, 20 Apr 2022 16:48:52 -0400 Subject: [PATCH 17/27] fix(recommendationinstantiator): remove fallback url when creating recs controller --- .../src/Instantiators/RecommendationInstantiator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx index a40a63bc2..0177d4215 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx @@ -179,7 +179,7 @@ export class RecommendationInstantiator { const tracker = this.tracker; const recs = createRecommendationController( { - url: this.config.url || {}, + url: this.config.url, controller: controllerConfig, context, }, From 1885eb19dace0741a68fd07067819aa565a92cd8 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 22 Apr 2022 16:20:54 -0600 Subject: [PATCH 18/27] fix(component-branchoverride): correcting documentation and ensuring 'error' prop takes priority --- .../BranchOverride/BranchOverride.stories.tsx | 4 +- .../BranchOverride/BranchOverride.test.tsx | 60 ++++++++++++++----- .../BranchOverride/BranchOverride.tsx | 4 +- .../Organisms/BranchOverride/readme.md | 10 ++-- 4 files changed, 54 insertions(+), 24 deletions(-) diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx index 7225fd5e5..055e80217 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.stories.tsx @@ -53,7 +53,7 @@ export default { control: { type: 'object' }, }, error: { - description: 'URL of the branch resource', + description: 'Object containing error message and description', type: { required: false }, table: { type: { @@ -66,7 +66,7 @@ export default { description: 'optional function to run on remove button click', table: { type: { - summary: '(e: Event, name: string, url: string) => void', + summary: '(e: Event, name: string) => void', }, }, action: 'onRemoveClick', diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx index b9121415e..cf1b66fe7 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.test.tsx @@ -7,19 +7,6 @@ import { BranchOverride } from './BranchOverride'; import { ThemeProvider } from '../../../providers'; describe('BranchOverride Component', () => { - const { location } = window; - - beforeAll(() => { - delete window.location; - - // @ts-ignore - window.location = { - href: 'https://www.merch.com?branch=branch', - }; - }); - - afterAll(() => jest.clearAllMocks); - const branch = 'branch'; const url = 'https://snapui.searchspring.io/y56s6x/branch/bundle.js'; const lastModified = '07 Jan 2022 22:42:39 GMT'; @@ -106,12 +93,13 @@ describe('BranchOverride Component', () => { }); it('displays branch failure on bad branch', async () => { + const name = 'badBranch'; const error = { message: 'Branch not found...', description: 'Unable to find the branch.', }; - const rendered = render(); + const rendered = render(); // wait for rendering of component await waitFor(() => { @@ -124,7 +112,49 @@ describe('BranchOverride Component', () => { // branch name const bottomRightElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__right'); expect(bottomRightElement).toBeInTheDocument(); - expect(bottomRightElement.innerHTML).toContain('bad'); + expect(bottomRightElement.innerHTML).toContain(name); + + // error message + const bottomLeftElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__left'); + expect(bottomLeftElement).toBeInTheDocument(); + expect(bottomLeftElement.textContent).toContain(error.message); + + // error description + const bottomContentElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__content'); + expect(bottomContentElement).toBeInTheDocument(); + expect(bottomContentElement.textContent).toContain(error.description); + }); + + it(`displays branch failure when both 'error' and 'details' props are provided`, async () => { + const error = { + message: 'Branch not found...', + description: 'Unable to find the branch.', + }; + + const rendered = render(); + + // wait for rendering of component + await waitFor(() => { + const overrideElement = rendered.container.querySelector('.ss__branch-override'); + expect(overrideElement).toBeInTheDocument(); + const styles = getComputedStyle(overrideElement); + expect(styles.background).toBe('rgba(130, 6, 6, 0.9)'); + }); + + // branch name + const bottomRightElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__right'); + expect(bottomRightElement).toBeInTheDocument(); + expect(bottomRightElement.innerHTML).toContain(props.name); + + // error message + const bottomLeftElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__left'); + expect(bottomLeftElement).toBeInTheDocument(); + expect(bottomLeftElement.textContent).toContain(error.message); + + // error description + const bottomContentElement = rendered.container.querySelector('.ss__branch-override .ss__branch-override__bottom__content'); + expect(bottomContentElement).toBeInTheDocument(); + expect(bottomContentElement.textContent).toContain(error.description); }); it('can disable styles', async () => { diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx index b0e6023b5..8ca67f373 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx @@ -222,7 +222,7 @@ export const BranchOverride = (properties: BranchOverrideProps): JSX.Element => const subProps: BranchOverrideSubProps = { icon: { // default props - className: 'ss__facet__dropdown__icon', + className: 'ss__branch-override__bottom__left__icon', size: '12px', // global theme ...globalTheme?.components?.icon, @@ -300,7 +300,7 @@ export const BranchOverride = (properties: BranchOverrideProps): JSX.Element => )} - {details?.lastModified || name} + {error ? name : details?.lastModified}
{error?.description || themes[themeName].bottom.content}
diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md b/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md index 987a2746a..b413dd4b7 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/readme.md @@ -1,7 +1,7 @@ # BranchOverride Renders a popup to show when a branch override is in place. -Executed `onRemoveClick` prop when the remove button is clicked. +Executes `onRemoveClick` prop when the remove button is clicked. Must have `name` and either `details` or `error` props to render. ## Components Used @@ -45,14 +45,14 @@ The `onRemoveClick` prop is a function to be called when the 'remove' button is ```jsx const whenRemoved = (e, name) => { - console.log(`removed the ${} branch`); + console.log(`remove clicked in the override for the '${name}' branch`); }; - + ``` ### darkMode -The `darkMode` prop is used to set the component styling to prefer dark. By default the component will auto detect the browser preference. +The `darkMode` prop is used to set the component styling to prefer (or not to prefer) dark mode. By default the component will auto detect the browser preference. ```jsx const details = { @@ -60,5 +60,5 @@ const details = { lastModified: '1 Feb 2022 1:02:03 GMT' }; - + ``` \ No newline at end of file From 82dcbca99f611db134dd75aa4039af39785cf551 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 22 Apr 2022 18:13:56 -0600 Subject: [PATCH 19/27] refactor(snap-preact): correcting getBundleDetails test and adding an error response for request err --- .../src/getBundleDetails/getBundleDetails.test.ts | 11 ----------- .../src/getBundleDetails/getBundleDetails.ts | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts b/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts index 561bfe1b3..7a3890f43 100644 --- a/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts +++ b/packages/snap-preact/src/getBundleDetails/getBundleDetails.test.ts @@ -18,23 +18,12 @@ describe('getBundleDetails function', () => { // return "Last-Modified" date return `Fri, ${modifiedDate}`; }); - - delete window.location; - - // @ts-ignore - window.location = { - href: 'https://www.merch.com?branch=branch', - }; }); afterAll(() => jest.clearAllMocks); it('fetches bundle details from requested bundle URL', () => { const url = 'https://snapui.searchspring.io/siteId/next/bundle.js'; - // @ts-ignore - xhrMock.status = 200; - - jest.spyOn(window, 'XMLHttpRequest').mockImplementation(() => xhrMock as XMLHttpRequest); const fetchPromise = getBundleDetails(url).then((details) => { expect(details.lastModified).toBe('07 Jan 2022 22:42:39 GMT'); diff --git a/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts b/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts index 7d3598014..4014aae73 100644 --- a/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts +++ b/packages/snap-preact/src/getBundleDetails/getBundleDetails.ts @@ -22,7 +22,7 @@ export const getBundleDetails = async (url: string): Promise => { } }; - request.onerror = () => reject(); + request.onerror = () => reject({ message: 'Branch load fail!', description: 'There was an error with the request.' }); request.send(); }); From 1e48228560e84df7f0515b0f103bcc07eb1ddc99 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 22 Apr 2022 18:17:11 -0600 Subject: [PATCH 20/27] fix(snap-preact): changing instantiator name to 'recommendation' from 'recommendations' also changing getBundleDetails to a dynamic import --- packages/snap-preact/src/Snap.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/snap-preact/src/Snap.tsx b/packages/snap-preact/src/Snap.tsx index 43f2915a6..7c79f776d 100644 --- a/packages/snap-preact/src/Snap.tsx +++ b/packages/snap-preact/src/Snap.tsx @@ -28,7 +28,6 @@ import type { UrlTranslatorConfig } from '@searchspring/snap-url-manager'; import { default as createSearchController } from './create/createSearchController'; import { RecommendationInstantiator, RecommendationInstantiatorConfig } from './Instantiators/RecommendationInstantiator'; -import { getBundleDetails } from './getBundleDetails/getBundleDetails'; import type { SnapControllerServices, SnapControllerConfigs, RootComponent } from './types'; export const BRANCH_COOKIE = 'ssBranch'; @@ -305,6 +304,7 @@ export class Snap { async (target, elem) => { let bundleDetails, error; try { + const getBundleDetails = (await import('./getBundleDetails/getBundleDetails')).getBundleDetails; bundleDetails = await getBundleDetails(src); } catch (err) { error = err; @@ -670,7 +670,7 @@ export class Snap { if (this.config?.instantiators?.recommendation) { try { - this._instantiatorPromises.recommendations = import('./Instantiators/RecommendationInstantiator').then(({ RecommendationInstantiator }) => { + this._instantiatorPromises.recommendation = import('./Instantiators/RecommendationInstantiator').then(({ RecommendationInstantiator }) => { return new RecommendationInstantiator( this.config.instantiators.recommendation, { From 5a373b9975cf0d5a7f6d8a9a2b3f6eda930ec21c Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 22 Apr 2022 18:18:38 -0600 Subject: [PATCH 21/27] fix(recommendationinstantiator): changing controller naming structure - object name to 'controller' --- .../snap-preact/src/Instantiators/README.md | 23 ++--- .../RecommendationInstantiator.test.tsx | 87 +++++++++---------- .../RecommendationInstantiator.tsx | 26 +++--- 3 files changed, 60 insertions(+), 76 deletions(-) diff --git a/packages/snap-preact/src/Instantiators/README.md b/packages/snap-preact/src/Instantiators/README.md index 842ae509d..fe2fd8e4b 100644 --- a/packages/snap-preact/src/Instantiators/README.md +++ b/packages/snap-preact/src/Instantiators/README.md @@ -1,17 +1,17 @@ # Instantiators ## RecommendationInstantiator -The `RecommendationInstantiator` class handles the targetting and creation of recommendation controllers from querying the DOM. +The `RecommendationInstantiator` class handles the targetting and creation of recommendation controllers. The instantiator looks for targets in the DOM, creates a controller and injects components into the DOM. -### controllers +### controller -The `controllers` property contains an object of all recommendation instance that has been found on the page. Each instance will have its own `RecommendationController` instance created and added to the `controllers` object. +The `controller` property is an object of recommendation controller instances that have been created. -All controllers can be accessed via the `controllers` object where the key is the id of the controller that was created. The controller id is generated based on the `profile` attribute and it's occurance count (starting at 0.) It follows the following format: +All controllers can be accessed via the `controller` object where the key is the id of the controller that was created. The controller id is generated based on the `profile` attribute and it's occurance count (starting at 0.) It follows the following format: ```typescript -id: `recommend_${tag + (profileCount[tag] - 1)}`, +id: `recommend_${tag}_${profileCount[tag] - 1}`, ``` For example, if the page contains the following single recommendation instance: @@ -20,17 +20,8 @@ For example, if the page contains the following single recommendation instance: ``` -The controller id would be `recommend_trending0` and can be accesed as follows: +The controller id would be `recommend_trending_0`. -```typescript -import { Snap } from '@searchspring/snap-preact'; - -const snap = new Snap(config); -const recommendations = snap.recommendations; -const controllers = recommendations.controllers; -const { recommend_trending0 } = controllers; - -console.log("recommend_trending0", recommend_trending0) ``` ### client @@ -50,7 +41,7 @@ A reference to the shared [@searchspring/snap-logger](https://github.com/searchs ### config -A reference to the `config.instantiators.recommendation` config object as part of the config that was provided to Snap. +A reference to the config object used in instantiation. ### uses diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx index 06144f49f..784934f71 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.test.tsx @@ -78,22 +78,6 @@ describe('RecommendationInstantiator', () => { }).toThrow(); }); - it('throws if configuration is not complete', () => { - const invalidConfig = { - components: { - Default: async () => Component, - }, - config: { - branch: 'production', - }, - }; - - expect(() => { - // @ts-ignore - testing bad instantiation - const recommendationInstantiator = new RecommendationInstantiator(invalidConfig); - }).toThrow(); - }); - it('throws if configuration is missing component mapping', () => { const invalidConfig = { client: { @@ -124,7 +108,7 @@ describe('RecommendationInstantiator', () => { // properties are defined expect(recommendationInstantiator.config).toStrictEqual(baseConfig); expect(recommendationInstantiator.context).toStrictEqual({}); - expect(recommendationInstantiator.controllers).toStrictEqual({}); + expect(recommendationInstantiator.controller).toStrictEqual({}); // @ts-ignore - checking private property expect(recommendationInstantiator.client.globals.siteId).toBe(baseConfig.client.globals.siteId); @@ -136,11 +120,9 @@ describe('RecommendationInstantiator', () => { const client = new MockClient(baseConfig.client.globals, {}); const clientSpy = jest.spyOn(client, 'recommend'); - expect(() => { - const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(0); - expect(clientSpy).toHaveBeenCalledTimes(0); - }).toThrow(); + const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(0); + expect(clientSpy).toHaveBeenCalledTimes(0); }); it('logs an error when the profile response does not contain templateParameters', async () => { @@ -154,9 +136,10 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { logger, client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(1); expect(clientSpy).toHaveBeenCalledTimes(1); expect(loggerSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledWith(`profile '${DEFAULT_PROFILE}' found on [object HTMLScriptElement] is missing templateParameters!`); }); it('logs an error when the profile response does not contain a component', async () => { @@ -170,9 +153,10 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { logger, client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(1); expect(clientSpy).toHaveBeenCalledTimes(1); expect(loggerSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledWith(`profile '${DEFAULT_PROFILE}' found on [object HTMLScriptElement] is missing component!`); }); it('logs an error when the profile response does not find a mapped component', async () => { @@ -192,12 +176,15 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(modifiedConfig, { logger, client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(1); expect(clientSpy).toHaveBeenCalledTimes(1); expect(loggerSpy).toHaveBeenCalledTimes(1); + expect(loggerSpy).toHaveBeenCalledWith( + `profile '${DEFAULT_PROFILE}' found on [object HTMLScriptElement] is expecting component mapping for 'Default' - verify instantiator config.` + ); }); - it('creates a controllers when it finds a target', async () => { + it('creates a controller when it finds a target', async () => { document.body.innerHTML = ``; const client = new MockClient(baseConfig.client.globals, {}); @@ -205,10 +192,10 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); - Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { - const controller = recommendationInstantiator.controllers[controllerId]; - expect(controllerId).toBe(`recommend_${controller.context.profile}${index}`); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(1); + Object.keys(recommendationInstantiator.controller).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controller[controllerId]; + expect(controllerId).toBe(`recommend_${DEFAULT_PROFILE}_${index}`); }); expect(clientSpy).toHaveBeenCalledTimes(1); }); @@ -217,19 +204,23 @@ describe('RecommendationInstantiator', () => { document.body.innerHTML = ` - `; + + `; + + const profileCount = {}; const client = new MockClient(baseConfig.client.globals, {}); const clientSpy = jest.spyOn(client, 'recommend'); const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(3); - Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { - const controller = recommendationInstantiator.controllers[controllerId]; - expect(controllerId).toBe(`recommend_${controller.context.profile}${index}`); + expect(Object.keys(recommendationInstantiator.controller).length).toBe(4); + Object.keys(recommendationInstantiator.controller).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controller[controllerId]; + profileCount[controller.context.profile] = profileCount[controller.context.profile] + 1 || 0; + expect(controllerId).toBe(`recommend_${controller.context.profile}_${profileCount[controller.context.profile]}`); }); - expect(clientSpy).toHaveBeenCalledTimes(3); + expect(clientSpy).toHaveBeenCalledTimes(4); }); it('makes the context found on the target available', async () => { @@ -239,7 +230,7 @@ describe('RecommendationInstantiator', () => { options = { branch: 'testing', siteId: 'abc123', - categories: ['cats'], + categories: ['cats', 'dogs'], limit: 5 } `; @@ -249,9 +240,9 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(baseConfig, { client }); await wait(); - expect(Object.keys(recommendationInstantiator.controllers).length).toBe(1); - Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { - const controller = recommendationInstantiator.controllers[controllerId]; + expect(Object.keys(recommendationInstantiator.controller).length).toBe(1); + Object.keys(recommendationInstantiator.controller).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controller[controllerId]; expect(controller.context).toStrictEqual({ profile: 'trending', shopper: { @@ -260,7 +251,7 @@ describe('RecommendationInstantiator', () => { product: 'sku1', options: { branch: 'testing', - categories: ['cats'], + categories: ['cats', 'dogs'], limit: 5, siteId: 'abc123', }, @@ -271,7 +262,7 @@ describe('RecommendationInstantiator', () => { expect(clientSpy).toHaveBeenCalledWith({ batched: true, branch: 'testing', - categories: ['cats'], + categories: ['cats', 'dogs'], limits: 5, product: 'sku1', shopper: 'snapdev', @@ -280,7 +271,7 @@ describe('RecommendationInstantiator', () => { }); }); - it('will utilize attachments (plugins / middleware) added via methods upon creation of controllers', async () => { + it('will utilize attachments (plugins / middleware) added via methods upon creation of controller', async () => { document.body.innerHTML = ``; const plugin = jest.fn(); @@ -312,8 +303,8 @@ describe('RecommendationInstantiator', () => { }); await wait(); - Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { - const controller = recommendationInstantiator.controllers[controllerId]; + Object.keys(recommendationInstantiator.controller).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controller[controllerId]; expect(clientSpy).toHaveBeenCalledTimes(1); expect(middlewareFn).toHaveBeenCalledTimes(6); expect(plugin).toHaveBeenCalledTimes(1); @@ -327,7 +318,7 @@ describe('RecommendationInstantiator', () => { }); }); - it('will utilize config based attachments (plugins / middleware) on created controllers', async () => { + it('will utilize config based attachments (plugins / middleware) on created controller', async () => { document.body.innerHTML = ``; const plugin = jest.fn(); @@ -357,8 +348,8 @@ describe('RecommendationInstantiator', () => { const recommendationInstantiator = new RecommendationInstantiator(attachmentConfig as RecommendationInstantiatorConfig, { client }); await wait(); - Object.keys(recommendationInstantiator.controllers).forEach((controllerId, index) => { - const controller = recommendationInstantiator.controllers[controllerId]; + Object.keys(recommendationInstantiator.controller).forEach((controllerId, index) => { + const controller = recommendationInstantiator.controller[controllerId]; expect(clientSpy).toHaveBeenCalledTimes(1); expect(middlewareFn).toHaveBeenCalledTimes(3); expect(plugin).toHaveBeenCalledTimes(1); diff --git a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx index 4e2b7f177..a9f3865c5 100644 --- a/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx +++ b/packages/snap-preact/src/Instantiators/RecommendationInstantiator.tsx @@ -41,7 +41,7 @@ export class RecommendationInstantiator { public client: Client; public tracker: Tracker; public logger: Logger; - public controllers: { + public controller: { [key: string]: RecommendationController; } = {}; public config: RecommendationInstantiatorConfig; @@ -88,18 +88,21 @@ export class RecommendationInstantiator { element: (target, origElement) => { const profile = origElement.getAttribute('profile'); - if (profile) { - const recsContainer = document.createElement('div'); - recsContainer.setAttribute('searchspring-recommend', profile); - return recsContainer; - } else { - this.logger.warn(`'profile' attribute is missing from `; + + const snap = new Snap(baseConfig); + + expect(snap.context).toStrictEqual({ ...context, config: config, category: 'something' }); + }); + + it(`can use the 'config' in a script context to set siteId`, () => { + const config = { + client: { + globals: { + siteId: 'yyyyyy', + }, + }, + }; + + const contextString = `config = ${JSON.stringify(config)}; shopper = ${JSON.stringify(context.shopper)};`; + document.body.innerHTML = ``; + + const snap = new Snap(baseConfig); + + expect(snap.context).toStrictEqual({ ...context, config: config }); + // @ts-ignore - verifying globals using context set siteId + expect(snap.client.globals.siteId).toBe(config.client.globals.siteId); + }); + it(`takes the branch param from the URL and add a new script block`, async () => { const url = 'https://snapui.searchspring.io/xxxxxx/branch/bundle.js'; From 2a3d902be6f2950cf572db3b6e0d252ef9497c29 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 22 Apr 2022 18:20:13 -0600 Subject: [PATCH 23/27] test(e2e): modifying tests after previous changes --- packages/snap-preact-demo/public/email.html | 4 ++-- .../tests/cypress/integration/email/email.spec.js | 2 +- .../cypress/integration/recommendation/recommendation.spec.js | 2 +- .../tests/cypress/integration/tracking/track.spec.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/snap-preact-demo/public/email.html b/packages/snap-preact-demo/public/email.html index 97269562b..dad651101 100644 --- a/packages/snap-preact-demo/public/email.html +++ b/packages/snap-preact-demo/public/email.html @@ -17,7 +17,7 @@ document.cookie = 'ssShopperId=; Max-Age=-99999999;'; const siteID = '8uyt2m'; - const profile = "email-test2"; + const profile = "email"; const component = "Email"; const results = [{"id":"175547","mappings":{"core":{"uid":"175547","name":"Off She Goes White Skinny Jeans","sku":"C-JU-W1-P1034","msrp":75,"price":58,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/use_3_thumb_med.jpg","url":"/product/C-JU-W1-P1034","rating":"5","brand":"Just USA","popularity":4455,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/use_3_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"182022","mappings":{"core":{"uid":"182022","name":"Stripe Out Blue Off-The-Shoulder Dress","sku":"C-AD-I2-69PST","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2950_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-AD-I2-69PST","rating":"5","brand":"Adrienne","popularity":1135,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2950_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"177035","mappings":{"core":{"uid":"177035","name":"Spring Ahead White Print Off-The-Shoulder Dress","sku":"C-AD-W1-906FP","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/copyright_rdb_studio_2_4758_thumb_med.jpg","url":"/product/C-AD-W1-906FP","rating":"5","brand":"Adrienne","popularity":3052,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/copyright_rdb_studio_2_4758_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"182818","mappings":{"core":{"uid":"182818","name":"Take Me To Havana White Print Off-The-Shoulder Dress","sku":"C-AD-W1-924FP","msrp":50,"price":42,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/4303_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-AD-W1-924FP","rating":"5","brand":"Adrienne","popularity":752,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/4303_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"180178","mappings":{"core":{"uid":"180178","name":"For The Romantic White Off-The-Shoulder Dress","sku":"C-DB-W1-14107","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/17_03_20_studio_26619_thumb_med.jpg","url":"/product/C-DB-W1-14107","rating":"5","brand":"Ever After","popularity":1404,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/17_03_20_studio_26619_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"181323","mappings":{"core":{"uid":"181323","name":"As Cute As They Come Purple Off-The-Shoulder Dress","sku":"C-EN-V2-D7422","msrp":50,"price":44,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2940_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-EN-V2-D7422","rating":"5","brand":"Aura L\u0027atiste","popularity":4213,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2940_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"183818","mappings":{"core":{"uid":"183818","name":"Artist\u0027s Touch Blue Print Off-The-Shoulder Dress","sku":"C-FT-I4-D5340","msrp":50,"price":42,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/5-31-17adventureswithcarolineandhollyn0624_thumb_med.jpg","url":"/product/C-FT-I4-D5340","rating":"5","brand":"Flying Tomato","popularity":1342,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/5-31-17adventureswithcarolineandhollyn0624_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"181825","mappings":{"core":{"uid":"181825","name":"Downtown Romantic Red Floral Print Dress","sku":"C-IL-R4-955BO","msrp":50,"price":49,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/4180_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-IL-R4-955BO","rating":"5","brand":"Illa Illa","popularity":900,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/4180_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"183040","mappings":{"core":{"uid":"183040","name":"Fringe Airy Feeling White Print Dress","sku":"C-MIT-W1-41080","msrp":50,"price":39,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/5237_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-MIT-W1-41080","rating":"5","brand":"Mitto Shop","popularity":2471,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/5237_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"178222","mappings":{"core":{"uid":"178222","name":"Salt And Sun White Open Shoulder Cover-Up","sku":"C-VL-W1-D460S","msrp":50,"price":44,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2m4a5824-2_thumb_med.jpg","url":"/product/C-VL-W1-D460S","rating":"5","brand":"Velzera","popularity":2677,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2m4a5824-2_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"180422","mappings":{"core":{"uid":"180422","name":"Beach To Boardwalk Blue Tie Dye Maxi Dress","sku":"C-LS-I3-65NLP","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2931_copyright_reddressboutique_2017_thumb_med.jpg","url":"/product/C-LS-I3-65NLP","rating":"5","brand":"Love Stitch","popularity":2639,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2931_copyright_reddressboutique_2017_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"180940","mappings":{"core":{"uid":"180940","name":"Beach Babe White Off-The-Shoulder Cover-Up","sku":"C-VL-W1-D411S","msrp":50,"price":42,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2m4a9284_thumb_med.jpg","url":"/product/C-VL-W1-D411S","rating":"5","brand":"Velzera","popularity":1323,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2m4a9284_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"180944","mappings":{"core":{"uid":"180944","name":"Everlasting Sun White Cover-Up","sku":"C-VL-W1-D480S","msrp":50,"price":44,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2m4a8074_thumb_med.jpg","url":"/product/C-VL-W1-D480S","rating":"5","brand":"Velzera","popularity":1067,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2m4a8074_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"181887","mappings":{"core":{"uid":"181887","name":"Pure Happiness White Print Dress","sku":"C-ST-I3-12370","msrp":50,"price":44,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/1505_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-ST-I3-12370","rating":"5","brand":"Aura L\u0027atiste","popularity":299,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/1505_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"176815","mappings":{"core":{"uid":"176815","name":"Spring To Mind Coral Off-The-Shoulder Dress","sku":"C-TCE-O1-D8349","msrp":50,"price":38,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/copyright_rdb_studio_2_5457_thumb_med.jpg","url":"/product/C-TCE-O1-D8349","rating":"5","brand":"TCEC","popularity":3607,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/copyright_rdb_studio_2_5457_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"177983","mappings":{"core":{"uid":"177983","name":"Putting Class In Classic White Striped Dress","sku":"C-TCE-W1-D8326","msrp":50,"price":38,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/17_02_22_studio_set_02_15200951_thumb_med.jpg","url":"/product/C-TCE-W1-D8326","rating":"5","brand":"TCEC","popularity":1073,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/17_02_22_studio_set_02_15200951_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"181845","mappings":{"core":{"uid":"181845","name":"Escape To Mexico Red Off-The-Shoulder Dress","sku":"C-US-R4-94464","msrp":50,"price":42,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2457_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-US-R4-94464","rating":"5","brand":"Under Skies","popularity":2034,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2457_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"176982","mappings":{"core":{"uid":"176982","name":"Fancy Femme White Off-The-Shoulder Dress","sku":"C-MB-W1-16589","msrp":50,"price":50,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/copyright_rdb_studio_2_5602_thumb_med.jpg","url":"/product/C-MB-W1-16589","rating":"5","brand":"Marine","popularity":6,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/copyright_rdb_studio_2_5602_large.jpg","ratingCount":1111}},"attributes":{}},{"id":"181642","mappings":{"core":{"uid":"181642","name":"Spring Ahead Mint Print Off-The-Shoulder Dress","sku":"C-AD-E2-906FP","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/2429_copyright_reddressboutique_2017__thumb_med.jpg","url":"/product/C-AD-E2-906FP","rating":"5","brand":"Adrienne","popularity":465,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/2429_copyright_reddressboutique_2017__large.jpg","ratingCount":1111}},"attributes":{}},{"id":"178432","mappings":{"core":{"uid":"178432","name":"Spring Ahead Powder Blue Off-The-Shoulder Dress","sku":"C-AD-I1-1906P","msrp":50,"price":48,"thumbnailImageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_thumb_med/copyright_rdb_studio_2_5021_thumb_med.jpg","url":"/product/C-AD-I1-1906P","rating":"5","brand":"Adrienne","popularity":897,"imageUrl":"https://searchspring-demo-content.s3.amazonaws.com/demo/fashion/product_images_large/copyright_rdb_studio_2_5021_large.jpg","ratingCount":1111}},"attributes":{}}]; @@ -86,7 +86,7 @@ - + diff --git a/packages/snap-preact-demo/tests/cypress/integration/email/email.spec.js b/packages/snap-preact-demo/tests/cypress/integration/email/email.spec.js index ee92af148..6b768f2f7 100644 --- a/packages/snap-preact-demo/tests/cypress/integration/email/email.spec.js +++ b/packages/snap-preact-demo/tests/cypress/integration/email/email.spec.js @@ -39,7 +39,7 @@ describe('Email Recs', () => { describe('Tests Email Recs', () => { it('has a controller with an products in store immediately', function () { - cy.snapController('recommend_email-test20').then(({ store }) => { + cy.snapController('recommend_email_0').then(({ store }) => { expect(store.results.length).to.equal(20); }); }); diff --git a/packages/snap-preact-demo/tests/cypress/integration/recommendation/recommendation.spec.js b/packages/snap-preact-demo/tests/cypress/integration/recommendation/recommendation.spec.js index dae00ab28..9ae7b45ad 100644 --- a/packages/snap-preact-demo/tests/cypress/integration/recommendation/recommendation.spec.js +++ b/packages/snap-preact-demo/tests/cypress/integration/recommendation/recommendation.spec.js @@ -21,7 +21,7 @@ const config = { nextArrow: '.ss__recommendation .ss__carousel__next', prevArrow: '.ss__recommendation .ss__carousel__prev', activeSlide: '.ss__recommendation .swiper-slide-active', - controller: 'recommend_similar0', + controller: 'recommend_similar_0', }, }, }; diff --git a/packages/snap-preact-demo/tests/cypress/integration/tracking/track.spec.js b/packages/snap-preact-demo/tests/cypress/integration/tracking/track.spec.js index 33493b355..fd7fb0dd1 100644 --- a/packages/snap-preact-demo/tests/cypress/integration/tracking/track.spec.js +++ b/packages/snap-preact-demo/tests/cypress/integration/tracking/track.spec.js @@ -191,7 +191,7 @@ describe('Tracking', () => { it('tracked all recommendation interaction events', () => { cy.visit('https://localhost:2222/product.html'); - cy.snapController('recommend_similar0').then(({ store }) => { + cy.snapController('recommend_similar_0').then(({ store }) => { expect(store).to.haveOwnProperty('results'); expect(store.results).to.have.length.above(0); From a20f282a029db09703bc557a51002a6284ae3e81 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 26 Apr 2022 16:40:04 -0600 Subject: [PATCH 24/27] refactor(component-branchoverride): adding a 'max-height' style to ensure layout display is correct --- .../src/components/Organisms/BranchOverride/BranchOverride.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx index 8ca67f373..a9f07f531 100644 --- a/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx +++ b/packages/snap-preact-components/src/components/Organisms/BranchOverride/BranchOverride.tsx @@ -43,6 +43,7 @@ const CSS = { '.ss__branch-override__top__logo': { display: 'inline-block', height: '30px', + maxHeight: '30px', verticalAlign: 'middle', }, '.ss__branch-override__top__collapse': { From 36a7d73963e0bf43a459759ae631affef0aa5fed Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 27 Apr 2022 08:59:47 -0600 Subject: [PATCH 25/27] refactor(component-carousel): moving styles inside CSS and removing Global emotion component --- .../Molecules/Carousel/Carousel.tsx | 40 +++++++++++++++++-- .../components/Molecules/Carousel/styles.ts | 14 ------- 2 files changed, 36 insertions(+), 18 deletions(-) delete mode 100644 packages/snap-preact-components/src/components/Molecules/Carousel/styles.ts diff --git a/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx b/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx index 067e4363f..52a3a8bbd 100644 --- a/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx +++ b/packages/snap-preact-components/src/components/Molecules/Carousel/Carousel.tsx @@ -2,14 +2,12 @@ import { h, Fragment } from 'preact'; import { useState, useRef } from 'preact/hooks'; -import { jsx, css, Global } from '@emotion/react'; +import { jsx, css } from '@emotion/react'; import classnames from 'classnames'; import { observer } from 'mobx-react-lite'; import deepmerge from 'deepmerge'; import SwiperCore, { Pagination, Navigation } from 'swiper/core'; -import { styles } from './styles'; - import { Icon, IconProps } from '../../Atoms/Icon/Icon'; import { Swiper, SwiperSlide } from 'swiper/react'; import { defined } from '../../../utilities'; @@ -76,9 +74,35 @@ const CSS = { '.swiper-container': { display: 'flex', flexDirection: 'column', + marginLeft: 'auto', + marginRight: 'auto', + position: 'relative', + overflow: 'hidden', + listStyle: 'none', + padding: 0, + zIndex: 1, + }, + '.swiper-container-vertical': { + '.swiper-wrapper': { + flexDirection: 'column', + }, }, '.swiper-wrapper': { order: 0, + position: 'relative', + width: '100%', + height: '100%', + zIndex: 1, + display: 'flex', + transitionProperty: 'transform', + boxSizing: 'content-box', + }, + '.swiper-slide': { + flexShrink: 0, + width: '100%', + height: '100%', + position: 'relative', + transitionProperty: 'transform', }, '.swiper-pagination': { display: 'flex', @@ -102,6 +126,15 @@ const CSS = { background: theme?.colors?.primary || '#000', }, }, + '.swiper-container-pointer-events': { + touchAction: 'pan-y', + '&.swiper-container-vertical': { + touchAction: 'pan-x', + }, + }, + '.swiper-slide-invisible-blank': { + visibility: 'hidden', + }, }), }; @@ -229,7 +262,6 @@ export const Carousel = observer((properties: CarouselProps): JSX.Element => { {...styling} className={classnames('ss__carousel', vertical ? 'ss__carousel-vertical' : '', className)} > -
.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-container-multirow>.swiper-wrapper{flex-wrap:wrap}.swiper-container-multirow-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-container-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-container-pointer-events{touch-action:pan-y}.swiper-container-pointer-events.swiper-container-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-container-3d{perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-container-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-container-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-container-horizontal.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-container-vertical.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}`; From 340b1f4fd4db15e5d1f6c4d6971dc6fe67dce918 Mon Sep 17 00:00:00 2001 From: Dennis Konieczek Date: Wed, 4 May 2022 12:45:17 -0400 Subject: [PATCH 26/27] fix(snap-preact): move controller import outside of conditional --- packages/snap-preact/src/Snap.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/snap-preact/src/Snap.tsx b/packages/snap-preact/src/Snap.tsx index 7c79f776d..bcec9b31d 100644 --- a/packages/snap-preact/src/Snap.tsx +++ b/packages/snap-preact/src/Snap.tsx @@ -183,9 +183,9 @@ export class Snap { break; } - if (!this.controllers[config.id]) { - const creationFunc: (config: SnapControllerConfigs, services: SnapControllerServices) => Controllers = (await importPromise).default; + const creationFunc: (config: SnapControllerConfigs, services: SnapControllerServices) => Controllers = (await importPromise).default; + if (!this.controllers[config.id]) { this.controllers[config.id] = creationFunc( { url: deepmerge(this.config.url || {}, urlConfig || {}), From f3c1c6149dbfde9f9fa68d6eb79ceb17561f96c0 Mon Sep 17 00:00:00 2001 From: Dennis Konieczek Date: Wed, 4 May 2022 12:58:13 -0400 Subject: [PATCH 27/27] fix(autocompletecontroller): allow queries with spaces to be submitted --- .../snap-controller/src/Autocomplete/AutocompleteController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts index 63828c4cb..0572ec270 100644 --- a/packages/snap-controller/src/Autocomplete/AutocompleteController.ts +++ b/packages/snap-controller/src/Autocomplete/AutocompleteController.ts @@ -89,6 +89,7 @@ export class AutocompleteController extends AbstractController { // cancel search if no input or query doesn't match current urlState if (ac.response.autocomplete.query != ac.controller.urlManager.state.query) { + ac.controller.store.loading = false; return false; } });