diff --git a/jest.config.cjs b/jest.config.cjs index e19fefc..c1090bd 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -5,5 +5,5 @@ module.exports = { transform: { '^.+\\.tsx?$': '@swc/jest', }, - testEnvironment: 'node', + testEnvironment: 'jsdom', }; diff --git a/package.json b/package.json index 0d98a4e..9e53482 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@rollup/plugin-commonjs": "^24.0.1", "@swc/core": "^1.3.37", "@swc/jest": "^0.2.24", + "@testing-library/react": "^14.0.0", "@types/jest": "^29.4.0", "@types/react": "^18.0.28", "@typescript-eslint/eslint-plugin": "^5.54.0", @@ -26,6 +27,7 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-unused-imports": "^2.0.0", "jest": "^29.4.3", + "jest-environment-jsdom": "^29.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", "rollup": "^3.18.0", diff --git a/src/component/sugar/create.ts b/src/component/sugar/create.ts new file mode 100644 index 0000000..2f3756a --- /dev/null +++ b/src/component/sugar/create.ts @@ -0,0 +1,35 @@ +import type { Sugar, SugarObjectNode, SugarUser, SugarUserReshaper } from '.'; +import { SugarDownstreamEventEmitter } from '../../util/events/downstreamEvent'; +import { SugarUpstreamEventEmitter } from '../../util/events/upstreamEvent'; +import type { SugarObject } from '../../util/object'; +import { isSugarObject } from '../../util/object'; +import { useSugar } from './use'; + +export function createEmptySugar(path: string, template: T): Sugar { + const sugar: Sugar = { + path, + mounted: false, + template, + upstream: new SugarUpstreamEventEmitter(), + downstream: new SugarDownstreamEventEmitter(), + use: + (options: SugarUserReshaper) => useSugar(sugar, options), + }; + + if (isSugarObject(template)) { + (sugar as Sugar).useObject = + (options: SugarUser): SugarObjectNode => + useSugar( + sugar as Sugar, + { + ...options, + reshape: { + transform: x => x, + deform: x => x, + }, + }, + ); + } + + return sugar; +} diff --git a/src/component/sugar/dirty.ts b/src/component/sugar/dirty.ts new file mode 100644 index 0000000..b9df5d7 --- /dev/null +++ b/src/component/sugar/dirty.ts @@ -0,0 +1,12 @@ +import type { Sugar } from '.'; +import { debug } from '../../util/logger'; + +export function setDirty(sugar: Sugar, isDirty: boolean): void { + if (!sugar.mounted) { + debug('WARN', `Sugar is not mounted when tried to set dirty. Path: ${sugar.path}`); + return; + } + if (sugar.isDirty === isDirty) return; + sugar.isDirty = isDirty; + sugar.upstream.fire('updateDirty', { isDirty }); +} diff --git a/src/component/sugar/index.ts b/src/component/sugar/index.ts new file mode 100644 index 0000000..3b12293 --- /dev/null +++ b/src/component/sugar/index.ts @@ -0,0 +1,64 @@ +/* eslint-disable @typescript-eslint/no-empty-interface */ +import type { SugarDownstreamEventEmitter } from '../../util/events/downstreamEvent'; +import type { SugarUpstreamEventEmitter } from '../../util/events/upstreamEvent'; +import type { SugarObject } from '../../util/object'; + +export type Sugar = SugarData & ({ + mounted: false, +} | { + mounted: true, + get: () => SugarValue, + set: (value: T) => void, + isDirty: boolean, +}); + +export type SugarData = { + path: string, + template: T, + upstream: SugarUpstreamEventEmitter, + downstream: SugarDownstreamEventEmitter, +} & ( + T extends SugarObject ? + { + use: (options: SugarUserReshaper) => SugarObjectNode, + useObject: (options: SugarUser) => SugarObjectNode + } : { + use: (options: SugarUserReshaper) => SugarObjectNode, + } +); +// ) & ( +// T extends Array ? +// { useArray: (options: SugarUserArray) => SugarArrayNode } : +// Record +// ); + +export type SugarValue = { + success: true, + value: T, +} | { + success: false, + value: unknown, +}; + +export interface SugarUser { + +} + +export interface SugarUserReshaper extends SugarUser { + reshape: { + transform: (value: U) => T, + deform: (value: T) => U, + } +} + +export interface SugarObjectNode { + fields: { [K in keyof U]: Sugar }, +} + +// export interface SugarUserArray { +// +// } +// +// export interface SugarArrayNode { +// +// } diff --git a/src/component/sugar/use.ts b/src/component/sugar/use.ts new file mode 100644 index 0000000..41f6702 --- /dev/null +++ b/src/component/sugar/use.ts @@ -0,0 +1,135 @@ +import type { MutableRefObject } from 'react'; +import { useRef } from 'react'; +import type { Sugar, SugarUserReshaper, SugarObjectNode, SugarValue } from '.'; +import { SugarFormError } from '../../util/error'; +import { debug } from '../../util/logger'; +import type { BetterObjectConstructor, SugarObject } from '../../util/object'; +import { createEmptySugar } from './create'; +import { setDirty } from './dirty'; + +declare const Object: BetterObjectConstructor; + +export function useSugar( + sugar: Sugar, + options: SugarUserReshaper, +): SugarObjectNode { + + const fieldsRef = useRef['fields']>(); + let fields = fieldsRef.current; + + if (sugar.mounted && fields === undefined) { + debug('WARN', 'Sugar is already mounted, but fields are not initialized. Remounting... Path: ${sugar.path}'); + } + + if (sugar.mounted && fields !== undefined) { + debug('WARN', `Sugar is already mounted. Path: ${sugar.path}`); + } else { + debug('DEBUG', `Mounting sugar. Path: ${sugar.path}`); + const mounted = mountSugar(sugar, options, fieldsRef); + fields = mounted.fields; + fieldsRef.current = fields; + } + + return { + fields, + }; +} + +export function mountSugar( + sugar: Sugar, + options: SugarUserReshaper, + fieldsRef: MutableRefObject['fields'] | undefined>, +): SugarObjectNode { + const template = options.reshape.deform(sugar.template); + debug('DEBUG', `Template: ${JSON.stringify(template)}`); + + const fields = wrapSugar(sugar.path, template); + + const getter = (): SugarValue => { + const fields = fieldsRef.current; + if (fields === undefined) throw new SugarFormError('SF0021', `Path: ${sugar.path}}`); + const value = get(fields); + debug('DEBUG', `Getting Value of Sugar: ${JSON.stringify(value)}, Path: ${sugar.path}`); + return !value.success ? value : { + success: true, + value: options.reshape.transform(value.value), + }; + }; + + const setter = (value: T): void => { + debug('DEBUG', `Setting value of sugar. Path: ${sugar.path}`); + const fields = fieldsRef.current; + if (fields === undefined) throw new SugarFormError('SF0021', `Path: ${sugar.path}}`); + set(fields, options.reshape.deform(value)); + }; + + const dirtyControl = ({ isDirty }: { isDirty: boolean }) : void => { + const fields = fieldsRef.current; + if (!sugar.mounted || fields === undefined) throw new SugarFormError('SF0021', `Path: ${sugar.path}}`); + if (isDirty) { + if (sugar.isDirty) return; + setDirty(sugar, true); + } else { + if (Object.values(fields).some(s => s.mounted && s.isDirty)) return; + setDirty(sugar, false); + } + }; + + Object.values(fields).forEach(sugar => sugar.upstream.listen('updateDirty', dirtyControl)); + + const updateSugar = sugar as Sugar & { mounted: true }; + updateSugar.mounted = true; + updateSugar.get = getter; + updateSugar.set = setter; + updateSugar.isDirty = false; + + return { fields }; +} + + +export function wrapSugar(path: string, template: T): SugarObjectNode['fields'] { + const fields: SugarObjectNode['fields'] = {} as SugarObjectNode['fields']; + + for (const key in template) { + fields[key] = createEmptySugar(`${path}.${key}`, template[key]); + } + + return fields; +} + +export function get(fields: SugarObjectNode['fields']): SugarValue { + const result = {} as { [P in keyof T]: unknown }; + let success = true; + + for (const key in fields) { + const sugar = fields[key]; + if (!sugar.mounted) { + debug('WARN', `Sugar is not mounted when tried to get. Path: ${sugar.path}`); + result[key] = null; + success = false; + } else { + const value = sugar.get(); + result[key] = value.value; + success &&= value.success; + } + } + + return success ? { + success, + value: result as T, + } : { + success, + value: result, + }; +} + +export function set(fields: SugarObjectNode['fields'], value: T): void { + for (const key in fields) { + const sugar = fields[key]; + if (!sugar.mounted) { + debug('WARN', `Sugar is not mounted when tried to set. Path: ${sugar.path}`); + } else { + sugar.set(value[key]); + } + } +} diff --git a/src/index.ts b/src/index.ts index d4da413..f4ab23c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,2 @@ -export function helloSugarForm(): void { - console.log('Hello, Sugar Form!'); - return; -} +export type { Sugar } from './component/sugar'; +export { setSugarFormLogLevel } from './util/logger'; diff --git a/src/util/error.ts b/src/util/error.ts new file mode 100644 index 0000000..b3307f7 --- /dev/null +++ b/src/util/error.ts @@ -0,0 +1,35 @@ +const SugarFormErrorMap = [ + { + code: 'SF0001', + name: 'TypeMismatch', + message: 'Incorrect type detected.\nThis may be a bug in SugarForm itself. It would be helpful if you could post the stack trace to GitHub.', + }, + { + code: 'SF0002', + name: 'DifferentFromTypeDefinition', + message: 'Incorrect type detected.\nIt is believed that the code does not follow TypeScript type annotations.', + }, + { + code: 'SF0011', + name: 'Not Implemented', + message: 'This feature is not implemented yet.', + }, + { + code: 'SF0021', + name: 'RequestValueToUnmoutedSugar', + message: 'Sugar was forced unmounted from outside.', + }, +] as const; + +export class SugarFormError extends Error { + constructor(id: (typeof SugarFormErrorMap)[number]['code'], message?: string) { + const error = SugarFormErrorMap.find(e => e.code === id) ?? { + code: 'SF9999', + name: 'SugarFormUnknownError', + message: 'Unknown error occured.', + }; + super(`${error.code} (${error.name})\n${error.message}${message !== undefined ? `\ninfo for debug: ${message}` : ''}`); + this.name = new.target.name; + Error.captureStackTrace(this, this.constructor); + } +} diff --git a/src/util/event.ts b/src/util/event.ts new file mode 100644 index 0000000..2962802 --- /dev/null +++ b/src/util/event.ts @@ -0,0 +1,27 @@ +import { SugarFormError } from './error'; + +export class SugarEventEmitter>> { + private listeners: Partial< + Record void>> + > = {}; + + + public listen( + eventName: K, callback: (param: EventTable[K]) => void, + ): void { + if (!this.listeners[eventName]) { + this.listeners[eventName] = []; + } + const listener: Array<(param: EventTable[K]) => void> | undefined = this.listeners[eventName]; + if (listener === undefined) { + throw new SugarFormError('SF0001', 'SugarEventEmitter#listen'); + } + listener.push(callback); + } + + public fire(eventName: K, param: EventTable[K]): void { + const listener: Array<(param: EventTable[K]) => void> | undefined = this.listeners[eventName]; + if (listener === undefined) return; + listener.forEach(l => l(param)); + } +} diff --git a/src/util/events/downstreamEvent.ts b/src/util/events/downstreamEvent.ts new file mode 100644 index 0000000..f74672e --- /dev/null +++ b/src/util/events/downstreamEvent.ts @@ -0,0 +1,3 @@ +import { SugarEventEmitter } from '../event'; + +export class SugarDownstreamEventEmitter extends SugarEventEmitter> {} diff --git a/src/util/events/upstreamEvent.ts b/src/util/events/upstreamEvent.ts new file mode 100644 index 0000000..adae87b --- /dev/null +++ b/src/util/events/upstreamEvent.ts @@ -0,0 +1,6 @@ +import { SugarEventEmitter } from '../event'; + +export class SugarUpstreamEventEmitter extends SugarEventEmitter<{ + updateDirty: { isDirty: boolean }, + mounted: Record, +}> {} diff --git a/src/util/logger.ts b/src/util/logger.ts new file mode 100644 index 0000000..4980972 --- /dev/null +++ b/src/util/logger.ts @@ -0,0 +1,24 @@ +/* eslint-disable no-console */ +type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'SILENT'; +let SugarFormLogLevel: LogLevel = 'SILENT'; +export function setSugarFormLogLevel(level: LogLevel): void { + SugarFormLogLevel = level; +} + +export function debug(level: LogLevel, message: string): void { + if (SugarFormLogLevel === 'SILENT') return; + if (level === 'WARN') { + console.warn(message); + return; + } + if (SugarFormLogLevel === 'WARN') return; + if (level === 'INFO') { + console.info(message); + return; + } + if (SugarFormLogLevel === 'INFO') return; + if (level === 'DEBUG') { + console.debug(message); + return; + } +} diff --git a/src/util/object.ts b/src/util/object.ts new file mode 100644 index 0000000..7592eb0 --- /dev/null +++ b/src/util/object.ts @@ -0,0 +1,8 @@ +export type SugarObject = Record; +export function isSugarObject(obj: unknown): obj is SugarObject { + return obj?.constructor.name === 'Object'; +} + +export declare interface BetterObjectConstructor extends ObjectConstructor { + values(obj: T): Array; +} diff --git a/tests/event.test.ts b/tests/event.test.ts new file mode 100644 index 0000000..d959fc7 --- /dev/null +++ b/tests/event.test.ts @@ -0,0 +1,47 @@ +import { describe, it } from '@jest/globals'; +import { SugarEventEmitter } from '../src/util/event'; + +class TestEventEmitter extends SugarEventEmitter<{ + test: { a: number, b: number }, + sub: { c: string, d: boolean }, +}> {} + +describe('event/SugarEventEmitter', () => { + + it('should called listener', () => { + const emitter = new TestEventEmitter(); + const listener = jest.fn(); + emitter.listen('test', listener); + emitter.fire('test', { a: 1, b: 2 }); + expect(listener).toHaveBeenCalledTimes(1); + expect(listener).toHaveBeenCalledWith({ a: 1, b: 2 }); + }); + + it('should work with multiple listener', () => { + const emitter = new TestEventEmitter(); + const listener1 = jest.fn(); + const listener2 = jest.fn(); + emitter.listen('test', listener1); + emitter.listen('test', listener2); + emitter.fire('test', { a: 1, b: 2 }); + expect(listener1).toHaveBeenCalledTimes(1); + expect(listener1).toHaveBeenCalledWith({ a: 1, b: 2 }); + expect(listener2).toHaveBeenCalledTimes(1); + expect(listener2).toHaveBeenCalledWith({ a: 1, b: 2 }); + }); + + it('should work with multiple event', () => { + const emitter = new TestEventEmitter(); + const listener1 = jest.fn(); + const listener2 = jest.fn(); + emitter.listen('test', listener1); + emitter.listen('sub', listener2); + emitter.fire('test', { a: 1, b: 2 }); + emitter.fire('sub', { c: 'foo', d: true }); + expect(listener1).toHaveBeenCalledTimes(1); + expect(listener1).toHaveBeenCalledWith({ a: 1, b: 2 }); + expect(listener2).toHaveBeenCalledTimes(1); + expect(listener2).toHaveBeenCalledWith({ c: 'foo', d: true }); + }); + +}); diff --git a/tests/logger.test.ts b/tests/logger.test.ts new file mode 100644 index 0000000..ff5e89c --- /dev/null +++ b/tests/logger.test.ts @@ -0,0 +1,51 @@ +import { debug, setSugarFormLogLevel } from '../src/util/logger'; +import { describe, it } from '@jest/globals'; + +describe('logger', () => { + it('should follow log level', () => { + + const [ infoMock, warnMock, debugMock ] = [ jest.fn(), jest.fn(), jest.fn() ]; + global.console.info = infoMock; + global.console.warn = warnMock; + global.console.debug = debugMock; + + setSugarFormLogLevel('SILENT'); + debug('DEBUG', 'debug'); + debug('INFO', 'info'); + debug('WARN', 'warn'); + expect(debugMock).toHaveBeenCalledTimes(0); + expect(infoMock).toHaveBeenCalledTimes(0); + expect(warnMock).toHaveBeenCalledTimes(0); + + setSugarFormLogLevel('WARN'); + debug('DEBUG', 'debug'); + debug('INFO', 'info'); + debug('WARN', 'warn'); + expect(debugMock).toHaveBeenCalledTimes(0); + expect(infoMock).toHaveBeenCalledTimes(0); + expect(warnMock).toHaveBeenCalledTimes(1); + expect(warnMock).toHaveBeenCalledWith('warn'); + + setSugarFormLogLevel('INFO'); + debug('DEBUG', 'debug'); + debug('INFO', 'info'); + debug('WARN', 'warn'); + expect(debugMock).toHaveBeenCalledTimes(0); + expect(infoMock).toHaveBeenCalledTimes(1); + expect(infoMock).toHaveBeenCalledWith('info'); + expect(warnMock).toHaveBeenCalledTimes(2); + expect(warnMock).toHaveBeenLastCalledWith('warn'); + + setSugarFormLogLevel('DEBUG'); + debug('DEBUG', 'debug'); + debug('INFO', 'info'); + debug('WARN', 'warn'); + expect(debugMock).toHaveBeenCalledTimes(1); + expect(debugMock).toHaveBeenCalledWith('debug'); + expect(infoMock).toHaveBeenCalledTimes(2); + expect(infoMock).toHaveBeenLastCalledWith('info'); + expect(warnMock).toHaveBeenCalledTimes(3); + expect(warnMock).toHaveBeenLastCalledWith('warn'); + + }); +}); diff --git a/tests/object.test.ts b/tests/object.test.ts new file mode 100644 index 0000000..7432999 --- /dev/null +++ b/tests/object.test.ts @@ -0,0 +1,41 @@ +import { isSugarObject } from '../src/util/object'; +import { describe, it } from '@jest/globals'; + +describe('object/isSugarObject', () => { + + it('should return true for a plain object', () => { + expect(isSugarObject({})).toBe(true); + expect(isSugarObject({ a: 1 })).toBe(true); + expect(isSugarObject({ a: 1, b: 2 })).toBe(true); + expect(isSugarObject({ + a: 1, + b: { c: 3, d: 4 }, + })).toBe(true); + }); + + it('should return false for a non-object', () => { + expect(isSugarObject(null)).toBe(false); + expect(isSugarObject(undefined)).toBe(false); + expect(isSugarObject(1)).toBe(false); + expect(isSugarObject('hello')).toBe(false); + expect(isSugarObject(true)).toBe(false); + }); + + it('should return false for a non-plain object', () => { + expect(isSugarObject(new Date())).toBe(false); + expect(isSugarObject(new Error())).toBe(false); + expect(isSugarObject(new Map())).toBe(false); + expect(isSugarObject(new Set())).toBe(false); + expect(isSugarObject(new RegExp(''))).toBe(false); + expect(isSugarObject(new String(''))).toBe(false); + expect(isSugarObject(new Number(0))).toBe(false); + expect(isSugarObject(new Boolean(false))).toBe(false); + }); + + it('should return false for an array', () => { + expect(isSugarObject([])).toBe(false); + expect(isSugarObject([ 1, 2, 3 ])).toBe(false); + expect(isSugarObject([ 1, '2', true ])).toBe(false); + }); + +}); diff --git a/tests/sugarUse.test.ts b/tests/sugarUse.test.ts new file mode 100644 index 0000000..946500c --- /dev/null +++ b/tests/sugarUse.test.ts @@ -0,0 +1,113 @@ +import { wrapSugar } from '../src/component/sugar/use'; +import { describe, it } from '@jest/globals'; +import type { Sugar, SugarValue } from '../src/component/sugar'; +import { SugarDownstreamEventEmitter } from '../src/util/events/downstreamEvent'; +import { SugarUpstreamEventEmitter } from '../src/util/events/upstreamEvent'; +import { renderHook } from '@testing-library/react'; + +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ + +describe('wrapSugar', () => { + it('should work', () => { + const original = { + a: { b: 'foo', c: 'bar' }, + d: 3, + }; + const wrapped = wrapSugar('foo', original); + const expected: { + a: Sugar<{ b: string, c: string }>, + d: Sugar, + } = { + a: { + mounted: false, + path: 'foo.a', + template: { b: 'foo', c: 'bar' }, + upstream: expect.any(SugarUpstreamEventEmitter), + downstream: expect.any(SugarDownstreamEventEmitter), + use: expect.any(Function), + useObject: expect.any(Function), + }, + d: { + mounted: false, + path: 'foo.d', + template: 3, + upstream: expect.any(SugarUpstreamEventEmitter), + downstream: expect.any(SugarDownstreamEventEmitter), + use: expect.any(Function), + }, + }; + + expect(wrapped).toStrictEqual(expected); + }); +}); + +/* eslint-disable-next-line max-lines-per-function */ +describe('useObject', () => { + + it('should make children with useObject', () => { + const original = { + a: { b: 'foo', c: 'bar' }, + }; + const wrapped = wrapSugar('foo', original); + const { result: { current: { fields } } } = renderHook(() => wrapped.a.useObject({})); + const expected = { + b: { + mounted: false, + path: 'foo.a.b', + template: 'foo', + upstream: expect.any(SugarUpstreamEventEmitter), + downstream: expect.any(SugarDownstreamEventEmitter), + use: expect.any(Function), + }, + c: { + mounted: false, + path: 'foo.a.c', + template: 'bar', + upstream: expect.any(SugarUpstreamEventEmitter), + downstream: expect.any(SugarDownstreamEventEmitter), + use: expect.any(Function), + }, + }; + + expect(fields).toStrictEqual(expected); + }); + + it('should get/set/isDirty work', () => { + const original = { + a: { b: 'foo', c: 'bar' }, + }; + const wrapped = wrapSugar('foo', original); + const { result: { current: { fields } } } = renderHook(() => wrapped.a.useObject({})); + + const setterOfB = jest.fn(data => fields.b.upstream.fire('updateDirty', { isDirty: data !== 'foo' })); + fields.b = { + ...fields.b, + mounted: true, + get: (): SugarValue => ({ success: true, value: 'foo' }), + set: setterOfB, + isDirty: false, + }; + + const setterOfC = jest.fn(); + fields.c = { + ...fields.c, + mounted: true, + get: (): SugarValue => ({ success: true, value: 'bar' }), + set: setterOfC, + isDirty: false, + }; + + expect(wrapped.a.mounted).toBe(true); + expect(wrapped.a.mounted && wrapped.a.isDirty).toBe(false); + expect(wrapped.a.mounted && wrapped.a.get()).toStrictEqual({ success: true, value: { b: 'foo', c: 'bar' } }); + expect(wrapped.a.mounted && wrapped.a.isDirty).toBe(false); + wrapped.a.mounted && wrapped.a.set({ b: 'baz', c: 'qux' }); + expect(wrapped.a.mounted && wrapped.a.isDirty).toBe(true); + expect(setterOfB).toHaveBeenCalledWith('baz'); + expect(setterOfC).toHaveBeenCalledWith('qux'); + wrapped.a.mounted && wrapped.a.set({ b: 'foo', c: 'bar' }); + expect(wrapped.a.mounted && wrapped.a.isDirty).toBe(false); + + }); + +}); diff --git a/yarn.lock b/yarn.lock index f471dbd..c6527d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,7 +15,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" dependencies: @@ -363,6 +363,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.12.5": + version: 7.21.0 + resolution: "@babel/runtime@npm:7.21.0" + dependencies: + regenerator-runtime: ^0.13.11 + checksum: 7b33e25bfa9e0e1b9e8828bb61b2d32bdd46b41b07ba7cb43319ad08efc6fda8eb89445193e67d6541814627df0ca59122c0ea795e412b99c5183a0540d338ab + languageName: node + linkType: hard + "@babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" @@ -578,6 +587,18 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/environment@npm:29.5.0" + dependencies: + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-mock: ^29.5.0 + checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a + languageName: node + linkType: hard + "@jest/expect-utils@npm:^29.4.3": version: 29.4.3 resolution: "@jest/expect-utils@npm:29.4.3" @@ -611,6 +632,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/fake-timers@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee + languageName: node + linkType: hard + "@jest/globals@npm:^29.4.3": version: 29.4.3 resolution: "@jest/globals@npm:29.4.3" @@ -754,6 +789,20 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" + dependencies: + "@jest/schemas": ^29.4.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.1.0": version: 0.1.1 resolution: "@jridgewell/gen-mapping@npm:0.1.1" @@ -940,6 +989,7 @@ __metadata: "@rollup/plugin-commonjs": ^24.0.1 "@swc/core": ^1.3.37 "@swc/jest": ^0.2.24 + "@testing-library/react": ^14.0.0 "@types/jest": ^29.4.0 "@types/react": ^18.0.28 "@typescript-eslint/eslint-plugin": ^5.54.0 @@ -950,6 +1000,7 @@ __metadata: eslint-plugin-react: ^7.32.2 eslint-plugin-unused-imports: ^2.0.0 jest: ^29.4.3 + jest-environment-jsdom: ^29.5.0 react: ^18.2.0 react-dom: ^18.2.0 rollup: ^3.18.0 @@ -1089,6 +1140,36 @@ __metadata: languageName: node linkType: hard +"@testing-library/dom@npm:^9.0.0": + version: 9.0.1 + resolution: "@testing-library/dom@npm:9.0.1" + dependencies: + "@babel/code-frame": ^7.10.4 + "@babel/runtime": ^7.12.5 + "@types/aria-query": ^5.0.1 + aria-query: ^5.0.0 + chalk: ^4.1.0 + dom-accessibility-api: ^0.5.9 + lz-string: ^1.5.0 + pretty-format: ^27.0.2 + checksum: fa3d4097d0efd3b186d90e32ffa71c3f9c4ea7a5a793b186b565044b2950eea469594e1f75803e5edb52a75731feecd19cf7034b009b0bd3bfba173eb9c9cd0c + languageName: node + linkType: hard + +"@testing-library/react@npm:^14.0.0": + version: 14.0.0 + resolution: "@testing-library/react@npm:14.0.0" + dependencies: + "@babel/runtime": ^7.12.5 + "@testing-library/dom": ^9.0.0 + "@types/react-dom": ^18.0.0 + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 4a54c8f56cc4a39b50803205f84f06280bb76521d6d5d4b3b36651d760c7c7752ef142d857d52aaf4fad4848ed7a8be49afc793a5dda105955d2f8bef24901ac + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -1124,6 +1205,13 @@ __metadata: languageName: node linkType: hard +"@types/aria-query@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/aria-query@npm:5.0.1" + checksum: 69fd7cceb6113ed370591aef04b3fd0742e9a1b06dd045c43531448847b85de181495e4566f98e776b37c422a12fd71866e0a1dfd904c5ec3f84d271682901de + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.0 resolution: "@types/babel__core@npm:7.20.0" @@ -1216,6 +1304,17 @@ __metadata: languageName: node linkType: hard +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -1251,7 +1350,16 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.0.28": +"@types/react-dom@npm:^18.0.0": + version: 18.0.11 + resolution: "@types/react-dom@npm:18.0.11" + dependencies: + "@types/react": "*" + checksum: 579691e4d5ec09688087568037c35edf8cfb1ab3e07f6c60029280733ee7b5c06d66df6fcc90786702c93ac8cb13bc7ff16c79ddfc75d082938fbaa36e1cdbf4 + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^18.0.28": version: 18.0.28 resolution: "@types/react@npm:18.0.28" dependencies: @@ -1283,6 +1391,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.2 + resolution: "@types/tough-cookie@npm:4.0.2" + checksum: e055556ffdaa39ad85ede0af192c93f93f986f4bd9e9426efdc2948e3e2632db3a4a584d4937dbf6d7620527419bc99e6182d3daf2b08685e710f2eda5291905 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -1429,6 +1544,13 @@ __metadata: languageName: node linkType: hard +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -1436,6 +1558,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -1445,14 +1577,14 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.8.0": +"acorn@npm:^8.1.0, acorn@npm:^8.4.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1": version: 8.8.2 resolution: "acorn@npm:8.8.2" bin: @@ -1594,6 +1726,15 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.0.0": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: ^2.0.5 + checksum: 929ff95f02857b650fb4cbcd2f41072eee2f46159a6605ea03bf63aa572e35ffdff43d69e815ddc462e16e07de8faba3978afc2813650b4448ee18c9895d982b + languageName: node + linkType: hard + "array-includes@npm:^3.1.5, array-includes@npm:^3.1.6": version: 3.1.6 resolution: "array-includes@npm:3.1.6" @@ -1651,6 +1792,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -1874,7 +2022,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -1985,6 +2133,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -2038,6 +2195,29 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: ~0.3.6 + checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.1 resolution: "csstype@npm:3.1.1" @@ -2045,6 +2225,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -2066,6 +2257,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + "dedent@npm:^0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -2073,7 +2271,32 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": +"deep-equal@npm:^2.0.5": + version: 2.2.0 + resolution: "deep-equal@npm:2.2.0" + dependencies: + call-bind: ^1.0.2 + es-get-iterator: ^1.1.2 + get-intrinsic: ^1.1.3 + is-arguments: ^1.1.1 + is-array-buffer: ^3.0.1 + is-date-object: ^1.0.5 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + isarray: ^2.0.5 + object-is: ^1.1.5 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + side-channel: ^1.0.4 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.1 + which-typed-array: ^1.1.9 + checksum: 46a34509d2766d6c6dc5aec4756089cf0cc137e46787e91f08f1ee0bb570d874f19f0493146907df0cf18aed4a7b4b50f6f62c899240a76c323f057528b122e3 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 @@ -2097,6 +2320,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -2159,6 +2389,22 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 005eb283caef57fc1adec4d5df4dd49189b628f2f575af45decb210e04d634459e3f1ee64f18b41e2dcf200c844bc1d9279d80807e686a30d69a4756151ad248 + languageName: node + linkType: hard + +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.284": version: 1.4.320 resolution: "electron-to-chromium@npm:1.4.320" @@ -2189,6 +2435,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.4.0 + resolution: "entities@npm:4.4.0" + checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -2253,6 +2506,23 @@ __metadata: languageName: node linkType: hard +"es-get-iterator@npm:^1.1.2": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + has-symbols: ^1.0.3 + is-arguments: ^1.1.1 + is-map: ^2.0.2 + is-set: ^2.0.2 + is-string: ^1.0.7 + isarray: ^2.0.5 + stop-iteration-iterator: ^1.0.0 + checksum: 8fa118da42667a01a7c7529f8a8cca514feeff243feec1ce0bb73baaa3514560bd09d2b3438873cf8a5aaec5d52da248131de153b28e2638a061b6e4df13267d + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.1 resolution: "es-set-tostringtag@npm:2.0.1" @@ -2312,6 +2582,25 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.0.0": + version: 2.0.0 + resolution: "escodegen@npm:2.0.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.7": version: 0.3.7 resolution: "eslint-import-resolver-node@npm:0.3.7" @@ -2530,7 +2819,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -2650,7 +2939,7 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": +"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c @@ -2739,6 +3028,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -3048,6 +3348,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -3073,7 +3382,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -3099,7 +3408,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -3193,6 +3502,16 @@ __metadata: languageName: node linkType: hard +"is-arguments@npm:^1.1.1": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 + languageName: node + linkType: hard + "is-array-buffer@npm:^3.0.1": version: 3.0.2 resolution: "is-array-buffer@npm:3.0.2" @@ -3246,7 +3565,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -3292,6 +3611,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -3322,6 +3648,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + "is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" @@ -3341,6 +3674,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -3388,6 +3728,13 @@ __metadata: languageName: node linkType: hard +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -3397,6 +3744,23 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -3592,6 +3956,27 @@ __metadata: languageName: node linkType: hard +"jest-environment-jsdom@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-environment-jsdom@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/jsdom": ^20.0.0 + "@types/node": "*" + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + jsdom: ^20.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 3df7fc85275711f20b483ac8cd8c04500704ed0f69791eb55c574b38f5a39470f03d775cf20c1025bc1884916ac0573aa2fa4db1bb74225bc7fdd95ba97ad0da + languageName: node + linkType: hard + "jest-environment-node@npm:^29.4.3": version: 29.4.3 resolution: "jest-environment-node@npm:29.4.3" @@ -3675,6 +4060,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-message-util@npm:29.5.0" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.5.0 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.5.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf + languageName: node + linkType: hard + "jest-mock@npm:^29.4.3": version: 29.4.3 resolution: "jest-mock@npm:29.4.3" @@ -3686,6 +4088,17 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-mock@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-util: ^29.5.0 + checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" @@ -3837,6 +4250,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-util@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 + languageName: node + linkType: hard + "jest-validate@npm:^29.4.3": version: 29.4.3 resolution: "jest-validate@npm:29.4.3" @@ -3935,6 +4362,45 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -4026,6 +4492,16 @@ __metadata: languageName: node linkType: hard +"levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -4094,6 +4570,15 @@ __metadata: languageName: node linkType: hard +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 1ee98b4580246fd90dd54da6e346fb1caefcf05f677c686d9af237a157fdea3fd7c83a4bc58f858cd5b10a34d27afe0fdcbd0505a47e0590726a873dc8b8f65d + languageName: node + linkType: hard + "magic-string@npm:^0.27.0": version: 0.27.0 resolution: "magic-string@npm:0.27.0" @@ -4185,6 +4670,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -4411,6 +4912,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.2": + version: 2.2.2 + resolution: "nwsapi@npm:2.2.2" + checksum: 43769106292bc95f776756ca2f3513dab7b4d506a97c67baec32406447841a35f65f29c1f95ab5d42785210fd41668beed33ca16fa058780be43b101ad73e205 + languageName: node + linkType: hard + "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -4425,6 +4933,16 @@ __metadata: languageName: node linkType: hard +"object-is@npm:^1.1.5": + version: 1.1.5 + resolution: "object-is@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe + languageName: node + linkType: hard + "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -4505,6 +5023,20 @@ __metadata: languageName: node linkType: hard +"optionator@npm:^0.8.1": + version: 0.8.3 + resolution: "optionator@npm:0.8.3" + dependencies: + deep-is: ~0.1.3 + fast-levenshtein: ~2.0.6 + levn: ~0.3.0 + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + word-wrap: ~1.2.3 + checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + languageName: node + linkType: hard + "optionator@npm:^0.9.1": version: 0.9.1 resolution: "optionator@npm:0.9.1" @@ -4592,6 +5124,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -4664,6 +5205,24 @@ __metadata: languageName: node linkType: hard +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 + languageName: node + linkType: hard + +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: ^5.0.1 + ansi-styles: ^5.0.0 + react-is: ^17.0.1 + checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 + languageName: node + linkType: hard + "pretty-format@npm:^29.0.0, pretty-format@npm:^29.4.3": version: 29.4.3 resolution: "pretty-format@npm:29.4.3" @@ -4675,6 +5234,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" + dependencies: + "@jest/schemas": ^29.4.3 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -4713,13 +5283,27 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"psl@npm:^1.1.33": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.3.0 resolution: "punycode@npm:2.3.0" checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -4746,6 +5330,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8 + languageName: node + linkType: hard + "react-is@npm:^18.0.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" @@ -4773,6 +5364,13 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.13.11": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.4.3": version: 1.4.3 resolution: "regexp.prototype.flags@npm:1.4.3" @@ -4798,6 +5396,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -4983,6 +5588,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.23.0": version: 0.23.0 resolution: "scheduler@npm:0.23.0" @@ -5105,7 +5719,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -5137,6 +5751,15 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: ^1.0.4 + checksum: d04173690b2efa40e24ab70e5e51a3ff31d56d699550cfad084104ab3381390daccb36652b25755e420245f3b0737de66c1879eaa2a8d4fc0a78f9bf892fcb42 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -5276,6 +5899,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.13 resolution: "tar@npm:6.1.13" @@ -5331,6 +5961,27 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^4.1.2": + version: 4.1.2 + resolution: "tough-cookie@npm:4.1.2" + dependencies: + psl: ^1.1.33 + punycode: ^2.1.1 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: a7359e9a3e875121a84d6ba40cc184dec5784af84f67f3a56d1d2ae39b87c0e004e6ba7c7331f9622a7d2c88609032473488b28fe9f59a1fec115674589de39a + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" @@ -5415,6 +6066,15 @@ __metadata: languageName: node linkType: hard +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: ~1.1.2 + checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + languageName: node + linkType: hard + "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -5497,6 +6157,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.0.10": version: 1.0.10 resolution: "update-browserslist-db@npm:1.0.10" @@ -5520,6 +6187,16 @@ __metadata: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -5545,6 +6222,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -5554,6 +6240,39 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -5567,6 +6286,18 @@ __metadata: languageName: node linkType: hard +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "which-typed-array@npm:1.1.9" @@ -5601,7 +6332,7 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3": +"word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f @@ -5636,6 +6367,35 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.11.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8"