From 44f025b3597de89f1258aea0a8b03481aa38f1b6 Mon Sep 17 00:00:00 2001 From: arc-alex Date: Fri, 3 Nov 2023 14:23:25 +0100 Subject: [PATCH 01/23] update node-osc to v9 --- apps/server/package.json | 4 +-- apps/server/src/adapters/OscAdapter.ts | 3 +- pnpm-lock.yaml | 47 ++++++++++++++------------ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index ef572878c..7cf084cb7 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -14,7 +14,7 @@ "express-validator": "^6.14.2", "lowdb": "^5.0.5", "multer": "^1.4.5-lts.1", - "node-osc": "^8.0.10", + "node-osc": "^9.0.2", "node-xlsx": "^0.21.0", "ontime-utils": "workspace:*", "passport": "^0.6.0", @@ -25,7 +25,7 @@ "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^16.11.7", - "@types/node-osc": "^6.0.0", + "@types/node-osc": "^6.0.2", "@types/websocket": "^1.0.5", "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", diff --git a/apps/server/src/adapters/OscAdapter.ts b/apps/server/src/adapters/OscAdapter.ts index ab7478789..c74f1da2b 100644 --- a/apps/server/src/adapters/OscAdapter.ts +++ b/apps/server/src/adapters/OscAdapter.ts @@ -5,6 +5,7 @@ import { Server } from 'node-osc'; import { IAdapter } from './IAdapter.js'; import { dispatchFromAdapter } from '../controllers/integrationController.js'; import { logger } from '../classes/Logger.js'; +import { error } from 'console'; export class OscServer implements IAdapter { private readonly osc: Server; @@ -12,7 +13,7 @@ export class OscServer implements IAdapter { constructor(config: OSCSettings) { this.osc = new Server(config.portIn, '0.0.0.0'); - this.osc.on('error', console.error); + this.osc.on('error', (error) => logger.error(LogOrigin.Rx, `OSC IN: ${error}`)); this.osc.on('message', (msg) => { // message should look like /ontime/{path}/{params?} {args} where diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4e5eaee7..b673b4f4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,7 +171,7 @@ importers: specifiers: '@types/express': ^4.17.17 '@types/node': ^16.11.7 - '@types/node-osc': ^6.0.0 + '@types/node-osc': ^6.0.2 '@types/websocket': ^1.0.5 '@typescript-eslint/eslint-plugin': ^5.48.1 '@typescript-eslint/parser': ^5.48.1 @@ -187,7 +187,7 @@ importers: express-validator: ^6.14.2 lowdb: ^5.0.5 multer: ^1.4.5-lts.1 - node-osc: ^8.0.10 + node-osc: ^9.0.2 node-xlsx: ^0.21.0 nodemon: ^2.0.20 ontime-types: workspace:* @@ -211,7 +211,7 @@ importers: express-validator: 6.14.2 lowdb: 5.0.5 multer: 1.4.5-lts.1 - node-osc: 8.0.10 + node-osc: 9.0.2 node-xlsx: 0.21.0 ontime-utils: link:../../packages/utils passport: 0.6.0 @@ -221,7 +221,7 @@ importers: devDependencies: '@types/express': 4.17.17 '@types/node': 16.18.11 - '@types/node-osc': 6.0.0 + '@types/node-osc': 6.0.2 '@types/websocket': 1.0.5 '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe @@ -2082,7 +2082,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 18.16.16 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true @@ -2652,7 +2652,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/cacheable-request/6.0.3: @@ -2660,7 +2660,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.15.11 + '@types/node': 18.16.16 '@types/responselike': 1.0.0 dev: true @@ -2693,7 +2693,7 @@ packages: /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/debug/4.1.7: @@ -2709,7 +2709,7 @@ packages: /@types/express-serve-static-core/4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -2726,7 +2726,7 @@ packages: /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/glob/7.2.0: @@ -2734,7 +2734,7 @@ packages: requiresBuild: true dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true optional: true @@ -2772,7 +2772,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/lodash.mergewith/4.6.7: @@ -2802,8 +2802,10 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/node-osc/6.0.0: - resolution: {integrity: sha512-25DwJOFe1KueUZz2oIURT3qCMQ28Jdvy9JqGz8d0mKM1Mlx0agHD9N3S0hMKajVCjw7TGtf3gGjbl5gDCFfIWQ==} + /@types/node-osc/6.0.2: + resolution: {integrity: sha512-/TxCH+NlDoI3hFA6b2O91dpnPAqBDkLb2HEIv5hMVdKnCiWTdJJv2sVnQdX38sBgnals8TjCQEGii+OcMVf2fg==} + dependencies: + '@types/node': 18.16.16 dev: true /@types/node/16.18.11: @@ -2833,7 +2835,7 @@ packages: resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} requiresBuild: true dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 xmlbuilder: 15.1.1 dev: true optional: true @@ -2865,7 +2867,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/scheduler/0.16.2: @@ -2879,7 +2881,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true /@types/stack-utils/2.0.1: @@ -2918,7 +2920,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 18.15.11 + '@types/node': 18.16.16 dev: true optional: true @@ -3493,6 +3495,7 @@ packages: /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + requiresBuild: true dev: true optional: true @@ -5821,7 +5824,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.15.11 + '@types/node': 18.16.16 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.11 @@ -6278,9 +6281,9 @@ packages: whatwg-url: 5.0.0 dev: true - /node-osc/8.0.10: - resolution: {integrity: sha512-Lr4HdSh59V7+Tm6HfVfHoRpAbjCTdRvsm3Q7wcEb9BbVAqaDjEgvnelA1fIZa5MBRic9rHZAIPs6xzeuvKH1ng==} - engines: {node: ^14.18 || ^16.13 || >=18} + /node-osc/9.0.2: + resolution: {integrity: sha512-q+VQL7DMWRL5+yvzRlWVig8BD9raotLs6onHU4e8MaFgxmYuIwcXhsvQeyUZFiKP6y/qGUXU6K0T99gVmISwmA==} + engines: {node: ^18.17.0 || >=20.5.0} dependencies: osc-min: 1.1.2 dev: false From f57faf1837ca6f875d2e87673f325b501f2c98c8 Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Fri, 3 Nov 2023 15:28:42 +0100 Subject: [PATCH 02/23] remove unnecessary import --- apps/server/src/adapters/OscAdapter.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/server/src/adapters/OscAdapter.ts b/apps/server/src/adapters/OscAdapter.ts index c74f1da2b..6bbdc0a7b 100644 --- a/apps/server/src/adapters/OscAdapter.ts +++ b/apps/server/src/adapters/OscAdapter.ts @@ -5,7 +5,6 @@ import { Server } from 'node-osc'; import { IAdapter } from './IAdapter.js'; import { dispatchFromAdapter } from '../controllers/integrationController.js'; import { logger } from '../classes/Logger.js'; -import { error } from 'console'; export class OscServer implements IAdapter { private readonly osc: Server; From 98bd320cbd7daa2f6b5d123809dbdaf400bb4247 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sun, 5 Nov 2023 09:47:55 +0100 Subject: [PATCH 03/23] style: coloured row background (#571) * style: coloured row background --- apps/client/src/common/utils/styleUtils.ts | 4 ++-- apps/client/src/features/cuesheet/Cuesheet.tsx | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/client/src/common/utils/styleUtils.ts b/apps/client/src/common/utils/styleUtils.ts index 488a0137d..5453221f7 100644 --- a/apps/client/src/common/utils/styleUtils.ts +++ b/apps/client/src/common/utils/styleUtils.ts @@ -15,8 +15,8 @@ export const getAccessibleColour = (bgColour?: string): ColourCombination => { try { const textColor = Color(bgColour).isLight() ? 'black' : '#fffffa'; return { backgroundColor: bgColour, color: textColor }; - } catch (error) { - console.log(`Unable to parse colour: ${bgColour}`); + } catch (_error) { + /* we do not handle errors here */ } } return { backgroundColor: '#000', color: '#fffffa' }; diff --git a/apps/client/src/features/cuesheet/Cuesheet.tsx b/apps/client/src/features/cuesheet/Cuesheet.tsx index 928766528..a674ec79d 100644 --- a/apps/client/src/features/cuesheet/Cuesheet.tsx +++ b/apps/client/src/features/cuesheet/Cuesheet.tsx @@ -1,5 +1,6 @@ import { useRef } from 'react'; import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; +import Color from 'color'; import { isOntimeBlock, isOntimeDelay, isOntimeEvent, OntimeRundown, OntimeRundownEntry } from 'ontime-types'; import useFollowComponent from '../../common/hooks/useFollowComponent'; @@ -117,6 +118,14 @@ export default function Cuesheet({ data, columns, handleUpdate, selectedId }: Cu let rowBgColour: string | undefined; if (isSelected) { rowBgColour = 'var(--cuesheet-running-bg-override, #D20300)'; // $red-700 + } else if (row.original.colour) { + try { + // the colour is user defined and might be invalid + const colour = new Color(row.original.colour).alpha(0.25); + rowBgColour = colour.hsl().string(); + } catch (_error) { + /* we do not handle errors here */ + } } return ( From 138be478ca74c72f85cac158b27908d05b5b4d7e Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Tue, 7 Nov 2023 21:24:44 +0100 Subject: [PATCH 04/23] Addtime in sec (#576) * addtime endpoint --------- Co-authored-by: arc-alex --- .../src/controllers/integrationController.ts | 14 +++++++++++ apps/server/src/services/PlaybackService.ts | 23 +++++++++++++------ apps/server/src/services/TimerService.ts | 4 ++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/apps/server/src/controllers/integrationController.ts b/apps/server/src/controllers/integrationController.ts index 7103dbb69..1a7607f2b 100644 --- a/apps/server/src/controllers/integrationController.ts +++ b/apps/server/src/controllers/integrationController.ts @@ -7,6 +7,7 @@ import { parse, updateEvent } from './integrationController.config.js'; import { isKeyOfType } from 'ontime-types/src/utils/guards.js'; import { event } from '../models/eventsDefinition.js'; +//TODO: re-throwing the error does not add any extra information or value export function dispatchFromAdapter( type: string, args: { @@ -174,6 +175,19 @@ export function dispatchFromAdapter( PlaybackService.roll(); break; } + case 'addtime': { + const time = Number(payload); + if (isNaN(time)) { + throw new Error(`Time not recognised ${payload}`); + } + try { + PlaybackService.addTime(time); + } catch (error) { + throw new Error(`Could not add time: ${error}`); + } + break; + } + //deprecated case 'delay': { const delayTime = Number(payload); if (isNaN(delayTime)) { diff --git a/apps/server/src/services/PlaybackService.ts b/apps/server/src/services/PlaybackService.ts index 65dcb1d8a..69ddbde9e 100644 --- a/apps/server/src/services/PlaybackService.ts +++ b/apps/server/src/services/PlaybackService.ts @@ -269,17 +269,26 @@ export class PlaybackService { } } + /** + * Adds time to current event + * @param {number} time - time to add in seconds + */ + static addTime(time: number) { + if (eventTimer.loadedTimerId) { + const timeInMs = time * 1000; + eventTimer.addTime(timeInMs); + timeInMs > 0 + ? logger.info(LogOrigin.Playback, `Added ${time} sec`) + : logger.info(LogOrigin.Playback, `Removed ${time} sec`); + } + } + /** * Adds delay to current event + * @deprecated Use addTime * @param {number} delayTime time in minutes */ static setDelay(delayTime: number) { - if (eventTimer.loadedTimerId) { - const delayInMs = delayTime * 1000 * 60; - eventTimer.delay(delayInMs); - delayInMs > 0 - ? logger.info(LogOrigin.Playback, `Added ${delayTime} min delay`) - : logger.info(LogOrigin.Playback, `Removed ${delayTime} min delay`); - } + this.addTime(delayTime * 60); } } diff --git a/apps/server/src/services/TimerService.ts b/apps/server/src/services/TimerService.ts index db90fe02c..4f3714cc0 100644 --- a/apps/server/src/services/TimerService.ts +++ b/apps/server/src/services/TimerService.ts @@ -304,10 +304,10 @@ export class TimerService { } /** - * Delays running timer by given amount + * Adds time to running timer by given amount * @param {number} amount */ - delay(amount: number) { + addTime(amount: number) { if (!this.loadedTimerId) { return; } From 943dd19c098df7ff0cc08d9d55525190aaab88e3 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 7 Nov 2023 21:27:33 +0100 Subject: [PATCH 05/23] style: wording and UI tweaks (#564) * style: wording and UI tweaks * style: prevent note overflow * style: small wording changes * soft blink (#569) * chore: version bump --------- Co-authored-by: Alex Christoffer Rasmussen --- apps/client/package.json | 2 +- .../src/features/cuesheet/CuesheetWrapper.tsx | 6 +----- apps/client/src/features/menu/MenuBar.tsx | 6 +----- .../features/modals/export-modal/ExportModal.tsx | 13 +++++-------- .../rundown/event-block/EventBlock.module.scss | 3 +++ .../features/viewers/backstage/Backstage.scss | 16 +++++++++++----- apps/electron/package.json | 2 +- apps/server/package.json | 2 +- .../src/controllers/integrationController.ts | 6 +++--- package.json | 2 +- 10 files changed, 28 insertions(+), 30 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 4997ce6d0..d504d2321 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -1,6 +1,6 @@ { "name": "ontime-ui", - "version": "2.9.0", + "version": "2.13.1", "private": true, "dependencies": { "@chakra-ui/react": "^2.7.0", diff --git a/apps/client/src/features/cuesheet/CuesheetWrapper.tsx b/apps/client/src/features/cuesheet/CuesheetWrapper.tsx index 9aab2414b..19b996408 100644 --- a/apps/client/src/features/cuesheet/CuesheetWrapper.tsx +++ b/apps/client/src/features/cuesheet/CuesheetWrapper.tsx @@ -141,11 +141,7 @@ export default function CuesheetWrapper() {
- +
); } diff --git a/apps/client/src/features/menu/MenuBar.tsx b/apps/client/src/features/menu/MenuBar.tsx index 994f08a5a..5281bc24d 100644 --- a/apps/client/src/features/menu/MenuBar.tsx +++ b/apps/client/src/features/menu/MenuBar.tsx @@ -151,11 +151,7 @@ const MenuBar = (props: MenuBarProps) => { size='sm' /> - +
void; - buttonVariants: { - csv: string; - json: string; - }; } export default function ExportModal(props: ExportModalProps) { - const { isOpen, onClose, buttonVariants } = props; + const { isOpen, onClose } = props; return ( @@ -22,10 +19,10 @@ export default function ExportModal(props: ExportModalProps) { Download options - - diff --git a/apps/client/src/features/rundown/event-block/EventBlock.module.scss b/apps/client/src/features/rundown/event-block/EventBlock.module.scss index aa57c8d73..7365f74fd 100644 --- a/apps/client/src/features/rundown/event-block/EventBlock.module.scss +++ b/apps/client/src/features/rundown/event-block/EventBlock.module.scss @@ -175,6 +175,9 @@ $skip-opacity: 0.1; font-size: calc(1rem - 3px); color: $block-text-color; line-height: calc(1rem - 3px); + + max-height: 2rem; + overflow-y: hidden; } diff --git a/apps/client/src/features/viewers/backstage/Backstage.scss b/apps/client/src/features/viewers/backstage/Backstage.scss index 4198a4337..208ed1aee 100644 --- a/apps/client/src/features/viewers/backstage/Backstage.scss +++ b/apps/client/src/features/viewers/backstage/Backstage.scss @@ -89,7 +89,10 @@ border-radius: 8px; &.blink { - animation: blink 0.5s ease-in-out 3; + animation-name: blink; + animation-timing-function: ease-in-out; + animation-iteration-count: 3; + animation-duration: 1s; } } @@ -163,9 +166,12 @@ @keyframes blink { 0% { - background-color: var(--card-background-color-blink-override, $playback-start); - } - 20% { background-color: var(--card-background-color-override, $viewer-card-bg-color); } -} + 50% { + background-color: var(--card-background-color-blink-override, $playback-start); + } + 100% { + background-color: var(--card-background-color-override, $viewer-card-bg-color); + } +} \ No newline at end of file diff --git a/apps/electron/package.json b/apps/electron/package.json index e04fa41fc..1e235f598 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -1,6 +1,6 @@ { "name": "ontime", - "version": "2.9.0", + "version": "2.13.1", "author": "Carlos Valente", "description": "Time keeping for live events", "repository": "https://github.com/cpvalente/ontime", diff --git a/apps/server/package.json b/apps/server/package.json index 7cf084cb7..067a9cc61 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -2,7 +2,7 @@ "name": "ontime-server", "type": "module", "main": "src/index.ts", - "version": "2.9.0", + "version": "2.13.1", "exports": "./src/index.js", "dependencies": { "body-parser": "^1.20.0", diff --git a/apps/server/src/controllers/integrationController.ts b/apps/server/src/controllers/integrationController.ts index 1a7607f2b..4c16f09ee 100644 --- a/apps/server/src/controllers/integrationController.ts +++ b/apps/server/src/controllers/integrationController.ts @@ -1,4 +1,4 @@ -import { LogOrigin, OntimeEvent } from 'ontime-types'; +import { OntimeEvent } from 'ontime-types'; import { messageService } from '../services/message-service/MessageService.js'; import { PlaybackService } from '../services/PlaybackService.js'; @@ -256,10 +256,10 @@ export function dispatchFromAdapter( // ontime/change/{eventID}/{propertyName} case 'change': { if (params.length < 2) { - throw new Error(`To few parameters`); + throw new Error('Too few parameters, 3 expected'); } if (payload === undefined) { - throw new Error(`Undefined payload`); + throw new Error('No payload found'); } const eventID = params[0]; const propertyName = params[1] as keyof OntimeEvent; diff --git a/package.json b/package.json index f0f157cee..7b24736f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ontime", - "version": "2.9.0", + "version": "2.13.1", "description": "Time keeping for live events", "keywords": [ "lighdev", From 2c47d90f34633e49cbd99a20be856da676603f3f Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 7 Nov 2023 22:30:39 +0100 Subject: [PATCH 06/23] chore: configure project wide linter (#577) * chore(lint): configure project-wide linter * chore(lint): improve linting in files * chore(lint): hide warnings in CI --- .eslintignore | 1 + .eslintrc | 33 +++++++++++- .github/workflows/test_v2.yml | 17 ++++++ apps/client/.eslintrc | 20 +------ apps/client/package.json | 2 +- .../MultiPartProgressBar.tsx | 10 +++- .../components/schedule/ScheduleItem.tsx | 15 +----- .../components/schedule/ScheduleNav.tsx | 11 ++-- .../src/common/hooks/useClickOutside.ts | 1 - apps/client/src/common/hooks/useFitText.ts | 40 ++++---------- apps/client/src/common/hooks/useInterval.js | 2 +- .../src/common/hooks/useLocalStorage.ts | 2 +- .../common/utils/__tests__/aliases.test.js | 3 +- .../src/common/utils/__tests__/math.test.js | 2 +- apps/client/src/declarations/declaration.d.ts | 5 +- apps/client/src/declarations/test.d.ts | 2 +- .../cuesheet-table-elements/CuesheetRow.tsx | 6 --- .../modals/settings-modal/AliasesForm.tsx | 7 +-- apps/electron/package.json | 1 + apps/electron/src/menu/applicationMenu.js | 54 +++++++++---------- apps/electron/src/menu/trayMenu.js | 4 +- apps/server/.eslintrc | 15 ------ apps/server/package.json | 2 +- .../integrationController.config.ts | 4 +- .../src/controllers/integrationController.ts | 2 +- .../server/src/utils/__tests__/parser.test.ts | 3 +- e2e/.eslintrc | 7 +-- package.json | 1 + packages/types/.eslintrc | 5 -- packages/types/package.json | 3 +- .../types/src/definitions/core/Alias.type.ts | 2 +- .../src/definitions/core/UserFields.type.ts | 3 +- .../types/src/definitions/core/Views.type.ts | 2 +- .../src/definitions/runtime/Logger.type.ts | 2 +- .../runtime/MessageControl.type.ts | 2 +- packages/utils/.eslintrc | 15 +----- packages/utils/package.json | 2 +- packages/utils/src/cue-utils/cueUtils.ts | 1 + 38 files changed, 138 insertions(+), 171 deletions(-) create mode 100644 .eslintignore delete mode 100644 apps/client/src/features/cuesheet/cuesheet-table-elements/CuesheetRow.tsx diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..cfdd63c69 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ + "ONTIME_VERSION.js" diff --git a/.eslintrc b/.eslintrc index 341ee5eaf..22846dfb2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,8 +6,16 @@ "es6": true, "jest": true }, + "parser": "@typescript-eslint/parser", "extends": [ - "eslint:recommended" + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "eslint-config-prettier" + ], + "plugins": [ + "@typescript-eslint", + "prettier" ], "overrides": [ { @@ -21,6 +29,27 @@ } ], "rules": { - "no-console": ["warn", { "allow": ["warn", "error"]}] + "no-useless-concat": "warn", + "prefer-template": "warn", + "no-console": [ + "warn", + { + "allow": [ + "warn", + "error" + ] + } + ], + "@typescript-eslint/no-non-null-assertion": "warn", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "prettier/prettier": "warn" } } \ No newline at end of file diff --git a/.github/workflows/test_v2.yml b/.github/workflows/test_v2.yml index 0da546dec..4d2e31160 100644 --- a/.github/workflows/test_v2.yml +++ b/.github/workflows/test_v2.yml @@ -27,6 +27,23 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + # Run code quality per package + - name: React - Run linter + run: pnpm lint + working-directory: ./apps/client + + - name: Server - Run linter + run: pnpm lint + working-directory: ./apps/server + + - name: Utils - Run linter + run: pnpm lint + working-directory: ./packages/utils + + - name: Types - Run linter + run: pnpm lint + working-directory: ./packages/types + # We choose to run tests separately - name: React - Run unit tests run: pnpm test:pipeline diff --git a/apps/client/.eslintrc b/apps/client/.eslintrc index 402e99e49..aff13e33f 100644 --- a/apps/client/.eslintrc +++ b/apps/client/.eslintrc @@ -8,34 +8,18 @@ "browser": true, "node": true }, - "parser": "@typescript-eslint/parser", "extends": [ - "eslint:recommended", "plugin:react/recommended", "plugin:react-hooks/recommended", - "plugin:@typescript-eslint/recommended", - "eslint-config-prettier", - "plugin:@tanstack/eslint-plugin-query/recommended", - "prettier" + "plugin:@tanstack/eslint-plugin-query/recommended" ], "plugins": [ "react", "testing-library", "simple-import-sort", - "@tanstack/query", - "@typescript-eslint", - "prettier" + "@tanstack/query" ], "rules": { - "@typescript-eslint/no-non-null-assertion": "warn", - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ], - "no-useless-concat": "warn", - "prefer-template": "warn", "react/jsx-no-bind": [ "error", { diff --git a/apps/client/package.json b/apps/client/package.json index d504d2321..66aa90bbd 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -39,7 +39,7 @@ "build": "vite build", "build:local": "cross-env NODE_ENV=local vite build", "build:docker": "vite build", - "lint": "eslint .", + "lint": "eslint . --quiet", "test": "vitest", "test:pipeline": "vitest run", "cleanup": "rm -rf .turbo && rm -rf node_modules && rm -rf build" diff --git a/apps/client/src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx b/apps/client/src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx index 462987b3c..d44725f52 100644 --- a/apps/client/src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx +++ b/apps/client/src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx @@ -25,8 +25,14 @@ export default function MultiPartProgressBar(props: MultiPartProgressBar) { return (
-
-
+
+
); diff --git a/apps/client/src/common/components/schedule/ScheduleItem.tsx b/apps/client/src/common/components/schedule/ScheduleItem.tsx index d154d80b5..af265725c 100644 --- a/apps/client/src/common/components/schedule/ScheduleItem.tsx +++ b/apps/client/src/common/components/schedule/ScheduleItem.tsx @@ -14,16 +14,7 @@ interface ScheduleItemProps { } export default function ScheduleItem(props: ScheduleItemProps) { - const { - selected, - timeStart, - timeEnd, - title, - presenter, - backstageEvent, - colour, - skip, - } = props; + const { selected, timeStart, timeEnd, title, presenter, backstageEvent, colour, skip } = props; const start = formatTime(timeStart, { format: 'hh:mm' }); const end = formatTime(timeEnd, { format: 'hh:mm' }); @@ -37,9 +28,7 @@ export default function ScheduleItem(props: ScheduleItemProps) { {`${start} → ${end} ${backstageEvent ? '*' : ''}`}
{title}
- {presenter && ( -
{presenter}
- )} + {presenter &&
{presenter}
} ); } diff --git a/apps/client/src/common/components/schedule/ScheduleNav.tsx b/apps/client/src/common/components/schedule/ScheduleNav.tsx index dfe180b98..da5516951 100644 --- a/apps/client/src/common/components/schedule/ScheduleNav.tsx +++ b/apps/client/src/common/components/schedule/ScheduleNav.tsx @@ -13,12 +13,11 @@ export default function ScheduleNav({ className }: ScheduleNavProps) {
{numPages > 1 && [...Array(numPages).keys()].map((i) => ( -
- ), - )} +
+ ))}
); } diff --git a/apps/client/src/common/hooks/useClickOutside.ts b/apps/client/src/common/hooks/useClickOutside.ts index 33e50b365..7ea1f71c6 100644 --- a/apps/client/src/common/hooks/useClickOutside.ts +++ b/apps/client/src/common/hooks/useClickOutside.ts @@ -6,7 +6,6 @@ export default function useClickOutside( ref: RefObject, callback: ClickOutsideEventHandler, ) { - useEffect(() => { function handleClick(event: MouseEvent) { const element = ref?.current; diff --git a/apps/client/src/common/hooks/useFitText.ts b/apps/client/src/common/hooks/useFitText.ts index 59a10f398..ff1470e6a 100644 --- a/apps/client/src/common/hooks/useFitText.ts +++ b/apps/client/src/common/hooks/useFitText.ts @@ -1,10 +1,4 @@ -import { - useCallback, - useEffect, - useLayoutEffect, - useRef, - useState, -} from 'react'; +import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'; export type TLogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none'; @@ -26,13 +20,13 @@ const LOG_LEVEL: Record = { }; const useFitText = ({ - logLevel: logLevelOption = 'info', - maxFontSize = 100, - minFontSize = 20, - onFinish, - onStart, - resolution = 5, - }: TOptions = {}) => { + logLevel: logLevelOption = 'info', + maxFontSize = 100, + minFontSize = 20, + onFinish, + onStart, + resolution = 5, +}: TOptions = {}) => { const logLevel = LOG_LEVEL[logLevelOption]; const initState = useCallback(() => { @@ -112,8 +106,7 @@ const useFitText = ({ const isWithinResolution = Math.abs(fontSize - fontSizePrev) <= resolution; const isOverflow = !!ref.current && - (ref.current.scrollHeight > ref.current.offsetHeight || - ref.current.scrollWidth > ref.current.offsetWidth); + (ref.current.scrollHeight > ref.current.offsetHeight || ref.current.scrollWidth > ref.current.offsetWidth); const isFailed = isOverflow && fontSize === fontSizePrev; const isAsc = fontSize > fontSizePrev; @@ -123,9 +116,7 @@ const useFitText = ({ if (isFailed) { isCalculatingRef.current = false; if (logLevel <= LOG_LEVEL.info) { - console.info( - `[use-fit-text] reached \`minFontSize = ${minFontSize}\` without fitting text`, - ); + console.info(`[use-fit-text] reached \`minFontSize = ${minFontSize}\` without fitting text`); } } else if (isOverflow) { setState({ @@ -160,16 +151,7 @@ const useFitText = ({ fontSizeMin: newMin, fontSizePrev: fontSize, }); - }, [ - calcKey, - fontSize, - fontSizeMax, - fontSizeMin, - fontSizePrev, - onFinish, - ref, - resolution, - ]); + }, [calcKey, fontSize, fontSizeMax, fontSizeMin, fontSizePrev, onFinish, ref, resolution]); return { fontSize: `${fontSize}%`, ref }; }; diff --git a/apps/client/src/common/hooks/useInterval.js b/apps/client/src/common/hooks/useInterval.js index 58a9ab5fd..dd25a8585 100644 --- a/apps/client/src/common/hooks/useInterval.js +++ b/apps/client/src/common/hooks/useInterval.js @@ -1,4 +1,4 @@ -import { useEffect, useRef } from "react"; +import { useEffect, useRef } from 'react'; /** * @description utility hook to around setInterval diff --git a/apps/client/src/common/hooks/useLocalStorage.ts b/apps/client/src/common/hooks/useLocalStorage.ts index ad59385c6..a6468e7af 100644 --- a/apps/client/src/common/hooks/useLocalStorage.ts +++ b/apps/client/src/common/hooks/useLocalStorage.ts @@ -46,7 +46,7 @@ export const useLocalStorage = (key: string, initialValue: T): [T, (value: T setStoredValue(valueToStore); window.localStorage.setItem(`ontime-${key}`, JSON.stringify(valueToStore)); } catch (error) { - console.log(error); + console.error(error); } }; return [storedValue, setValue]; diff --git a/apps/client/src/common/utils/__tests__/aliases.test.js b/apps/client/src/common/utils/__tests__/aliases.test.js index 5a50a004b..ab75ce8df 100644 --- a/apps/client/src/common/utils/__tests__/aliases.test.js +++ b/apps/client/src/common/utils/__tests__/aliases.test.js @@ -1,5 +1,6 @@ import { resolvePath } from 'react-router-dom'; -import { validateAlias, generateURLFromAlias, getAliasRoute } from '../aliases'; + +import { generateURLFromAlias, getAliasRoute, validateAlias } from '../aliases'; describe('An alias fails if incorrect', () => { const testsToFail = [ diff --git a/apps/client/src/common/utils/__tests__/math.test.js b/apps/client/src/common/utils/__tests__/math.test.js index 81a44585e..35284459b 100644 --- a/apps/client/src/common/utils/__tests__/math.test.js +++ b/apps/client/src/common/utils/__tests__/math.test.js @@ -12,7 +12,7 @@ test('Clamps a set of numbers correctly', () => { { num: -50, min: 0, max: 0, result: 0 }, { num: 50.5, min: 0, max: 100, result: 50.5 }, { num: 50, min: 0, max: 20.32, result: 20.32 }, - { num: 10, min: 20.32, max: 40, result: 20.32 } + { num: 10, min: 20.32, max: 40, result: 20.32 }, ]; testCases.forEach((t) => expect(clamp(t.num, t.min, t.max)).toBe(t.result)); diff --git a/apps/client/src/declarations/declaration.d.ts b/apps/client/src/declarations/declaration.d.ts index f2578949b..8c5aaa3cd 100644 --- a/apps/client/src/declarations/declaration.d.ts +++ b/apps/client/src/declarations/declaration.d.ts @@ -13,9 +13,8 @@ declare global { }; process: { type: string; - } + }; } } -// eslint-disable-next-line import/no-anonymous-default-export -export default {} \ No newline at end of file +export default {}; diff --git a/apps/client/src/declarations/test.d.ts b/apps/client/src/declarations/test.d.ts index 380718b33..bf28ed90f 100644 --- a/apps/client/src/declarations/test.d.ts +++ b/apps/client/src/declarations/test.d.ts @@ -6,6 +6,6 @@ import 'vitest'; // https://github.com/testing-library/jest-dom/issues/123 declare global { namespace Vi { - interface Assertion extends TestingLibraryMatchers {} + type Assertion = TestingLibraryMatchers; } } diff --git a/apps/client/src/features/cuesheet/cuesheet-table-elements/CuesheetRow.tsx b/apps/client/src/features/cuesheet/cuesheet-table-elements/CuesheetRow.tsx deleted file mode 100644 index 5a0a9ae89..000000000 --- a/apps/client/src/features/cuesheet/cuesheet-table-elements/CuesheetRow.tsx +++ /dev/null @@ -1,6 +0,0 @@ -interface CuesheetRowProps { - row: OntimeRundownEntry; - isSelected: boolean; -} - -function CuesheetRow() {} diff --git a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx index e70837c00..49dbfdf7f 100644 --- a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx +++ b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx @@ -21,7 +21,9 @@ import style from './SettingsModal.module.scss'; const aliasesDocsUrl = 'https://ontime.gitbook.io/v2/features/url-aliases'; // we wrap the array in an object to be simplify react-hook-form -type Aliases = { aliases: Alias[] }; +type Aliases = { + aliases: Alias[]; +}; export default function AliasesForm() { const { data, status, isFetching, refetch } = useAliases(); @@ -93,8 +95,7 @@ export default function AliasesForm() { Custom aliases allow providing a short name for any ontime URL.
It serves two primary purposes:
- - Providing dynamic URLs for automation or unattended screens
- - Simplifying complex URLs + - Providing dynamic URLs for automation or unattended screens
- Simplifying complex URLs For more information, see the docs
diff --git a/apps/electron/package.json b/apps/electron/package.json index 1e235f598..375596c44 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -20,6 +20,7 @@ }, "scripts": { "postinstall": "", + "lint": "eslint . --quiet", "dev:electron": "cross-env NODE_ENV=development electron .", "dist-win": "electron-builder --publish=never --x64 --win", "dist-mac": "electron-builder --publish=never --mac", diff --git a/apps/electron/src/menu/applicationMenu.js b/apps/electron/src/menu/applicationMenu.js index d6f6c1a84..b63fa5670 100644 --- a/apps/electron/src/menu/applicationMenu.js +++ b/apps/electron/src/menu/applicationMenu.js @@ -8,23 +8,23 @@ function getApplicationMenu(isMac, askToQuit) { return [ ...(isMac ? [ - { - label: 'Ontime', - submenu: [ - { role: 'about' }, - { type: 'separator' }, - { role: 'hide' }, - { role: 'hideOthers' }, - { role: 'unhide' }, - { type: 'separator' }, - { - label: 'quit', - click: () => askToQuit(), - accelerator: 'Cmd+Q', - }, - ], - }, - ] + { + label: 'Ontime', + submenu: [ + { role: 'about' }, + { type: 'separator' }, + { role: 'hide' }, + { role: 'hideOthers' }, + { role: 'unhide' }, + { type: 'separator' }, + { + label: 'quit', + click: () => askToQuit(), + accelerator: 'Cmd+Q', + }, + ], + }, + ] : []), { label: 'File', @@ -41,15 +41,15 @@ function getApplicationMenu(isMac, askToQuit) { { role: 'paste' }, ...(isMac ? [ - { role: 'pasteAndMatchStyle' }, - { role: 'delete' }, - { role: 'selectAll' }, - { type: 'separator' }, - { - label: 'Speech', - submenu: [{ role: 'startSpeaking' }, { role: 'stopSpeaking' }], - }, - ] + { role: 'pasteAndMatchStyle' }, + { role: 'delete' }, + { role: 'selectAll' }, + { type: 'separator' }, + { + label: 'Speech', + submenu: [{ role: 'startSpeaking' }, { role: 'stopSpeaking' }], + }, + ] : [{ role: 'delete' }, { type: 'separator' }, { role: 'selectAll' }]), ], }, @@ -161,4 +161,4 @@ function getApplicationMenu(isMac, askToQuit) { ]; } -module.exports = { getApplicationMenu } +module.exports = { getApplicationMenu }; diff --git a/apps/electron/src/menu/trayMenu.js b/apps/electron/src/menu/trayMenu.js index 9006ab3c5..89d70a461 100644 --- a/apps/electron/src/menu/trayMenu.js +++ b/apps/electron/src/menu/trayMenu.js @@ -13,7 +13,7 @@ function getTrayMenu(showApp, askToQuit) { label: 'Shutdown', click: () => askToQuit(), }, - ] + ]; } -module.exports = { getTrayMenu } +module.exports = { getTrayMenu }; diff --git a/apps/server/.eslintrc b/apps/server/.eslintrc index 980f1c59f..9cf87cad5 100644 --- a/apps/server/.eslintrc +++ b/apps/server/.eslintrc @@ -2,23 +2,8 @@ "env": { "node": true }, - "parser": "@typescript-eslint/parser", - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "plugins": ["@typescript-eslint", "prettier"], "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" - }, - "rules": { - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ] } } diff --git a/apps/server/package.json b/apps/server/package.json index 067a9cc61..b4ba77d2e 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -52,7 +52,7 @@ "build:local": "pnpm prebuild && esbuild src/index.ts --log-level=error --platform=node --format=cjs --bundle --minify --outfile=dist/index.cjs", "build:docker": "pnpm prebuild && esbuild src/index.ts --log-level=error --platform=node --format=cjs --minify --bundle --outfile=dist/docker.cjs", "build:debug": "pnpm prebuild && esbuild src/app.ts --platform=node --format=cjs --bundle --outfile=dist/index.cjs", - "lint": "eslint .", + "lint": "eslint . --quiet", "test": "cross-env IS_TEST=true vitest", "test:pipeline": "cross-env IS_TEST=true vitest run", "typecheck": "tsc --noEmit", diff --git a/apps/server/src/controllers/integrationController.config.ts b/apps/server/src/controllers/integrationController.config.ts index aa3bc3cf0..27b93744c 100644 --- a/apps/server/src/controllers/integrationController.config.ts +++ b/apps/server/src/controllers/integrationController.config.ts @@ -30,7 +30,7 @@ const whitelistedPayload = { }; export function parse(field: string, value: unknown) { - if (!whitelistedPayload.hasOwnProperty(field)) { + if (!Object.hasOwn(whitelistedPayload, field)) { throw new Error(`Field ${field} not permitted`); } const parserFn = whitelistedPayload[field]; @@ -51,7 +51,7 @@ export function updateEvent( const event = EventLoader.getEventWithId(eventId); if (event) { - let propertiesToUpdate = { [propertyName]: newValue }; + const propertiesToUpdate = { [propertyName]: newValue }; // Handles the special case for duration // needs to be converted to milliseconds diff --git a/apps/server/src/controllers/integrationController.ts b/apps/server/src/controllers/integrationController.ts index 4c16f09ee..a8f5bd95d 100644 --- a/apps/server/src/controllers/integrationController.ts +++ b/apps/server/src/controllers/integrationController.ts @@ -14,7 +14,7 @@ export function dispatchFromAdapter( payload: unknown; params?: Array; }, - source?: 'osc' | 'ws', + _source?: 'osc' | 'ws', ) { const payload = args.payload; const typeComponents = type.toLowerCase().split('/'); diff --git a/apps/server/src/utils/__tests__/parser.test.ts b/apps/server/src/utils/__tests__/parser.test.ts index b868f32b0..81b4a6cb3 100644 --- a/apps/server/src/utils/__tests__/parser.test.ts +++ b/apps/server/src/utils/__tests__/parser.test.ts @@ -1,6 +1,7 @@ +/* eslint-disable no-console -- we are mocking the console */ import { vi } from 'vitest'; -import { EndAction, TimerType } from 'ontime-types'; +import { EndAction, OntimeEvent, TimerType } from 'ontime-types'; import { dbModel } from '../../models/dataModel.js'; import { parseExcel, parseJson, validateEvent } from '../parser.js'; diff --git a/e2e/.eslintrc b/e2e/.eslintrc index e061d33fa..e68cd863f 100644 --- a/e2e/.eslintrc +++ b/e2e/.eslintrc @@ -4,10 +4,5 @@ }, "env": { "node": true - }, - "extends": [ - "eslint:recommended" - ], - "plugins": [], - "rules": {} + } } diff --git a/package.json b/package.json index 7b24736f6..60fee2a2f 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "dev": "turbo run dev", "dev:electron": "turbo run dev --filter=ontime", "dev:server": "turbo run dev --filter=ontime-server", + "lint": "turbo run lint", "build": "turbo run build", "build:local": "turbo run build:local", "dist-win": "turbo run dist-win", diff --git a/packages/types/.eslintrc b/packages/types/.eslintrc index 3581c4ab2..e2b9aa067 100644 --- a/packages/types/.eslintrc +++ b/packages/types/.eslintrc @@ -3,11 +3,6 @@ "browser": true, "node": true }, - "parser": "@typescript-eslint/parser", - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" diff --git a/packages/types/package.json b/packages/types/package.json index 5f44bc21e..3325be1cb 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -6,7 +6,8 @@ "private": true, "description": "shared typings for ontime", "scripts": { - "cleanup": "rm -rf .turbo && rm -rf node_modules" + "cleanup": "rm -rf .turbo && rm -rf node_modules", + "lint": "eslint ." }, "keywords": [], "author": "", diff --git a/packages/types/src/definitions/core/Alias.type.ts b/packages/types/src/definitions/core/Alias.type.ts index c82d4e678..3835b5aa5 100644 --- a/packages/types/src/definitions/core/Alias.type.ts +++ b/packages/types/src/definitions/core/Alias.type.ts @@ -2,4 +2,4 @@ export type Alias = { enabled: boolean; alias: string; pathAndParams: string; -} +}; diff --git a/packages/types/src/definitions/core/UserFields.type.ts b/packages/types/src/definitions/core/UserFields.type.ts index 02401571c..c8962e8be 100644 --- a/packages/types/src/definitions/core/UserFields.type.ts +++ b/packages/types/src/definitions/core/UserFields.type.ts @@ -9,5 +9,4 @@ export type UserFields = { user7: string; user8: string; user9: string; -} - +}; diff --git a/packages/types/src/definitions/core/Views.type.ts b/packages/types/src/definitions/core/Views.type.ts index f4e8ecdd9..1d1d91561 100644 --- a/packages/types/src/definitions/core/Views.type.ts +++ b/packages/types/src/definitions/core/Views.type.ts @@ -6,4 +6,4 @@ export type ViewSettings = { warningThreshold: number; dangerColor: string; dangerThreshold: number; -} +}; diff --git a/packages/types/src/definitions/runtime/Logger.type.ts b/packages/types/src/definitions/runtime/Logger.type.ts index 0a903f97f..f339cfa62 100644 --- a/packages/types/src/definitions/runtime/Logger.type.ts +++ b/packages/types/src/definitions/runtime/Logger.type.ts @@ -23,5 +23,5 @@ export enum LogOrigin { Rx = 'RX', Server = 'SERVER', Tx = 'TX', - User = 'USER' + User = 'USER', } diff --git a/packages/types/src/definitions/runtime/MessageControl.type.ts b/packages/types/src/definitions/runtime/MessageControl.type.ts index 3020f421f..a08537b29 100644 --- a/packages/types/src/definitions/runtime/MessageControl.type.ts +++ b/packages/types/src/definitions/runtime/MessageControl.type.ts @@ -6,4 +6,4 @@ export type Message = { export type TimerMessage = Message & { timerBlink: boolean; timerBlackout: boolean; -} +}; diff --git a/packages/utils/.eslintrc b/packages/utils/.eslintrc index 83854e682..2e12183cf 100644 --- a/packages/utils/.eslintrc +++ b/packages/utils/.eslintrc @@ -3,27 +3,14 @@ "browser": true, "node": true }, - "parser": "@typescript-eslint/parser", "plugins": [ - "simple-import-sort", - "prettier" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" + "simple-import-sort" ], "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" }, "rules": { - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ], "simple-import-sort/exports": "error", "simple-import-sort/imports": "error" } diff --git a/packages/utils/package.json b/packages/utils/package.json index 5cf966fcd..2d1d7dd2b 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -5,7 +5,7 @@ "private": true, "description": "shared logic for ontime", "scripts": { - "lint": "eslint .", + "lint": "eslint . --quiet", "test": "vitest", "test:pipeline": "vitest run", "cleanup": "rm -rf .turbo && rm -rf node_modules" diff --git a/packages/utils/src/cue-utils/cueUtils.ts b/packages/utils/src/cue-utils/cueUtils.ts index aecd9b702..0fa66409a 100644 --- a/packages/utils/src/cue-utils/cueUtils.ts +++ b/packages/utils/src/cue-utils/cueUtils.ts @@ -17,6 +17,7 @@ export function getIncrement(input: string): string { const match = regex.exec(input); if (match) { // If a number is found, extract the non-numeric prefix, integer part, and decimal part + // eslint-disable-next-line prefer-const -- some items in the destructuring are modified let [, prefix, integerPart, decimalPart] = match; if (decimalPart) { From 6012cb7bd10e5222a3a888d22549d148bb96953e Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 7 Nov 2023 22:39:47 +0100 Subject: [PATCH 07/23] chore(lint): lenient eol (#578) * chore(lint): lenient eol --- .eslintrc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index 22846dfb2..7c82b809e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -50,6 +50,11 @@ "varsIgnorePattern": "^_" } ], - "prettier/prettier": "warn" + "prettier/prettier": [ + "warn", + { + "endOfLine": "auto" + } + ] } } \ No newline at end of file From de715b3d3eb1c3f3525c49fdc46939d912745f05 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Thu, 9 Nov 2023 21:34:17 +0100 Subject: [PATCH 08/23] chore: upgrade pnpm (#582) * chore: upgrade pnpm --- .github/workflows/build_docker_v2.yml | 4 +- .github/workflows/build_v2.yml | 4 +- .github/workflows/test_v2.yml | 4 +- package.json | 2 +- pnpm-lock.yaml | 3512 +++++++++++++------------ 5 files changed, 1818 insertions(+), 1708 deletions(-) diff --git a/.github/workflows/build_docker_v2.yml b/.github/workflows/build_docker_v2.yml index 42f7ddc7e..82fb06a3c 100644 --- a/.github/workflows/build_docker_v2.yml +++ b/.github/workflows/build_docker_v2.yml @@ -23,9 +23,9 @@ jobs: version: 16.16.0 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + - uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/build_v2.yml b/.github/workflows/build_v2.yml index 56279856c..9caba85ad 100644 --- a/.github/workflows/build_v2.yml +++ b/.github/workflows/build_v2.yml @@ -17,9 +17,9 @@ jobs: node-version: 16 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + - uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/test_v2.yml b/.github/workflows/test_v2.yml index 4d2e31160..552d17b8c 100644 --- a/.github/workflows/test_v2.yml +++ b/.github/workflows/test_v2.yml @@ -20,9 +20,9 @@ jobs: node-version: 16 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + - uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/package.json b/package.json index 60fee2a2f..feb142137 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "AGPL-3.0-only", "engines": { "node": "~16.16.0", - "pnpm": ">=7" + "pnpm": ">=8" }, "type": "module", "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b673b4f4f..e5665a280 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,295 +1,418 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false importers: .: - specifiers: - '@playwright/test': ^1.34.3 - '@types/node': ^18.11.18 - '@typescript-eslint/eslint-plugin': ^5.48.0 - '@typescript-eslint/parser': ^5.48.0 - cross-env: ^7.0.3 - eslint: ^8.31.0 - eslint-config-prettier: ^8.6.0 - eslint-plugin-playwright: ^0.12.0 - prettier: ^2.8.2 - turbo: ^1.8.8 - typescript: ^4.8.3 devDependencies: - '@playwright/test': 1.34.3 - '@types/node': 18.11.18 - '@typescript-eslint/eslint-plugin': 5.48.0_k73wpmdolxikpyqun3p36akaaq - '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe - cross-env: 7.0.3 - eslint: 8.31.0 - eslint-config-prettier: 8.6.0_eslint@8.31.0 - eslint-plugin-playwright: 0.12.0_eslint@8.31.0 - prettier: 2.8.2 - turbo: 1.8.8 - typescript: 4.9.4 + '@playwright/test': + specifier: ^1.34.3 + version: 1.34.3 + '@types/node': + specifier: ^18.11.18 + version: 18.11.18 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.0 + version: 5.48.0(@typescript-eslint/parser@5.48.0)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.48.0 + version: 5.48.0(eslint@8.31.0)(typescript@4.9.4) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^8.31.0 + version: 8.31.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.31.0) + eslint-plugin-playwright: + specifier: ^0.12.0 + version: 0.12.0(eslint@8.31.0) + prettier: + specifier: ^2.8.2 + version: 2.8.2 + turbo: + specifier: ^1.8.8 + version: 1.8.8 + typescript: + specifier: ^4.8.3 + version: 4.9.4 apps/client: - specifiers: - '@chakra-ui/react': ^2.7.0 - '@dnd-kit/core': ^6.0.8 - '@dnd-kit/sortable': ^7.0.2 - '@dnd-kit/utilities': ^3.2.1 - '@emotion/react': ^11.10.6 - '@emotion/styled': ^11.10.6 - '@react-icons/all-files': ^4.1.0 - '@sentry/react': ^7.46.0 - '@sentry/tracing': ^7.46.0 - '@sentry/vite-plugin': ^0.4.0 - '@tanstack/eslint-plugin-query': ^4.26.2 - '@tanstack/react-query': ^4.28.0 - '@tanstack/react-query-devtools': ^4.29.0 - '@tanstack/react-table': ^8.9.2 - '@testing-library/jest-dom': ^5.16.5 - '@testing-library/react': ^13.1.1 - '@testing-library/user-event': ^14.1.1 - '@types/color': ^3.0.3 - '@types/luxon': ^3.2.0 - '@types/react': ^18.0.26 - '@types/react-dom': ^18.0.10 - '@types/testing-library__jest-dom': ^5.14.5 - '@typescript-eslint/eslint-plugin': ^5.48.1 - '@typescript-eslint/parser': ^5.48.1 - '@vitejs/plugin-react': ^3.0.1 - autosize: ^6.0.1 - axios: ^1.2.0 - color: ^4.2.3 - csv-stringify: ^6.2.3 - deepmerge: ^4.3.0 - eslint: ^8.31.0 - eslint-config-prettier: ^8.6.0 - eslint-plugin-jest: ^27.1.7 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-react: ^7.32.0 - eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-simple-import-sort: ^8.0.0 - eslint-plugin-testing-library: ^5.9.1 - framer-motion: ^10.10.0 - jsdom: ^21.1.0 - ontime-types: workspace:* - ontime-utils: workspace:* - prettier: ^2.8.3 - react: ^18.2.0 - react-colorful: ^5.6.1 - react-dom: ^18.2.0 - react-fast-compare: ^3.2.0 - react-hook-form: ^7.43.5 - react-qr-code: ^2.0.11 - react-router-dom: ^6.3.0 - sass: ^1.57.1 - typeface-open-sans: ^1.1.13 - typescript: ^4.9.4 - vite: ^4.3.1 - vite-plugin-compression2: ^0.9.0 - vite-plugin-svgr: ^2.4.0 - vite-tsconfig-paths: ^4.2.0 - vitest: ^0.30.1 - web-vitals: ^3.1.1 - zustand: ^4.3.6 dependencies: - '@chakra-ui/react': 2.7.0_tlyz7qwuzzubgapow55lw5vriq - '@dnd-kit/core': 6.0.8_biqbaboplfbrettd7655fr4n2y - '@dnd-kit/sortable': 7.0.2_52scne4zmdeyjh2otzkgz2xfvu - '@dnd-kit/utilities': 3.2.1_react@18.2.0 - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/styled': 11.10.6_qry7xzgsc55pr5ngbiorqn3fpa - '@react-icons/all-files': 4.1.0_react@18.2.0 - '@sentry/react': 7.47.0_react@18.2.0 - '@sentry/tracing': 7.46.0 - '@tanstack/react-query': 4.28.0_biqbaboplfbrettd7655fr4n2y - '@tanstack/react-query-devtools': 4.29.0_q4teel2yjbizrm4naiaqcdpjum - '@tanstack/react-table': 8.9.2_biqbaboplfbrettd7655fr4n2y - autosize: 6.0.1 - axios: 1.2.2 - color: 4.2.3 - csv-stringify: 6.2.3 - deepmerge: 4.3.0 - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y - react: 18.2.0 - react-colorful: 5.6.1_biqbaboplfbrettd7655fr4n2y - react-dom: 18.2.0_react@18.2.0 - react-fast-compare: 3.2.0 - react-hook-form: 7.43.5_react@18.2.0 - react-qr-code: 2.0.11_react@18.2.0 - react-router-dom: 6.6.2_biqbaboplfbrettd7655fr4n2y - typeface-open-sans: 1.1.13 - web-vitals: 3.1.1 - zustand: 4.3.6_react@18.2.0 + '@chakra-ui/react': + specifier: ^2.7.0 + version: 2.7.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.26)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/core': + specifier: ^6.0.8 + version: 6.0.8(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^7.0.2 + version: 7.0.2(@dnd-kit/core@6.0.8)(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.1 + version: 3.2.1(react@18.2.0) + '@emotion/react': + specifier: ^11.10.6 + version: 11.10.6(@types/react@18.0.26)(react@18.2.0) + '@emotion/styled': + specifier: ^11.10.6 + version: 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.26)(react@18.2.0) + '@react-icons/all-files': + specifier: ^4.1.0 + version: 4.1.0(react@18.2.0) + '@sentry/react': + specifier: ^7.46.0 + version: 7.47.0(react@18.2.0) + '@sentry/tracing': + specifier: ^7.46.0 + version: 7.46.0 + '@tanstack/react-query': + specifier: ^4.28.0 + version: 4.28.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': + specifier: ^4.29.0 + version: 4.29.0(@tanstack/react-query@4.28.0)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-table': + specifier: ^8.9.2 + version: 8.9.2(react-dom@18.2.0)(react@18.2.0) + autosize: + specifier: ^6.0.1 + version: 6.0.1 + axios: + specifier: ^1.2.0 + version: 1.2.2 + color: + specifier: ^4.2.3 + version: 4.2.3 + csv-stringify: + specifier: ^6.2.3 + version: 6.2.3 + deepmerge: + specifier: ^4.3.0 + version: 4.3.0 + framer-motion: + specifier: ^10.10.0 + version: 10.11.2(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-colorful: + specifier: ^5.6.1 + version: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-fast-compare: + specifier: ^3.2.0 + version: 3.2.0 + react-hook-form: + specifier: ^7.43.5 + version: 7.43.5(react@18.2.0) + react-qr-code: + specifier: ^2.0.11 + version: 2.0.11(react@18.2.0) + react-router-dom: + specifier: ^6.3.0 + version: 6.6.2(react-dom@18.2.0)(react@18.2.0) + typeface-open-sans: + specifier: ^1.1.13 + version: 1.1.13 + web-vitals: + specifier: ^3.1.1 + version: 3.1.1 + zustand: + specifier: ^4.3.6 + version: 4.3.6(react@18.2.0) devDependencies: - '@sentry/vite-plugin': 0.4.0 - '@tanstack/eslint-plugin-query': 4.26.2 - '@testing-library/jest-dom': 5.16.5 - '@testing-library/react': 13.4.0_biqbaboplfbrettd7655fr4n2y - '@testing-library/user-event': 14.4.3 - '@types/color': 3.0.3 - '@types/luxon': 3.2.0 - '@types/react': 18.0.26 - '@types/react-dom': 18.0.10 - '@types/testing-library__jest-dom': 5.14.5 - '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse - '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe - '@vitejs/plugin-react': 3.0.1_vite@4.3.1 - eslint: 8.31.0 - eslint-config-prettier: 8.6.0_eslint@8.31.0 - eslint-plugin-jest: 27.2.1_ohsifnwenhmxgcp7mend4dnv74 - eslint-plugin-prettier: 4.2.1_do5yx3dogbskqc4h5x5ilvlwyy - eslint-plugin-react: 7.32.0_eslint@8.31.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0 - eslint-plugin-simple-import-sort: 8.0.0_eslint@8.31.0 - eslint-plugin-testing-library: 5.9.1_iukboom6ndih5an6iafl45j2fe - jsdom: 21.1.0 - ontime-types: link:../../packages/types - ontime-utils: link:../../packages/utils - prettier: 2.8.3 - sass: 1.57.1 - typescript: 4.9.4 - vite: 4.3.1_sass@1.57.1 - vite-plugin-compression2: 0.9.0 - vite-plugin-svgr: 2.4.0_vite@4.3.1 - vite-tsconfig-paths: 4.2.0_x5zuwps7a76xd7nukziucl6f5y - vitest: 0.30.1_jsdom@21.1.0+sass@1.57.1 + '@sentry/vite-plugin': + specifier: ^0.4.0 + version: 0.4.0 + '@tanstack/eslint-plugin-query': + specifier: ^4.26.2 + version: 4.26.2 + '@testing-library/jest-dom': + specifier: ^5.16.5 + version: 5.16.5 + '@testing-library/react': + specifier: ^13.1.1 + version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/user-event': + specifier: ^14.1.1 + version: 14.4.3(@testing-library/dom@8.19.1) + '@types/color': + specifier: ^3.0.3 + version: 3.0.3 + '@types/luxon': + specifier: ^3.2.0 + version: 3.2.0 + '@types/react': + specifier: ^18.0.26 + version: 18.0.26 + '@types/react-dom': + specifier: ^18.0.10 + version: 18.0.10 + '@types/testing-library__jest-dom': + specifier: ^5.14.5 + version: 5.14.5 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.1 + version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.48.1 + version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + '@vitejs/plugin-react': + specifier: ^3.0.1 + version: 3.0.1(vite@4.3.1) + eslint: + specifier: ^8.31.0 + version: 8.31.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.31.0) + eslint-plugin-jest: + specifier: ^27.1.7 + version: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + eslint-plugin-react: + specifier: ^7.32.0 + version: 7.32.0(eslint@8.31.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.31.0) + eslint-plugin-simple-import-sort: + specifier: ^8.0.0 + version: 8.0.0(eslint@8.31.0) + eslint-plugin-testing-library: + specifier: ^5.9.1 + version: 5.9.1(eslint@8.31.0)(typescript@4.9.4) + jsdom: + specifier: ^21.1.0 + version: 21.1.0 + ontime-types: + specifier: workspace:* + version: link:../../packages/types + ontime-utils: + specifier: workspace:* + version: link:../../packages/utils + prettier: + specifier: ^2.8.3 + version: 2.8.3 + sass: + specifier: ^1.57.1 + version: 1.57.1 + typescript: + specifier: ^4.9.4 + version: 4.9.4 + vite: + specifier: ^4.3.1 + version: 4.3.1(@types/node@18.11.18)(sass@1.57.1) + vite-plugin-compression2: + specifier: ^0.9.0 + version: 0.9.0 + vite-plugin-svgr: + specifier: ^2.4.0 + version: 2.4.0(vite@4.3.1) + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@4.9.4)(vite@4.3.1) + vitest: + specifier: ^0.30.1 + version: 0.30.1(jsdom@21.1.0)(sass@1.57.1) apps/electron: - specifiers: - electron: ^22.3.5 - electron-builder: ^23.6.0 - eslint: ^8.31.0 - eslint-config-prettier: ^8.6.0 - prettier: ^2.8.3 devDependencies: - electron: 22.3.5 - electron-builder: 23.6.0 - eslint: 8.31.0 - eslint-config-prettier: 8.6.0_eslint@8.31.0 - prettier: 2.8.3 + electron: + specifier: ^22.3.5 + version: 22.3.5 + electron-builder: + specifier: ^23.6.0 + version: 23.6.0 + eslint: + specifier: ^8.31.0 + version: 8.31.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.31.0) + prettier: + specifier: ^2.8.3 + version: 2.8.3 apps/server: - specifiers: - '@types/express': ^4.17.17 - '@types/node': ^16.11.7 - '@types/node-osc': ^6.0.2 - '@types/websocket': ^1.0.5 - '@typescript-eslint/eslint-plugin': ^5.48.1 - '@typescript-eslint/parser': ^5.48.1 - body-parser: ^1.20.0 - cors: ^2.8.5 - dotenv: ^16.0.1 - esbuild: ^0.17.5 - eslint: ^8.31.0 - eslint-plugin-prettier: ^4.2.1 - express: ^4.18.2 - express-session: ^1.17.3 - express-static-gzip: ^2.1.7 - express-validator: ^6.14.2 - lowdb: ^5.0.5 - multer: ^1.4.5-lts.1 - node-osc: ^9.0.2 - node-xlsx: ^0.21.0 - nodemon: ^2.0.20 - ontime-types: workspace:* - ontime-utils: workspace:* - passport: ^0.6.0 - passport-local: ~1.0.0 - prettier: ^2.8.3 - shx: ^0.3.4 - steno: ^3.1.0 - ts-node: ^10.9.1 - typescript: ^4.9.4 - vitest: ^0.30.1 - ws: ^8.13.0 dependencies: - body-parser: 1.20.1 - cors: 2.8.5 - dotenv: 16.0.3 - express: 4.18.2 - express-session: 1.17.3 - express-static-gzip: 2.1.7 - express-validator: 6.14.2 - lowdb: 5.0.5 - multer: 1.4.5-lts.1 - node-osc: 9.0.2 - node-xlsx: 0.21.0 - ontime-utils: link:../../packages/utils - passport: 0.6.0 - passport-local: 1.0.0 - steno: 3.1.0 - ws: 8.13.0 + body-parser: + specifier: ^1.20.0 + version: 1.20.1 + cors: + specifier: ^2.8.5 + version: 2.8.5 + dotenv: + specifier: ^16.0.1 + version: 16.0.3 + express: + specifier: ^4.18.2 + version: 4.18.2 + express-session: + specifier: ^1.17.3 + version: 1.17.3 + express-static-gzip: + specifier: ^2.1.7 + version: 2.1.7 + express-validator: + specifier: ^6.14.2 + version: 6.14.2 + lowdb: + specifier: ^5.0.5 + version: 5.0.5 + multer: + specifier: ^1.4.5-lts.1 + version: 1.4.5-lts.1 + node-osc: + specifier: ^9.0.2 + version: 9.0.2 + node-xlsx: + specifier: ^0.21.0 + version: 0.21.0 + ontime-utils: + specifier: workspace:* + version: link:../../packages/utils + passport: + specifier: ^0.6.0 + version: 0.6.0 + passport-local: + specifier: ~1.0.0 + version: 1.0.0 + steno: + specifier: ^3.1.0 + version: 3.1.0 + ws: + specifier: ^8.13.0 + version: 8.13.0 devDependencies: - '@types/express': 4.17.17 - '@types/node': 16.18.11 - '@types/node-osc': 6.0.2 - '@types/websocket': 1.0.5 - '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse - '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe - esbuild: 0.17.5 - eslint: 8.31.0 - eslint-plugin-prettier: 4.2.1_ilxq7usaoskowiuvcfaznp7pcm - nodemon: 2.0.20 - ontime-types: link:../../packages/types - prettier: 2.8.3 - shx: 0.3.4 - ts-node: 10.9.1_qacynw5b4krdzzrloasmebsynu - typescript: 4.9.4 - vitest: 0.30.1 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/node': + specifier: ^16.11.7 + version: 16.18.11 + '@types/node-osc': + specifier: ^6.0.2 + version: 6.0.2 + '@types/websocket': + specifier: ^1.0.5 + version: 1.0.5 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.1 + version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.48.1 + version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + esbuild: + specifier: ^0.17.5 + version: 0.17.5 + eslint: + specifier: ^8.31.0 + version: 8.31.0 + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + nodemon: + specifier: ^2.0.20 + version: 2.0.20 + ontime-types: + specifier: workspace:* + version: link:../../packages/types + prettier: + specifier: ^2.8.3 + version: 2.8.3 + shx: + specifier: ^0.3.4 + version: 0.3.4 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@16.18.11)(typescript@4.9.4) + typescript: + specifier: ^4.9.4 + version: 4.9.4 + vitest: + specifier: ^0.30.1 + version: 0.30.1 packages/types: - specifiers: - '@typescript-eslint/eslint-plugin': ^5.48.1 - '@typescript-eslint/parser': ^5.48.1 - eslint: ^8.31.0 - typescript: ^4.9.4 devDependencies: - '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse - '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe - eslint: 8.31.0 - typescript: 4.9.4 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.1 + version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.48.1 + version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + eslint: + specifier: ^8.31.0 + version: 8.31.0 + typescript: + specifier: ^4.9.4 + version: 4.9.4 packages/utils: - specifiers: - '@types/luxon': ^3.2.0 - '@typescript-eslint/eslint-plugin': ^5.48.1 - '@typescript-eslint/parser': ^5.48.1 - eslint: ^8.31.0 - eslint-config-prettier: ^8.6.0 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-simple-import-sort: ^8.0.0 - luxon: ^3.3.0 - nanoid: ^4.0.1 - ontime-types: workspace:* - prettier: ^2.8.3 - typescript: ^4.9.4 - vitest: ^0.30.1 dependencies: - luxon: 3.3.0 - nanoid: 4.0.1 + luxon: + specifier: ^3.3.0 + version: 3.3.0 + nanoid: + specifier: ^4.0.1 + version: 4.0.1 devDependencies: - '@types/luxon': 3.2.0 - '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse - '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe - eslint: 8.31.0 - eslint-config-prettier: 8.6.0_eslint@8.31.0 - eslint-plugin-prettier: 4.2.1_do5yx3dogbskqc4h5x5ilvlwyy - eslint-plugin-simple-import-sort: 8.0.0_eslint@8.31.0 - ontime-types: link:../types - prettier: 2.8.3 - typescript: 4.9.4 - vitest: 0.30.1 + '@types/luxon': + specifier: ^3.2.0 + version: 3.2.0 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.1 + version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.48.1 + version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + eslint: + specifier: ^8.31.0 + version: 8.31.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.31.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + eslint-plugin-simple-import-sort: + specifier: ^8.0.0 + version: 8.0.0(eslint@8.31.0) + ontime-types: + specifier: workspace:* + version: link:../types + prettier: + specifier: ^2.8.3 + version: 2.8.3 + typescript: + specifier: ^4.9.4 + version: 4.9.4 + vitest: + specifier: ^0.30.1 + version: 0.30.1 packages: - /7zip-bin/5.1.1: + /7zip-bin@5.1.1: resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} dev: true - /@adobe/css-tools/4.0.2: + /@adobe/css-tools@4.0.2: resolution: {integrity: sha512-Fx6tYjk2wKUgLi8uMANZr8GNZx05u44ArIJldn9VxLvolzlJVgHbTUCbwhMd6bcYky178+WUSxPHO3DAtGLWpw==} dev: true - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -297,25 +420,25 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data/7.20.10: + /@babel/compat-data@7.20.10: resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.12: + /@babel/core@7.20.12: resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.7 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.20.12) '@babel/helper-module-transforms': 7.20.11 '@babel/helpers': 7.20.7 '@babel/parser': 7.20.7 @@ -331,7 +454,7 @@ packages: - supports-color dev: true - /@babel/generator/7.20.7: + /@babel/generator@7.20.7: resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} engines: {node: '>=6.9.0'} dependencies: @@ -340,7 +463,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.20.12): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -354,12 +477,12 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.19.0: + /@babel/helper-function-name@7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: @@ -367,20 +490,20 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 - /@babel/helper-module-transforms/7.20.11: + /@babel/helper-module-transforms@7.20.11: resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} engines: {node: '>=6.9.0'} dependencies: @@ -396,39 +519,39 @@ packages: - supports-color dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.20.7: + /@babel/helpers@7.20.7: resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} engines: {node: '>=6.9.0'} dependencies: @@ -439,7 +562,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -447,7 +570,7 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.20.7: + /@babel/parser@7.20.7: resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} engines: {node: '>=6.0.0'} hasBin: true @@ -455,7 +578,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.12: + /@babel/plugin-transform-react-jsx-self@7.18.6(@babel/core@7.20.12): resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} engines: {node: '>=6.9.0'} peerDependencies: @@ -465,7 +588,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.12: + /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.20.12): resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -475,28 +598,28 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/runtime/7.20.7: + /@babel/runtime@7.20.7: resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/runtime/7.21.0: + /@babel/runtime@7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false - /@babel/runtime/7.22.5: + /@babel/runtime@7.22.5: resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -505,7 +628,7 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/traverse/7.20.12: + /@babel/traverse@7.20.12: resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} engines: {node: '>=6.9.0'} dependencies: @@ -523,7 +646,7 @@ packages: - supports-color dev: true - /@babel/types/7.20.7: + /@babel/types@7.20.7: resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} engines: {node: '>=6.9.0'} dependencies: @@ -531,318 +654,318 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@chakra-ui/accordion/2.2.0_xdwvxhu5ub5hflmtgd6mbsauaa: + /@chakra-ui/accordion@2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0): resolution: {integrity: sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/descendant': 3.0.14_react@18.2.0 - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/descendant': 3.0.14(react@18.2.0) + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/transition': 2.0.16_bdsblprzt47ebwyq2agncnzwpe - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.11.2)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/alert/2.1.0_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/alert@2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/anatomy/2.1.2: + /@chakra-ui/anatomy@2.1.2: resolution: {integrity: sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==} dev: false - /@chakra-ui/avatar/2.2.11_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/avatar@2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/image': 2.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/image': 2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/breadcrumb/2.1.5_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/breadcrumb@2.1.5(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/breakpoint-utils/2.0.8: + /@chakra-ui/breakpoint-utils@2.0.8: resolution: {integrity: sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==} dependencies: '@chakra-ui/shared-utils': 2.0.5 dev: false - /@chakra-ui/button/2.0.18_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/button@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/card/2.1.6_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/card@2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/checkbox/2.2.15_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/checkbox@2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/visually-hidden': 2.0.15_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/visually-hidden': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) '@zag-js/focus-visible': 0.2.2 react: 18.2.0 dev: false - /@chakra-ui/clickable/2.0.14_react@18.2.0: + /@chakra-ui/clickable@2.0.14(react@18.2.0): resolution: {integrity: sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 react: 18.2.0 dev: false - /@chakra-ui/close-button/2.0.17_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/close-button@2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/color-mode/2.1.12_react@18.2.0: + /@chakra-ui/color-mode@2.1.12(react@18.2.0): resolution: {integrity: sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/control-box/2.0.13_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/control-box@2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/counter/2.0.14_react@18.2.0: + /@chakra-ui/counter@2.0.14(react@18.2.0): resolution: {integrity: sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 react: 18.2.0 dev: false - /@chakra-ui/css-reset/2.1.2_3og6jmu6wvzuytygvdoxepq3x4: + /@chakra-ui/css-reset@2.1.2(@emotion/react@11.10.6)(react@18.2.0): resolution: {integrity: sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A==} peerDependencies: '@emotion/react': '>=10.0.35' react: '>=18' dependencies: - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 + '@emotion/react': 11.10.6(@types/react@18.0.26)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/descendant/3.0.14_react@18.2.0: + /@chakra-ui/descendant@3.0.14(react@18.2.0): resolution: {integrity: sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/dom-utils/2.1.0: + /@chakra-ui/dom-utils@2.1.0: resolution: {integrity: sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==} dev: false - /@chakra-ui/editable/3.0.0_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/editable@3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/event-utils/2.0.8: + /@chakra-ui/event-utils@2.0.8: resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} dev: false - /@chakra-ui/focus-lock/2.0.17_kzbn2opkn2327fwg5yzwzya5o4: + /@chakra-ui/focus-lock@2.0.17(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 react: 18.2.0 - react-focus-lock: 2.9.4_kzbn2opkn2327fwg5yzwzya5o4 + react-focus-lock: 2.9.4(@types/react@18.0.26)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/form-control/2.0.18_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/form-control@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/hooks/2.2.0_react@18.2.0: + /@chakra-ui/hooks@2.2.0(react@18.2.0): resolution: {integrity: sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-utils': 2.0.12_react@18.2.0 + '@chakra-ui/react-utils': 2.0.12(react@18.2.0) '@chakra-ui/utils': 2.0.15 compute-scroll-into-view: 1.0.20 copy-to-clipboard: 3.3.3 react: 18.2.0 dev: false - /@chakra-ui/icon/3.0.16_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/icon@3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/image/2.0.16_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/image@2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/input/2.0.22_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/input@2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/layout/2.2.0_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/layout@2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/lazy-utils/2.0.5: + /@chakra-ui/lazy-utils@2.0.5: resolution: {integrity: sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==} dev: false - /@chakra-ui/live-region/2.0.13_react@18.2.0: + /@chakra-ui/live-region@2.0.13(react@18.2.0): resolution: {integrity: sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==} peerDependencies: react: '>=18' @@ -850,47 +973,47 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/media-query/3.2.12_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/media-query@3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/react-env': 3.0.0_react@18.2.0 + '@chakra-ui/react-env': 3.0.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/menu/2.1.15_xdwvxhu5ub5hflmtgd6mbsauaa: + /@chakra-ui/menu@2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0): resolution: {integrity: sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.14_react@18.2.0 - '@chakra-ui/descendant': 3.0.14_react@18.2.0 + '@chakra-ui/clickable': 2.0.14(react@18.2.0) + '@chakra-ui/descendant': 3.0.14(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.14_react@18.2.0 - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-animation-state': 2.0.9_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-disclosure': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-focus-effect': 2.0.11_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-outside-click': 2.1.0_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/popper': 3.0.14(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.0.9(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.0.11(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-outside-click': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/transition': 2.0.16_bdsblprzt47ebwyq2agncnzwpe - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.11.2)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/modal/2.2.12_mifiypkmkwrvofebk2kkbeehoy: + /@chakra-ui/modal@2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.0.26)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -898,128 +1021,128 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.17_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/focus-lock': 2.0.17_kzbn2opkn2327fwg5yzwzya5o4 - '@chakra-ui/portal': 2.0.16_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/focus-lock': 2.0.17(@types/react@18.0.26)(react@18.2.0) + '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/transition': 2.0.16_bdsblprzt47ebwyq2agncnzwpe + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.11.2)(react@18.2.0) aria-hidden: 1.2.3 - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-remove-scroll: 2.5.6_kzbn2opkn2327fwg5yzwzya5o4 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.6(@types/react@18.0.26)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/number-input/2.0.19_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/number-input@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/counter': 2.0.14_react@18.2.0 - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-interval': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/counter': 2.0.14(react@18.2.0) + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-interval': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/number-utils/2.0.7: + /@chakra-ui/number-utils@2.0.7: resolution: {integrity: sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==} dev: false - /@chakra-ui/object-utils/2.1.0: + /@chakra-ui/object-utils@2.1.0: resolution: {integrity: sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==} dev: false - /@chakra-ui/pin-input/2.0.20_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/pin-input@2.0.20(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/descendant': 3.0.14_react@18.2.0 - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/descendant': 3.0.14(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/popover/2.1.12_xdwvxhu5ub5hflmtgd6mbsauaa: + /@chakra-ui/popover@2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0): resolution: {integrity: sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.17_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.14_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-animation-state': 2.0.9_react@18.2.0 - '@chakra-ui/react-use-disclosure': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-focus-effect': 2.0.11_react@18.2.0 - '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/popper': 3.0.14(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.0.9(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.0.11(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/popper/3.0.14_react@18.2.0: + /@chakra-ui/popper@3.0.14(react@18.2.0): resolution: {integrity: sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@popperjs/core': 2.11.8 react: 18.2.0 dev: false - /@chakra-ui/portal/2.0.16_biqbaboplfbrettd7655fr4n2y: + /@chakra-ui/portal@2.0.16(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==} peerDependencies: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/progress/2.1.6_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/progress@2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/provider/2.3.0_fbxtuirhogpez7m7qjkm3itwca: + /@chakra-ui/provider@2.3.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==} peerDependencies: '@emotion/react': ^11.0.0 @@ -1027,34 +1150,34 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/css-reset': 2.1.2_3og6jmu6wvzuytygvdoxepq3x4 - '@chakra-ui/portal': 2.0.16_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/react-env': 3.0.0_react@18.2.0 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/css-reset': 2.1.2(@emotion/react@11.10.6)(react@18.2.0) + '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-env': 3.0.0(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/styled': 11.10.6_qry7xzgsc55pr5ngbiorqn3fpa + '@emotion/react': 11.10.6(@types/react@18.0.26)(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.26)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/radio/2.0.22_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/radio@2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) '@zag-js/focus-visible': 0.2.2 react: 18.2.0 dev: false - /@chakra-ui/react-children-utils/2.0.6_react@18.2.0: + /@chakra-ui/react-children-utils@2.0.6(react@18.2.0): resolution: {integrity: sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==} peerDependencies: react: '>=18' @@ -1062,7 +1185,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-context/2.0.8_react@18.2.0: + /@chakra-ui/react-context@2.0.8(react@18.2.0): resolution: {integrity: sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==} peerDependencies: react: '>=18' @@ -1070,16 +1193,16 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-env/3.0.0_react@18.2.0: + /@chakra-ui/react-env@3.0.0(react@18.2.0): resolution: {integrity: sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-types/2.0.7_react@18.2.0: + /@chakra-ui/react-types@2.0.7(react@18.2.0): resolution: {integrity: sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==} peerDependencies: react: '>=18' @@ -1087,17 +1210,17 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-animation-state/2.0.9_react@18.2.0: + /@chakra-ui/react-use-animation-state@2.0.9(react@18.2.0): resolution: {integrity: sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-callback-ref/2.0.7_react@18.2.0: + /@chakra-ui/react-use-callback-ref@2.0.7(react@18.2.0): resolution: {integrity: sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==} peerDependencies: react: '>=18' @@ -1105,64 +1228,64 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-controllable-state/2.0.8_react@18.2.0: + /@chakra-ui/react-use-controllable-state@2.0.8(react@18.2.0): resolution: {integrity: sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-disclosure/2.0.8_react@18.2.0: + /@chakra-ui/react-use-disclosure@2.0.8(react@18.2.0): resolution: {integrity: sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-event-listener/2.0.7_react@18.2.0: + /@chakra-ui/react-use-event-listener@2.0.7(react@18.2.0): resolution: {integrity: sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-focus-effect/2.0.11_react@18.2.0: + /@chakra-ui/react-use-focus-effect@2.0.11(react@18.2.0): resolution: {integrity: sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-focus-on-pointer-down/2.0.6_react@18.2.0: + /@chakra-ui/react-use-focus-on-pointer-down@2.0.6(react@18.2.0): resolution: {integrity: sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-interval/2.0.5_react@18.2.0: + /@chakra-ui/react-use-interval@2.0.5(react@18.2.0): resolution: {integrity: sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-latest-ref/2.0.5_react@18.2.0: + /@chakra-ui/react-use-latest-ref@2.0.5(react@18.2.0): resolution: {integrity: sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==} peerDependencies: react: '>=18' @@ -1170,7 +1293,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-merge-refs/2.0.7_react@18.2.0: + /@chakra-ui/react-use-merge-refs@2.0.7(react@18.2.0): resolution: {integrity: sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==} peerDependencies: react: '>=18' @@ -1178,27 +1301,27 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-outside-click/2.1.0_react@18.2.0: + /@chakra-ui/react-use-outside-click@2.1.0(react@18.2.0): resolution: {integrity: sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-pan-event/2.0.9_react@18.2.0: + /@chakra-ui/react-use-pan-event@2.0.9(react@18.2.0): resolution: {integrity: sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/event-utils': 2.0.8 - '@chakra-ui/react-use-latest-ref': 2.0.5_react@18.2.0 + '@chakra-ui/react-use-latest-ref': 2.0.5(react@18.2.0) framesync: 6.1.2 react: 18.2.0 dev: false - /@chakra-ui/react-use-previous/2.0.5_react@18.2.0: + /@chakra-ui/react-use-previous@2.0.5(react@18.2.0): resolution: {integrity: sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==} peerDependencies: react: '>=18' @@ -1206,7 +1329,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-safe-layout-effect/2.0.5_react@18.2.0: + /@chakra-ui/react-use-safe-layout-effect@2.0.5(react@18.2.0): resolution: {integrity: sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==} peerDependencies: react: '>=18' @@ -1214,7 +1337,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-size/2.0.10_react@18.2.0: + /@chakra-ui/react-use-size@2.0.10(react@18.2.0): resolution: {integrity: sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==} peerDependencies: react: '>=18' @@ -1223,16 +1346,16 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-timeout/2.0.5_react@18.2.0: + /@chakra-ui/react-use-timeout@2.0.5(react@18.2.0): resolution: {integrity: sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-update-effect/2.0.7_react@18.2.0: + /@chakra-ui/react-use-update-effect@2.0.7(react@18.2.0): resolution: {integrity: sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==} peerDependencies: react: '>=18' @@ -1240,7 +1363,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-utils/2.0.12_react@18.2.0: + /@chakra-ui/react-utils@2.0.12(react@18.2.0): resolution: {integrity: sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==} peerDependencies: react: '>=18' @@ -1249,7 +1372,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react/2.7.0_tlyz7qwuzzubgapow55lw5vriq: + /@chakra-ui/react@2.7.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.26)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+FcUFQMsPfhWuM9Iu7uqufwwhmHN2IX6FWsBixYGOalO86dpgETsILMZP9PuWfgj7GpWiy2Dum6HXekh0Tk2Mg==} peerDependencies: '@emotion/react': ^11.0.0 @@ -1258,154 +1381,154 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/accordion': 2.2.0_xdwvxhu5ub5hflmtgd6mbsauaa - '@chakra-ui/alert': 2.1.0_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/avatar': 2.2.11_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/breadcrumb': 2.1.5_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/button': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/card': 2.1.6_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/checkbox': 2.2.15_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/close-button': 2.0.17_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/control-box': 2.0.13_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/counter': 2.0.14_react@18.2.0 - '@chakra-ui/css-reset': 2.1.2_3og6jmu6wvzuytygvdoxepq3x4 - '@chakra-ui/editable': 3.0.0_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/focus-lock': 2.0.17_kzbn2opkn2327fwg5yzwzya5o4 - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/hooks': 2.2.0_react@18.2.0 - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/image': 2.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/input': 2.0.22_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/layout': 2.2.0_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/live-region': 2.0.13_react@18.2.0 - '@chakra-ui/media-query': 3.2.12_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/menu': 2.1.15_xdwvxhu5ub5hflmtgd6mbsauaa - '@chakra-ui/modal': 2.2.12_mifiypkmkwrvofebk2kkbeehoy - '@chakra-ui/number-input': 2.0.19_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/pin-input': 2.0.20_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/popover': 2.1.12_xdwvxhu5ub5hflmtgd6mbsauaa - '@chakra-ui/popper': 3.0.14_react@18.2.0 - '@chakra-ui/portal': 2.0.16_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/progress': 2.1.6_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/provider': 2.3.0_fbxtuirhogpez7m7qjkm3itwca - '@chakra-ui/radio': 2.0.22_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-env': 3.0.0_react@18.2.0 - '@chakra-ui/select': 2.0.19_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/skeleton': 2.0.24_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/slider': 2.0.25_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/spinner': 2.0.13_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/stat': 2.0.18_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/stepper': 2.2.0_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/accordion': 2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0) + '@chakra-ui/alert': 2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/avatar': 2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/breadcrumb': 2.1.5(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/button': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/card': 2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/checkbox': 2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/control-box': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/counter': 2.0.14(react@18.2.0) + '@chakra-ui/css-reset': 2.1.2(@emotion/react@11.10.6)(react@18.2.0) + '@chakra-ui/editable': 3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/focus-lock': 2.0.17(@types/react@18.0.26)(react@18.2.0) + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/hooks': 2.2.0(react@18.2.0) + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/image': 2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/input': 2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/layout': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/live-region': 2.0.13(react@18.2.0) + '@chakra-ui/media-query': 3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/menu': 2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0) + '@chakra-ui/modal': 2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.0.26)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/number-input': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/pin-input': 2.0.20(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/popover': 2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0) + '@chakra-ui/popper': 3.0.14(react@18.2.0) + '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/progress': 2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/provider': 2.3.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/radio': 2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-env': 3.0.0(react@18.2.0) + '@chakra-ui/select': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/skeleton': 2.0.24(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/slider': 2.0.25(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/stat': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/stepper': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.0.27_xdwvxhu5ub5hflmtgd6mbsauaa - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/table': 2.0.17_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/tabs': 2.1.9_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/tag': 3.0.0_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/textarea': 2.0.19_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/theme': 3.1.2_hq32mhfiotloi5hecuixt2e454 + '@chakra-ui/switch': 2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/table': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/tabs': 2.1.9(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/tag': 3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/textarea': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) '@chakra-ui/theme-utils': 2.0.18 - '@chakra-ui/toast': 6.1.4_mqgjs6i23b3kxqr2rvhzy7z5lq - '@chakra-ui/tooltip': 2.2.9_mqgjs6i23b3kxqr2rvhzy7z5lq - '@chakra-ui/transition': 2.0.16_bdsblprzt47ebwyq2agncnzwpe + '@chakra-ui/toast': 6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.11.2)(react@18.2.0) '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.0.15_62ez5scglruzijw4rniqq4y54y - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/styled': 11.10.6_qry7xzgsc55pr5ngbiorqn3fpa - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/visually-hidden': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) + '@emotion/react': 11.10.6(@types/react@18.0.26)(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.26)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/select/2.0.19_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/select@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/shared-utils/2.0.5: + /@chakra-ui/shared-utils@2.0.5: resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} dev: false - /@chakra-ui/skeleton/2.0.24_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/skeleton@2.0.24(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/media-query': 3.2.12_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-use-previous': 2.0.5_react@18.2.0 + '@chakra-ui/media-query': 3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-use-previous': 2.0.5(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/slider/2.0.25_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/slider@2.0.25(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-callback-ref': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-latest-ref': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-pan-event': 2.0.9_react@18.2.0 - '@chakra-ui/react-use-size': 2.0.10_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-latest-ref': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-pan-event': 2.0.9(react@18.2.0) + '@chakra-ui/react-use-size': 2.0.10(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/spinner/2.0.13_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/spinner@2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/stat/2.0.18_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/stat@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/stepper/2.2.0_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/stepper@2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/styled-system/2.9.1: + /@chakra-ui/styled-system@2.9.1: resolution: {integrity: sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==} dependencies: '@chakra-ui/shared-utils': 2.0.5 @@ -1413,95 +1536,95 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/switch/2.0.27_xdwvxhu5ub5hflmtgd6mbsauaa: + /@chakra-ui/switch@2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react@18.2.0): resolution: {integrity: sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/checkbox': 2.2.15_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/checkbox': 2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/system/2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba: + /@chakra-ui/system@2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0): resolution: {integrity: sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 react: '>=18' dependencies: - '@chakra-ui/color-mode': 2.1.12_react@18.2.0 + '@chakra-ui/color-mode': 2.1.12(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-utils': 2.0.12_react@18.2.0 + '@chakra-ui/react-utils': 2.0.12(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 '@chakra-ui/theme-utils': 2.0.18 '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/styled': 11.10.6_qry7xzgsc55pr5ngbiorqn3fpa + '@emotion/react': 11.10.6(@types/react@18.0.26)(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.26)(react@18.2.0) react: 18.2.0 react-fast-compare: 3.2.1 dev: false - /@chakra-ui/table/2.0.17_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/table@2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8_react@18.2.0 + '@chakra-ui/react-context': 2.0.8(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/tabs/2.1.9_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/tabs@2.1.9(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.14_react@18.2.0 - '@chakra-ui/descendant': 3.0.14_react@18.2.0 + '@chakra-ui/clickable': 2.0.14(react@18.2.0) + '@chakra-ui/descendant': 3.0.14(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/react-children-utils': 2.0.6_react@18.2.0 - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-controllable-state': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-safe-layout-effect': 2.0.5_react@18.2.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/tag/3.0.0_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/tag@3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/textarea/2.0.19_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/textarea@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18_62ez5scglruzijw4rniqq4y54y + '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/theme-tools/2.0.18_hq32mhfiotloi5hecuixt2e454: + /@chakra-ui/theme-tools@2.0.18(@chakra-ui/styled-system@2.9.1): resolution: {integrity: sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==} peerDependencies: '@chakra-ui/styled-system': '>=2.0.0' @@ -1512,16 +1635,16 @@ packages: color2k: 2.0.2 dev: false - /@chakra-ui/theme-utils/2.0.18: + /@chakra-ui/theme-utils@2.0.18: resolution: {integrity: sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==} dependencies: '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme': 3.1.2_hq32mhfiotloi5hecuixt2e454 + '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/theme/3.1.2_hq32mhfiotloi5hecuixt2e454: + /@chakra-ui/theme@3.1.2(@chakra-ui/styled-system@2.9.1): resolution: {integrity: sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==} peerDependencies: '@chakra-ui/styled-system': '>=2.8.0' @@ -1529,10 +1652,10 @@ packages: '@chakra-ui/anatomy': 2.1.2 '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme-tools': 2.0.18_hq32mhfiotloi5hecuixt2e454 + '@chakra-ui/theme-tools': 2.0.18(@chakra-ui/styled-system@2.9.1) dev: false - /@chakra-ui/toast/6.1.4_mqgjs6i23b3kxqr2rvhzy7z5lq: + /@chakra-ui/toast@6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==} peerDependencies: '@chakra-ui/system': 2.5.8 @@ -1540,22 +1663,22 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/alert': 2.1.0_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/close-button': 2.0.17_62ez5scglruzijw4rniqq4y54y - '@chakra-ui/portal': 2.0.16_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/react-context': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-timeout': 2.0.5_react@18.2.0 - '@chakra-ui/react-use-update-effect': 2.0.7_react@18.2.0 + '@chakra-ui/alert': 2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-timeout': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - '@chakra-ui/theme': 3.1.2_hq32mhfiotloi5hecuixt2e454 - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/tooltip/2.2.9_mqgjs6i23b3kxqr2rvhzy7z5lq: + /@chakra-ui/tooltip@2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.11.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -1564,31 +1687,31 @@ packages: react-dom: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/popper': 3.0.14_react@18.2.0 - '@chakra-ui/portal': 2.0.16_biqbaboplfbrettd7655fr4n2y - '@chakra-ui/react-types': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-disclosure': 2.0.8_react@18.2.0 - '@chakra-ui/react-use-event-listener': 2.0.7_react@18.2.0 - '@chakra-ui/react-use-merge-refs': 2.0.7_react@18.2.0 + '@chakra-ui/popper': 3.0.14(react@18.2.0) + '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/transition/2.0.16_bdsblprzt47ebwyq2agncnzwpe: + /@chakra-ui/transition@2.0.16(framer-motion@10.11.2)(react@18.2.0): resolution: {integrity: sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 10.11.2_biqbaboplfbrettd7655fr4n2y + framer-motion: 10.11.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/utils/2.0.15: + /@chakra-ui/utils@2.0.15: resolution: {integrity: sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==} dependencies: '@types/lodash.mergewith': 4.6.7 @@ -1597,32 +1720,32 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/visually-hidden/2.0.15_62ez5scglruzijw4rniqq4y54y: + /@chakra-ui/visually-hidden@2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0): resolution: {integrity: sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.5.8_xqp3pgpqjlfxxa3zxu4zoc4fba + '@chakra-ui/system': 2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) react: 18.2.0 dev: false - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@develar/schema-utils/2.6.5: + /@develar/schema-utils@2.6.5: resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} dependencies: ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /@dnd-kit/accessibility/3.0.1_react@18.2.0: + /@dnd-kit/accessibility@3.0.1(react@18.2.0): resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} peerDependencies: react: '>=16.8.0' @@ -1631,32 +1754,32 @@ packages: tslib: 2.5.0 dev: false - /@dnd-kit/core/6.0.8_biqbaboplfbrettd7655fr4n2y: + /@dnd-kit/core@6.0.8(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@dnd-kit/accessibility': 3.0.1_react@18.2.0 - '@dnd-kit/utilities': 3.2.1_react@18.2.0 + '@dnd-kit/accessibility': 3.0.1(react@18.2.0) + '@dnd-kit/utilities': 3.2.1(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) tslib: 2.5.0 dev: false - /@dnd-kit/sortable/7.0.2_52scne4zmdeyjh2otzkgz2xfvu: + /@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8)(react@18.2.0): resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} peerDependencies: '@dnd-kit/core': ^6.0.7 react: '>=16.8.0' dependencies: - '@dnd-kit/core': 6.0.8_biqbaboplfbrettd7655fr4n2y - '@dnd-kit/utilities': 3.2.1_react@18.2.0 + '@dnd-kit/core': 6.0.8(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': 3.2.1(react@18.2.0) react: 18.2.0 tslib: 2.5.0 dev: false - /@dnd-kit/utilities/3.2.1_react@18.2.0: + /@dnd-kit/utilities@3.2.1(react@18.2.0): resolution: {integrity: sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA==} peerDependencies: react: '>=16.8.0' @@ -1665,7 +1788,7 @@ packages: tslib: 2.4.1 dev: false - /@electron/get/2.0.2: + /@electron/get@2.0.2: resolution: {integrity: sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==} engines: {node: '>=12'} dependencies: @@ -1682,7 +1805,7 @@ packages: - supports-color dev: true - /@electron/universal/1.2.1: + /@electron/universal@1.2.1: resolution: {integrity: sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==} engines: {node: '>=8.6'} dependencies: @@ -1697,7 +1820,7 @@ packages: - supports-color dev: true - /@emotion/babel-plugin/11.10.6: + /@emotion/babel-plugin@11.10.6: resolution: {integrity: sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==} dependencies: '@babel/helper-module-imports': 7.18.6 @@ -1713,7 +1836,7 @@ packages: stylis: 4.1.3 dev: false - /@emotion/cache/11.10.5: + /@emotion/cache@11.10.5: resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} dependencies: '@emotion/memoize': 0.8.0 @@ -1723,11 +1846,11 @@ packages: stylis: 4.1.3 dev: false - /@emotion/hash/0.9.0: + /@emotion/hash@0.9.0: resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} dev: false - /@emotion/is-prop-valid/0.8.8: + /@emotion/is-prop-valid@0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true dependencies: @@ -1735,22 +1858,22 @@ packages: dev: false optional: true - /@emotion/is-prop-valid/1.2.0: + /@emotion/is-prop-valid@1.2.0: resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} dependencies: '@emotion/memoize': 0.8.0 dev: false - /@emotion/memoize/0.7.4: + /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} dev: false optional: true - /@emotion/memoize/0.8.0: + /@emotion/memoize@0.8.0: resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} dev: false - /@emotion/react/11.10.6_kzbn2opkn2327fwg5yzwzya5o4: + /@emotion/react@11.10.6(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==} peerDependencies: '@types/react': '*' @@ -1763,7 +1886,7 @@ packages: '@emotion/babel-plugin': 11.10.6 '@emotion/cache': 11.10.5 '@emotion/serialize': 1.1.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) '@emotion/utils': 1.2.0 '@emotion/weak-memoize': 0.3.0 '@types/react': 18.0.26 @@ -1771,7 +1894,7 @@ packages: react: 18.2.0 dev: false - /@emotion/serialize/1.1.1: + /@emotion/serialize@1.1.1: resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} dependencies: '@emotion/hash': 0.9.0 @@ -1781,11 +1904,11 @@ packages: csstype: 3.1.1 dev: false - /@emotion/sheet/1.2.1: + /@emotion/sheet@1.2.1: resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} dev: false - /@emotion/styled/11.10.6_qry7xzgsc55pr5ngbiorqn3fpa: + /@emotion/styled@11.10.6(@emotion/react@11.10.6)(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -1798,19 +1921,19 @@ packages: '@babel/runtime': 7.21.0 '@emotion/babel-plugin': 11.10.6 '@emotion/is-prop-valid': 1.2.0 - '@emotion/react': 11.10.6_kzbn2opkn2327fwg5yzwzya5o4 + '@emotion/react': 11.10.6(@types/react@18.0.26)(react@18.2.0) '@emotion/serialize': 1.1.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) '@emotion/utils': 1.2.0 '@types/react': 18.0.26 react: 18.2.0 dev: false - /@emotion/unitless/0.8.0: + /@emotion/unitless@0.8.0: resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} dev: false - /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@18.2.0: + /@emotion/use-insertion-effect-with-fallbacks@1.0.0(react@18.2.0): resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} peerDependencies: react: '>=16.8.0' @@ -1818,24 +1941,15 @@ packages: react: 18.2.0 dev: false - /@emotion/utils/1.2.0: + /@emotion/utils@1.2.0: resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} dev: false - /@emotion/weak-memoize/0.3.0: + /@emotion/weak-memoize@0.3.0: resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} dev: false - /@esbuild/android-arm/0.17.5: - resolution: {integrity: sha512-crmPUzgCmF+qZXfl1YkiFoUta2XAfixR1tEnr/gXIixE+WL8Z0BGqfydP5oox0EUOgQMMRgtATtakyAcClQVqQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.17.5: + /@esbuild/android-arm64@0.17.5: resolution: {integrity: sha512-KHWkDqYAMmKZjY4RAN1PR96q6UOtfkWlTS8uEwWxdLtkRt/0F/csUhXIrVfaSIFxnscIBMPynGfhsMwQDRIBQw==} engines: {node: '>=12'} cpu: [arm64] @@ -1844,7 +1958,16 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.5: + /@esbuild/android-arm@0.17.5: + resolution: {integrity: sha512-crmPUzgCmF+qZXfl1YkiFoUta2XAfixR1tEnr/gXIixE+WL8Z0BGqfydP5oox0EUOgQMMRgtATtakyAcClQVqQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.5: resolution: {integrity: sha512-8fI/AnIdmWz/+1iza2WrCw8kwXK9wZp/yZY/iS8ioC+U37yJCeppi9EHY05ewJKN64ASoBIseufZROtcFnX5GA==} engines: {node: '>=12'} cpu: [x64] @@ -1853,7 +1976,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.5: + /@esbuild/darwin-arm64@0.17.5: resolution: {integrity: sha512-EAvaoyIySV6Iif3NQCglUNpnMfHSUgC5ugt2efl3+QDntucJe5spn0udNZjTgNi6tKVqSceOw9tQ32liNZc1Xw==} engines: {node: '>=12'} cpu: [arm64] @@ -1862,7 +1985,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.5: + /@esbuild/darwin-x64@0.17.5: resolution: {integrity: sha512-ha7QCJh1fuSwwCgoegfdaljowwWozwTDjBgjD3++WAy/qwee5uUi1gvOg2WENJC6EUyHBOkcd3YmLDYSZ2TPPA==} engines: {node: '>=12'} cpu: [x64] @@ -1871,7 +1994,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.5: + /@esbuild/freebsd-arm64@0.17.5: resolution: {integrity: sha512-VbdXJkn2aI2pQ/wxNEjEcnEDwPpxt3CWWMFYmO7CcdFBoOsABRy2W8F3kjbF9F/pecEUDcI3b5i2w+By4VQFPg==} engines: {node: '>=12'} cpu: [arm64] @@ -1880,7 +2003,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.5: + /@esbuild/freebsd-x64@0.17.5: resolution: {integrity: sha512-olgGYND1/XnnWxwhjtY3/ryjOG/M4WfcA6XH8dBTH1cxMeBemMODXSFhkw71Kf4TeZFFTN25YOomaNh0vq2iXg==} engines: {node: '>=12'} cpu: [x64] @@ -1889,16 +2012,7 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.5: - resolution: {integrity: sha512-YBdCyQwA3OQupi6W2/WO4FnI+NWFWe79cZEtlbqSESOHEg7a73htBIRiE6uHPQe7Yp5E4aALv+JxkRLGEUL7tw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.17.5: + /@esbuild/linux-arm64@0.17.5: resolution: {integrity: sha512-8a0bqSwu3OlLCfu2FBbDNgQyBYdPJh1B9PvNX7jMaKGC9/KopgHs37t+pQqeMLzcyRqG6z55IGNQAMSlCpBuqg==} engines: {node: '>=12'} cpu: [arm64] @@ -1907,7 +2021,16 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.5: + /@esbuild/linux-arm@0.17.5: + resolution: {integrity: sha512-YBdCyQwA3OQupi6W2/WO4FnI+NWFWe79cZEtlbqSESOHEg7a73htBIRiE6uHPQe7Yp5E4aALv+JxkRLGEUL7tw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.5: resolution: {integrity: sha512-uCwm1r/+NdP7vndctgq3PoZrnmhmnecWAr114GWMRwg2QMFFX+kIWnp7IO220/JLgnXK/jP7VKAFBGmeOYBQYQ==} engines: {node: '>=12'} cpu: [ia32] @@ -1916,7 +2039,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.5: + /@esbuild/linux-loong64@0.17.5: resolution: {integrity: sha512-3YxhSBl5Sb6TtBjJu+HP93poBruFzgXmf3PVfIe4xOXMj1XpxboYZyw3W8BhoX/uwxzZz4K1I99jTE/5cgDT1g==} engines: {node: '>=12'} cpu: [loong64] @@ -1925,7 +2048,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.5: + /@esbuild/linux-mips64el@0.17.5: resolution: {integrity: sha512-Hy5Z0YVWyYHdtQ5mfmfp8LdhVwGbwVuq8mHzLqrG16BaMgEmit2xKO+iDakHs+OetEx0EN/2mUzDdfdktI+Nmg==} engines: {node: '>=12'} cpu: [mips64el] @@ -1934,7 +2057,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.5: + /@esbuild/linux-ppc64@0.17.5: resolution: {integrity: sha512-5dbQvBLbU/Y3Q4ABc9gi23hww1mQcM7KZ9KBqabB7qhJswYMf8WrDDOSw3gdf3p+ffmijMd28mfVMvFucuECyg==} engines: {node: '>=12'} cpu: [ppc64] @@ -1943,7 +2066,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.5: + /@esbuild/linux-riscv64@0.17.5: resolution: {integrity: sha512-fp/KUB/ZPzEWGTEUgz9wIAKCqu7CjH1GqXUO2WJdik1UNBQ7Xzw7myIajpxztE4Csb9504ERiFMxZg5KZ6HlZQ==} engines: {node: '>=12'} cpu: [riscv64] @@ -1952,7 +2075,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.5: + /@esbuild/linux-s390x@0.17.5: resolution: {integrity: sha512-kRV3yw19YDqHTp8SfHXfObUFXlaiiw4o2lvT1XjsPZ++22GqZwSsYWJLjMi1Sl7j9qDlDUduWDze/nQx0d6Lzw==} engines: {node: '>=12'} cpu: [s390x] @@ -1961,7 +2084,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.5: + /@esbuild/linux-x64@0.17.5: resolution: {integrity: sha512-vnxuhh9e4pbtABNLbT2ANW4uwQ/zvcHRCm1JxaYkzSehugoFd5iXyC4ci1nhXU13mxEwCnrnTIiiSGwa/uAF1g==} engines: {node: '>=12'} cpu: [x64] @@ -1970,7 +2093,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.5: + /@esbuild/netbsd-x64@0.17.5: resolution: {integrity: sha512-cigBpdiSx/vPy7doUyImsQQBnBjV5f1M99ZUlaJckDAJjgXWl6y9W17FIfJTy8TxosEF6MXq+fpLsitMGts2nA==} engines: {node: '>=12'} cpu: [x64] @@ -1979,7 +2102,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.5: + /@esbuild/openbsd-x64@0.17.5: resolution: {integrity: sha512-VdqRqPVIjjZfkf40LrqOaVuhw9EQiAZ/GNCSM2UplDkaIzYVsSnycxcFfAnHdWI8Gyt6dO15KHikbpxwx+xHbw==} engines: {node: '>=12'} cpu: [x64] @@ -1988,7 +2111,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.5: + /@esbuild/sunos-x64@0.17.5: resolution: {integrity: sha512-ItxPaJ3MBLtI4nK+mALLEoUs6amxsx+J1ibnfcYMkqaCqHST1AkF4aENpBehty3czqw64r/XqL+W9WqU6kc2Qw==} engines: {node: '>=12'} cpu: [x64] @@ -1997,7 +2120,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.5: + /@esbuild/win32-arm64@0.17.5: resolution: {integrity: sha512-4u2Q6qsJTYNFdS9zHoAi80spzf78C16m2wla4eJPh4kSbRv+BpXIfl6TmBSWupD8e47B1NrTfrOlEuco7mYQtg==} engines: {node: '>=12'} cpu: [arm64] @@ -2006,7 +2129,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.5: + /@esbuild/win32-ia32@0.17.5: resolution: {integrity: sha512-KYlm+Xu9TXsfTWAcocLuISRtqxKp/Y9ZBVg6CEEj0O5J9mn7YvBKzAszo2j1ndyzUPk+op+Tie2PJeN+BnXGqQ==} engines: {node: '>=12'} cpu: [ia32] @@ -2015,7 +2138,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.5: + /@esbuild/win32-x64@0.17.5: resolution: {integrity: sha512-XgA9qWRqby7xdYXuF6KALsn37QGBMHsdhmnpjfZtYxKxbTOwfnDM6MYi2WuUku5poNaX2n9XGVr20zgT/2QwCw==} engines: {node: '>=12'} cpu: [x64] @@ -2024,7 +2147,7 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.4.1: + /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -2041,7 +2164,7 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.11.8: + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: @@ -2052,30 +2175,30 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@jest/expect-utils/29.3.1: + /@jest/expect-utils@29.3.1: resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.2.0 dev: true - /@jest/schemas/29.0.0: + /@jest/schemas@29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.24.51 dev: true - /@jest/types/29.3.1: + /@jest/types@29.3.1: resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -2087,7 +2210,7 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -2095,7 +2218,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -2104,42 +2227,42 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@malept/cross-spawn-promise/1.1.1: + /@malept/cross-spawn-promise@1.1.1: resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} engines: {node: '>= 10'} dependencies: cross-spawn: 7.0.3 dev: true - /@malept/flatpak-bundler/0.4.0: + /@malept/flatpak-bundler@0.4.0: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} dependencies: @@ -2151,7 +2274,7 @@ packages: - supports-color dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2159,12 +2282,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -2172,7 +2295,7 @@ packages: fastq: 1.15.0 dev: true - /@playwright/test/1.34.3: + /@playwright/test@1.34.3: resolution: {integrity: sha512-zPLef6w9P6T/iT6XDYG3mvGOqOyb6eHaV9XtkunYs0+OzxBtrPAAaHotc0X+PJ00WPPnLfFBTl7mf45Mn8DBmw==} engines: {node: '>=14'} hasBin: true @@ -2183,11 +2306,11 @@ packages: fsevents: 2.3.2 dev: true - /@popperjs/core/2.11.8: + /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@react-icons/all-files/4.1.0_react@18.2.0: + /@react-icons/all-files@4.1.0(react@18.2.0): resolution: {integrity: sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ==} peerDependencies: react: '*' @@ -2195,12 +2318,12 @@ packages: react: 18.2.0 dev: false - /@remix-run/router/1.2.1: + /@remix-run/router@1.2.1: resolution: {integrity: sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==} engines: {node: '>=14'} dev: false - /@rollup/pluginutils/5.0.2: + /@rollup/pluginutils@5.0.2: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2214,7 +2337,7 @@ packages: picomatch: 2.3.1 dev: true - /@sentry-internal/tracing/7.46.0: + /@sentry-internal/tracing@7.46.0: resolution: {integrity: sha512-KYoppa7PPL8Er7bdPoxTNUfIY804JL7hhOEomQHYD22rLynwQ4AaLm3YEY75QWwcGb0B7ZDMV+tSumW7Rxuwuw==} engines: {node: '>=8'} dependencies: @@ -2223,7 +2346,7 @@ packages: '@sentry/utils': 7.46.0 tslib: 1.14.1 - /@sentry-internal/tracing/7.47.0: + /@sentry-internal/tracing@7.47.0: resolution: {integrity: sha512-udpHnCzF8DQsWf0gQwd0XFGp6Y8MOiwnl8vGt2ohqZGS3m1+IxoRLXsSkD8qmvN6KKDnwbaAvYnK0z0L+AW95g==} engines: {node: '>=8'} dependencies: @@ -2232,7 +2355,7 @@ packages: '@sentry/utils': 7.47.0 tslib: 1.14.1 - /@sentry/browser/7.47.0: + /@sentry/browser@7.47.0: resolution: {integrity: sha512-L0t07kS/G1UGVZ9fpD6HLuaX8vVBqAGWgu+1uweXthYozu/N7ZAsakjU/Ozu6FSXj1mO3NOJZhOn/goIZLSj5A==} engines: {node: '>=8'} dependencies: @@ -2244,7 +2367,7 @@ packages: tslib: 1.14.1 dev: false - /@sentry/bundler-plugin-core/0.4.0: + /@sentry/bundler-plugin-core@0.4.0: resolution: {integrity: sha512-Xi+dqaSOoxbdmxegX7f66FVOxm2dVJLmrMXUpoNyuV6ASoccRWzouGaFekP059SUTTD05ytk1mHqwgVuBCA0Dw==} engines: {node: '>= 10'} dependencies: @@ -2258,7 +2381,7 @@ packages: - supports-color dev: true - /@sentry/cli/2.11.0: + /@sentry/cli@2.11.0: resolution: {integrity: sha512-qfCf/R0VhmlWcdfu2rntejqbIgovx7FQTwFreQpbISlB/JS9xHF8KEEJXZTdDFoPCi2H9KHg4CPUsCNAKbAdMA==} engines: {node: '>= 10'} hasBin: true @@ -2274,7 +2397,7 @@ packages: - supports-color dev: true - /@sentry/core/7.46.0: + /@sentry/core@7.46.0: resolution: {integrity: sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==} engines: {node: '>=8'} dependencies: @@ -2282,7 +2405,7 @@ packages: '@sentry/utils': 7.46.0 tslib: 1.14.1 - /@sentry/core/7.47.0: + /@sentry/core@7.47.0: resolution: {integrity: sha512-EFhZhKdMu7wKmWYZwbgTi8FNZ7Fq+HdlXiZWNz51Bqe3pHmfAkdHtAEs0Buo0v623MKA0CA4EjXIazGUM34XTg==} engines: {node: '>=8'} dependencies: @@ -2290,7 +2413,7 @@ packages: '@sentry/utils': 7.47.0 tslib: 1.14.1 - /@sentry/node/7.47.0: + /@sentry/node@7.47.0: resolution: {integrity: sha512-LTg2r5EV9yh4GLYDF+ViSltR9LLj/pcvk8YhANJcMO3Fp//xh8njcdU0FC2yNthUREawYDzAsVzLyCYJfV0H1A==} engines: {node: '>=8'} dependencies: @@ -2306,7 +2429,7 @@ packages: - supports-color dev: true - /@sentry/react/7.47.0_react@18.2.0: + /@sentry/react@7.47.0(react@18.2.0): resolution: {integrity: sha512-Qy6OnlE8FivKOLo0YE7tkr+G5fLmEOkpPxj179wbY/N8kp/ALkqbVdcOrZW7AL6HCc0lphhj+0SB+tpwoPEsiQ==} engines: {node: '>=8'} peerDependencies: @@ -2320,7 +2443,7 @@ packages: tslib: 1.14.1 dev: false - /@sentry/replay/7.47.0: + /@sentry/replay@7.47.0: resolution: {integrity: sha512-BFpVZVmwlezZ83y0L43TCTJY142Fxh+z+qZSwTag5HlhmIpBKw/WKg06ajOhrYJbCBkhHmeOvyKkxX0jnc39ZA==} engines: {node: '>=12'} dependencies: @@ -2329,35 +2452,35 @@ packages: '@sentry/utils': 7.47.0 dev: false - /@sentry/tracing/7.46.0: + /@sentry/tracing@7.46.0: resolution: {integrity: sha512-7qBtzmu7CDHclSKp+ZRrxoDcMyrev6/rxD2rSVJgB3o8gd2XGcO5vx9vuUOoYF0xTfOMXscR6Ft6JXE49xovYg==} engines: {node: '>=8'} dependencies: '@sentry-internal/tracing': 7.46.0 - /@sentry/types/7.46.0: + /@sentry/types@7.46.0: resolution: {integrity: sha512-2FMEMgt2h6u7AoELhNhu9L54GAh67KKfK2pJ1kEXJHmWxM9FSCkizjLs/t+49xtY7jEXr8qYq8bV967VfDPQ9g==} engines: {node: '>=8'} - /@sentry/types/7.47.0: + /@sentry/types@7.47.0: resolution: {integrity: sha512-GxXocplN0j1+uczovHrfkykl9wvkamDtWxlPUQgyGlbLGZn+UH1Y79D4D58COaFWGEZdSNKr62gZAjfEYu9nQA==} engines: {node: '>=8'} - /@sentry/utils/7.46.0: + /@sentry/utils@7.46.0: resolution: {integrity: sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==} engines: {node: '>=8'} dependencies: '@sentry/types': 7.46.0 tslib: 1.14.1 - /@sentry/utils/7.47.0: + /@sentry/utils@7.47.0: resolution: {integrity: sha512-A89SaOLp6XeZfByeYo2C8Ecye/YAtk/gENuyOUhQEdMulI6mZdjqtHAp7pTMVgkBc/YNARVuoa+kR/IdRrTPkQ==} engines: {node: '>=8'} dependencies: '@sentry/types': 7.47.0 tslib: 1.14.1 - /@sentry/vite-plugin/0.4.0: + /@sentry/vite-plugin@0.4.0: resolution: {integrity: sha512-dBxM00MCLzO/idzAqj33ZfbIBKZxP+FzpxtS2WaV0yzad9yLBAFZ/VGDIGHQJC0Qo3fsFi/CZpmN39wJkJoWFA==} engines: {node: '>= 10'} dependencies: @@ -2367,16 +2490,16 @@ packages: - supports-color dev: true - /@sinclair/typebox/0.24.51: + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true - /@sindresorhus/is/4.6.0: + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} dev: true - /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: @@ -2385,7 +2508,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-remove-jsx-attribute/6.5.0_@babel+core@7.20.12: + /@svgr/babel-plugin-remove-jsx-attribute@6.5.0(@babel/core@7.20.12): resolution: {integrity: sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==} engines: {node: '>=10'} peerDependencies: @@ -2394,7 +2517,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression/6.5.0_@babel+core@7.20.12: + /@svgr/babel-plugin-remove-jsx-empty-expression@6.5.0(@babel/core@7.20.12): resolution: {integrity: sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==} engines: {node: '>=10'} peerDependencies: @@ -2403,7 +2526,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: @@ -2412,7 +2535,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: @@ -2421,7 +2544,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: @@ -2430,7 +2553,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: @@ -2439,7 +2562,7 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.12: + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: @@ -2448,37 +2571,37 @@ packages: '@babel/core': 7.20.12 dev: true - /@svgr/babel-preset/6.5.1_@babel+core@7.20.12: + /@svgr/babel-preset@6.5.1(@babel/core@7.20.12): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.12 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1_@babel+core@7.20.12 - '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0_@babel+core@7.20.12 - '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0_@babel+core@7.20.12 - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1_@babel+core@7.20.12 - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1_@babel+core@7.20.12 - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1_@babel+core@7.20.12 - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1_@babel+core@7.20.12 - '@svgr/babel-plugin-transform-svg-component': 6.5.1_@babel+core@7.20.12 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.20.12) + '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0(@babel/core@7.20.12) + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0(@babel/core@7.20.12) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.20.12) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.20.12) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.20.12) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.20.12) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.20.12) dev: true - /@svgr/core/6.5.1: + /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: '@babel/core': 7.20.12 - '@svgr/babel-preset': 6.5.1_@babel+core@7.20.12 - '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1 + '@svgr/babel-preset': 6.5.1(@babel/core@7.20.12) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 transitivePeerDependencies: - supports-color dev: true - /@svgr/hast-util-to-babel-ast/6.5.1: + /@svgr/hast-util-to-babel-ast@6.5.1: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: @@ -2486,14 +2609,14 @@ packages: entities: 4.4.0 dev: true - /@svgr/plugin-jsx/6.5.1_@svgr+core@6.5.1: + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} engines: {node: '>=10'} peerDependencies: '@svgr/core': ^6.0.0 dependencies: '@babel/core': 7.20.12 - '@svgr/babel-preset': 6.5.1_@babel+core@7.20.12 + '@svgr/babel-preset': 6.5.1(@babel/core@7.20.12) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -2501,29 +2624,29 @@ packages: - supports-color dev: true - /@szmarczak/http-timer/4.0.6: + /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} dependencies: defer-to-connect: 2.0.1 dev: true - /@tanstack/eslint-plugin-query/4.26.2: + /@tanstack/eslint-plugin-query@4.26.2: resolution: {integrity: sha512-ugAvl6Is+bUMLt9BlAnXK6Wi7UnGV+4RwJ2W1ToFoucPvUb2Uf+ADU38JkHaNsI/TFgE3+kePhKh0zzDBhkw0Q==} dev: true - /@tanstack/match-sorter-utils/8.7.6: + /@tanstack/match-sorter-utils@8.7.6: resolution: {integrity: sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A==} engines: {node: '>=12'} dependencies: remove-accents: 0.4.2 dev: false - /@tanstack/query-core/4.27.0: + /@tanstack/query-core@4.27.0: resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} dev: false - /@tanstack/react-query-devtools/4.29.0_q4teel2yjbizrm4naiaqcdpjum: + /@tanstack/react-query-devtools@4.29.0(@tanstack/react-query@4.28.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bzotqin4Wa/GlPgJ2dI7eggQcbMDLIOwEClHGrkyie76DbT8vEEmEV9Kbh6kriKVSqCLpa9ZrgG/f8/Bx1zIwA==} peerDependencies: '@tanstack/react-query': 4.28.0 @@ -2531,14 +2654,14 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/match-sorter-utils': 8.7.6 - '@tanstack/react-query': 4.28.0_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query': 4.28.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) superjson: 1.12.1 - use-sync-external-store: 1.2.0_react@18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tanstack/react-query/4.28.0_biqbaboplfbrettd7655fr4n2y: + /@tanstack/react-query@4.28.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-8cGBV5300RHlvYdS4ea+G1JcZIt5CIuprXYFnsWggkmGoC0b5JaqG0fIX3qwDL9PTNkKvG76NGThIWbpXivMrQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2552,11 +2675,11 @@ packages: dependencies: '@tanstack/query-core': 4.27.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tanstack/react-table/8.9.2_biqbaboplfbrettd7655fr4n2y: + /@tanstack/react-table@8.9.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Irvw4wqVF9hhuYzmNrlae4IKdlmgSyoRWnApSLebvYzqHoi5tEsYzBj6YPd0hX78aB/L+4w/jgK2eBQVpGfThQ==} engines: {node: '>=12'} peerDependencies: @@ -2565,15 +2688,15 @@ packages: dependencies: '@tanstack/table-core': 8.9.2 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/table-core/8.9.2: + /@tanstack/table-core@8.9.2: resolution: {integrity: sha512-ajc0OF+karBAdaSz7OK09rCoAHB1XI1+wEhu+tDNMPc+XcO+dTlXXN/Vc0a8vym4kElvEjXEDd9c8Zfgt4bekA==} engines: {node: '>=12'} dev: false - /@testing-library/dom/8.19.1: + /@testing-library/dom@8.19.1: resolution: {integrity: sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg==} engines: {node: '>=12'} dependencies: @@ -2587,7 +2710,7 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom/5.16.5: + /@testing-library/jest-dom@5.16.5: resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: @@ -2602,7 +2725,7 @@ packages: redent: 3.0.0 dev: true - /@testing-library/react/13.4.0_biqbaboplfbrettd7655fr4n2y: + /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} engines: {node: '>=12'} peerDependencies: @@ -2613,49 +2736,51 @@ packages: '@testing-library/dom': 8.19.1 '@types/react-dom': 18.0.10 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event/14.4.3: + /@testing-library/user-event@14.4.3(@testing-library/dom@8.19.1): resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 8.19.1 dev: true - /@tootallnate/once/2.0.0: + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/aria-query/5.0.1: + /@types/aria-query@5.0.1: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: true - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 18.16.16 dev: true - /@types/cacheable-request/6.0.3: + /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.1 @@ -2664,49 +2789,49 @@ packages: '@types/responselike': 1.0.0 dev: true - /@types/chai-subset/1.3.3: + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: '@types/chai': 4.3.4 dev: true - /@types/chai/4.3.4: + /@types/chai@4.3.4: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} dev: true - /@types/color-convert/2.0.0: + /@types/color-convert@2.0.0: resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} dependencies: '@types/color-name': 1.1.1 dev: true - /@types/color-name/1.1.1: + /@types/color-name@1.1.1: resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} dev: true - /@types/color/3.0.3: + /@types/color@3.0.3: resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==} dependencies: '@types/color-convert': 2.0.0 dev: true - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.16.16 dev: true - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/express-serve-static-core/4.17.33: + /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: '@types/node': 18.16.16 @@ -2714,7 +2839,7 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.17: + /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2723,13 +2848,13 @@ packages: '@types/serve-static': 1.15.0 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 18.16.16 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} requiresBuild: true dependencies: @@ -2738,100 +2863,100 @@ packages: dev: true optional: true - /@types/http-cache-semantics/4.0.1: + /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/29.2.5: + /@types/jest@29.2.5: resolution: {integrity: sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==} dependencies: expect: 29.3.1 pretty-format: 29.3.1 dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/keyv/3.1.4: + /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 18.16.16 dev: true - /@types/lodash.mergewith/4.6.7: + /@types/lodash.mergewith@4.6.7: resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} dependencies: '@types/lodash': 4.14.191 dev: false - /@types/lodash/4.14.191: + /@types/lodash@4.14.191: resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} dev: false - /@types/luxon/3.2.0: + /@types/luxon@3.2.0: resolution: {integrity: sha512-lGmaGFoaXHuOLXFvuju2bfvZRqxAqkHPx9Y9IQdQABrinJJshJwfNCKV+u7rR3kJbiqfTF/NhOkcxxAFrObyaA==} dev: true - /@types/mime/3.0.1: + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true optional: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/node-osc/6.0.2: + /@types/node-osc@6.0.2: resolution: {integrity: sha512-/TxCH+NlDoI3hFA6b2O91dpnPAqBDkLb2HEIv5hMVdKnCiWTdJJv2sVnQdX38sBgnals8TjCQEGii+OcMVf2fg==} dependencies: '@types/node': 18.16.16 dev: true - /@types/node/16.18.11: + /@types/node@16.18.11: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} dev: true - /@types/node/16.18.23: + /@types/node@16.18.23: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node/18.11.18: + /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} dev: true - /@types/node/18.15.11: + /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: true - /@types/node/18.16.16: + /@types/node@18.16.16: resolution: {integrity: sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==} dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/plist/3.0.2: + /@types/plist@3.0.2: resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} requiresBuild: true dependencies: @@ -2840,83 +2965,83 @@ packages: dev: true optional: true - /@types/prop-types/15.7.5: + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/range-parser/1.2.4: + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true - /@types/react-dom/18.0.10: + /@types/react-dom@18.0.10: resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} dependencies: '@types/react': 18.0.26 dev: true - /@types/react/18.0.26: + /@types/react@18.0.26: resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 - /@types/responselike/1.0.0: + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: '@types/node': 18.16.16 dev: true - /@types/scheduler/0.16.2: + /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/serve-static/1.15.0: + /@types/serve-static@1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 '@types/node': 18.16.16 dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/testing-library__jest-dom/5.14.5: + /@types/testing-library__jest-dom@5.14.5: resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} dependencies: '@types/jest': 29.2.5 dev: true - /@types/verror/1.10.6: + /@types/verror@1.10.6: resolution: {integrity: sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==} requiresBuild: true dev: true optional: true - /@types/websocket/1.0.5: + /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: '@types/node': 18.11.18 dev: true - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/17.0.19: + /@types/yargs@17.0.19: resolution: {integrity: sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yauzl/2.10.0: + /@types/yauzl@2.10.0: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: @@ -2924,7 +3049,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.48.0_k73wpmdolxikpyqun3p36akaaq: + /@typescript-eslint/eslint-plugin@5.48.0(@typescript-eslint/parser@5.48.0)(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2935,23 +3060,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/parser': 5.48.0(eslint@8.31.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': 5.48.0 - '@typescript-eslint/type-utils': 5.48.0_iukboom6ndih5an6iafl45j2fe - '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/type-utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.48.1_3jon24igvnqaqexgwtxk6nkpse: + /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2962,23 +3087,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/parser': 5.48.1(eslint@8.31.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': 5.48.1 - '@typescript-eslint/type-utils': 5.48.1_iukboom6ndih5an6iafl45j2fe - '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/type-utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.48.0_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/parser@5.48.0(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2990,7 +3115,7 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.48.0 '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 + '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 typescript: 4.9.4 @@ -2998,7 +3123,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.48.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/parser@5.48.1(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3010,7 +3135,7 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.48.1 '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 typescript: 4.9.4 @@ -3018,7 +3143,7 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.48.0: + /@typescript-eslint/scope-manager@5.48.0: resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3026,7 +3151,7 @@ packages: '@typescript-eslint/visitor-keys': 5.48.0 dev: true - /@typescript-eslint/scope-manager/5.48.1: + /@typescript-eslint/scope-manager@5.48.1: resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3034,7 +3159,7 @@ packages: '@typescript-eslint/visitor-keys': 5.48.1 dev: true - /@typescript-eslint/type-utils/5.48.0_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/type-utils@5.48.0(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3044,17 +3169,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 - '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) + '@typescript-eslint/utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.48.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/type-utils@5.48.1(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3064,27 +3189,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4 - '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) + '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) debug: 4.3.4 eslint: 8.31.0 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.48.0: + /@typescript-eslint/types@5.48.0: resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.48.1: + /@typescript-eslint/types@5.48.1: resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.4: + /@typescript-eslint/typescript-estree@5.48.0(typescript@4.9.4): resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3099,13 +3224,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.48.1_typescript@4.9.4: + /@typescript-eslint/typescript-estree@5.48.1(typescript@4.9.4): resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3120,13 +3245,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 + tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.48.0_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/utils@5.48.0(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3136,17 +3261,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.48.0 '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 + '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) eslint: 8.31.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.31.0 + eslint-utils: 3.0.0(eslint@8.31.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils/5.48.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/utils@5.48.1(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3156,17 +3281,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.48.1 '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) eslint: 8.31.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.31.0 + eslint-utils: 3.0.0(eslint@8.31.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.48.0: + /@typescript-eslint/visitor-keys@5.48.0: resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3174,7 +3299,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.48.1: + /@typescript-eslint/visitor-keys@5.48.1: resolution: {integrity: sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -3182,23 +3307,23 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@vitejs/plugin-react/3.0.1_vite@4.3.1: + /@vitejs/plugin-react@3.0.1(vite@4.3.1): resolution: {integrity: sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 dependencies: '@babel/core': 7.20.12 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12 - '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.18.6(@babel/core@7.20.12) + '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.20.12) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.3.1_sass@1.57.1 + vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect/0.30.1: + /@vitest/expect@0.30.1: resolution: {integrity: sha512-c3kbEtN8XXJSeN81iDGq29bUzSjQhjES2WR3aColsS4lPGbivwLtas4DNUe0jD9gg/FYGIteqOenfU95EFituw==} dependencies: '@vitest/spy': 0.30.1 @@ -3206,7 +3331,7 @@ packages: chai: 4.3.7 dev: true - /@vitest/runner/0.30.1: + /@vitest/runner@0.30.1: resolution: {integrity: sha512-W62kT/8i0TF1UBCNMRtRMOBWJKRnNyv9RrjIgdUryEe0wNpGZvvwPDLuzYdxvgSckzjp54DSpv1xUbv4BQ0qVA==} dependencies: '@vitest/utils': 0.30.1 @@ -3215,7 +3340,7 @@ packages: pathe: 1.1.0 dev: true - /@vitest/snapshot/0.30.1: + /@vitest/snapshot@0.30.1: resolution: {integrity: sha512-fJZqKrE99zo27uoZA/azgWyWbFvM1rw2APS05yB0JaLwUIg9aUtvvnBf4q7JWhEcAHmSwbrxKFgyBUga6tq9Tw==} dependencies: magic-string: 0.30.0 @@ -3223,13 +3348,13 @@ packages: pretty-format: 27.5.1 dev: true - /@vitest/spy/0.30.1: + /@vitest/spy@0.30.1: resolution: {integrity: sha512-YfJeIf37GvTZe04ZKxzJfnNNuNSmTEGnla2OdL60C8od16f3zOfv9q9K0nNii0NfjDJRt/CVN/POuY5/zTS+BA==} dependencies: tinyspy: 2.1.0 dev: true - /@vitest/utils/0.30.1: + /@vitest/utils@0.30.1: resolution: {integrity: sha512-/c8Xv2zUVc+rnNt84QF0Y0zkfxnaGhp87K2dYJMLtLOIckPzuxLVzAtFCicGFdB4NeBHNzTRr1tNn7rCtQcWFA==} dependencies: concordance: 5.0.4 @@ -3237,23 +3362,23 @@ packages: pretty-format: 27.5.1 dev: true - /@zag-js/element-size/0.3.2: + /@zag-js/element-size@0.3.2: resolution: {integrity: sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ==} dev: false - /@zag-js/focus-visible/0.2.2: + /@zag-js/focus-visible@0.2.2: resolution: {integrity: sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA==} dev: false - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /abbrev/1.1.1: + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -3261,14 +3386,14 @@ packages: negotiator: 0.6.3 dev: false - /acorn-globals/7.0.1: + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.8.2 acorn-walk: 8.2.0 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3276,24 +3401,24 @@ packages: acorn: 8.8.2 dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.1: + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /adler-32/1.2.0: + /adler-32@1.2.0: resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} engines: {node: '>=0.8'} hasBin: true @@ -3302,12 +3427,12 @@ packages: printj: 1.1.2 dev: false - /adler-32/1.3.1: + /adler-32@1.3.1: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} engines: {node: '>=0.8'} dev: false - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -3316,7 +3441,7 @@ packages: - supports-color dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -3324,7 +3449,7 @@ packages: ajv: 6.12.6 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3333,30 +3458,30 @@ packages: uri-js: 4.4.1 dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: true - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -3364,11 +3489,11 @@ packages: picomatch: 2.3.1 dev: true - /app-builder-bin/4.0.0: + /app-builder-bin@4.0.0: resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} dev: true - /app-builder-lib/23.6.0: + /app-builder-lib@23.6.0: resolution: {integrity: sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==} engines: {node: '>=14.0.0'} dependencies: @@ -3402,36 +3527,36 @@ packages: - supports-color dev: true - /append-field/1.0.0: + /append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} dev: false - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-hidden/1.2.3: + /aria-hidden@1.2.3: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: tslib: 2.5.3 dev: false - /aria-query/5.1.3: + /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: deep-equal: 2.2.0 dev: true - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false - /array-includes/3.1.6: + /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: @@ -3442,12 +3567,12 @@ packages: is-string: 1.0.7 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.flatmap/1.3.1: + /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: @@ -3457,7 +3582,7 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.tosorted/1.1.1: + /array.prototype.tosorted@1.1.1: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: call-bind: 1.0.2 @@ -3467,7 +3592,7 @@ packages: get-intrinsic: 1.1.3 dev: true - /asar/3.2.0: + /asar@3.2.0: resolution: {integrity: sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==} engines: {node: '>=10.12.0'} deprecated: Please use @electron/asar moving forward. There is no API change, just a package name change @@ -3481,51 +3606,51 @@ packages: '@types/glob': 7.2.0 dev: true - /assert-plus/1.0.0: + /assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} requiresBuild: true dev: true optional: true - /assertion-error/1.1.0: + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} requiresBuild: true dev: true optional: true - /async-exit-hook/2.0.1: + /async-exit-hook@2.0.1: resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} engines: {node: '>=0.12.0'} dev: true - /async/3.2.4: + /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /autosize/6.0.1: + /autosize@6.0.1: resolution: {integrity: sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==} dev: false - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /axios/1.2.2: + /axios@1.2.2: resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==} dependencies: follow-redirects: 1.15.2 @@ -3535,7 +3660,7 @@ packages: - debug dev: false - /babel-plugin-macros/3.1.0: + /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: @@ -3544,39 +3669,39 @@ packages: resolve: 1.22.1 dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} requiresBuild: true dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /binpack/0.1.0: + /binpack@0.1.0: resolution: {integrity: sha512-KcSrsGiIKgklTWweVb9XnZPWO1/rGSsK3fwR7VnbDPbLKPlkvSKd/ZrJ1W712r6HzH5u0fa/AZCftATO09x8Aw==} dev: false - /bluebird-lst/1.0.9: + /bluebird-lst@1.0.9: resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} dependencies: bluebird: 3.7.2 dev: true - /bluebird/3.7.2: + /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /blueimp-md5/2.19.0: + /blueimp-md5@2.19.0: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: true - /body-parser/1.20.1: + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: @@ -3596,32 +3721,32 @@ packages: - supports-color dev: false - /boolean/3.2.0: + /boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: true optional: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /browserslist/4.21.4: + /browserslist@4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3629,37 +3754,37 @@ packages: caniuse-lite: 1.0.30001444 electron-to-chromium: 1.4.284 node-releases: 2.0.8 - update-browserslist-db: 1.0.10_browserslist@4.21.4 + update-browserslist-db: 1.0.10(browserslist@4.21.4) dev: true - /buffer-alloc-unsafe/1.1.0: + /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: true - /buffer-alloc/1.2.0: + /buffer-alloc@1.2.0: resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 dev: true - /buffer-crc32/0.2.13: + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-equal/1.0.0: + /buffer-equal@1.0.0: resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==} engines: {node: '>=0.4.0'} dev: true - /buffer-fill/1.0.0: + /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} requiresBuild: true dependencies: @@ -3668,7 +3793,7 @@ packages: dev: true optional: true - /builder-util-runtime/9.1.1: + /builder-util-runtime@9.1.1: resolution: {integrity: sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==} engines: {node: '>=12.0.0'} dependencies: @@ -3678,7 +3803,7 @@ packages: - supports-color dev: true - /builder-util/23.6.0: + /builder-util@23.6.0: resolution: {integrity: sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==} dependencies: 7zip-bin: 5.1.1 @@ -3702,29 +3827,29 @@ packages: - supports-color dev: true - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: false - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: false - /cac/6.7.14: + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true - /cacheable-lookup/5.0.4: + /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} dev: true - /cacheable-request/7.0.2: + /cacheable-request@7.0.2: resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} engines: {node: '>=8'} dependencies: @@ -3737,26 +3862,26 @@ packages: responselike: 2.0.1 dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.3 - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001444: + /caniuse-lite@1.0.30001444: resolution: {integrity: sha512-ecER9xgJQVMqcrxThKptsW0pPxSae8R2RB87LNa+ivW9ppNWRHEplXcDzkCOP4LYWGj8hunXLqaiC41iBATNyg==} dev: true - /cfb/1.2.2: + /cfb@1.2.2: resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} engines: {node: '>=0.8'} dependencies: @@ -3764,7 +3889,7 @@ packages: crc-32: 1.2.2 dev: false - /chai/4.3.7: + /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} dependencies: @@ -3777,7 +3902,7 @@ packages: type-detect: 4.0.8 dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -3785,7 +3910,7 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk/3.0.0: + /chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} dependencies: @@ -3793,7 +3918,7 @@ packages: supports-color: 7.2.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -3801,11 +3926,11 @@ packages: supports-color: 7.2.0 dev: true - /check-error/1.0.2: + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -3820,21 +3945,21 @@ packages: fsevents: 2.3.2 dev: true - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /chromium-pickle-js/0.2.0: + /chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} dev: true - /ci-info/3.7.1: + /ci-info@3.7.1: resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==} engines: {node: '>=8'} dev: true - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} requiresBuild: true @@ -3844,7 +3969,7 @@ packages: dev: true optional: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -3853,42 +3978,46 @@ packages: wrap-ansi: 7.0.0 dev: true - /clone-response/1.0.3: + /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 dev: true - /codepage/1.15.0: + /codepage@1.15.0: resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} engines: {node: '>=0.8'} dev: false - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string/1.9.1: + /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 dev: false - /color/4.2.3: + /color2k@2.0.2: + resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} + dev: false + + /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} dependencies: @@ -3896,47 +4025,43 @@ packages: color-string: 1.9.1 dev: false - /color2k/2.0.2: - resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} - dev: false - - /colors/1.0.3: + /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - /commander/2.9.0: + /commander@2.9.0: resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} engines: {node: '>= 0.6.x'} dependencies: graceful-readlink: 1.0.1 dev: true - /commander/5.1.0: + /commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} dev: true - /compare-version/0.1.2: + /compare-version@0.1.2: resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} engines: {node: '>=0.10.0'} dev: true - /compute-scroll-into-view/1.0.20: + /compute-scroll-into-view@1.0.20: resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /concat-stream/1.6.2: + /concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} dependencies: @@ -3946,7 +4071,7 @@ packages: typedarray: 0.0.6 dev: false - /concordance/5.0.4: + /concordance@5.0.4: resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} dependencies: @@ -3960,58 +4085,58 @@ packages: well-known-symbols: 2.0.0 dev: true - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: false - /content-type/1.0.4: + /content-type@1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} dev: false - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: false - /copy-anything/3.0.3: + /copy-anything@3.0.3: resolution: {integrity: sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw==} engines: {node: '>=12.13'} dependencies: is-what: 4.1.8 dev: false - /copy-to-clipboard/3.3.3: + /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: toggle-selection: 1.0.6 dev: false - /core-util-is/1.0.2: + /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} requiresBuild: true dev: true optional: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - /cors/2.8.5: + /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: @@ -4019,7 +4144,7 @@ packages: vary: 1.1.2 dev: false - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -4029,13 +4154,13 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /crc-32/1.2.2: + /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true dev: false - /crc/3.8.0: + /crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} requiresBuild: true dependencies: @@ -4043,11 +4168,11 @@ packages: dev: true optional: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -4055,7 +4180,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -4064,43 +4189,43 @@ packages: which: 2.0.2 dev: true - /css-box-model/1.2.1: + /css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} dependencies: tiny-invariant: 1.3.1 dev: false - /css.escape/1.5.1: + /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.5.0: + /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /csstype/3.1.1: + /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - /csstype/3.1.2: + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /csv-stringify/6.2.3: + /csv-stringify@6.2.3: resolution: {integrity: sha512-4qGjUMwnlaRc00gc2jrIYh2w/h1fo25B0mTuY9K8fBiIgtmCX3LcgUbrEGViL98Ci4Se/F5LFEtu8k+dItJVZQ==} dev: false - /data-urls/3.0.2: + /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} dependencies: @@ -4109,14 +4234,14 @@ packages: whatwg-url: 11.0.0 dev: true - /date-time/3.1.0: + /date-time@3.1.0: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} dependencies: time-zone: 1.0.0 dev: true - /debug/2.6.9: + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4126,7 +4251,7 @@ packages: dependencies: ms: 2.0.0 - /debug/3.2.7_supports-color@5.5.0: + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4138,7 +4263,7 @@ packages: supports-color: 5.5.0 dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4150,25 +4275,25 @@ packages: ms: 2.1.2 dev: true - /decimal.js/10.4.3: + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decompress-response/6.0.0: + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 dev: true - /deep-eql/4.1.3: + /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 dev: true - /deep-equal/2.2.0: + /deep-equal@2.2.0: resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} dependencies: call-bind: 1.0.2 @@ -4190,21 +4315,21 @@ packages: which-typed-array: 1.1.9 dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.3.0: + /deepmerge@4.3.0: resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} engines: {node: '>=0.10.0'} dev: false - /defer-to-connect/2.0.1: + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: true - /define-properties/1.1.4: + /define-properties@1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} dependencies: @@ -4212,7 +4337,7 @@ packages: object-keys: 1.1.1 dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -4220,40 +4345,40 @@ packages: object-keys: 1.1.1 dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: false - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-node-es/1.1.0: + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false - /detect-node/2.1.0: + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true optional: true - /diff-sequences/29.3.1: + /diff-sequences@29.3.1: resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-compare/2.4.0: + /dir-compare@2.4.0: resolution: {integrity: sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==} hasBin: true dependencies: @@ -4263,14 +4388,14 @@ packages: minimatch: 3.0.4 dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dmg-builder/23.6.0: + /dmg-builder@23.6.0: resolution: {integrity: sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==} dependencies: app-builder-lib: 23.6.0 @@ -4285,7 +4410,7 @@ packages: - supports-color dev: true - /dmg-license/1.0.11: + /dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} engines: {node: '>=8'} os: [darwin] @@ -4303,50 +4428,50 @@ packages: dev: true optional: true - /doctrine/2.1.0: + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /dom-accessibility-api/0.5.15: + /dom-accessibility-api@0.5.15: resolution: {integrity: sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw==} dev: true - /domexception/4.0.0: + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} dependencies: webidl-conversions: 7.0.0 dev: true - /dotenv-expand/5.1.0: + /dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} dev: true - /dotenv/16.0.3: + /dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: false - /dotenv/9.0.2: + /dotenv@9.0.2: resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} engines: {node: '>=10'} dev: true - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /ejs/3.1.8: + /ejs@3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} engines: {node: '>=0.10.0'} hasBin: true @@ -4354,7 +4479,7 @@ packages: jake: 10.8.5 dev: true - /electron-builder/23.6.0: + /electron-builder@23.6.0: resolution: {integrity: sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==} engines: {node: '>=14.0.0'} hasBin: true @@ -4375,7 +4500,7 @@ packages: - supports-color dev: true - /electron-osx-sign/0.6.0: + /electron-osx-sign@0.6.0: resolution: {integrity: sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==} engines: {node: '>=4.0.0'} deprecated: Please use @electron/osx-sign moving forward. Be aware the API is slightly different @@ -4391,7 +4516,7 @@ packages: - supports-color dev: true - /electron-publish/23.6.0: + /electron-publish@23.6.0: resolution: {integrity: sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==} dependencies: '@types/fs-extra': 9.0.13 @@ -4405,11 +4530,11 @@ packages: - supports-color dev: true - /electron-to-chromium/1.4.284: + /electron-to-chromium@1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true - /electron/22.3.5: + /electron@22.3.5: resolution: {integrity: sha512-CTdnoTbO3sDiMv47TX3ZO640Ca57v1qpiqGChFF8oZbtfHuQjTPPaE4hsoynf22wwnBiyJNL41DpB/pfp9USnA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4422,37 +4547,37 @@ packages: - supports-color dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: false - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true - /entities/4.4.0: + /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: true - /env-paths/2.2.1: + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - /es-abstract/1.21.1: + /es-abstract@1.21.1: resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: @@ -4491,7 +4616,7 @@ packages: which-typed-array: 1.1.9 dev: true - /es-get-iterator/1.1.3: + /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.2 @@ -4505,7 +4630,7 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -4514,13 +4639,13 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-shim-unscopables/1.0.0: + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -4529,12 +4654,12 @@ packages: is-symbol: 1.0.4 dev: true - /es6-error/4.1.1: + /es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} dev: true optional: true - /esbuild/0.17.5: + /esbuild@0.17.5: resolution: {integrity: sha512-Bu6WLCc9NMsNoMJUjGl3yBzTjVLXdysMltxQWiLAypP+/vQrf+3L1Xe8fCXzxaECus2cEJ9M7pk4yKatEwQMqQ==} engines: {node: '>=12'} hasBin: true @@ -4564,29 +4689,29 @@ packages: '@esbuild/win32-x64': 0.17.5 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -4599,7 +4724,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@8.31.0: + /eslint-config-prettier@8.6.0(eslint@8.31.0): resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: @@ -4608,7 +4733,7 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-jest/27.2.1_ohsifnwenhmxgcp7mend4dnv74: + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4621,15 +4746,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse - '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) eslint: 8.31.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-playwright/0.12.0_eslint@8.31.0: + /eslint-plugin-playwright@0.12.0(eslint@8.31.0): resolution: {integrity: sha512-KXuzQjVzca5irMT/7rvzJKsVDGbQr43oQPc8i+SLEBqmfrTxlwMwRqfv9vtZqh4hpU0jmrnA/EOfwtls+5QC1w==} peerDependencies: eslint: '>=7' @@ -4641,7 +4766,7 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-prettier/4.2.1_do5yx3dogbskqc4h5x5ilvlwyy: + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4653,28 +4778,12 @@ packages: optional: true dependencies: eslint: 8.31.0 - eslint-config-prettier: 8.6.0_eslint@8.31.0 + eslint-config-prettier: 8.6.0(eslint@8.31.0) prettier: 2.8.3 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier/4.2.1_ilxq7usaoskowiuvcfaznp7pcm: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.31.0 - prettier: 2.8.3 - prettier-linter-helpers: 1.0.0 - dev: true - - /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0: + /eslint-plugin-react-hooks@4.6.0(eslint@8.31.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: @@ -4683,7 +4792,7 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-react/7.32.0_eslint@8.31.0: + /eslint-plugin-react@7.32.0(eslint@8.31.0): resolution: {integrity: sha512-vSBi1+SrPiLZCGvxpiZIa28fMEUaMjXtCplrvxcIxGzmFiYdsXQDwInEjuv5/i/2CTTxbkS87tE8lsQ0Qxinbw==} engines: {node: '>=4'} peerDependencies: @@ -4707,7 +4816,7 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-simple-import-sort/8.0.0_eslint@8.31.0: + /eslint-plugin-simple-import-sort@8.0.0(eslint@8.31.0): resolution: {integrity: sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==} peerDependencies: eslint: '>=5.0.0' @@ -4715,20 +4824,20 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-testing-library/5.9.1_iukboom6ndih5an6iafl45j2fe: + /eslint-plugin-testing-library@5.9.1(eslint@8.31.0)(typescript@4.9.4): resolution: {integrity: sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) eslint: 8.31.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -4736,7 +4845,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -4744,7 +4853,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.31.0: + /eslint-utils@3.0.0(eslint@8.31.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -4754,17 +4863,17 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.31.0: + /eslint@8.31.0: resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -4780,7 +4889,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.31.0 + eslint-utils: 3.0.0(eslint@8.31.0) eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -4812,65 +4921,65 @@ packages: - supports-color dev: true - /espree/9.4.1: + /espree@9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.4.0: + /esquery@1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: false - /exit-on-epipe/1.0.1: + /exit-on-epipe@1.0.1: resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} engines: {node: '>=0.8'} dev: false - /expect/29.3.1: + /expect@29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -4881,7 +4990,7 @@ packages: jest-util: 29.3.1 dev: true - /express-session/1.17.3: + /express-session@1.17.3: resolution: {integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==} engines: {node: '>= 0.8.0'} dependencies: @@ -4897,7 +5006,7 @@ packages: - supports-color dev: false - /express-static-gzip/2.1.7: + /express-static-gzip@2.1.7: resolution: {integrity: sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw==} dependencies: serve-static: 1.15.0 @@ -4905,7 +5014,7 @@ packages: - supports-color dev: false - /express-validator/6.14.2: + /express-validator@6.14.2: resolution: {integrity: sha512-8XfAUrQ6Y7dIIuy9KcUPCfG/uCbvREctrxf5EeeME+ulanJ4iiW71lWmm9r4YcKKYOCBMan0WpVg7FtHu4Z4Wg==} engines: {node: '>= 8.0.0'} dependencies: @@ -4913,7 +5022,7 @@ packages: validator: 13.7.0 dev: false - /express/4.18.2: + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: @@ -4952,7 +5061,7 @@ packages: - supports-color dev: false - /extract-zip/2.0.1: + /extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} hasBin: true @@ -4966,22 +5075,22 @@ packages: - supports-color dev: true - /extsprintf/1.4.1: + /extsprintf@1.4.1: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} requiresBuild: true dev: true optional: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -4992,47 +5101,47 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /fd-slicer/1.1.0: + /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /filelist/1.0.4: + /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.2 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /finalhandler/1.2.0: + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: @@ -5047,11 +5156,11 @@ packages: - supports-color dev: false - /find-root/1.1.0: + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -5059,7 +5168,7 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -5067,18 +5176,18 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /focus-lock/0.11.6: + /focus-lock@0.11.6: resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} engines: {node: '>=10'} dependencies: tslib: 2.5.3 dev: false - /follow-redirects/1.15.2: + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5088,13 +5197,13 @@ packages: optional: true dev: false - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -5102,17 +5211,17 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: false - /frac/1.1.2: + /frac@1.1.2: resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} engines: {node: '>=0.8'} dev: false - /framer-motion/10.11.2_biqbaboplfbrettd7655fr4n2y: + /framer-motion@10.11.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IrwuC9regNOU99JoM/Z62CAMA3awGV6AcF7e3bcgXk/ZoNlGSt5aVq0J7UAwtLmCkwVlRvBkiMnvv2mZ1GW2pg==} peerDependencies: react: ^18.0.0 @@ -5124,24 +5233,24 @@ packages: optional: true dependencies: react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) tslib: 2.5.0 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false - /framesync/6.1.2: + /framesync@6.1.2: resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} dependencies: tslib: 2.4.0 dev: false - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: false - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -5150,7 +5259,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -5159,7 +5268,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -5169,18 +5278,18 @@ packages: universalify: 2.0.0 dev: true - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -5188,10 +5297,10 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -5201,32 +5310,32 @@ packages: functions-have-names: 1.2.3 dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name/2.0.0: + /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic/1.1.3: + /get-intrinsic@1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -5234,19 +5343,19 @@ packages: has-symbols: 1.0.3 dev: true - /get-nonce/1.0.1: + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} dev: false - /get-stream/5.2.0: + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} dependencies: pump: 3.0.0 dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -5254,21 +5363,21 @@ packages: get-intrinsic: 1.1.3 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -5279,7 +5388,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /global-agent/3.0.0: + /global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} requiresBuild: true @@ -5293,26 +5402,26 @@ packages: dev: true optional: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.19.0: + /globals@13.19.0: resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -5324,17 +5433,17 @@ packages: slash: 3.0.0 dev: true - /globrex/0.1.2: + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.1.3 dev: true - /got/11.8.6: + /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} dependencies: @@ -5351,84 +5460,84 @@ packages: responselike: 2.0.1 dev: true - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /graceful-readlink/1.0.1: + /graceful-readlink@1.0.1: resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - /hoist-non-react-statics/3.3.2: + /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 dev: false - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /html-encoding-sniffer/3.0.0: + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 dev: true - /http-cache-semantics/4.1.1: + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -5439,7 +5548,7 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent/5.0.0: + /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} dependencies: @@ -5450,7 +5559,7 @@ packages: - supports-color dev: true - /http2-wrapper/1.0.3: + /http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} dependencies: @@ -5458,7 +5567,7 @@ packages: resolve-alpn: 1.2.1 dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -5468,7 +5577,7 @@ packages: - supports-color dev: true - /iconv-corefoundation/1.1.7: + /iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} engines: {node: ^8.11.2 || >=10} os: [darwin] @@ -5479,67 +5588,67 @@ packages: dev: true optional: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: false - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} requiresBuild: true dev: true optional: true - /ignore-by-default/1.0.1: + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /immutable/4.2.2: + /immutable@4.2.2: resolution: {integrity: sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /internal-slot/1.0.4: + /internal-slot@1.0.4: resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} engines: {node: '>= 0.4'} dependencies: @@ -5548,23 +5657,23 @@ packages: side-channel: 1.0.4 dev: true - /interpret/1.4.0: + /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} dev: true - /invariant/2.2.4: + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: false - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: false - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -5572,7 +5681,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.1: + /is-array-buffer@3.0.1: resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} dependencies: call-bind: 1.0.2 @@ -5580,27 +5689,27 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-arrayish/0.3.2: + /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -5608,78 +5717,78 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-ci/3.0.1: + /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.7.1 dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-map/2.0.2: + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -5687,31 +5796,31 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-set/2.0.2: + /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -5722,53 +5831,53 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-weakmap/2.0.1: + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-weakset/2.0.2: + /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.3 dev: true - /is-what/4.1.8: + /is-what@4.1.8: resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} engines: {node: '>=12.13'} dev: false - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false - /isarray/2.0.5: + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true - /isbinaryfile/3.0.3: + /isbinaryfile@3.0.3: resolution: {integrity: sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==} engines: {node: '>=0.6.0'} dependencies: buffer-alloc: 1.2.0 dev: true - /isbinaryfile/4.0.10: + /isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jake/10.8.5: + /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} hasBin: true @@ -5779,7 +5888,7 @@ packages: minimatch: 3.1.2 dev: true - /jest-diff/29.3.1: + /jest-diff@29.3.1: resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5789,12 +5898,12 @@ packages: pretty-format: 29.3.1 dev: true - /jest-get-type/29.2.0: + /jest-get-type@29.2.0: resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-matcher-utils/29.3.1: + /jest-matcher-utils@29.3.1: resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5804,7 +5913,7 @@ packages: pretty-format: 29.3.1 dev: true - /jest-message-util/29.3.1: + /jest-message-util@29.3.1: resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5819,7 +5928,7 @@ packages: stack-utils: 2.0.6 dev: true - /jest-util/29.3.1: + /jest-util@29.3.1: resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -5831,26 +5940,26 @@ packages: picomatch: 2.3.1 dev: true - /js-sdsl/4.2.0: + /js-sdsl@4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true - /js-string-escape/1.0.1: + /js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 dev: true - /jsdom/21.1.0: + /jsdom@21.1.0: resolution: {integrity: sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==} engines: {node: '>=14'} peerDependencies: @@ -5891,49 +6000,49 @@ packages: - utf-8-validate dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-buffer/3.0.1: + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json-stringify-safe/5.0.1: + /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true optional: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -5941,7 +6050,7 @@ packages: graceful-fs: 4.2.11 dev: true - /jsx-ast-utils/3.3.3: + /jsx-ast-utils@3.3.3: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} dependencies: @@ -5949,17 +6058,17 @@ packages: object.assign: 4.1.4 dev: true - /keyv/4.5.2: + /keyv@4.5.2: resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} dependencies: json-buffer: 3.0.1 dev: true - /lazy-val/1.0.5: + /lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -5967,7 +6076,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -5975,102 +6084,102 @@ packages: type-check: 0.4.0 dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /local-pkg/0.4.3: + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith/4.6.2: + /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: false - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /loose-envify/1.4.0: + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - /loupe/2.3.6: + /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.0 dev: true - /lowdb/5.0.5: + /lowdb@5.0.5: resolution: {integrity: sha512-7EWKmIMhNKA8TXFhL8t0p6N2LC53l3ZqsWQGSksGhhjrcms9rbKlyrAh2PzSGK5v0KPJ2W5VItBnC3NDRzOnzQ==} engines: {node: '>=14.16'} dependencies: steno: 3.1.0 dev: false - /lowercase-keys/2.0.0: + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /lru_map/0.3.3: + /lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} dev: true - /luxon/3.3.0: + /luxon@3.3.0: resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} dev: false - /lz-string/1.4.4: + /lz-string@1.4.4: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true dev: true - /magic-string/0.27.0: + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.30.0: + /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /matcher/3.0.0: + /matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} dependencies: @@ -6078,33 +6187,33 @@ packages: dev: true optional: true - /md5-hex/3.0.1: + /md5-hex@3.0.1: resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} engines: {node: '>=8'} dependencies: blueimp-md5: 2.19.0 dev: true - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /methods/1.1.2: + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: false - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -6112,80 +6221,80 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: false - /mime/2.6.0: + /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true dev: true - /mimic-response/1.0.1: + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} dev: true - /mimic-response/3.1.0: + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimatch/3.0.4: + /minimatch@3.0.4: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/5.1.2: + /minimatch@5.1.2: resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - /minipass/3.3.6: + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minipass/4.0.0: + /minipass@4.0.0: resolution: {integrity: sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -6193,20 +6302,20 @@ packages: yallist: 4.0.0 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.7 dev: false - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mlly/1.2.0: + /mlly@1.2.0: resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} dependencies: acorn: 8.8.2 @@ -6215,17 +6324,17 @@ packages: ufo: 1.1.1 dev: true - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multer/1.4.5-lts.1: + /multer@1.4.5-lts.1: resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -6238,38 +6347,38 @@ packages: xtend: 4.0.2 dev: false - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /nanoid/4.0.1: + /nanoid@4.0.1: resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==} engines: {node: ^14 || ^16 || >=18} hasBin: true dev: false - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: false - /node-addon-api/1.7.2: + /node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} requiresBuild: true dev: true optional: true - /node-fetch/2.6.8: + /node-fetch@2.6.8: resolution: {integrity: sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -6281,18 +6390,18 @@ packages: whatwg-url: 5.0.0 dev: true - /node-osc/9.0.2: + /node-osc@9.0.2: resolution: {integrity: sha512-q+VQL7DMWRL5+yvzRlWVig8BD9raotLs6onHU4e8MaFgxmYuIwcXhsvQeyUZFiKP6y/qGUXU6K0T99gVmISwmA==} engines: {node: ^18.17.0 || >=20.5.0} dependencies: osc-min: 1.1.2 dev: false - /node-releases/2.0.8: + /node-releases@2.0.8: resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} dev: true - /node-xlsx/0.21.0: + /node-xlsx@0.21.0: resolution: {integrity: sha512-MB+KcNCuRzwjgr17scpKiVTPd4Vbj3V+7QwKpqACGyJzhvC67xCQUbw2vYEIKtNfMfcLxgB2q2kEuRS8rmak9g==} engines: {node: '>=10.0.0'} hasBin: true @@ -6300,13 +6409,13 @@ packages: xlsx: 0.17.5 dev: false - /nodemon/2.0.20: + /nodemon@2.0.20: resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} engines: {node: '>=8.10.0'} hasBin: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -6317,35 +6426,35 @@ packages: undefsafe: 2.0.5 dev: true - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /normalize-url/6.1.0: + /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} dev: true - /nwsapi/2.2.2: + /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -6353,12 +6462,12 @@ packages: define-properties: 1.1.4 dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -6368,7 +6477,7 @@ packages: object-keys: 1.1.1 dev: true - /object.entries/1.1.6: + /object.entries@1.1.6: resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} engines: {node: '>= 0.4'} dependencies: @@ -6377,7 +6486,7 @@ packages: es-abstract: 1.21.1 dev: true - /object.fromentries/2.0.6: + /object.fromentries@2.0.6: resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} engines: {node: '>= 0.4'} dependencies: @@ -6386,14 +6495,14 @@ packages: es-abstract: 1.21.1 dev: true - /object.hasown/1.1.2: + /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: define-properties: 1.1.4 es-abstract: 1.21.1 dev: true - /object.values/1.1.6: + /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: @@ -6402,25 +6511,25 @@ packages: es-abstract: 1.21.1 dev: true - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: false - /on-headers/1.0.2: + /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} dev: false - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -6432,7 +6541,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -6444,46 +6553,46 @@ packages: word-wrap: 1.2.3 dev: true - /osc-min/1.1.2: + /osc-min@1.1.2: resolution: {integrity: sha512-8DbiO8ME85R75stgNVCZtHxB9MNBBNcyy+isNBXrsFeinXGjwNAauvKVmGlfRas5VJWC/mhzIx7spR2gFvWxvg==} engines: {node: '>=0.10.0'} dependencies: binpack: 0.1.0 dev: false - /p-cancelable/2.1.1: + /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-limit/4.0.0: + /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -6492,30 +6601,30 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse5/7.1.2: + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.4.0 dev: true - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false - /passport-local/1.0.0: + /passport-local@1.0.0: resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} engines: {node: '>= 0.4.0'} dependencies: passport-strategy: 1.0.0 dev: false - /passport-strategy/1.0.0: + /passport-strategy@1.0.0: resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} engines: {node: '>= 0.4.0'} dev: false - /passport/0.6.0: + /passport@0.6.0: resolution: {integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==} engines: {node: '>= 0.4.0'} dependencies: @@ -6524,58 +6633,58 @@ packages: utils-merge: 1.0.1 dev: false - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pathe/1.1.0: + /pathe@1.1.0: resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} dev: true - /pathval/1.1.1: + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - /pause/0.0.1: + /pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} dev: false - /pend/1.2.0: + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pkg-types/1.0.2: + /pkg-types@1.0.2: resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: jsonc-parser: 3.2.0 @@ -6583,13 +6692,13 @@ packages: pathe: 1.1.0 dev: true - /playwright-core/1.34.3: + /playwright-core@1.34.3: resolution: {integrity: sha512-2pWd6G7OHKemc5x1r1rp8aQcpvDh7goMBZlJv6Co5vCNLVcQJdhxRL09SGaY6HcyHH9aT4tiynZabMofVasBYw==} engines: {node: '>=14'} hasBin: true dev: true - /plist/3.0.6: + /plist@3.0.6: resolution: {integrity: sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==} engines: {node: '>=6'} dependencies: @@ -6597,7 +6706,7 @@ packages: xmlbuilder: 15.1.1 dev: true - /postcss/8.4.21: + /postcss@8.4.21: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -6606,36 +6715,36 @@ packages: source-map-js: 1.0.2 dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier/2.8.2: + /prettier@2.8.2: resolution: {integrity: sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /prettier/2.8.3: + /prettier@2.8.3: resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-format/27.5.1: + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6644,7 +6753,7 @@ packages: react-is: 17.0.2 dev: true - /pretty-format/29.3.1: + /pretty-format@29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: @@ -6653,29 +6762,29 @@ packages: react-is: 18.2.0 dev: true - /printj/1.1.2: + /printj@1.1.2: resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} engines: {node: '>=0.8'} hasBin: true dev: false - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /prop-types/15.8.1: + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -6683,64 +6792,64 @@ packages: ipaddr.js: 1.9.1 dev: false - /proxy-from-env/1.1.0: + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true - /punycode/2.1.1: + /punycode@2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /qr.js/0.0.0: + /qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} dev: false - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: false - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: true - /random-bytes/1.0.0: + /random-bytes@1.0.0: resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} engines: {node: '>= 0.8'} dev: false - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: false - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -6750,7 +6859,7 @@ packages: unpipe: 1.0.0 dev: false - /react-clientside-effect/1.2.6_react@18.2.0: + /react-clientside-effect@1.2.6(react@18.2.0): resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -6759,17 +6868,17 @@ packages: react: 18.2.0 dev: false - /react-colorful/5.6.1_biqbaboplfbrettd7655fr4n2y: + /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react-dom/18.2.0_react@18.2.0: + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 @@ -6778,15 +6887,15 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-fast-compare/3.2.0: + /react-fast-compare@3.2.0: resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: false - /react-fast-compare/3.2.1: + /react-fast-compare@3.2.1: resolution: {integrity: sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==} dev: false - /react-focus-lock/2.9.4_kzbn2opkn2327fwg5yzwzya5o4: + /react-focus-lock@2.9.4(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -6800,12 +6909,12 @@ packages: focus-lock: 0.11.6 prop-types: 15.8.1 react: 18.2.0 - react-clientside-effect: 1.2.6_react@18.2.0 - use-callback-ref: 1.3.0_kzbn2opkn2327fwg5yzwzya5o4 - use-sidecar: 1.1.2_kzbn2opkn2327fwg5yzwzya5o4 + react-clientside-effect: 1.2.6(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.0.26)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.0.26)(react@18.2.0) dev: false - /react-hook-form/7.43.5_react@18.2.0: + /react-hook-form@7.43.5(react@18.2.0): resolution: {integrity: sha512-YcaXhuFHoOPipu5pC7ckxrLrialiOcU91pKu8P+isAcXZyMgByUK9PkI9j5fENO4+6XU5PwWXRGMIFlk9u9UBQ==} engines: {node: '>=12.22.0'} peerDependencies: @@ -6814,18 +6923,18 @@ packages: react: 18.2.0 dev: false - /react-is/16.13.1: + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is/17.0.2: + /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /react-qr-code/2.0.11_react@18.2.0: + /react-qr-code@2.0.11(react@18.2.0): resolution: {integrity: sha512-P7mvVM5vk9NjGdHMt4Z0KWeeJYwRAtonHTghZT2r+AASinLUUKQ9wfsGH2lPKsT++gps7hXmaiMGRvwTDEL9OA==} peerDependencies: react: ^16.x || ^17.x || ^18.x @@ -6839,12 +6948,12 @@ packages: react: 18.2.0 dev: false - /react-refresh/0.14.0: + /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar/2.3.4_kzbn2opkn2327fwg5yzwzya5o4: + /react-remove-scroll-bar@2.3.4(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -6856,11 +6965,11 @@ packages: dependencies: '@types/react': 18.0.26 react: 18.2.0 - react-style-singleton: 2.2.1_kzbn2opkn2327fwg5yzwzya5o4 + react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) tslib: 2.5.3 dev: false - /react-remove-scroll/2.5.6_kzbn2opkn2327fwg5yzwzya5o4: + /react-remove-scroll@2.5.6(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==} engines: {node: '>=10'} peerDependencies: @@ -6872,14 +6981,14 @@ packages: dependencies: '@types/react': 18.0.26 react: 18.2.0 - react-remove-scroll-bar: 2.3.4_kzbn2opkn2327fwg5yzwzya5o4 - react-style-singleton: 2.2.1_kzbn2opkn2327fwg5yzwzya5o4 + react-remove-scroll-bar: 2.3.4(@types/react@18.0.26)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) tslib: 2.5.3 - use-callback-ref: 1.3.0_kzbn2opkn2327fwg5yzwzya5o4 - use-sidecar: 1.1.2_kzbn2opkn2327fwg5yzwzya5o4 + use-callback-ref: 1.3.0(@types/react@18.0.26)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.0.26)(react@18.2.0) dev: false - /react-router-dom/6.6.2_biqbaboplfbrettd7655fr4n2y: + /react-router-dom@6.6.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA==} engines: {node: '>=14'} peerDependencies: @@ -6888,11 +6997,11 @@ packages: dependencies: '@remix-run/router': 1.2.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-router: 6.6.2_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.6.2(react@18.2.0) dev: false - /react-router/6.6.2_react@18.2.0: + /react-router@6.6.2(react@18.2.0): resolution: {integrity: sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ==} engines: {node: '>=14'} peerDependencies: @@ -6902,7 +7011,7 @@ packages: react: 18.2.0 dev: false - /react-style-singleton/2.2.1_kzbn2opkn2327fwg5yzwzya5o4: + /react-style-singleton@2.2.1(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -6919,13 +7028,13 @@ packages: tslib: 2.5.3 dev: false - /react/18.2.0: + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - /read-config-file/6.2.0: + /read-config-file@6.2.0: resolution: {integrity: sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==} engines: {node: '>=12.0.0'} dependencies: @@ -6936,7 +7045,7 @@ packages: lazy-val: 1.0.5 dev: true - /readable-stream/2.3.7: + /readable-stream@2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: core-util-is: 1.0.3 @@ -6948,21 +7057,21 @@ packages: util-deprecate: 1.0.2 dev: false - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /rechoir/0.6.2: + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: resolve: 1.22.1 dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -6970,10 +7079,10 @@ packages: strip-indent: 3.0.0 dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -6982,33 +7091,33 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /remove-accents/0.4.2: + /remove-accents@0.4.2: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-alpn/1.2.1: + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -7016,7 +7125,7 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve/2.0.0-next.4: + /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: @@ -7025,25 +7134,25 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /responselike/2.0.1: + /responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /roarr/2.15.4: + /roarr@2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} dependencies: @@ -7056,7 +7165,7 @@ packages: dev: true optional: true - /rollup/3.20.7: + /rollup@3.20.7: resolution: {integrity: sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -7064,21 +7173,21 @@ packages: fsevents: 2.3.2 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -7086,16 +7195,16 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sanitize-filename/1.6.3: + /sanitize-filename@1.6.3: resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} dependencies: truncate-utf8-bytes: 1.0.2 dev: true - /sass/1.57.1: + /sass@1.57.1: resolution: {integrity: sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==} engines: {node: '>=12.0.0'} hasBin: true @@ -7105,43 +7214,43 @@ packages: source-map-js: 1.0.2 dev: true - /sax/1.2.4: + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: true - /saxes/6.0.0: + /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 dev: true - /scheduler/0.23.0: + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - /semver-compare/1.0.0: + /semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} dev: true optional: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.0.0: + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -7149,7 +7258,7 @@ packages: lru-cache: 6.0.0 dev: true - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -7170,7 +7279,7 @@ packages: - supports-color dev: false - /serialize-error/7.0.1: + /serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} dependencies: @@ -7178,7 +7287,7 @@ packages: dev: true optional: true - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -7190,23 +7299,23 @@ packages: - supports-color dev: false - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /shelljs/0.8.5: + /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} hasBin: true @@ -7216,7 +7325,7 @@ packages: rechoir: 0.6.2 dev: true - /shx/0.3.4: + /shx@0.3.4: resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} engines: {node: '>=6'} hasBin: true @@ -7225,36 +7334,36 @@ packages: shelljs: 0.8.5 dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.3 object-inspect: 1.12.3 - /siginfo/2.0.0: + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true - /simple-swizzle/0.2.2: + /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 dev: false - /simple-update-notifier/1.1.0: + /simple-update-notifier@1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} requiresBuild: true @@ -7265,91 +7374,91 @@ packages: dev: true optional: true - /smart-buffer/4.2.0: + /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} requiresBuild: true dev: true optional: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: false - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} requiresBuild: true dev: true - /sprintf-js/1.1.2: + /sprintf-js@1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} dev: true optional: true - /ssf/0.11.2: + /ssf@0.11.2: resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} engines: {node: '>=0.8'} dependencies: frac: 1.1.2 dev: false - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /stackback/0.0.2: + /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /stat-mode/1.0.0: + /stat-mode@1.0.0: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: false - /std-env/3.3.2: + /std-env@3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true - /steno/3.1.0: + /steno@3.1.0: resolution: {integrity: sha512-U9mIkOthSBoLxa+4QAXv0aDDHeLn6merFMkjSblSz+WgezKQ0EkS1znRY6hNBZz3kGDm/0ZaP+E+/1X1ho37IQ==} engines: {node: '>=16'} dev: false - /stop-iteration-iterator/1.0.0: + /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: internal-slot: 1.0.4 dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: false - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -7358,7 +7467,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string.prototype.matchall/4.0.8: + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: call-bind: 1.0.2 @@ -7371,7 +7480,7 @@ packages: side-channel: 1.0.4 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -7379,7 +7488,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -7387,42 +7496,42 @@ packages: es-abstract: 1.21.1 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: false - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /strip-literal/1.0.1: + /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: acorn: 8.8.2 dev: true - /stylis/4.1.3: + /stylis@4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: false - /sumchecker/3.0.1: + /sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} dependencies: @@ -7431,39 +7540,39 @@ packages: - supports-color dev: true - /superjson/1.12.1: + /superjson@1.12.1: resolution: {integrity: sha512-HMTj43zvwW5bD+JCZCvFf4DkZQCmiLTen4C+W1Xogj0SPOpnhxsriogM04QmBVGH5b3kcIIOr6FqQ/aoIDx7TQ==} engines: {node: '>=10'} dependencies: copy-anything: 3.0.3 dev: false - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svg-parser/2.0.4: + /svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} dev: true - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /tar/6.1.13: + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} dependencies: @@ -7475,81 +7584,81 @@ packages: yallist: 4.0.0 dev: true - /temp-file/3.4.0: + /temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} dependencies: async-exit-hook: 2.0.1 fs-extra: 10.1.0 dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /time-zone/1.0.0: + /time-zone@1.0.0: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} dev: true - /tiny-invariant/1.3.1: + /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false - /tinybench/2.4.0: + /tinybench@2.4.0: resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} dev: true - /tinypool/0.4.0: + /tinypool@0.4.0: resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} engines: {node: '>=14.0.0'} dev: true - /tinyspy/2.1.0: + /tinyspy@2.1.0: resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} engines: {node: '>=14.0.0'} dev: true - /tmp-promise/3.0.3: + /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} dependencies: tmp: 0.2.1 dev: true - /tmp/0.2.1: + /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} dependencies: rimraf: 3.0.2 dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /toggle-selection/1.0.6: + /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: false - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /tough-cookie/4.1.2: + /tough-cookie@4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -7559,24 +7668,24 @@ packages: url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /tr46/3.0.0: + /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: punycode: 2.1.1 dev: true - /truncate-utf8-bytes/1.0.2: + /truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} dependencies: utf8-byte-length: 1.0.4 dev: true - /ts-node/10.9.1_qacynw5b4krdzzrloasmebsynu: + /ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.4): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -7607,7 +7716,7 @@ packages: yn: 3.1.1 dev: true - /tsconfck/2.1.1_typescript@4.9.4: + /tsconfck@2.1.1(typescript@4.9.4): resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true @@ -7620,26 +7729,26 @@ packages: typescript: 4.9.4 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.4.0: + /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: false - /tslib/2.4.1: + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: false - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tslib/2.5.3: + /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} dev: false - /tsutils/3.21.0_typescript@4.9.4: + /tsutils@3.21.0(typescript@4.9.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -7649,7 +7758,7 @@ packages: typescript: 4.9.4 dev: true - /turbo-darwin-64/1.8.8: + /turbo-darwin-64@1.8.8: resolution: {integrity: sha512-18cSeIm7aeEvIxGyq7PVoFyEnPpWDM/0CpZvXKHpQ6qMTkfNt517qVqUTAwsIYqNS8xazcKAqkNbvU1V49n65Q==} cpu: [x64] os: [darwin] @@ -7657,7 +7766,7 @@ packages: dev: true optional: true - /turbo-darwin-arm64/1.8.8: + /turbo-darwin-arm64@1.8.8: resolution: {integrity: sha512-ruGRI9nHxojIGLQv1TPgN7ud4HO4V8mFBwSgO6oDoZTNuk5ybWybItGR+yu6fni5vJoyMHXOYA2srnxvOc7hjQ==} cpu: [arm64] os: [darwin] @@ -7665,7 +7774,7 @@ packages: dev: true optional: true - /turbo-linux-64/1.8.8: + /turbo-linux-64@1.8.8: resolution: {integrity: sha512-N/GkHTHeIQogXB1/6ZWfxHx+ubYeb8Jlq3b/3jnU4zLucpZzTQ8XkXIAfJG/TL3Q7ON7xQ8yGOyGLhHL7MpFRg==} cpu: [x64] os: [linux] @@ -7673,7 +7782,7 @@ packages: dev: true optional: true - /turbo-linux-arm64/1.8.8: + /turbo-linux-arm64@1.8.8: resolution: {integrity: sha512-hKqLbBHgUkYf2Ww8uBL9UYdBFQ5677a7QXdsFhONXoACbDUPvpK4BKlz3NN7G4NZ+g9dGju+OJJjQP0VXRHb5w==} cpu: [arm64] os: [linux] @@ -7681,7 +7790,7 @@ packages: dev: true optional: true - /turbo-windows-64/1.8.8: + /turbo-windows-64@1.8.8: resolution: {integrity: sha512-2ndjDJyzkNslXxLt+PQuU21AHJWc8f6MnLypXy3KsN4EyX/uKKGZS0QJWz27PeHg0JS75PVvhfFV+L9t9i+Yyg==} cpu: [x64] os: [win32] @@ -7689,7 +7798,7 @@ packages: dev: true optional: true - /turbo-windows-arm64/1.8.8: + /turbo-windows-arm64@1.8.8: resolution: {integrity: sha512-xCA3oxgmW9OMqpI34AAmKfOVsfDljhD5YBwgs0ZDsn5h3kCHhC4x9W5dDk1oyQ4F5EXSH3xVym5/xl1J6WRpUg==} cpu: [arm64] os: [win32] @@ -7697,7 +7806,7 @@ packages: dev: true optional: true - /turbo/1.8.8: + /turbo@1.8.8: resolution: {integrity: sha512-qYJ5NjoTX+591/x09KgsDOPVDUJfU9GoS+6jszQQlLp1AHrf1wRFA3Yps8U+/HTG03q0M4qouOfOLtRQP4QypA==} hasBin: true requiresBuild: true @@ -7710,37 +7819,37 @@ packages: turbo-windows-arm64: 1.8.8 dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.13.1: + /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} dev: true optional: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -7748,7 +7857,7 @@ packages: mime-types: 2.1.35 dev: false - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -7756,32 +7865,32 @@ packages: is-typed-array: 1.1.10 dev: true - /typedarray/0.0.6: + /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: false - /typeface-open-sans/1.1.13: + /typeface-open-sans@1.1.13: resolution: {integrity: sha512-lVGVHvYl7UJDFB9vN8r7NHw3sVm7Rjeow6b9AeABc/J+2mDaCkmcdVtw3QZnsJW39P+xm5zeggIj9gLHYGn9Iw==} dev: false - /typescript/4.9.4: + /typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /ufo/1.1.1: + /ufo@1.1.1: resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} dev: true - /uid-safe/2.1.5: + /uid-safe@2.1.5: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} dependencies: random-bytes: 1.0.0 dev: false - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -7790,31 +7899,31 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undefsafe/2.0.5: + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: false - /unplugin/1.0.1: + /unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} dependencies: acorn: 8.8.2 @@ -7823,7 +7932,7 @@ packages: webpack-virtual-modules: 0.5.0 dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.4: + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -7834,20 +7943,20 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /use-callback-ref/1.3.0_kzbn2opkn2327fwg5yzwzya5o4: + /use-callback-ref@1.3.0(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -7862,7 +7971,7 @@ packages: tslib: 2.5.3 dev: false - /use-sidecar/1.1.2_kzbn2opkn2327fwg5yzwzya5o4: + /use-sidecar@1.1.2(@types/react@18.0.26)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -7878,7 +7987,7 @@ packages: tslib: 2.5.3 dev: false - /use-sync-external-store/1.2.0_react@18.2.0: + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7886,34 +7995,34 @@ packages: react: 18.2.0 dev: false - /utf8-byte-length/1.0.4: + /utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: false - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /validator/13.7.0: + /validator@13.7.0: resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} engines: {node: '>= 0.10'} dev: false - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: false - /verror/1.10.1: + /verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} requiresBuild: true @@ -7924,7 +8033,7 @@ packages: dev: true optional: true - /vite-node/0.30.1_@types+node@18.15.11: + /vite-node@0.30.1(@types/node@18.15.11): resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} engines: {node: '>=v14.18.0'} hasBin: true @@ -7934,7 +8043,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.1_@types+node@18.15.11 + vite: 4.3.1(@types/node@18.15.11) transitivePeerDependencies: - '@types/node' - less @@ -7945,7 +8054,7 @@ packages: - terser dev: true - /vite-node/0.30.1_c45e4f2cmsrvgdqihjqb2lwfbq: + /vite-node@0.30.1(@types/node@18.15.11)(sass@1.57.1): resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} engines: {node: '>=v14.18.0'} hasBin: true @@ -7955,7 +8064,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.1_c45e4f2cmsrvgdqihjqb2lwfbq + vite: 4.3.1(@types/node@18.15.11)(sass@1.57.1) transitivePeerDependencies: - '@types/node' - less @@ -7966,7 +8075,7 @@ packages: - terser dev: true - /vite-plugin-compression2/0.9.0: + /vite-plugin-compression2@0.9.0: resolution: {integrity: sha512-99OhrwpSJKOQRkeeJ2CuDpMbcg4fiqR1iPI4keewM8NPmMuCDuI73cjBaweUu+Nl3LmFrYvOeL1bq5u9tqs+pQ==} dependencies: '@rollup/pluginutils': 5.0.2 @@ -7974,20 +8083,20 @@ packages: - rollup dev: true - /vite-plugin-svgr/2.4.0_vite@4.3.1: + /vite-plugin-svgr@2.4.0(vite@4.3.1): resolution: {integrity: sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==} peerDependencies: vite: ^2.6.0 || 3 || 4 dependencies: '@rollup/pluginutils': 5.0.2 '@svgr/core': 6.5.1 - vite: 4.3.1_sass@1.57.1 + vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) transitivePeerDependencies: - rollup - supports-color dev: true - /vite-tsconfig-paths/4.2.0_x5zuwps7a76xd7nukziucl6f5y: + /vite-tsconfig-paths@4.2.0(typescript@4.9.4)(vite@4.3.1): resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: vite: '*' @@ -7997,14 +8106,48 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.1_typescript@4.9.4 - vite: 4.3.1_sass@1.57.1 + tsconfck: 2.1.1(typescript@4.9.4) + vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) transitivePeerDependencies: - supports-color - typescript dev: true - /vite/4.3.1_@types+node@18.15.11: + /vite@4.3.1(@types/node@18.11.18)(sass@1.57.1): + resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.18 + esbuild: 0.17.5 + postcss: 8.4.21 + rollup: 3.20.7 + sass: 1.57.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vite@4.3.1(@types/node@18.15.11): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8037,7 +8180,7 @@ packages: fsevents: 2.3.2 dev: true - /vite/4.3.1_c45e4f2cmsrvgdqihjqb2lwfbq: + /vite@4.3.1(@types/node@18.15.11)(sass@1.57.1): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8071,40 +8214,7 @@ packages: fsevents: 2.3.2 dev: true - /vite/4.3.1_sass@1.57.1: - resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.17.5 - postcss: 8.4.21 - rollup: 3.20.7 - sass: 1.57.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest/0.30.1: + /vitest@0.30.1: resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8158,8 +8268,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.4.0 tinypool: 0.4.0 - vite: 4.3.1_@types+node@18.15.11 - vite-node: 0.30.1_@types+node@18.15.11 + vite: 4.3.1(@types/node@18.15.11) + vite-node: 0.30.1(@types/node@18.15.11) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8170,7 +8280,7 @@ packages: - terser dev: true - /vitest/0.30.1_jsdom@21.1.0+sass@1.57.1: + /vitest@0.30.1(jsdom@21.1.0)(sass@1.57.1): resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8225,8 +8335,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.4.0 tinypool: 0.4.0 - vite: 4.3.1_c45e4f2cmsrvgdqihjqb2lwfbq - vite-node: 0.30.1_c45e4f2cmsrvgdqihjqb2lwfbq + vite: 4.3.1(@types/node@18.15.11)(sass@1.57.1) + vite-node: 0.30.1(@types/node@18.15.11)(sass@1.57.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8237,53 +8347,53 @@ packages: - terser dev: true - /w3c-xmlserializer/4.0.0: + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 dev: true - /web-vitals/3.1.1: + /web-vitals@3.1.1: resolution: {integrity: sha512-qvllU+ZeQChqzBhZ1oyXmWsjJ8a2jHYpH8AMaVuf29yscOPZfTQTjQFRX6+eADTdsDE8IanOZ0cetweHMs8/2A==} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /webidl-conversions/7.0.0: + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} dev: true - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack-virtual-modules/0.5.0: + /webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true - /well-known-symbols/2.0.0: + /well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} dev: true - /whatwg-encoding/2.0.0: + /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype/3.0.0: + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} dev: true - /whatwg-url/11.0.0: + /whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} dependencies: @@ -8291,14 +8401,14 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -8308,7 +8418,7 @@ packages: is-symbol: 1.0.4 dev: true - /which-collection/1.0.1: + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: is-map: 2.0.2 @@ -8317,7 +8427,7 @@ packages: is-weakset: 2.0.2 dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -8329,7 +8439,7 @@ packages: is-typed-array: 1.1.10 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -8337,7 +8447,7 @@ packages: isexe: 2.0.0 dev: true - /why-is-node-running/2.2.2: + /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} hasBin: true @@ -8346,22 +8456,22 @@ packages: stackback: 0.0.2 dev: true - /wmf/1.0.2: + /wmf@1.0.2: resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} engines: {node: '>=0.8'} dev: false - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /word/0.3.0: + /word@0.3.0: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} dev: false - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -8370,11 +8480,11 @@ packages: strip-ansi: 6.0.1 dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/8.12.0: + /ws@8.12.0: resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} engines: {node: '>=10.0.0'} peerDependencies: @@ -8387,7 +8497,7 @@ packages: optional: true dev: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -8400,7 +8510,7 @@ packages: optional: true dev: false - /xlsx/0.17.5: + /xlsx@0.17.5: resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==} engines: {node: '>=0.8'} hasBin: true @@ -8414,49 +8524,49 @@ packages: word: 0.3.0 dev: false - /xml-name-validator/4.0.0: + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlbuilder/15.1.1: + /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} requiresBuild: true dev: true - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: false - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} dev: true - /yargs/17.6.2: + /yargs@17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} dependencies: @@ -8469,29 +8579,29 @@ packages: yargs-parser: 21.1.1 dev: true - /yauzl/2.10.0: + /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - /yocto-queue/1.0.0: + /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: true - /zustand/4.3.6_react@18.2.0: + /zustand@4.3.6(react@18.2.0): resolution: {integrity: sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -8504,5 +8614,5 @@ packages: optional: true dependencies: react: 18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false From 0ce3449083d70647ca7b05b8e91ac5939009b719 Mon Sep 17 00:00:00 2001 From: asharonbaltazar <58940073+asharonbaltazar@users.noreply.github.com> Date: Fri, 10 Nov 2023 08:49:25 -0500 Subject: [PATCH 09/23] View Params Persist when Navigating Back (#581) * add url search params to local storage * add clearing local storage * use `useLocation` instead of `location.pathname` --- .../view-params-editor/ViewParamsEditor.tsx | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx index 92d275518..cb0ba3d55 100644 --- a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx +++ b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx @@ -1,5 +1,5 @@ import { FormEvent, useEffect } from 'react'; -import { useSearchParams } from 'react-router-dom'; +import { useLocation, useSearchParams } from 'react-router-dom'; import { Button, Drawer, @@ -12,11 +12,27 @@ import { useDisclosure, } from '@chakra-ui/react'; +import { useLocalStorage } from '../../../common/hooks/useLocalStorage'; + import ParamInput from './ParamInput'; import { ParamField } from './types'; import style from './ViewParamsEditor.module.scss'; +type ViewParamsObj = { [key: string]: string | FormDataEntryValue }; +type SavedViewParams = Record; + +const getURLSearchParamsFromObj = (paramsObj: ViewParamsObj) => + Object.entries(paramsObj).reduce((newSearchParams, [id, value]) => { + if (typeof value === 'string' && value.length) { + newSearchParams.set(id, value); + + return newSearchParams; + } + + return newSearchParams; + }, new URLSearchParams()); + interface EditFormDrawerProps { paramFields: ParamField[]; } @@ -24,6 +40,8 @@ interface EditFormDrawerProps { export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { const [searchParams, setSearchParams] = useSearchParams(); const { isOpen, onClose, onOpen } = useDisclosure(); + const { pathname } = useLocation(); + const [storedViewParams, setStoredViewParams] = useLocalStorage('ontime-views', {}); useEffect(() => { const isEditing = searchParams.get('edit'); @@ -33,6 +51,19 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { } }, [searchParams, onOpen]); + useEffect(() => { + const viewParamsObjFromLocalStorage = storedViewParams[pathname]; + + if (viewParamsObjFromLocalStorage !== undefined) { + const defaultSearchParams = getURLSearchParamsFromObj(viewParamsObjFromLocalStorage); + setSearchParams(defaultSearchParams); + } + + // linter is asking for `setSearchParams` in the useEffect deps + // rule is disabled since adding `setSearchParams` results in unnecessary re-renders + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [storedViewParams, pathname]); + const onEditDrawerClose = () => { onClose(); @@ -41,6 +72,7 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { }; const clearParams = () => { + setStoredViewParams({ ...storedViewParams, [pathname]: {} }); setSearchParams(); onClose(); }; @@ -49,15 +81,9 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { formEvent.preventDefault(); const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget)); - const newSearchParams = Object.entries(newParamsObject).reduce((newSearchParams, [id, value]) => { - if (typeof value === 'string' && value.length) { - newSearchParams.set(id, value); + const newSearchParams = getURLSearchParamsFromObj(newParamsObject); - return newSearchParams; - } - - return newSearchParams; - }, new URLSearchParams()); + setStoredViewParams({ ...storedViewParams, [pathname]: newParamsObject }); setSearchParams(newSearchParams); }; From 45fe669f0a54570c1d940a1483673784b812a2cf Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sat, 11 Nov 2023 14:28:43 +0100 Subject: [PATCH 10/23] feat: excel import (#527) * refactor: simplify excel import * chore: add external deepmerge utility * chore: create import map utilities * chore: increase size limits on uploads * style: small presentation tweaks * feat: resolve times on excel import, refs #508 --- apps/client/src/common/api/apiUtils.ts | 39 +- apps/client/src/common/api/ontimeApi.ts | 74 +++- .../input/colour-input/SwatchSelect.tsx | 6 +- apps/client/src/features/AliasWrapper.tsx | 2 +- .../composite/CountedTextArea.tsx | 7 +- .../src/features/modals/Modal.module.scss | 24 +- .../modals/upload-modal/UploadFile.tsx | 66 +++ .../upload-modal/UploadModal.module.scss | 72 +--- .../modals/upload-modal/UploadModal.tsx | 288 ++++++++----- .../preview/PreviewColumn.module.scss | 22 + .../upload-modal/preview/PreviewColumn.tsx} | 0 .../upload-modal/preview/PreviewExcel.tsx | 26 ++ .../preview/PreviewProjectData.tsx | 26 ++ .../upload-modal/preview/PreviewRundown.tsx | 131 ++++++ .../preview/PreviewTable.module.scss | 71 ++++ .../upload-modal/preview/Tag.module.scss | 11 + .../modals/upload-modal/preview/Tag.tsx | 7 + .../upload-entry/UploadEntry.module.scss | 53 +++ .../upload-modal/upload-entry/UploadEntry.tsx | 52 +++ .../upload-options/ExcelFileOptions.tsx | 70 ++++ .../upload-options/ImportMapTable.module.scss | 33 ++ .../upload-options/ImportMapTable.tsx | 50 +++ .../upload-options/OntimeFileOptions.tsx | 31 ++ .../upload-step/UploadStep.module.scss | 40 ++ .../upload-modal/upload-step/UploadStep.tsx | 26 ++ .../upload-modal/uploadModalContext.tsx | 21 + .../modals/upload-modal/uploadUtils.ts | 64 +++ .../src/features/modals/upload-modal/utils.ts | 25 -- apps/client/src/theme/OntimeProgress.ts | 8 + apps/client/src/theme/ontimeModal.ts | 22 +- apps/client/src/theme/theme.ts | 9 +- apps/server/package.json | 2 +- .../src/classes/data-provider/DataProvider.ts | 21 +- .../data-provider/DataProvider.utils.ts | 7 +- .../__test__/DataProvider.test.ts | 18 - .../src/controllers/ontimeController.ts | 130 ++++-- .../controllers/ontimeController.validate.ts | 15 + apps/server/src/modules/loadDb.ts | 2 +- apps/server/src/routes/ontimeRouter.ts | 9 + .../rundown-service/RundownService.ts | 64 ++- .../server/src/utils/__tests__/parser.test.ts | 73 ++-- .../src/utils/__tests__/parserUtils.test.ts | 31 +- .../{fileManagement.js => fileManagement.ts} | 0 .../{getRandomName.js => getRandomName.ts} | 0 apps/server/src/utils/parser.ts | 387 ++++++++---------- apps/server/src/utils/parserFunctions.ts | 51 +-- apps/server/src/utils/parserUtils.ts | 31 +- apps/server/src/utils/time.ts | 18 +- apps/server/src/utils/url.js | 19 - apps/server/src/utils/url.ts | 20 + e2e/tests/002-upload-showfile.spec.ts | 4 +- package.json | 1 + packages/types/src/utils/guards.ts | 2 +- packages/utils/index.ts | 19 +- packages/utils/package.json | 1 + packages/utils/src/externals/deepmerge.ts | 2 + .../src/feature/excel-import/excelImport.ts | 44 ++ .../src/rundown-utils/rundownUtils.test.ts | 24 -- .../utils/src/rundown-utils/rundownUtils.ts | 16 - .../src/validate-events/validateEvent.test.ts | 118 ++++++ .../src/validate-events/validateEvent.ts | 85 ++++ 61 files changed, 1905 insertions(+), 685 deletions(-) create mode 100644 apps/client/src/features/modals/upload-modal/UploadFile.tsx create mode 100644 apps/client/src/features/modals/upload-modal/preview/PreviewColumn.module.scss rename apps/client/src/{common/utils/entryValidator.ts => features/modals/upload-modal/preview/PreviewColumn.tsx} (100%) create mode 100644 apps/client/src/features/modals/upload-modal/preview/PreviewExcel.tsx create mode 100644 apps/client/src/features/modals/upload-modal/preview/PreviewProjectData.tsx create mode 100644 apps/client/src/features/modals/upload-modal/preview/PreviewRundown.tsx create mode 100644 apps/client/src/features/modals/upload-modal/preview/PreviewTable.module.scss create mode 100644 apps/client/src/features/modals/upload-modal/preview/Tag.module.scss create mode 100644 apps/client/src/features/modals/upload-modal/preview/Tag.tsx create mode 100644 apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.module.scss create mode 100644 apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.tsx create mode 100644 apps/client/src/features/modals/upload-modal/upload-options/ExcelFileOptions.tsx create mode 100644 apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.module.scss create mode 100644 apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.tsx create mode 100644 apps/client/src/features/modals/upload-modal/upload-options/OntimeFileOptions.tsx create mode 100644 apps/client/src/features/modals/upload-modal/upload-step/UploadStep.module.scss create mode 100644 apps/client/src/features/modals/upload-modal/upload-step/UploadStep.tsx create mode 100644 apps/client/src/features/modals/upload-modal/uploadModalContext.tsx create mode 100644 apps/client/src/features/modals/upload-modal/uploadUtils.ts delete mode 100644 apps/client/src/features/modals/upload-modal/utils.ts create mode 100644 apps/client/src/theme/OntimeProgress.ts rename apps/server/src/utils/{fileManagement.js => fileManagement.ts} (100%) rename apps/server/src/utils/{getRandomName.js => getRandomName.ts} (100%) delete mode 100644 apps/server/src/utils/url.js create mode 100644 apps/server/src/utils/url.ts create mode 100644 packages/utils/src/externals/deepmerge.ts create mode 100644 packages/utils/src/feature/excel-import/excelImport.ts create mode 100644 packages/utils/src/validate-events/validateEvent.test.ts create mode 100644 packages/utils/src/validate-events/validateEvent.ts diff --git a/apps/client/src/common/api/apiUtils.ts b/apps/client/src/common/api/apiUtils.ts index 1c15707fc..4042761bb 100644 --- a/apps/client/src/common/api/apiUtils.ts +++ b/apps/client/src/common/api/apiUtils.ts @@ -2,18 +2,33 @@ import axios, { AxiosError } from 'axios'; import { LogLevel } from 'ontime-types'; import { generateId, millisToString } from 'ontime-utils'; +import { ontimeQueryClient } from '../queryClient'; import { addLog } from '../stores/logger'; import { nowInMillis } from '../utils/time'; -export function logAxiosError(prepend: string, error: unknown) { - let message; +export function maybeAxiosError(error: unknown) { if (axios.isAxiosError(error)) { const statusText = (error as AxiosError).response?.statusText ?? ''; - const data = (error as AxiosError).response?.data ?? ''; - message = `${prepend} ${statusText}: ${data}`; + let data = (error as AxiosError).response?.data ?? ''; + if (typeof data === 'object') { + // TODO: use error instead, when migrated + if ('message' in data) { + data = JSON.stringify(data.message); + } else { + data = JSON.stringify(data); + } + } + return `${statusText}: ${data}`; } else { - message = `${prepend}: ${error}`; + if (typeof error !== 'string') { + return JSON.stringify(error); + } + return error; } +} + +export function logAxiosError(prepend: string, error: unknown) { + const message = `${prepend}: ${maybeAxiosError(error)}`; addLog({ id: generateId(), @@ -23,3 +38,17 @@ export function logAxiosError(prepend: string, error: unknown) { text: message, }); } + +/** + * Utility function invalidates react-query caches + */ +export async function invalidateAllCaches() { + await ontimeQueryClient.invalidateQueries(['project']); + await ontimeQueryClient.invalidateQueries(['aliases']); + await ontimeQueryClient.invalidateQueries(['userFields']); + await ontimeQueryClient.invalidateQueries(['rundown']); + await ontimeQueryClient.invalidateQueries(['appinfo']); + await ontimeQueryClient.invalidateQueries(['oscSettings']); + await ontimeQueryClient.invalidateQueries(['appSettings']); + await ontimeQueryClient.invalidateQueries(['viewSettings']); +} diff --git a/apps/client/src/common/api/ontimeApi.ts b/apps/client/src/common/api/ontimeApi.ts index 593f7d35d..1cb33ea23 100644 --- a/apps/client/src/common/api/ontimeApi.ts +++ b/apps/client/src/common/api/ontimeApi.ts @@ -1,5 +1,16 @@ -import axios from 'axios'; -import { Alias, OSCSettings, OscSubscription, ProjectData, Settings, UserFields, ViewSettings } from 'ontime-types'; +import axios, { AxiosResponse } from 'axios'; +import { + Alias, + DatabaseModel, + OntimeRundown, + OSCSettings, + OscSubscription, + ProjectData, + Settings, + UserFields, + ViewSettings, +} from 'ontime-types'; +import { ExcelImportMap } from 'ontime-utils'; import { apiRepoLatest } from '../../externals'; import { InfoType } from '../models/Info'; @@ -123,17 +134,25 @@ export const downloadRundown = () => { return fileDownload(ontimeURL, { name: 'rundown', type: 'json' }, { type: 'application/json;charset=utf-8;' }); }; +// TODO: should this be extracted to shared code? +export type ProjectFileImportOptions = { + onlyRundown: boolean; +}; + /** * @description HTTP request to upload events db * @return {Promise} */ -type UploadDataOptions = { - onlyRundown?: boolean; -}; -export const uploadData = async (file: File, setProgress: (value: number) => void, options?: UploadDataOptions) => { +export const uploadProjectFile = async ( + file: File, + setProgress: (value: number) => void, + options?: Partial, +) => { const formData = new FormData(); formData.append('userFile', file); - const onlyRundown = options?.onlyRundown || 'false'; + + const onlyRundown = Boolean(options?.onlyRundown); + await axios .post(`${ontimeURL}/db?onlyRundown=${onlyRundown}`, formData, { headers: { @@ -147,6 +166,47 @@ export const uploadData = async (file: File, setProgress: (value: number) => voi .then((response) => response.data.id); }; +/** + * @description Make patch changes to the objects in the db + * @return {Promise} + */ +export async function patchData(patchDb: Partial) { + const response = await axios.patch(`${ontimeURL}/db`, patchDb); + return response; +} + +type PostPreviewExcelResponse = { + rundown: OntimeRundown; + project: ProjectData; + userFields: UserFields; +}; + +/** + * @description Make patch changes to the objects in the db + * @return {Promise} - returns parsed rundown and userfields + */ +export async function postPreviewExcel(file: File, setProgress: (value: number) => void, options?: ExcelImportMap) { + const formData = new FormData(); + formData.append('userFile', file); + formData.append('options', JSON.stringify(options)); + + const response: AxiosResponse = await axios.post( + `${ontimeURL}/preview-spreadsheet`, + formData, + { + headers: { + 'Content-Type': 'multipart/form-data', + }, + onUploadProgress: (progressEvent) => { + const complete = progressEvent?.total ? Math.round((progressEvent.loaded * 100) / progressEvent.total) : 0; + setProgress(complete); + }, + }, + ); + + return response; +} + export type HasUpdate = { url: string; version: string; diff --git a/apps/client/src/common/components/input/colour-input/SwatchSelect.tsx b/apps/client/src/common/components/input/colour-input/SwatchSelect.tsx index bbafefec5..fd81d7aca 100644 --- a/apps/client/src/common/components/input/colour-input/SwatchSelect.tsx +++ b/apps/client/src/common/components/input/colour-input/SwatchSelect.tsx @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import { TitleActions } from '../../../../features/event-editor/composite/EventEditorDataLeft'; +import { EditorUpdateFields } from '../../../../features/event-editor/EventEditor'; import Swatch from './Swatch'; @@ -8,8 +8,8 @@ import style from './SwatchSelect.module.scss'; interface ColourInputProps { value: string; - name: TitleActions; - handleChange: (newValue: TitleActions, name: string) => void; + name: EditorUpdateFields; + handleChange: (newValue: EditorUpdateFields, name: string) => void; } const colours = [ diff --git a/apps/client/src/features/AliasWrapper.tsx b/apps/client/src/features/AliasWrapper.tsx index f6808edab..9f0422ea4 100644 --- a/apps/client/src/features/AliasWrapper.tsx +++ b/apps/client/src/features/AliasWrapper.tsx @@ -22,7 +22,7 @@ const withAlias =

(Component: ComponentType

) => { } }, [data, searchParams, navigate, location]); - return ; + return ; }; }; diff --git a/apps/client/src/features/event-editor/composite/CountedTextArea.tsx b/apps/client/src/features/event-editor/composite/CountedTextArea.tsx index 225e1e65a..10de23bdf 100644 --- a/apps/client/src/features/event-editor/composite/CountedTextArea.tsx +++ b/apps/client/src/features/event-editor/composite/CountedTextArea.tsx @@ -2,16 +2,15 @@ import { useCallback } from 'react'; import { Textarea } from '@chakra-ui/react'; import useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput'; - -import { TitleActions } from './EventEditorDataLeft'; +import { EditorUpdateFields } from '../EventEditor'; import style from '../EventEditor.module.scss'; interface CountedTextAreaProps { - field: TitleActions; + field: EditorUpdateFields; label: string; initialValue: string; - submitHandler: (field: TitleActions, value: string) => void; + submitHandler: (field: EditorUpdateFields, value: string) => void; } export default function CountedTextArea(props: CountedTextAreaProps) { diff --git a/apps/client/src/features/modals/Modal.module.scss b/apps/client/src/features/modals/Modal.module.scss index 10a97436b..a5b8ea1a0 100644 --- a/apps/client/src/features/modals/Modal.module.scss +++ b/apps/client/src/features/modals/Modal.module.scss @@ -41,8 +41,8 @@ $el-padding-with-compensation: 24px; // 16 + 8 .title { font-size: $inner-section-text-size; color: $gray-500; - padding-left: 8px; - margin: 8px 0; + padding-left: 0.5rem; + margin: 0.5rem 0; text-transform: uppercase; } @@ -107,6 +107,16 @@ $el-padding-with-compensation: 24px; // 16 + 8 color: $error-red; } +.success { + @include subsection; + color: $action-blue; +} + +.feedbackSection { + justify-content: flex-start; + +} + .buttonSection { margin-top: $section-spacing; display: flex; @@ -117,6 +127,10 @@ $el-padding-with-compensation: 24px; // 16 + 8 flex-grow: 1; } +.vSpacer { + height: 2rem; +} + .shiftRight { align-self: flex-end; } @@ -135,6 +149,12 @@ $el-padding-with-compensation: 24px; // 16 + 8 grid-template-columns: auto 1fr; } +.twoEqualColumn { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} + .padBottom { padding-bottom: $element-spacing; } diff --git a/apps/client/src/features/modals/upload-modal/UploadFile.tsx b/apps/client/src/features/modals/upload-modal/UploadFile.tsx new file mode 100644 index 000000000..3497d3fbe --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/UploadFile.tsx @@ -0,0 +1,66 @@ +import { ChangeEvent, useRef, useState } from 'react'; +import { Input } from '@chakra-ui/react'; + +import UploadEntry from './upload-entry/UploadEntry'; +import { useUploadModalContextStore } from './uploadModalContext'; +import { validateFile } from './uploadUtils'; + +import style from './UploadModal.module.scss'; + +export default function UploadFile() { + const fileInputRef = useRef(null); + + const { file, setFile, progress } = useUploadModalContextStore(); + + const [errors, setErrors] = useState(''); + + const clearFile = () => { + setFile(null); + setErrors(''); + }; + + const handleFile = (event: ChangeEvent) => { + setErrors(''); + + const selectedFile = event?.target?.files?.[0]; + if (!selectedFile) { + setFile(null); + return; + } + + try { + validateFile(selectedFile); + setFile(selectedFile); + } catch (error) { + if (error instanceof Error) { + setErrors(error.message); + } else { + setErrors('An unexpected error occurred while validating the file.'); + } + setFile(null); + } + }; + + const handleClick = () => { + fileInputRef.current?.click(); + }; + + return ( + <> + + {!file && ( +

+ Click to select Ontime project or xlsx rundown +
+ )} + {(file || errors) && } + + ); +} diff --git a/apps/client/src/features/modals/upload-modal/UploadModal.module.scss b/apps/client/src/features/modals/upload-modal/UploadModal.module.scss index fdd7d5778..c35c1a31d 100644 --- a/apps/client/src/features/modals/upload-modal/UploadModal.module.scss +++ b/apps/client/src/features/modals/upload-modal/UploadModal.module.scss @@ -5,79 +5,31 @@ .uploadBody { display: flex; flex-direction: column; - gap: 16px; + gap: 1rem; } .uploadArea { + margin: 0 auto; width: 100%; - min-height: 200px; - border: 2px dashed $gray-50; + max-width: 550px; + + min-height: 150px; + border: 2px dashed $gray-200; border-radius: 3px; display: grid; place-content: center; transition-property: background-color; transition-duration: $transition-time-action; + font-size: calc(1rem - 1px); &:hover { border: 2px solid $blue-500; background-color: $blue-50; cursor: pointer; } + &.comment { - color: gray; - } -} - -.uploadedItem { - background-color: $gray-50; - padding: 8px; - display: grid; - grid-template-areas: - "icon title close" - "icon info ." - "progress progress progress"; - grid-template-columns: auto 1fr auto; - column-gap: 16px; - border-radius: 3px; - - .icon { - align-self: center; - grid-area: icon; - font-size: 32px; - color: $gray-700; - } - - .fileTitle { - grid-area: title; - font-size: 14px; - color: $gray-1350; - } - - .fileInfo { - grid-area: info; - font-size: 12px; - color: $gray-1100; - } - - .fileProgress { - grid-area: progress; - } - - .cancelUpload { - grid-area: close; - cursor: pointer; - } - - &.error { - .icon { - color: $error-red; - } - } - - &.success { - .icon { - color: $green-500; - } + color: $modal-note-color; } } @@ -89,3 +41,9 @@ .pad { margin: 8px; } + +.twoColumn { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} diff --git a/apps/client/src/features/modals/upload-modal/UploadModal.tsx b/apps/client/src/features/modals/upload-modal/UploadModal.tsx index c328551f5..b8ee198d6 100644 --- a/apps/client/src/features/modals/upload-modal/UploadModal.tsx +++ b/apps/client/src/features/modals/upload-modal/UploadModal.tsx @@ -1,7 +1,6 @@ -import { ChangeEvent, useCallback, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Button, - Input, Modal, ModalBody, ModalCloseButton, @@ -9,23 +8,34 @@ import { ModalFooter, ModalHeader, ModalOverlay, - Progress, - Switch, } from '@chakra-ui/react'; -import { IoClose } from '@react-icons/all-files/io5/IoClose'; -import { IoDocumentTextOutline } from '@react-icons/all-files/io5/IoDocumentTextOutline'; -import { IoWarningOutline } from '@react-icons/all-files/io5/IoWarningOutline'; import { useQueryClient } from '@tanstack/react-query'; +import { OntimeRundown, ProjectData, UserFields } from 'ontime-types'; +import { defaultExcelImportMap, ExcelImportMap } from 'ontime-utils'; -import { RUNDOWN_TABLE } from '../../../common/api/apiConstants'; -import { uploadData } from '../../../common/api/ontimeApi'; -import { useEmitLog } from '../../../common/stores/logger'; -import ModalSplitInput from '../ModalSplitInput'; +import { PROJECT_DATA, RUNDOWN_TABLE, USERFIELDS } from '../../../common/api/apiConstants'; +import { invalidateAllCaches, maybeAxiosError } from '../../../common/api/apiUtils'; +import { + patchData, + postPreviewExcel, + ProjectFileImportOptions, + uploadProjectFile, +} from '../../../common/api/ontimeApi'; +import { projectDataPlaceholder } from '../../../common/models/ProjectData'; +import { userFieldsPlaceholder } from '../../../common/models/UserFields'; -import { validateFile } from './utils'; +import PreviewExcel from './preview/PreviewExcel'; +import ExcelFileOptions from './upload-options/ExcelFileOptions'; +import OntimeFileOptions from './upload-options/OntimeFileOptions'; +import UploadStepTracker from './upload-step/UploadStep'; +import UploadFile from './UploadFile'; +import { useUploadModalContextStore } from './uploadModalContext'; +import { getPersistedOptions, isExcelFile, isOntimeFile, persistOptions } from './uploadUtils'; import style from './UploadModal.module.scss'; +export type UploadStep = 'import' | 'review'; + interface UploadModalProps { onClose: () => void; isOpen: boolean; @@ -33,64 +43,152 @@ interface UploadModalProps { export default function UploadModal({ onClose, isOpen }: UploadModalProps) { const queryClient = useQueryClient(); - const { emitError } = useEmitLog(); - const [errors, setErrors] = useState(); - const [isSubmitting, setSubmitting] = useState(false); - const [file, setFile] = useState(null); - const [progress, setProgress] = useState(0); - const overrideOptionRef = useRef(null); - const fileInputRef = useRef(null); - const [success, setSuccess] = useState(false); - const handleFile = useCallback((event: ChangeEvent) => { - const fileUploaded = event?.target?.files?.[0]; - if (!fileUploaded) return; + const { file, setProgress, clear } = useUploadModalContextStore(); - const validate = validateFile(fileUploaded); - setErrors(validate.errors?.[0]); + const [uploadStep, setUploadStep] = useState('import'); + const [submitting, setSubmitting] = useState(false); + const [rundown, setRundown] = useState(null); + const [userFields, setUserFields] = useState(null); + const [project, setProject] = useState(null); - if (validate.isValid) { - setFile(fileUploaded); - } else { - setFile(null); + const [errors, setErrors] = useState(''); + + const ontimeFileOptions = useRef>({}); + const excelFileOptions = useRef(defaultExcelImportMap); + + const updateOntimeFileOptions = ( + field: T, + value: ProjectFileImportOptions[T], + ) => { + ontimeFileOptions.current = { ...ontimeFileOptions.current, [field]: value }; + }; + + const updateExcelFileOptions = (field: T, value: ExcelImportMap[T]) => { + if (excelFileOptions.current[field] !== value) { + excelFileOptions.current = { ...excelFileOptions.current, [field]: value }; + } + }; + + // We want to populate the options with any previous options given by the user + useEffect(() => { + const excelOptions = getPersistedOptions('excel'); + if (excelOptions) { + excelFileOptions.current = excelOptions; } }, []); - const handleSubmit = useCallback(async () => { - setSubmitting(true); + // if the modal re-opens, we want to restart all states + useEffect(() => { + clear(); + setUploadStep('import'); + setSubmitting(false); + setRundown(null); + setUserFields(null); + setProject(null); + setErrors(''); + }, [clear, isOpen]); + + /* uploads file to backend + * - in the case of excel, we get the preview + * - in the case of project file, this is end of line + **/ + const handleUpload = async () => { + let doClose = false; if (file) { + setSubmitting(true); + setErrors(''); try { - const options = { - onlyRundown: overrideOptionRef.current?.checked || false, - }; - await uploadData(file, setProgress, options); + if (isOntimeFile(file)) { + // TODO: we would also like to have preview for ontime project files + const options = ontimeFileOptions.current; + await handleOntimeFile(file, options); + await invalidateAllCaches(); + doClose = true; + } else if (isExcelFile(file)) { + const options = excelFileOptions.current; + persistOptions({ optionType: 'excel', options }); + await handleExcelFile(file, options); + } } catch (error) { - emitError(`Failed uploading file: ${error}`); + const message = maybeAxiosError(error); + setErrors(`Failed uploading file ${message}`); } finally { - await queryClient.invalidateQueries(RUNDOWN_TABLE); - setSuccess(true); + setSubmitting(false); + if (doClose) { + handleClose(); + } } } - setSubmitting(false); - }, [emitError, file, queryClient]); - const handleClick = () => { - fileInputRef.current?.click(); - }; - - const clearFile = () => { - setFile(null); + // when we upload excel, we populate state with preview data + async function handleExcelFile(file: File, options: ExcelImportMap) { + const response = await postPreviewExcel(file, setProgress, options); + if (response.status === 200) { + setRundown(response.data.rundown); + setUserFields(response.data.userFields); + setProject(response.data.project); + // in excel imports we have an extra review step + setUploadStep('review'); + } + } + + // when we upload project files, no extra operations are done + async function handleOntimeFile(file: File, options: Partial) { + await uploadProjectFile(file, setProgress, options); + } }; + // before closing the modal, we clear data from mutations const handleClose = () => { - clearFile(); - setSuccess(false); - setErrors(undefined); - setProgress(0); + clear(); + setRundown([]); + setUserFields(userFieldsPlaceholder); + setProject(projectDataPlaceholder); onClose(); }; - const disableSubmit = !file || isSubmitting; + const handleFinalise = async () => { + // this step is currently only used for excel files, after preview + if (isExcel && rundown && userFields && project) { + let doClose = false; + setSubmitting(true); + try { + await patchData({ rundown, userFields, project }); + queryClient.setQueryData(RUNDOWN_TABLE, rundown); + queryClient.setQueryData(USERFIELDS, userFields); + queryClient.setQueryData(PROJECT_DATA, project); + await queryClient.invalidateQueries({ + queryKey: [...RUNDOWN_TABLE, ...USERFIELDS, ...PROJECT_DATA], + }); + doClose = true; + } catch (error) { + const message = maybeAxiosError(error); + setErrors(`Failed applying changes ${message}`); + } finally { + setSubmitting(false); + if (doClose) { + handleClose(); + } + } + } + }; + + const undoReview = () => { + setUploadStep('import'); + setErrors(''); + }; + + const isImporting = uploadStep === 'import'; + const isReview = uploadStep === 'review'; + const isExcel = isExcelFile(file); + const isOntime = isOntimeFile(file); + + const handleGoBack = isImporting ? undefined : undoReview; + const handleSubmit = isImporting ? handleUpload : handleFinalise; + const disableSubmit = (isImporting && !file) || (isReview && rundown === null); + const disableGoBack = isImporting; + const submitText = isImporting ? 'Import' : 'Finish'; return ( File import - -
- Click to upload Ontime project file -
- {file && ( -
- - - {file.name} - {`${(file.size / 1024).toFixed(2)}kb - ${file.type}`} - -
+ {isExcel && } + {uploadStep === 'import' ? ( + <> + + {isOntime && } + {isExcel && } + + ) : ( + )} - {errors && ( -
- - {errors} - Please try again - -
- )} -
- Import options - - - -
- - - + +
{errors &&
{errors}
}
+
+ + +
diff --git a/apps/client/src/features/modals/upload-modal/preview/PreviewColumn.module.scss b/apps/client/src/features/modals/upload-modal/preview/PreviewColumn.module.scss new file mode 100644 index 000000000..72a783ee4 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/PreviewColumn.module.scss @@ -0,0 +1,22 @@ +@use "../../../../theme/_ontimeColours" as *; + +@mixin pad-item { + padding-left: 0.5rem; + padding-right: 1rem; +} + +.previewTable { + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: repeat(6, auto); + font-size: calc(1rem - 2px); +} + +.field { + font-weight: 200; + @include pad-item; +} + +.value { + @include pad-item; +} diff --git a/apps/client/src/common/utils/entryValidator.ts b/apps/client/src/features/modals/upload-modal/preview/PreviewColumn.tsx similarity index 100% rename from apps/client/src/common/utils/entryValidator.ts rename to apps/client/src/features/modals/upload-modal/preview/PreviewColumn.tsx diff --git a/apps/client/src/features/modals/upload-modal/preview/PreviewExcel.tsx b/apps/client/src/features/modals/upload-modal/preview/PreviewExcel.tsx new file mode 100644 index 000000000..1e537e77a --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/PreviewExcel.tsx @@ -0,0 +1,26 @@ +import { OntimeRundown, ProjectData, UserFields } from 'ontime-types'; + +import PreviewProjectData from './PreviewProjectData'; +import PreviewRundown from './PreviewRundown'; + +import style from '../../Modal.module.scss'; + +interface PreviewExcelProps { + rundown: OntimeRundown; + project: ProjectData; + userFields: UserFields; +} + +export default function PreviewExcel(props: PreviewExcelProps) { + const { rundown, project, userFields } = props; + + return ( +
+
Review Project Data
+ +
+
Review Rundown
+ +
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/preview/PreviewProjectData.tsx b/apps/client/src/features/modals/upload-modal/preview/PreviewProjectData.tsx new file mode 100644 index 000000000..46eb00d47 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/PreviewProjectData.tsx @@ -0,0 +1,26 @@ +import { ProjectData } from 'ontime-types'; + +import style from './PreviewColumn.module.scss'; + +interface PreviewProjectDataProps { + project: ProjectData; +} + +export default function PreviewProjectData({ project }: PreviewProjectDataProps) { + return ( +
+ Title + {project.title} + Description + {project.description} + Public URL + {project.publicUrl} + Public info + {project.publicInfo} + Backstage URL + {project.backstageUrl} + Backstage info + {project.backstageInfo} +
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/preview/PreviewRundown.tsx b/apps/client/src/features/modals/upload-modal/preview/PreviewRundown.tsx new file mode 100644 index 000000000..12f962243 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/PreviewRundown.tsx @@ -0,0 +1,131 @@ +import { Fragment } from 'react'; +import { isOntimeEvent, OntimeRundown, UserFields } from 'ontime-types'; +import { millisToString } from 'ontime-utils'; + +import { getAccessibleColour } from '../../../../common/utils/styleUtils'; + +import Tag from './Tag'; + +import style from './PreviewTable.module.scss'; + +interface PreviewRundownProps { + rundown: OntimeRundown; + userFields: UserFields; +} + +function booleanToText(value?: boolean) { + return value ? 'Yes' : undefined; +} + +export default function PreviewRundown({ rundown, userFields }: PreviewRundownProps) { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {rundown.map((event, index) => { + if (!isOntimeEvent(event)) { + return null; + } + const key = event.id; + const colour = event.colour ? getAccessibleColour(event.colour) : {}; + const isPublic = booleanToText(event.isPublic); + const skip = booleanToText(event.skip); + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + {event.note && ( + + + + )} + + ); + })} + +
#TypeCueTitleSubtitlePresenterTime StartTime EndDurationIs PublicSkipColourTimer TypeEnd Action + user0 {userFields.user0} + + user1 {userFields.user1} + + user2 {userFields.user2} + + user3 {userFields.user3} + + user4 {userFields.user4} + + user5 {userFields.user5} + + user6 {userFields.user6} + + user7 {userFields.user7} + + user8 {userFields.user8} + + user9 {userFields.user9} +
+ {index + 1} + + Event + {event.cue}{event.title}{event.subtitle}{event.presenter}{millisToString(event.timeStart)}{millisToString(event.timeEnd)}{millisToString(event.duration)}{isPublic && {isPublic}}{skip && {skip}}{event.colour} + {event.timerType} + + {event.endAction} + {event.user0}{event.user1}{event.user2}{event.user3}{event.user4}{event.user5}{event.user6}{event.user7}{event.user8}{event.user9}
+ Note: {event.note} +
+
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/preview/PreviewTable.module.scss b/apps/client/src/features/modals/upload-modal/preview/PreviewTable.module.scss new file mode 100644 index 000000000..008913718 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/PreviewTable.module.scss @@ -0,0 +1,71 @@ +@use "../../../../theme/_ontimeColours" as *; + +.container { + max-width: 100%; + max-height: max(300px, 30vh); + overflow: scroll; +} + +.rundownPreview { + font-size: calc(1rem - 2px); + overflow-x: scroll; +} + +.header, +.body { + th { + font-weight: 400; + height: unset; + line-height: calc(1rem - 2px); + white-space: nowrap; + padding-left: 0.25rem; + padding-right: 1rem; + } +} + +.header { + position: sticky; + top: 0; + background-color: white; + box-shadow: 0 2px $gray-50; + z-index: 3; + + th { + font-weight: 200; + text-align: left; + } + + tr { + word-wrap: unset; + } +} + +.body { + td { + text-align: left; + vertical-align: top; + padding: 0 0.5em; + } + + .center { + text-align: center; + } + + .nowrap { + white-space: nowrap; + } + + .secondaryRow { + padding: 0.25em 0.25em; + background-color: $gray-50; + } +} + +table tr td:first-child, +table tr th:first-child { + position: sticky; + left: 0; + z-index: 2; + background-color: white; + box-shadow: 1px 0 $gray-50; +} \ No newline at end of file diff --git a/apps/client/src/features/modals/upload-modal/preview/Tag.module.scss b/apps/client/src/features/modals/upload-modal/preview/Tag.module.scss new file mode 100644 index 000000000..9ff41a348 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/Tag.module.scss @@ -0,0 +1,11 @@ +@use "../../../../theme/_ontimeColours" as *; + +.tag { + font-size: calc(1rem - 3px); + letter-spacing: 0.5px; + background-color: $gray-100; + color: $ui-black; + border-radius: 2px; + padding: 0 0.25rem; + white-space: nowrap; +} diff --git a/apps/client/src/features/modals/upload-modal/preview/Tag.tsx b/apps/client/src/features/modals/upload-modal/preview/Tag.tsx new file mode 100644 index 000000000..de1ce550c --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/preview/Tag.tsx @@ -0,0 +1,7 @@ +import { ReactNode } from 'react'; + +import style from './Tag.module.scss'; + +export default function Tag({ children }: { children: ReactNode }) { + return {children}; +} diff --git a/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.module.scss b/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.module.scss new file mode 100644 index 000000000..86efa6e68 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.module.scss @@ -0,0 +1,53 @@ +@use '../../../../theme/ontimeColours' as *; +@use '../../../../theme/v2Styles' as *; + +.uploadedItem { + margin: 0 auto; + width: 100%; + max-width: 550px; + + border: 1px solid $gray-200; + padding: 0.5rem; + display: grid; + grid-template-areas: + "icon title close" + "icon info ." + "progress progress progress"; + grid-template-columns: auto 1fr auto; + column-gap: 1rem; + border-radius: 3px; + + .icon { + align-self: center; + grid-area: icon; + font-size: 2rem; + color: $gray-700; + } + + .fileTitle { + grid-area: title; + font-size: calc(1rem - 2px); + color: $ui-black; + } + + .fileInfo { + grid-area: info; + font-size: calc(1rem - 4px); + color: $gray-1100; + } + + .fileProgress { + grid-area: progress; + } + + .cancelUpload { + grid-area: close; + cursor: pointer; + } + + &.error { + .icon { + color: $error-red; + } + } +} diff --git a/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.tsx b/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.tsx new file mode 100644 index 000000000..2c3545f75 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-entry/UploadEntry.tsx @@ -0,0 +1,52 @@ +import { Progress } from '@chakra-ui/react'; +import { IoClose } from '@react-icons/all-files/io5/IoClose'; +import { IoDocumentTextOutline } from '@react-icons/all-files/io5/IoDocumentTextOutline'; +import { IoWarningOutline } from '@react-icons/all-files/io5/IoWarningOutline'; + +import { isExcelFile, isOntimeFile } from '../uploadUtils'; + +import style from './UploadEntry.module.scss'; + +interface UploadEntryProps { + file: File | null; + errors?: string; + progress: number; + handleClear: () => void; +} + +export default function UploadEntry(props: UploadEntryProps) { + const { file, errors, progress, handleClear } = props; + + if (errors) { + return ( +
+ + + {errors} + Please try again +
+ ); + } + + if (file) { + const fileSize = `${(file.size / 1024).toFixed(2)}kb`; + let fileType = ''; + if (isOntimeFile(file)) { + fileType = 'Ontime Project File'; + } else if (isExcelFile(file)) { + fileType = 'Excel Rundown'; + } + + return ( +
+ + + {file.name} + {`${fileSize} - ${fileType}`} + +
+ ); + } + + return null; +} diff --git a/apps/client/src/features/modals/upload-modal/upload-options/ExcelFileOptions.tsx b/apps/client/src/features/modals/upload-modal/upload-options/ExcelFileOptions.tsx new file mode 100644 index 000000000..72b1c5837 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-options/ExcelFileOptions.tsx @@ -0,0 +1,70 @@ +import { MutableRefObject } from 'react'; +import { ExcelImportMap } from 'ontime-utils'; + +import ImportMapTable, { type TableEntry } from './ImportMapTable'; + +import style from '../UploadModal.module.scss'; + +interface ExcelFileOptionsProps { + optionsRef: MutableRefObject; + updateOptions: (field: T, value: ExcelImportMap[T]) => void; +} + +export default function ExcelFileOptions(props: ExcelFileOptionsProps) { + const { optionsRef, updateOptions } = props; + + const worksheet: TableEntry[] = [{ label: 'Worksheet', title: 'worksheet', value: optionsRef.current.worksheet }]; + + const timings: TableEntry[] = [ + { label: 'Start time', title: 'timeStart', value: optionsRef.current.timeStart }, + { label: 'End Time', title: 'timeEnd', value: optionsRef.current.timeEnd }, + { label: 'Duration', title: 'duration', value: optionsRef.current.duration }, + ]; + + const titles: TableEntry[] = [ + { label: 'Cue', title: 'cue', value: optionsRef.current.cue }, + { label: 'Colour', title: 'colour', value: optionsRef.current.colour }, + { label: 'Title', title: 'title', value: optionsRef.current.title }, + { label: 'Presenter', title: 'presenter', value: optionsRef.current.presenter }, + { label: 'Subtitle', title: 'subtitle', value: optionsRef.current.subtitle }, + { label: 'Note', title: 'note', value: optionsRef.current.note }, + ]; + + const options: TableEntry[] = [ + { label: 'Is Public', title: 'isPublic', value: optionsRef.current.isPublic }, + { label: 'Skip', title: 'skip', value: optionsRef.current.skip }, + { label: 'Timer Type', title: 'timerType', value: optionsRef.current.timerType }, + { label: 'End Action', title: 'endAction', value: optionsRef.current.endAction }, + ]; + + const userFields: TableEntry[] = [ + { label: 'User 0', title: 'user0', value: optionsRef.current.user0 }, + { label: 'User 1', title: 'user1', value: optionsRef.current.user1 }, + { label: 'User 2', title: 'user2', value: optionsRef.current.user2 }, + { label: 'User 3', title: 'user3', value: optionsRef.current.user3 }, + { label: 'User 4', title: 'user4', value: optionsRef.current.user4 }, + { label: 'User 5', title: 'user5', value: optionsRef.current.user5 }, + { label: 'User 6', title: 'user6', value: optionsRef.current.user6 }, + { label: 'User 7', title: 'user7', value: optionsRef.current.user7 }, + { label: 'User 8', title: 'user8', value: optionsRef.current.user8 }, + { label: 'User 9', title: 'user9', value: optionsRef.current.user9 }, + ]; + + return ( +
+
+ +
+ +
+ + +
+ +
+ + +
+
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.module.scss b/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.module.scss new file mode 100644 index 000000000..0eb49359e --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.module.scss @@ -0,0 +1,33 @@ +@use '../../../../theme/v2Styles' as *; +@use '../../../../theme/ontimeColours' as *; + +.importTable { + margin: 0.5rem; + height: fit-content; + + thead { + color: $gray-500; + text-transform: uppercase; + width: 10em; + } + + tr:hover { + background-color: $gray-50; + } + + tbody { + td { + max-width: fit-content; + } + } +} + +.label { + display: inline-block; + min-width: 6em; + font-size: $inner-section-text-size; +} + +.input { + width: 100%; +} diff --git a/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.tsx b/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.tsx new file mode 100644 index 000000000..1435d0875 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-options/ImportMapTable.tsx @@ -0,0 +1,50 @@ +import { Input } from '@chakra-ui/react'; +import { ExcelImportMap } from 'ontime-utils'; + +import style from './ImportMapTable.module.scss'; + +export type TableEntry = { label: string; title: keyof ExcelImportMap; value: string }; + +interface ImportMapTableProps { + title: string; + fields: TableEntry[]; + handleOnChange: (field: keyof ExcelImportMap, value: string) => void; +} + +export default function ImportMapTable(props: ImportMapTableProps) { + const { title, fields, handleOnChange } = props; + + return ( + + + + + + + + {fields.map((field) => { + return ( + + + + + ); + })} + +
{title}
+ + + { + handleOnChange(field.title, event.target.value); + }} + /> +
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/upload-options/OntimeFileOptions.tsx b/apps/client/src/features/modals/upload-modal/upload-options/OntimeFileOptions.tsx new file mode 100644 index 000000000..812bfd2cc --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-options/OntimeFileOptions.tsx @@ -0,0 +1,31 @@ +import { MutableRefObject } from 'react'; +import { Switch } from '@chakra-ui/react'; + +import { ProjectFileImportOptions } from '../../../../common/api/ontimeApi'; +import ModalSplitInput from '../../ModalSplitInput'; + +import style from '../UploadModal.module.scss'; + +interface OntimeFileOptionsProps { + optionsRef: MutableRefObject>; + updateOptions: (field: T, value: ProjectFileImportOptions[T]) => void; +} + +export default function OntimeFileOptions(props: OntimeFileOptionsProps) { + const { optionsRef, updateOptions } = props; + + return ( +
+ Import options + + { + updateOptions('onlyRundown', e.target.checked); + }} + defaultChecked={Boolean(optionsRef.current.onlyRundown)} + /> + +
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.module.scss b/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.module.scss new file mode 100644 index 000000000..f2f59fc0f --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.module.scss @@ -0,0 +1,40 @@ +@use '../../../../theme/ontimeColours' as *; + +@mixin row { + display: flex; + align-items: center; + gap: 0.25rem; + padding: 0 0.25rem; +} + +.stepRow { + display: flex; + gap: 2rem; + align-items: center; + margin: 0 auto; + font-size: 1rem; +} + +.idle { + @include row; + color: $blue-500; +} + +.inactive { + @include row; + color: $gray-700; +} + +.active { + @include row; + color: $blue-700; +} + + +.inactiveIcon { + color: $gray-700; +} + +.activeIcon { + color: $blue-500; +} diff --git a/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.tsx b/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.tsx new file mode 100644 index 000000000..f3c369dee --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/upload-step/UploadStep.tsx @@ -0,0 +1,26 @@ +import { IoCheckmarkCircle } from '@react-icons/all-files/io5/IoCheckmarkCircle'; +import { IoChevronForward } from '@react-icons/all-files/io5/IoChevronForward'; +import { IoEllipseOutline } from '@react-icons/all-files/io5/IoEllipseOutline'; + +import type { UploadStep } from '../UploadModal'; + +import style from './UploadStep.module.scss'; + +export default function UploadStepTracker({ uploadStep }: { uploadStep: UploadStep }) { + const isImporting = uploadStep === 'import'; + const isReview = uploadStep === 'review'; + + return ( +
+
+ + Import +
+ +
+ {isReview ? : } + Review +
+
+ ); +} diff --git a/apps/client/src/features/modals/upload-modal/uploadModalContext.tsx b/apps/client/src/features/modals/upload-modal/uploadModalContext.tsx new file mode 100644 index 000000000..e17bc0869 --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/uploadModalContext.tsx @@ -0,0 +1,21 @@ +import { create } from 'zustand'; + +type UploadModalContext = { + file: File | null; + setFile: (file: File | null) => void; + + progress: number; + setProgress: (progress: number) => void; + + clear: () => void; +}; + +export const useUploadModalContextStore = create((set) => ({ + file: null, + setFile: (file: File | null) => set({ file }), + + progress: 0, + setProgress: (progress: number) => set({ progress }), + + clear: () => set({ file: null, progress: 0 }), +})); diff --git a/apps/client/src/features/modals/upload-modal/uploadUtils.ts b/apps/client/src/features/modals/upload-modal/uploadUtils.ts new file mode 100644 index 000000000..1bbeb962d --- /dev/null +++ b/apps/client/src/features/modals/upload-modal/uploadUtils.ts @@ -0,0 +1,64 @@ +import { ExcelImportMap } from 'ontime-utils'; + +import { ProjectFileImportOptions } from '../../../common/api/ontimeApi'; + +/** + * Validates a file according to the app upload contract + * @throws + * @param file + */ +export function validateFile(file: File) { + if (!file) { + throw new Error('No file to upload'); + } + + // Check if file is empty + if (file.size === 0) { + throw new Error('File is empty'); + } + + // Limit file size of a project file to around 1MB + if (file.name.endsWith('.json') && file.size > 1_000_000) { + throw new Error('File size limit (1MB) exceeded'); + } + + // Limit file size of an excel file to around 10MB + if (file.name.endsWith('.xlsx') && file.size > 10_000_000) { + throw new Error('File size limit (10MB) exceeded'); + } + + // Check file extension + if (!file.name.endsWith('.xlsx') && !file.name.endsWith('.json')) { + throw new Error('Unhandled file type'); + } +} + +export function isExcelFile(file: File | null) { + return file?.name.endsWith('.xlsx'); +} + +export function isOntimeFile(file: File | null) { + return file?.name.endsWith('.json'); +} + +type PersistedOntimeOptions = { + optionType: 'ontime'; + options: Partial; +}; + +type PersistedExcelOptions = { + optionType: 'excel'; + options: ExcelImportMap; +}; + +export function persistOptions(options: PersistedOntimeOptions | PersistedExcelOptions) { + localStorage.setItem(`ontime-import-options-${options.optionType}`, JSON.stringify(options.options)); +} + +export function getPersistedOptions(optionType: 'excel' | 'ontime') { + const options = localStorage.getItem(`ontime-import-options-${optionType}`); + if (!options) { + return null; + } + return JSON.parse(options); +} diff --git a/apps/client/src/features/modals/upload-modal/utils.ts b/apps/client/src/features/modals/upload-modal/utils.ts deleted file mode 100644 index 940448571..000000000 --- a/apps/client/src/features/modals/upload-modal/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -type ValidationStatus = { - errors: string[]; - isValid: boolean; -}; - -export function validateFile(file: File): ValidationStatus { - const status: ValidationStatus = { errors: [], isValid: true }; - if (!file) { - status.errors.push('No file to upload'); - status.isValid = false; - } - - // Limit file size to 1MB - if (file.size > 1000000) { - status.errors.push('File size limit (1MB) exceeded'); - status.isValid = false; - } - - // Check file extension - if (!file.name.endsWith('.xlsx') && !file.name.endsWith('.json')) { - status.errors.push('Unhandled file type'); - status.isValid = false; - } - return status; -} diff --git a/apps/client/src/theme/OntimeProgress.ts b/apps/client/src/theme/OntimeProgress.ts new file mode 100644 index 000000000..cb5c7bf2e --- /dev/null +++ b/apps/client/src/theme/OntimeProgress.ts @@ -0,0 +1,8 @@ +export const ontimeProgressGray = { + track: { + background: '#f6f6f6', // $gray-500 + }, + filledTrack: { + background: '#578AF4', // $blue-500 + }, +}; diff --git a/apps/client/src/theme/ontimeModal.ts b/apps/client/src/theme/ontimeModal.ts index bba0429cd..6abae3dd5 100644 --- a/apps/client/src/theme/ontimeModal.ts +++ b/apps/client/src/theme/ontimeModal.ts @@ -2,8 +2,8 @@ export const ontimeModal = { header: { fontWeight: 400, letterSpacing: '0.3px', - padding: '16px 24px', - fontSize: '20px', + padding: '1rem 1.5rem', + fontSize: '1.25rem', color: '#202020', // $gray-50 }, dialog: { @@ -20,17 +20,29 @@ export const ontimeModal = { color: '#202020', // $gray-50 }, footer: { - padding: '8px', + padding: '0.5rem', }, }; export const ontimeSmallModal = { ...ontimeModal, body: { - padding: '16px', - fontSize: '14px', + padding: '1rem', + fontSize: 'calc(1rem - 2px)', }, dialog: { minHeight: 'min(200px, 10vh)', }, }; + +export const ontimeUploadModal = { + ...ontimeSmallModal, + body: { + padding: '1rem', + fontSize: 'calc(1rem - 2px)', + }, + dialog: { + minHeight: 'min(200px, 10vh)', + maxWidth: 'min(800px, 80vh)', + }, +}; diff --git a/apps/client/src/theme/theme.ts b/apps/client/src/theme/theme.ts index d1b89a58b..2378a270e 100644 --- a/apps/client/src/theme/theme.ts +++ b/apps/client/src/theme/theme.ts @@ -13,7 +13,8 @@ import { import { ontimeCheckboxOnDark } from './ontimeCheckbox'; import { ontimeEditable } from './ontimeEditable'; import { ontimeMenuOnDark } from './ontimeMenu'; -import { ontimeModal, ontimeSmallModal } from './ontimeModal'; +import { ontimeModal, ontimeSmallModal, ontimeUploadModal } from './ontimeModal'; +import { ontimeProgressGray } from './OntimeProgress'; import { ontimeBlockRadio } from './ontimeRadio'; import { ontimeSelect } from './ontimeSelect'; import { lightSwitch, ontimeSwitch } from './ontimeSwitch'; @@ -79,6 +80,12 @@ const theme = extendTheme({ variants: { ontime: { ...ontimeModal }, 'ontime-small': { ...ontimeSmallModal }, + 'ontime-upload': { ...ontimeUploadModal }, + }, + }, + Progress: { + variants: { + 'ontime-on-light': { ...ontimeProgressGray }, }, }, Radio: { diff --git a/apps/server/package.json b/apps/server/package.json index b4ba77d2e..805e1db5f 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -15,7 +15,7 @@ "lowdb": "^5.0.5", "multer": "^1.4.5-lts.1", "node-osc": "^9.0.2", - "node-xlsx": "^0.21.0", + "node-xlsx": "^0.23.0", "ontime-utils": "workspace:*", "passport": "^0.6.0", "passport-local": "~1.0.0", diff --git a/apps/server/src/classes/data-provider/DataProvider.ts b/apps/server/src/classes/data-provider/DataProvider.ts index f155ba374..ea5285b9b 100644 --- a/apps/server/src/classes/data-provider/DataProvider.ts +++ b/apps/server/src/classes/data-provider/DataProvider.ts @@ -2,7 +2,16 @@ * Class Event Provider is a mediator for handling the local db * and adds logic specific to ontime data */ -import { ProjectData, OntimeRundown, ViewSettings } from 'ontime-types'; +import { + ProjectData, + OntimeRundown, + ViewSettings, + DatabaseModel, + OSCSettings, + UserFields, + Alias, + Settings, +} from 'ontime-types'; import { data, db } from '../../modules/loadDb.js'; import { safeMerge } from './DataProvider.utils.js'; @@ -45,7 +54,7 @@ export class DataProvider { return data.settings; } - static async setSettings(newData) { + static async setSettings(newData: Settings) { data.settings = { ...newData }; await this.persist(); } @@ -58,7 +67,7 @@ export class DataProvider { return data.aliases; } - static async setAliases(newData) { + static async setAliases(newData: Alias[]) { data.aliases = newData; await this.persist(); } @@ -76,12 +85,12 @@ export class DataProvider { await this.persist(); } - static async setUserFields(newData) { + static async setUserFields(newData: UserFields) { data.userFields = { ...newData }; await this.persist(); } - static async setOsc(newData) { + static async setOsc(newData: OSCSettings) { data.osc = { ...newData }; await this.persist(); } @@ -95,7 +104,7 @@ export class DataProvider { await db.write(); } - static async mergeIntoData(newData) { + static async mergeIntoData(newData: Partial) { const mergedData = safeMerge(data, newData); data.project = mergedData.project; data.settings = mergedData.settings; diff --git a/apps/server/src/classes/data-provider/DataProvider.utils.ts b/apps/server/src/classes/data-provider/DataProvider.utils.ts index f2ea10d68..eed142912 100644 --- a/apps/server/src/classes/data-provider/DataProvider.utils.ts +++ b/apps/server/src/classes/data-provider/DataProvider.utils.ts @@ -1,10 +1,12 @@ +import { DatabaseModel } from 'ontime-types'; + /** * Merges two data objects * @param {object} existing * @param {object} newData */ -export function safeMerge(existing, newData) { - const { rundown, project, settings, viewSettings, osc, http, aliases, userFields } = newData || {}; +export function safeMerge(existing: DatabaseModel, newData: Partial) { + const { rundown, project, settings, viewSettings, osc, aliases, userFields } = newData || {}; return { ...existing, rundown: rundown ?? existing.rundown, @@ -32,6 +34,5 @@ export function safeMerge(existing, newData) { : {}), }, }, - http: { ...existing.http, ...http }, }; } diff --git a/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts b/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts index 6a6f85a77..e17b019da 100644 --- a/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts +++ b/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts @@ -42,11 +42,6 @@ describe('safeMerge', () => { onFinish: [], }, }, - http: { - enabled: true, - user: null, - pwd: null, - }, }; it('returns existing data if new data is not provided', () => { @@ -188,19 +183,6 @@ describe('safeMerge', () => { onFinish: [], }, }, - http: { - user: null, - pwd: null, - messages: { - onLoad: [], - onStart: [], - onUpdate: [], - onPause: [], - onStop: [], - onFinish: [], - }, - enabled: true, - }, }; const newData = { diff --git a/apps/server/src/controllers/ontimeController.ts b/apps/server/src/controllers/ontimeController.ts index 8a35ec09c..76eca8aea 100644 --- a/apps/server/src/controllers/ontimeController.ts +++ b/apps/server/src/controllers/ontimeController.ts @@ -1,4 +1,4 @@ -import { Alias, LogOrigin, ProjectData } from 'ontime-types'; +import { Alias, DatabaseModel, LogOrigin, ProjectData } from 'ontime-types'; import { RequestHandler } from 'express'; import fs from 'fs'; @@ -7,13 +7,15 @@ import { networkInterfaces } from 'os'; import { fileHandler } from '../utils/parser.js'; import { DataProvider } from '../classes/data-provider/DataProvider.js'; import { failEmptyObjects, failIsNotArray } from '../utils/routerUtils.js'; -import { mergeObject } from '../utils/parserUtils.js'; import { PlaybackService } from '../services/PlaybackService.js'; import { eventStore } from '../stores/EventStore.js'; import { isDocker, resolveDbPath } from '../setup.js'; import { oscIntegration } from '../services/integration-service/OscIntegration.js'; import { logger } from '../classes/Logger.js'; -import { deleteAllEvents, forceReset } from '../services/rundown-service/RundownService.js'; +import { deleteAllEvents, notifyChanges } from '../services/rundown-service/RundownService.js'; +import { deepmerge } from 'ontime-utils'; +import { runtimeCacheStore } from '../stores/cachingStore.js'; +import { delayedRundownCacheKey } from '../services/rundown-service/delayedRundown.utils.js'; // Create controller for GET request to '/ontime/poll' // Returns data for current state @@ -44,43 +46,40 @@ export const dbDownload = async (req, res) => { }; /** - * handles file upload + * Parses a file and returns the result objects + * @param file + * @param _req + * @param _res + * @param options + */ +async function parseFile(file, _req, _res, options) { + if (!fs.existsSync(file)) { + throw new Error('Upload failed'); + } + const result = await fileHandler(file, options); + return result.data; +} + +/** + * parse an uploaded file and apply its parsed objects * @param file * @param req * @param res * @param [options] * @returns {Promise} */ -const uploadAndParse = async (file, req, res, options) => { - if (!fs.existsSync(file)) { - res.status(500).send({ message: 'Upload failed' }); - return; - } +const parseAndApply = async (file, _req, res, options) => { + const result = await parseFile(file, _req, res, options); - try { - const result = await fileHandler(file); + PlaybackService.stop(); - if ('error' in result && result.error) { - res.status(400).send({ message: result.message }); - } else if ('data' in result && result.message === 'success') { - PlaybackService.stop(); - // explicitly write objects - if (typeof result !== 'undefined') { - const newRundown = result.data.rundown || []; - if (options?.onlyRundown === 'true') { - await DataProvider.setRundown(newRundown); - } else { - await DataProvider.mergeIntoData(result.data); - } - } - forceReset(); - res.sendStatus(200); - } else { - res.status(400).send({ message: 'Failed parsing, no data' }); - } - } catch (error) { - res.status(400).send({ message: `Failed parsing ${error}` }); + const newRundown = result.rundown || []; + if (options?.onlyRundown === 'true') { + await DataProvider.setRundown(newRundown); + } else { + await DataProvider.mergeIntoData(result); } + notifyChanges({ timer: true, external: true, reset: true }); }; /** @@ -169,7 +168,7 @@ export const postUserFields = async (req, res) => { } try { const persistedData = DataProvider.getUserFields(); - const newData = mergeObject(persistedData, req.body); + const newData = deepmerge(persistedData, req.body); await DataProvider.setUserFields(newData); res.status(200).send(newData); } catch (error) { @@ -324,8 +323,38 @@ export const postOSC = async (req, res) => { } }; -// Create controller for POST request to '/ontime/db' -// Returns - +export async function patchPartialProjectFile(req, res) { + if (failEmptyObjects(req.body, res)) { + return; + } + + try { + const patchDb: Partial = { + project: req.body?.project, + settings: req.body?.settings, + viewSettings: req.body?.viewSettings, + osc: req.body?.osc, + aliases: req.body?.aliases, + userFields: req.body?.userFields, + rundown: req.body?.rundown, + }; + + await DataProvider.mergeIntoData(patchDb); + if (patchDb.rundown !== undefined) { + // it is likely cheaper to invalidate cache than to calculate diff + PlaybackService.stop(); + runtimeCacheStore.invalidate(delayedRundownCacheKey); + notifyChanges({ external: true, reset: true }); + } + res.status(200).send(); + } catch (error) { + res.status(400).send(error); + } +} + +/** + * uploads, parses and applies the data from a given file + */ export const dbUpload = async (req, res) => { if (!req.file) { res.status(400).send({ message: 'File not found' }); @@ -333,10 +362,39 @@ export const dbUpload = async (req, res) => { } const options = req.query; const file = req.file.path; - await uploadAndParse(file, req, res, options); + try { + await parseAndApply(file, req, res, options); + res.status(200).send(); + } catch (error) { + res.status(400).send({ message: `Failed parsing ${error}` }); + } }; -// Create controller for POST request to '/ontime/new' +/** + * uploads and parses an excel file + * @returns parsed result + */ +export async function previewExcel(req, res) { + if (!req.file) { + res.status(400).send({ message: 'File not found' }); + return; + } + + try { + const options = JSON.parse(req.body.options); + const file = req.file.path; + const data = await parseFile(file, req, res, options); + res.status(200).send(data); + } catch (error) { + res.status(500).send({ message: error.toString() }); + } +} + +/** + * Meant to create a new project file, it will clear only fields which are specific to a project + * @param req + * @param res + */ export const postNew: RequestHandler = async (req, res) => { try { const newProjectData: ProjectData = { diff --git a/apps/server/src/controllers/ontimeController.validate.ts b/apps/server/src/controllers/ontimeController.validate.ts index 5f67aa4e3..8be1c8bf5 100644 --- a/apps/server/src/controllers/ontimeController.validate.ts +++ b/apps/server/src/controllers/ontimeController.validate.ts @@ -118,3 +118,18 @@ export const validateOscSubscription = [ next(); }, ]; + +export const validatePatchProjectFile = [ + body('rundown').isArray().optional({ nullable: false }), + body('project').isObject().optional({ nullable: false }), + body('settings').isObject().optional({ nullable: false }), + body('viewSettings').isObject().optional({ nullable: false }), + body('aliases').isArray().optional({ nullable: false }), + body('userFields').isObject().optional({ nullable: false }), + body('osc').isObject().optional({ nullable: false }), + (req, res, next) => { + const errors = validationResult(req); + if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() }); + next(); + }, +]; diff --git a/apps/server/src/modules/loadDb.ts b/apps/server/src/modules/loadDb.ts index 9de1cccd5..4b831f131 100644 --- a/apps/server/src/modules/loadDb.ts +++ b/apps/server/src/modules/loadDb.ts @@ -42,7 +42,7 @@ const parseDb = async (fileToRead, adapterToUse) => { adapterToUse.data = dbModel; } - return parseJson(adapterToUse.data, true); + return parseJson(adapterToUse.data); }; /** diff --git a/apps/server/src/routes/ontimeRouter.ts b/apps/server/src/routes/ontimeRouter.ts index 8ff789817..67f4fb033 100644 --- a/apps/server/src/routes/ontimeRouter.ts +++ b/apps/server/src/routes/ontimeRouter.ts @@ -9,6 +9,7 @@ import { getSettings, getUserFields, getViewSettings, + patchPartialProjectFile, poll, postAliases, postNew, @@ -17,12 +18,14 @@ import { postSettings, postUserFields, postViewSettings, + previewExcel, } from '../controllers/ontimeController.js'; import { validateAliases, validateOSC, validateOscSubscription, + validatePatchProjectFile, validateSettings, validateUserFields, viewValidator, @@ -40,6 +43,12 @@ router.get('/db', dbDownload); // create route between controller and '/ontime/db' endpoint router.post('/db', uploadFile, dbUpload); +// create route between controller and '/ontime/excel' endpoint +router.patch('/db', validatePatchProjectFile, patchPartialProjectFile); + +// create route between controller and '/ontime/preview-spreadsheet' endpoint +router.post('/preview-spreadsheet', uploadFile, previewExcel); + // create route between controller and '/ontime/settings' endpoint router.get('/settings', getSettings); diff --git a/apps/server/src/services/rundown-service/RundownService.ts b/apps/server/src/services/rundown-service/RundownService.ts index 7d1762506..8da7f6642 100644 --- a/apps/server/src/services/rundown-service/RundownService.ts +++ b/apps/server/src/services/rundown-service/RundownService.ts @@ -35,7 +35,6 @@ import { clock } from '../Clock.js'; */ export function forceReset() { eventLoader.reset(); - sendRefetch(); runtimeCacheStore.invalidate(delayedRundownCacheKey); } @@ -192,15 +191,11 @@ export async function addEvent(eventData: Partial | Partial | Partial | Partial { expect(typeof validated.timeStart).toEqual('number'); expect(validated.timeStart).toEqual(0); expect(typeof validated.timeEnd).toEqual('number'); - expect(validated.timeEnd).toEqual(0); + expect(validated.timeEnd).toEqual(2); }); it('handles bad objects', () => { @@ -580,24 +580,24 @@ describe('test parseExcel function', () => { [ 'Time Start', 'Time End', - 'Event Title', - 'Presenter Name', - 'Event Subtitle', + 'Title', + 'Presenter', + 'Subtitle', 'End Action', 'Timer type', - 'Is Public? (x)', - 'Skip? (x)', + 'Public', + 'Skip', 'Notes', - 'User0:test0', - 'User1:test1', - 'User2:test2', - 'User3:test3', - 'User4:test4', - 'User5:test5', - 'User6:test6', - 'user7:test7', - 'user8:test8', - 'user9:test9', + 'test0', + 'test1', + 'test2', + 'test3', + 'test4', + 'test5', + 'test6', + 'test7', + 'test8', + 'test9', 'Colour', 'cue', ], @@ -652,6 +652,19 @@ describe('test parseExcel function', () => { [], ]; + const partialOptions = { + user0: 'test0', + user1: 'test1', + user2: 'test2', + user3: 'test3', + user4: 'test4', + user5: 'test5', + user6: 'test6', + user7: 'test7', + user8: 'test8', + user9: 'test9', + }; + const expectedParsedProjectData = { title: 'Test Event', description: 'test description', @@ -707,7 +720,7 @@ describe('test parseExcel function', () => { }, ]; - const parsedData = await parseExcel(testdata); + const parsedData = parseExcel(testdata, partialOptions); expect(parsedData.project).toStrictEqual(expectedParsedProjectData); expect(parsedData.rundown).toBeDefined(); expect(parsedData.rundown[0]).toMatchObject(expectedParsedRundown[0]); @@ -836,7 +849,16 @@ describe('test views import', () => { app: 'ontime', version: 2, }, - viewSettings: {}, + viewSettings: { + normalColor: '#ffffffcc', + warningColor: '#FFAB33', + warningThreshold: 120000, + dangerColor: '#ED3333', + dangerThreshold: 60000, + endMessage: '', + overrideStyles: false, + notAthing: true, + }, views: { overrideStyles: true, }, @@ -850,7 +872,7 @@ describe('test views import', () => { endMessage: '', overrideStyles: false, }; - const parsed = parseViewSettings(testData, false); + const parsed = parseViewSettings(testData); expect(parsed).toStrictEqual(expectedParsedViewSettings); }); @@ -862,16 +884,7 @@ describe('test views import', () => { version: 2, }, }; - const expectedParsedViewSettings = { - normalColor: '#ffffffcc', - warningColor: '#FFAB33', - warningThreshold: 120000, - dangerColor: '#ED3333', - dangerThreshold: 60000, - endMessage: '', - overrideStyles: false, - }; - const parsed = parseViewSettings(testData, true); - expect(parsed).toStrictEqual(expectedParsedViewSettings); + const parsed = parseViewSettings(testData); + expect(parsed).toStrictEqual({}); }); }); diff --git a/apps/server/src/utils/__tests__/parserUtils.test.ts b/apps/server/src/utils/__tests__/parserUtils.test.ts index 0b348a083..a69957328 100644 --- a/apps/server/src/utils/__tests__/parserUtils.test.ts +++ b/apps/server/src/utils/__tests__/parserUtils.test.ts @@ -45,7 +45,7 @@ describe('mergeObject()', () => { third: '', }); }); - test.skip('it only merges fields of the first object', () => { + test('it only merges fields of the first object', () => { const a = { first: 'yes', second: 'yes', @@ -64,6 +64,35 @@ describe('mergeObject()', () => { third: '', }); }); + test('merges nested objects', () => { + // Define a sample object with nested properties + const a = { + name: 'John', + address: { + city: 'New York', + postalCode: '10001', + }, + }; + + // Define a partial object with nested properties for merging + const b = { + name: 'Doe', + address: { + city: 'San Francisco', + state: 'CA', + }, + }; + + const merged = mergeObject(a, b); + + expect(merged.name).toBe('Doe'); + expect(merged.address.city).toBe('San Francisco'); + // @ts-expect-error -- its ok, just checking + expect(merged.address.state).toBe('CA'); + expect(merged.address.postalCode).toBe('10001'); + expect(merged.address).not.toBe(a.address); + expect(merged.address).not.toBe(b.address); + }); }); describe('removeUndefined()', () => { diff --git a/apps/server/src/utils/fileManagement.js b/apps/server/src/utils/fileManagement.ts similarity index 100% rename from apps/server/src/utils/fileManagement.js rename to apps/server/src/utils/fileManagement.ts diff --git a/apps/server/src/utils/getRandomName.js b/apps/server/src/utils/getRandomName.ts similarity index 100% rename from apps/server/src/utils/getRandomName.js rename to apps/server/src/utils/getRandomName.ts diff --git a/apps/server/src/utils/parser.ts b/apps/server/src/utils/parser.ts index 260bab21b..bd2459869 100644 --- a/apps/server/src/utils/parser.ts +++ b/apps/server/src/utils/parser.ts @@ -1,18 +1,27 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -- not ready to fully type - -import fs from 'fs'; -import xlsx from 'node-xlsx'; -import { generateId, calculateDuration } from 'ontime-utils'; +import { + generateId, + isExcelImportMap, + type ExcelImportMap, + defaultExcelImportMap, + validateEndAction, + validateTimerType, + type ExcelImportOptions, + validateTimes, +} from 'ontime-utils'; import { DatabaseModel, - EndAction, OntimeEvent, OntimeRundown, SupportedEvent, - TimerType, + ProjectData, UserFields, + EndAction, + TimerType, } from 'ontime-types'; + +import fs from 'fs'; +import xlsx from 'node-xlsx'; + import { event as eventDef } from '../models/eventsDefinition.js'; import { dbModel } from '../models/dataModel.js'; import { deleteFile, makeString } from './parserUtils.js'; @@ -33,27 +42,55 @@ export const JSON_MIME = 'application/json'; /** * @description Excel array parser * @param {array} excelData - array with excel sheet + * @param {ExcelImportOptions} options - an object that contains the import map * @returns {object} - parsed object */ -export const parseExcel = async (excelData) => { +export const parseExcel = (excelData: unknown[][], options?: Partial) => { + const importMap: ExcelImportMap = { ...defaultExcelImportMap, ...options }; const projectData: Partial = { title: '', description: '', publicUrl: '', + publicInfo: '', backstageUrl: '', + backstageInfo: '', + }; + const customUserFields: Partial = { + user0: importMap.user0, + user1: importMap.user1, + user2: importMap.user2, + user3: importMap.user3, + user4: importMap.user4, + user5: importMap.user5, + user6: importMap.user6, + user7: importMap.user7, + user8: importMap.user8, + user9: importMap.user9, }; - const customUserFields: Partial = {}; const rundown: OntimeRundown = []; - let timeStartIndex: number | null = null; - let timeEndIndex: number | null = null; + + // title stuff: strings let titleIndex: number | null = null; let cueIndex: number | null = null; let presenterIndex: number | null = null; let subtitleIndex: number | null = null; - let isPublicIndex: number | null = null; - let skipIndex: number | null = null; let notesIndex: number | null = null; let colourIndex: number | null = null; + + // options: booleans + let isPublicIndex: number | null = null; + let skipIndex: number | null = null; + + // times: numbers + let timeStartIndex: number | null = null; + let timeEndIndex: number | null = null; + let durationIndex: number | null = null; + + // options: enum properties + let endActionIndex: number | null = null; + let timerTypeIndex: number | null = null; + + // user fields: strings let user0Index: number | null = null; let user1Index: number | null = null; let user2Index: number | null = null; @@ -64,13 +101,11 @@ export const parseExcel = async (excelData) => { let user7Index: number | null = null; let user8Index: number | null = null; let user9Index: number | null = null; - let endActionIndex: number | null = null; - let timerTypeIndex: number | null = null; excelData .filter((e) => e.length > 0) .forEach((row) => { - // project data imports are on the column to the right + // these fields contain the data to its right let projectTitleNext = false; let projectDescriptionNext = false; let publicUrlNext = false; @@ -79,31 +114,68 @@ export const parseExcel = async (excelData) => { let backstageInfoNext = false; const event: Partial = {}; + const handlers = { + [importMap.projectName]: () => (projectTitleNext = true), + [importMap.projectDescription]: () => (projectDescriptionNext = true), + [importMap.publicUrl]: () => (publicUrlNext = true), + [importMap.publicInfo]: () => (publicInfoNext = true), + [importMap.backstageUrl]: () => (backstageUrlNext = true), + [importMap.backstageInfo]: () => (backstageInfoNext = true), + + [importMap.timeStart]: (index: number) => (timeStartIndex = index), + [importMap.timeEnd]: (index: number) => (timeEndIndex = index), + [importMap.duration]: (index: number) => (durationIndex = index), + + [importMap.cue]: (index: number) => (cueIndex = index), + [importMap.title]: (index: number) => (titleIndex = index), + [importMap.presenter]: (index: number) => (presenterIndex = index), + [importMap.subtitle]: (index: number) => (subtitleIndex = index), + [importMap.isPublic]: (index: number) => (isPublicIndex = index), + [importMap.skip]: (index: number) => (skipIndex = index), + [importMap.note]: (index: number) => (notesIndex = index), + [importMap.colour]: (index: number) => (colourIndex = index), + + [importMap.endAction]: (index: number) => (endActionIndex = index), + [importMap.timerType]: (index: number) => (timerTypeIndex = index), + + [importMap.user0]: (index: number) => (user0Index = index), + [importMap.user1]: (index: number) => (user1Index = index), + [importMap.user2]: (index: number) => (user2Index = index), + [importMap.user3]: (index: number) => (user3Index = index), + [importMap.user4]: (index: number) => (user4Index = index), + [importMap.user5]: (index: number) => (user5Index = index), + [importMap.user6]: (index: number) => (user6Index = index), + [importMap.user7]: (index: number) => (user7Index = index), + [importMap.user8]: (index: number) => (user8Index = index), + [importMap.user9]: (index: number) => (user9Index = index), + } as const; row.forEach((column, j) => { - // check flags + // 1. we check if we have set a flag for a known field if (projectTitleNext) { - projectData.title = column; + projectData.title = makeString(column, ''); projectTitleNext = false; } else if (projectDescriptionNext) { - projectData.description = column; + projectData.description = makeString(column, ''); projectDescriptionNext = false; } else if (publicUrlNext) { - projectData.publicUrl = column; + projectData.publicUrl = makeString(column, ''); publicUrlNext = false; } else if (publicInfoNext) { - projectData.publicInfo = column; + projectData.publicInfo = makeString(column, ''); publicInfoNext = false; } else if (backstageUrlNext) { - projectData.backstageUrl = column; + projectData.backstageUrl = makeString(column, ''); backstageUrlNext = false; } else if (backstageInfoNext) { - projectData.backstageInfo = column; + projectData.backstageInfo = makeString(column, ''); backstageInfoNext = false; } else if (j === timeStartIndex) { event.timeStart = parseExcelDate(column); } else if (j === timeEndIndex) { event.timeEnd = parseExcelDate(column); + } else if (j === durationIndex) { + event.duration = parseExcelDate(column); } else if (j === titleIndex) { event.title = makeString(column, ''); } else if (j === cueIndex) { @@ -119,166 +191,51 @@ export const parseExcel = async (excelData) => { } else if (j === notesIndex) { event.note = makeString(column, ''); } else if (j === endActionIndex) { - if (column === '') { - event.endAction = EndAction.None; - } else { - event.endAction = column; - } + event.endAction = validateEndAction(column); } else if (j === timerTypeIndex) { - if (column === '') { - event.timerType = TimerType.CountDown; - } else { - event.timerType = column; - } + event.timerType = validateTimerType(column); } else if (j === colourIndex) { - event.colour = column; + event.colour = makeString(column, ''); } else if (j === user0Index) { - event.user0 = column; + event.user0 = makeString(column, ''); } else if (j === user1Index) { - event.user1 = column; + event.user1 = makeString(column, ''); } else if (j === user2Index) { - event.user2 = column; + event.user2 = makeString(column, ''); } else if (j === user3Index) { - event.user3 = column; + event.user3 = makeString(column, ''); } else if (j === user4Index) { - event.user4 = column; + event.user4 = makeString(column, ''); } else if (j === user5Index) { - event.user5 = column; + event.user5 = makeString(column, ''); } else if (j === user6Index) { - event.user6 = column; + event.user6 = makeString(column, ''); } else if (j === user7Index) { - event.user7 = column; + event.user7 = makeString(column, ''); } else if (j === user8Index) { - event.user8 = column; + event.user8 = makeString(column, ''); } else if (j === user9Index) { - event.user9 = column; + event.user9 = makeString(column, ''); } else { + // 2. if there is no flag, lets see if we know the field type if (typeof column === 'string') { const col = column.toLowerCase(); - // look for keywords - // need to make sure it is a string first - switch (col) { - case 'project name': - projectTitleNext = true; - break; - case 'project description': - projectDescriptionNext = true; - break; - case 'public url': - publicUrlNext = true; - break; - case 'public info': - publicInfoNext = true; - break; - case 'backstage url': - backstageUrlNext = true; - break; - case 'backstage info': - backstageInfoNext = true; - break; - case 'time start': - case 'start': - timeStartIndex = j; - break; - case 'time end': - case 'end': - case 'finish': - timeEndIndex = j; - break; - case 'cue': - case 'page': - cueIndex = j; - break; - case 'event title': - case 'title': - titleIndex = j; - break; - case 'presenter name': - case 'speaker': - case 'presenter': - presenterIndex = j; - break; - case 'event subtitle': - case 'subtitle': - subtitleIndex = j; - break; - case 'is public? (x)': - case 'is public': - case 'public': - isPublicIndex = j; - break; - case 'skip? (x)': - case 'skip?': - case 'skip': - skipIndex = j; - break; - case 'note': - case 'notes': - notesIndex = j; - break; - case 'colour': - case 'color': - colourIndex = j; - break; - case 'end action': - endActionIndex = j; - break; - case 'timer type': - timerTypeIndex = j; - break; - default: - // look for user defined - if (col.startsWith('user')) { - const index = column.charAt(4); - // name is the bit after the : - const [, name] = column.split(':'); - if (typeof name !== 'undefined') { - if (index === '0') { - customUserFields.user0 = name; - user0Index = j; - } else if (index === '1') { - customUserFields.user1 = name; - user1Index = j; - } else if (index === '2') { - customUserFields.user2 = name; - user2Index = j; - } else if (index === '3') { - customUserFields.user3 = name; - user3Index = j; - } else if (index === '4') { - customUserFields.user4 = name; - user4Index = j; - } else if (index === '5') { - customUserFields.user5 = name; - user5Index = j; - } else if (index === '6') { - customUserFields.user6 = name; - user6Index = j; - } else if (index === '7') { - customUserFields.user7 = name; - user7Index = j; - } else if (index === '8') { - customUserFields.user8 = name; - user8Index = j; - } else if (index === '9') { - customUserFields.user9 = name; - user9Index = j; - } - } - } - break; + if (handlers[col]) { + handlers[col](j); } + // else. we don't know how to handle this column + // just ignore it } } }); if (Object.keys(event).length > 0) { // if any data was found, push to array - // take care of it in the next step rundown.push({ ...event, type: SupportedEvent.Event } as OntimeEvent); } }); + return { rundown, project: projectData, @@ -286,17 +243,16 @@ export const parseExcel = async (excelData) => { app: 'ontime', version: 2, }, - userFields: { ...dbModel.userFields, ...customUserFields }, + userFields: customUserFields, }; }; /** - * @description JSON parser function for v1 of data system - * @param {object} jsonData - json data JSON object to be parsed - * @param {boolean} [enforce=false] - flag, tells to create an object anyway + * @description JSON parser function for ontime project file + * @param {object} jsonData - project file to be parsed * @returns {object} - parsed object */ -export const parseJson = async (jsonData, enforce = false): Promise => { +export const parseJson = async (jsonData): Promise => { if (!jsonData || typeof jsonData !== 'object') { return null; } @@ -307,17 +263,17 @@ export const parseJson = async (jsonData, enforce = false): Promise, cueFallback: stri const e = eventArgs; const d = eventDef; - const start = e.timeStart != null && typeof e.timeStart === 'number' ? e.timeStart : d.timeStart; - const end = e.timeEnd != null && typeof e.timeEnd === 'number' ? e.timeEnd : d.timeEnd; + + const { timeStart, timeEnd, duration } = validateTimes(e.timeStart, e.timeEnd, e.duration); event = { ...d, title: makeString(e.title, d.title), subtitle: makeString(e.subtitle, d.subtitle), presenter: makeString(e.presenter, d.presenter), - timeStart: start, - timeEnd: end, - endAction: makeString(e.endAction, d.endAction), - timerType: makeString(e.timerType, d.timerType), - duration: calculateDuration(start, end), + timeStart, + timeEnd, + duration, + endAction: validateEndAction(e.endAction, EndAction.None), + timerType: validateTimerType(e.timerType, TimerType.CountDown), isPublic: typeof e.isPublic === 'boolean' ? e.isPublic : d.isPublic, skip: typeof e.skip === 'boolean' ? e.skip : d.skip, note: makeString(e.note, d.note), @@ -371,8 +327,8 @@ export const validateEvent = (eventArgs: Partial, cueFallback: stri user8: makeString(e.user8, d.user8), user9: makeString(e.user9, d.user9), colour: makeString(e.colour, d.colour), - id, cue: makeString(e.cue, cueFallback), + id, type: 'event', }; } @@ -380,68 +336,59 @@ export const validateEvent = (eventArgs: Partial, cueFallback: stri return event; }; -type ResponseOK = { data: Partial; message: 'success' }; -type ResponseError = { error: true; message: string }; +type ResponseOK = { + data: Partial; +}; /** * @description Middleware function that checks file type and calls relevant parser * @param {string} file - reference to file + * @param options - import options * @return {object} - parse result message */ -export const fileHandler = async (file): Promise => { - let res: Partial = {}; +export const fileHandler = async (file: string, options: ExcelImportOptions): Promise> => { + const res: Partial = {}; // check which file type are we dealing with if (file.endsWith('.xlsx')) { - try { - const excelData = xlsx - .parse(file, { cellDates: true }) - .find(({ name }) => name.toLowerCase() === 'ontime' || name.toLowerCase() === 'event schedule'); - - // we only look at worksheets called ontime or event schedule - if (excelData?.data) { - const dataFromExcel = await parseExcel(excelData.data); - res.data = {}; - res.data.rundown = parseRundown(dataFromExcel); - res.data.project = parseProject(dataFromExcel, true); - res.data.userFields = parseUserFields(dataFromExcel); - res.message = 'success'; - } else { - const errorMessage = 'No sheet found named "ontime" or "event schedule"'; - res = { - error: true, - message: errorMessage, - }; - } - } catch (error) { - res = { error: true, message: `Error parsing file: ${error}` }; + // we need to check that the options are applicable + if (!isExcelImportMap(options)) { + throw new Error('Got incorrect options to excel import', JSON.parse(options)); } + + const excelData = xlsx + .parse(file, { cellDates: true }) + .find(({ name }) => name.toLowerCase() === options.worksheet.toLowerCase()); + + if (!excelData?.data) { + throw new Error(`Could not find data to import, maybe the worksheet name is incorrect: ${options.worksheet}`); + } + + const dataFromExcel = parseExcel(excelData.data, options); + // we run the parsed data through an extra step to ensure the objects shape + res.data = {}; + res.data.rundown = parseRundown(dataFromExcel); + if (res.data.rundown.length < 1) { + throw new Error(`Could not find data to import in the worksheet ${options.worksheet}`); + } + res.data.project = parseProject(dataFromExcel); + res.data.userFields = parseUserFields(dataFromExcel); + return res; } if (file.endsWith('.json')) { // if json check version - const rawdata = fs.readFileSync(file); + const rawdata = fs.readFileSync(file).toString(); let uploadedJson = null; - try { - uploadedJson = JSON.parse(rawdata); - } catch (error) { - return { error: true, message: 'Error parsing JSON file' }; + uploadedJson = JSON.parse(rawdata); + if (uploadedJson.settings.version !== 2) { + throw new Error(`Project version unknown ${uploadedJson.settings.version}`); } + res.data = await parseJson(uploadedJson); - if (uploadedJson.settings.version === 2) { - try { - res.data = await parseJson(uploadedJson); - res.message = 'success'; - } catch (error) { - res = { error: true, message: `Error parsing file: ${error}` }; - } - } else { - res = { error: true, message: 'Error parsing file, version unknown' }; - } + // delete file + await deleteFile(file); + return res; } - - // delete file - await deleteFile(file); - return res; }; diff --git a/apps/server/src/utils/parserFunctions.ts b/apps/server/src/utils/parserFunctions.ts index 2bc0e3b75..3282e48f3 100644 --- a/apps/server/src/utils/parserFunctions.ts +++ b/apps/server/src/utils/parserFunctions.ts @@ -1,7 +1,6 @@ import { generateId } from 'ontime-utils'; import { Alias, - EndAction, OntimeRundown, OSCSettings, OscSubscription, @@ -9,7 +8,6 @@ import { ProjectData, Settings, TimerLifeCycle, - TimerType, UserFields, ViewSettings, } from 'ontime-types'; @@ -45,18 +43,6 @@ export const parseRundown = (data): OntimeRundown => { continue; } - // validate the right endAction is used - if (e.endAction && !Object.values(EndAction).includes(e.endAction)) { - e.endAction = EndAction.None; - console.log('WARNING: invalid End Action provided, using default'); - } - - // validate the right timerType is used - if (e.timerType && !Object.values(TimerType).includes(e.timerType)) { - e.timerType = TimerType.CountDown; - console.log('WARNING: invalid Timer Type provided, using default'); - } - if (e.type === 'event') { eventIndex += 1; const event = validateEvent(e, eventIndex.toString()); @@ -88,10 +74,9 @@ export const parseRundown = (data): OntimeRundown => { /** * Parse event portion of an entry * @param {object} data - data object - * @param {boolean} enforce - whether to create a definition if one is missing * @returns {object} - event object data */ -export const parseProject = (data, enforce): ProjectData => { +export const parseProject = (data): ProjectData => { let newProjectData: Partial = {}; // we are adding this here to aid transition, should be removed once enough time has past that users have fully migrated // TODO: Remove eventually @@ -109,9 +94,6 @@ export const parseProject = (data, enforce): ProjectData => { backstageUrl: project.backstageUrl || dbModel.project.backstageUrl, backstageInfo: project.backstageInfo || dbModel.project.backstageInfo, }; - } else if (enforce) { - newProjectData = { ...dbModel.project }; - console.log('Created project object in db'); } return newProjectData as ProjectData; }; @@ -119,10 +101,9 @@ export const parseProject = (data, enforce): ProjectData => { /** * Parse settings portion of an entry * @param {object} data - data object - * @param {boolean} enforce - whether to create a definition if one is missing * @returns {object} - event object data */ -export const parseSettings = (data, enforce): Settings => { +export const parseSettings = (data): Settings => { let newSettings: Partial = {}; if ('settings' in data) { console.log('Found settings definition, importing...'); @@ -146,9 +127,6 @@ export const parseSettings = (data, enforce): Settings => { ...settings, }; } - } else if (enforce) { - newSettings = dbModel.settings; - console.log('Created settings object in db'); } return newSettings as Settings; }; @@ -156,10 +134,9 @@ export const parseSettings = (data, enforce): Settings => { /** * Parse settings portion of an entry * @param {object} data - data object - * @param {boolean} enforce - whether to create a definition if one is missing * @returns {object} - event object data */ -export const parseViewSettings = (data, enforce): ViewSettings => { +export const parseViewSettings = (data): ViewSettings => { let newViews: Partial = {}; if ('viewSettings' in data) { console.log('Found view definition, importing...'); @@ -175,13 +152,7 @@ export const parseViewSettings = (data, enforce): ViewSettings => { endMessage: v.endMessage ?? dbModel.viewSettings.endMessage, }; - // write to db - newViews = { - ...viewSettings, - }; - } else if (enforce) { - newViews = dbModel.viewSettings; - console.log('Created viewSettings object in db'); + newViews = { ...viewSettings }; } return newViews as ViewSettings; }; @@ -224,16 +195,11 @@ export const validateOscObject = (data: OscSubscription): boolean => { /** * Parse osc portion of an entry */ -export const parseOsc = ( - data: { - osc?: Partial; - }, - enforce: boolean, -): OSCSettings | Record => { +export const parseOsc = (data: { osc?: Partial }): OSCSettings => { if ('osc' in data) { console.log('Found OSC definition, importing...'); - const loadedConfig = data?.osc || {}; + const loadedConfig = data.osc || {}; const validatedSubscriptions = validateOscObject(loadedConfig.subscriptions) ? loadedConfig.subscriptions : dbModel.osc.subscriptions; @@ -246,10 +212,7 @@ export const parseOsc = ( enabledOut: loadedConfig.enabledOut ?? dbModel.osc.enabledOut, subscriptions: validatedSubscriptions, }; - } else if (enforce) { - console.log('Created OSC object in db'); - return { ...dbModel.osc }; - } else return {}; + } }; /** diff --git a/apps/server/src/utils/parserUtils.ts b/apps/server/src/utils/parserUtils.ts index 4a09058c0..7adf2b7f9 100644 --- a/apps/server/src/utils/parserUtils.ts +++ b/apps/server/src/utils/parserUtils.ts @@ -1,4 +1,5 @@ import fs from 'fs'; +import { deepmerge } from 'ontime-utils'; /** * @description Ensures variable is string, it skips object types @@ -52,16 +53,30 @@ export const isEmptyObject = (obj: object) => { /** * @description Merges two objects, suppressing undefined keys - * @param {object} a - * @param {object} b + * @param {object} a - any object + * @param {object} b - a potential partial object of same time as a */ -export const mergeObject = (a, b) => { - const merged = {}; - Object.keys({ ...a, ...b }).map((key) => { - merged[key] = typeof b[key] === 'undefined' ? a[key] : b[key]; - }); +export function mergeObject>(a: T, b: Partial>): T { + const merged = { ...a }; + + for (const key in b) { + const aValue = a[key]; + const bValue = b[key]; + + // ignore keys that do not exist in original object + if (!Object.hasOwn(merged, key)) { + continue; + } + + if (typeof bValue === 'object' && bValue !== null && typeof aValue === 'object' && aValue !== null) { + // @ts-expect-error -- library side, ignore for now + merged[key] = deepmerge(aValue, bValue); + } else if (bValue !== undefined) { + merged[key] = bValue; + } + } return merged; -}; +} /** * @description Removes undefined diff --git a/apps/server/src/utils/time.ts b/apps/server/src/utils/time.ts index d92aa7488..f3a010436 100644 --- a/apps/server/src/utils/time.ts +++ b/apps/server/src/utils/time.ts @@ -89,14 +89,18 @@ export const forgivingStringToMillis = (value: string, fillLeft = true): number * @returns {number} - time in milliseconds */ -export const parseExcelDate = (excelDate: string): number => { - // attempt converting to date object - const date = new Date(excelDate); - if (date instanceof Date && !isNaN(date.getTime())) { - return dateToMillis(date); - } else if (isTimeString(excelDate)) { - return forgivingStringToMillis(excelDate); +export const parseExcelDate = (excelDate: unknown): number => { + if (excelDate instanceof Date) { + return dateToMillis(excelDate); + } else if (typeof excelDate === 'string') { + const date = new Date(excelDate); + if (date instanceof Date && !isNaN(date.getTime())) { + return dateToMillis(date); + } else if (isTimeString(excelDate)) { + return forgivingStringToMillis(excelDate); + } } + return 0; }; diff --git a/apps/server/src/utils/url.js b/apps/server/src/utils/url.js deleted file mode 100644 index 9da592e10..000000000 --- a/apps/server/src/utils/url.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @description Cleans given url - * @param {string} url - URL to be checked - * @returns {string} Sanitized url - */ -export const cleanURL = (url) => { - // trim whitespaces - let r = url.trim(); - - // clear any whitespaces - r = r.split(' ').join('%20'); - - // contain only allowed characters - r = r.replace(/([@\s<>[\]{}|\\^])+/g, ''); - // starts with http:// - if (!r.startsWith('http://')) r = `http://${r}`; - - return r; -}; diff --git a/apps/server/src/utils/url.ts b/apps/server/src/utils/url.ts new file mode 100644 index 000000000..9f8fd7bba --- /dev/null +++ b/apps/server/src/utils/url.ts @@ -0,0 +1,20 @@ +/** + * @description Cleans given url + * @param {string} url - URL to be checked + * @returns {string} Sanitized url + */ +export const cleanURL = (url: string): string => { + // trim whitespaces + let sanitised = url.trim(); + + // clear any whitespaces + sanitised = sanitised.split(' ').join('%20'); + + // contain only allowed characters + sanitised = sanitised.replace(/([@\s<>[\]{}|\\^])+/g, ''); + + // starts with http:// + if (!sanitised.startsWith('http://')) sanitised = `http://${sanitised}`; + + return sanitised; +}; diff --git a/e2e/tests/002-upload-showfile.spec.ts b/e2e/tests/002-upload-showfile.spec.ts index 539c5e22f..d522581c6 100644 --- a/e2e/tests/002-upload-showfile.spec.ts +++ b/e2e/tests/002-upload-showfile.spec.ts @@ -13,13 +13,13 @@ test('test project file upload', async ({ page }) => { // https://playwright.dev/docs/api/class-filechooser const [fileChooser] = await Promise.all([ page.waitForEvent('filechooser'), - await page.getByText('Click to upload Ontime project file').click(), + await page.getByText('Click to select Ontime project or xlsx rundown').click(), ]); await fileChooser.setFiles(fileToUpload); + // there is only one step for normal imports await page.getByRole('button', { name: 'Import' }).click(); - await page.getByRole('button', { name: 'Close' }).click(); // asset test events await page.getByPlaceholder('Start').first().click(); diff --git a/package.json b/package.json index feb142137..c93e6a71e 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "dist-mac": "turbo run dist-mac", "dist-linux": "turbo run dist-linux", "e2e": "cross-env DEBUG=pw:webserver npx playwright test -c playwright.config.ts", + "e2e:ui": "cross-env DEBUG=pw:webserver npx playwright test --ui -c playwright.config.ts", "e2e:i": "npx playwright codegen", "cleanup": "rm -rf node_modules && rm -rf **/node_modules && rm -rf **/**/node_modules" }, diff --git a/packages/types/src/utils/guards.ts b/packages/types/src/utils/guards.ts index 74cb630e7..d1a596718 100644 --- a/packages/types/src/utils/guards.ts +++ b/packages/types/src/utils/guards.ts @@ -1,7 +1,7 @@ import { OntimeRundownEntry } from '../definitions/core/Rundown.type.js'; import { OntimeBlock, OntimeDelay, OntimeEvent, SupportedEvent } from '../definitions/core/OntimeEvent.type.js'; -type MaybeEvent = OntimeRundownEntry | null | undefined; +type MaybeEvent = Partial | null | undefined; export function isOntimeEvent(event: MaybeEvent): event is OntimeEvent { return event?.type === SupportedEvent.Event; diff --git a/packages/utils/index.ts b/packages/utils/index.ts index d86894c2f..ac0060d56 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -1,12 +1,13 @@ // runtime utils export { getFirst, getFirstEvent, getLastEvent, getNext, getPrevious } from './src/rundown-utils/rundownUtils.js'; export { validatePlayback } from './src/validate-action/validatePlayback.js'; +export { validateTimes } from './src/validate-events/validateEvent.js'; +export { calculateDuration } from './src/validate-events/validateEvent.js'; // rundown utils export { sanitiseCue } from './src/cue-utils/cueUtils.js'; export { getCueCandidate } from './src/cue-utils/cueUtils.js'; export { generateId } from './src/generate-id/generateId.js'; -export { calculateDuration } from './src/rundown-utils/rundownUtils.js'; export { swapOntimeEvents } from './src/rundown-utils/rundownUtils.js'; // format utils @@ -18,5 +19,21 @@ export { millisToString } from './src/date-utils/millisToString.js'; // time utils export { dayInMs, mts } from './src/timeConstants.js'; +// helpers from externals +export { deepmerge } from './src/externals/deepmerge.js'; + // generic utilities export { isNumeric } from './src/types/types.js'; + +// model validation +export { validateEndAction, validateTimerType } from './src/validate-events/validateEvent.js'; + +// feature business logic + +// feature business logic - excel import +export { + type ExcelImportMap, + type ExcelImportOptions, + defaultExcelImportMap, + isExcelImportMap, +} from './src/feature/excel-import/excelImport.js'; diff --git a/packages/utils/package.json b/packages/utils/package.json index 2d1d7dd2b..c11c74c9e 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -11,6 +11,7 @@ "cleanup": "rm -rf .turbo && rm -rf node_modules" }, "dependencies": { + "deepmerge-ts": "^5.1.0", "luxon": "^3.3.0", "nanoid": "^4.0.1" }, diff --git a/packages/utils/src/externals/deepmerge.ts b/packages/utils/src/externals/deepmerge.ts new file mode 100644 index 000000000..23bc35e07 --- /dev/null +++ b/packages/utils/src/externals/deepmerge.ts @@ -0,0 +1,2 @@ +// evaluating the library, we re-export to make it easy to detach +export { deepmerge } from 'deepmerge-ts'; diff --git a/packages/utils/src/feature/excel-import/excelImport.ts b/packages/utils/src/feature/excel-import/excelImport.ts new file mode 100644 index 000000000..7ef041fe2 --- /dev/null +++ b/packages/utils/src/feature/excel-import/excelImport.ts @@ -0,0 +1,44 @@ +export type ExcelImportOptions = keyof typeof defaultExcelImportMap; +export type ExcelImportMap = typeof defaultExcelImportMap; + +export const defaultExcelImportMap = { + worksheet: 'event schedule', + projectName: 'project name', + projectDescription: 'project description', + publicUrl: 'public url', + publicInfo: 'public info', + backstageUrl: 'backstage url', + backstageInfo: 'backstage info', + timeStart: 'time start', + timeEnd: 'time end', + duration: 'duration', + cue: 'cue', + title: 'title', + presenter: 'presenter', + subtitle: 'subtitle', + isPublic: 'public', + skip: 'skip', + note: 'notes', + colour: 'colour', + endAction: 'end action', + timerType: 'timer type', + user0: 'user0', + user1: 'user1', + user2: 'user2', + user3: 'user3', + user4: 'user4', + user5: 'user5', + user6: 'user6', + user7: 'user7', + user8: 'user8', + user9: 'user9', +}; + +export function isExcelImportMap(obj: unknown): obj is ExcelImportMap { + if (typeof obj !== 'object' || obj === null) { + return false; + } + + const keys = Object.keys(obj); + return keys.every((key) => Object.hasOwn(defaultExcelImportMap, key)); +} diff --git a/packages/utils/src/rundown-utils/rundownUtils.test.ts b/packages/utils/src/rundown-utils/rundownUtils.test.ts index 677fccf5e..892732965 100644 --- a/packages/utils/src/rundown-utils/rundownUtils.test.ts +++ b/packages/utils/src/rundown-utils/rundownUtils.test.ts @@ -1,8 +1,6 @@ import { OntimeRundown, SupportedEvent } from 'ontime-types'; -import { dayInMs } from '../timeConstants.js'; import { getNextEvent, getPreviousEvent } from './rundownUtils'; -import { calculateDuration } from './rundownUtils.js'; describe('getNextEvent()', () => { it('returns the next event of type event', () => { @@ -71,25 +69,3 @@ describe('getPreviousEvent()', () => { expect(previous).toBe(null); }); }); - -describe('calculateDuration()', () => { - describe('Given start and end values', () => { - it('is the difference between end and start', () => { - const duration = calculateDuration(10, 20); - expect(duration).toBe(10); - }); - }); - - describe('Handles edge cases', () => { - it('handles events that go over midnight', () => { - const duration = calculateDuration(51, 50); - expect(duration).toBe(dayInMs - 1); - }); - it('handles no difference', () => { - const duration1 = calculateDuration(0, 0); - const duration2 = calculateDuration(dayInMs, dayInMs); - expect(duration1).toBe(0); - expect(duration2).toBe(0); - }); - }); -}); diff --git a/packages/utils/src/rundown-utils/rundownUtils.ts b/packages/utils/src/rundown-utils/rundownUtils.ts index 685a8ddf9..dbf75ad25 100644 --- a/packages/utils/src/rundown-utils/rundownUtils.ts +++ b/packages/utils/src/rundown-utils/rundownUtils.ts @@ -1,7 +1,5 @@ import { isOntimeEvent, OntimeEvent, OntimeRundown, OntimeRundownEntry } from 'ontime-types'; -import { dayInMs } from '../timeConstants.js'; - /** * Gets first event in rundown, if it exists * @param {OntimeRundownEntry[]} rundown @@ -113,20 +111,6 @@ export function getPreviousEvent(rundown: OntimeRundownEntry[], currentId: strin return null; } -/** - * @description calculates event duration considering midnight - * @param {number} timeStart - * @param {number} timeEnd - * @returns {number} - */ -export const calculateDuration = (timeStart: number, timeEnd: number): number => { - // Durations must be positive - if (timeEnd < timeStart) { - return timeEnd + dayInMs - timeStart; - } - return timeEnd - timeStart; -}; - /** * @description swaps two OntimeEvents in the rundown * @param {OntimeRundown} rundown diff --git a/packages/utils/src/validate-events/validateEvent.test.ts b/packages/utils/src/validate-events/validateEvent.test.ts new file mode 100644 index 000000000..76eca2c99 --- /dev/null +++ b/packages/utils/src/validate-events/validateEvent.test.ts @@ -0,0 +1,118 @@ +import { EndAction, TimerType } from 'ontime-types'; +import { expect } from 'vitest'; + +import { dayInMs } from '../timeConstants.js'; +import { calculateDuration, validateEndAction, validateTimerType, validateTimes } from './validateEvent.js'; + +describe('validateEndAction()', () => { + it('recognises a string representation of an action', () => { + const endAction = validateEndAction('load-next'); + expect(endAction).toBe(EndAction.LoadNext); + }); + it('returns fallback otherwise', () => { + const emptyAction = validateEndAction('', EndAction.Stop); + const invalidAction = validateEndAction('this-does-not-exist', EndAction.PlayNext); + expect(emptyAction).toBe(EndAction.Stop); + expect(invalidAction).toBe(EndAction.PlayNext); + }); +}); + +describe('validateTimerType()', () => { + it('recognises a string representation of an action', () => { + const timerType = validateTimerType('time-to-end'); + expect(timerType).toBe(TimerType.TimeToEnd); + }); + it('returns fallback otherwise', () => { + const emptyType = validateTimerType('', TimerType.Clock); + const invalidType = validateTimerType('this-does-not-exist', TimerType.CountDown); + expect(emptyType).toBe(TimerType.Clock); + expect(invalidType).toBe(TimerType.CountDown); + }); +}); + +describe('validateTimes()', () => { + it('passes through a well defined time list', () => { + const { timeStart, timeEnd, duration } = validateTimes(5, 10, 5); + expect(timeStart).toBe(5); + expect(timeEnd).toBe(10); + expect(duration).toBe(5); + }); + + it('handles cases when no times are given', () => { + const { timeStart, timeEnd, duration } = validateTimes(null, undefined, null); + expect(timeStart).toBe(0); + expect(timeEnd).toBe(0); + expect(duration).toBe(0); + }); + + it('calculates duration', () => { + const { timeStart, timeEnd, duration } = validateTimes(5, 10); + expect(timeStart).toBe(5); + expect(timeEnd).toBe(10); + expect(duration).toBe(5); + }); + + it('calculates end time', () => { + const { timeStart, timeEnd, duration } = validateTimes(5, undefined, 10); + expect(timeStart).toBe(5); + expect(timeEnd).toBe(15); + expect(duration).toBe(10); + }); + + it('handles events that finish the day after', () => { + const { timeStart, timeEnd, duration } = validateTimes(100, 10); + expect(timeStart).toBe(100); + expect(timeEnd).toBe(10); + expect(duration).toBe(dayInMs - 90); + }); + + it('corrects time in case of conflicts', () => { + const { timeStart, timeEnd, duration } = validateTimes(5, 15, 15); + expect(timeStart).toBe(5); + expect(timeEnd).toBe(15); + expect(duration).toBe(10); + }); + + it('calculates start time', () => { + const { timeStart, timeEnd, duration } = validateTimes(undefined, 15, 10); + expect(timeStart).toBe(5); + expect(timeEnd).toBe(15); + expect(duration).toBe(10); + }); + + it('calculates start and end time', () => { + const { timeStart, timeEnd, duration } = validateTimes(undefined, undefined, 10); + expect(timeStart).toBe(0); + expect(timeEnd).toBe(10); + expect(duration).toBe(10); + }); + + it('ensures values are integers', () => { + const { timeStart, timeEnd, duration } = validateTimes(0.000001, 10.312335342, 10); + expect(timeStart).toBe(0); + expect(timeEnd).toBe(10); + expect(duration).toBe(10); + }); +}); + +describe('calculateDuration()', () => { + describe('Given start and end values', () => { + it('is the difference between end and start', () => { + const duration = calculateDuration(10, 20); + expect(duration).toBe(10); + }); + }); + + describe('Handles edge cases', () => { + it('handles events that go over midnight', () => { + const duration = calculateDuration(51, 50); + expect(duration).toBe(dayInMs - 1); + }); + it('handles no difference', () => { + const duration1 = calculateDuration(0, 0); + const duration2 = calculateDuration(dayInMs, dayInMs); + expect(duration1).toBe(0); + expect(duration2).toBe(0); + }); + }); +}); diff --git a/packages/utils/src/validate-events/validateEvent.ts b/packages/utils/src/validate-events/validateEvent.ts new file mode 100644 index 000000000..4bae03016 --- /dev/null +++ b/packages/utils/src/validate-events/validateEvent.ts @@ -0,0 +1,85 @@ +import { EndAction, TimerType } from 'ontime-types'; + +import { dayInMs } from '../timeConstants.js'; + +/** + * Checks if given value is a valid type of EndAction, returns the fallback otherwise + * @param {EndAction} maybeAction + * @param {EndAction} [fallback] + */ +export function validateEndAction(maybeAction: unknown, fallback = EndAction.None) { + return Object.values(EndAction).includes(maybeAction as any) ? (maybeAction as EndAction) : fallback; +} + +/** + * Checks if given value is a valid type of TimerType, returns the fallback otherwise + * @param {TimerType} maybeTimerType + * @param {TimerType} [fallback] + */ +export function validateTimerType(maybeTimerType: unknown, fallback = TimerType.CountDown) { + return Object.values(TimerType).includes(maybeTimerType as any) ? (maybeTimerType as TimerType) : fallback; +} + +/** + * @description calculates event duration considering midnight + * @param {number} timeStart + * @param {number} timeEnd + * @returns {number} + */ +export const calculateDuration = (timeStart: number, timeEnd: number): number => { + // Durations must be positive + if (timeEnd < timeStart) { + return timeEnd + dayInMs - timeStart; + } + return timeEnd - timeStart; +}; + +/** + * Converts a given value to an int, returns 0 otherwise + * @param value + * number + */ +function convertToInteger(value: unknown): number { + const result = Number(value); + return isNaN(result) ? 0 : Math.floor(result); +} + +/** + * Ensures the time input variables are valid in relationship to each other + * Infers values if necessary + * @param _start + * @param _end + * @param _duration + */ +export function validateTimes(_start?: unknown, _end?: unknown, _duration?: unknown) { + const timeStart = convertToInteger(_start); + const timeEnd = convertToInteger(_end); + const duration = convertToInteger(_duration); + + if (_start != null && _end != null) { + // Case 1. if we have start and end, duration must be derived + return { timeStart, duration: calculateDuration(timeStart, timeEnd), timeEnd }; + } + + if (_start == null && _end == null) { + if (_duration == null) { + // Case 2. no valid times were given + return { timeStart, duration, timeEnd }; + } + // Case 3. we have a duration and infer the rest + return { timeStart, duration, timeEnd: duration }; + } + + if (_start != null) { + // Case 5. with only start, we can calculate the rest + return { timeStart, duration, timeEnd: timeStart + duration }; + } + + if (_end != null) { + // Case 6. with only end, we can calculate the rest + return { timeStart: timeEnd - duration, duration, timeEnd }; + } + + // we should have covered all cases + return { timeStart, duration, timeEnd }; +} From a7980ef2ab52107ac36d8a521954f71bb8010d34 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sat, 11 Nov 2023 14:42:06 +0100 Subject: [PATCH 11/23] fix: github workflow (#585) * fix: github workflow * chore: update lockfile --- .github/workflows/build_docker_v2.yml | 10 +-- .github/workflows/build_v2.yml | 2 +- .github/workflows/test_v2.yml | 6 +- pnpm-lock.yaml | 118 +++++++------------------- 4 files changed, 42 insertions(+), 94 deletions(-) diff --git a/.github/workflows/build_docker_v2.yml b/.github/workflows/build_docker_v2.yml index 82fb06a3c..838992a66 100644 --- a/.github/workflows/build_docker_v2.yml +++ b/.github/workflows/build_docker_v2.yml @@ -16,17 +16,17 @@ jobs: - uses: actions/checkout@v3 - name: Setup env run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - + - name: Setup Node.js environment uses: actions/setup-node@v3.6.0 with: version: 16.16.0 - + - name: Setup pnpm - - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v2 with: version: 8 - + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -34,7 +34,7 @@ jobs: env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} run: pnpm turbo build:docker - + - name: Docker Login uses: docker/login-action@v2.1.0 with: diff --git a/.github/workflows/build_v2.yml b/.github/workflows/build_v2.yml index 9caba85ad..6ef489c12 100644 --- a/.github/workflows/build_v2.yml +++ b/.github/workflows/build_v2.yml @@ -17,7 +17,7 @@ jobs: node-version: 16 - name: Setup pnpm - - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v2 with: version: 8 diff --git a/.github/workflows/test_v2.yml b/.github/workflows/test_v2.yml index 552d17b8c..28bba9ae3 100644 --- a/.github/workflows/test_v2.yml +++ b/.github/workflows/test_v2.yml @@ -20,7 +20,7 @@ jobs: node-version: 16 - name: Setup pnpm - - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v2 with: version: 8 @@ -69,9 +69,9 @@ jobs: node-version: 16 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5665a280..900234358 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -277,8 +277,8 @@ importers: specifier: ^9.0.2 version: 9.0.2 node-xlsx: - specifier: ^0.21.0 - version: 0.21.0 + specifier: ^0.23.0 + version: 0.23.0 ontime-utils: specifier: workspace:* version: link:../../packages/utils @@ -361,6 +361,9 @@ importers: packages/utils: dependencies: + deepmerge-ts: + specifier: ^5.1.0 + version: 5.1.0 luxon: specifier: ^3.3.0 version: 3.3.0 @@ -1866,6 +1869,7 @@ packages: /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true dev: false optional: true @@ -2920,6 +2924,7 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + requiresBuild: true dev: true optional: true @@ -3418,20 +3423,6 @@ packages: hasBin: true dev: true - /adler-32@1.2.0: - resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==} - engines: {node: '>=0.8'} - hasBin: true - dependencies: - exit-on-epipe: 1.0.1 - printj: 1.1.2 - dev: false - - /adler-32@1.3.1: - resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} - engines: {node: '>=0.8'} - dev: false - /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3723,6 +3714,7 @@ packages: /boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + requiresBuild: true dev: true optional: true @@ -3881,14 +3873,6 @@ packages: resolution: {integrity: sha512-ecER9xgJQVMqcrxThKptsW0pPxSae8R2RB87LNa+ivW9ppNWRHEplXcDzkCOP4LYWGj8hunXLqaiC41iBATNyg==} dev: true - /cfb@1.2.2: - resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} - engines: {node: '>=0.8'} - dependencies: - adler-32: 1.3.1 - crc-32: 1.2.2 - dev: false - /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -3984,11 +3968,6 @@ packages: mimic-response: 1.0.1 dev: true - /codepage@1.15.0: - resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} - engines: {node: '>=0.8'} - dev: false - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -4154,12 +4133,6 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false - /crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} requiresBuild: true @@ -4319,6 +4292,11 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} + dev: false + /deepmerge@4.3.0: resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} engines: {node: '>=0.10.0'} @@ -4365,6 +4343,7 @@ packages: /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + requiresBuild: true dev: true optional: true @@ -4656,6 +4635,7 @@ packages: /es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + requiresBuild: true dev: true optional: true @@ -4974,11 +4954,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /exit-on-epipe@1.0.1: - resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==} - engines: {node: '>=0.8'} - dev: false - /expect@29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5216,11 +5191,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /frac@1.1.2: - resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} - engines: {node: '>=0.8'} - dev: false - /framer-motion@10.11.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IrwuC9regNOU99JoM/Z62CAMA3awGV6AcF7e3bcgXk/ZoNlGSt5aVq0J7UAwtLmCkwVlRvBkiMnvv2mZ1GW2pg==} peerDependencies: @@ -6023,6 +5993,7 @@ packages: /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + requiresBuild: true dev: true optional: true @@ -6182,6 +6153,7 @@ packages: /matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} + requiresBuild: true dependencies: escape-string-regexp: 4.0.0 dev: true @@ -6401,12 +6373,12 @@ packages: resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} dev: true - /node-xlsx@0.21.0: - resolution: {integrity: sha512-MB+KcNCuRzwjgr17scpKiVTPd4Vbj3V+7QwKpqACGyJzhvC67xCQUbw2vYEIKtNfMfcLxgB2q2kEuRS8rmak9g==} + /node-xlsx@0.23.0: + resolution: {integrity: sha512-r3KaSZSsSrK92rbPXnX/vDdxURmPPik0rjJ3A+Pybzpjyrk4G6WyGfj8JIz5dMMEpCmWVpmO4qoVPBxnpLv/8Q==} engines: {node: '>=10.0.0'} hasBin: true dependencies: - xlsx: 0.17.5 + xlsx: '@cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz' dev: false /nodemon@2.0.20: @@ -6762,12 +6734,6 @@ packages: react-is: 18.2.0 dev: true - /printj@1.1.2: - resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false @@ -7155,6 +7121,7 @@ packages: /roarr@2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + requiresBuild: true dependencies: boolean: 3.2.0 detect-node: 2.1.0 @@ -7232,6 +7199,7 @@ packages: /semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + requiresBuild: true dev: true optional: true @@ -7282,6 +7250,7 @@ packages: /serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} + requiresBuild: true dependencies: type-fest: 0.13.1 dev: true @@ -7406,16 +7375,10 @@ packages: /sprintf-js@1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + requiresBuild: true dev: true optional: true - /ssf@0.11.2: - resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} - engines: {node: '>=0.8'} - dependencies: - frac: 1.1.2 - dev: false - /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -7841,6 +7804,7 @@ packages: /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} + requiresBuild: true dev: true optional: true @@ -8456,21 +8420,11 @@ packages: stackback: 0.0.2 dev: true - /wmf@1.0.2: - resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} - engines: {node: '>=0.8'} - dev: false - /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /word@0.3.0: - resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} - engines: {node: '>=0.8'} - dev: false - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8510,20 +8464,6 @@ packages: optional: true dev: false - /xlsx@0.17.5: - resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==} - engines: {node: '>=0.8'} - hasBin: true - dependencies: - adler-32: 1.2.0 - cfb: 1.2.2 - codepage: 1.15.0 - crc-32: 1.2.2 - ssf: 0.11.2 - wmf: 1.0.2 - word: 0.3.0 - dev: false - /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -8616,3 +8556,11 @@ packages: react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false + + '@cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz': + resolution: {tarball: https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz} + name: xlsx + version: 0.19.3 + engines: {node: '>=0.8'} + hasBin: true + dev: false From 9da76134507826eabacf9782a4e04d7e9ec0105a Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sat, 11 Nov 2023 14:58:46 +0100 Subject: [PATCH 12/23] ci: close issues without user activity (#586) * ci: close issues without user activity --- .github/workflows/close_stale.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/close_stale.yml diff --git a/.github/workflows/close_stale.yml b/.github/workflows/close_stale.yml new file mode 100644 index 000000000..8ebf67c00 --- /dev/null +++ b/.github/workflows/close_stale.yml @@ -0,0 +1,22 @@ +name: Close inactive issues +on: + schedule: + - cron: "30 1 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: actions/stale@v8 + with: + days-before-stale: 30 + days-before-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: -1 + days-before-pr-close: -1 + exempt-all-assignees: true + repo-token: ${{ secrets.GITHUB_TOKEN }} From cbed3e4fe45e185acb785c7283fd4153d510ba50 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sun, 12 Nov 2023 21:41:55 +0100 Subject: [PATCH 13/23] ci: remove stale bot (#587) --- .github/workflows/close_stale.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/close_stale.yml diff --git a/.github/workflows/close_stale.yml b/.github/workflows/close_stale.yml deleted file mode 100644 index 8ebf67c00..000000000 --- a/.github/workflows/close_stale.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Close inactive issues -on: - schedule: - - cron: "30 1 * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - permissions: - issues: write - steps: - - uses: actions/stale@v8 - with: - days-before-stale: 30 - days-before-close: 14 - stale-issue-label: "stale" - stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." - days-before-pr-stale: -1 - days-before-pr-close: -1 - exempt-all-assignees: true - repo-token: ${{ secrets.GITHUB_TOKEN }} From 140daef7e793996cd85a525e6e123151ffcfbe0f Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Mon, 13 Nov 2023 22:03:17 +0100 Subject: [PATCH 14/23] add eventsPerPage to schedule (#583) * add eventsPerPage to schedule --------- Co-authored-by: arc-alex --- .../common/components/schedule/ScheduleContext.tsx | 3 +-- .../components/view-params-editor/constants.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/client/src/common/components/schedule/ScheduleContext.tsx b/apps/client/src/common/components/schedule/ScheduleContext.tsx index 0f4d84d2e..40497ee43 100644 --- a/apps/client/src/common/components/schedule/ScheduleContext.tsx +++ b/apps/client/src/common/components/schedule/ScheduleContext.tsx @@ -21,7 +21,6 @@ interface ScheduleProviderProps { events: OntimeEvent[]; selectedEventId: string | null; isBackstage?: boolean; - eventsPerPage?: number; time?: number; } @@ -30,7 +29,6 @@ export const ScheduleProvider = ({ events, selectedEventId, isBackstage = false, - eventsPerPage = 7, time = 10, }: PropsWithChildren) => { const [visiblePage, setVisiblePage] = useState(0); @@ -39,6 +37,7 @@ export const ScheduleProvider = ({ // look for overrides from views const hidePast = isStringBoolean(searchParams.get('hidePast')); const stopCycle = isStringBoolean(searchParams.get('stopCycle')); + const eventsPerPage = Number(searchParams.get('eventsPerPage') ?? 7); let selectedEventIndex = events.findIndex((event) => event.id === selectedEventId); diff --git a/apps/client/src/common/components/view-params-editor/constants.ts b/apps/client/src/common/components/view-params-editor/constants.ts index da9546ace..3021edb6e 100644 --- a/apps/client/src/common/components/view-params-editor/constants.ts +++ b/apps/client/src/common/components/view-params-editor/constants.ts @@ -208,6 +208,12 @@ export const BACKSTAGE_OPTIONS: ParamField[] = [ description: 'Schedule will not auto-cycle through events', type: 'boolean', }, + { + id: 'eventsPerPage', + title: 'Events per page', + description: 'Sets the number of events on the page, can cause overlow', + type: 'number', + }, ]; export const PUBLIC_OPTIONS: ParamField[] = [ @@ -224,6 +230,12 @@ export const PUBLIC_OPTIONS: ParamField[] = [ description: 'Schedule will not auto-cycle through events', type: 'boolean', }, + { + id: 'eventsPerPage', + title: 'Events per page', + description: 'Sets the number of events on the page, can cause overlow', + type: 'number', + }, ]; export const STUDIO_CLOCK_OPTIONS: ParamField[] = [ TIME_FORMAT_OPTION, From a41fe8806b1edb5bfab61b9b19789439c943fd70 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Mon, 13 Nov 2023 22:04:55 +0100 Subject: [PATCH 15/23] configure lint staged (#588) * chore: upgrade monorepo deps * chore: configure lint-staged * refactor: lenient use of any --- .eslintrc | 2 + .github/workflows/test_v2.yml | 7 + .husky/pre-commit | 4 + apps/client/package.json | 17 +- .../src/common/hooks/useElectronEvent.ts | 2 +- apps/client/src/common/utils/socket.ts | 2 +- .../modals/settings-modal/ModalPinInput.tsx | 6 +- .../event-block/composite/BlockActionMenu.tsx | 2 +- apps/electron/.eslintrc | 5 +- apps/electron/package.json | 6 +- apps/server/.eslintrc | 3 + apps/server/package.json | 12 +- apps/server/src/adapters/websocketAux.ts | 2 +- .../services/__tests__/RestoreService.test.ts | 1 + apps/server/src/utils/parserUtils.ts | 6 +- package.json | 29 +- packages/types/package.json | 10 +- packages/utils/package.json | 14 +- packages/utils/src/types/types.ts | 2 +- .../src/validate-events/validateEvent.ts | 4 +- pnpm-lock.yaml | 1458 +++++++++++------ turbo.json | 27 +- 22 files changed, 1107 insertions(+), 514 deletions(-) create mode 100755 .husky/pre-commit diff --git a/.eslintrc b/.eslintrc index 7c82b809e..23d1da5c3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,5 @@ { + "root": true, "parserOptions": { "ecmaVersion": 2020 }, @@ -41,6 +42,7 @@ } ], "@typescript-eslint/no-non-null-assertion": "warn", + "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": [ "error", { diff --git a/.github/workflows/test_v2.yml b/.github/workflows/test_v2.yml index 28bba9ae3..e3a70a76b 100644 --- a/.github/workflows/test_v2.yml +++ b/.github/workflows/test_v2.yml @@ -29,31 +29,38 @@ jobs: # Run code quality per package - name: React - Run linter + if: always() run: pnpm lint working-directory: ./apps/client - name: Server - Run linter + if: always() run: pnpm lint working-directory: ./apps/server - name: Utils - Run linter + if: always() run: pnpm lint working-directory: ./packages/utils - name: Types - Run linter + if: always() run: pnpm lint working-directory: ./packages/types # We choose to run tests separately - name: React - Run unit tests + if: always() run: pnpm test:pipeline working-directory: ./apps/client - name: Server - Run unit tests + if: always() run: pnpm test:pipeline working-directory: ./apps/server - name: Utils - Run unit tests + if: always() run: pnpm test:pipeline working-directory: ./packages/utils diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..58993aaee --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm lint diff --git a/apps/client/package.json b/apps/client/package.json index 66aa90bbd..ce25a1ece 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -63,17 +63,16 @@ "@testing-library/react": "^13.1.1", "@testing-library/user-event": "^14.1.1", "@types/color": "^3.0.3", - "@types/luxon": "^3.2.0", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", "@types/testing-library__jest-dom": "^5.14.5", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "@vitejs/plugin-react": "^3.0.1", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.6.0", - "eslint-plugin-jest": "^27.1.7", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.32.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-simple-import-sort": "^8.0.0", @@ -81,9 +80,9 @@ "jsdom": "^21.1.0", "ontime-types": "workspace:*", "ontime-utils": "workspace:*", - "prettier": "^2.8.3", + "prettier": "^3.0.3", "sass": "^1.57.1", - "typescript": "^4.9.4", + "typescript": "^5.2.2", "vite": "^4.3.1", "vite-plugin-compression2": "^0.9.0", "vite-plugin-svgr": "^2.4.0", diff --git a/apps/client/src/common/hooks/useElectronEvent.ts b/apps/client/src/common/hooks/useElectronEvent.ts index 065d1fa6a..4d25bf08f 100644 --- a/apps/client/src/common/hooks/useElectronEvent.ts +++ b/apps/client/src/common/hooks/useElectronEvent.ts @@ -1,7 +1,7 @@ export default function useElectronEvent() { const isElectron = window?.process?.type === 'renderer'; - const sendToElectron = (channel: string, args?: string | Record) => { + const sendToElectron = (channel: string, args?: string | Record) => { if (isElectron) { window?.ipcRenderer.send(channel, args); } diff --git a/apps/client/src/common/utils/socket.ts b/apps/client/src/common/utils/socket.ts index 58cb68c84..e5aab2315 100644 --- a/apps/client/src/common/utils/socket.ts +++ b/apps/client/src/common/utils/socket.ts @@ -129,7 +129,7 @@ export const socketSend = (message: any) => { } }; -export const socketSendJson = (type: string, payload?: any) => { +export const socketSendJson = (type: string, payload?: unknown) => { socketSend( JSON.stringify({ type, diff --git a/apps/client/src/features/modals/settings-modal/ModalPinInput.tsx b/apps/client/src/features/modals/settings-modal/ModalPinInput.tsx index a1b960c75..c3152a246 100644 --- a/apps/client/src/features/modals/settings-modal/ModalPinInput.tsx +++ b/apps/client/src/features/modals/settings-modal/ModalPinInput.tsx @@ -3,8 +3,12 @@ import { UseFormRegister } from 'react-hook-form'; import { IconButton, Input, InputGroup, InputRightElement } from '@chakra-ui/react'; import { IoEyeOutline } from '@react-icons/all-files/io5/IoEyeOutline'; +interface FormInput { + [key: string]: string; +} + interface ModalPinInputProps { - register: UseFormRegister; + register: UseFormRegister; formName: string; isDisabled?: boolean; } diff --git a/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx b/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx index 4f0b2470e..c5ecc0f69 100644 --- a/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx +++ b/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx @@ -13,7 +13,7 @@ import { EventItemActions } from '../../RundownEntry'; interface BlockActionMenuProps { enableDelete?: boolean; showClone?: boolean; - actionHandler: (action: EventItemActions, payload?: any) => void; + actionHandler: (action: EventItemActions, payload?: unknown) => void; className?: string; } diff --git a/apps/electron/.eslintrc b/apps/electron/.eslintrc index e061d33fa..192099671 100644 --- a/apps/electron/.eslintrc +++ b/apps/electron/.eslintrc @@ -3,11 +3,14 @@ "sourceType": "module" }, "env": { + "browser": true, "node": true }, "extends": [ "eslint:recommended" ], "plugins": [], - "rules": {} + "rules": { + "@typescript-eslint/no-var-requires": "off" + } } diff --git a/apps/electron/package.json b/apps/electron/package.json index 375596c44..dcfa259da 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -14,9 +14,9 @@ "devDependencies": { "electron": "^22.3.5", "electron-builder": "^23.6.0", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.6.0", - "prettier": "^2.8.3" + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.3" }, "scripts": { "postinstall": "", diff --git a/apps/server/.eslintrc b/apps/server/.eslintrc index 9cf87cad5..ec1e6589c 100644 --- a/apps/server/.eslintrc +++ b/apps/server/.eslintrc @@ -5,5 +5,8 @@ "parserOptions": { "ecmaVersion": 2020, "sourceType": "module" + }, + "globals": { + "globalThis": false } } diff --git a/apps/server/package.json b/apps/server/package.json index 805e1db5f..df2f6575a 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -27,17 +27,17 @@ "@types/node": "^16.11.7", "@types/node-osc": "^6.0.2", "@types/websocket": "^1.0.5", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "esbuild": "^0.17.5", - "eslint": "^8.31.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^8.53.0", + "eslint-plugin-prettier": "^5.0.1", "nodemon": "^2.0.20", "ontime-types": "workspace:*", - "prettier": "^2.8.3", + "prettier": "^3.0.3", "shx": "^0.3.4", "ts-node": "^10.9.1", - "typescript": "^4.9.4", + "typescript": "^5.2.2", "vitest": "^0.30.1" }, "scripts": { diff --git a/apps/server/src/adapters/websocketAux.ts b/apps/server/src/adapters/websocketAux.ts index 432e42101..bba45180f 100644 --- a/apps/server/src/adapters/websocketAux.ts +++ b/apps/server/src/adapters/websocketAux.ts @@ -4,7 +4,7 @@ import { socket } from './WebsocketAdapter.js'; * Utility function to notify clients that the REST data is stale * @param payload -- possible patch payload */ -export function sendRefetch(payload: any | null = null) { +export function sendRefetch(payload: unknown = null) { socket.sendAsJson({ type: 'ontime-refetch', payload, diff --git a/apps/server/src/services/__tests__/RestoreService.test.ts b/apps/server/src/services/__tests__/RestoreService.test.ts index 05bb679f1..3fc207392 100644 --- a/apps/server/src/services/__tests__/RestoreService.test.ts +++ b/apps/server/src/services/__tests__/RestoreService.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { describe, expect, it, vi } from 'vitest'; import { Playback } from 'ontime-types'; diff --git a/apps/server/src/utils/parserUtils.ts b/apps/server/src/utils/parserUtils.ts index 7adf2b7f9..388f165d8 100644 --- a/apps/server/src/utils/parserUtils.ts +++ b/apps/server/src/utils/parserUtils.ts @@ -3,11 +3,11 @@ import { deepmerge } from 'ontime-utils'; /** * @description Ensures variable is string, it skips object types - * @param {any} val - variable to convert + * @param val - variable to convert * @param {string} [fallback=''] - fallback value * @returns {string} - value as string or fallback if not possible */ -export const makeString = (val: any, fallback = ''): string => { +export const makeString = (val: unknown, fallback = ''): string => { if (typeof val === 'string') return val; else if (val == null || val.constructor === Object) return fallback; return val.toString(); @@ -56,7 +56,7 @@ export const isEmptyObject = (obj: object) => { * @param {object} a - any object * @param {object} b - a potential partial object of same time as a */ -export function mergeObject>(a: T, b: Partial>): T { +export function mergeObject(a: T, b: Partial): T { const merged = { ...a }; for (const key in b) { diff --git a/package.json b/package.json index c93e6a71e..855b4d3f3 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "dev:electron": "turbo run dev --filter=ontime", "dev:server": "turbo run dev --filter=ontime-server", "lint": "turbo run lint", + "lint-staged": "turbo run lint-staged --concurrency=1", "build": "turbo run build", "build:local": "turbo run build:local", "dist-win": "turbo run dist-win", @@ -38,15 +39,27 @@ }, "devDependencies": { "@playwright/test": "^1.34.3", - "@types/node": "^18.11.18", - "@typescript-eslint/eslint-plugin": "^5.48.0", - "@typescript-eslint/parser": "^5.48.0", + "@types/node": "^16.11.7", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", "cross-env": "^7.0.3", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.6.0", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", "eslint-plugin-playwright": "^0.12.0", - "prettier": "^2.8.2", - "turbo": "^1.8.8", - "typescript": "^4.8.3" + "husky": "^8.0.3", + "lint-staged": "^15.1.0", + "prettier": "^3.0.3", + "turbo": "^1.10.16", + "typescript": "^5.2.2" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "pnpm lint" + ] } } diff --git a/packages/types/package.json b/packages/types/package.json index 3325be1cb..71f33b3d7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -7,15 +7,15 @@ "description": "shared typings for ontime", "scripts": { "cleanup": "rm -rf .turbo && rm -rf node_modules", - "lint": "eslint ." + "lint": "eslint . --quiet" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", - "eslint": "^8.31.0", - "typescript": "^4.9.4" + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^8.53.0", + "typescript": "^5.2.2" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index c11c74c9e..9ad7cc1a9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -17,15 +17,15 @@ }, "devDependencies": { "@types/luxon": "^3.2.0", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.6.0", - "eslint-plugin-prettier": "^4.2.1", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-simple-import-sort": "^8.0.0", "ontime-types": "workspace:*", - "prettier": "^2.8.3", - "typescript": "^4.9.4", + "prettier": "^3.0.3", + "typescript": "^5.2.2", "vitest": "^0.30.1" } } diff --git a/packages/utils/src/types/types.ts b/packages/utils/src/types/types.ts index 26e37fdfe..457796711 100644 --- a/packages/utils/src/types/types.ts +++ b/packages/utils/src/types/types.ts @@ -1,4 +1,4 @@ -export function isNumeric(num: any) { +export function isNumeric(num: unknown) { if (typeof num === 'number' && !isNaN(num)) { return true; } diff --git a/packages/utils/src/validate-events/validateEvent.ts b/packages/utils/src/validate-events/validateEvent.ts index 4bae03016..0f07edc66 100644 --- a/packages/utils/src/validate-events/validateEvent.ts +++ b/packages/utils/src/validate-events/validateEvent.ts @@ -8,7 +8,7 @@ import { dayInMs } from '../timeConstants.js'; * @param {EndAction} [fallback] */ export function validateEndAction(maybeAction: unknown, fallback = EndAction.None) { - return Object.values(EndAction).includes(maybeAction as any) ? (maybeAction as EndAction) : fallback; + return Object.values(EndAction).includes(maybeAction as EndAction) ? (maybeAction as EndAction) : fallback; } /** @@ -17,7 +17,7 @@ export function validateEndAction(maybeAction: unknown, fallback = EndAction.Non * @param {TimerType} [fallback] */ export function validateTimerType(maybeTimerType: unknown, fallback = TimerType.CountDown) { - return Object.values(TimerType).includes(maybeTimerType as any) ? (maybeTimerType as TimerType) : fallback; + return Object.values(TimerType).includes(maybeTimerType as TimerType) ? (maybeTimerType as TimerType) : fallback; } /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 900234358..93650ef4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,35 +12,41 @@ importers: specifier: ^1.34.3 version: 1.34.3 '@types/node': - specifier: ^18.11.18 - version: 18.11.18 + specifier: ^16.11.7 + version: 16.18.11 '@typescript-eslint/eslint-plugin': - specifier: ^5.48.0 - version: 5.48.0(@typescript-eslint/parser@5.48.0)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.48.0 - version: 5.48.0(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) cross-env: specifier: ^7.0.3 version: 7.0.3 eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@8.31.0) + specifier: ^9.0.0 + version: 9.0.0(eslint@8.53.0) eslint-plugin-playwright: specifier: ^0.12.0 - version: 0.12.0(eslint@8.31.0) + version: 0.12.0(eslint@8.53.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^15.1.0 + version: 15.1.0 prettier: - specifier: ^2.8.2 - version: 2.8.2 + specifier: ^3.0.3 + version: 3.0.3 turbo: - specifier: ^1.8.8 - version: 1.8.8 + specifier: ^1.10.16 + version: 1.10.16 typescript: - specifier: ^4.8.3 - version: 4.9.4 + specifier: ^5.2.2 + version: 5.2.2 apps/client: dependencies: @@ -143,13 +149,10 @@ importers: version: 13.4.0(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.1.1 - version: 14.4.3(@testing-library/dom@8.19.1) + version: 14.4.3(@testing-library/dom@9.3.3) '@types/color': specifier: ^3.0.3 version: 3.0.3 - '@types/luxon': - specifier: ^3.2.0 - version: 3.2.0 '@types/react': specifier: ^18.0.26 version: 18.0.26 @@ -160,38 +163,38 @@ importers: specifier: ^5.14.5 version: 5.14.5 '@typescript-eslint/eslint-plugin': - specifier: ^5.48.1 - version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.48.1 - version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) '@vitejs/plugin-react': specifier: ^3.0.1 version: 3.0.1(vite@4.3.1) eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@8.31.0) + specifier: ^9.0.0 + version: 9.0.0(eslint@8.53.0) eslint-plugin-jest: - specifier: ^27.1.7 - version: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^27.6.0 + version: 27.6.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0)(typescript@5.2.2) eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3) eslint-plugin-react: specifier: ^7.32.0 - version: 7.32.0(eslint@8.31.0) + version: 7.32.0(eslint@8.53.0) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.0(eslint@8.31.0) + version: 4.6.0(eslint@8.53.0) eslint-plugin-simple-import-sort: specifier: ^8.0.0 - version: 8.0.0(eslint@8.31.0) + version: 8.0.0(eslint@8.53.0) eslint-plugin-testing-library: specifier: ^5.9.1 - version: 5.9.1(eslint@8.31.0)(typescript@4.9.4) + version: 5.9.1(eslint@8.53.0)(typescript@5.2.2) jsdom: specifier: ^21.1.0 version: 21.1.0 @@ -202,17 +205,17 @@ importers: specifier: workspace:* version: link:../../packages/utils prettier: - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^3.0.3 + version: 3.0.3 sass: specifier: ^1.57.1 version: 1.57.1 typescript: - specifier: ^4.9.4 - version: 4.9.4 + specifier: ^5.2.2 + version: 5.2.2 vite: specifier: ^4.3.1 - version: 4.3.1(@types/node@18.11.18)(sass@1.57.1) + version: 4.3.1(@types/node@16.18.11)(sass@1.57.1) vite-plugin-compression2: specifier: ^0.9.0 version: 0.9.0 @@ -221,7 +224,7 @@ importers: version: 2.4.0(vite@4.3.1) vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.2.0(typescript@4.9.4)(vite@4.3.1) + version: 4.2.0(typescript@5.2.2)(vite@4.3.1) vitest: specifier: ^0.30.1 version: 0.30.1(jsdom@21.1.0)(sass@1.57.1) @@ -235,14 +238,14 @@ importers: specifier: ^23.6.0 version: 23.6.0 eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@8.31.0) + specifier: ^9.0.0 + version: 9.0.0(eslint@8.53.0) prettier: - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^3.0.3 + version: 3.0.3 apps/server: dependencies: @@ -308,20 +311,20 @@ importers: specifier: ^1.0.5 version: 1.0.5 '@typescript-eslint/eslint-plugin': - specifier: ^5.48.1 - version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.48.1 - version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) esbuild: specifier: ^0.17.5 version: 0.17.5 eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3) nodemon: specifier: ^2.0.20 version: 2.0.20 @@ -329,17 +332,17 @@ importers: specifier: workspace:* version: link:../../packages/types prettier: - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^3.0.3 + version: 3.0.3 shx: specifier: ^0.3.4 version: 0.3.4 ts-node: specifier: ^10.9.1 - version: 10.9.1(@types/node@16.18.11)(typescript@4.9.4) + version: 10.9.1(@types/node@16.18.11)(typescript@5.2.2) typescript: - specifier: ^4.9.4 - version: 4.9.4 + specifier: ^5.2.2 + version: 5.2.2 vitest: specifier: ^0.30.1 version: 0.30.1 @@ -347,17 +350,17 @@ importers: packages/types: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^5.48.1 - version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.48.1 - version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 typescript: - specifier: ^4.9.4 - version: 4.9.4 + specifier: ^5.2.2 + version: 5.2.2 packages/utils: dependencies: @@ -375,32 +378,32 @@ importers: specifier: ^3.2.0 version: 3.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^5.48.1 - version: 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.48.1 - version: 5.48.1(eslint@8.31.0)(typescript@4.9.4) + specifier: ^6.10.0 + version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) eslint: - specifier: ^8.31.0 - version: 8.31.0 + specifier: ^8.53.0 + version: 8.53.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@8.31.0) + specifier: ^9.0.0 + version: 9.0.0(eslint@8.53.0) eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3) + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3) eslint-plugin-simple-import-sort: specifier: ^8.0.0 - version: 8.0.0(eslint@8.31.0) + version: 8.0.0(eslint@8.53.0) ontime-types: specifier: workspace:* version: link:../types prettier: - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^3.0.3 + version: 3.0.3 typescript: - specifier: ^4.9.4 - version: 4.9.4 + specifier: ^5.2.2 + version: 5.2.2 vitest: specifier: ^0.30.1 version: 0.30.1 @@ -411,6 +414,11 @@ packages: resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} dev: true + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@adobe/css-tools@4.0.2: resolution: {integrity: sha512-Fx6tYjk2wKUgLi8uMANZr8GNZx05u44ArIJldn9VxLvolzlJVgHbTUCbwhMd6bcYky178+WUSxPHO3DAtGLWpw==} dev: true @@ -429,6 +437,14 @@ packages: dependencies: '@babel/highlight': 7.18.6 + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + /@babel/compat-data@7.20.10: resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} engines: {node: '>=6.9.0'} @@ -452,7 +468,7 @@ packages: debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -477,7 +493,7 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/helper-environment-visitor@7.18.9: @@ -549,6 +565,11 @@ packages: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} @@ -573,6 +594,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.20.7: resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} engines: {node: '>=6.0.0'} @@ -622,6 +652,13 @@ packages: regenerator-runtime: 0.13.11 dev: false + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} @@ -1800,7 +1837,7 @@ packages: fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 - semver: 6.3.0 + semver: 6.3.1 sumchecker: 3.0.1 optionalDependencies: global-agent: 3.0.0 @@ -2151,14 +2188,29 @@ packages: dev: true optional: true - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.53.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.1 - globals: 13.19.0 + espree: 9.6.1 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2168,11 +2220,16 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@eslint/js@8.53.0: + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -2184,8 +2241,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@jest/expect-utils@29.3.1: @@ -2209,7 +2266,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.16.16 + '@types/node': 16.18.23 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true @@ -2299,12 +2356,24 @@ packages: fastq: 1.15.0 dev: true + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + /@playwright/test@1.34.3: resolution: {integrity: sha512-zPLef6w9P6T/iT6XDYG3mvGOqOyb6eHaV9XtkunYs0+OzxBtrPAAaHotc0X+PJ00WPPnLfFBTl7mf45Mn8DBmw==} engines: {node: '>=14'} hasBin: true dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 playwright-core: 1.34.3 optionalDependencies: fsevents: 2.3.2 @@ -2714,6 +2783,20 @@ packages: pretty-format: 27.5.1 dev: true + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/runtime': 7.23.2 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/jest-dom@5.16.5: resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} @@ -2743,13 +2826,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.4.3(@testing-library/dom@8.19.1): + /@testing-library/user-event@14.4.3(@testing-library/dom@9.3.3): resolution: {integrity: sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 8.19.1 + '@testing-library/dom': 9.3.3 dev: true /@tootallnate/once@2.0.0: @@ -2777,11 +2860,15 @@ packages: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: true + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/cacheable-request@6.0.3: @@ -2789,7 +2876,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.16.16 + '@types/node': 16.18.23 '@types/responselike': 1.0.0 dev: true @@ -2822,7 +2909,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/debug@4.1.7: @@ -2838,7 +2925,7 @@ packages: /@types/express-serve-static-core@4.17.33: resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -2855,7 +2942,7 @@ packages: /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/glob@7.2.0: @@ -2863,7 +2950,7 @@ packages: requiresBuild: true dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true optional: true @@ -2894,14 +2981,14 @@ packages: pretty-format: 29.3.1 dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/lodash.mergewith@4.6.7: @@ -2935,7 +3022,7 @@ packages: /@types/node-osc@6.0.2: resolution: {integrity: sha512-/TxCH+NlDoI3hFA6b2O91dpnPAqBDkLb2HEIv5hMVdKnCiWTdJJv2sVnQdX38sBgnals8TjCQEGii+OcMVf2fg==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/node@16.18.11: @@ -2946,18 +3033,10 @@ packages: resolution: {integrity: sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==} dev: true - /@types/node@18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} - dev: true - /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} dev: true - /@types/node@18.16.16: - resolution: {integrity: sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==} - dev: true - /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} @@ -2965,7 +3044,7 @@ packages: resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} requiresBuild: true dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 xmlbuilder: 15.1.1 dev: true optional: true @@ -2997,21 +3076,21 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/semver@7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + /@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: true /@types/serve-static@1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true /@types/stack-utils@2.0.1: @@ -3033,7 +3112,7 @@ packages: /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 16.18.23 dev: true /@types/yargs-parser@21.0.0: @@ -3046,116 +3125,64 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@types/yauzl@2.10.0: - resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 18.16.16 + '@types/node': 16.18.23 dev: true optional: true - /@typescript-eslint/eslint-plugin@5.48.0(@typescript-eslint/parser@5.48.0)(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.0(eslint@8.31.0)(typescript@4.9.4) - '@typescript-eslint/scope-manager': 5.48.0 - '@typescript-eslint/type-utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) - '@typescript-eslint/utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 - eslint: 8.31.0 + eslint: 8.53.0 + graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.1(eslint@8.31.0)(typescript@4.9.4) - '@typescript-eslint/scope-manager': 5.48.1 - '@typescript-eslint/type-utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) - '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 - eslint: 8.31.0 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 + eslint: 8.53.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.48.0(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.48.0 - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) - debug: 4.3.4 - eslint: 8.31.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.48.1(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.48.1 - '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) - debug: 4.3.4 - eslint: 8.31.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.48.0: - resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/visitor-keys': 5.48.0 - dev: true - /@typescript-eslint/scope-manager@5.48.1: resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3164,78 +3191,58 @@ packages: '@typescript-eslint/visitor-keys': 5.48.1 dev: true - /@typescript-eslint/type-utils@5.48.0(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 + dev: true + + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) - '@typescript-eslint/utils': 5.48.0(eslint@8.31.0)(typescript@4.9.4) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.31.0 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 + eslint: 8.53.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.48.1(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) - '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) - debug: 4.3.4 - eslint: 8.31.0 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.48.0: - resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@5.48.1: resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.48.0(typescript@4.9.4): - resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/visitor-keys': 5.48.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color dev: true - /@typescript-eslint/typescript-estree@5.48.1(typescript@4.9.4): + /@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.48.1(typescript@5.2.2): resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3249,59 +3256,112 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.4) - typescript: 4.9.4 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.48.0(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.48.0 - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/typescript-estree': 5.48.0(typescript@4.9.4) - eslint: 8.31.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.31.0) - semver: 7.3.8 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color - - typescript dev: true - /@typescript-eslint/utils@5.48.1(eslint@8.31.0)(typescript@4.9.4): + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.48.1(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 5.48.1 '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/typescript-estree': 5.48.1(typescript@4.9.4) - eslint: 8.31.0 + '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.2.2) + eslint: 8.53.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.31.0) - semver: 7.3.8 + eslint-utils: 3.0.0(eslint@8.53.0) + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.48.0: - resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} + /@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/types': 5.48.0 - eslint-visitor-keys: 3.3.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + eslint: 8.53.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + eslint: 8.53.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript dev: true /@typescript-eslint/visitor-keys@5.48.1: @@ -3309,7 +3369,27 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.48.1 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.10.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true /@vitejs/plugin-react@3.0.1(vite@4.3.1): @@ -3323,7 +3403,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.20.12) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) + vite: 4.3.1(@types/node@16.18.11)(sass@1.57.1) transitivePeerDependencies: - supports-color dev: true @@ -3398,12 +3478,12 @@ packages: acorn-walk: 8.2.0 dev: true - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.11.2 dev: true /acorn-walk@8.2.0: @@ -3411,6 +3491,12 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} @@ -3449,11 +3535,23 @@ packages: uri-js: 4.4.1 dev: true + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -3472,6 +3570,11 @@ packages: engines: {node: '>=10'} dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3511,7 +3614,7 @@ packages: minimatch: 3.1.2 read-config-file: 6.2.0 sanitize-filename: 1.6.3 - semver: 7.3.8 + semver: 7.5.4 tar: 6.1.13 temp-file: 3.4.0 transitivePeerDependencies: @@ -3534,7 +3637,7 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: - tslib: 2.5.3 + tslib: 2.6.2 dev: false /aria-query@5.1.3: @@ -3669,6 +3772,11 @@ packages: requiresBuild: true dev: true + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -3718,6 +3826,13 @@ packages: dev: true optional: true + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -3819,6 +3934,13 @@ packages: - supports-color dev: true + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -3910,6 +4032,11 @@ packages: supports-color: 7.2.0 dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -3926,7 +4053,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@2.0.0: @@ -3943,6 +4070,13 @@ packages: engines: {node: '>=8'} dev: true + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -3953,6 +4087,14 @@ packages: dev: true optional: true + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4004,6 +4146,10 @@ packages: color-string: 1.9.1 dev: false + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} @@ -4015,6 +4161,11 @@ packages: dependencies: delayed-stream: 1.0.0 + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + /commander@2.9.0: resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} engines: {node: '>= 0.6.x'} @@ -4056,11 +4207,11 @@ packages: dependencies: date-time: 3.1.0 esutils: 2.0.3 - fast-diff: 1.2.0 + fast-diff: 1.3.0 js-string-escape: 1.0.1 lodash: 4.17.21 md5-hex: 3.0.1 - semver: 7.3.8 + semver: 7.5.4 well-known-symbols: 2.0.0 dev: true @@ -4302,11 +4453,34 @@ packages: engines: {node: '>=0.10.0'} dev: false + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: true + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /define-properties@1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} @@ -4425,6 +4599,10 @@ packages: resolution: {integrity: sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw==} dev: true + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -4446,6 +4624,10 @@ packages: engines: {node: '>=10'} dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -4530,6 +4712,10 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -4704,20 +4890,20 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@8.6.0(eslint@8.31.0): - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + /eslint-config-prettier@9.0.0(eslint@8.53.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.31.0 + eslint: 8.53.0 dev: true - /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.31.0)(typescript@4.9.4): - resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} + /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 eslint: ^7.0.0 || ^8.0.0 jest: '*' peerDependenciesMeta: @@ -4726,15 +4912,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.31.0)(typescript@4.9.4) - '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) - eslint: 8.31.0 + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) + eslint: 8.53.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-playwright@0.12.0(eslint@8.31.0): + /eslint-plugin-playwright@0.12.0(eslint@8.53.0): resolution: {integrity: sha512-KXuzQjVzca5irMT/7rvzJKsVDGbQr43oQPc8i+SLEBqmfrTxlwMwRqfv9vtZqh4hpU0jmrnA/EOfwtls+5QC1w==} peerDependencies: eslint: '>=7' @@ -4743,36 +4929,40 @@ packages: eslint-plugin-jest: optional: true dependencies: - eslint: 8.31.0 + eslint: 8.53.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.31.0)(prettier@2.8.3): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.28.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' eslint-config-prettier: '*' - prettier: '>=2.0.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true dependencies: - eslint: 8.31.0 - eslint-config-prettier: 8.6.0(eslint@8.31.0) - prettier: 2.8.3 + eslint: 8.53.0 + eslint-config-prettier: 9.0.0(eslint@8.53.0) + prettier: 3.0.3 prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.31.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.31.0 + eslint: 8.53.0 dev: true - /eslint-plugin-react@7.32.0(eslint@8.31.0): + /eslint-plugin-react@7.32.0(eslint@8.53.0): resolution: {integrity: sha512-vSBi1+SrPiLZCGvxpiZIa28fMEUaMjXtCplrvxcIxGzmFiYdsXQDwInEjuv5/i/2CTTxbkS87tE8lsQ0Qxinbw==} engines: {node: '>=4'} peerDependencies: @@ -4782,7 +4972,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.31.0 + eslint: 8.53.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -4796,22 +4986,22 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-simple-import-sort@8.0.0(eslint@8.31.0): + /eslint-plugin-simple-import-sort@8.0.0(eslint@8.53.0): resolution: {integrity: sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.31.0 + eslint: 8.53.0 dev: true - /eslint-plugin-testing-library@5.9.1(eslint@8.31.0)(typescript@4.9.4): + /eslint-plugin-testing-library@5.9.1(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.48.1(eslint@8.31.0)(typescript@4.9.4) - eslint: 8.31.0 + '@typescript-eslint/utils': 5.48.1(eslint@8.53.0)(typescript@5.2.2) + eslint: 8.53.0 transitivePeerDependencies: - supports-color - typescript @@ -4825,21 +5015,21 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.31.0): + /eslint-utils@3.0.0(eslint@8.53.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.31.0 + eslint: 8.53.0 eslint-visitor-keys: 2.1.0 dev: true @@ -4848,66 +5038,65 @@ packages: engines: {node: '>=10'} dev: true - /eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.31.0: - resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} + /eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.8 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.53.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0(eslint@8.31.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.19.0 - grapheme-splitter: 1.0.4 + globals: 13.23.0 + graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-sdsl: 4.2.0 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 - regexpp: 3.2.0 + optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color dev: true - /espree@9.4.1: - resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.3.0 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 dev: true /esprima@4.0.1: @@ -4916,8 +5105,8 @@ packages: hasBin: true dev: true - /esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -4954,6 +5143,55 @@ packages: engines: {node: '>= 0.6'} dev: false + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /expect@29.3.1: resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5045,7 +5283,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.0 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color dev: true @@ -5061,12 +5299,12 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5100,13 +5338,13 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.1 dev: true /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: - minimatch: 5.1.2 + minimatch: 5.1.6 dev: true /fill-range@7.0.1: @@ -5143,23 +5381,24 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.7 + flatted: 3.2.9 + keyv: 4.5.4 rimraf: 3.0.2 dev: true - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /focus-lock@0.11.6: resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} engines: {node: '>=10'} dependencies: - tslib: 2.5.3 + tslib: 2.6.2 dev: false /follow-redirects@1.15.2: @@ -5267,6 +5506,14 @@ packages: dev: true optional: true + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -5325,6 +5572,16 @@ packages: pump: 3.0.0 dev: true + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -5367,7 +5624,7 @@ packages: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.3.8 + semver: 7.5.4 serialize-error: 7.0.1 dev: true optional: true @@ -5377,8 +5634,8 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.19.0: - resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -5397,7 +5654,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -5438,8 +5695,8 @@ packages: resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} dev: true - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true /has-bigints@1.0.2: @@ -5547,6 +5804,27 @@ packages: - supports-color dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + /iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} engines: {node: ^8.11.2 || >=10} @@ -5711,6 +5989,18 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5721,6 +6011,11 @@ packages: engines: {node: '>=8'} dev: true + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -5728,6 +6023,14 @@ packages: is-extglob: 2.1.1 dev: true + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true @@ -5776,6 +6079,16 @@ packages: call-bind: 1.0.2 dev: true + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -5823,6 +6136,13 @@ packages: engines: {node: '>=12.13'} dev: false + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false @@ -5903,17 +6223,13 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.16.16 + '@types/node': 16.18.23 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true - /js-sdsl@4.2.0: - resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} - dev: true - /js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} @@ -6035,6 +6351,12 @@ packages: json-buffer: 3.0.1 dev: true + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + /lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} dev: true @@ -6055,9 +6377,45 @@ packages: type-check: 0.4.0 dev: true + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /lint-staged@15.1.0: + resolution: {integrity: sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 2.1.0 + listr2: 7.0.2 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@7.0.2: + resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} + engines: {node: '>=16.0.0'} + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 5.0.1 + rfdc: 1.3.0 + wrap-ansi: 8.1.0 + dev: true + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -6081,6 +6439,17 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6132,6 +6501,11 @@ packages: hasBin: true dev: true + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} @@ -6175,6 +6549,10 @@ packages: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -6215,6 +6593,16 @@ packages: hasBin: true dev: true + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -6242,8 +6630,8 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@5.1.2: - resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -6331,10 +6719,6 @@ packages: hasBin: true dev: false - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -6415,6 +6799,20 @@ packages: engines: {node: '>=10'} dev: true + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true @@ -6501,6 +6899,30 @@ packages: wrappy: 1.0.2 dev: true + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -6513,16 +6935,16 @@ packages: word-wrap: 1.2.3 dev: true - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /osc-min@1.1.2: @@ -6620,6 +7042,11 @@ packages: engines: {node: '>=8'} dev: true + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -6656,6 +7083,12 @@ packages: engines: {node: '>=8.6'} dev: true + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /pkg-types@1.0.2: resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: @@ -6701,18 +7134,12 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: - fast-diff: 1.2.0 + fast-diff: 1.3.0 dev: true - /prettier@2.8.2: - resolution: {integrity: sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /prettier@2.8.3: - resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} - engines: {node: '>=10.13.0'} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} hasBin: true dev: true @@ -6932,7 +7359,7 @@ packages: '@types/react': 18.0.26 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) - tslib: 2.5.3 + tslib: 2.6.2 dev: false /react-remove-scroll@2.5.6(@types/react@18.0.26)(react@18.2.0): @@ -6949,7 +7376,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.0.26)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) - tslib: 2.5.3 + tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.0.26)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.0.26)(react@18.2.0) dev: false @@ -6991,7 +7418,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.5.3 + tslib: 2.6.2 dev: false /react@18.2.0: @@ -7048,6 +7475,10 @@ packages: /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} @@ -7057,11 +7488,6 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /remove-accents@0.4.2: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false @@ -7106,11 +7532,23 @@ packages: lowercase-keys: 2.0.0 dev: true + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -7137,7 +7575,14 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 dev: true /run-parallel@1.2.0: @@ -7213,13 +7658,18 @@ packages: hasBin: true dev: true + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -7314,6 +7764,15 @@ packages: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: @@ -7343,6 +7802,14 @@ packages: dev: true optional: true + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -7421,6 +7888,11 @@ packages: engines: {node: '>=10.0.0'} dev: false + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7430,6 +7902,15 @@ packages: strip-ansi: 6.0.1 dev: true + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: @@ -7472,6 +7953,23 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -7535,6 +8033,14 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} @@ -7581,6 +8087,11 @@ packages: engines: {node: '>=14.0.0'} dev: true + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + /tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} dependencies: @@ -7648,7 +8159,16 @@ packages: utf8-byte-length: 1.0.4 dev: true - /ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.4): + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: true + + /ts-node@10.9.1(@types/node@16.18.11)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -7674,12 +8194,12 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.4 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsconfck@2.1.1(typescript@4.9.4): + /tsconfck@2.1.1(typescript@5.2.2): resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true @@ -7689,7 +8209,7 @@ packages: typescript: optional: true dependencies: - typescript: 4.9.4 + typescript: 5.2.2 dev: true /tslib@1.14.1: @@ -7707,79 +8227,77 @@ packages: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: false + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsutils@3.21.0(typescript@4.9.4): + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.9.4 + typescript: 5.2.2 dev: true - /turbo-darwin-64@1.8.8: - resolution: {integrity: sha512-18cSeIm7aeEvIxGyq7PVoFyEnPpWDM/0CpZvXKHpQ6qMTkfNt517qVqUTAwsIYqNS8xazcKAqkNbvU1V49n65Q==} + /turbo-darwin-64@1.10.16: + resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.8.8: - resolution: {integrity: sha512-ruGRI9nHxojIGLQv1TPgN7ud4HO4V8mFBwSgO6oDoZTNuk5ybWybItGR+yu6fni5vJoyMHXOYA2srnxvOc7hjQ==} + /turbo-darwin-arm64@1.10.16: + resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.8.8: - resolution: {integrity: sha512-N/GkHTHeIQogXB1/6ZWfxHx+ubYeb8Jlq3b/3jnU4zLucpZzTQ8XkXIAfJG/TL3Q7ON7xQ8yGOyGLhHL7MpFRg==} + /turbo-linux-64@1.10.16: + resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.8.8: - resolution: {integrity: sha512-hKqLbBHgUkYf2Ww8uBL9UYdBFQ5677a7QXdsFhONXoACbDUPvpK4BKlz3NN7G4NZ+g9dGju+OJJjQP0VXRHb5w==} + /turbo-linux-arm64@1.10.16: + resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.8.8: - resolution: {integrity: sha512-2ndjDJyzkNslXxLt+PQuU21AHJWc8f6MnLypXy3KsN4EyX/uKKGZS0QJWz27PeHg0JS75PVvhfFV+L9t9i+Yyg==} + /turbo-windows-64@1.10.16: + resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.8.8: - resolution: {integrity: sha512-xCA3oxgmW9OMqpI34AAmKfOVsfDljhD5YBwgs0ZDsn5h3kCHhC4x9W5dDk1oyQ4F5EXSH3xVym5/xl1J6WRpUg==} + /turbo-windows-arm64@1.10.16: + resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.8.8: - resolution: {integrity: sha512-qYJ5NjoTX+591/x09KgsDOPVDUJfU9GoS+6jszQQlLp1AHrf1wRFA3Yps8U+/HTG03q0M4qouOfOLtRQP4QypA==} + /turbo@1.10.16: + resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} hasBin: true - requiresBuild: true optionalDependencies: - turbo-darwin-64: 1.8.8 - turbo-darwin-arm64: 1.8.8 - turbo-linux-64: 1.8.8 - turbo-linux-arm64: 1.8.8 - turbo-windows-64: 1.8.8 - turbo-windows-arm64: 1.8.8 + turbo-darwin-64: 1.10.16 + turbo-darwin-arm64: 1.10.16 + turbo-linux-64: 1.10.16 + turbo-linux-arm64: 1.10.16 + turbo-windows-64: 1.10.16 + turbo-windows-arm64: 1.10.16 dev: true /type-check@0.3.2: @@ -7813,6 +8331,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7837,9 +8360,9 @@ packages: resolution: {integrity: sha512-lVGVHvYl7UJDFB9vN8r7NHw3sVm7Rjeow6b9AeABc/J+2mDaCkmcdVtw3QZnsJW39P+xm5zeggIj9gLHYGn9Iw==} dev: false - /typescript@4.9.4: - resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} - engines: {node: '>=4.2.0'} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} hasBin: true dev: true @@ -7896,6 +8419,11 @@ packages: webpack-virtual-modules: 0.5.0 dev: true + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true @@ -7932,7 +8460,7 @@ packages: dependencies: '@types/react': 18.0.26 react: 18.2.0 - tslib: 2.5.3 + tslib: 2.6.2 dev: false /use-sidecar@1.1.2(@types/react@18.0.26)(react@18.2.0): @@ -7948,7 +8476,7 @@ packages: '@types/react': 18.0.26 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.5.3 + tslib: 2.6.2 dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -7997,7 +8525,7 @@ packages: dev: true optional: true - /vite-node@0.30.1(@types/node@18.15.11): + /vite-node@0.30.1(@types/node@16.18.23): resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8007,7 +8535,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.1(@types/node@18.15.11) + vite: 4.3.1(@types/node@16.18.23) transitivePeerDependencies: - '@types/node' - less @@ -8054,13 +8582,13 @@ packages: dependencies: '@rollup/pluginutils': 5.0.2 '@svgr/core': 6.5.1 - vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) + vite: 4.3.1(@types/node@16.18.11)(sass@1.57.1) transitivePeerDependencies: - rollup - supports-color dev: true - /vite-tsconfig-paths@4.2.0(typescript@4.9.4)(vite@4.3.1): + /vite-tsconfig-paths@4.2.0(typescript@5.2.2)(vite@4.3.1): resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: vite: '*' @@ -8070,14 +8598,14 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.1(typescript@4.9.4) - vite: 4.3.1(@types/node@18.11.18)(sass@1.57.1) + tsconfck: 2.1.1(typescript@5.2.2) + vite: 4.3.1(@types/node@16.18.11)(sass@1.57.1) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.3.1(@types/node@18.11.18)(sass@1.57.1): + /vite@4.3.1(@types/node@16.18.11)(sass@1.57.1): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8102,16 +8630,16 @@ packages: terser: optional: true dependencies: - '@types/node': 18.11.18 + '@types/node': 16.18.11 esbuild: 0.17.5 postcss: 8.4.21 rollup: 3.20.7 sass: 1.57.1 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /vite@4.3.1(@types/node@18.15.11): + /vite@4.3.1(@types/node@16.18.23): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8136,12 +8664,12 @@ packages: terser: optional: true dependencies: - '@types/node': 18.15.11 + '@types/node': 16.18.23 esbuild: 0.17.5 postcss: 8.4.21 rollup: 3.20.7 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /vite@4.3.1(@types/node@18.15.11)(sass@1.57.1): @@ -8175,7 +8703,7 @@ packages: rollup: 3.20.7 sass: 1.57.1 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /vitest@0.30.1: @@ -8211,7 +8739,7 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 18.15.11 + '@types/node': 16.18.23 '@vitest/expect': 0.30.1 '@vitest/runner': 0.30.1 '@vitest/snapshot': 0.30.1 @@ -8232,8 +8760,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.4.0 tinypool: 0.4.0 - vite: 4.3.1(@types/node@18.15.11) - vite-node: 0.30.1(@types/node@18.15.11) + vite: 4.3.1(@types/node@16.18.23) + vite-node: 0.30.1(@types/node@16.18.23) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8434,6 +8962,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -8501,6 +9038,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} diff --git a/turbo.json b/turbo.json index cdd3a342f..e8ee706a2 100644 --- a/turbo.json +++ b/turbo.json @@ -1,18 +1,33 @@ { "$schema": "https://turbo.build/schema.json", "pipeline":{ - "dev": {}, - "dev:server": {}, - "dev:test": {}, + "dev": { + "cache": false + }, + "dev:server": { + "cache": false + }, + "dev:test": { + "cache": false + }, + "test": {}, + "test:pipeline": {}, + "lint": { + "cache": false + }, + "lint-staged": { + "outputs": [], + "cache": false + }, + "typecheck": { + "cache": false + }, "build": {}, "build:local": {}, "build:docker": {}, - "test": {}, - "test:pipeline": {}, "e2e": { "dependsOn": ["^build"] }, - "lint": {}, "dist-win": {}, "dist-mac": {}, "dist-linux": {}, From 1ca3b9c13479549be3bec646906eb6eceb92c2dc Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 14 Nov 2023 21:54:56 +0100 Subject: [PATCH 16/23] refactor: better errors (#590) * refactor: improve error messages from server --- apps/client/src/common/api/apiUtils.ts | 1 - apps/client/src/common/hooks/useEventAction.ts | 2 +- .../src/classes/data-provider/DataProvider.ts | 2 -- apps/server/src/controllers/ontimeController.ts | 16 ++++++++-------- .../server/src/controllers/playbackController.ts | 14 +++++++------- apps/server/src/controllers/projectController.ts | 2 +- apps/server/src/controllers/rundownController.ts | 14 +++++++------- apps/server/src/modules/loadDb.ts | 2 +- .../services/rundown-service/RundownService.ts | 2 +- 9 files changed, 26 insertions(+), 29 deletions(-) diff --git a/apps/client/src/common/api/apiUtils.ts b/apps/client/src/common/api/apiUtils.ts index 4042761bb..4388980df 100644 --- a/apps/client/src/common/api/apiUtils.ts +++ b/apps/client/src/common/api/apiUtils.ts @@ -11,7 +11,6 @@ export function maybeAxiosError(error: unknown) { const statusText = (error as AxiosError).response?.statusText ?? ''; let data = (error as AxiosError).response?.data ?? ''; if (typeof data === 'object') { - // TODO: use error instead, when migrated if ('message' in data) { data = JSON.stringify(data.message); } else { diff --git a/apps/client/src/common/hooks/useEventAction.ts b/apps/client/src/common/hooks/useEventAction.ts index 1cb8af577..7bd9ff7c4 100644 --- a/apps/client/src/common/hooks/useEventAction.ts +++ b/apps/client/src/common/hooks/useEventAction.ts @@ -100,7 +100,7 @@ export const useEventAction = () => { // @ts-expect-error -- we know that the object is well formed now await _addEventMutation.mutateAsync(newEvent); } catch (error) { - logAxiosError('Error fetching data', error); + logAxiosError('Failed adding event', error); } }, [_addEventMutation, defaultPublic, queryClient, startTimeIsLastEnd], diff --git a/apps/server/src/classes/data-provider/DataProvider.ts b/apps/server/src/classes/data-provider/DataProvider.ts index ea5285b9b..031a537d5 100644 --- a/apps/server/src/classes/data-provider/DataProvider.ts +++ b/apps/server/src/classes/data-provider/DataProvider.ts @@ -46,7 +46,6 @@ export class DataProvider { static async clearRundown() { data.rundown = []; - // @ts-expect-error -- not sure how to type, this is library side await db.write(); } @@ -100,7 +99,6 @@ export class DataProvider { } static async persist() { - // @ts-expect-error -- not sure how to type, this is library side await db.write(); } diff --git a/apps/server/src/controllers/ontimeController.ts b/apps/server/src/controllers/ontimeController.ts index 76eca8aea..d481e245a 100644 --- a/apps/server/src/controllers/ontimeController.ts +++ b/apps/server/src/controllers/ontimeController.ts @@ -149,7 +149,7 @@ export const postAliases = async (req, res) => { await DataProvider.setAliases(newAliases); res.status(200).send(newAliases); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -172,7 +172,7 @@ export const postUserFields = async (req, res) => { await DataProvider.setUserFields(newData); res.status(200).send(newData); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -235,7 +235,7 @@ export const postSettings = async (req, res) => { await DataProvider.setSettings(newData); res.status(200).send(newData); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -270,7 +270,7 @@ export const postViewSettings = async (req, res) => { await DataProvider.setViewSettings(newData); res.status(200).send(newData); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -298,7 +298,7 @@ export const postOscSubscriptions = async (req, res) => { res.send(oscSettings).status(200); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -319,7 +319,7 @@ export const postOSC = async (req, res) => { res.send(oscSettings).status(200); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -348,7 +348,7 @@ export async function patchPartialProjectFile(req, res) { } res.status(200).send(); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } } @@ -409,6 +409,6 @@ export const postNew: RequestHandler = async (req, res) => { await deleteAllEvents(); res.status(201).send(newData); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; diff --git a/apps/server/src/controllers/playbackController.ts b/apps/server/src/controllers/playbackController.ts index fe71f19c1..fa1fc80e8 100644 --- a/apps/server/src/controllers/playbackController.ts +++ b/apps/server/src/controllers/playbackController.ts @@ -13,14 +13,14 @@ export const pbStart = async (req, res) => { const { eventId, eventIndex } = req.query; if (eventId) { const success = PlaybackService.startById(eventId); - success ? res.sendStatus(202) : res.status(400).send('Invalid event ID'); + success ? res.sendStatus(202) : res.status(400).send({ message: 'Invalid event ID' }); } else if (eventIndex) { const index = Number(eventIndex); if (!isNaN(index)) { const success = PlaybackService.startByIndex(eventIndex - 1); - success ? res.sendStatus(202) : res.status(400).send('Invalid event index'); + success ? res.sendStatus(202) : res.status(400).send({ message: 'Invalid event index' }); } else { - res.status(400).send('Invalid event index'); + res.status(400).send({ message: 'Invalid event index' }); } } else { PlaybackService.start(); @@ -69,17 +69,17 @@ export const pbLoad = async (req, res) => { const { eventId, eventIndex } = req.query; if (eventId) { const success = PlaybackService.loadById(eventId); - success ? res.sendStatus(202) : res.status(400).send('Invalid event ID'); + success ? res.sendStatus(202) : res.status(400).send({ message: 'Invalid event ID' }); } else if (eventIndex) { const index = Number(eventIndex); if (!isNaN(index)) { const success = PlaybackService.loadByIndex(eventIndex - 1); - success ? res.sendStatus(202) : res.status(400).send('Invalid event index'); + success ? res.sendStatus(202) : res.status(400).send({ message: 'Invalid event index' }); } else { - res.status(400).send('Invalid event index'); + res.status(400).send({ message: 'Invalid event index' }); } } else { - res.status(400).send('No event given'); + res.status(400).send({ message: 'No event given' }); } }; diff --git a/apps/server/src/controllers/projectController.ts b/apps/server/src/controllers/projectController.ts index c9f6e8d0e..095cc2702 100644 --- a/apps/server/src/controllers/projectController.ts +++ b/apps/server/src/controllers/projectController.ts @@ -30,6 +30,6 @@ export const postProject: RequestHandler = async (req, res) => { const newData = await DataProvider.setProjectData(newEvent); res.status(200).send(newData); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; diff --git a/apps/server/src/controllers/rundownController.ts b/apps/server/src/controllers/rundownController.ts index c2a00231a..e0e55e357 100644 --- a/apps/server/src/controllers/rundownController.ts +++ b/apps/server/src/controllers/rundownController.ts @@ -29,7 +29,7 @@ export const rundownPost: RequestHandler = async (req, res) => { const newEvent = await addEvent(req.body); res.status(201).send(newEvent); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -44,7 +44,7 @@ export const rundownPut: RequestHandler = async (req, res) => { const event = await editEvent(req.body); res.status(200).send(event); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -58,7 +58,7 @@ export const rundownReorder: RequestHandler = async (req, res) => { const event = await reorderEvent(eventId, from, to); res.status(200).send(event); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -72,7 +72,7 @@ export const rundownSwap: RequestHandler = async (req, res) => { await swapEvents(from, to); res.sendStatus(200); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -83,7 +83,7 @@ export const rundownApplyDelay: RequestHandler = async (req, res) => { await applyDelay(req.params.eventId); res.sendStatus(200); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -94,7 +94,7 @@ export const deleteEventById: RequestHandler = async (req, res) => { await deleteEvent(req.params.eventId); res.sendStatus(204); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; @@ -105,6 +105,6 @@ export const rundownDelete: RequestHandler = async (req, res) => { await deleteAllEvents(); res.sendStatus(204); } catch (error) { - res.status(400).send(error); + res.status(400).send({ message: error.toString() }); } }; diff --git a/apps/server/src/modules/loadDb.ts b/apps/server/src/modules/loadDb.ts index 4b831f131..9442b1228 100644 --- a/apps/server/src/modules/loadDb.ts +++ b/apps/server/src/modules/loadDb.ts @@ -67,7 +67,7 @@ async function loadDb() { return { db, data }; } -export let db = {}; +export let db = {} as Low; export let data = {} as DatabaseModel; export const dbLoadingProcess = loadDb(); diff --git a/apps/server/src/services/rundown-service/RundownService.ts b/apps/server/src/services/rundown-service/RundownService.ts index 8da7f6642..e2efb97d0 100644 --- a/apps/server/src/services/rundown-service/RundownService.ts +++ b/apps/server/src/services/rundown-service/RundownService.ts @@ -158,7 +158,7 @@ export function updateTimer(affectedIds?: string[]) { export async function addEvent(eventData: Partial | Partial | Partial) { const numEvents = DataProvider.getRundownLength(); if (numEvents > MAX_EVENTS) { - throw new Error(`ERROR: Reached limit number of ${MAX_EVENTS} events`); + throw new Error(`Reached limit number of ${MAX_EVENTS} events`); } let newEvent: Partial = {}; From 536e447eaa156bbab400336fe0c8614f334b7781 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:31:14 +0100 Subject: [PATCH 17/23] style: export modal (#592) * style: tweaks to export modal --- .../modals/export-modal/ExportModal.module.scss | 13 ++++++------- .../features/modals/export-modal/ExportModal.tsx | 8 ++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/client/src/features/modals/export-modal/ExportModal.module.scss b/apps/client/src/features/modals/export-modal/ExportModal.module.scss index 58b648de3..04a092b85 100644 --- a/apps/client/src/features/modals/export-modal/ExportModal.module.scss +++ b/apps/client/src/features/modals/export-modal/ExportModal.module.scss @@ -1,10 +1,9 @@ -.modalHeader { - font-weight: 400; -} +@use '../../../theme/v2Styles' as *; -.modalBody { - display: flex; +.buttonRow { justify-content: space-between; - margin-top: 1rem; - margin-bottom: 1rem; + margin-top: $section-spacing; + display: flex; + gap: $section-spacing; + margin: 0 0.25rem; } diff --git a/apps/client/src/features/modals/export-modal/ExportModal.tsx b/apps/client/src/features/modals/export-modal/ExportModal.tsx index 68f57a7d2..78bb1bbcb 100644 --- a/apps/client/src/features/modals/export-modal/ExportModal.tsx +++ b/apps/client/src/features/modals/export-modal/ExportModal.tsx @@ -13,16 +13,16 @@ export default function ExportModal(props: ExportModalProps) { const { isOpen, onClose } = props; return ( - + Download options - - - From 54def8b8208363f9d0b08a4fc4e8c1e0c3e5d307 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Wed, 15 Nov 2023 20:20:05 +0100 Subject: [PATCH 18/23] feat: small improvements to instance info (#591) * refactor: add typings to backend info * refactor: write current version to project file * feat: show location of css override --- apps/client/src/common/api/ontimeApi.ts | 4 +- apps/client/src/common/hooks-query/useInfo.ts | 5 ++- apps/client/src/common/models/Info.ts | 38 +++++++++++-------- .../src/common/models/OntimeSettings.ts | 2 +- .../settings-modal/SettingsModal.module.scss | 11 ++++-- .../settings-modal/ViewSettingsForm.tsx | 21 +++++++++- .../__test__/DataProvider.test.ts | 6 +-- .../src/controllers/ontimeController.ts | 12 +++--- apps/server/src/models/dataModel.ts | 3 +- .../server/src/utils/__tests__/parser.test.ts | 26 ++++++------- apps/server/src/utils/parser.ts | 5 +-- apps/server/src/utils/parserFunctions.ts | 1 + apps/server/test-db/db.json | 2 +- apps/test-db/db.json | 2 +- demo-db/db.json | 2 +- e2e/tests/fixtures/test-db.json | 2 +- .../ontime-controller/BackendResponse.type.ts | 14 +++++++ .../src/definitions/core/Settings.type.ts | 4 +- packages/types/src/index.ts | 3 ++ 19 files changed, 105 insertions(+), 58 deletions(-) create mode 100644 packages/types/src/api/ontime-controller/BackendResponse.type.ts diff --git a/apps/client/src/common/api/ontimeApi.ts b/apps/client/src/common/api/ontimeApi.ts index 1cb33ea23..05c787d9d 100644 --- a/apps/client/src/common/api/ontimeApi.ts +++ b/apps/client/src/common/api/ontimeApi.ts @@ -2,6 +2,7 @@ import axios, { AxiosResponse } from 'axios'; import { Alias, DatabaseModel, + GetInfo, OntimeRundown, OSCSettings, OscSubscription, @@ -13,7 +14,6 @@ import { import { ExcelImportMap } from 'ontime-utils'; import { apiRepoLatest } from '../../externals'; -import { InfoType } from '../models/Info'; import fileDownload from '../utils/fileDownload'; import { ontimeURL } from './apiConstants'; @@ -39,7 +39,7 @@ export async function postSettings(data: Settings) { * @description HTTP request to retrieve application info * @return {Promise} */ -export async function getInfo(): Promise { +export async function getInfo(): Promise { const res = await axios.get(`${ontimeURL}/info`); return res.data; } diff --git a/apps/client/src/common/hooks-query/useInfo.ts b/apps/client/src/common/hooks-query/useInfo.ts index 3cf946c24..c600e0def 100644 --- a/apps/client/src/common/hooks-query/useInfo.ts +++ b/apps/client/src/common/hooks-query/useInfo.ts @@ -1,4 +1,5 @@ import { useQuery } from '@tanstack/react-query'; +import { GetInfo } from 'ontime-types'; import { queryRefetchIntervalSlow } from '../../ontimeConfig'; import { APP_INFO } from '../api/apiConstants'; @@ -6,7 +7,7 @@ import { getInfo } from '../api/ontimeApi'; import { ontimePlaceholderInfo } from '../models/Info'; export default function useInfo() { - const { data, status, isError, refetch } = useQuery({ + const { data, status, isError, refetch, isFetching } = useQuery({ queryKey: APP_INFO, queryFn: getInfo, placeholderData: ontimePlaceholderInfo, @@ -16,5 +17,5 @@ export default function useInfo() { networkMode: 'always', }); - return { data, status, isError, refetch }; + return { data, status, isError, refetch, isFetching }; } diff --git a/apps/client/src/common/models/Info.ts b/apps/client/src/common/models/Info.ts index 6051cd115..f066f3290 100644 --- a/apps/client/src/common/models/Info.ts +++ b/apps/client/src/common/models/Info.ts @@ -1,19 +1,25 @@ -import { Settings } from 'ontime-types'; +import { GetInfo, OSCSettings } from 'ontime-types'; -type NetworkInterfaceType = { - name: string; - address: string; -}; - -export type InfoType = { - networkInterfaces: NetworkInterfaceType[]; - settings: Pick; -}; - -export const ontimePlaceholderInfo: InfoType = { - networkInterfaces: [], - settings: { - version: 2, - serverPort: 4001, +export const oscPlaceholderSettings: OSCSettings = { + portIn: 0, + portOut: 0, + targetIP: '', + enabledIn: false, + enabledOut: false, + subscriptions: { + onLoad: [], + onStart: [], + onPause: [], + onStop: [], + onUpdate: [], + onFinish: [], }, }; + +export const ontimePlaceholderInfo: GetInfo = { + networkInterfaces: [], + version: '2.0.0', + serverPort: 4001, + osc: oscPlaceholderSettings, + cssOverride: '', +}; diff --git a/apps/client/src/common/models/OntimeSettings.ts b/apps/client/src/common/models/OntimeSettings.ts index f234defc1..bb26409da 100644 --- a/apps/client/src/common/models/OntimeSettings.ts +++ b/apps/client/src/common/models/OntimeSettings.ts @@ -2,7 +2,7 @@ import { Settings } from 'ontime-types'; export const ontimePlaceholderSettings: Settings = { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, editorKey: null, operatorKey: null, diff --git a/apps/client/src/features/modals/settings-modal/SettingsModal.module.scss b/apps/client/src/features/modals/settings-modal/SettingsModal.module.scss index 12110a1f1..c21969f6a 100644 --- a/apps/client/src/features/modals/settings-modal/SettingsModal.module.scss +++ b/apps/client/src/features/modals/settings-modal/SettingsModal.module.scss @@ -3,19 +3,24 @@ .aliases { display: flex; align-items: center; - gap: 8px; + gap: 0.5rem; flex-direction: column; width: 100%; - padding: 8px 0; + padding: 0.5rem 0; .aliasRow { width: 100%; display: flex; align-items: center; - gap: 8px; + gap: 0.5rem; } .grow { flex: 1; } } + +.url { + font-size: calc(1rem - 2px); + user-select: text; +} diff --git a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx index 3ab21dd32..ed1008ad0 100644 --- a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx +++ b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx @@ -1,16 +1,18 @@ import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; -import { Input, Switch } from '@chakra-ui/react'; +import { Alert, AlertDescription, AlertIcon, AlertTitle, Input, Switch } from '@chakra-ui/react'; import { ViewSettings } from 'ontime-types'; import { logAxiosError } from '../../../common/api/apiUtils'; import { postViewSettings } from '../../../common/api/ontimeApi'; import { PopoverPickerRHF } from '../../../common/components/input/popover-picker/PopoverPicker'; +import useInfo from '../../../common/hooks-query/useInfo'; import useViewSettings from '../../../common/hooks-query/useViewSettings'; import { mtm } from '../../../common/utils/timeConstants'; import ModalLoader from '../modal-loader/ModalLoader'; import { inputProps } from '../modalHelper'; import ModalInput from '../ModalInput'; +import ModalLink from '../ModalLink'; import ModalSplitInput from '../ModalSplitInput'; import OntimeModalFooter from '../OntimeModalFooter'; @@ -18,8 +20,12 @@ import InputMillisWithString from './InputMillisWithString'; import style from './SettingsModal.module.scss'; +const cssOverrideDocsUrl = 'https://ontime.gitbook.io/v2/features/custom-styling'; + export default function ViewSettingsForm() { const { data, status, refetch, isFetching } = useViewSettings(); + const { data: info, isFetching: isFetchingInfo } = useInfo(); + const { control, handleSubmit, @@ -75,13 +81,24 @@ export default function ViewSettingsForm() { const disableInputs = status === 'loading'; - if (isFetching) { + if (isFetching || isFetchingInfo) { return ; } return (
General view settings + + +
+ CSS Override + + Ontime will use the CSS file at its install location.
+ {info.cssOverride} + For more information, see the docs +
+
+
{ }, settings: { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, editorKey: null, operatorKey: null, @@ -84,7 +84,7 @@ describe('safeMerge', () => { const mergedData = safeMerge(existing, newData); expect(mergedData.settings).toEqual({ app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 3000, operatorKey: null, editorKey: null, @@ -144,7 +144,7 @@ describe('safeMerge', () => { }, settings: { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, operatorKey: null, editorKey: null, diff --git a/apps/server/src/controllers/ontimeController.ts b/apps/server/src/controllers/ontimeController.ts index d481e245a..9ebb2ae1f 100644 --- a/apps/server/src/controllers/ontimeController.ts +++ b/apps/server/src/controllers/ontimeController.ts @@ -1,6 +1,6 @@ -import { Alias, DatabaseModel, LogOrigin, ProjectData } from 'ontime-types'; +import { Alias, DatabaseModel, GetInfo, LogOrigin, ProjectData } from 'ontime-types'; -import { RequestHandler } from 'express'; +import { RequestHandler, Request, Response } from 'express'; import fs from 'fs'; import { networkInterfaces } from 'os'; @@ -9,7 +9,7 @@ import { DataProvider } from '../classes/data-provider/DataProvider.js'; import { failEmptyObjects, failIsNotArray } from '../utils/routerUtils.js'; import { PlaybackService } from '../services/PlaybackService.js'; import { eventStore } from '../stores/EventStore.js'; -import { isDocker, resolveDbPath } from '../setup.js'; +import { isDocker, pathToStartStyles, resolveDbPath } from '../setup.js'; import { oscIntegration } from '../services/integration-service/OscIntegration.js'; import { logger } from '../classes/Logger.js'; import { deleteAllEvents, notifyChanges } from '../services/rundown-service/RundownService.js'; @@ -105,15 +105,16 @@ const getNetworkInterfaces = () => { return results; }; -// Create controller for POST request to '/ontime/info' +// Create controller for GET request to '/ontime/info' // Returns - -export const getInfo = async (req, res) => { +export const getInfo = async (req: Request, res: Response) => { const { version, serverPort } = DataProvider.getSettings(); const osc = DataProvider.getOsc(); // get nif and inject localhost const ni = getNetworkInterfaces(); ni.unshift({ name: 'localhost', address: '127.0.0.1' }); + const cssOverride = pathToStartStyles; // send object with network information res.status(200).send({ @@ -121,6 +122,7 @@ export const getInfo = async (req, res) => { version, serverPort, osc, + cssOverride, }); }; diff --git a/apps/server/src/models/dataModel.ts b/apps/server/src/models/dataModel.ts index 68fa10c6a..749e1e120 100644 --- a/apps/server/src/models/dataModel.ts +++ b/apps/server/src/models/dataModel.ts @@ -1,4 +1,5 @@ import { DatabaseModel } from 'ontime-types'; +import { ONTIME_VERSION } from '../ONTIME_VERSION.js'; export const dbModel: DatabaseModel = { rundown: [], @@ -12,7 +13,7 @@ export const dbModel: DatabaseModel = { }, settings: { app: 'ontime', - version: 2, + version: ONTIME_VERSION, serverPort: 4001, editorKey: null, operatorKey: null, diff --git a/apps/server/src/utils/__tests__/parser.test.ts b/apps/server/src/utils/__tests__/parser.test.ts index f30734ddb..6a396b757 100644 --- a/apps/server/src/utils/__tests__/parser.test.ts +++ b/apps/server/src/utils/__tests__/parser.test.ts @@ -201,7 +201,7 @@ describe('test json parser with valid def', () => { }, settings: { app: 'ontime', - version: 2, + version: '2.0.0', timeFormat: '24', }, viewSettings: {}, @@ -260,7 +260,7 @@ describe('test json parser with valid def', () => { it('settings are for right app and version', () => { const settings = parseResponse?.settings; expect(settings.app).toBe('ontime'); - expect(settings.version).toBe(2); + expect(settings.version).toEqual(expect.any(String)); }); it('missing settings', () => { @@ -387,7 +387,7 @@ describe('test corrupt data', () => { }, settings: { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, lock: null, timeFormat: '24', @@ -410,7 +410,7 @@ describe('test corrupt data', () => { }, settings: { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, lock: null, timeFormat: '24', @@ -427,7 +427,7 @@ describe('test corrupt data', () => { project: {}, settings: { app: 'ontime', - version: 2, + version: '2.0.0', serverPort: 4001, lock: null, timeFormat: '24', @@ -444,7 +444,7 @@ describe('test corrupt data', () => { event: {}, settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, }; @@ -734,7 +734,7 @@ describe('test aliases import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, aliases: [ { @@ -773,7 +773,7 @@ describe('test userFields import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, userFields: testUserFields, }; @@ -800,7 +800,7 @@ describe('test userFields import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, userFields: testUserFields, }; @@ -814,7 +814,7 @@ describe('test userFields import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, }; @@ -828,7 +828,7 @@ describe('test userFields import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, userFields: { notThis: 'this shouldng be accepted', @@ -847,7 +847,7 @@ describe('test views import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, viewSettings: { normalColor: '#ffffffcc', @@ -881,7 +881,7 @@ describe('test views import', () => { rundown: [], settings: { app: 'ontime', - version: 2, + version: '2.0.0', }, }; const parsed = parseViewSettings(testData); diff --git a/apps/server/src/utils/parser.ts b/apps/server/src/utils/parser.ts index bd2459869..4c28acd10 100644 --- a/apps/server/src/utils/parser.ts +++ b/apps/server/src/utils/parser.ts @@ -241,7 +241,7 @@ export const parseExcel = (excelData: unknown[][], options?: Partial { console.log('ERROR: unknown app version, skipping'); } else { const settings = { + version: dbModel.settings.version, serverPort: s.serverPort || dbModel.settings.serverPort, editorKey: s.editorKey || null, operatorKey: s.operatorKey || null, diff --git a/apps/server/test-db/db.json b/apps/server/test-db/db.json index 295f3f5a5..3cbd679f6 100644 --- a/apps/server/test-db/db.json +++ b/apps/server/test-db/db.json @@ -237,7 +237,7 @@ }, "settings": { "app": "ontime", - "version": 2, + "version": "2.0.0", "serverPort": 4001, "editorKey": null, "operatorKey": null, diff --git a/apps/test-db/db.json b/apps/test-db/db.json index 63c4dc6ea..e30ef9560 100644 --- a/apps/test-db/db.json +++ b/apps/test-db/db.json @@ -99,7 +99,7 @@ }, "settings": { "app": "ontime", - "version": 2, + "version": "2.0.0", "serverPort": 4001, "editorKey": null, "operatorKey": null, diff --git a/demo-db/db.json b/demo-db/db.json index 457e77606..eab76a7dc 100644 --- a/demo-db/db.json +++ b/demo-db/db.json @@ -413,7 +413,7 @@ }, "settings": { "app": "ontime", - "version": 2, + "version": "2.0.0", "serverPort": 4001, "editorKey": null, "operatorKey": null, diff --git a/e2e/tests/fixtures/test-db.json b/e2e/tests/fixtures/test-db.json index 6c7fb209b..66186be3b 100644 --- a/e2e/tests/fixtures/test-db.json +++ b/e2e/tests/fixtures/test-db.json @@ -103,7 +103,7 @@ }, "settings": { "app": "ontime", - "version": 2, + "version": "2.0.0", "serverPort": 4001, "editorKey": null, "operatorKey": null, diff --git a/packages/types/src/api/ontime-controller/BackendResponse.type.ts b/packages/types/src/api/ontime-controller/BackendResponse.type.ts new file mode 100644 index 000000000..6bfe2fa02 --- /dev/null +++ b/packages/types/src/api/ontime-controller/BackendResponse.type.ts @@ -0,0 +1,14 @@ +import { OSCSettings } from '../../definitions/core/OscSettings.type.js'; + +export type NetworkInterface = { + name: string; + address: string; +}; + +export interface GetInfo { + networkInterfaces: NetworkInterface[]; + version: string; + serverPort: number; + osc: OSCSettings; + cssOverride: string; +} diff --git a/packages/types/src/definitions/core/Settings.type.ts b/packages/types/src/definitions/core/Settings.type.ts index 4d4527989..a717c288b 100644 --- a/packages/types/src/definitions/core/Settings.type.ts +++ b/packages/types/src/definitions/core/Settings.type.ts @@ -1,8 +1,8 @@ -import { TimeFormat } from './TimeFormat.type'; +import { TimeFormat } from './TimeFormat.type.js'; export type Settings = { app: 'ontime'; - version: 2; + version: string; serverPort: number; editorKey: null | string; operatorKey: null | string; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index daee8f60c..20f74c16b 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -33,6 +33,9 @@ export type { OSCSettings, OscSubscription, OscSubscriptionOptions } from './def // ---> HTTP +// SERVER RESPONSES +export type { NetworkInterface, GetInfo } from './api/ontime-controller/BackendResponse.type.js'; + // SERVER RUNTIME export { type Log, LogLevel, type LogMessage, LogOrigin } from './definitions/runtime/Logger.type.js'; export { Playback } from './definitions/runtime/Playback.type.js'; From fad8d2a93340206edbff7dafc136a797427a2aa3 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:26:01 +0100 Subject: [PATCH 19/23] hotfix ci (#594) * ci: upgrade pnpm * version bump --- .github/workflows/build_v2.yml | 8 ++++---- apps/client/package.json | 2 +- apps/electron/package.json | 2 +- apps/server/package.json | 2 +- package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_v2.yml b/.github/workflows/build_v2.yml index 6ef489c12..8beae6bc8 100644 --- a/.github/workflows/build_v2.yml +++ b/.github/workflows/build_v2.yml @@ -52,9 +52,9 @@ jobs: node-version: 16 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile @@ -85,9 +85,9 @@ jobs: node-version: 16 - name: Setup pnpm - uses: pnpm/action-setup@v2.2.4 + uses: pnpm/action-setup@v2 with: - version: 7.26.3 + version: 8 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/apps/client/package.json b/apps/client/package.json index ce25a1ece..5ce605655 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -1,6 +1,6 @@ { "name": "ontime-ui", - "version": "2.13.1", + "version": "2.16.2", "private": true, "dependencies": { "@chakra-ui/react": "^2.7.0", diff --git a/apps/electron/package.json b/apps/electron/package.json index dcfa259da..92fce964f 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -1,6 +1,6 @@ { "name": "ontime", - "version": "2.13.1", + "version": "2.16.2", "author": "Carlos Valente", "description": "Time keeping for live events", "repository": "https://github.com/cpvalente/ontime", diff --git a/apps/server/package.json b/apps/server/package.json index df2f6575a..bcff2a51f 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -2,7 +2,7 @@ "name": "ontime-server", "type": "module", "main": "src/index.ts", - "version": "2.13.1", + "version": "2.16.2", "exports": "./src/index.js", "dependencies": { "body-parser": "^1.20.0", diff --git a/package.json b/package.json index 855b4d3f3..aad8912e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ontime", - "version": "2.13.1", + "version": "2.16.2", "description": "Time keeping for live events", "keywords": [ "lighdev", From c59e070076713ced702f26d79fa45927fa27980e Mon Sep 17 00:00:00 2001 From: Alex Christoffer Rasmussen Date: Fri, 17 Nov 2023 13:01:08 +0100 Subject: [PATCH 20/23] Local build (#595) * add build:electron script --------- Co-authored-by: arc-alex --- DEVELOPMENT.md | 2 +- apps/client/package.json | 1 + apps/server/package.json | 1 + package.json | 1 + turbo.json | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 0e4c11489..c2b3f4221 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -76,7 +76,7 @@ You can generate a distribution for your OS by running the following steps. From the project root, run the following commands - __Install the project dependencies__ by running `pnpm i` -- __Build the UI and server__ by running `turbo build:local` +- __Build the UI and server__ by running `turbo build:electron` - __Create the package__ by running `turbo dist-win`, `turbo dist-mac` or `turbo dist-linux` The build distribution assets will be at `.apps/electron/dist` diff --git a/apps/client/package.json b/apps/client/package.json index 5ce605655..6238b4a5a 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -38,6 +38,7 @@ "dev": "cross-env BROWSER=none vite", "build": "vite build", "build:local": "cross-env NODE_ENV=local vite build", + "build:electron": "cross-env NODE_ENV=local vite build", "build:docker": "vite build", "lint": "eslint . --quiet", "test": "vitest", diff --git a/apps/server/package.json b/apps/server/package.json index bcff2a51f..568a5c241 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -49,6 +49,7 @@ "dev:test": "cross-env IS_TEST=true nodemon --exec \"ts-node-esm\" ./src/index.ts", "prebuild": "pnpm setdb", "build": "pnpm prebuild && esbuild src/app.ts --log-level=error --platform=node --format=cjs --bundle --minify --outfile=dist/index.cjs", + "build:electron": "pnpm prebuild && esbuild src/app.ts --log-level=error --platform=node --format=cjs --bundle --minify --outfile=dist/index.cjs", "build:local": "pnpm prebuild && esbuild src/index.ts --log-level=error --platform=node --format=cjs --bundle --minify --outfile=dist/index.cjs", "build:docker": "pnpm prebuild && esbuild src/index.ts --log-level=error --platform=node --format=cjs --minify --bundle --outfile=dist/docker.cjs", "build:debug": "pnpm prebuild && esbuild src/app.ts --platform=node --format=cjs --bundle --outfile=dist/index.cjs", diff --git a/package.json b/package.json index aad8912e0..b4cb9d1df 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "lint-staged": "turbo run lint-staged --concurrency=1", "build": "turbo run build", "build:local": "turbo run build:local", + "build:electron": "turbo run build:electron", "dist-win": "turbo run dist-win", "dist-mac": "turbo run dist-mac", "dist-linux": "turbo run dist-linux", diff --git a/turbo.json b/turbo.json index e8ee706a2..97f249a40 100644 --- a/turbo.json +++ b/turbo.json @@ -24,6 +24,7 @@ }, "build": {}, "build:local": {}, + "build:electron": {}, "build:docker": {}, "e2e": { "dependsOn": ["^build"] From 58239af8bb4dd7a114c7b466be56d9a34947e17b Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Fri, 17 Nov 2023 13:01:28 +0100 Subject: [PATCH 21/23] fix: distinguish user initiated scroll (#596) --- .../src/common/hooks/useFollowComponent.ts | 5 +++-- .../client/src/features/operator/Operator.tsx | 20 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/client/src/common/hooks/useFollowComponent.ts b/apps/client/src/common/hooks/useFollowComponent.ts index f26ef07c0..cd6660251 100644 --- a/apps/client/src/common/hooks/useFollowComponent.ts +++ b/apps/client/src/common/hooks/useFollowComponent.ts @@ -21,7 +21,7 @@ interface UseFollowComponentProps { scrollRef: MutableRefObject; doFollow: boolean; topOffset?: number; - setScrollFlag?: () => void; + setScrollFlag?: (newValue: boolean) => void; } export default function useFollowComponent(props: UseFollowComponentProps) { @@ -34,14 +34,15 @@ export default function useFollowComponent(props: UseFollowComponentProps) { } if (followRef.current && scrollRef.current) { + setScrollFlag?.(true); // Use requestAnimationFrame to ensure the component is fully loaded window.requestAnimationFrame(() => { - setScrollFlag?.(); scrollToComponent( followRef as MutableRefObject, scrollRef as MutableRefObject, topOffset, ); + setScrollFlag?.(false); }); } diff --git a/apps/client/src/features/operator/Operator.tsx b/apps/client/src/features/operator/Operator.tsx index 0393bec3b..b6dc72c5c 100644 --- a/apps/client/src/features/operator/Operator.tsx +++ b/apps/client/src/features/operator/Operator.tsx @@ -12,6 +12,7 @@ import { useOperator } from '../../common/hooks/useSocket'; import useProjectData from '../../common/hooks-query/useProjectData'; import useRundown from '../../common/hooks-query/useRundown'; import useUserFields from '../../common/hooks-query/useUserFields'; +import { debounce } from '../../common/utils/debounce'; import { isStringBoolean } from '../../common/utils/viewUtils'; import FollowButton from './follow-button/FollowButton'; @@ -32,7 +33,6 @@ export default function Operator() { const featureData = useOperator(); const [searchParams] = useSearchParams(); - const isAutomatedScroll = useRef(false); const [lockAutoScroll, setLockAutoScroll] = useState(false); const selectedRef = useRef(null); const scrollRef = useRef(null); @@ -41,7 +41,6 @@ export default function Operator() { scrollRef: scrollRef, doFollow: !lockAutoScroll, topOffset: selectedOffset, - setScrollFlag: () => (isAutomatedScroll.current = true), }); // Set window title @@ -65,13 +64,8 @@ export default function Operator() { setLockAutoScroll(false); }; - const handleScroll = () => { - // prevent considering automated scrolls as user scrolls - if (isAutomatedScroll.current) { - isAutomatedScroll.current = false; - return; - } - + // prevent considering automated scrolls as user scrolls + const handleUserScroll = () => { if (selectedRef?.current && scrollRef?.current) { const selectedRect = selectedRef.current.getBoundingClientRect(); const scrollerRect = scrollRef.current.getBoundingClientRect(); @@ -82,6 +76,7 @@ export default function Operator() { } } }; + const debouncedHandleScroll = debounce(handleUserScroll, 1000); const missingData = !data || !userFields || !projectData; const isLoading = status === 'loading' || userFieldsStatus === 'loading' || projectDataStatus === 'loading'; @@ -119,7 +114,12 @@ export default function Operator() { lastId={lastEvent?.id} /> -
+
{data.map((entry) => { if (isOntimeEvent(entry)) { const isSelected = featureData.selectedEventId === entry.id; From 884ab0b67bc19f04e755795422b8a27f68999122 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Fri, 17 Nov 2023 16:18:02 +0100 Subject: [PATCH 22/23] refactor: rundown (#597) * refactor: add revision number to rundown * chore: migrate query --- apps/client/package.json | 6 +- apps/client/src/common/api/apiConstants.ts | 3 +- apps/client/src/common/api/apiUtils.ts | 16 +-- apps/client/src/common/api/eventsApi.ts | 12 +- apps/client/src/common/context/AppContext.tsx | 2 +- .../src/common/hooks-query/useOscSettings.ts | 8 +- .../src/common/hooks-query/useRundown.ts | 26 ++-- .../client/src/common/hooks/useEventAction.ts | 119 +++++++++++------- apps/client/src/common/queryClient.ts | 2 +- .../modals/quick-start/QuickStart.tsx | 6 +- .../modals/settings-modal/AliasesForm.tsx | 2 +- .../settings-modal/CuesheetSettingsForm.tsx | 2 +- .../settings-modal/ViewSettingsForm.tsx | 2 +- .../modals/upload-modal/UploadModal.tsx | 6 +- .../client/src/features/operator/Operator.tsx | 2 +- .../src/features/rundown/RundownEntry.tsx | 7 +- .../src/controllers/rundownController.ts | 14 ++- apps/server/src/routes/rundownRouter.ts | 4 + .../rundown-service/delayedRundown.utils.ts | 39 +++++- .../BackendResponse.type.ts | 6 + packages/types/src/index.ts | 1 + pnpm-lock.yaml | 85 +++++-------- 22 files changed, 225 insertions(+), 145 deletions(-) create mode 100644 packages/types/src/api/rundown-controller/BackendResponse.type.ts diff --git a/apps/client/package.json b/apps/client/package.json index 6238b4a5a..653c5ee96 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -12,8 +12,8 @@ "@react-icons/all-files": "^4.1.0", "@sentry/react": "^7.46.0", "@sentry/tracing": "^7.46.0", - "@tanstack/react-query": "^4.28.0", - "@tanstack/react-query-devtools": "^4.29.0", + "@tanstack/react-query": "^5.8.4", + "@tanstack/react-query-devtools": "^5.8.4", "@tanstack/react-table": "^8.9.2", "autosize": "^6.0.1", "axios": "^1.2.0", @@ -59,7 +59,7 @@ }, "devDependencies": { "@sentry/vite-plugin": "^0.4.0", - "@tanstack/eslint-plugin-query": "^4.26.2", + "@tanstack/eslint-plugin-query": "^5.8.4", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.1.1", "@testing-library/user-event": "^14.1.1", diff --git a/apps/client/src/common/api/apiConstants.ts b/apps/client/src/common/api/apiConstants.ts index f3a19e46f..9959d7275 100644 --- a/apps/client/src/common/api/apiConstants.ts +++ b/apps/client/src/common/api/apiConstants.ts @@ -2,8 +2,7 @@ export const PROJECT_DATA = ['project']; export const ALIASES = ['aliases']; export const USERFIELDS = ['userFields']; -export const RUNDOWN_TABLE_KEY = 'rundown'; -export const RUNDOWN_TABLE = [RUNDOWN_TABLE_KEY]; +export const RUNDOWN = ['rundown']; export const APP_INFO = ['appinfo']; export const OSC_SETTINGS = ['oscSettings']; export const APP_SETTINGS = ['appSettings']; diff --git a/apps/client/src/common/api/apiUtils.ts b/apps/client/src/common/api/apiUtils.ts index 4388980df..29f919212 100644 --- a/apps/client/src/common/api/apiUtils.ts +++ b/apps/client/src/common/api/apiUtils.ts @@ -42,12 +42,12 @@ export function logAxiosError(prepend: string, error: unknown) { * Utility function invalidates react-query caches */ export async function invalidateAllCaches() { - await ontimeQueryClient.invalidateQueries(['project']); - await ontimeQueryClient.invalidateQueries(['aliases']); - await ontimeQueryClient.invalidateQueries(['userFields']); - await ontimeQueryClient.invalidateQueries(['rundown']); - await ontimeQueryClient.invalidateQueries(['appinfo']); - await ontimeQueryClient.invalidateQueries(['oscSettings']); - await ontimeQueryClient.invalidateQueries(['appSettings']); - await ontimeQueryClient.invalidateQueries(['viewSettings']); + await ontimeQueryClient.invalidateQueries({ queryKey: ['project'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['aliases'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['userFields'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['rundown'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['appinfo'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['oscSettings'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['appSettings'] }); + await ontimeQueryClient.invalidateQueries({ queryKey: ['viewSettings'] }); } diff --git a/apps/client/src/common/api/eventsApi.ts b/apps/client/src/common/api/eventsApi.ts index bb574e340..8196853e2 100644 --- a/apps/client/src/common/api/eventsApi.ts +++ b/apps/client/src/common/api/eventsApi.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { OntimeRundown, OntimeRundownEntry } from 'ontime-types'; +import { GetRundownCached, OntimeRundown, OntimeRundownEntry } from 'ontime-types'; import { rundownURL } from './apiConstants'; @@ -7,6 +7,16 @@ import { rundownURL } from './apiConstants'; * @description HTTP request to fetch all events * @return {Promise} */ +export async function fetchCachedRundown(): Promise { + const res = await axios.get(`${rundownURL}/cached`); + return res.data; +} + +/** + * @deprecated use fetchCachedRundown instead + * @description HTTP request to fetch all events + * @return {Promise} + */ export async function fetchRundown(): Promise { const res = await axios.get(rundownURL); return res.data; diff --git a/apps/client/src/common/context/AppContext.tsx b/apps/client/src/common/context/AppContext.tsx index 373a86dfb..8a9e082c6 100644 --- a/apps/client/src/common/context/AppContext.tsx +++ b/apps/client/src/common/context/AppContext.tsx @@ -25,7 +25,7 @@ export const AppContextProvider = ({ children }: PropsWithChildren) => { const [operatorAuth, setOperatorAuth] = useState(true); useEffect(() => { - if (status === 'loading') return; + if (status === 'pending') return; if (!data) return; const previousEditor = sessionStorage.getItem(storageKeys.editor); diff --git a/apps/client/src/common/hooks-query/useOscSettings.ts b/apps/client/src/common/hooks-query/useOscSettings.ts index 5b55556e2..67becece2 100644 --- a/apps/client/src/common/hooks-query/useOscSettings.ts +++ b/apps/client/src/common/hooks-query/useOscSettings.ts @@ -24,20 +24,20 @@ export default function useOscSettings() { } export function useOscSettingsMutation() { - const { isLoading, mutateAsync } = useMutation({ + const { isPending, mutateAsync } = useMutation({ mutationFn: postOSC, onError: (error) => logAxiosError('Error saving OSC settings', error), onSuccess: (res) => ontimeQueryClient.setQueryData(OSC_SETTINGS, res.data), onSettled: () => ontimeQueryClient.invalidateQueries({ queryKey: OSC_SETTINGS }), }); - return { isLoading, mutateAsync }; + return { isPending, mutateAsync }; } export function usePostOscSubscriptions() { - const { isLoading, mutateAsync } = useMutation({ + const { isPending, mutateAsync } = useMutation({ mutationFn: postOscSubscriptions, onError: (error) => logAxiosError('Error saving OSC settings', error), onSettled: () => ontimeQueryClient.invalidateQueries({ queryKey: OSC_SETTINGS }), }); - return { isLoading, mutateAsync }; + return { isPending, mutateAsync }; } diff --git a/apps/client/src/common/hooks-query/useRundown.ts b/apps/client/src/common/hooks-query/useRundown.ts index fbdf74a05..cd3a02253 100644 --- a/apps/client/src/common/hooks-query/useRundown.ts +++ b/apps/client/src/common/hooks-query/useRundown.ts @@ -1,19 +1,29 @@ import { useQuery } from '@tanstack/react-query'; +import { GetRundownCached } from 'ontime-types'; import { queryRefetchInterval } from '../../ontimeConfig'; -import { RUNDOWN_TABLE } from '../api/apiConstants'; -import { fetchRundown } from '../api/eventsApi'; +import { RUNDOWN } from '../api/apiConstants'; +import { fetchCachedRundown } from '../api/eventsApi'; +const cachedRundownPlaceholder = { rundown: [], revision: -1 }; + +// TODO: can we leverage structural sharing to see if data has changed? export default function useRundown() { - const { data, status, isError, refetch } = useQuery({ - queryKey: RUNDOWN_TABLE, - queryFn: fetchRundown, - placeholderData: [], + return useQuery({ + queryKey: RUNDOWN, + queryFn: fetchCachedRundown, + placeholderData: cachedRundownPlaceholder, retry: 5, + select: (data) => data.rundown, retryDelay: (attempt) => attempt * 2500, refetchInterval: queryRefetchInterval, networkMode: 'always', + // structuralSharing: (oldData: GetRundownCached | undefined, newData: GetRundownCached) => { + // if (oldData === undefined) { + // cachedRundownPlaceholder; + // } + // const hasDataChanged = oldData?.revision === newData.revision; + // return hasDataChanged ? oldData : newData; + // }, }); - - return { data, status, isError, refetch }; } diff --git a/apps/client/src/common/hooks/useEventAction.ts b/apps/client/src/common/hooks/useEventAction.ts index 7bd9ff7c4..cc54112a7 100644 --- a/apps/client/src/common/hooks/useEventAction.ts +++ b/apps/client/src/common/hooks/useEventAction.ts @@ -1,9 +1,9 @@ import { useCallback } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { isOntimeEvent, OntimeRundown, OntimeRundownEntry } from 'ontime-types'; +import { GetRundownCached, isOntimeEvent, OntimeRundownEntry } from 'ontime-types'; import { getCueCandidate, swapOntimeEvents } from 'ontime-utils'; -import { RUNDOWN_TABLE, RUNDOWN_TABLE_KEY } from '../api/apiConstants'; +import { RUNDOWN } from '../api/apiConstants'; import { logAxiosError } from '../api/apiUtils'; import { ReorderEntry, @@ -36,7 +36,7 @@ export const useEventAction = () => { // Fetch anyway, just to be sure mutationFn: requestPostEvent, onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -67,8 +67,10 @@ export const useEventAction = () => { after: options?.after, }; + const rundown = queryClient.getQueryData(RUNDOWN)?.rundown ?? []; + if (newEvent?.cue === undefined) { - newEvent.cue = getCueCandidate(queryClient.getQueryData(RUNDOWN_TABLE) || [], options?.after); + newEvent.cue = getCueCandidate(rundown, options?.after); } // hard coding duration value to be as expected for now @@ -78,7 +80,6 @@ export const useEventAction = () => { } if (applicationOptions.startTimeIsLastEnd && applicationOptions?.lastEventId) { - const rundown = queryClient.getQueryData(RUNDOWN_TABLE) as OntimeRundown; const previousEvent = rundown.find((event) => event.id === applicationOptions.lastEventId); if (previousEvent !== undefined && previousEvent.type === 'event') { newEvent.timeStart = previousEvent.timeEnd; @@ -115,25 +116,35 @@ export const useEventAction = () => { // we optimistically update here onMutate: async (newEvent) => { // cancel ongoing queries - await queryClient.cancelQueries([RUNDOWN_TABLE_KEY, newEvent.id]); + await queryClient.cancelQueries({ queryKey: RUNDOWN }); // Snapshot the previous value - const previousEvent = queryClient.getQueryData([RUNDOWN_TABLE_KEY, newEvent.id]); - // optimistically update object - queryClient.setQueryData([RUNDOWN_TABLE_KEY, newEvent.id], newEvent); + const previousData = queryClient.getQueryData(RUNDOWN); + + if (previousData) { + // optimistically update object + const optimisticRundown = [...previousData.rundown]; + const index = optimisticRundown.findIndex((event) => event.id === newEvent.id); + if (index > -1) { + // @ts-expect-error -- we expect the event types to match + optimisticRundown[index] = { ...optimisticRundown[index], ...newEvent }; + + queryClient.setQueryData(RUNDOWN, { rundown: optimisticRundown, revision: -1 }); + } + } // Return a context with the previous and new events - return { previousEvent, newEvent }; + return { previousData, newEvent }; }, // Mutation fails, rollback undoes optimist update onError: (_error, _newEvent, context) => { - queryClient.setQueryData([RUNDOWN_TABLE_KEY, context?.newEvent.id], context?.previousEvent); + queryClient.setQueryData(RUNDOWN, context?.previousData); }, // Mutation finished, failed or successful // Fetch anyway, just to be sure onSettled: async () => { - await queryClient.invalidateQueries([RUNDOWN_TABLE_KEY]); + await queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -161,28 +172,37 @@ export const useEventAction = () => { // we optimistically update here onMutate: async (eventId) => { // cancel ongoing queries - await queryClient.cancelQueries([RUNDOWN_TABLE_KEY, eventId]); + await queryClient.cancelQueries({ queryKey: RUNDOWN }); // Snapshot the previous value - const previousEvents = queryClient.getQueryData(RUNDOWN_TABLE); + const previousData = queryClient.getQueryData(RUNDOWN); - const filtered = [...(previousEvents as OntimeRundown)].filter((e) => e.id !== eventId); + if (previousData) { + // optimistically update object + const optimisticRundown = [...previousData.rundown]; + const index = optimisticRundown.findIndex((event) => event.id === eventId); + if (index > -1) { + optimisticRundown.splice(index, 1); - // optimistically update object - queryClient.setQueryData(RUNDOWN_TABLE, filtered); + queryClient.setQueryData(RUNDOWN, { + rundown: optimisticRundown, + revision: -1, + }); + } + } // Return a context with the previous and new events - return { previousEvents }; + return { previousData }; }, // Mutation fails, rollback undoes optimist update onError: (_error, _eventId, context) => { - queryClient.setQueryData(RUNDOWN_TABLE, context?.previousEvents); + queryClient.setQueryData(RUNDOWN, context?.previousData); }, // Mutation finished, failed or successful // Fetch anyway, just to be sure onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -210,26 +230,26 @@ export const useEventAction = () => { // we optimistically update here onMutate: async () => { // cancel ongoing queries - await queryClient.cancelQueries(RUNDOWN_TABLE, { exact: true }); + await queryClient.cancelQueries({ queryKey: RUNDOWN }); // Snapshot the previous value - const previousEvents = queryClient.getQueryData(RUNDOWN_TABLE); + const previousData = queryClient.getQueryData(RUNDOWN); // optimistically update object - queryClient.setQueryData(RUNDOWN_TABLE, []); + queryClient.setQueryData(RUNDOWN, { rundown: [], revision: -1 }); // Return a context with the previous and new events - return { previousEvents }; + return { previousData }; }, // Mutation fails, rollback undos optimist update onError: (_error, _eventId, context) => { - queryClient.setQueryData(RUNDOWN_TABLE, context?.previousEvents); + queryClient.setQueryData(RUNDOWN, context?.previousData); }, // Mutation finished, failed or successful // Fetch anyway, just to be sure onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -253,7 +273,7 @@ export const useEventAction = () => { mutationFn: requestApplyDelay, // Mutation finished, failed or successful onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -281,30 +301,32 @@ export const useEventAction = () => { // we optimistically update here onMutate: async (data) => { // cancel ongoing queries - await queryClient.cancelQueries(RUNDOWN_TABLE, { exact: true }); + await queryClient.cancelQueries({ queryKey: RUNDOWN }); // Snapshot the previous value - const previousEvents = queryClient.getQueryData(RUNDOWN_TABLE); + const previousData = queryClient.getQueryData(RUNDOWN); - const e = [...(previousEvents as OntimeRundown)]; - const [reorderedItem] = e.splice(data.from, 1); - e.splice(data.to, 0, reorderedItem); + if (previousData) { + // optimistically update object + const optimisticRundown = [...previousData.rundown]; + const [reorderedItem] = optimisticRundown.splice(data.from, 1); + optimisticRundown.splice(data.to, 0, reorderedItem); - // optimistically update object - queryClient.setQueryData(RUNDOWN_TABLE, e); + queryClient.setQueryData(RUNDOWN, { rundown: optimisticRundown, revision: -1 }); + } // Return a context with the previous and new events - return { previousEvents }; + return { previousData }; }, // Mutation fails, rollback undoes optimist update onError: (_error, _eventId, context) => { - queryClient.setQueryData(RUNDOWN_TABLE, context?.previousEvents); + queryClient.setQueryData(RUNDOWN, context?.previousData); }, // Mutation finished, failed or successful // Fetch anyway, just to be sure onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); @@ -337,31 +359,32 @@ export const useEventAction = () => { // we optimistically update here onMutate: async ({ from, to }) => { // cancel ongoing queries - await queryClient.cancelQueries(RUNDOWN_TABLE, { exact: true }); + await queryClient.cancelQueries({ queryKey: RUNDOWN }); // Snapshot the previous value - const rundown = queryClient.getQueryData(RUNDOWN_TABLE) as OntimeRundown; + const previousData = queryClient.getQueryData(RUNDOWN); + if (previousData) { + // optimistically update object + const fromEventIndex = previousData.rundown.findIndex((event) => event.id === from); + const toEventIndex = previousData.rundown.findIndex((event) => event.id === to); - const fromEventIndex = rundown.findIndex((event) => event.id === from); - const toEventIndex = rundown.findIndex((event) => event.id === to); + const optimisticRundown = swapOntimeEvents(previousData.rundown, fromEventIndex, toEventIndex); - const previousEvents = swapOntimeEvents(rundown, fromEventIndex, toEventIndex); - - // optimistically update object - queryClient.setQueryData(RUNDOWN_TABLE, previousEvents); + queryClient.setQueryData(RUNDOWN, { rundown: optimisticRundown, revision: -1 }); + } // Return a context with the previous events - return { previousEvents }; + return { previousData }; }, // Mutation fails, rollback undoes optimist update onError: (_error, _eventId, context) => { - queryClient.setQueryData(RUNDOWN_TABLE, context?.previousEvents); + queryClient.setQueryData(RUNDOWN, context?.previousData); }, // Mutation finished, failed or successful // Fetch anyway, just to be sure onSettled: () => { - queryClient.invalidateQueries(RUNDOWN_TABLE); + queryClient.invalidateQueries({ queryKey: RUNDOWN }); }, networkMode: 'always', }); diff --git a/apps/client/src/common/queryClient.ts b/apps/client/src/common/queryClient.ts index 368c6582b..7da808d11 100644 --- a/apps/client/src/common/queryClient.ts +++ b/apps/client/src/common/queryClient.ts @@ -3,7 +3,7 @@ import { QueryClient } from '@tanstack/react-query'; export const ontimeQueryClient = new QueryClient({ defaultOptions: { queries: { - cacheTime: 1000 * 60 * 10, // 10 min + gcTime: 1000 * 60 * 10, // 10 min }, }, }); diff --git a/apps/client/src/features/modals/quick-start/QuickStart.tsx b/apps/client/src/features/modals/quick-start/QuickStart.tsx index 5fbc675c6..8d8319b1d 100644 --- a/apps/client/src/features/modals/quick-start/QuickStart.tsx +++ b/apps/client/src/features/modals/quick-start/QuickStart.tsx @@ -18,7 +18,7 @@ import { } from '@chakra-ui/react'; import type { ProjectData } from 'ontime-types'; -import { PROJECT_DATA, RUNDOWN_TABLE } from '../../../common/api/apiConstants'; +import { PROJECT_DATA, RUNDOWN } from '../../../common/api/apiConstants'; import { postNew } from '../../../common/api/ontimeApi'; import useProjectData from '../../../common/hooks-query/useProjectData'; import { projectDataPlaceholder } from '../../../common/models/ProjectData'; @@ -52,8 +52,8 @@ export default function QuickStart({ onClose, isOpen }: QuickStartProps) { const onSubmit = async (data: Partial) => { try { await postNew(data); - await ontimeQueryClient.invalidateQueries(PROJECT_DATA); - await ontimeQueryClient.invalidateQueries(RUNDOWN_TABLE); + await ontimeQueryClient.invalidateQueries({ queryKey: PROJECT_DATA }); + await ontimeQueryClient.invalidateQueries({ queryKey: RUNDOWN }); onClose(); } catch (_) { diff --git a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx index 49dbfdf7f..b9a155cf2 100644 --- a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx +++ b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx @@ -78,7 +78,7 @@ export default function AliasesForm() { }); }; - const disableInputs = status === 'loading'; + const disableInputs = status === 'pending'; const hasTooManyOptions = fields.length >= 20; if (isFetching) { diff --git a/apps/client/src/features/modals/settings-modal/CuesheetSettingsForm.tsx b/apps/client/src/features/modals/settings-modal/CuesheetSettingsForm.tsx index 9d997b0cd..42c9f9634 100644 --- a/apps/client/src/features/modals/settings-modal/CuesheetSettingsForm.tsx +++ b/apps/client/src/features/modals/settings-modal/CuesheetSettingsForm.tsx @@ -51,7 +51,7 @@ export default function CuesheetSettingsForm() { reset(data); }; - const disableInputs = status === 'loading'; + const disableInputs = status === 'pending'; if (isFetching) { return ; diff --git a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx index ed1008ad0..bdce1ce4e 100644 --- a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx +++ b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx @@ -79,7 +79,7 @@ export default function ViewSettingsForm() { return null; } - const disableInputs = status === 'loading'; + const disableInputs = status === 'pending'; if (isFetching || isFetchingInfo) { return ; diff --git a/apps/client/src/features/modals/upload-modal/UploadModal.tsx b/apps/client/src/features/modals/upload-modal/UploadModal.tsx index b8ee198d6..e2821340c 100644 --- a/apps/client/src/features/modals/upload-modal/UploadModal.tsx +++ b/apps/client/src/features/modals/upload-modal/UploadModal.tsx @@ -13,7 +13,7 @@ import { useQueryClient } from '@tanstack/react-query'; import { OntimeRundown, ProjectData, UserFields } from 'ontime-types'; import { defaultExcelImportMap, ExcelImportMap } from 'ontime-utils'; -import { PROJECT_DATA, RUNDOWN_TABLE, USERFIELDS } from '../../../common/api/apiConstants'; +import { PROJECT_DATA, RUNDOWN, USERFIELDS } from '../../../common/api/apiConstants'; import { invalidateAllCaches, maybeAxiosError } from '../../../common/api/apiUtils'; import { patchData, @@ -155,11 +155,11 @@ export default function UploadModal({ onClose, isOpen }: UploadModalProps) { setSubmitting(true); try { await patchData({ rundown, userFields, project }); - queryClient.setQueryData(RUNDOWN_TABLE, rundown); + queryClient.setQueryData(RUNDOWN, { rundown, revision: -1 }); queryClient.setQueryData(USERFIELDS, userFields); queryClient.setQueryData(PROJECT_DATA, project); await queryClient.invalidateQueries({ - queryKey: [...RUNDOWN_TABLE, ...USERFIELDS, ...PROJECT_DATA], + queryKey: [...RUNDOWN, ...USERFIELDS, ...PROJECT_DATA], }); doClose = true; } catch (error) { diff --git a/apps/client/src/features/operator/Operator.tsx b/apps/client/src/features/operator/Operator.tsx index b6dc72c5c..b43b9ed9a 100644 --- a/apps/client/src/features/operator/Operator.tsx +++ b/apps/client/src/features/operator/Operator.tsx @@ -79,7 +79,7 @@ export default function Operator() { const debouncedHandleScroll = debounce(handleUserScroll, 1000); const missingData = !data || !userFields || !projectData; - const isLoading = status === 'loading' || userFieldsStatus === 'loading' || projectDataStatus === 'loading'; + const isLoading = status === 'pending' || userFieldsStatus === 'pending' || projectDataStatus === 'pending'; if (missingData || isLoading) { return ; diff --git a/apps/client/src/features/rundown/RundownEntry.tsx b/apps/client/src/features/rundown/RundownEntry.tsx index 5041bca8b..41d917404 100644 --- a/apps/client/src/features/rundown/RundownEntry.tsx +++ b/apps/client/src/features/rundown/RundownEntry.tsx @@ -1,8 +1,8 @@ import { useCallback } from 'react'; -import { OntimeEvent, OntimeRundownEntry, Playback, SupportedEvent } from 'ontime-types'; +import { GetRundownCached, OntimeEvent, OntimeRundownEntry, Playback, SupportedEvent } from 'ontime-types'; import { calculateDuration, getCueCandidate } from 'ontime-utils'; -import { RUNDOWN_TABLE } from '../../common/api/apiConstants'; +import { RUNDOWN } from '../../common/api/apiConstants'; import { useEventAction } from '../../common/hooks/useEventAction'; import { ontimeQueryClient } from '../../common/queryClient'; import { useAppMode } from '../../common/stores/appModeStore'; @@ -100,7 +100,8 @@ export default function RundownEntry(props: RundownEntryProps) { } case 'clone': { const newEvent = cloneEvent(data as OntimeEvent, data.id); - newEvent.cue = getCueCandidate(ontimeQueryClient.getQueryData(RUNDOWN_TABLE) || [], data.id); + const rundown = ontimeQueryClient.getQueryData(RUNDOWN)?.rundown ?? [] + newEvent.cue = getCueCandidate(rundown, data.id); addEvent(newEvent); break; } diff --git a/apps/server/src/controllers/rundownController.ts b/apps/server/src/controllers/rundownController.ts index e0e55e357..b5d1bba5b 100644 --- a/apps/server/src/controllers/rundownController.ts +++ b/apps/server/src/controllers/rundownController.ts @@ -1,3 +1,7 @@ +import { GetRundownCached } from 'ontime-types'; + +import { Request, Response, RequestHandler } from 'express'; + import { failEmptyObjects } from '../utils/routerUtils.js'; import { addEvent, @@ -8,8 +12,7 @@ import { reorderEvent, swapEvents, } from '../services/rundown-service/RundownService.js'; -import { getDelayedRundown } from '../services/rundown-service/delayedRundown.utils.js'; -import { RequestHandler } from 'express'; +import { getDelayedRundown, getRundownCache } from '../services/rundown-service/delayedRundown.utils.js'; // Create controller for GET request to '/events' // Returns - @@ -18,6 +21,13 @@ export const rundownGetAll: RequestHandler = async (_req, res) => { res.json(delayedRundown); }; +// Create controller for GET request to '/events/cached' +// Returns - +export const rundownGetCached: RequestHandler = async (_req: Request, res: Response) => { + const cachedRundown = getRundownCache(); + res.json(cachedRundown); +}; + // Create controller for POST request to '/events/' // Returns - export const rundownPost: RequestHandler = async (req, res) => { diff --git a/apps/server/src/routes/rundownRouter.ts b/apps/server/src/routes/rundownRouter.ts index 63de25641..86b134b88 100644 --- a/apps/server/src/routes/rundownRouter.ts +++ b/apps/server/src/routes/rundownRouter.ts @@ -4,6 +4,7 @@ import { rundownApplyDelay, rundownDelete, rundownGetAll, + rundownGetCached, rundownPost, rundownPut, rundownReorder, @@ -19,6 +20,9 @@ import { export const router = express.Router(); +// create route between controller and '/events/cached' endpoint +router.get('/cached', rundownGetCached); + // create route between controller and '/events/' endpoint router.get('/', rundownGetAll); diff --git a/apps/server/src/services/rundown-service/delayedRundown.utils.ts b/apps/server/src/services/rundown-service/delayedRundown.utils.ts index 9b6387471..64ef7f877 100644 --- a/apps/server/src/services/rundown-service/delayedRundown.utils.ts +++ b/apps/server/src/services/rundown-service/delayedRundown.utils.ts @@ -1,4 +1,5 @@ import { + GetRundownCached, isOntimeBlock, isOntimeDelay, isOntimeEvent, @@ -16,6 +17,11 @@ import { isProduction } from '../../setup.js'; import { deleteAtIndex, insertAtIndex, reorderArray } from '../../utils/arrayUtils.js'; import { _applyDelay } from '../delayUtils.js'; +/** + * Keep incremental revision number of rundown for runtime + */ +let rundownRevision = 0; + /** * Key of rundown in cache */ @@ -38,7 +44,25 @@ export function invalidateFromError(errorMessage = 'Found mismatch between store * Returns rundown with calculated delays * Ensures request goes through the caching layer */ -export function getDelayedRundown(): OntimeRundown { +export function getRundownCache(): GetRundownCached { + function calculateRundown() { + const rundown = DataProvider.getRundown(); + return calculateRuntimeDelays(rundown); + } + + const cached = getCached(delayedRundownCacheKey, calculateRundown); + + return { + rundown: cached, + revision: rundownRevision, + }; +} + +/** + * Returns rundown with calculated delays + * Ensures request goes through the caching layer + */ +export function getDelayedRundown() { function calculateRundown() { const rundown = DataProvider.getRundown(); return calculateRuntimeDelays(rundown); @@ -72,6 +96,8 @@ export async function cachedAdd(eventIndex: number, event: OntimeEvent | OntimeD runtimeCacheStore.setCached(delayedRundownCacheKey, newDelayedRundown); // we need to delay updating this to ensure add operation happens on same dataset await DataProvider.setRundown(newRundown); + + rundownRevision++; } /** @@ -113,6 +139,8 @@ export async function cachedEdit( // we need to delay updating this to ensure edit operation happens on same dataset await DataProvider.setRundown(updatedRundown); + rundownRevision++; + return newEvent; } @@ -147,6 +175,8 @@ export async function cachedDelete(eventId: string) { } // we need to delay updating this to ensure edit operation happens on same dataset await DataProvider.setRundown(updatedRundown); + + rundownRevision++; } /** @@ -178,12 +208,15 @@ export async function cachedReorder(eventId: string, from: number, to: number) { // we need to delay updating this to ensure edit operation happens on same dataset await DataProvider.setRundown(updatedRundown); + rundownRevision++; + return reorderedEvent; } export async function cachedClear() { await DataProvider.clearRundown(); runtimeCacheStore.setCached(delayedRundownCacheKey, []); + rundownRevision++; } /** @@ -211,6 +244,8 @@ export async function cachedSwap(fromEventId: string, toEventId: string) { } await DataProvider.setRundown(rundownToUpdate); + + rundownRevision++; } export async function cachedApplyDelay(eventId: string) { @@ -224,6 +259,8 @@ export async function cachedApplyDelay(eventId: string) { // update runtimeCacheStore.setCached(delayedRundownCacheKey, cachedRundown); await DataProvider.setRundown(persistedRundown); + + rundownRevision++; } /** diff --git a/packages/types/src/api/rundown-controller/BackendResponse.type.ts b/packages/types/src/api/rundown-controller/BackendResponse.type.ts new file mode 100644 index 000000000..7b5763fb6 --- /dev/null +++ b/packages/types/src/api/rundown-controller/BackendResponse.type.ts @@ -0,0 +1,6 @@ +import { OntimeRundown } from '../../definitions/core/Rundown.type.js'; + +export interface GetRundownCached { + rundown: OntimeRundown; + revision: number; +} diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 20f74c16b..e2afa6fe6 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -35,6 +35,7 @@ export type { OSCSettings, OscSubscription, OscSubscriptionOptions } from './def // SERVER RESPONSES export type { NetworkInterface, GetInfo } from './api/ontime-controller/BackendResponse.type.js'; +export type { GetRundownCached } from './api/rundown-controller/BackendResponse.type.js'; // SERVER RUNTIME export { type Log, LogLevel, type LogMessage, LogOrigin } from './definitions/runtime/Logger.type.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93650ef4a..a0405d819 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,11 +78,11 @@ importers: specifier: ^7.46.0 version: 7.46.0 '@tanstack/react-query': - specifier: ^4.28.0 - version: 4.28.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.8.4 + version: 5.8.4(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-devtools': - specifier: ^4.29.0 - version: 4.29.0(@tanstack/react-query@4.28.0)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.8.4 + version: 5.8.4(@tanstack/react-query@5.8.4)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-table': specifier: ^8.9.2 version: 8.9.2(react-dom@18.2.0)(react@18.2.0) @@ -139,8 +139,8 @@ importers: specifier: ^0.4.0 version: 0.4.0 '@tanstack/eslint-plugin-query': - specifier: ^4.26.2 - version: 4.26.2 + specifier: ^5.8.4 + version: 5.8.4(eslint@8.53.0)(typescript@5.2.2) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.16.5 @@ -2704,41 +2704,44 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tanstack/eslint-plugin-query@4.26.2: - resolution: {integrity: sha512-ugAvl6Is+bUMLt9BlAnXK6Wi7UnGV+4RwJ2W1ToFoucPvUb2Uf+ADU38JkHaNsI/TFgE3+kePhKh0zzDBhkw0Q==} + /@tanstack/eslint-plugin-query@5.8.4(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-KVgcMc+Bn1qbwkxYVWQoiVSNEIN4IAiLj3cUH/SAHT8m8E59Y97o8ON1syp0Rcw094ItG8pEVZFyQuOaH6PDgQ==} + peerDependencies: + eslint: ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) + eslint: 8.53.0 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /@tanstack/match-sorter-utils@8.7.6: - resolution: {integrity: sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A==} - engines: {node: '>=12'} - dependencies: - remove-accents: 0.4.2 + /@tanstack/query-core@5.8.3: + resolution: {integrity: sha512-SWFMFtcHfttLYif6pevnnMYnBvxKf3C+MHMH7bevyYfpXpTMsLB9O6nNGBdWSoPwnZRXFNyNeVZOw25Wmdasow==} dev: false - /@tanstack/query-core@4.27.0: - resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} + /@tanstack/query-devtools@5.8.4: + resolution: {integrity: sha512-F1dRbITNt9tMUoM9WCH8WQ2c54116hv52m/PKK8ZiN/pO2wGVzTZtKuLanF8pFpwmNchjIixcMw/a57HY5ivcw==} dev: false - /@tanstack/react-query-devtools@4.29.0(@tanstack/react-query@4.28.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-bzotqin4Wa/GlPgJ2dI7eggQcbMDLIOwEClHGrkyie76DbT8vEEmEV9Kbh6kriKVSqCLpa9ZrgG/f8/Bx1zIwA==} + /@tanstack/react-query-devtools@5.8.4(@tanstack/react-query@5.8.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mffs51FJqXU/5rwhbwv393DccL6et7uK2pRLwOcmMrWbPyW8vpxr9oidaghHX4cdVeP/7u5owW9yMpBhBAJfcQ==} peerDependencies: - '@tanstack/react-query': 4.28.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-query': ^5.8.4 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@tanstack/match-sorter-utils': 8.7.6 - '@tanstack/react-query': 4.28.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/query-devtools': 5.8.4 + '@tanstack/react-query': 5.8.4(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - superjson: 1.12.1 - use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /@tanstack/react-query@4.28.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-8cGBV5300RHlvYdS4ea+G1JcZIt5CIuprXYFnsWggkmGoC0b5JaqG0fIX3qwDL9PTNkKvG76NGThIWbpXivMrQ==} + /@tanstack/react-query@5.8.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CD+AkXzg8J72JrE6ocmuBEJfGzEzu/bzkD6sFXFDDB5yji9N20JofXZlN6n0+CaPJuIi+e4YLCbGsyPFKkfNQA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 react-native: '*' peerDependenciesMeta: react-dom: @@ -2746,10 +2749,9 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.27.0 + '@tanstack/query-core': 5.8.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.2.0(react@18.2.0) dev: false /@tanstack/react-table@8.9.2(react-dom@18.2.0)(react@18.2.0): @@ -4243,13 +4245,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /copy-anything@3.0.3: - resolution: {integrity: sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw==} - engines: {node: '>=12.13'} - dependencies: - is-what: 4.1.8 - dev: false - /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: @@ -6131,11 +6126,6 @@ packages: get-intrinsic: 1.1.3 dev: true - /is-what@4.1.8: - resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} - engines: {node: '>=12.13'} - dev: false - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -7488,10 +7478,6 @@ packages: functions-have-names: 1.2.3 dev: true - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} - dev: false - /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8001,13 +7987,6 @@ packages: - supports-color dev: true - /superjson@1.12.1: - resolution: {integrity: sha512-HMTj43zvwW5bD+JCZCvFf4DkZQCmiLTen4C+W1Xogj0SPOpnhxsriogM04QmBVGH5b3kcIIOr6FqQ/aoIDx7TQ==} - engines: {node: '>=10'} - dependencies: - copy-anything: 3.0.3 - dev: false - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} From 2316bbebacb85a3f15480bc37c6886f6c0361f1e Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sat, 18 Nov 2023 08:35:54 +0100 Subject: [PATCH 23/23] chore: type improvements (#598) * chore: type improvements * ci: typechecking in pipeline --- .github/workflows/test_v2.yml | 12 +++---- .../components/input/text-input/TextInput.tsx | 6 ++-- .../src/common/hooks-query/useOscSettings.ts | 2 ++ .../src/common/hooks-query/useRundown.ts | 6 ++-- apps/client/src/common/hooks/useFullscreen.ts | 2 ++ .../CuesheetTableSettings.tsx | 4 +-- .../src/features/cuesheet/cuesheetUtils.ts | 3 +- .../modals/integration-modal/OscSettings.tsx | 2 ++ .../modals/settings-modal/AliasesForm.tsx | 2 +- .../modals/settings-modal/AppSettings.tsx | 6 ++-- .../modals/settings-modal/ProjectDataForm.tsx | 2 +- .../settings-modal/ViewSettingsForm.tsx | 2 +- .../event-block/composite/BlockActionMenu.tsx | 2 +- .../src/features/viewers/ViewWrapper.tsx | 35 ++++++++++++++++--- .../features/viewers/countdown/Countdown.tsx | 4 ++- .../__test__/DataProvider.test.ts | 22 ++++++++---- .../src/utils/__tests__/parserUtils.test.ts | 6 ++-- 17 files changed, 84 insertions(+), 34 deletions(-) diff --git a/.github/workflows/test_v2.yml b/.github/workflows/test_v2.yml index e3a70a76b..ac849f32d 100644 --- a/.github/workflows/test_v2.yml +++ b/.github/workflows/test_v2.yml @@ -28,19 +28,19 @@ jobs: run: pnpm install --frozen-lockfile # Run code quality per package - - name: React - Run linter + - name: React - Run linter + TypeScript checks if: always() - run: pnpm lint + run: pnpm lint && tsc --noEmit working-directory: ./apps/client - - name: Server - Run linter + - name: Server - Run linter + TypeScript checks if: always() - run: pnpm lint + run: pnpm lint && tsc --noEmit working-directory: ./apps/server - - name: Utils - Run linter + - name: Utils - Run linter + TypeScript checks if: always() - run: pnpm lint + run: pnpm lint && tsc --noEmit working-directory: ./packages/utils - name: Types - Run linter diff --git a/apps/client/src/common/components/input/text-input/TextInput.tsx b/apps/client/src/common/components/input/text-input/TextInput.tsx index bfc429ad3..3502bb4a0 100644 --- a/apps/client/src/common/components/input/text-input/TextInput.tsx +++ b/apps/client/src/common/components/input/text-input/TextInput.tsx @@ -19,9 +19,11 @@ interface TextInputProps extends BaseProps { isTextArea?: false; } +type ResizeOptions = 'horizontal' | 'vertical' | 'none'; + interface TextAreaProps extends BaseProps { isTextArea: true; - resize?: 'horizontal' | 'vertical' | 'none'; + resize?: ResizeOptions; } type InputProps = TextInputProps | TextAreaProps; @@ -35,7 +37,7 @@ export default function TextInput(props: InputProps) { const textInputProps = useReactiveTextInput(initialText, submitCallback, { submitOnEnter: true }); const textAreaProps = useReactiveTextInput(initialText, submitCallback); - let resize = 'none'; + let resize: ResizeOptions = 'none'; if (isTextArea) { resize = (props as TextAreaProps)?.resize ?? 'none'; } diff --git a/apps/client/src/common/hooks-query/useOscSettings.ts b/apps/client/src/common/hooks-query/useOscSettings.ts index 67becece2..09e84f0da 100644 --- a/apps/client/src/common/hooks-query/useOscSettings.ts +++ b/apps/client/src/common/hooks-query/useOscSettings.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +//@ts-nocheck -- working on it import { useMutation, useQuery } from '@tanstack/react-query'; import { OSCSettings } from 'ontime-types'; diff --git a/apps/client/src/common/hooks-query/useRundown.ts b/apps/client/src/common/hooks-query/useRundown.ts index cd3a02253..d213eddc0 100644 --- a/apps/client/src/common/hooks-query/useRundown.ts +++ b/apps/client/src/common/hooks-query/useRundown.ts @@ -9,21 +9,21 @@ const cachedRundownPlaceholder = { rundown: [], revision: -1 }; // TODO: can we leverage structural sharing to see if data has changed? export default function useRundown() { - return useQuery({ + const { data, status, isError, refetch, isFetching } = useQuery({ queryKey: RUNDOWN, queryFn: fetchCachedRundown, placeholderData: cachedRundownPlaceholder, retry: 5, - select: (data) => data.rundown, retryDelay: (attempt) => attempt * 2500, refetchInterval: queryRefetchInterval, networkMode: 'always', // structuralSharing: (oldData: GetRundownCached | undefined, newData: GetRundownCached) => { // if (oldData === undefined) { - // cachedRundownPlaceholder; + // return cachedRundownPlaceholder; // } // const hasDataChanged = oldData?.revision === newData.revision; // return hasDataChanged ? oldData : newData; // }, }); + return { data: data?.rundown ?? [], status, isError, refetch, isFetching }; } diff --git a/apps/client/src/common/hooks/useFullscreen.ts b/apps/client/src/common/hooks/useFullscreen.ts index 57f8e64aa..51e7fa790 100644 --- a/apps/client/src/common/hooks/useFullscreen.ts +++ b/apps/client/src/common/hooks/useFullscreen.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +//@ts-nocheck -- working on it import { useCallback, useEffect, useState } from 'react'; interface WebkitDocument extends Document { diff --git a/apps/client/src/features/cuesheet/cuesheet-table-settings/CuesheetTableSettings.tsx b/apps/client/src/features/cuesheet/cuesheet-table-settings/CuesheetTableSettings.tsx index a3b125507..e292a681c 100644 --- a/apps/client/src/features/cuesheet/cuesheet-table-settings/CuesheetTableSettings.tsx +++ b/apps/client/src/features/cuesheet/cuesheet-table-settings/CuesheetTableSettings.tsx @@ -1,4 +1,4 @@ -import { memo } from 'react'; +import { memo, ReactNode } from 'react'; import { Button, Checkbox, Switch } from '@chakra-ui/react'; import { Column } from '@tanstack/react-table'; import { OntimeRundownEntry } from 'ontime-types'; @@ -44,7 +44,7 @@ function CuesheetTableSettings(props: CuesheetTableSettingsProps) { defaultChecked={visible} onChange={column.getToggleVisibilityHandler()} /> - {columnHeader} + {columnHeader as ReactNode} ); })} diff --git a/apps/client/src/features/cuesheet/cuesheetUtils.ts b/apps/client/src/features/cuesheet/cuesheetUtils.ts index a85f707fc..13619dfac 100644 --- a/apps/client/src/features/cuesheet/cuesheetUtils.ts +++ b/apps/client/src/features/cuesheet/cuesheetUtils.ts @@ -9,7 +9,7 @@ import { millisToString } from 'ontime-utils'; * @return {string} */ -export const parseField = (field: keyof OntimeRundown, data: unknown): string => { +export const parseField = (field: T, data: unknown): string => { let val; switch (field) { case 'timeStart': @@ -96,6 +96,7 @@ export const makeTable = (headerData: ProjectData, rundown: OntimeRundown, userF rundown.forEach((entry) => { const row: string[] = []; + // @ts-expect-error -- not sure how to type this fieldOrder.forEach((field) => row.push(parseField(field, entry[field]))); data.push(row); }); diff --git a/apps/client/src/features/modals/integration-modal/OscSettings.tsx b/apps/client/src/features/modals/integration-modal/OscSettings.tsx index 4c2d83659..fccd8403b 100644 --- a/apps/client/src/features/modals/integration-modal/OscSettings.tsx +++ b/apps/client/src/features/modals/integration-modal/OscSettings.tsx @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +//@ts-nocheck -- working on it import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { FormControl, Input, Switch } from '@chakra-ui/react'; diff --git a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx index b9a155cf2..cf3e1f12e 100644 --- a/apps/client/src/features/modals/settings-modal/AliasesForm.tsx +++ b/apps/client/src/features/modals/settings-modal/AliasesForm.tsx @@ -48,7 +48,7 @@ export default function AliasesForm() { useEffect(() => { if (data) { - reset(data); + reset({ aliases: data }); } }, [data, reset]); diff --git a/apps/client/src/features/modals/settings-modal/AppSettings.tsx b/apps/client/src/features/modals/settings-modal/AppSettings.tsx index 983ac3d4a..2a697cd8c 100644 --- a/apps/client/src/features/modals/settings-modal/AppSettings.tsx +++ b/apps/client/src/features/modals/settings-modal/AppSettings.tsx @@ -50,7 +50,7 @@ export default function AppSettingsModal() { reset(data); }; - const disableInputs = status === 'loading'; + const disableInputs = status === 'pending'; if (isFetching) { return ; @@ -87,7 +87,7 @@ export default function AppSettingsModal() { description='Protect the editor with a pin code' error={errors.editorKey?.message} > - + - +
; diff --git a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx index bdce1ce4e..76c8806e6 100644 --- a/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx +++ b/apps/client/src/features/modals/settings-modal/ViewSettingsForm.tsx @@ -94,7 +94,7 @@ export default function ViewSettingsForm() { CSS Override Ontime will use the CSS file at its install location.
- {info.cssOverride} + {info?.cssOverride} For more information, see the docs
diff --git a/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx b/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx index c5ecc0f69..4f0b2470e 100644 --- a/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx +++ b/apps/client/src/features/rundown/event-block/composite/BlockActionMenu.tsx @@ -13,7 +13,7 @@ import { EventItemActions } from '../../RundownEntry'; interface BlockActionMenuProps { enableDelete?: boolean; showClone?: boolean; - actionHandler: (action: EventItemActions, payload?: unknown) => void; + actionHandler: (action: EventItemActions, payload?: any) => void; className?: string; } diff --git a/apps/client/src/features/viewers/ViewWrapper.tsx b/apps/client/src/features/viewers/ViewWrapper.tsx index 01bbe9b51..c51069d67 100644 --- a/apps/client/src/features/viewers/ViewWrapper.tsx +++ b/apps/client/src/features/viewers/ViewWrapper.tsx @@ -1,6 +1,6 @@ -/* eslint-disable react/display-name */ import { ComponentType, useMemo } from 'react'; -import { SupportedEvent } from 'ontime-types'; +import { TimeManagerType } from 'common/models/TimeManager.type'; +import { Message, OntimeEvent, ProjectData, SupportedEvent, TimerMessage, ViewSettings } from 'ontime-types'; import { useStore } from 'zustand'; import useProjectData from '../../common/hooks-query/useProjectData'; @@ -9,8 +9,32 @@ import useViewSettings from '../../common/hooks-query/useViewSettings'; import { runtime } from '../../common/stores/runtime'; import { useViewOptionsStore } from '../../common/stores/viewOptions'; -const withData =

(Component: ComponentType

) => { - return (props: Partial

) => { +type WithDataProps = { + isMirrored: boolean; + pres: TimerMessage; + publ: Message; + lower: Message; + eventNow: OntimeEvent | null; + publicEventNow: OntimeEvent | null; + eventNext: OntimeEvent | null; + publicEventNext: OntimeEvent | null; + time: TimeManagerType; + events: OntimeEvent[]; + backstageEvents: OntimeEvent[]; + selectedId: string | null; + publicSelectedId: string | null; + nextId: string | null; + general: ProjectData; + viewSettings: ViewSettings; + onAir: boolean; +}; + +function getDisplayName(Component: React.ComponentType): string { + return Component.displayName || Component.name || 'Component'; +} + +const withData =

(Component: ComponentType

) => { + const WithDataComponent = (props: P) => { // persisted app state const isMirrored = useViewOptionsStore((state) => state.mirror); @@ -84,6 +108,9 @@ const withData =

(Component: ComponentType

) => { /> ); }; + + WithDataComponent.displayName = `WithData(${getDisplayName(Component)})`; + return WithDataComponent; }; export default withData; diff --git a/apps/client/src/features/viewers/countdown/Countdown.tsx b/apps/client/src/features/viewers/countdown/Countdown.tsx index c43ea097d..441ded578 100644 --- a/apps/client/src/features/viewers/countdown/Countdown.tsx +++ b/apps/client/src/features/viewers/countdown/Countdown.tsx @@ -121,7 +121,9 @@ export default function Countdown(props: CountdownProps) {

{clock}
-
{getLocalizedString(`countdown.${runningMessage}`)}
+ {runningMessage !== TimerMessage.unhandled && ( +
{getLocalizedString(`countdown.${runningMessage}`)}
+ )} {formattedTimer} diff --git a/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts b/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts index da717cc46..bcd83db7a 100644 --- a/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts +++ b/apps/server/src/classes/data-provider/__test__/DataProvider.test.ts @@ -1,3 +1,4 @@ +import { Alias, DatabaseModel, OntimeRundown, Settings } from 'ontime-types'; import { safeMerge } from '../DataProvider.utils.js'; describe('safeMerge', () => { @@ -5,8 +6,10 @@ describe('safeMerge', () => { rundown: [], project: { title: 'existing title', + description: 'existing description', publicUrl: 'existing public URL', backstageUrl: 'existing backstageUrl', + publicInfo: 'existing backstageInfo', backstageInfo: 'existing backstageInfo', }, settings: { @@ -42,7 +45,7 @@ describe('safeMerge', () => { onFinish: [], }, }, - }; + } as DatabaseModel; it('returns existing data if new data is not provided', () => { const mergedData = safeMerge(existing, undefined); @@ -51,7 +54,7 @@ describe('safeMerge', () => { it('merges the rundown key', () => { const newData = { - rundown: [{ name: 'item 1' }, { name: 'item 2' }], + rundown: [{ title: 'item 1' }, { title: 'item 2' }] as OntimeRundown, }; const mergedData = safeMerge(existing, newData); expect(mergedData.rundown).toEqual(newData.rundown); @@ -64,9 +67,11 @@ describe('safeMerge', () => { publicInfo: 'new public info', }, }; + // @ts-expect-error -- just testing const mergedData = safeMerge(existing, newData); expect(mergedData.project).toEqual({ title: 'new title', + description: 'existing description', publicUrl: 'existing public URL', publicInfo: 'new public info', backstageUrl: 'existing backstageUrl', @@ -79,7 +84,7 @@ describe('safeMerge', () => { settings: { serverPort: 3000, language: 'pt', - }, + } as Settings, }; const mergedData = safeMerge(existing, newData); expect(mergedData.settings).toEqual({ @@ -108,6 +113,7 @@ describe('safeMerge', () => { }, }, }; + //@ts-expect-error -- testing partial merge const mergedData = safeMerge(existing, newData); expect(mergedData.osc).toEqual({ portIn: 7777, @@ -135,7 +141,7 @@ describe('safeMerge', () => { it('should merge the aliases key when present', () => { const existingData = { rundown: [], - event: { + project: { title: '', publicUrl: '', publicInfo: '', @@ -183,10 +189,13 @@ describe('safeMerge', () => { onFinish: [], }, }, - }; + } as DatabaseModel; const newData = { - aliases: ['alias1', 'alias2'], + aliases: [ + { enabled: true, alias: 'alias1', pathAndParams: '' }, + { enabled: true, alias: 'alias2', pathAndParams: '' }, + ] as Alias[], }; const mergedData = safeMerge(existingData, newData); @@ -217,6 +226,7 @@ describe('safeMerge', () => { user3: 'David', }; + //@ts-expect-error -- testing partial merge const result = safeMerge(existing, newData); expect(result.userFields).toEqual(expected); }); diff --git a/apps/server/src/utils/__tests__/parserUtils.test.ts b/apps/server/src/utils/__tests__/parserUtils.test.ts index a69957328..79f8f5db5 100644 --- a/apps/server/src/utils/__tests__/parserUtils.test.ts +++ b/apps/server/src/utils/__tests__/parserUtils.test.ts @@ -34,13 +34,13 @@ describe('mergeObject()', () => { third: 'yes', }; const b = { - first: 0, + first: 'no', second: null, third: '', }; const merged = mergeObject(a, b); expect(merged).toStrictEqual({ - first: 0, + first: 'no', second: null, third: '', }); @@ -57,6 +57,7 @@ describe('mergeObject()', () => { third: '', forth: 'not-this', }; + // @ts-expect-error -- testing changing type const merged = mergeObject(a, b); expect(merged).toStrictEqual({ first: 0, @@ -83,6 +84,7 @@ describe('mergeObject()', () => { }, }; + // @ts-expect-error -- testing missing property const merged = mergeObject(a, b); expect(merged.name).toBe('Doe');