From 6a4407de7615665e78a9554d11ce33a893887e2c Mon Sep 17 00:00:00 2001 From: sabril <5334504+saturninoabril@users.noreply.github.com> Date: Tue, 6 May 2025 11:27:18 +0800 Subject: [PATCH] E2E/Playwright: Refactor and fix tests for scheduled posts (#30871) --- e2e-tests/.ci/server.generate.sh | 2 +- e2e-tests/playwright/README.md | 2 +- e2e-tests/playwright/lib/rollup.config.js | 1 + .../playwright/lib/src/browser_context.ts | 6 +- e2e-tests/playwright/lib/src/constant.ts | 4 + e2e-tests/playwright/lib/src/global_setup.ts | 19 +- e2e-tests/playwright/lib/src/index.ts | 51 +- .../lib/src/server/default_config.ts | 2 +- e2e-tests/playwright/lib/src/server/index.ts | 2 +- e2e-tests/playwright/lib/src/server/user.ts | 16 +- e2e-tests/playwright/lib/src/test_fixture.ts | 4 +- .../src/ui/components/channels/center_view.ts | 43 +- .../channels/delete_scheduled_post_modal.ts | 25 + .../src/ui/components/channels/draft_post.ts | 44 + .../lib/src/ui/components/channels/post.ts | 9 +- .../src/ui/components/channels/post_create.ts | 16 +- .../channels/schedule_message_menu.ts | 32 + .../channels/schedule_message_modal.ts | 107 + .../channels/scheduled_draft_menu.ts | 24 - .../ui/components/channels/scheduled_post.ts | 54 + .../channels/scheduled_post_indicator.ts | 34 + .../channels/send_message_now_modal.ts | 25 + .../ui/components/channels/sidebar_left.ts | 13 +- .../ui/components/channels/sidebar_right.ts | 10 +- .../playwright/lib/src/ui/components/index.ts | 41 +- .../playwright/lib/src/ui/pages/channels.ts | 61 +- .../playwright/lib/src/ui/pages/drafts.ts | 125 +- .../playwright/lib/src/ui/pages/index.ts | 12 +- .../lib/src/ui/pages/scheduled_draft.ts | 161 -- .../lib/src/ui/pages/scheduled_posts.ts | 80 + e2e-tests/playwright/package-lock.json | 2508 ++++++----------- e2e-tests/playwright/package.json | 6 +- e2e-tests/playwright/playwright.config.ts | 2 +- .../profile/popover_fields.spec.ts | 4 +- .../create_scheduled_draft.spec.ts | 411 --- .../scheduled_messages.spec.ts | 519 ++++ .../sidebar_right/page_up_down_scroll.spec.ts | 4 +- .../scheduled_post_indicator.tsx | 5 +- .../short_scheduled_post_indicator.tsx | 5 +- .../send_post_options/core_menu_options.tsx | 3 + .../recent_used_custom_date.tsx | 1 + .../custom_status/date_time_input.tsx | 2 + .../src/components/drafts/draft_row.tsx | 8 +- .../src/components/drafts/panel/panel.tsx | 6 + 44 files changed, 2060 insertions(+), 2449 deletions(-) create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/delete_scheduled_post_modal.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/draft_post.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_menu.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_modal.ts delete mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/scheduled_draft_menu.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post_indicator.ts create mode 100644 e2e-tests/playwright/lib/src/ui/components/channels/send_message_now_modal.ts delete mode 100644 e2e-tests/playwright/lib/src/ui/pages/scheduled_draft.ts create mode 100644 e2e-tests/playwright/lib/src/ui/pages/scheduled_posts.ts delete mode 100644 e2e-tests/playwright/specs/functional/channels/scheduled_drafts/create_scheduled_draft.spec.ts create mode 100644 e2e-tests/playwright/specs/functional/channels/scheduled_messages/scheduled_messages.spec.ts diff --git a/e2e-tests/.ci/server.generate.sh b/e2e-tests/.ci/server.generate.sh index 6b4775af38..4cc125b1b5 100755 --- a/e2e-tests/.ci/server.generate.sh +++ b/e2e-tests/.ci/server.generate.sh @@ -296,7 +296,7 @@ $(if mme2e_is_token_in_list "playwright" "$ENABLED_DOCKER_SERVICES"; then PW_RESET_BEFORE_TEST: "false" PW_HEADLESS: "true" PW_SLOWMO: 0 - PW_WORKERS: 2 + PW_WORKERS: 1 PW_SNAPSHOT_ENABLE: "false" PW_PERCY_ENABLE: "false" ulimits: diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index 06c402b8e7..d93ba30c6e 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -84,7 +84,7 @@ npm run playwright-ui #### 1. Run Playwright's docker container -Change to the `e2e-tests/playwright` directory, then run the docker container. (See https://playwright.dev/docs/docker for reference.) +Change to the `./` project directory, then run the docker container. (See https://playwright.dev/docs/docker for reference.) ```bash docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.52.0-noble /bin/bash diff --git a/e2e-tests/playwright/lib/rollup.config.js b/e2e-tests/playwright/lib/rollup.config.js index e5e2f5760b..bdad6e1ae9 100644 --- a/e2e-tests/playwright/lib/rollup.config.js +++ b/e2e-tests/playwright/lib/rollup.config.js @@ -28,6 +28,7 @@ export default { '@axe-core/playwright', '@percy/playwright', 'dotenv', + 'luxon', 'node:fs/promises', 'node:path', 'node:fs', diff --git a/e2e-tests/playwright/lib/src/browser_context.ts b/e2e-tests/playwright/lib/src/browser_context.ts index 3b23a6b149..2c1e9fddb2 100644 --- a/e2e-tests/playwright/lib/src/browser_context.ts +++ b/e2e-tests/playwright/lib/src/browser_context.ts @@ -32,12 +32,12 @@ export class TestBrowser { const channelsPage = new pages.ChannelsPage(page); const systemConsolePage = new pages.SystemConsolePage(page); - const scheduledDraftPage = new pages.ScheduledDraftPage(page); - const draftPage = new pages.DraftPage(page); + const scheduledPostsPage = new pages.ScheduledPostsPage(page); + const draftsPage = new pages.DraftsPage(page); this.context = context; - return {context, page, channelsPage, systemConsolePage, scheduledDraftPage, draftPage}; + return {context, page, channelsPage, systemConsolePage, scheduledPostsPage, draftsPage}; } async close() { diff --git a/e2e-tests/playwright/lib/src/constant.ts b/e2e-tests/playwright/lib/src/constant.ts index 01dd425610..a7bebd373a 100644 --- a/e2e-tests/playwright/lib/src/constant.ts +++ b/e2e-tests/playwright/lib/src/constant.ts @@ -4,3 +4,7 @@ export const appsPluginId = 'com.mattermost.apps'; export const callsPluginId = 'com.mattermost.calls'; export const playbooksPluginId = 'playbooks'; + +// Remote users hour limit taken from webapp/channels/src/utils/constants.ts +export const REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY = 22; +export const REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY = 6; diff --git a/e2e-tests/playwright/lib/src/global_setup.ts b/e2e-tests/playwright/lib/src/global_setup.ts index 33b0ba1b1b..04adb8ae57 100644 --- a/e2e-tests/playwright/lib/src/global_setup.ts +++ b/e2e-tests/playwright/lib/src/global_setup.ts @@ -24,6 +24,9 @@ export async function baseGlobalSetup() { ({client: adminClient, user: adminUser} = await makeClient(defaultAdmin)); } + // Print playwright configs + printPlaywrightTestConfig(); + await sysadminSetup(adminClient, adminUser); } @@ -69,6 +72,14 @@ async function sysadminSetup(client: Client4, user: UserProfile | null) { await printPluginDetails(client); } +function printPlaywrightTestConfig() { + // eslint-disable-next-line no-console + console.log(`Playwright Test Config: + - Headless = ${testConfig.headless} + - SlowMo = ${testConfig.slowMo} + - Workers = ${testConfig.workers}`); +} + async function printLicenseInfo(client: Client4) { const license = await client.getClientLicenseOld(); // eslint-disable-next-line no-console @@ -94,7 +105,7 @@ async function printClientInfo(client: Client4) { - TelemetryId = ${config.TelemetryId} - ServiceEnvironment = ${config.ServiceEnvironment}`); - const {LogSettings, ServiceSettings, FeatureFlags} = await client.getConfig(); + const {LogSettings, ServiceSettings, PluginSettings, FeatureFlags} = await client.getConfig(); // eslint-disable-next-line no-console console.log(`Notable Server Config: - ServiceSettings.EnableSecurityFixAlert = ${ServiceSettings?.EnableSecurityFixAlert} @@ -108,6 +119,12 @@ async function printClientInfo(client: Client4) { .map(([key, value]) => ` - ${key} = ${value}`) .join('\n'), ); + + // eslint-disable-next-line no-console + console.log(`Plugin Settings: + - Enable = ${PluginSettings?.Enable} + - EnableUploads = ${PluginSettings?.EnableUploads} + - AutomaticPrepackagedPlugins = ${PluginSettings?.AutomaticPrepackagedPlugins}`); } async function printPluginDetails(client: Client4) { diff --git a/e2e-tests/playwright/lib/src/index.ts b/e2e-tests/playwright/lib/src/index.ts index 75c342614b..9216a5de97 100644 --- a/e2e-tests/playwright/lib/src/index.ts +++ b/e2e-tests/playwright/lib/src/index.ts @@ -14,9 +14,56 @@ export { LoginPage, ResetPasswordPage, SignupPage, - ScheduledDraftPage, + ScheduledPostsPage, SystemConsolePage, - DraftPage, + DraftsPage, } from './ui/pages'; +export { + components, + GlobalHeader, + SearchPopover, + ChannelsCenterView, + ChannelsSidebarLeft, + ChannelsSidebarRight, + ChannelsAppBar, + ChannelsHeader, + ChannelsPostCreate, + ChannelsPostEdit, + ChannelsPost, + DraftPost, + FindChannelsModal, + DeletePostModal, + DeleteScheduledPostModal, + SettingsModal, + PostDotMenu, + PostMenu, + ThreadFooter, + Footer, + MainHeader, + PostReminderMenu, + EmojiGifPicker, + GenericConfirmModal, + ScheduleMessageMenu, + ScheduleMessageModal, + ScheduledPostIndicator, + ScheduledDraftModal, + ScheduledPost, + SendMessageNowModal, + SystemConsoleSidebar, + SystemConsoleNavbar, + SystemUsers, + SystemUsersFilterPopover, + SystemUsersFilterMenu, + SystemUsersColumnToggleMenu, + SystemConsoleFeatureDiscovery, + SystemConsoleMobileSecurity, + MessagePriority, + UserProfilePopover, + UserAccountMenu, + DeletePostConfirmationDialog, + RestorePostConfirmationDialog, + ProfileModal, +} from './ui/components'; + export {TestArgs, ScreenshotOptions} from './types'; diff --git a/e2e-tests/playwright/lib/src/server/default_config.ts b/e2e-tests/playwright/lib/src/server/default_config.ts index 73eb0c4a7e..45bffb2b6b 100644 --- a/e2e-tests/playwright/lib/src/server/default_config.ts +++ b/e2e-tests/playwright/lib/src/server/default_config.ts @@ -396,7 +396,7 @@ const defaultServerConfig: AdminConfig = { AboutLink: 'https://mattermost.com/pl/about-mattermost', HelpLink: 'https://mattermost.com/pl/help/', ReportAProblemLink: 'https://mattermost.com/pl/report-a-bug', - ReportAProblemType: 'link', + ReportAProblemType: 'default', ReportAProblemMail: '', AllowDownloadLogs: true, ForgotPasswordLink: '', diff --git a/e2e-tests/playwright/lib/src/server/index.ts b/e2e-tests/playwright/lib/src/server/index.ts index b177d2bac8..b381bfd1bf 100644 --- a/e2e-tests/playwright/lib/src/server/index.ts +++ b/e2e-tests/playwright/lib/src/server/index.ts @@ -7,4 +7,4 @@ export {getOnPremServerConfig} from './default_config'; export {initSetup, getAdminClient} from './init'; export {createRandomPost} from './post'; export {createRandomTeam} from './team'; -export {createNewUserProfile, createRandomUser, getDefaultAdminUser} from './user'; +export {createNewUserProfile, createRandomUser, getDefaultAdminUser, isOutsideRemoteUserHour} from './user'; diff --git a/e2e-tests/playwright/lib/src/server/user.ts b/e2e-tests/playwright/lib/src/server/user.ts index a6330b349e..ff81eda854 100644 --- a/e2e-tests/playwright/lib/src/server/user.ts +++ b/e2e-tests/playwright/lib/src/server/user.ts @@ -2,10 +2,12 @@ // See LICENSE.txt for license information. import {Client4} from '@mattermost/client'; -import {UserProfile} from '@mattermost/types/users'; +import {UserProfile, UserTimezone} from '@mattermost/types/users'; +import {DateTime} from 'luxon'; import {getRandomId} from '@/util'; import {testConfig} from '@/test_config'; +import {REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY, REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY} from '@/constant'; export async function createNewUserProfile(client: Client4, prefix = 'user') { const randomUser = createRandomUser(prefix); @@ -42,3 +44,15 @@ export function getDefaultAdminUser() { return admin as UserProfile; } + +export function isOutsideRemoteUserHour(userTz: UserTimezone | undefined) { + const timezone = (userTz?.useAutomaticTimezone ? userTz?.automaticTimezone : userTz?.manualTimezone) || 'UTC'; + + const teammateUserDate = DateTime.local().setZone(timezone); + + const currentHour = teammateUserDate.hour; + return ( + currentHour >= REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY || + currentHour < REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY + ); +} diff --git a/e2e-tests/playwright/lib/src/test_fixture.ts b/e2e-tests/playwright/lib/src/test_fixture.ts index 721a3ab733..f104b5cc0b 100644 --- a/e2e-tests/playwright/lib/src/test_fixture.ts +++ b/e2e-tests/playwright/lib/src/test_fixture.ts @@ -25,6 +25,7 @@ import { createRandomUser, getAdminClient, initSetup, + isOutsideRemoteUserHour, } from './server'; import {hideDynamicChannelsContent, waitForAnimationEnd, waitUntil} from './test_action'; import {pages} from './ui/pages'; @@ -90,6 +91,7 @@ export class PlaywrightExtended { // ./server readonly createNewUserProfile; + readonly isOutsideRemoteUserHour; // ./visual readonly matchSnapshot; @@ -131,7 +133,7 @@ export class PlaywrightExtended { this.ensurePluginsLoaded = ensurePluginsLoaded; this.initSetup = initSetup; this.getAdminClient = getAdminClient; - + this.isOutsideRemoteUserHour = isOutsideRemoteUserHour; // ./test_action this.hideDynamicChannelsContent = hideDynamicChannelsContent; this.waitForAnimationEnd = waitForAnimationEnd; diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/center_view.ts b/e2e-tests/playwright/lib/src/ui/components/channels/center_view.ts index 0109e0abb0..33c47df521 100644 --- a/e2e-tests/playwright/lib/src/ui/components/channels/center_view.ts +++ b/e2e-tests/playwright/lib/src/ui/components/channels/center_view.ts @@ -7,6 +7,7 @@ import ChannelsHeader from './header'; import ChannelsPostCreate from './post_create'; import ChannelsPostEdit from './post_edit'; import ChannelsPost from './post'; +import ScheduledPostIndicator from './scheduled_post_indicator'; import {duration, hexToRgb} from '@/util'; import {waitUntil} from '@/test_action'; @@ -18,14 +19,7 @@ export default class ChannelsCenterView { readonly header; readonly postCreate; readonly scheduledDraftOptions; - readonly postBoxIndicator; - readonly scheduledDraftChannelIcon; - readonly scheduledDraftChannelInfoMessage; - readonly scheduledDraftChannelInfoMessageLocator; - readonly scheduledDraftDMChannelLocator; - readonly scheduledDraftChannelInfoMessageText; - readonly scheduledDraftDMChannelLocatorString; - readonly scheduledDraftSeeAllLink; + readonly scheduledPostIndicator; readonly postEdit; readonly editedPostIcon; readonly channelBanner; @@ -34,18 +28,11 @@ export default class ChannelsCenterView { this.container = container; this.page = page; - this.scheduledDraftChannelInfoMessageLocator = 'span:has-text("Message scheduled for")'; - this.scheduledDraftDMChannelLocatorString = 'div.ScheduledPostIndicator span a'; this.header = new ChannelsHeader(this.container.locator('.channel-header')); this.postCreate = new ChannelsPostCreate(container.getByTestId('post-create')); this.scheduledDraftOptions = new ChannelsPostCreate(container.locator('#dropdown_send_post_options')); this.postEdit = new ChannelsPostEdit(container.locator('.post-edit__container')); - this.postBoxIndicator = container.locator('div.postBoxIndicator'); - this.scheduledDraftChannelIcon = container.locator('#create_post i.icon-draft-indicator'); - this.scheduledDraftChannelInfoMessage = container.locator('div.ScheduledPostIndicator span'); - this.scheduledDraftChannelInfoMessageText = container.locator(this.scheduledDraftChannelInfoMessageLocator); - this.scheduledDraftDMChannelLocator = container.locator(this.scheduledDraftDMChannelLocatorString); - this.scheduledDraftSeeAllLink = container.locator('a:has-text("See all")'); + this.scheduledPostIndicator = new ScheduledPostIndicator(container.getByTestId('scheduledPostIndicator')); this.editedPostIcon = (postID: string) => container.locator(`#postEdited_${postID}`); this.channelBanner = container.getByTestId('channel_banner_container'); } @@ -59,14 +46,6 @@ export default class ChannelsCenterView { await this.postCreate.postMessage(message, files); } - /** - * Click on "See all scheduled messages" - */ - async clickOnSeeAllscheduledDrafts() { - await this.scheduledDraftSeeAllLink.isVisible(); - await this.scheduledDraftSeeAllLink.click(); - } - /** * Return the first post in the Center */ @@ -140,22 +119,6 @@ export default class ChannelsCenterView { ); } - async goToScheduledDraftsFromDMChannel() { - if (await this.scheduledDraftDMChannelLocator.isVisible()) { - await this.scheduledDraftDMChannelLocator.click(); - return; - } - await this.scheduledDraftSeeAllLink.isVisible(); - await this.scheduledDraftSeeAllLink.click(); - } - - async verifyscheduledDraftChannelInfo() { - await this.postBoxIndicator.isVisible(); - await this.scheduledDraftChannelIcon.isVisible(); - const messageLocator = this.scheduledDraftChannelInfoMessage.first(); - await expect(messageLocator).toContainText('Message scheduled for'); - } - async clickOnLastEditedPost(postID: string | null) { if (postID) { await this.editedPostIcon(postID).click(); diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/delete_scheduled_post_modal.ts b/e2e-tests/playwright/lib/src/ui/components/channels/delete_scheduled_post_modal.ts new file mode 100644 index 0000000000..f9df20fab3 --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/delete_scheduled_post_modal.ts @@ -0,0 +1,25 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class DeleteScheduledPostModal { + readonly container: Locator; + readonly body: Locator; + readonly deleteButton: Locator; + readonly cancelButton: Locator; + readonly closeButton: Locator; + + constructor(container: Locator) { + this.container = container; + + this.body = container.locator('.modal-body'); + this.deleteButton = container.locator('button:has-text("Yes, delete")'); + this.cancelButton = container.locator('button:has-text("Cancel")'); + this.closeButton = container.getByRole('button', {name: 'Close'}); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/draft_post.ts b/e2e-tests/playwright/lib/src/ui/components/channels/draft_post.ts new file mode 100644 index 0000000000..36d5a39650 --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/draft_post.ts @@ -0,0 +1,44 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class DraftPost { + readonly container: Locator; + + readonly panelHeader; + readonly panelBody; + + readonly postBody; + readonly postHeader; + readonly postImage; + + readonly deleteButton; + readonly editButton; + readonly scheduleButton; + readonly sendButton; + + constructor(container: Locator) { + this.container = container; + + this.panelHeader = container.locator('.PanelHeader'); + this.panelBody = container.locator('.DraftPanelBody'); + + this.postBody = container.locator('.post__body'); + this.postHeader = container.locator('.post__header'); + this.postImage = container.locator('.post__img'); + + this.deleteButton = container.locator('#draft_icon-trash-can-outline_delete'); + this.editButton = container.locator('#draft_icon-pencil-outline_edit'); + this.scheduleButton = container.locator('#draft_icon-clock-send-outline_reschedule'); + this.sendButton = container.locator('#draft_icon-send-outline_send'); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } + + async hover() { + await this.container.hover(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/post.ts b/e2e-tests/playwright/lib/src/ui/components/channels/post.ts index 1ce409cae6..21fb5eb79d 100644 --- a/e2e-tests/playwright/lib/src/ui/components/channels/post.ts +++ b/e2e-tests/playwright/lib/src/ui/components/channels/post.ts @@ -51,7 +51,14 @@ export default class ChannelsPost { return this.profileIcon.getByAltText(`${username} profile image`); } - async openRhs() { + async openAThread() { + await this.container.hover(); + await this.postMenu.toBeVisible(); + await this.postMenu.replyButton.waitFor(); + await this.postMenu.replyButton.click(); + } + + async reply() { await this.container.hover(); await this.postMenu.toBeVisible(); await this.postMenu.reply(); diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/post_create.ts b/e2e-tests/playwright/lib/src/ui/components/channels/post_create.ts index f6fd368c84..a34a033f19 100644 --- a/e2e-tests/playwright/lib/src/ui/components/channels/post_create.ts +++ b/e2e-tests/playwright/lib/src/ui/components/channels/post_create.ts @@ -16,7 +16,7 @@ export default class ChannelsPostCreate { readonly attachmentButton; readonly emojiButton; readonly sendMessageButton; - readonly scheduleDraftMessageButton; + readonly scheduleMessageButton; readonly priorityButton; readonly suggestionList; readonly filePreview; @@ -33,7 +33,7 @@ export default class ChannelsPostCreate { this.attachmentButton = container.locator('#fileUploadButton'); this.emojiButton = container.getByLabel('select an emoji'); this.sendMessageButton = container.getByTestId('SendMessageButton'); - this.scheduleDraftMessageButton = container.getByLabel('Schedule message'); + this.scheduleMessageButton = container.getByLabel('Schedule message'); this.priorityButton = container.getByLabel('Message priority'); this.suggestionList = container.getByTestId('suggestionList'); this.filePreview = container.locator('.file-preview__container'); @@ -79,18 +79,6 @@ export default class ChannelsPostCreate { await this.sendMessageButton.click(); } - /** - * Click on Scheduled Draft button to open options - */ - async clickOnScheduleDraftDropdownButton() { - await expect(this.input).toBeVisible(); - - await expect(this.scheduleDraftMessageButton).toBeVisible(); - await expect(this.scheduleDraftMessageButton).toBeEnabled(); - - await this.scheduleDraftMessageButton.click(); - } - /** * Opens the message priority menu */ diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_menu.ts b/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_menu.ts new file mode 100644 index 0000000000..ad9e362bec --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_menu.ts @@ -0,0 +1,32 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class ScheduleMessageMenu { + readonly container: Locator; + + readonly tomorrowMenuItem; + readonly mondayMenuItem; + readonly nextMondayMenuItem; + readonly recentlyUsedCustomTimeMenuItem; + readonly customTimeMenuItem; + + constructor(container: Locator) { + this.container = container; + + this.tomorrowMenuItem = container.getByTestId('scheduling_time_tomorrow_9_am'); + this.mondayMenuItem = container.getByTestId('scheduling_time_monday_9_am'); + this.nextMondayMenuItem = container.getByTestId('scheduling_time_next_monday_9_am'); + this.recentlyUsedCustomTimeMenuItem = container.getByTestId('recently_used_custom_time'); + this.customTimeMenuItem = container.getByText('Choose a custom time'); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } + + async selectCustomTime() { + await this.customTimeMenuItem.click(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_modal.ts b/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_modal.ts new file mode 100644 index 0000000000..586bcd0adb --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/schedule_message_modal.ts @@ -0,0 +1,107 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class ScheduleMessageModal { + readonly container: Locator; + readonly dateButton: Locator; + readonly timeButton: Locator; + readonly timeOptionDropdown: Locator; + readonly closeButton: Locator; + readonly scheduleButton: Locator; + readonly cancelButton: Locator; + + constructor(container: Locator) { + this.container = container; + this.dateButton = container.locator('#customStatus__calendar-input'); + this.timeButton = container.getByTestId('time_button'); + this.timeOptionDropdown = container.getByLabel('Choose a time'); + this.closeButton = container.getByRole('button', {name: 'Close'}); + this.scheduleButton = container.locator('button:has-text("Schedule")'); + this.cancelButton = container.locator('button:has-text("Cancel")'); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } + + getDaySuffix(day: number): string { + if (day > 3 && day < 21) return 'th'; + + switch (day % 10) { + case 1: + return 'st'; + case 2: + return 'nd'; + case 3: + return 'rd'; + default: + return 'th'; + } + } + + dateLocator(day: number, month: string, dayOfWeek: string) { + const daySuffix = this.getDaySuffix(day); + const name = `${day}${daySuffix} ${month} (${dayOfWeek})`; + return this.container.getByRole('button', {name}); + } + + async selectDate(dayFromToday: number = 0) { + await this.dateButton.click(); + + const pacificDate = new Date(); + const originDate = new Date(); + + if (dayFromToday) { + pacificDate.setDate(pacificDate.getDate() + dayFromToday); + } + + const day = pacificDate.getDate(); + const month = pacificDate.toLocaleString('default', {month: 'long'}); + const dayOfWeek = pacificDate.toLocaleDateString('en-US', {weekday: 'long'}); + + const dateLocator = this.dateLocator(day, month, dayOfWeek); + + const isMonthChanged = pacificDate.getMonth() !== originDate.getMonth(); + if (!(await dateLocator.isVisible()) && isMonthChanged) { + await this.container.getByLabel('Go to next month').click(); + } + + await dateLocator.click(); + + // if day is less than 9 then add a 0 in front of the day + if (day < 9) { + return `${month} 0${day}`; + } + + return `${month} ${day}`; + } + + async selectTime(optionIndex: number = 0) { + await this.timeButton.click(); + const timeButton = this.timeOptionDropdown.getByTestId(`time_option_${optionIndex}-button`); + await expect(timeButton).toBeVisible(); + await timeButton.click(); + + return await timeButton.textContent(); + } + + async scheduleMessage(dayFromToday: number = 0, timeOptionIndex: number = 0) { + await this.toBeVisible(); + + const selectedDate = await this.selectDate(dayFromToday); + const fromDateButton = await this.dateButton.inputValue(); + + const selectedTime = await this.selectTime(timeOptionIndex); + await this.scheduleButton.click(); + + // if selectedDate is Today or Tomorrow then return Today or Tomorrow + if (fromDateButton === 'Today' || fromDateButton === 'Tomorrow') { + return {selectedDate: fromDateButton, selectedTime}; + } + + // if selectedDate is a date in the future then return the date + return {selectedDate, selectedTime}; + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_draft_menu.ts b/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_draft_menu.ts deleted file mode 100644 index 4a0a602d49..0000000000 --- a/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_draft_menu.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import {Locator, expect} from '@playwright/test'; - -export default class ScheduledDraftMenu { - readonly container: Locator; - - readonly scheduleDraftMessageCustomTimeOption; - - constructor(container: Locator) { - this.container = container; - - this.scheduleDraftMessageCustomTimeOption = container.getByText('Choose a custom time'); - } - - async toBeVisible() { - await expect(this.container).toBeVisible(); - } - - async selectCustomTime() { - await this.scheduleDraftMessageCustomTimeOption.click(); - } -} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post.ts b/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post.ts new file mode 100644 index 0000000000..b1317a2163 --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post.ts @@ -0,0 +1,54 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class ScheduledPost { + readonly container: Locator; + + readonly panelHeader; + readonly panelBody; + + readonly postBody; + readonly postHeader; + readonly postImage; + + readonly deleteButton; + readonly editButton; + readonly copyTextButton; + readonly rescheduleButton; + readonly sendNowButton; + + readonly editTextBox; + readonly saveButton; + readonly cancelButton; + + constructor(container: Locator) { + this.container = container; + + this.panelHeader = container.locator('.PanelHeader'); + this.panelBody = container.locator('.DraftPanelBody'); + + this.postBody = container.locator('.post__body'); + this.postHeader = container.locator('.post__header'); + this.postImage = container.locator('.post__img'); + + this.deleteButton = container.locator('#draft_icon-trash-can-outline_delete'); + this.editButton = container.locator('#draft_icon-pencil-outline_edit'); + this.copyTextButton = container.locator('#draft_icon-content-copy_copy_text'); + this.rescheduleButton = container.locator('#draft_icon-clock-send-outline_reschedule'); + this.sendNowButton = container.locator('#draft_icon-send-outline_sendNow'); + + this.editTextBox = container.getByTestId('edit_textbox'); + this.saveButton = container.locator('button:has-text("Save")'); + this.cancelButton = container.locator('button:has-text("Cancel")'); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } + + async hover() { + await this.container.hover(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post_indicator.ts b/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post_indicator.ts new file mode 100644 index 0000000000..a515306b73 --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/scheduled_post_indicator.ts @@ -0,0 +1,34 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class ScheduledPostIndicator { + readonly container: Locator; + + readonly icon; + readonly messageText; + readonly seeAllLink; + readonly scheduledMessageLink; + + constructor(container: Locator) { + this.container = container; + + this.icon = container.getByTestId('scheduledPostIcon'); + this.messageText = container.locator('span').first(); + this.seeAllLink = container.locator('a:has-text("See all")'); + this.scheduledMessageLink = container.locator('a:has-text("scheduled message")'); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } + + async toBeNotVisible() { + await expect(this.container).not.toBeVisible(); + } + + async getText() { + return await this.messageText.innerText(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/send_message_now_modal.ts b/e2e-tests/playwright/lib/src/ui/components/channels/send_message_now_modal.ts new file mode 100644 index 0000000000..0ed57e9857 --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/components/channels/send_message_now_modal.ts @@ -0,0 +1,25 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Locator, expect} from '@playwright/test'; + +export default class SendMessageNowModal { + readonly container: Locator; + readonly body: Locator; + readonly sendNowButton: Locator; + readonly cancelButton: Locator; + readonly closeButton: Locator; + + constructor(container: Locator) { + this.container = container; + + this.body = container.locator('.modal-body'); + this.sendNowButton = container.locator('button:has-text("Yes, send now")'); + this.cancelButton = container.locator('button:has-text("Cancel")'); + this.closeButton = container.getByRole('button', {name: 'Close'}); + } + + async toBeVisible() { + await expect(this.container).toBeVisible(); + } +} diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_left.ts b/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_left.ts index 7d2e632b5a..d48c120412 100644 --- a/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_left.ts +++ b/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_left.ts @@ -6,28 +6,19 @@ import {Locator, expect} from '@playwright/test'; export default class ChannelsSidebarLeft { readonly container: Locator; readonly findChannelButton; - readonly scheduledDraftCountonLHS; + readonly scheduledPostBadge; constructor(container: Locator) { this.container = container; this.findChannelButton = container.getByRole('button', {name: 'Find Channels'}); - this.scheduledDraftCountonLHS = container.locator('span.scheduledPostBadge'); + this.scheduledPostBadge = container.locator('span.scheduledPostBadge'); } async toBeVisible() { await expect(this.container).toBeVisible(); } - async assertNoPendingScheduledDraft() { - await expect(this.scheduledDraftCountonLHS).not.toBeVisible(); - } - - async assertscheduledDraftCountLHS(count: string) { - await expect(this.scheduledDraftCountonLHS).toBeVisible(); - await expect(this.scheduledDraftCountonLHS).toHaveText(count); - } - /** * Clicks on the sidebar channel link with the given name. * It can be any sidebar item name including channels, direct messages, or group messages, threads, etc. diff --git a/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_right.ts b/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_right.ts index 834d17715c..5663de141e 100644 --- a/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_right.ts +++ b/e2e-tests/playwright/lib/src/ui/components/channels/sidebar_right.ts @@ -6,6 +6,7 @@ import {Locator, expect} from '@playwright/test'; import ChannelsPostCreate from './post_create'; import ChannelsPostEdit from './post_edit'; import ChannelsPost from './post'; +import ScheduledPostIndicator from './scheduled_post_indicator'; export default class ChannelsSidebarRight { readonly container: Locator; @@ -13,7 +14,7 @@ export default class ChannelsSidebarRight { readonly closeButton; readonly postCreate; readonly rhsPostBody; - readonly postBoxIndicator; + readonly scheduledPostIndicator; readonly scheduledDraftChannelInfoMessage; readonly scheduledDraftSeeAllLink; readonly scheduledDraftChannelInfoMessageText; @@ -25,7 +26,7 @@ export default class ChannelsSidebarRight { constructor(container: Locator) { this.container = container; - this.postBoxIndicator = container.locator('div.postBoxIndicator'); + this.scheduledPostIndicator = new ScheduledPostIndicator(container.getByTestId('scheduledPostIndicator')); this.scheduledDraftChannelInfoMessage = container.locator('div.ScheduledPostIndicator span'); this.scheduledDraftSeeAllLink = container.locator('a:has-text("See all")'); this.scheduledDraftChannelInfoMessageText = container.locator('span:has-text("Message scheduled for")'); @@ -84,11 +85,6 @@ export default class ChannelsSidebarRight { await expect(this.container).not.toBeVisible(); } - async clickOnSeeAllscheduledDrafts() { - await this.scheduledDraftSeeAllLink.isVisible(); - await this.scheduledDraftSeeAllLink.click(); - } - async toContainText(text: string) { await expect(this.container).toContainText(text); } diff --git a/e2e-tests/playwright/lib/src/ui/components/index.ts b/e2e-tests/playwright/lib/src/ui/components/index.ts index dbae2409a7..f4311e7ea7 100644 --- a/e2e-tests/playwright/lib/src/ui/components/index.ts +++ b/e2e-tests/playwright/lib/src/ui/components/index.ts @@ -22,7 +22,9 @@ import ThreadFooter from './channels/thread_footer'; import EmojiGifPicker from './channels/emoji_gif_picker'; import GenericConfirmModal from './channels/generic_confirm_modal'; import MessagePriority from './channels/message_priority'; -import ScheduledDraftMenu from './channels/scheduled_draft_menu'; +import ScheduleMessageMenu from './channels/schedule_message_menu'; +import ScheduleMessageModal from './channels/schedule_message_modal'; +import ScheduledPostIndicator from './channels/scheduled_post_indicator'; import ScheduledDraftModal from './channels/scheduled_draft_modal'; import UserAccountMenu from './user_account_menu'; import ProfileModal from './channels/profile_modal'; @@ -38,6 +40,10 @@ import DeletePostConfirmationDialog from './channels/delete_post_confirmation_di import RestorePostConfirmationDialog from './channels/restore_post_confirmation_dialog'; import SystemConsoleFeatureDiscovery from './system_console/sections/system_users/feature_discovery'; import SystemConsoleMobileSecurity from './system_console/sections/system_users/mobile_security'; +import ScheduledPost from './channels/scheduled_post'; +import SendMessageNowModal from './channels/send_message_now_modal'; +import DeleteScheduledPostModal from './channels/delete_scheduled_post_modal'; +import DraftPost from './channels/draft_post'; const components = { GlobalHeader, @@ -50,8 +56,10 @@ const components = { ChannelsPostCreate, ChannelsPostEdit, ChannelsPost, + DraftPost, FindChannelsModal, DeletePostModal, + DeleteScheduledPostModal, SettingsModal, PostDotMenu, PostMenu, @@ -61,8 +69,12 @@ const components = { PostReminderMenu, EmojiGifPicker, GenericConfirmModal, - ScheduledDraftMenu, + ScheduleMessageMenu, + ScheduleMessageModal, + ScheduledPostIndicator, ScheduledDraftModal, + ScheduledPost, + SendMessageNowModal, SystemConsoleSidebar, SystemConsoleNavbar, SystemUsers, @@ -82,6 +94,7 @@ const components = { export { components, GlobalHeader, + SearchPopover, ChannelsCenterView, ChannelsSidebarLeft, ChannelsSidebarRight, @@ -90,12 +103,36 @@ export { ChannelsPostCreate, ChannelsPostEdit, ChannelsPost, + DraftPost, FindChannelsModal, DeletePostModal, + DeleteScheduledPostModal, + SettingsModal, PostDotMenu, PostMenu, ThreadFooter, + Footer, + MainHeader, + PostReminderMenu, + EmojiGifPicker, + GenericConfirmModal, + ScheduleMessageMenu, + ScheduleMessageModal, + ScheduledPostIndicator, + ScheduledDraftModal, + ScheduledPost, + SendMessageNowModal, + SystemConsoleSidebar, + SystemConsoleNavbar, + SystemUsers, + SystemUsersFilterPopover, + SystemUsersFilterMenu, + SystemUsersColumnToggleMenu, + SystemConsoleFeatureDiscovery, + SystemConsoleMobileSecurity, MessagePriority, + UserProfilePopover, + UserAccountMenu, DeletePostConfirmationDialog, RestorePostConfirmationDialog, ProfileModal, diff --git a/e2e-tests/playwright/lib/src/ui/pages/channels.ts b/e2e-tests/playwright/lib/src/ui/pages/channels.ts index a30a768d8c..baa6e46510 100644 --- a/e2e-tests/playwright/lib/src/ui/pages/channels.ts +++ b/e2e-tests/playwright/lib/src/ui/pages/channels.ts @@ -2,10 +2,11 @@ // See LICENSE.txt for license information. import {expect, Page} from '@playwright/test'; +import {waitUntil} from 'async-wait-until'; import {ChannelsPost, components} from '@/ui/components'; import SettingsModal from '@/ui/components/channels/settings/settings_modal'; - +import {duration} from '@/util'; export default class ChannelsPage { readonly channels = 'Channels'; @@ -15,7 +16,6 @@ export default class ChannelsPage { readonly userAccountMenuButton; readonly searchPopover; readonly centerView; - readonly scheduledDraftDropdown; readonly scheduledDraftModal; readonly sidebarLeft; readonly sidebarRight; @@ -32,6 +32,8 @@ export default class ChannelsPage { readonly postReminderMenu; readonly userAccountMenu; readonly emojiGifPickerPopup; + readonly scheduleMessageMenu; + readonly scheduleMessageModal; constructor(page: Page) { this.page = page; @@ -56,11 +58,14 @@ export default class ChannelsPage { this.postDotMenu = new components.PostDotMenu(page.getByRole('menu', {name: 'Post extra options'})); this.postReminderMenu = new components.PostReminderMenu(page.getByRole('menu', {name: 'Set a reminder for:'})); this.userAccountMenu = new components.UserAccountMenu(page.locator('#userAccountMenu')); + this.scheduleMessageMenu = new components.ScheduleMessageMenu(page.locator('#dropdown_send_post_options')); // Popovers this.emojiGifPickerPopup = new components.EmojiGifPicker(page.locator('#emojiGifPicker')); - this.scheduledDraftDropdown = new components.ScheduledDraftMenu(page.locator('#dropdown_send_post_options')); this.scheduledDraftModal = new components.ScheduledDraftModal(page.locator('div.modal-content')); + this.scheduleMessageModal = new components.ScheduleMessageModal( + page.getByRole('dialog', {name: 'Schedule message'}), + ); this.userProfilePopover = new components.UserProfilePopover(page.locator('.user-profile-popover')); // Posts @@ -87,6 +92,8 @@ export default class ChannelsPage { } } await this.page.goto(channelsUrl); + + return channelsUrl; } /** @@ -98,6 +105,30 @@ export default class ChannelsPage { await this.centerView.postMessage(message, files); } + async replyToLastPost(message: string) { + const rootPost = await this.getLastPost(); + await rootPost.reply(); + + const sidebarRight = this.sidebarRight; + await sidebarRight.toBeVisible(); + await sidebarRight.postMessage('Replying to a thread'); + + // * Verify the message has been sent + await waitUntil( + async () => { + const post = await this.sidebarRight.getLastPost(); + const content = await post.container.textContent(); + + return content?.includes(message); + }, + {timeout: duration.ten_sec}, + ); + + const lastPost = await sidebarRight.getLastPost(); + + return {rootPost, sidebarRight, lastPost}; + } + async openChannelSettings(): Promise { await this.centerView.header.openChannelMenu(); await this.page.locator('#channelSettings[role="menuitem"]').click(); @@ -144,4 +175,28 @@ export default class ChannelsPage { return popover; } + + async scheduleMessage(message: string, dayFromToday: number = 0, timeOptionIndex: number = 0) { + await this.centerView.postCreate.writeMessage(message); + + await expect(this.centerView.postCreate.scheduleMessageButton).toBeVisible(); + await this.centerView.postCreate.scheduleMessageButton.click(); + + await this.scheduleMessageMenu.toBeVisible(); + await this.scheduleMessageMenu.selectCustomTime(); + + return await this.scheduleMessageModal.scheduleMessage(dayFromToday, timeOptionIndex); + } + + async scheduleMessageFromThread(message: string, dayFromToday: number = 0, timeOptionIndex: number = 0) { + await this.sidebarRight.postCreate.writeMessage(message); + + await expect(this.sidebarRight.postCreate.scheduleMessageButton).toBeVisible(); + await this.sidebarRight.postCreate.scheduleMessageButton.click(); + + await this.scheduleMessageMenu.toBeVisible(); + await this.scheduleMessageMenu.selectCustomTime(); + + return await this.scheduleMessageModal.scheduleMessage(dayFromToday, timeOptionIndex); + } } diff --git a/e2e-tests/playwright/lib/src/ui/pages/drafts.ts b/e2e-tests/playwright/lib/src/ui/pages/drafts.ts index 797493a522..6fb9b2c5d7 100644 --- a/e2e-tests/playwright/lib/src/ui/pages/drafts.ts +++ b/e2e-tests/playwright/lib/src/ui/pages/drafts.ts @@ -3,125 +3,52 @@ import {Page, expect} from '@playwright/test'; -export default class DraftPage { +import {components} from '@/ui/components'; + +export default class DraftsPage { readonly page: Page; + readonly draftsHeader; readonly tab; - readonly confirmbutton; - readonly datePattern; - readonly deleteIcon; - readonly deleteIconToolTip; - readonly noscheduledDraftIcon; - readonly scheduleIcon; - readonly rescheduleIconToolTip; - readonly draftBody; - readonly scheduledDraftPageInfo; - readonly scheduledDraftPanel; - readonly scheduledDraftSendNowButton; - readonly scheduledDraftSendNowButtonToolTip; + readonly badge; + readonly noDrafts; + + readonly scheduleMessageModal; constructor(page: Page) { this.page = page; - this.draftBody = page.locator('div.post__body'); - this.scheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule'); - this.datePattern = - /(Today|Tomorrow|(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}) at \d{1,2}:\d{2} [AP]M/; + this.draftsHeader = page.locator('.Drafts__header'); this.tab = page.getByRole('tab', {name: 'Drafts'}); - this.scheduledDraftPageInfo = page.locator('.PanelHeader__info'); - this.scheduledDraftPanel = (messageContent: string) => - page.locator(`article.Panel:has(div.post__body:has-text("${messageContent}"))`); - this.deleteIcon = page.locator('#draft_icon-trash-can-outline_delete'); - this.deleteIconToolTip = page.locator('text=Delete scheduled post'); - this.rescheduleIconToolTip = page.locator('text=Schedule draft'); - this.noscheduledDraftIcon = page.locator('.no-results__wrapper'); - this.scheduledDraftSendNowButton = page.locator('#draft_icon-send-outline_sendNow'); - this.scheduledDraftSendNowButtonToolTip = page.locator('text=Send now'); - this.confirmbutton = this.page.locator('button.btn-primary'); + this.badge = this.tab.locator('span.MuiBadge-badge'); + + this.noDrafts = page.locator('.no-results__wrapper'); + + this.scheduleMessageModal = new components.ScheduleMessageModal( + page.getByRole('dialog', {name: 'Schedule message'}), + ); } - async goTo(teamName: string) { + async goto(teamName: string) { await this.page.goto(`/${teamName}/drafts`); } async toBeVisible() { - await this.page.waitForLoadState('networkidle'); await expect(this.page).toHaveURL(/.*drafts/); + await this.draftsHeader.isVisible(); + await expect(this.tab).toHaveAttribute('aria-selected', 'true'); } - async assertBadgeCountOnTab(badgeCount: string) { - await this.tab.isVisible(); + async getBadgeCountOnTab() { + await expect(this.tab).toBeVisible(); const badge = this.tab.locator('span.MuiBadge-badge'); await expect(badge).toBeVisible(); - await expect(badge).toHaveText(badgeCount); + return await badge.textContent(); } - async assertDraftBody(draftMessage: string) { - await expect(this.draftBody).toBeVisible(); - await expect(this.draftBody).toHaveText(draftMessage); - } - - async verifyOnHoverActionItems(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifyDeleteIcon(); - await this.verifyScheduleIcon(messageContent); - await this.verifySendNowIcon(); - } - - async verifyDeleteIcon() { - await this.deleteIcon.isVisible(); - await this.deleteIcon.hover(); - await expect(this.deleteIconToolTip).toBeVisible(); - await expect(this.deleteIconToolTip).toHaveText('Delete scheduled post'); - } - - async verifyScheduleIcon(messageContent: string) { - await this.scheduledDraftPanel(messageContent).hover(); - await expect(this.scheduleIcon).toBeVisible(); - await this.scheduleIcon.hover(); - await expect(this.rescheduleIconToolTip).toBeVisible(); - await expect(this.rescheduleIconToolTip).toHaveText('Schedule draft'); - } - - async verifySendNowIcon() { - await this.scheduledDraftSendNowButton.isVisible(); - await this.scheduledDraftSendNowButton.hover(); - await expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible(); - await expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now'); - } - - async getTimeStampOfMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded(); - await this.scheduledDraftPanel(messageContent).isVisible(); - return this.scheduledDraftPanel(messageContent).locator(this.scheduledDraftPageInfo).innerHTML(); - } - - async openScheduleModal(messageContent: string) { - await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded(); - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.scheduleIcon.hover(); - await expect(this.rescheduleIconToolTip).toBeVisible(); - await expect(this.rescheduleIconToolTip).toHaveText('Schedule draft'); - await this.scheduleIcon.click(); - } - - async deleteScheduledMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifyDeleteIcon(); - await this.deleteIcon.click(); - expect(await this.confirmbutton.textContent()).toEqual('Yes, delete'); - await this.confirmbutton.click(); - } - - async sendScheduledMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifySendNowIcon(); - await this.scheduledDraftSendNowButton.click(); - expect(await this.confirmbutton.textContent()).toEqual('Yes, send now'); - await this.confirmbutton.click(); + async getLastPost() { + const lastPost = this.page.getByTestId('draftView').last(); + await lastPost.waitFor(); + return new components.DraftPost(lastPost); } } diff --git a/e2e-tests/playwright/lib/src/ui/pages/index.ts b/e2e-tests/playwright/lib/src/ui/pages/index.ts index e8cef6c301..a36a892dfa 100644 --- a/e2e-tests/playwright/lib/src/ui/pages/index.ts +++ b/e2e-tests/playwright/lib/src/ui/pages/index.ts @@ -7,8 +7,8 @@ import LoginPage from './login'; import ResetPasswordPage from './reset_password'; import SignupPage from './signup'; import SystemConsolePage from './system_console'; -import ScheduledDraftPage from './scheduled_draft'; -import DraftPage from './drafts'; +import ScheduledPostsPage from './scheduled_posts'; +import DraftsPage from './drafts'; const pages = { ChannelsPage, @@ -16,19 +16,19 @@ const pages = { LoginPage, ResetPasswordPage, SignupPage, - ScheduledDraftPage, + ScheduledPostsPage, SystemConsolePage, - DraftPage, + DraftsPage, }; export { pages, ChannelsPage, + DraftsPage, LandingLoginPage, LoginPage, ResetPasswordPage, SignupPage, - ScheduledDraftPage, + ScheduledPostsPage, SystemConsolePage, - DraftPage, }; diff --git a/e2e-tests/playwright/lib/src/ui/pages/scheduled_draft.ts b/e2e-tests/playwright/lib/src/ui/pages/scheduled_draft.ts deleted file mode 100644 index bf10d58c17..0000000000 --- a/e2e-tests/playwright/lib/src/ui/pages/scheduled_draft.ts +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import {Page, expect} from '@playwright/test'; - -export default class ScheduledDraftPage { - readonly page: Page; - - readonly tab; - readonly confirmbutton; - readonly copyIcon; - readonly copyIconToolTip; - readonly datePattern; - readonly deleteIcon; - readonly deleteIconToolTip; - readonly noscheduledDraftIcon; - readonly rescheduleIcon; - readonly rescheduleIconToolTip; - readonly scheduledDraftBody; - readonly scheduledDraftPageInfo; - readonly scheduledDraftPanel; - readonly scheduledDraftSendNowButton; - readonly scheduledDraftSendNowButtonToolTip; - readonly editIcon; - readonly editBox; - readonly editorSaveButton; - - constructor(page: Page) { - this.page = page; - - this.datePattern = - /(Today|Tomorrow|(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}) at \d{1,2}:\d{2} [AP]M/; - this.scheduledDraftBody = page.locator('div.post__body'); - this.tab = page.getByRole('tab', {name: 'Scheduled'}); - this.scheduledDraftPageInfo = page.locator('.PanelHeader__info'); - this.scheduledDraftPanel = (messageContent: string) => - page.locator(`article.Panel:has(div.post__body:has-text("${messageContent}"))`); - this.deleteIcon = page.locator('#draft_icon-trash-can-outline_delete'); - this.deleteIconToolTip = page.locator('text=Delete scheduled post'); - this.copyIcon = page.locator('#draft_icon-content-copy_copy_text'); - this.copyIconToolTip = page.locator('text=Copy text'); - this.rescheduleIcon = page.locator('#draft_icon-clock-send-outline_reschedule'); - this.rescheduleIconToolTip = page.locator('text=Reschedule post'); - this.noscheduledDraftIcon = page.locator('.no-results__wrapper'); - this.scheduledDraftSendNowButton = page.locator('#draft_icon-send-outline_sendNow'); - this.scheduledDraftSendNowButtonToolTip = page.locator('text=Send now'); - this.confirmbutton = this.page.locator('button.btn-primary'); - this.editIcon = page.locator('#draft_icon-pencil-outline_edit'); - this.editBox = page.locator('textarea#edit_textbox'); - this.editorSaveButton = page.locator('button.save'); - } - - async toBeVisible() { - await this.page.waitForLoadState('networkidle'); - await expect(this.page).toHaveURL(/.*scheduled_posts/); - } - - async assertBadgeCountOnTab(badgeCount: string) { - await this.tab.isVisible(); - const badge = this.tab.locator('span.MuiBadge-badge'); - await expect(badge).toBeVisible(); - await expect(badge).toHaveText(badgeCount); - } - - async assertscheduledDraftBody(draftMessage: string) { - await expect(this.scheduledDraftBody).toBeVisible(); - await expect(this.scheduledDraftBody).toHaveText(draftMessage); - } - - async verifyOnHoverActionItems(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifyDeleteIcon(); - await this.verifyCopyIcon(); - await this.verifyRescheduleIcon(); - await this.verifySendNowIcon(); - } - - async verifyDeleteIcon() { - await this.deleteIcon.isVisible(); - await this.deleteIcon.hover(); - await expect(this.deleteIconToolTip).toBeVisible(); - await expect(this.deleteIconToolTip).toHaveText('Delete scheduled post'); - } - - async verifyCopyIcon() { - await this.copyIcon.isVisible(); - await this.copyIcon.hover(); - await expect(this.copyIconToolTip).toBeVisible(); - await expect(this.copyIconToolTip).toHaveText('Copy text'); - } - - async verifyRescheduleIcon() { - await expect(this.rescheduleIcon).toBeVisible(); - await this.rescheduleIcon.hover(); - await expect(this.rescheduleIconToolTip).toBeVisible(); - await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post'); - } - - async verifySendNowIcon() { - await this.scheduledDraftSendNowButton.isVisible(); - await this.scheduledDraftSendNowButton.hover(); - await expect(this.scheduledDraftSendNowButtonToolTip).toBeVisible(); - await expect(this.scheduledDraftSendNowButtonToolTip).toHaveText('Send now'); - } - - async getTimeStampOfMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded(); - await this.scheduledDraftPanel(messageContent).isVisible(); - return this.scheduledDraftPanel(messageContent).locator(this.scheduledDraftPageInfo).innerHTML(); - } - - async openRescheduleModal(messageContent: string) { - await this.scheduledDraftPanel(messageContent).scrollIntoViewIfNeeded(); - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.rescheduleIcon.hover(); - await expect(this.rescheduleIconToolTip).toBeVisible(); - await expect(this.rescheduleIconToolTip).toHaveText('Reschedule post'); - await this.rescheduleIcon.click(); - } - - async deleteScheduledMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifyDeleteIcon(); - await this.deleteIcon.click(); - expect(await this.confirmbutton.textContent()).toEqual('Yes, delete'); - await this.confirmbutton.click(); - } - - async sendScheduledMessage(messageContent: string) { - await this.scheduledDraftPanel(messageContent).isVisible(); - await this.scheduledDraftPanel(messageContent).hover(); - await this.verifySendNowIcon(); - await this.scheduledDraftSendNowButton.click(); - expect(await this.confirmbutton.textContent()).toEqual('Yes, send now'); - await this.confirmbutton.click(); - } - - async goTo(teamName: string) { - await this.page.goto(`/${teamName}/scheduled_posts`); - } - - async editText(newText: string) { - await this.editIcon.click(); - await this.editBox.isVisible(); - await this.editBox.fill(newText); - await this.editorSaveButton.isVisible(); - await this.editorSaveButton.click(); - await this.editBox.isHidden(); - await this.scheduledDraftPanel(newText).isVisible(); - } - - async copyScheduledMessage(draftMessage: string) { - await this.scheduledDraftPanel(draftMessage).isVisible(); - await this.scheduledDraftPanel(draftMessage).hover(); - await this.verifyCopyIcon(); - await this.copyIcon.click(); - } -} diff --git a/e2e-tests/playwright/lib/src/ui/pages/scheduled_posts.ts b/e2e-tests/playwright/lib/src/ui/pages/scheduled_posts.ts new file mode 100644 index 0000000000..411de4cdab --- /dev/null +++ b/e2e-tests/playwright/lib/src/ui/pages/scheduled_posts.ts @@ -0,0 +1,80 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Page, expect} from '@playwright/test'; + +import {components} from '@/ui/components'; +import type {ScheduledPost} from '@/ui/components'; + +export default class ScheduledPostsPage { + readonly page: Page; + + readonly draftsHeader; + readonly tab; + readonly badge; + readonly noScheduledDrafts; + readonly scheduleMessageModal; + readonly sendMessageNowModal; + readonly deleteScheduledPostModal; + + constructor(page: Page) { + this.page = page; + + this.draftsHeader = page.locator('.Drafts__header'); + this.tab = page.getByRole('tab', {name: 'Scheduled'}); + this.badge = this.tab.locator('span.MuiBadge-badge'); + + this.noScheduledDrafts = page.locator('.no-results__wrapper'); + + this.scheduleMessageModal = new components.ScheduleMessageModal( + page.getByRole('dialog', {name: 'Schedule message'}), + ); + this.sendMessageNowModal = new components.SendMessageNowModal( + page.getByRole('dialog', {name: 'Send message now'}), + ); + this.deleteScheduledPostModal = new components.DeleteScheduledPostModal( + page.getByRole('dialog', {name: 'Delete scheduled post'}), + ); + } + + async toBeVisible() { + await expect(this.page).toHaveURL(/.*scheduled_posts/); + await this.draftsHeader.isVisible(); + await expect(this.tab).toHaveAttribute('aria-selected', 'true'); + } + + async getBadgeCountOnTab() { + await expect(this.tab).toBeVisible(); + const badge = this.tab.locator('span.MuiBadge-badge'); + await expect(badge).toBeVisible(); + return await badge.textContent(); + } + + async getLastPost() { + const lastPost = this.page.getByTestId('scheduledPostView').last(); + await lastPost.waitFor(); + return new components.ScheduledPost(lastPost); + } + + async getLastPostID() { + return this.page.getByTestId('scheduledPostView').last().getAttribute('data-postid'); + } + + async getNthPost(index: number) { + const nthPost = this.page.getByTestId('scheduledPostView').nth(index); + await nthPost.waitFor(); + return new components.ScheduledPost(nthPost); + } + + async rescheduleMessage(post: ScheduledPost, dayFromToday: number = 0, timeOptionIndex: number = 0) { + await post.hover(); + await expect(post.rescheduleButton).toBeVisible(); + await post.rescheduleButton.click(); + + return await this.scheduleMessageModal.scheduleMessage(dayFromToday, timeOptionIndex); + } + + async goto(teamName: string) { + await this.page.goto(`/${teamName}/scheduled_posts`); + } +} diff --git a/e2e-tests/playwright/package-lock.json b/e2e-tests/playwright/package-lock.json index 8b0525bc4b..bae6156eda 100644 --- a/e2e-tests/playwright/package-lock.json +++ b/e2e-tests/playwright/package-lock.json @@ -16,9 +16,11 @@ "@playwright/test": "1.52.0", "cross-env": "7.0.3", "dayjs": "1.11.13", + "luxon": "3.6.1", "zod": "3.24.3" }, "devDependencies": { + "@types/luxon": "3.6.2", "@typescript-eslint/eslint-plugin": "8.30.1", "eslint": "9.25.0", "eslint-import-resolver-typescript": "4.3.3", @@ -47,1300 +49,6 @@ } } }, - "../../webapp/platform/client/node_modules/@jest/console": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/core": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/@jest/environment": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/globals": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/reporters": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/@jest/source-map": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/test-result": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/transform": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@jest/types": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "../../webapp/platform/client/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "../../webapp/platform/client/node_modules/@tootallnate/once": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "../../webapp/platform/client/node_modules/@types/yargs": { - "version": "16.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "../../webapp/platform/client/node_modules/acorn-globals": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "../../webapp/platform/client/node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../webapp/platform/client/node_modules/acorn-walk": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../webapp/platform/client/node_modules/babel-jest": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "../../webapp/platform/client/node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/babel-preset-jest": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "../../webapp/platform/client/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../webapp/platform/client/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../webapp/platform/client/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/cssom": { - "version": "0.4.4", - "dev": true, - "license": "MIT" - }, - "../../webapp/platform/client/node_modules/data-urls": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/diff-sequences": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/domexception": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/emittery": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "../../webapp/platform/client/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../webapp/platform/client/node_modules/expect": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../webapp/platform/client/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../webapp/platform/client/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../webapp/platform/client/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "../../webapp/platform/client/node_modules/jest": { - "version": "27.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^27.1.0", - "import-local": "^3.0.2", - "jest-cli": "^27.1.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/jest-changed-files": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-circus": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-cli": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/jest-config": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/jest-diff": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-docblock": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-each": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-environment-node": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-get-type": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-haste-map": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "../../webapp/platform/client/node_modules/jest-leak-detector": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-message-util": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-mock": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-regex-util": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-resolve": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-runner": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-runtime": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-snapshot": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-util": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-validate": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-watcher": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "../../webapp/platform/client/node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "../../webapp/platform/client/node_modules/jsdom": { - "version": "16.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/jsdom/node_modules/form-data": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "../../webapp/platform/client/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/parse5": { - "version": "6.0.1", - "dev": true, - "license": "MIT" - }, - "../../webapp/platform/client/node_modules/resolve.exports": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/saxes": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "../../webapp/platform/client/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "../../webapp/platform/client/node_modules/tr46": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../webapp/platform/client/node_modules/v8-to-istanbul": { - "version": "8.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "../../webapp/platform/client/node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.4", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "../../webapp/platform/client/node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/webidl-conversions": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, - "../../webapp/platform/client/node_modules/whatwg-encoding": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "../../webapp/platform/client/node_modules/whatwg-mimetype": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "../../webapp/platform/client/node_modules/whatwg-url": { - "version": "8.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../webapp/platform/client/node_modules/write-file-atomic": { - "version": "3.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "../../webapp/platform/client/node_modules/ws": { - "version": "7.5.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "../../webapp/platform/client/node_modules/xml-name-validator": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0" - }, "../../webapp/platform/types": { "name": "@mattermost/types", "version": "10.6.0", @@ -1388,6 +96,8 @@ }, "node_modules/@axe-core/playwright": { "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.1.tgz", + "integrity": "sha512-EV5t39VV68kuAfMKqb/RL+YjYKhfuGim9rgIaQ6Vntb2HgaCaau0h98Y3WEUqW1+PbdzxDtDNjFAipbtZuBmEA==", "license": "MPL-2.0", "dependencies": { "axe-core": "~4.10.2" @@ -1400,6 +110,7 @@ "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -1413,6 +124,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1422,6 +134,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@emnapi/wasi-threads": "1.0.2", @@ -1433,6 +146,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -1443,13 +157,16 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", "dev": true, "license": "MIT", "dependencies": { @@ -1467,6 +184,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -1478,6 +197,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -1492,6 +212,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1502,6 +223,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1514,6 +236,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1523,6 +246,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -1535,6 +259,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1553,43 +278,23 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1602,6 +307,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.0.tgz", "integrity": "sha512-iWhsUS8Wgxz9AXNfvfOPFSW4VfMXdVhp1hjkZVhXCrpgh/aLcc45rX6MPu+tIVUWDw0HfNwth7O28M1xDxNf9w==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1611,6 +317,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1620,6 +327,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" @@ -1630,6 +338,8 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1638,6 +348,8 @@ }, "node_modules/@humanfs/node": { "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1650,6 +362,8 @@ }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1662,6 +376,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1677,6 +393,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1702,6 +419,7 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.0", @@ -1711,6 +429,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1722,6 +442,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -1729,6 +451,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1742,6 +466,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.30.10.tgz", "integrity": "sha512-fKASLI1Qj38v64Vb6VktRsW2MZnxQ5JBDGPPk+sP/bSiTZ0D0GC5pz2s+tQaGD7wReYNy9JKzSujrkJqFiBbSg==", + "license": "MIT", "dependencies": { "@percy/cli-app": "1.30.10", "@percy/cli-build": "1.30.10", @@ -1764,6 +489,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.30.10.tgz", "integrity": "sha512-XL1vW4A2C74DOgXx6kilxUxGVtAgQDik+J1Gyr0SF324cpW6fIDB55ktLSvbv8z4qRqUIhEEWyOAWGpngwv8og==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10", "@percy/cli-exec": "1.30.10" @@ -1776,6 +502,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.30.10.tgz", "integrity": "sha512-mMj1asBNW8oYavMuMtg3TU72+UoCg/8eoKshZ8jb4i9Tg/nWG1q9wfbS9/lSdenKPjQuqzfpQ8TB/Q/UI2cajA==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10" }, @@ -1787,6 +514,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.30.10.tgz", "integrity": "sha512-xvTZBTpjQMxihEVI3bEjIfBRjZ5momxFeFgLUFQUhQZXPtNp3o+vWFI1CCltjkK2JAXK/q883ozoeiuKgoacWg==", + "license": "MIT", "dependencies": { "@percy/config": "1.30.10", "@percy/core": "1.30.10", @@ -1803,6 +531,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.30.10.tgz", "integrity": "sha512-8xb4WhC67qiX6lRmpKnJhhvJiYVvTC4bQ9/BZYUpk6r3Ftq8ViOe0sySVj3Ms0vF1IwPn2t0E1osqKOvtKumFg==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10" }, @@ -1814,6 +543,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.30.10.tgz", "integrity": "sha512-NV2KqC15Y9e0PyCqQrt01QuOT7sIXhs3yrovuVvbutqNL2+Ol25eHGoNJG+kMo9jSJM36ZWmD9am4eX6L2VBaQ==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10", "@percy/logger": "1.30.10", @@ -1828,6 +558,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.30.10.tgz", "integrity": "sha512-xlrJj9VvoWLuWA0wjmY2cvvtOvzzPzGuHET14zUOhM7leBifGI8Gz6wNGtXKblKAtJUg+0dYPBZd0vNO6ZVIeA==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10", "yaml": "^2.0.0" @@ -1840,6 +571,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.30.10.tgz", "integrity": "sha512-6+aYDC3eZk+P7PpxftKfu/sSXyb0QpN4Rdtynsy5jt9RobrEL7q7YyZIbeksZm/WtgYszIa8yYQP3i5LUvfZdQ==", + "license": "MIT", "dependencies": { "@percy/cli-command": "1.30.10", "fast-glob": "^3.2.11", @@ -1853,6 +585,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.30.10.tgz", "integrity": "sha512-eIyuiBgiv5e+x8B14bOKkl38cYjTud3OYjN4Uo5uqo/raBaFlI24aoOMtSyq0TVKBNgPVEgmNAgQxj+P9fHFtA==", + "license": "MIT", "dependencies": { "@percy/env": "1.30.10", "@percy/logger": "1.30.10", @@ -1867,6 +600,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.30.10.tgz", "integrity": "sha512-ixzxZ+rwHUCSOxFpAEEsqDfJVnb5mIYfnayGjsaIe1hnMvo/t/K9/npu6JhBGHR/kpaummJQEPCRxEuclN93Ew==", + "license": "MIT", "dependencies": { "@percy/logger": "1.30.10", "ajv": "^8.6.2", @@ -1877,11 +611,34 @@ "node": ">=14" } }, + "node_modules/@percy/config/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@percy/config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/@percy/core": { "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.30.10.tgz", "integrity": "sha512-6oZkiOdjy3YqFpZHVX9ZCHJKxslVEE9cgfqXI09Zba4iFKpG9PJ0pHFc/uee89G0uJj82sqIMu8Jgm833NLyMQ==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@percy/client": "1.30.10", "@percy/config": "1.30.10", @@ -1909,6 +666,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1917,6 +675,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1927,12 +686,14 @@ "node_modules/@percy/dom": { "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.30.10.tgz", - "integrity": "sha512-EJUHmrh6UE8YD3MZ1Hnrc2sTVAlQt2xTC0wWSBDVz2h1/IUvHw5yE7TQHhp615IYOmurI3k8AKjmdI7b70uD7Q==" + "integrity": "sha512-EJUHmrh6UE8YD3MZ1Hnrc2sTVAlQt2xTC0wWSBDVz2h1/IUvHw5yE7TQHhp615IYOmurI3k8AKjmdI7b70uD7Q==", + "license": "MIT" }, "node_modules/@percy/env": { "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.30.10.tgz", "integrity": "sha512-kPJsACurTY9/5TZH8xDMDMaz2Yas9SLr0DqlCqIaqBWxikDzdWXUiDWwAIab0Dik5oAFbQAXC7f4V+0MBlZWag==", + "license": "MIT", "dependencies": { "@percy/logger": "1.30.10" }, @@ -1944,6 +705,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.30.10.tgz", "integrity": "sha512-ABSzY/WVI/ePXac73Q6qEUKqUZ1+NJswzbZy/I/fgiBWmkzf4hKIrlD9RQZYmkjLWVESbjKPhZTmH3bntO084Q==", + "license": "MIT", "engines": { "node": ">=14" } @@ -1952,6 +714,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/monitoring/-/monitoring-1.30.10.tgz", "integrity": "sha512-Iaa6nx1GFc92uZdYHM1EJfyn4aIjm/DWPOp6RbF4eSFZhlpqhvqBQgXvgDLylNNrKmdaXsFIE56BjpJZhamtsQ==", + "license": "MIT", "dependencies": { "@percy/config": "1.30.10", "@percy/logger": "1.30.10", @@ -1966,6 +729,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@percy/playwright/-/playwright-1.0.8.tgz", "integrity": "sha512-v70IKPVy15mDxis5+of2S62AJHdeG99BlA08oj/XpK68CVyNUSE6I8I54EUm3PbEeKxdZLWTdhX+8I69UkxPjA==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -1977,6 +741,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.30.10.tgz", "integrity": "sha512-EOFm6XDbXIpo1YjF+JWxNCW5TB0ZaqjQfHLtOCmffhHi2T0MCXSAHdNxeTUyADyySzWjD4bKba/PbZwwTVE8Zw==", + "license": "MIT", "engines": { "node": ">=14" } @@ -1985,6 +750,7 @@ "version": "1.30.10", "resolved": "https://registry.npmjs.org/@percy/webdriver-utils/-/webdriver-utils-1.30.10.tgz", "integrity": "sha512-dTxSa0Dy7SZrXcjzy+kvWFIxBb3n/YAPJWMMX063ZMeAOINx5MhZ+JizOijW0QXXhy/UJAmW+2Q3VB32kj391Q==", + "license": "MIT", "dependencies": { "@percy/config": "1.30.10", "@percy/sdk-utils": "1.30.10" @@ -1997,6 +763,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "license": "Apache-2.0", "dependencies": { "playwright": "1.52.0" }, @@ -2012,6 +779,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -2038,6 +806,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -2060,6 +829,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2075,6 +845,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2088,6 +859,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -2101,6 +873,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2114,6 +887,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2127,6 +901,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2140,6 +915,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2153,6 +929,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2166,6 +943,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2179,6 +957,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2192,6 +971,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2205,6 +985,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2218,6 +999,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2231,6 +1013,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2244,6 +1027,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2257,6 +1041,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2270,6 +1055,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2283,6 +1069,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2296,6 +1083,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2309,6 +1097,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2322,6 +1111,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2331,18 +1121,21 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -2352,13 +1145,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/fs-extra": { "version": "8.1.5", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2368,6 +1163,7 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -2377,31 +1173,43 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/luxon": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz", + "integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mime-types": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "22.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "devOptional": true, + "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } @@ -2411,6 +1219,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", "dev": true, + "license": "MIT", "dependencies": { "csstype": "^3.0.2" } @@ -2419,6 +1228,7 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -2429,6 +1239,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.30.1", @@ -2453,70 +1264,12 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", - "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", - "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", - "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.30.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "8.31.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.31.0", @@ -2537,38 +1290,12 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { "version": "8.31.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@typescript-eslint/types": "8.31.0", @@ -2582,11 +1309,77 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", + "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.31.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/type-utils": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "8.30.1", "@typescript-eslint/utils": "8.30.1", @@ -2605,12 +1398,12 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2619,11 +1412,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.30.1", "@typescript-eslint/visitor-keys": "8.30.1", @@ -2645,11 +1439,13 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", - "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "node_modules/@typescript-eslint/types": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", + "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2658,13 +1454,43 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", - "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", + "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/visitor-keys": "8.31.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", + "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.31.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2680,6 +1506,8 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2692,6 +1520,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.30.1", @@ -2710,28 +1539,12 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", - "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2740,11 +1553,39 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.30.1", "eslint-visitor-keys": "^4.2.0" @@ -2757,28 +1598,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.31.0", - "eslint-visitor-keys": "^4.2.0" - }, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2792,7 +1617,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "peer": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2801,169 +1626,196 @@ } }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.6.3.tgz", - "integrity": "sha512-+BbDAtwT4AVUyGIfC6SimaA6Mi/tEJCf5OYV5XQg7WIOW0vyD15aVgDLvsQscIZxgz42xB6DDqR7Kv6NBQJrEg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-vIWAU56r2lZAmUsljp6m9+hrTlwNkZH6pqnSPff2WxzofV+jWRSHLmZRUS+g+VE+LlyPByifmGGHpJmhWetatg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.6.3.tgz", - "integrity": "sha512-q6qMXI8wT0u0GUns/L26kYHdX2du4yEhwxrXjPj/egvysI8XqcTyjnbWQm3NSJPw0Un2wvKPh0WuoTSJEZgbqw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.0.tgz", + "integrity": "sha512-+bShFLgtdwuNteQbKq3X230754AouNMXSLDZ56EssgDyckDt6Ld7wRaJjZF0pY671HnY2pk9/amO4amAFzfN1A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.6.3.tgz", - "integrity": "sha512-/7xs7QNNW17VZrFBf+2C95G72rA5c0YGtR18pvWrzM2tVPLrTsKnLl32hi3CG7F6cwwYRy7h61BIkMHh7qaZkw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.0.tgz", + "integrity": "sha512-HJjXb3aIptDZQ0saSmk2S4W1pWNVZ2iNpAbNGZOfsUXbi8xwCmHdVjErNS92hRp7djuDLup1OLrzOMtTdw5BmA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.6.3.tgz", - "integrity": "sha512-2xv5cUQCt+eYuq5tPF4AHStpzE8i8qdYnhitpvDv9vxzOZ5a0sdzgA8WHYgFe15dP469YOSivenMMdpuRcgE9Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.0.tgz", + "integrity": "sha512-NF3lk7KHulLD97UE+MHjH0mrOjeZG8Hz10h48YcFz2V0rlxBdRSRcMbGer8iH/1mIlLqxtvXJfGLUr4SMj0XZg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.6.3.tgz", - "integrity": "sha512-4KaZxKIeFt/jAOD/zuBOLb5yyZk/XG9FKf5IXpDP21NcYxeus/os6w+NCK7wjSJKbOpHZhwfkAYLkfujkAOFkw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.0.tgz", + "integrity": "sha512-Gn1c/t24irDgU8yYj4vVG6qHplwUM42ti9/zYWgfmFjoXCH6L4Ab9hh6HuO7bfDSvGDRGWQt1IVaBpgbKHdh3Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.6.3.tgz", - "integrity": "sha512-dJoZsZoWwvfS+khk0jkX6KnLL1T2vbRfsxinOR3PghpRKmMTnasEVAxmrXLQFNKqVKZV/mU7gHzWhiBMhbq3bw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.0.tgz", + "integrity": "sha512-XRrVXRIUP++qyqAqgiXUpOv0GP3cHx7aA7NrzVFf6Cc8FoYuwtnmT+vctfSo4wRZN71MNU4xq2BEFxI4qvSerg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.6.3.tgz", - "integrity": "sha512-2Y6JcAY9e557rD6O53Zmeblrfu48vQfl5CrrKjt0/2J1Op/pKX3WI8TOh0gs5T4qX9uJDqdte11SNUssckdfUA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-Sligg+vTDAYTXkUtgviPjGEFIh57pkvlfdyRw21i9gkjp/eCNOAi2o5e7qLGTkoYdJHZJs5wVMViPEmAbw2/Tg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.6.3.tgz", - "integrity": "sha512-kvcEe+j0De/DEfTNkte2xtmwSL4/GMesArcqmSgRqoOaGknUYY3whJ/3GygYKNMe82vvao4PaQkBlCrxhi88wQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.0.tgz", + "integrity": "sha512-Apek8/x+7Rg33zUJlQV44Bvq8/t1brfulk0veNJrk9wprF89bCYFMUHF7zQYcpf2u+m1+qs3mYQrBd43fGXhMA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.6.3.tgz", - "integrity": "sha512-fruY8swKre2H0J96h8HE+kN3iUnDR3VDd2wxBn4BxDw+5g7GOHBz5x1533l9mqAqHI4b2dMBECI4RtQdMOiBeQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.0.tgz", + "integrity": "sha512-kBale8CFX5clfV9VmI9EwKw2ZACMEx1ecjV92F9SeWTUoxl9d+LGzS6zMSX3kGYqcfJB3NXMwLCTwIDBLG1y4g==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.0.tgz", + "integrity": "sha512-s/Q33xQjeFHSCvGl1sZztFZF6xhv7coMvFz6wa/x/ZlEArjiQoMMwGa/Aieq1Kp/6+S13iU3/IJF0ga6/451ow==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.6.3.tgz", - "integrity": "sha512-1w0eaSxm9e69TEj9eArZDPQ7mL2VL6Bb4AXeLOdQoe5SNQpZaL6RlwGm7ss9xErwC7c9Hvob/ZZF7i8xYT55zg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.0.tgz", + "integrity": "sha512-7PuNXAo97ydaxVNrIYJzPipvINJafDpB8pt5CoZHfu8BmqcU6d7kl6/SABTnqNffNkd6Cfhuo70jvGB2P7oJ/Q==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.6.3.tgz", - "integrity": "sha512-ymUqs8AQyHTQQ50aN7EcMV47gKh5yKg8a0+SWSuDZEl6eGEOKn590D/iMDydS5KoWbMTy6/pBipS4vsPUEjYVw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.0.tgz", + "integrity": "sha512-fNosEzDMYItA4It+R0tioHwKlEfx/3TkkJdP2x9B5o9R946NDC4ZZj5ZjA+Y4NQD2V/imB3QPAKmeh3vHQGQyA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.6.3.tgz", - "integrity": "sha512-LSfz1cguLZD+c00aTVbtrqX1x1sIR38M2lLYW3CZTGfippkg56Hf8kejHPA8H26OwB71c9/W78BCbgcdnEW+jQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-gHIw42dmnVcw7osjNPRybaXhONhggWkkzqiOZzXco1q3OKkn4KsbDylATeemnq3TP+L1BrzSqzl0H9UTJ6ji+w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.6.3.tgz", - "integrity": "sha512-gehKZDmNDS2QTxefwPBLi0RJgOQ0dIoD/osCcNboDb3+ZKcbSMBaF3+4R5vj+XdV0QBdZg3vXwdwZswfEkQOcA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.0.tgz", + "integrity": "sha512-yq7POusv63/yTkNTaNsnXU/SAcBzckHyk1oYrDXqjS1m/goaWAaU9J9HrsovgTHkljxTcDd6PMAsJ5WZVBuGEQ==", "cpu": [ "wasm32" ], "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" @@ -2973,39 +1825,42 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.6.3.tgz", - "integrity": "sha512-CzTmpDxwkoYl69stmlJzcVWITQEC6Vs8ASMZMEMbFO+q1Dw0GtpRjAA6X76zGcLOADDwzugx1vpT6YXarrhpTA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.0.tgz", + "integrity": "sha512-/IPZPbdri9jglHonwB3F7EpQZvBK3ObH+g4ma/KDrqTEAECwvgE10Unvo0ox3LQFR/iMMAkVY+sGNMrMiIV/QQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.6.3.tgz", - "integrity": "sha512-j+n1gWkfu4Q/octUHXU1p1IOrh+B27vpA7ec81RB6nXCml5u7F0B7SrCZU+HqajxjVqgEQEYOcRCb1yzfwfsWw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.0.tgz", + "integrity": "sha512-NGVKbHEdrLuJdpcuGqV5zXO3v8t4CWOs0qeCGjO47RiwwufOi/yYcrtxtCzZAaMPBrffHL7c6tJ1Hxr17cPUGg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.6.3.tgz", - "integrity": "sha512-n33drkd84G5Mu2BkUGawZXmm+IFPuRv7GpODfwEBs/CzZq2+BIZyAZmb03H9IgNbd7xaohZbtZ4/9Gb0xo5ssw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.0.tgz", + "integrity": "sha512-Jf14pKofg58DIwcZv4Wt9AyVVe7bSJP8ODz+EP9nG/rho08FQzan0VOJk1g6/BNE1RkoYd+lRTWK+/BgH12qoQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3016,6 +1871,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3028,6 +1884,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3036,27 +1893,48 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { @@ -3064,6 +1942,7 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -3080,6 +1959,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3100,6 +1980,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3109,6 +1990,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -3130,6 +2012,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -3148,6 +2031,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -3166,6 +2050,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -3186,6 +2071,7 @@ "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -3198,6 +2084,7 @@ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3206,6 +2093,7 @@ "version": "2.0.27", "resolved": "https://registry.npmjs.org/async-wait-until/-/async-wait-until-2.0.27.tgz", "integrity": "sha512-2l7YlsHXxjmq4o3nSpvH4eav21+ZlUYOflj9TQsPBtzt99v+1Xsy8RvU5+x/OdkFTej40ws3AaKMgT/Ssj+LhQ==", + "license": "MIT", "engines": { "node": ">= 0.14.0", "npm": ">= 1.0.0" @@ -3220,6 +2108,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3234,24 +2123,30 @@ "version": "4.10.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -3260,6 +2155,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -3272,6 +2169,7 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } @@ -3281,6 +2179,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -3299,6 +2198,7 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3312,6 +2212,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -3325,6 +2226,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -3332,6 +2235,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3345,22 +2250,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { + "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3370,44 +2263,31 @@ "node": ">=7.0.0" } }, - "node_modules/chalk/node_modules/color-name": { + "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -3419,6 +2299,7 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -3442,6 +2323,8 @@ }, "node_modules/cross-env": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.1" @@ -3458,6 +2341,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3472,12 +2357,14 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -3487,6 +2374,7 @@ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -3504,6 +2392,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -3521,6 +2410,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -3535,10 +2425,14 @@ }, "node_modules/dayjs": { "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3554,11 +2448,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3569,6 +2467,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3586,6 +2485,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3602,6 +2502,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -3616,6 +2517,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3628,6 +2530,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3639,6 +2542,7 @@ "version": "16.5.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -3651,6 +2555,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -3664,6 +2569,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -3672,6 +2578,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3681,6 +2588,7 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -3746,6 +2654,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3755,6 +2664,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3764,6 +2674,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3776,6 +2687,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -3791,6 +2703,7 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3803,6 +2716,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -3817,6 +2731,8 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -3830,6 +2746,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -3851,6 +2768,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.0.tgz", "integrity": "sha512-MsBdObhM4cEwkzCiraDv7A6txFXEqtNXOb877TsSp2FCkBNl8JfVQrmiuDqC1IkejT6JLPzYBXx/xAiYhyzgGA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -3911,6 +2829,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3922,6 +2841,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -3931,6 +2851,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.3.tgz", "integrity": "sha512-mBgGvAG+3NGx2yk8w/qiBDOrQNwNe0LfxNzimnj0B7lqElJUV12X+1wf81oERAKpPVl506z53Xi1sns4/pvdTg==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.4.0", "get-tsconfig": "^4.10.0", @@ -3959,28 +2880,12 @@ } } }, - "node_modules/eslint-import-resolver-typescript/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -3998,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -4007,6 +2913,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=7.7.0" } @@ -4016,6 +2923,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -4049,6 +2957,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4059,6 +2968,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -4068,6 +2978,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4080,6 +2991,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4089,6 +3001,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4102,6 +3015,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4111,23 +3026,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -4137,6 +3039,8 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4146,13 +3050,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -4167,6 +3068,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -4184,6 +3086,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4195,6 +3098,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4205,6 +3109,8 @@ }, "node_modules/esquery": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4219,6 +3125,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4228,6 +3135,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4237,10 +3146,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -4250,6 +3162,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4267,10 +3180,14 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4285,6 +3202,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -4295,11 +3214,15 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, @@ -4316,10 +3239,13 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -4329,12 +3255,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, "node_modules/file-entry-cache": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4346,6 +3275,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -4356,6 +3287,8 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -4371,6 +3304,8 @@ }, "node_modules/flat-cache": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -4382,7 +3317,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -4391,6 +3328,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -4406,6 +3344,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -4418,13 +3357,15 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4438,6 +3379,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4447,6 +3389,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4467,6 +3410,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4476,6 +3420,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -4500,6 +3445,7 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -4512,6 +3458,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -4527,6 +3474,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -4544,6 +3492,7 @@ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -4555,6 +3504,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -4569,6 +3519,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4586,6 +3537,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -4599,6 +3552,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4608,6 +3562,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4620,6 +3575,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4632,6 +3588,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4648,6 +3605,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", "dev": true, + "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -4667,6 +3625,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4678,10 +3637,13 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, @@ -4690,6 +3652,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4697,11 +3660,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4714,6 +3688,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -4729,6 +3704,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4741,6 +3717,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4756,6 +3733,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4767,6 +3745,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4779,6 +3758,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -4789,6 +3769,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -4799,6 +3781,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", "dependencies": { "queue": "6.0.2" }, @@ -4810,7 +3793,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4825,6 +3810,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -4836,6 +3823,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4844,13 +3832,15 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -4864,6 +3854,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -4877,6 +3868,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4892,13 +3884,15 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -4918,6 +3912,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -4933,6 +3928,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -4949,6 +3945,7 @@ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.7.1" } @@ -4958,6 +3955,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4970,6 +3968,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -4985,6 +3984,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -5002,6 +4002,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -5015,6 +4016,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5025,6 +4028,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5040,6 +4044,7 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -5055,6 +4060,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -5068,6 +4075,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5077,6 +4085,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -5087,6 +4097,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -5103,6 +4114,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5112,6 +4124,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -5130,6 +4143,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5142,6 +4156,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5157,6 +4172,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -5173,6 +4189,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -5190,6 +4207,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -5205,6 +4223,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5217,6 +4236,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -5232,6 +4252,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -5247,19 +4268,25 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5271,25 +4298,33 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, @@ -5298,6 +4333,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -5310,12 +4346,15 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -5324,6 +4363,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5337,10 +4378,13 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -5355,20 +4399,34 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, + "node_modules/luxon": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -5376,6 +4434,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -5389,6 +4449,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5397,6 +4458,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, @@ -5406,6 +4468,8 @@ }, "node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -5423,19 +4487,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.1.5.tgz", - "integrity": "sha512-HI5bHONOUYqV+FJvueOSgjRxHTLB25a3xIv59ugAxFe7xRNbW96hyYbMbsKzl+QvFV9mN/SrtHwiU+vYhMwA7Q==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.1.6.tgz", + "integrity": "sha512-w1bClprmjwpybo+7M1Rd0N4QK5Ein8kH/1CQ0Wv8Q9vrLbDMakxc4rZpv8zYc8RVErUELJlFhM8UzOF3IqlYKw==", "dev": true, + "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" }, @@ -5448,6 +4516,8 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, @@ -5455,6 +4525,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -5464,6 +4535,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5476,6 +4548,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5485,6 +4558,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -5505,6 +4579,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5523,6 +4598,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5537,6 +4613,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -5554,12 +4631,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5579,6 +4659,7 @@ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", @@ -5593,6 +4674,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5607,6 +4690,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -5623,6 +4708,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", @@ -5641,6 +4727,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -5652,10 +4739,13 @@ "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -5668,6 +4758,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5683,6 +4774,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -5693,12 +4786,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -5708,17 +4804,20 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5726,15 +4825,19 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -5747,6 +4850,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "license": "Apache-2.0", "dependencies": { "playwright-core": "1.52.0" }, @@ -5764,6 +4868,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -5776,12 +4881,15 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -5793,6 +4901,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -5807,6 +4916,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5814,6 +4924,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -5824,12 +4936,15 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", "dependencies": { "inherits": "~2.0.3" } }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -5851,6 +4966,7 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -5873,6 +4989,7 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -5892,6 +5009,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5901,6 +5019,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -5918,6 +5037,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -5928,12 +5049,15 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -5945,6 +5069,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -5960,6 +5085,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.7" }, @@ -5999,6 +5125,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.1", "colorette": "^1.1.0", @@ -6012,6 +5139,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -6036,6 +5165,7 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6067,13 +5197,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" @@ -6090,6 +5222,7 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6107,6 +5240,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6119,6 +5253,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6136,6 +5271,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -6151,6 +5287,7 @@ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", @@ -6162,6 +5299,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6172,6 +5311,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -6182,6 +5323,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -6201,6 +5343,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -6217,6 +5360,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6235,6 +5379,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6254,6 +5399,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6262,6 +5408,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -6271,6 +5418,7 @@ "version": "2.8.4", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -6284,6 +5432,7 @@ "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", @@ -6297,6 +5446,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -6305,19 +5455,22 @@ "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6339,6 +5492,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -6357,6 +5511,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6374,6 +5529,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6383,6 +5539,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6390,11 +5547,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6406,6 +5577,7 @@ "version": "5.25.11", "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.25.11.tgz", "integrity": "sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==", + "license": "MIT", "os": [ "darwin", "linux", @@ -6432,6 +5604,7 @@ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, + "license": "MIT", "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -6448,6 +5621,7 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, + "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -6462,6 +5636,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6471,6 +5646,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -6484,6 +5661,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -6496,6 +5674,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -6506,10 +5685,13 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -6524,6 +5706,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6538,6 +5721,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -6557,6 +5741,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -6578,6 +5763,7 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -6598,6 +5784,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6611,6 +5798,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -6628,50 +5816,56 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/unrs-resolver": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.6.3.tgz", - "integrity": "sha512-mYNIMmxlDcaepmUTNrBu2tEB/bRkLBUeAhke8XOnXYqSu/9dUk4cdFiJG1N4d5Q7Fii+9MpgavkxJpnXPqNhHw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.0.tgz", + "integrity": "sha512-b76tVoT9KPniDY1GoYghDUQX20gjzXm/TONfHfgayLaiuo+oGyT9CsQkGCEJs+1/uryVBEOGOt3yYWDXbJhL7g==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { - "napi-postinstall": "^0.1.1" + "napi-postinstall": "^0.1.6" }, "funding": { "url": "https://github.com/sponsors/JounQin" }, "optionalDependencies": { - "@unrs/resolver-binding-darwin-arm64": "1.6.3", - "@unrs/resolver-binding-darwin-x64": "1.6.3", - "@unrs/resolver-binding-freebsd-x64": "1.6.3", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.6.3", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.6.3", - "@unrs/resolver-binding-linux-arm64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-arm64-musl": "1.6.3", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-s390x-gnu": "1.6.3", - "@unrs/resolver-binding-linux-x64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-x64-musl": "1.6.3", - "@unrs/resolver-binding-wasm32-wasi": "1.6.3", - "@unrs/resolver-binding-win32-arm64-msvc": "1.6.3", - "@unrs/resolver-binding-win32-ia32-msvc": "1.6.3", - "@unrs/resolver-binding-win32-x64-msvc": "1.6.3" + "@unrs/resolver-binding-darwin-arm64": "1.7.0", + "@unrs/resolver-binding-darwin-x64": "1.7.0", + "@unrs/resolver-binding-freebsd-x64": "1.7.0", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.0", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.0", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.0", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.0", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.0", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.0", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.0", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.0", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.0", + "@unrs/resolver-binding-linux-x64-musl": "1.7.0", + "@unrs/resolver-binding-wasm32-wasi": "1.7.0", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.0", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.0", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.0" } }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6686,12 +5880,15 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/esm/bin/uuid" } }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -6708,6 +5905,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -6727,6 +5925,7 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -6754,6 +5953,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -6772,6 +5972,7 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -6790,6 +5991,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -6799,12 +6002,14 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6825,6 +6030,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -6836,6 +6042,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -6843,6 +6050,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -6856,6 +6065,7 @@ "version": "3.24.3", "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/e2e-tests/playwright/package.json b/e2e-tests/playwright/package.json index 9c6adb67a9..257b4ea988 100644 --- a/e2e-tests/playwright/package.json +++ b/e2e-tests/playwright/package.json @@ -1,6 +1,8 @@ { "name": "mattermost-playwright", - "workspaces": ["lib"], + "workspaces": [ + "lib" + ], "scripts": { "postinstall": "script/post_install.sh && npm run build", "build": "npm run build --workspaces", @@ -27,9 +29,11 @@ "@playwright/test": "1.52.0", "cross-env": "7.0.3", "dayjs": "1.11.13", + "luxon": "3.6.1", "zod": "3.24.3" }, "devDependencies": { + "@types/luxon": "3.6.2", "@typescript-eslint/eslint-plugin": "8.30.1", "eslint": "9.25.0", "eslint-import-resolver-typescript": "4.3.3", diff --git a/e2e-tests/playwright/playwright.config.ts b/e2e-tests/playwright/playwright.config.ts index f956ebcc04..e948908aaf 100644 --- a/e2e-tests/playwright/playwright.config.ts +++ b/e2e-tests/playwright/playwright.config.ts @@ -36,7 +36,7 @@ export default defineConfig({ slowMo: testConfig.slowMo, }, screenshot: 'only-on-failure', - timezoneId: 'America/Los_Angeles', + timezoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, trace: 'off', video: 'retain-on-failure', actionTimeout: duration.half_min, diff --git a/e2e-tests/playwright/specs/functional/channels/account_settings/profile/popover_fields.spec.ts b/e2e-tests/playwright/specs/functional/channels/account_settings/profile/popover_fields.spec.ts index 8edaf7f197..3dd8a9d560 100644 --- a/e2e-tests/playwright/specs/functional/channels/account_settings/profile/popover_fields.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/account_settings/profile/popover_fields.spec.ts @@ -22,7 +22,7 @@ test('Profile popover should show correct fields after at-mention autocomplete @ }); // Create and add another user using admin client - const testUser2 = await adminClient.createUser(pw.random.user(), '', ''); + const testUser2 = await adminClient.createUser(pw.random.user('other'), '', ''); await adminClient.addToTeam(team.id, testUser2.id); // 1. Login as the first user @@ -40,7 +40,7 @@ test('Profile popover should show correct fields after at-mention autocomplete @ const currentUserProfilePopover = channelsPage.userProfilePopover; // * Verify all fields are visible for current user in the profile popover - await expect(currentUserProfilePopover.container.getByText(`@${user.username}`)).toBeVisible(); // TODO: Fix this + await expect(currentUserProfilePopover.container.getByText(`@${user.username}`)).toBeVisible(); await expect(currentUserProfilePopover.container.getByText(`${user.first_name} ${user.last_name}`)).toBeVisible(); await expect(currentUserProfilePopover.container.getByText(user.email)).toBeVisible(); diff --git a/e2e-tests/playwright/specs/functional/channels/scheduled_drafts/create_scheduled_draft.spec.ts b/e2e-tests/playwright/specs/functional/channels/scheduled_drafts/create_scheduled_draft.spec.ts deleted file mode 100644 index 9d86fe9ddb..0000000000 --- a/e2e-tests/playwright/specs/functional/channels/scheduled_drafts/create_scheduled_draft.spec.ts +++ /dev/null @@ -1,411 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import type {Page} from '@playwright/test'; - -import {expect, PlaywrightExtended, test} from '@mattermost/playwright-lib'; -import type {ChannelsPage, ScheduledDraftPage} from '@mattermost/playwright-lib'; - -test.skip('MM-T5643_1 should create a scheduled message from a channel', async ({pw}) => { - test.setTimeout(pw.duration.four_min); - - const draftMessage = 'Scheduled Draft'; - // # Skip test if no license - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - const {page, channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage); - await scheduleMessage(channelsPage); - - await channelsPage.centerView.verifyscheduledDraftChannelInfo(); - - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - // # Hover and verify options - await scheduledDraftPage.verifyOnHoverActionItems(draftMessage); - - // # Go back and wait for message to arrive - await goBackToChannelAndWaitForMessageToArrive(pw, page); - - // * Verify the message has been sent and there's no more scheduled messages - await expect(channelsPage.centerView.scheduledDraftChannelInfoMessage).not.toBeVisible(); - await expect(channelsPage.sidebarLeft.scheduledDraftCountonLHS).not.toBeVisible(); - const lastPost = await channelsPage.getLastPost(); - await expect(lastPost.body).toHaveText(draftMessage); - await channelsPage.sidebarLeft.assertNoPendingScheduledDraft(); -}); - -test('MM-T5643_6 should create a scheduled message under a thread post ', async ({pw}) => { - const draftMessage = 'Scheduled Threaded Message'; - // # Skip test if no license - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - - // # Log in as a user in new browser context - const {channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - // # Visit default channel page - await channelsPage.goto(); - await channelsPage.toBeVisible(); - - await channelsPage.postMessage('Root Message'); - - // # Start a thread by clicking on reply menuitem from post options menu - const post = await channelsPage.getLastPost(); - await replyToLastPost(post); - - const sidebarRight = channelsPage.sidebarRight; - await sidebarRight.toBeVisible(); - - // # Post a message in the thread - await sidebarRight.postMessage('Replying to a thread'); - - // # Write a message in the reply thread but don't send it - await sidebarRight.postCreate.writeMessage(draftMessage); - await expect(sidebarRight.postCreate.input).toHaveText(draftMessage); - - await sidebarRight.postCreate.scheduleDraftMessageButton.isVisible(); - await sidebarRight.postCreate.scheduleDraftMessageButton.click(); - - await scheduleMessage(channelsPage); - - await sidebarRight.postBoxIndicator.isVisible(); - const messageLocator = sidebarRight.scheduledDraftChannelInfoMessage.first(); - await expect(messageLocator).toContainText('Message scheduled for'); - - // Save the time displayed in the thread - const scheduledDraftThreadedPanelInfo = await sidebarRight.postBoxIndicator.innerText(); - - await channelsPage.sidebarRight.clickOnSeeAllscheduledDrafts(); - const scheduledDraftPageInfo = await scheduledDraftPage.scheduledDraftPageInfo.innerHTML(); - await channelsPage.sidebarLeft.assertscheduledDraftCountLHS('1'); - - await scheduledDraftPage.toBeVisible(); - await scheduledDraftPage.assertBadgeCountOnTab('1'); - - await scheduledDraftPage.assertscheduledDraftBody(draftMessage); - - await compareMessageTimestamps(scheduledDraftThreadedPanelInfo, scheduledDraftPageInfo, scheduledDraftPage); - - // # Hover and verify options - await scheduledDraftPage.verifyOnHoverActionItems(draftMessage); - - await scheduledDraftPage.sendScheduledMessage(draftMessage); - - await sidebarRight.toBeVisible(); - (await sidebarRight.getLastPost()).toContainText(draftMessage); - - await expect(channelsPage.sidebarRight.scheduledDraftChannelInfoMessage.first()).not.toBeVisible(); - await expect(channelsPage.sidebarLeft.scheduledDraftCountonLHS).not.toBeVisible(); - await channelsPage.sidebarLeft.assertNoPendingScheduledDraft(); -}); - -test('MM-T5644 should reschedule a scheduled message', async ({pw}) => { - const draftMessage = 'Scheduled Draft'; - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - const {channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage); - await scheduleMessage(channelsPage); - - // * Verify the Initial Date and time of scheduled Draft - await channelsPage.centerView.verifyscheduledDraftChannelInfo(); - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - await scheduledDraftPage.openRescheduleModal(draftMessage); - - // # Reschedule it to 2 days from today - await channelsPage.scheduledDraftModal.selectDay(2); - await channelsPage.scheduledDraftModal.confirm(); - - // # Note the new Scheduled time - const scheduledDraftPageInfo = await scheduledDraftPage.getTimeStampOfMessage(draftMessage); - - // # Go to Channel - await channelsPage.goto(); - - // * Verify the New Time reflecting in the channel - const rescheduledDraftChannelInfo = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - await compareMessageTimestamps(rescheduledDraftChannelInfo, scheduledDraftPageInfo, scheduledDraftPage); -}); - -test('MM-T5645 should delete a scheduled message', async ({pw}) => { - const draftMessage = 'Scheduled Draft'; - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - const {channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage); - await scheduleMessage(channelsPage); - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - await scheduledDraftPage.deleteScheduledMessage(draftMessage); - - await expect(scheduledDraftPage.scheduledDraftPanel(draftMessage)).not.toBeVisible(); - await expect(scheduledDraftPage.noscheduledDraftIcon).toBeVisible(); -}); - -test('MM-T5643_9 should send a scheduled message immediately', async ({pw}) => { - const draftMessage = 'Scheduled Draft'; - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - const {channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage); - await scheduleMessage(channelsPage); - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - await scheduledDraftPage.sendScheduledMessage(draftMessage); - await pw.wait(pw.duration.two_sec); - - await expect(scheduledDraftPage.scheduledDraftPanel(draftMessage)).not.toBeVisible(); - - // Verify message has arrived - await expect(channelsPage.centerView.scheduledDraftChannelInfoMessage).not.toBeVisible(); - await expect(channelsPage.sidebarLeft.scheduledDraftCountonLHS).not.toBeVisible(); - const lastPost = await channelsPage.getLastPost(); - await expect(lastPost.body).toHaveText(draftMessage); -}); - -test('MM-T5643_3 should create a scheduled message from a DM', async ({pw}) => { - const draftMessage = 'Scheduled Draft'; - // # Skip test if no license - await pw.skipIfNoLicense(); - - const {user, team} = await pw.initSetup(); - const {user: user2} = await pw.initSetup(); - - const {page, channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage, team.name, `@${user2.username}`); - await scheduleMessage(channelsPage); - - await channelsPage.centerView.goToScheduledDraftsFromDMChannel(); - - // # Hover and verify options - await scheduledDraftPage.verifyOnHoverActionItems(draftMessage); - - await scheduledDraftPage.sendScheduledMessage(draftMessage); - await page.waitForSelector(channelsPage.centerView.scheduledDraftChannelInfoMessageLocator, {state: 'hidden'}); - - // * Verify the message has been sent and there's no more scheduled messages - await expect(channelsPage.centerView.scheduledDraftChannelInfoMessage).not.toBeVisible(); - await expect(channelsPage.sidebarLeft.scheduledDraftCountonLHS).not.toBeVisible(); - const lastPost = await channelsPage.getLastPost(); - await expect(lastPost.body).toHaveText(draftMessage); - - await channelsPage.sidebarLeft.assertNoPendingScheduledDraft(); -}); - -test('MM-T5648 should create a draft and then schedule it', async ({pw}) => { - const draftMessage = 'Draft to be Scheduled'; - await pw.skipIfNoLicense(); - - const {user, team} = await pw.initSetup(); - const {channelsPage, draftPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - // await setupChannelPage(channelsPage, draftMessage); - await channelsPage.goto(); - await channelsPage.toBeVisible(); - await channelsPage.centerView.postCreate.writeMessage(draftMessage); - - // go to drafts page - await draftPage.goTo(team.name); - await draftPage.toBeVisible(); - await draftPage.assertBadgeCountOnTab('1'); - await draftPage.assertDraftBody(draftMessage); - await draftPage.verifyScheduleIcon(draftMessage); - await draftPage.openScheduleModal(draftMessage); - - // # Reschedule it to 2 days from today - await channelsPage.scheduledDraftModal.selectDay(2); - await channelsPage.scheduledDraftModal.confirm(); - - await scheduledDraftPage.goTo(team.name); - await scheduledDraftPage.toBeVisible(); - await scheduledDraftPage.assertBadgeCountOnTab('1'); - await scheduledDraftPage.assertscheduledDraftBody(draftMessage); -}); - -test('MM-T5644 should edit scheduled message', async ({pw}) => { - const draftMessage = 'Scheduled Draft'; - // # Skip test if no license - await pw.skipIfNoLicense(); - - const {user} = await pw.initSetup(); - const {page, channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage); - await scheduleMessage(channelsPage); - - await channelsPage.centerView.verifyscheduledDraftChannelInfo(); - - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - // # Hover and verify options - await scheduledDraftPage.verifyOnHoverActionItems(draftMessage); - - const updatedText = 'updated text'; - await scheduledDraftPage.editText(updatedText); - - await scheduledDraftPage.sendScheduledMessage(updatedText); - - // * Verify the message has been sent and there's no more scheduled messages - await page.waitForSelector(channelsPage.centerView.scheduledDraftChannelInfoMessageLocator, {state: 'hidden'}); - await expect(channelsPage.centerView.scheduledDraftChannelInfoMessage).not.toBeVisible(); - await expect(channelsPage.sidebarLeft.scheduledDraftCountonLHS).not.toBeVisible(); - const lastPost = await channelsPage.getLastPost(); - await expect(lastPost.body).toHaveText(updatedText); - - await channelsPage.sidebarLeft.assertNoPendingScheduledDraft(); -}); - -test('MM-T5650 should copy scheduled message', async ({pw, browserName}) => { - // Skip this test in Firefox clipboard permissions are not supported - test.skip(browserName === 'firefox', 'Test not supported in Firefox'); - - // # Skip test if no license - await pw.skipIfNoLicense(); - - const draftMessage = 'Scheduled Draft'; - - const {user} = await pw.initSetup(); - const {page, channelsPage, scheduledDraftPage} = await pw.testBrowser.login(user); - - await setupChannelPage(channelsPage, draftMessage, '', 'town-square'); - await scheduleMessage(channelsPage); - - await channelsPage.centerView.verifyscheduledDraftChannelInfo(); - - const postBoxIndicator = await channelsPage.centerView.scheduledDraftChannelInfoMessageText.innerText(); - - await verifyScheduledDraft(channelsPage, scheduledDraftPage, draftMessage, postBoxIndicator); - - await scheduledDraftPage.copyScheduledMessage(draftMessage); - - await page.goBack(); - - await channelsPage.centerView.postCreate.input.focus(); - - await page.keyboard.down('ControlOrMeta'); - await page.keyboard.press('V'); - await page.keyboard.up('ControlOrMeta'); - - // * Assert the message typed is same as the copied message - await expect(channelsPage.centerView.postCreate.input).toHaveText(draftMessage); -}); - -async function goBackToChannelAndWaitForMessageToArrive(pw: PlaywrightExtended, page: Page): Promise { - await page.goBack(); - await pw.wait(pw.duration.two_min); - await page.reload(); -} - -async function replyToLastPost(post: any): Promise { - await post.hover(); - await post.postMenu.toBeVisible(); - await post.postMenu.reply(); -} - -async function setupChannelPage( - channelsPage: ChannelsPage, - draftMessage: string, - teamName?: string, - channelName?: string, -): Promise { - await channelsPage.goto(teamName, channelName); - await channelsPage.toBeVisible(); - - await channelsPage.centerView.postCreate.writeMessage(draftMessage); - await channelsPage.centerView.postCreate.clickOnScheduleDraftDropdownButton(); -} - -/** - * Schedules a draft message by selecting a custom time and confirming. - */ -async function scheduleMessage(channelsPage: ChannelsPage): Promise { - await channelsPage.scheduledDraftDropdown.toBeVisible(); - await channelsPage.scheduledDraftDropdown.selectCustomTime(); - - await channelsPage.scheduledDraftModal.toBeVisible(); - await channelsPage.scheduledDraftModal.selectDay(); - await channelsPage.scheduledDraftModal.selectTime(); - await channelsPage.scheduledDraftModal.confirm(); -} - -/** - * Extracts and verifies the scheduled message on the scheduled page and in the channel. - */ -async function verifyScheduledDraft( - channelsPage: ChannelsPage, - scheduledDraftPage: ScheduledDraftPage, - draftMessage: string, - postBoxIndicator: string, -): Promise { - await verifyscheduledDraftCount(channelsPage, '1'); - await scheduledDraftPage.toBeVisible(); - await scheduledDraftPage.assertBadgeCountOnTab('1'); - await scheduledDraftPage.assertscheduledDraftBody(draftMessage); - - const scheduledDraftPageInfo = await scheduledDraftPage.getTimeStampOfMessage(draftMessage); - await compareMessageTimestamps(postBoxIndicator, scheduledDraftPageInfo, scheduledDraftPage); -} - -/** - * Verifies the scheduled message count on the sidebar. - */ -async function verifyscheduledDraftCount(page: ChannelsPage, expectedCount: string): Promise { - await page.centerView.clickOnSeeAllscheduledDrafts(); - await page.sidebarLeft.assertscheduledDraftCountLHS(expectedCount); -} - -/** - * Compares the time in the channel and the scheduled page to ensure consistency. - */ -async function compareMessageTimestamps( - timeInChannel: string, - scheduledDraftPageInfo: string, - scheduledDraftPage: ScheduledDraftPage, -): Promise { - // Extract time from channel using the same date pattern - const matchedTimeInChannel = timeInChannel.match(scheduledDraftPage.datePattern); - const timeInSchedulePage = extractTimeFromHtml(scheduledDraftPageInfo, scheduledDraftPage); - - if (!matchedTimeInChannel || !timeInSchedulePage) { - throw new Error('Could not extract date and time from one or both elements.'); - } - - const firstElementTime = matchedTimeInChannel[0]; - const secondElementTime = timeInSchedulePage[0]; - - // Compare extracted times - expect(firstElementTime).toBe(secondElementTime); -} - -/** - * Removes HTML tags from the scheduled message content and extracts the time pattern. - */ -function extractTimeFromHtml(htmlContent: string, scheduledDraftPage: ScheduledDraftPage): RegExpMatchArray | null { - // Remove all HTML tags and match the expected time pattern using the datePattern from scheduledDraftPage - const cleanedText = htmlContent.replace(/<\/?[^>]+(>|$)/g, ''); - - // Use the datePattern to extract the exact match for time - const matchedTime = cleanedText.match(scheduledDraftPage.datePattern); - return matchedTime; -} diff --git a/e2e-tests/playwright/specs/functional/channels/scheduled_messages/scheduled_messages.spec.ts b/e2e-tests/playwright/specs/functional/channels/scheduled_messages/scheduled_messages.spec.ts new file mode 100644 index 0000000000..18faec8692 --- /dev/null +++ b/e2e-tests/playwright/specs/functional/channels/scheduled_messages/scheduled_messages.spec.ts @@ -0,0 +1,519 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {expect, test, ScheduledPostIndicator} from '@mattermost/playwright-lib'; +import type {ChannelsPage, ScheduledPostsPage} from '@mattermost/playwright-lib'; + +test.beforeEach(async ({pw}) => { + // Ensure license but skip test if no license which is required for "Scheduled Drafts" + await pw.ensureLicense(); + await pw.skipIfNoLicense(); +}); + +/** + * @objective Verify the ability to create a scheduled message from a channel. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5643_1 should create a scheduled message from a channel', {tag: '@scheduled_messages'}, async ({pw}) => { + // Set test timeout to 4 mins to wait for the scheduled message to be sent + // which is expected within 2 mins. + test.setTimeout(pw.duration.four_min); + + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user} = await pw.initSetup(); + const {page, channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 0, 1); + + // * Verify scheduled post indicator with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, indicatorMessage); + + // * Verify scheduled post badge in left sidebar shows correct count + await verifyScheduledPostBadgeOnLeftSidebar(channelsPage, 1); + + // 3. Click "See all link" to navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send ${selectedDate} at ${selectedTime}`; + await verifyScheduledPost(scheduledPostsPage, {draftMessage, sendOnMessage, badgeCountOnTab: 1}); + + // 4. Go back to the channels page + await page.goBack(); + + // * Verify the message has been posted and there's no more scheduled messages + await pw.waitUntil( + async () => { + const post = await channelsPage.getLastPost(); + const content = await post.container.textContent(); + + return content?.includes(draftMessage); + }, + {timeout: pw.duration.two_min}, + ); + await channelsPage.centerView.scheduledPostIndicator.toBeNotVisible(); + await expect(scheduledPostsPage.badge).not.toBeVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); +}); + +/** + * @objective Verify the ability to create a scheduled message in a thread. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5643_6 should create a scheduled message under a thread post', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Threaded Message ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user} = await pw.initSetup(); + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Post a message + await channelsPage.postMessage('Root Message'); + + // 3. Reply to a message + const {sidebarRight} = await channelsPage.replyToLastPost('Replying to a thread'); + + // 4. Create a scheduled message from the thread + const {selectedDate, selectedTime} = await channelsPage.scheduleMessageFromThread(draftMessage, 1); + + // * Verify scheduled post indicator with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(sidebarRight.scheduledPostIndicator, indicatorMessage); + + // 5. Navigate to scheduled posts page + await sidebarRight.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 6. Hover over the scheduled post and send now + await scheduledPost.hover(); + await scheduledPost.sendNowButton.click(); + await scheduledPostsPage.sendMessageNowModal.toBeVisible(); + await scheduledPostsPage.sendMessageNowModal.sendNowButton.click(); + + // * Verify the message has been posted and there's no more scheduled messages + await sidebarRight.toBeVisible(); + const lastPost = await sidebarRight.getLastPost(); + await expect(lastPost.body).toContainText(draftMessage); + await sidebarRight.scheduledPostIndicator.toBeNotVisible(); + await expect(scheduledPostsPage.noScheduledDrafts).toBeVisible(); + await expect(scheduledPostsPage.badge).not.toBeVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); +}); + +/** + * @objective Verify the ability to reschedule a scheduled message. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5644 should reschedule a scheduled message', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user} = await pw.initSetup(); + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message with 1 day offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 1); + + // * Verify scheduled message indicator appears with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, indicatorMessage); + + // * Verify scheduled post badge in left sidebar shows correct count + await verifyScheduledPostBadgeOnLeftSidebar(channelsPage, 1); + + // 3. Navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 4. Reschedule message to 2 days from today + const {selectedDate: newSelectedDate, selectedTime: newSelectedTime} = await scheduledPostsPage.rescheduleMessage( + scheduledPost, + 2, + ); + + // 5. Return to channel page + await channelsPage.goto(); + + // * Verify the message shows updated scheduled time + const newIndicatorMessage = `Message scheduled for ${newSelectedDate} at ${newSelectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, newIndicatorMessage); +}); + +/** + * @objective Verify the ability to delete a scheduled message. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5645 should delete a scheduled message', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user} = await pw.initSetup(); + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message with 1 day offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 1); + + // * Verify scheduled message indicator appears with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, indicatorMessage); + + // 3. Navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 4. Delete the scheduled message + await scheduledPost.hover(); + await scheduledPost.deleteButton.click(); + + await scheduledPostsPage.deleteScheduledPostModal.toBeVisible(); + await scheduledPostsPage.deleteScheduledPostModal.deleteButton.click(); + + // * Verify the scheduled message is removed from the scheduled posts page + await expect(scheduledPostsPage.noScheduledDrafts).toBeVisible(); + await expect(scheduledPostsPage.badge).not.toBeVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); +}); + +/** + * @objective Verify the ability to send a scheduled message immediately. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5643_9 should send a scheduled message immediately', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user, townSquareUrl} = await pw.initSetup(); + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message with 1 day offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 1); + + // * Verify scheduled message indicator appears with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, indicatorMessage); + + // 3. Navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 4. Send the scheduled message immediately + await scheduledPost.hover(); + await scheduledPost.sendNowButton.click(); + await scheduledPostsPage.sendMessageNowModal.toBeVisible(); + await scheduledPostsPage.sendMessageNowModal.sendNowButton.click(); + + // * Verify it redirects to the channels page, the message has been posted and there's no more scheduled messages + await expect(channelsPage.page).toHaveURL(townSquareUrl); + await channelsPage.centerView.scheduledPostIndicator.toBeNotVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); + const lastPost = await channelsPage.getLastPost(); + await expect(lastPost.body).toContainText(draftMessage); +}); + +/** + * @objective Verify the ability to create a scheduled message from a direct message (DM). + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5643_3 should create a scheduled message from a DM', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user and another user + const {user, team, adminClient} = await pw.initSetup(); + const otherUser = await adminClient.createUser(pw.random.user(), '', ''); + + // 2. Login the first user and navigate to a DM channel with the other user + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(team.name, `@${otherUser.username}`); + await channelsPage.toBeVisible(); + + // 3. Create a scheduled message with 1 day offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 1); + + // * Verify scheduled message indicator appears with correct date/time + let indicatorMessage; + if (pw.isOutsideRemoteUserHour(otherUser.timezone)) { + indicatorMessage = 'You have one scheduled message.'; + } else { + indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + } + await channelsPage.centerView.scheduledPostIndicator.toBeVisible(); + await expect(channelsPage.centerView.scheduledPostIndicator.messageText).toContainText(indicatorMessage); + + // 4. Navigate to scheduled posts page + if (pw.isOutsideRemoteUserHour(otherUser.timezone)) { + await channelsPage.centerView.scheduledPostIndicator.scheduledMessageLink.click(); + } else { + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + } + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 5. Send the scheduled message immediately + await scheduledPost.hover(); + await scheduledPost.sendNowButton.click(); + await scheduledPostsPage.sendMessageNowModal.toBeVisible(); + await scheduledPostsPage.sendMessageNowModal.sendNowButton.click(); + + // * Verify it redirects to the DM channel, message is posted and there's no more scheduled messages + await expect(channelsPage.page).toHaveURL(`/${team.name}/messages/@${otherUser.username}`); + await channelsPage.centerView.scheduledPostIndicator.toBeNotVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); + const lastPost = await channelsPage.getLastPost(); + await expect(lastPost.body).toContainText(draftMessage); +}); + +/** + * @objective Verify the ability to convert a draft message to a scheduled message. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5648 should create a draft and then schedule it', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user, team} = await pw.initSetup(); + const {channelsPage, draftsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a draft message + await channelsPage.centerView.postCreate.input.fill(draftMessage); + + // 3. Go to drafts page + await draftsPage.goto(team.name); + await draftsPage.toBeVisible(); + expect(await draftsPage.getBadgeCountOnTab()).toBe('1'); + + // * Verify draft message exists + const draftedPost = await draftsPage.getLastPost(); + await expect(draftedPost.panelBody).toContainText(draftMessage); + + // 4. Open schedule modal from draft and schedule it to the next 2 days + await draftedPost.hover(); + await draftedPost.scheduleButton.click(); + await draftsPage.scheduleMessageModal.toBeVisible(); + const {selectedDate, selectedTime} = await draftsPage.scheduleMessageModal.scheduleMessage(2); + + // 5. Navigate to scheduled posts page + await scheduledPostsPage.goto(team.name); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + await verifyScheduledPost(scheduledPostsPage, {draftMessage, sendOnMessage, badgeCountOnTab: 1}); +}); + +/** + * @objective Verify the ability to edit a scheduled message before it's sent. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5644 should edit scheduled message', {tag: '@scheduled_messages'}, async ({pw}) => { + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user, townSquareUrl} = await pw.initSetup(); + const {channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message with 2 days offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 2); + + // * Verify scheduled message indicator appears with correct date/time + const indicatorMessage = `Message scheduled for ${selectedDate} at ${selectedTime}.`; + await verifyScheduledPostIndicator(channelsPage.centerView.scheduledPostIndicator, indicatorMessage); + + // * Verify scheduled post badge in left sidebar shows correct count + await verifyScheduledPostBadgeOnLeftSidebar(channelsPage, 1); + + // 3. Navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 4. Hover and click edit button + await scheduledPost.hover(); + await scheduledPost.editButton.click(); + + // 5. Edit the scheduled message + const updatedText = 'updated text'; + await scheduledPost.editTextBox.fill(updatedText); + await scheduledPost.saveButton.click(); + + // 6. Verify the edited message appears in the channel + await expect(scheduledPost.panelBody).toContainText(updatedText); + await expect(scheduledPost.panelHeader).toContainText(`Send on ${selectedDate} at ${selectedTime}`); + + // 7. Send the message immediately + await scheduledPost.hover(); + await scheduledPost.sendNowButton.click(); + await scheduledPostsPage.sendMessageNowModal.toBeVisible(); + await scheduledPostsPage.sendMessageNowModal.sendNowButton.click(); + + // * Verify it redirects to the channels page, the message has been posted and there's no more scheduled messages + await expect(channelsPage.page).toHaveURL(townSquareUrl); + await channelsPage.centerView.scheduledPostIndicator.toBeNotVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).not.toBeVisible(); + const lastPost = await channelsPage.getLastPost(); + await expect(lastPost.body).toHaveText(updatedText); +}); + +/** + * @objective Verify the ability to copy a scheduled message to clipboard. + * + * @precondition + * A test server with valid license to support scheduled message features + */ +test('MM-T5650 should copy scheduled message', {tag: '@scheduled_messages'}, async ({pw, browserName}) => { + // Skip this test in Firefox clipboard permissions are not supported + test.skip(browserName === 'firefox', 'Test not supported in Firefox'); + + const draftMessage = `Scheduled Draft ${pw.random.id()}`; + + // 1. Setup test user, login and navigate to a channel + const {user} = await pw.initSetup(); + const {page, channelsPage, scheduledPostsPage} = await pw.testBrowser.login(user); + await channelsPage.goto(); + await channelsPage.toBeVisible(); + + // 2. Create a scheduled message with 1 day offset + const {selectedDate, selectedTime} = await channelsPage.scheduleMessage(draftMessage, 1); + + // * Verify scheduled post badge in left sidebar shows correct count + await verifyScheduledPostBadgeOnLeftSidebar(channelsPage, 1); + + // 3. Navigate to scheduled posts page + await channelsPage.centerView.scheduledPostIndicator.seeAllLink.click(); + + // * Verify scheduled posts page displays correct information + const sendOnMessage = `Send on ${selectedDate} at ${selectedTime}`; + const scheduledPost = await verifyScheduledPost(scheduledPostsPage, { + draftMessage, + sendOnMessage, + badgeCountOnTab: 1, + }); + + // 4. Copy the scheduled message + await scheduledPost.hover(); + await scheduledPost.copyTextButton.click(); + + // 5. Return to channel page + await page.goBack(); + + // 6. Paste the copied message in post creator + await channelsPage.centerView.postCreate.input.focus(); + await page.keyboard.down('ControlOrMeta'); + await page.keyboard.press('V'); + await page.keyboard.up('ControlOrMeta'); + + // * Verify the copied message is pasted in the post input box + await expect(channelsPage.centerView.postCreate.input).toHaveText(draftMessage); +}); + +/** + * Verifies that the scheduled post indicator is visible and displays the correct date and time. + * + * @param scheduledPostIndicator - The ScheduledPostIndicator instance + * @param messageText - A post message + */ +async function verifyScheduledPostIndicator(scheduledPostIndicator: ScheduledPostIndicator, messageText: string) { + await scheduledPostIndicator.toBeVisible(); + await expect(scheduledPostIndicator.icon).toBeVisible(); + await expect(scheduledPostIndicator.messageText).toContainText(messageText); +} + +async function verifyScheduledPostBadgeOnLeftSidebar(channelsPage: ChannelsPage, count: number) { + await channelsPage.sidebarLeft.scheduledPostBadge.isVisible(); + await expect(channelsPage.sidebarLeft.scheduledPostBadge).toHaveText(count.toString()); +} + +async function verifyScheduledPost( + scheduledPostsPage: ScheduledPostsPage, + { + draftMessage, + sendOnMessage, + badgeCountOnTab, + }: {draftMessage: string; sendOnMessage: string; badgeCountOnTab: number}, +) { + // * Verify scheduled posts page is visible + await scheduledPostsPage.toBeVisible(); + + // * Verify scheduled post badge on tab has correct count + expect(await scheduledPostsPage.getBadgeCountOnTab()).toBe(badgeCountOnTab.toString()); + + // * Verify scheduled post appears in scheduled posts page + const scheduledPost = await scheduledPostsPage.getLastPost(); + await expect(scheduledPost.panelBody).toContainText(draftMessage); + + await expect(scheduledPost.panelHeader).toContainText(sendOnMessage); + + return scheduledPost; +} diff --git a/e2e-tests/playwright/specs/functional/channels/sidebar_right/page_up_down_scroll.spec.ts b/e2e-tests/playwright/specs/functional/channels/sidebar_right/page_up_down_scroll.spec.ts index 0aba6ca230..e612d8105c 100644 --- a/e2e-tests/playwright/specs/functional/channels/sidebar_right/page_up_down_scroll.spec.ts +++ b/e2e-tests/playwright/specs/functional/channels/sidebar_right/page_up_down_scroll.spec.ts @@ -13,8 +13,8 @@ test('should be able to scroll the RHS with page up and down', async ({pw}) => { await channelsPage.toBeVisible(); await channelsPage.centerView.postCreate.postMessage('post'); - const lastPost = await channelsPage.centerView.getLastPost(); - await lastPost.openRhs(); + const lastPost = await channelsPage.getLastPost(); + await lastPost.reply(); for (let i = 0; i < 10; i++) { await channelsPage.sidebarRight.postCreate.postMessage('a\n'.repeat(10)); diff --git a/webapp/channels/src/components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator.tsx b/webapp/channels/src/components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator.tsx index 91769825da..5d29c1a730 100644 --- a/webapp/channels/src/components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator.tsx +++ b/webapp/channels/src/components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator.tsx @@ -98,7 +98,10 @@ export default function ScheduledPostIndicator({location, channelId, postId, rem } return ( -
+
+
= ({ onToggle={setIsInteracting} >