From b450f818ebeecd2ebedeb78652c7d1175ad573a2 Mon Sep 17 00:00:00 2001
From: Tasso Evangelista
Date: Wed, 20 Aug 2025 15:28:01 -0300
Subject: [PATCH 001/197] regression(desktop-app): Removed user presence
package dependency (#36740)
---
.../client/definitions/IRocketChatDesktop.ts | 51 ++++++++++++++++---
apps/meteor/client/lib/userPresence.ts | 33 ++++++++++--
apps/meteor/client/main.ts | 1 +
.../client/providers/UserPresenceProvider.tsx | 2 +-
.../meteor/client/startup/fakeUserPresence.ts | 18 +++++++
.../hooks/useVideoConfOpenCall.spec.tsx | 2 +-
6 files changed, 96 insertions(+), 11 deletions(-)
create mode 100644 apps/meteor/client/startup/fakeUserPresence.ts
diff --git a/apps/meteor/client/definitions/IRocketChatDesktop.ts b/apps/meteor/client/definitions/IRocketChatDesktop.ts
index a0707e9ba6d75..b91a23ac1124f 100644
--- a/apps/meteor/client/definitions/IRocketChatDesktop.ts
+++ b/apps/meteor/client/definitions/IRocketChatDesktop.ts
@@ -1,10 +1,49 @@
+type ServerInfo = {
+ version: string;
+};
+
+type Badge = '•' | number;
+
+type ThemeAppearance = 'dark' | 'light' | 'auto' | 'high-contrast' | undefined;
+
+type VideoCallWindowOptions = {
+ providerName?: string | undefined;
+};
+
type OutlookEventsResponse = { status: 'success' | 'canceled' };
export interface IRocketChatDesktop {
- openInternalVideoChatWindow?: (url: string, options: { providerName: string | undefined }) => void;
- getOutlookEvents?: (date: Date) => Promise;
- setOutlookExchangeUrl?: (url: string, userId: string) => Promise;
- hasOutlookCredentials?: () => Promise;
- clearOutlookCredentials?: () => Promise | void;
- openDocumentViewer?: (url: string, format: string, options: any) => void;
+ onReady: (cb: (serverInfo: ServerInfo) => void) => void;
+ setServerInfo: (serverInfo: ServerInfo) => void;
+ setUrlResolver: (getAbsoluteUrl: (relativePath?: string) => string) => void;
+ setBadge: (badge: Badge) => void;
+ setFavicon: (faviconUrl: string) => void;
+ setBackground: (imageUrl: string) => void;
+ setSidebarCustomTheme: (customTheme: string) => void;
+ setTitle: (title: string) => void;
+ setUserLoggedIn: (userLoggedIn: boolean) => void;
+ setUserPresenceDetection: (options: {
+ isAutoAwayEnabled: boolean;
+ idleThreshold: number | null;
+ setUserOnline: (online: boolean) => void;
+ }) => void;
+ setUserThemeAppearance: (themeAppearance: ThemeAppearance) => void;
+ createNotification: (
+ options: NotificationOptions & {
+ canReply?: boolean;
+ title: string;
+ onEvent: (eventDescriptor: { type: string; detail: unknown }) => void;
+ },
+ ) => Promise;
+ destroyNotification: (id: unknown) => void;
+ getInternalVideoChatWindowEnabled: () => boolean;
+ openInternalVideoChatWindow: (url: string, options: VideoCallWindowOptions) => void;
+ setGitCommitHash: (gitCommitHash: string) => void;
+ writeTextToClipboard: (text: string) => void;
+ getOutlookEvents: (date: Date) => Promise;
+ setOutlookExchangeUrl: (url: string, userId: string) => void;
+ hasOutlookCredentials: () => Promise;
+ clearOutlookCredentials: () => void;
+ setUserToken: (token: string, userId: string) => void;
+ openDocumentViewer: (url: string, format: string, options: any) => void;
}
diff --git a/apps/meteor/client/lib/userPresence.ts b/apps/meteor/client/lib/userPresence.ts
index 31ed7570f320c..835c3230781e7 100644
--- a/apps/meteor/client/lib/userPresence.ts
+++ b/apps/meteor/client/lib/userPresence.ts
@@ -25,7 +25,7 @@ export class UserPresence {
private storeUser: (doc: IUser) => void = () => undefined;
- private startTimer() {
+ startTimer() {
this.stopTimer();
if (!this.awayTime) return;
@@ -70,15 +70,42 @@ export class UserPresence {
const isLoggingIn = useIsLoggingIn();
const enableAutoAway = useUserPreference('enableAutoAway');
const idleTimeLimit = useUserPreference('idleTimeLimit') ?? 300;
+ const { RocketChatDesktop } = window;
this.user = user;
this.connected = connected;
- this.awayTime = enableAutoAway ? idleTimeLimit * 1000 : undefined;
+ this.awayTime = enableAutoAway && !RocketChatDesktop ? idleTimeLimit * 1000 : undefined;
this.goOnline = useMethod('UserPresence:online');
this.goAway = useMethod('UserPresence:away');
this.storeUser = Users.use((state) => state.store);
useEffect(() => {
+ if (!RocketChatDesktop) return;
+
+ RocketChatDesktop.setUserPresenceDetection({
+ isAutoAwayEnabled: enableAutoAway ?? false,
+ idleThreshold: idleTimeLimit,
+ setUserOnline: (online) => {
+ if (!online) {
+ this.goAway();
+ return;
+ }
+ this.goOnline();
+ },
+ });
+
+ return () => {
+ RocketChatDesktop.setUserPresenceDetection({
+ isAutoAwayEnabled: false,
+ idleThreshold: null,
+ setUserOnline: () => undefined,
+ });
+ };
+ }, [RocketChatDesktop, enableAutoAway, idleTimeLimit]);
+
+ useEffect(() => {
+ if (RocketChatDesktop) return;
+
const documentEvents = ['mousemove', 'mousedown', 'touchend', 'keydown'] as const;
documentEvents.forEach((key) => document.addEventListener(key, this.setOnline));
window.addEventListener('focus', this.setOnline);
@@ -87,7 +114,7 @@ export class UserPresence {
documentEvents.forEach((key) => document.removeEventListener(key, this.setOnline));
window.removeEventListener('focus', this.setOnline);
};
- }, []);
+ }, [RocketChatDesktop]);
useEffect(() => {
if (!user || !connected || isLoggingIn) return;
diff --git a/apps/meteor/client/main.ts b/apps/meteor/client/main.ts
index 087ae21dedf09..2d1b6f396dd84 100644
--- a/apps/meteor/client/main.ts
+++ b/apps/meteor/client/main.ts
@@ -1,5 +1,6 @@
import './serviceWorker';
import './startup/accounts';
+import './startup/fakeUserPresence';
import('@rocket.chat/fuselage-polyfills')
.then(() => import('./meteorOverrides'))
diff --git a/apps/meteor/client/providers/UserPresenceProvider.tsx b/apps/meteor/client/providers/UserPresenceProvider.tsx
index 8cf1322c9ae54..8c2ca06c9913d 100644
--- a/apps/meteor/client/providers/UserPresenceProvider.tsx
+++ b/apps/meteor/client/providers/UserPresenceProvider.tsx
@@ -6,7 +6,7 @@ import { useMemo, useEffect } from 'react';
import { Presence } from '../lib/presence';
import { UserPresence } from '../lib/userPresence';
-const userPresence = new UserPresence();
+export const userPresence = new UserPresence();
type UserPresenceProviderProps = {
children?: ReactNode;
diff --git a/apps/meteor/client/startup/fakeUserPresence.ts b/apps/meteor/client/startup/fakeUserPresence.ts
new file mode 100644
index 0000000000000..3bda53c5055fd
--- /dev/null
+++ b/apps/meteor/client/startup/fakeUserPresence.ts
@@ -0,0 +1,18 @@
+// backport of rocketchat:user-presence for the desktop app
+
+if (window.RocketChatDesktop) {
+ const fakeUserPresenceModule = {
+ UserPresence: {
+ awayTime: undefined,
+ start: () => undefined,
+ },
+ };
+
+ window.require = ((fn) =>
+ Object.assign((id: string) => {
+ if (id === 'meteor/rocketchat:user-presence') {
+ return fakeUserPresenceModule;
+ }
+ return fn(id);
+ }, fn))(window.require);
+}
diff --git a/apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfOpenCall.spec.tsx b/apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfOpenCall.spec.tsx
index bf51e9bab4cc0..74f3a6f3f565d 100644
--- a/apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfOpenCall.spec.tsx
+++ b/apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfOpenCall.spec.tsx
@@ -8,7 +8,7 @@ describe('with window.RocketChatDesktop set', () => {
beforeEach(() => {
window.RocketChatDesktop = {
openInternalVideoChatWindow: jest.fn(),
- };
+ } as any;
});
afterAll(() => {
From d76a5578ed0e14fae2a041c0e09d565b28630d76 Mon Sep 17 00:00:00 2001
From: Tiago Evangelista Pinto
Date: Wed, 20 Aug 2025 19:04:19 -0300
Subject: [PATCH 002/197] fix: Deprecated filter by query in `emoji-custom.all`
api call (#36723)
---
.changeset/clean-feet-worry.md | 9 ++++
apps/meteor/app/api/server/v1/emoji-custom.ts | 11 +++-
.../views/admin/customEmoji/CustomEmoji.tsx | 3 +-
apps/meteor/tests/e2e/emojis.spec.ts | 53 ++++++++++++++++++-
.../tests/e2e/page-objects/admin-emojis.ts | 31 +++++++++++
.../fragments/admin-flextab-emoji.ts | 21 ++++++++
apps/meteor/tests/e2e/page-objects/index.ts | 1 +
.../tests/end-to-end/api/emoji-custom.ts | 16 ++++++
.../gazzodown/src/emoji/EmojiRenderer.tsx | 2 +-
packages/rest-typings/src/v1/emojiCustom.ts | 2 +-
10 files changed, 143 insertions(+), 6 deletions(-)
create mode 100644 .changeset/clean-feet-worry.md
create mode 100644 apps/meteor/tests/e2e/page-objects/admin-emojis.ts
create mode 100644 apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-emoji.ts
diff --git a/.changeset/clean-feet-worry.md b/.changeset/clean-feet-worry.md
new file mode 100644
index 0000000000000..107aa31a1ace9
--- /dev/null
+++ b/.changeset/clean-feet-worry.md
@@ -0,0 +1,9 @@
+---
+"@rocket.chat/meteor": minor
+"@rocket.chat/gazzodown": patch
+"@rocket.chat/rest-typings": minor
+---
+
+Fixes search by name in custom emojis list, by adding a correct parameter to the endpoint `emoji-custom.all`
+
+Now the endpoint `emoji-custom.all` accepts a `name` as parameter, so the filter should work on emojis page withouth the necessity of set `ALLOW_UNSAFE_QUERY_AND_FIELDS_API_PARAMS` env var
diff --git a/apps/meteor/app/api/server/v1/emoji-custom.ts b/apps/meteor/app/api/server/v1/emoji-custom.ts
index a2f886afb1c11..fa84d3cc6b995 100644
--- a/apps/meteor/app/api/server/v1/emoji-custom.ts
+++ b/apps/meteor/app/api/server/v1/emoji-custom.ts
@@ -2,6 +2,7 @@ import { Media } from '@rocket.chat/core-services';
import type { IEmojiCustom } from '@rocket.chat/core-typings';
import { EmojiCustom } from '@rocket.chat/models';
import { isEmojiCustomList } from '@rocket.chat/rest-typings';
+import { escapeRegExp } from '@rocket.chat/string-helpers';
import { Meteor } from 'meteor/meteor';
import { SystemLogger } from '../../../../server/lib/logger/system';
@@ -79,10 +80,18 @@ API.v1.addRoute(
async get() {
const { offset, count } = await getPaginationItems(this.queryParams);
const { sort, query } = await this.parseJsonQuery();
+ const { name } = this.queryParams;
return API.v1.success(
await findEmojisCustom({
- query,
+ query: name
+ ? {
+ name: {
+ $regex: escapeRegExp(name),
+ $options: 'i',
+ },
+ }
+ : query,
pagination: {
offset,
count,
diff --git a/apps/meteor/client/views/admin/customEmoji/CustomEmoji.tsx b/apps/meteor/client/views/admin/customEmoji/CustomEmoji.tsx
index 66829705f5b74..e0476e26ff47d 100644
--- a/apps/meteor/client/views/admin/customEmoji/CustomEmoji.tsx
+++ b/apps/meteor/client/views/admin/customEmoji/CustomEmoji.tsx
@@ -1,6 +1,5 @@
import { Box, Pagination, States, StatesActions, StatesAction, StatesIcon, StatesTitle } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
-import { escapeRegExp } from '@rocket.chat/string-helpers';
import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
import type { MutableRefObject } from 'react';
@@ -35,7 +34,7 @@ const CustomEmoji = ({ onClick, reload }: CustomEmojiProps) => {
const query = useDebouncedValue(
useMemo(
() => ({
- query: JSON.stringify({ name: { $regex: escapeRegExp(text), $options: 'i' } }),
+ name: text,
sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`,
count: itemsPerPage,
offset: current,
diff --git a/apps/meteor/tests/e2e/emojis.spec.ts b/apps/meteor/tests/e2e/emojis.spec.ts
index c19d2f6b13b37..a938b6ca069c7 100644
--- a/apps/meteor/tests/e2e/emojis.spec.ts
+++ b/apps/meteor/tests/e2e/emojis.spec.ts
@@ -1,5 +1,5 @@
import { Users } from './fixtures/userStates';
-import { HomeChannel } from './page-objects';
+import { HomeChannel, AdminEmoji } from './page-objects';
import { createTargetChannel } from './utils';
import { test, expect } from './utils/test';
@@ -7,6 +7,7 @@ test.use({ storageState: Users.admin.state });
test.describe.serial('emoji', () => {
let poHomeChannel: HomeChannel;
+ let poAdminEmoji: AdminEmoji;
let targetChannel: string;
test.beforeAll(async ({ api }) => {
@@ -57,4 +58,54 @@ test.describe.serial('emoji', () => {
await poHomeChannel.content.sendMessage('® © ™ # *');
await expect(poHomeChannel.content.lastUserMessage).toContainText('® © ™ # *');
});
+
+ test('should add a custom emoji, send it, rename it, and check render', async ({ page }) => {
+ const emojiName = 'customemoji';
+ const newEmojiName = 'renamedemoji';
+ const emojiUrl = './tests/e2e/fixtures/files/test-image.jpeg';
+
+ poAdminEmoji = new AdminEmoji(page);
+
+ await test.step('Add custom emoji', async () => {
+ await poHomeChannel.sidenav.openAdministrationByLabel('Workspace');
+ await page.locator('role=link[name="Emoji"]').click();
+ await poAdminEmoji.newButton.click();
+ await poAdminEmoji.addEmoji.nameInput.fill(emojiName);
+
+ const [fileChooser] = await Promise.all([page.waitForEvent('filechooser'), page.locator('role=button[name="Custom Emoji"]').click()]);
+ await fileChooser.setFiles(emojiUrl);
+
+ await poAdminEmoji.addEmoji.btnSave.click();
+ await poAdminEmoji.closeAdminButton.click();
+
+ await poHomeChannel.sidenav.openChat(targetChannel);
+
+ await poHomeChannel.content.sendMessage(`:${emojiName}:`);
+ await page.keyboard.press('Enter');
+ await expect(poHomeChannel.content.lastUserMessage.getByTitle(`:${emojiName}:`)).toBeVisible();
+ });
+
+ await test.step('Rename custom emoji', async () => {
+ await poHomeChannel.sidenav.openAdministrationByLabel('Workspace');
+ await page.locator('role=link[name="Emoji"]').click();
+ await poAdminEmoji.findEmojiByName(emojiName);
+ await poAdminEmoji.addEmoji.nameInput.fill(newEmojiName);
+
+ await poAdminEmoji.addEmoji.btnSave.click();
+ await poAdminEmoji.closeAdminButton.click();
+
+ await poHomeChannel.sidenav.openChat(targetChannel);
+
+ await poHomeChannel.content.sendMessage(`:${newEmojiName}:`);
+ await page.keyboard.press('Enter');
+ await expect(poHomeChannel.content.lastUserMessage.getByTitle(`:${newEmojiName}:`)).toBeVisible();
+ });
+
+ await test.step('Delete custom emoji', async () => {
+ await poHomeChannel.sidenav.openAdministrationByLabel('Workspace');
+ await page.locator('role=link[name="Emoji"]').click();
+ await poAdminEmoji.findEmojiByName(newEmojiName);
+ await poAdminEmoji.addEmoji.btnDelete.click();
+ });
+ });
});
diff --git a/apps/meteor/tests/e2e/page-objects/admin-emojis.ts b/apps/meteor/tests/e2e/page-objects/admin-emojis.ts
new file mode 100644
index 0000000000000..b489a611436b6
--- /dev/null
+++ b/apps/meteor/tests/e2e/page-objects/admin-emojis.ts
@@ -0,0 +1,31 @@
+import type { Locator, Page } from '@playwright/test';
+
+import { AdminFlextabEmoji } from './fragments/admin-flextab-emoji';
+
+export class AdminEmoji {
+ private readonly page: Page;
+
+ readonly addEmoji: AdminFlextabEmoji;
+
+ constructor(page: Page) {
+ this.page = page;
+ this.addEmoji = new AdminFlextabEmoji(page);
+ }
+
+ get newButton(): Locator {
+ return this.page.locator('role=button[name="New"]');
+ }
+
+ get closeAdminButton(): Locator {
+ return this.page.getByRole('navigation').getByRole('button', { name: 'Close' });
+ }
+
+ get searchInput(): Locator {
+ return this.page.locator('role=textbox[name="Search"]');
+ }
+
+ async findEmojiByName(emojiName: string) {
+ await this.searchInput.fill(emojiName);
+ await this.page.locator(`role=link[name=${emojiName}]`).click();
+ }
+}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-emoji.ts b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-emoji.ts
new file mode 100644
index 0000000000000..e28508729e582
--- /dev/null
+++ b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-emoji.ts
@@ -0,0 +1,21 @@
+import type { Locator, Page } from '@playwright/test';
+
+export class AdminFlextabEmoji {
+ private readonly page: Page;
+
+ constructor(page: Page) {
+ this.page = page;
+ }
+
+ get nameInput(): Locator {
+ return this.page.locator('role=textbox[name="Name"]');
+ }
+
+ get btnSave(): Locator {
+ return this.page.locator('role=button[name="Save"]');
+ }
+
+ get btnDelete(): Locator {
+ return this.page.locator('role=button[name="Delete"]');
+ }
+}
diff --git a/apps/meteor/tests/e2e/page-objects/index.ts b/apps/meteor/tests/e2e/page-objects/index.ts
index e503d367e8758..80914a7b75d2e 100644
--- a/apps/meteor/tests/e2e/page-objects/index.ts
+++ b/apps/meteor/tests/e2e/page-objects/index.ts
@@ -1,5 +1,6 @@
export * from './account-profile';
export * from './admin-email-inboxes';
+export * from './admin-emojis';
export * from './admin';
export * from './auth';
export * from './home-channel';
diff --git a/apps/meteor/tests/end-to-end/api/emoji-custom.ts b/apps/meteor/tests/end-to-end/api/emoji-custom.ts
index 07285b928f8fe..744480ea6f716 100644
--- a/apps/meteor/tests/end-to-end/api/emoji-custom.ts
+++ b/apps/meteor/tests/end-to-end/api/emoji-custom.ts
@@ -321,6 +321,22 @@ describe('[EmojiCustom]', () => {
})
.end(done);
});
+ it('should return only filtered by name emojis', (done) => {
+ void request
+ .get(api('emoji-custom.all'))
+ .set(credentials)
+ .query({
+ name: `${customEmojiName}-without-aliases`,
+ })
+ .expect(200)
+ .expect((res) => {
+ expect(res.body).to.have.property('emojis').and.to.be.an('array').and.to.have.lengthOf(1);
+ expect(res.body).to.have.property('total');
+ expect(res.body).to.have.property('offset');
+ expect(res.body).to.have.property('count');
+ })
+ .end(done);
+ });
});
describe('Accessing custom emojis', () => {
diff --git a/packages/gazzodown/src/emoji/EmojiRenderer.tsx b/packages/gazzodown/src/emoji/EmojiRenderer.tsx
index 84116361157c9..2021442d1006e 100644
--- a/packages/gazzodown/src/emoji/EmojiRenderer.tsx
+++ b/packages/gazzodown/src/emoji/EmojiRenderer.tsx
@@ -37,7 +37,7 @@ const EmojiRenderer = ({ big = false, preview = false, ...emoji }: EmojiProps):
)}
)) ?? (
-
+
{sanitizedFallback}
)}
diff --git a/packages/rest-typings/src/v1/emojiCustom.ts b/packages/rest-typings/src/v1/emojiCustom.ts
index 1ffb41f671a88..ad67bbf7d0e9b 100644
--- a/packages/rest-typings/src/v1/emojiCustom.ts
+++ b/packages/rest-typings/src/v1/emojiCustom.ts
@@ -52,7 +52,7 @@ export const isEmojiCustomList = ajv.compile(emojiCustomListSch
export type EmojiCustomEndpoints = {
'/v1/emoji-custom.all': {
- GET: (params: PaginatedRequest<{ query: string }, 'name'>) => PaginatedResult<{
+ GET: (params: PaginatedRequest<{ name?: string }, 'name'>) => PaginatedResult<{
emojis: IEmojiCustom[];
}>;
};
From 34db122451e5bf2d31429f24ed15506628573d31 Mon Sep 17 00:00:00 2001
From: Diego Sampaio
Date: Wed, 20 Aug 2025 22:45:28 -0300
Subject: [PATCH 003/197] chore: move registerGuest to omni-core (#36724)
---
.../app/apps/server/bridges/livechat.ts | 12 +-
.../app/livechat/imports/server/rest/sms.ts | 4 +-
.../app/livechat/server/api/v1/message.ts | 9 +-
.../app/livechat/server/api/v1/visitor.ts | 5 +-
.../app/livechat/server/lib/Visitors.ts | 127 +--
apps/meteor/app/livechat/server/lib/guests.ts | 46 +-
apps/meteor/app/livechat/server/startup.ts | 47 +-
.../EmailInbox/EmailInbox_Incoming.ts | 17 +-
ee/packages/omni-core-ee/package.json | 1 +
ee/packages/omnichannel-services/package.json | 1 +
packages/freeswitch/package.json | 1 +
packages/omni-core/package.json | 5 +
packages/omni-core/src/index.ts | 1 +
packages/omni-core/src/visitor/create.spec.ts | 768 ++++++++++++++++++
packages/omni-core/src/visitor/create.ts | 116 +++
packages/storybook-config/package.json | 1 -
packages/tools/src/index.ts | 1 +
packages/tools/src/validateEmail.ts | 13 +
yarn.lock | 3 +-
19 files changed, 985 insertions(+), 193 deletions(-)
create mode 100644 packages/omni-core/src/visitor/create.spec.ts
create mode 100644 packages/omni-core/src/visitor/create.ts
create mode 100644 packages/tools/src/validateEmail.ts
diff --git a/apps/meteor/app/apps/server/bridges/livechat.ts b/apps/meteor/app/apps/server/bridges/livechat.ts
index 6c1152e678b3d..0347d8e77f2fc 100644
--- a/apps/meteor/app/apps/server/bridges/livechat.ts
+++ b/apps/meteor/app/apps/server/bridges/livechat.ts
@@ -7,13 +7,13 @@ import { LivechatBridge } from '@rocket.chat/apps-engine/server/bridges/Livechat
import type { ILivechatDepartment, IOmnichannelRoom, SelectedAgent, IMessage, ILivechatVisitor } from '@rocket.chat/core-typings';
import { OmnichannelSourceType } from '@rocket.chat/core-typings';
import { LivechatVisitors, LivechatRooms, LivechatDepartment, Users } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
import { callbacks } from '../../../../lib/callbacks';
import { deasyncPromise } from '../../../../server/deasync/deasync';
import { closeRoom } from '../../../livechat/server/lib/closeRoom';
import { setCustomFields } from '../../../livechat/server/lib/custom-fields';
import { getRoomMessages } from '../../../livechat/server/lib/getRoomMessages';
-import { registerGuest } from '../../../livechat/server/lib/guests';
import type { ILivechatMessage } from '../../../livechat/server/lib/localTypes';
import { updateMessage, sendMessage } from '../../../livechat/server/lib/messages';
import { createRoom } from '../../../livechat/server/lib/rooms';
@@ -207,13 +207,14 @@ export class AppLivechatBridge extends LivechatBridge {
name: visitor.name,
token: visitor.token,
email: '',
- connectionData: undefined,
id: visitor.id,
...(visitor.phone?.length && { phone: { number: visitor.phone[0].phoneNumber } }),
...(visitor.visitorEmails?.length && { email: visitor.visitorEmails[0].address }),
};
- const livechatVisitor = await registerGuest(registerData);
+ const livechatVisitor = await registerGuest(registerData, {
+ shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle'),
+ });
if (!livechatVisitor) {
throw new Error('Invalid visitor, cannot create');
@@ -231,13 +232,14 @@ export class AppLivechatBridge extends LivechatBridge {
name: visitor.name,
token: visitor.token,
email: '',
- connectionData: undefined,
id: visitor.id,
...(visitor.phone?.length && { phone: { number: visitor.phone[0].phoneNumber } }),
...(visitor.visitorEmails?.length && { email: visitor.visitorEmails[0].address }),
};
- const livechatVisitor = await registerGuest(registerData);
+ const livechatVisitor = await registerGuest(registerData, {
+ shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle'),
+ });
return this.orch.getConverters()?.get('visitors').convertVisitor(livechatVisitor);
}
diff --git a/apps/meteor/app/livechat/imports/server/rest/sms.ts b/apps/meteor/app/livechat/imports/server/rest/sms.ts
index d8546be970f4c..b271194c1f05c 100644
--- a/apps/meteor/app/livechat/imports/server/rest/sms.ts
+++ b/apps/meteor/app/livechat/imports/server/rest/sms.ts
@@ -10,6 +10,7 @@ import type {
import { OmnichannelSourceType } from '@rocket.chat/core-typings';
import { Logger } from '@rocket.chat/logger';
import { LivechatVisitors, LivechatRooms, LivechatDepartment } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
import { Random } from '@rocket.chat/random';
import { serverFetch as fetch } from '@rocket.chat/server-fetch';
import { Meteor } from 'meteor/meteor';
@@ -20,7 +21,6 @@ import { FileUpload } from '../../../../file-upload/server';
import { checkUrlForSsrf } from '../../../../lib/server/functions/checkUrlForSsrf';
import { settings } from '../../../../settings/server';
import { setCustomField } from '../../../server/api/lib/customFields';
-import { registerGuest } from '../../../server/lib/guests';
import type { ILivechatMessage } from '../../../server/lib/localTypes';
import { sendMessage } from '../../../server/lib/messages';
import { createRoom } from '../../../server/lib/rooms';
@@ -76,7 +76,7 @@ const defineVisitor = async (smsNumber: string, targetDepartment?: string) => {
data.department = targetDepartment;
}
- const livechatVisitor = await registerGuest(data);
+ const livechatVisitor = await registerGuest(data, { shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle') });
if (!livechatVisitor) {
throw new Meteor.Error('error-invalid-visitor', 'Invalid visitor');
diff --git a/apps/meteor/app/livechat/server/api/v1/message.ts b/apps/meteor/app/livechat/server/api/v1/message.ts
index 67c9a7e397c58..228ada8f464d1 100644
--- a/apps/meteor/app/livechat/server/api/v1/message.ts
+++ b/apps/meteor/app/livechat/server/api/v1/message.ts
@@ -1,5 +1,6 @@
import { OmnichannelSourceType } from '@rocket.chat/core-typings';
import { LivechatVisitors, LivechatRooms, Messages } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
import { Random } from '@rocket.chat/random';
import {
isPOSTLivechatMessageParams,
@@ -17,7 +18,6 @@ import { isWidget } from '../../../../api/server/helpers/isWidget';
import { loadMessageHistory } from '../../../../lib/server/functions/loadMessageHistory';
import { settings } from '../../../../settings/server';
import { normalizeMessageFileUpload } from '../../../../utils/server/functions/normalizeMessageFileUpload';
-import { registerGuest } from '../../lib/guests';
import { updateMessage, deleteMessage, sendMessage } from '../../lib/messages';
import { findGuest, findRoom, normalizeHttpHeaderData } from '../lib/livechat';
@@ -267,9 +267,12 @@ API.v1.addRoute(
rid = Random.id();
const guest: typeof this.bodyParams.visitor & { connectionData?: unknown } = this.bodyParams.visitor;
- guest.connectionData = normalizeHttpHeaderData(this.request.headers);
- const visitor = await registerGuest(guest);
+ if (settings.get('Livechat_Allow_collect_and_store_HTTP_header_informations')) {
+ guest.connectionData = normalizeHttpHeaderData(this.request.headers);
+ }
+
+ const visitor = await registerGuest(guest, { shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle') });
if (!visitor) {
throw new Error('error-livechat-visitor-registration');
}
diff --git a/apps/meteor/app/livechat/server/api/v1/visitor.ts b/apps/meteor/app/livechat/server/api/v1/visitor.ts
index 1bc28cdd8280b..2c17181fc3feb 100644
--- a/apps/meteor/app/livechat/server/api/v1/visitor.ts
+++ b/apps/meteor/app/livechat/server/api/v1/visitor.ts
@@ -1,5 +1,6 @@
import type { IRoom } from '@rocket.chat/core-typings';
import { LivechatVisitors as VisitorsRaw, LivechatRooms } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
import { Match, check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
@@ -7,7 +8,7 @@ import { callbacks } from '../../../../../lib/callbacks';
import { API } from '../../../../api/server';
import { settings } from '../../../../settings/server';
import { setMultipleVisitorCustomFields } from '../../lib/custom-fields';
-import { registerGuest, notifyGuestStatusChanged, removeContactsByVisitorId } from '../../lib/guests';
+import { notifyGuestStatusChanged, removeContactsByVisitorId } from '../../lib/guests';
import { livechatLogger } from '../../lib/logger';
import { saveRoomInfo } from '../../lib/rooms';
import { updateCallStatus } from '../../lib/utils';
@@ -59,7 +60,7 @@ API.v1.addRoute(
connectionData: normalizeHttpHeaderData(this.request.headers),
};
- const visitor = await registerGuest(guest);
+ const visitor = await registerGuest(guest, { shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle') });
if (!visitor) {
throw new Meteor.Error('error-livechat-visitor-registration', 'Error registering visitor', {
method: 'livechat/visitor',
diff --git a/apps/meteor/app/livechat/server/lib/Visitors.ts b/apps/meteor/app/livechat/server/lib/Visitors.ts
index 6ff046b3fc211..4bd81498b7824 100644
--- a/apps/meteor/app/livechat/server/lib/Visitors.ts
+++ b/apps/meteor/app/livechat/server/lib/Visitors.ts
@@ -1,25 +1,6 @@
-import { UserStatus } from '@rocket.chat/core-typings';
-import type { ILivechatContactVisitorAssociation, IOmnichannelSource, ILivechatVisitor } from '@rocket.chat/core-typings';
-import { Logger } from '@rocket.chat/logger';
-import { LivechatContacts, LivechatDepartment, LivechatVisitors, Users } from '@rocket.chat/models';
-
-import { validateEmail } from './Helper';
-import { settings } from '../../../settings/server';
-
-const logger = new Logger('Livechat - Visitor');
-
-export type RegisterGuestType = Partial> & {
- id?: string;
- connectionData?: any;
- email?: string;
- phone?: { number: string };
-};
+import type { ILivechatContactVisitorAssociation, IOmnichannelSource } from '@rocket.chat/core-typings';
export const Visitors = {
- isValidObject(obj: unknown): obj is Record {
- return typeof obj === 'object' && obj !== null;
- },
-
makeVisitorAssociation(visitorId: string, roomInfo: IOmnichannelSource): ILivechatContactVisitorAssociation {
return {
visitorId,
@@ -29,110 +10,4 @@ export const Visitors = {
},
};
},
-
- async registerGuest({
- id,
- token,
- name,
- phone,
- email,
- department,
- username,
- connectionData,
- status = UserStatus.ONLINE,
- }: RegisterGuestType): Promise {
- check(token, String);
- check(id, Match.Maybe(String));
-
- logger.debug(`New incoming conversation: id: ${id} | token: ${token}`);
-
- const visitorDataToUpdate: Partial & { userAgent?: string; ip?: string; host?: string } = {
- token,
- status,
- ...(phone?.number && { phone: [{ phoneNumber: phone.number }] }),
- ...(name && { name }),
- };
-
- if (email) {
- const visitorEmail = email.trim().toLowerCase();
- validateEmail(visitorEmail);
- visitorDataToUpdate.visitorEmails = [{ address: visitorEmail }];
-
- const contact = await LivechatContacts.findContactByEmailAndContactManager(visitorEmail);
- if (contact?.contactManager) {
- const shouldConsiderIdleAgent = settings.get('Livechat_enabled_when_agent_idle');
- const agent = await Users.findOneOnlineAgentById(contact.contactManager, shouldConsiderIdleAgent, {
- projection: { _id: 1, username: 1, name: 1, emails: 1 },
- });
- if (agent?.username && agent.name && agent.emails) {
- visitorDataToUpdate.contactManager = {
- _id: agent._id,
- username: agent.username,
- name: agent.name,
- emails: agent.emails,
- };
- logger.debug(`Assigning visitor ${token} to agent ${agent.username}`);
- }
- }
- }
-
- const livechatVisitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } });
-
- if (department && livechatVisitor?.department !== department) {
- logger.debug(`Attempt to find a department with id/name ${department}`);
- const dep = await LivechatDepartment.findOneByIdOrName(department, { projection: { _id: 1 } });
- if (!dep) {
- logger.debug(`Invalid department provided: ${department}`);
- throw new Meteor.Error('error-invalid-department', 'The provided department is invalid');
- }
- logger.debug(`Assigning visitor ${token} to department ${dep._id}`);
- visitorDataToUpdate.department = dep._id;
- }
-
- visitorDataToUpdate.token = livechatVisitor?.token || token;
-
- let existingUser = null;
-
- if (livechatVisitor) {
- logger.debug('Found matching user by token');
- visitorDataToUpdate._id = livechatVisitor._id;
- } else if (phone?.number && (existingUser = await LivechatVisitors.findOneVisitorByPhone(phone.number))) {
- logger.debug('Found matching user by phone number');
- visitorDataToUpdate._id = existingUser._id;
- // Don't change token when matching by phone number, use current visitor token
- visitorDataToUpdate.token = existingUser.token;
- } else if (email && (existingUser = await LivechatVisitors.findOneGuestByEmailAddress(email))) {
- logger.debug('Found matching user by email');
- visitorDataToUpdate._id = existingUser._id;
- } else if (!livechatVisitor) {
- logger.debug(`No matches found. Attempting to create new user with token ${token}`);
-
- visitorDataToUpdate._id = id || undefined;
- visitorDataToUpdate.username = username || (await LivechatVisitors.getNextVisitorUsername());
- visitorDataToUpdate.status = status;
- visitorDataToUpdate.ts = new Date();
-
- if (settings.get('Livechat_Allow_collect_and_store_HTTP_header_informations') && this.isValidObject(connectionData)) {
- logger.debug(`Saving connection data for visitor ${token}`);
- const { httpHeaders, clientAddress } = connectionData;
- if (this.isValidObject(httpHeaders)) {
- visitorDataToUpdate.userAgent = httpHeaders['user-agent'];
- visitorDataToUpdate.ip = httpHeaders['x-real-ip'] || httpHeaders['x-forwarded-for'] || clientAddress;
- visitorDataToUpdate.host = httpHeaders?.host;
- }
- }
- }
-
- const upsertedLivechatVisitor = await LivechatVisitors.updateOneByIdOrToken(visitorDataToUpdate, {
- upsert: true,
- returnDocument: 'after',
- });
-
- if (!upsertedLivechatVisitor) {
- logger.debug(`No visitor found after upsert`);
- return null;
- }
-
- return upsertedLivechatVisitor;
- },
};
diff --git a/apps/meteor/app/livechat/server/lib/guests.ts b/apps/meteor/app/livechat/server/lib/guests.ts
index f4bee437099e5..454dc55d812e4 100644
--- a/apps/meteor/app/livechat/server/lib/guests.ts
+++ b/apps/meteor/app/livechat/server/lib/guests.ts
@@ -11,13 +11,9 @@ import {
LivechatContacts,
Users,
} from '@rocket.chat/models';
-import { wrapExceptions } from '@rocket.chat/tools';
import UAParser from 'ua-parser-js';
-import { parseAgentCustomFields, validateEmail } from './Helper';
-import type { RegisterGuestType } from './Visitors';
-import { Visitors } from './Visitors';
-import { ContactMerger, type FieldAndValue } from './contacts/ContactMerger';
+import { parseAgentCustomFields } from './Helper';
import type { ICRMData } from './localTypes';
import { livechatLogger } from './logger';
import { trim } from '../../../../lib/utils/stringUtils';
@@ -102,46 +98,6 @@ export async function removeContactsByVisitorId({ _id }: { _id: string }) {
}
}
-export async function registerGuest(newData: RegisterGuestType): Promise {
- const visitor = await Visitors.registerGuest(newData);
- if (!visitor) {
- return null;
- }
-
- const { name, phone, email, username } = newData;
-
- const validatedEmail =
- email &&
- wrapExceptions(() => {
- const trimmedEmail = email.trim().toLowerCase();
- validateEmail(trimmedEmail);
- return trimmedEmail;
- }).suppress();
-
- const fields = [
- { type: 'name', value: name },
- { type: 'phone', value: phone?.number },
- { type: 'email', value: validatedEmail },
- { type: 'username', value: username || visitor.username },
- ].filter((field) => Boolean(field.value)) as FieldAndValue[];
-
- if (!fields.length) {
- return null;
- }
-
- // If a visitor was updated who already had contacts, load up the contacts and update that information as well
- const contacts = await LivechatContacts.findAllByVisitorId(visitor._id).toArray();
- for await (const contact of contacts) {
- await ContactMerger.mergeFieldsIntoContact({
- fields,
- contact,
- conflictHandlingMode: contact.unknown ? 'overwrite' : 'conflict',
- });
- }
-
- return visitor;
-}
-
async function cleanGuestHistory(_id: string) {
// This shouldn't be possible, but just in case
if (!_id) {
diff --git a/apps/meteor/app/livechat/server/startup.ts b/apps/meteor/app/livechat/server/startup.ts
index 1df1245655bab..d6035c7ab03fb 100644
--- a/apps/meteor/app/livechat/server/startup.ts
+++ b/apps/meteor/app/livechat/server/startup.ts
@@ -1,7 +1,9 @@
import type { IUser } from '@rocket.chat/core-typings';
import { ILivechatAgentStatus, isOmnichannelRoom } from '@rocket.chat/core-typings';
import { Logger } from '@rocket.chat/logger';
-import { LivechatRooms } from '@rocket.chat/models';
+import { LivechatContacts, LivechatRooms } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
+import { validateEmail, wrapExceptions } from '@rocket.chat/tools';
import { Accounts } from 'meteor/accounts-base';
import { Meteor } from 'meteor/meteor';
@@ -18,9 +20,52 @@ import { hasPermissionAsync } from '../../authorization/server/functions/hasPerm
import { notifyOnUserChange } from '../../lib/server/lib/notifyListener';
import { settings } from '../../settings/server';
import './roomAccessValidator.internalService';
+import { ContactMerger, type FieldAndValue } from './lib/contacts/ContactMerger';
const logger = new Logger('LivechatStartup');
+// TODO this patch is temporary because `ContactMerger` still a lot of dependencies, so it is not suitable to be moved to omni-core package
+// TODO add tests covering the ContactMerger usage
+registerGuest.patch(async (originalFn, newData, options) => {
+ const visitor = await originalFn(newData, options);
+ if (!visitor) {
+ return null;
+ }
+
+ const { name, phone, email, username } = newData;
+
+ const validatedEmail =
+ email &&
+ wrapExceptions(() => {
+ const trimmedEmail = email.trim().toLowerCase();
+ validateEmail(trimmedEmail);
+ return trimmedEmail;
+ }).suppress();
+
+ const fields = [
+ { type: 'name', value: name },
+ { type: 'phone', value: phone?.number },
+ { type: 'email', value: validatedEmail },
+ { type: 'username', value: username || visitor.username },
+ ].filter((field) => Boolean(field.value)) as FieldAndValue[];
+
+ if (!fields.length) {
+ return null;
+ }
+
+ // If a visitor was updated who already had contacts, load up the contacts and update that information as well
+ const contacts = await LivechatContacts.findAllByVisitorId(visitor._id).toArray();
+ for await (const contact of contacts) {
+ await ContactMerger.mergeFieldsIntoContact({
+ fields,
+ contact,
+ conflictHandlingMode: contact.unknown ? 'overwrite' : 'conflict',
+ });
+ }
+
+ return visitor;
+});
+
Meteor.startup(async () => {
roomCoordinator.setRoomFind('l', async (id) => maybeMigrateLivechatRoom(await LivechatRooms.findOneById(id)));
diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts
index d7a6ce004fc62..f6cff68c3efea 100644
--- a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts
+++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts
@@ -7,6 +7,7 @@ import type {
} from '@rocket.chat/core-typings';
import { OmnichannelSourceType } from '@rocket.chat/core-typings';
import { LivechatVisitors, LivechatRooms, Messages } from '@rocket.chat/models';
+import { registerGuest } from '@rocket.chat/omni-core';
import { Random } from '@rocket.chat/random';
import type { ParsedMail, Attachment } from 'mailparser';
import { stripHtml } from 'string-strip-html';
@@ -16,7 +17,6 @@ import { FileUpload } from '../../../app/file-upload/server';
import { notifyOnMessageChange } from '../../../app/lib/server/lib/notifyListener';
import { QueueManager } from '../../../app/livechat/server/lib/QueueManager';
import { setDepartmentForGuest } from '../../../app/livechat/server/lib/departmentsLib';
-import { registerGuest } from '../../../app/livechat/server/lib/guests';
import { sendMessage } from '../../../app/livechat/server/lib/messages';
import { settings } from '../../../app/settings/server';
import { i18n } from '../../lib/i18n';
@@ -41,12 +41,15 @@ async function getGuestByEmail(email: string, name: string, department = ''): Pr
return guest;
}
- const livechatVisitor = await registerGuest({
- token: Random.id(),
- name: name || email,
- email,
- department,
- });
+ const livechatVisitor = await registerGuest(
+ {
+ token: Random.id(),
+ name: name || email,
+ email,
+ department,
+ },
+ { shouldConsiderIdleAgent: settings.get('Livechat_enabled_when_agent_idle') },
+ );
if (!livechatVisitor) {
throw new Error('Error getting guest');
diff --git a/ee/packages/omni-core-ee/package.json b/ee/packages/omni-core-ee/package.json
index d3fb87b08bcc7..e93eb3e7eff9d 100644
--- a/ee/packages/omni-core-ee/package.json
+++ b/ee/packages/omni-core-ee/package.json
@@ -15,6 +15,7 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"test": "jest",
+ "testunit": "jest",
"build": "rm -rf dist && tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
},
diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json
index 39e81b1e64a49..04e27ce51e5cf 100644
--- a/ee/packages/omnichannel-services/package.json
+++ b/ee/packages/omnichannel-services/package.json
@@ -39,6 +39,7 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"test": "jest",
+ "testunit": "jest",
"build": "rm -rf dist && tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
},
diff --git a/packages/freeswitch/package.json b/packages/freeswitch/package.json
index cdf276195a9cc..b6f89e92408ad 100644
--- a/packages/freeswitch/package.json
+++ b/packages/freeswitch/package.json
@@ -14,6 +14,7 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"test": "jest",
+ "testunit": "jest",
"build": "rm -rf dist && tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
},
diff --git a/packages/omni-core/package.json b/packages/omni-core/package.json
index 2dbe7bd594772..9dbd412107b4f 100644
--- a/packages/omni-core/package.json
+++ b/packages/omni-core/package.json
@@ -5,6 +5,7 @@
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:^",
"@rocket.chat/jest-presets": "workspace:~",
+ "@rocket.chat/tools": "workspace:*",
"@rocket.chat/tsconfig": "workspace:*",
"@types/jest": "~30.0.0",
"eslint": "~8.45.0",
@@ -15,6 +16,7 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"test": "jest",
+ "testunit": "jest",
"build": "rm -rf dist && tsc -p tsconfig.json",
"dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
},
@@ -23,6 +25,9 @@
"files": [
"/dist"
],
+ "volta": {
+ "extends": "../../package.json"
+ },
"dependencies": {
"@rocket.chat/models": "workspace:^",
"@rocket.chat/patch-injection": "workspace:^"
diff --git a/packages/omni-core/src/index.ts b/packages/omni-core/src/index.ts
index e7784bda38aca..c0a01acf69dd1 100644
--- a/packages/omni-core/src/index.ts
+++ b/packages/omni-core/src/index.ts
@@ -1 +1,2 @@
export * from './isDepartmentCreationAvailable';
+export * from './visitor/create';
diff --git a/packages/omni-core/src/visitor/create.spec.ts b/packages/omni-core/src/visitor/create.spec.ts
new file mode 100644
index 0000000000000..2dee062386877
--- /dev/null
+++ b/packages/omni-core/src/visitor/create.spec.ts
@@ -0,0 +1,768 @@
+import { UserStatus } from '@rocket.chat/core-typings';
+import type { ILivechatContactsModel, ILivechatDepartmentModel, ILivechatVisitorsModel, IUsersModel } from '@rocket.chat/model-typings';
+import { registerModel } from '@rocket.chat/models';
+import { validateEmail } from '@rocket.chat/tools';
+
+import { registerGuest } from './create';
+
+// Mock the validateEmail function
+jest.mock('@rocket.chat/tools', () => ({
+ validateEmail: jest.fn(),
+}));
+
+// Mock the Logger
+jest.mock('@rocket.chat/logger', () => ({
+ Logger: jest.fn().mockImplementation(() => ({
+ debug: jest.fn(),
+ })),
+}));
+
+const mockValidateEmail = validateEmail as jest.MockedFunction;
+
+describe('registerGuest', () => {
+ let updateOneByIdOrTokenSpy: jest.Mock;
+ let getVisitorByTokenSpy: jest.Mock;
+ let findOneVisitorByPhoneSpy: jest.Mock;
+ let findOneGuestByEmailAddressSpy: jest.Mock;
+ let getNextVisitorUsernameSpy: jest.Mock;
+ let findContactByEmailAndContactManagerSpy: jest.Mock;
+ let findOneOnlineAgentByIdSpy: jest.Mock;
+ let findOneByIdOrNameSpy: jest.Mock;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ mockValidateEmail.mockImplementation(() => true);
+
+ // Create spies that return reasonable defaults
+ updateOneByIdOrTokenSpy = jest.fn().mockResolvedValue({ _id: 'visitor-123', token: 'test-token' });
+ getVisitorByTokenSpy = jest.fn().mockResolvedValue(null);
+ findOneVisitorByPhoneSpy = jest.fn().mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy = jest.fn().mockResolvedValue(null);
+ getNextVisitorUsernameSpy = jest.fn().mockResolvedValue('guest-123');
+ findContactByEmailAndContactManagerSpy = jest.fn().mockResolvedValue(null);
+ findOneOnlineAgentByIdSpy = jest.fn().mockResolvedValue(null);
+ findOneByIdOrNameSpy = jest.fn().mockResolvedValue(null);
+
+ // Register the models with spy functions
+ registerModel('ILivechatVisitorsModel', {
+ getVisitorByToken: getVisitorByTokenSpy,
+ findOneVisitorByPhone: findOneVisitorByPhoneSpy,
+ findOneGuestByEmailAddress: findOneGuestByEmailAddressSpy,
+ getNextVisitorUsername: getNextVisitorUsernameSpy,
+ updateOneByIdOrToken: updateOneByIdOrTokenSpy,
+ } as unknown as ILivechatVisitorsModel);
+
+ registerModel('ILivechatContactsModel', {
+ findContactByEmailAndContactManager: findContactByEmailAndContactManagerSpy,
+ } as unknown as ILivechatContactsModel);
+
+ registerModel('IUsersModel', {
+ findOneOnlineAgentById: findOneOnlineAgentByIdSpy,
+ } as unknown as IUsersModel);
+
+ registerModel('ILivechatDepartmentModel', {
+ findOneByIdOrName: findOneByIdOrNameSpy,
+ } as unknown as ILivechatDepartmentModel);
+ });
+
+ describe('validation', () => {
+ it('should throw error when token is not provided', async () => {
+ const guestData = {};
+
+ await expect(registerGuest(guestData, { shouldConsiderIdleAgent: false })).rejects.toThrow('error-invalid-token');
+ });
+
+ it('should throw error when token is empty string', async () => {
+ const guestData = {
+ token: '',
+ };
+
+ await expect(registerGuest(guestData, { shouldConsiderIdleAgent: false })).rejects.toThrow('error-invalid-token');
+ });
+ });
+
+ describe('email validation and contact manager assignment', () => {
+ it('should validate email and assign contact manager when available', async () => {
+ const email = 'test@example.com';
+ const token = 'test-token';
+ const agentId = 'agent-123';
+
+ const mockAgent = {
+ _id: agentId,
+ username: 'agent.user',
+ name: 'Agent User',
+ emails: [{ address: 'agent@example.com' }],
+ };
+
+ const mockContact = {
+ contactManager: agentId,
+ };
+
+ findContactByEmailAndContactManagerSpy.mockResolvedValue(mockContact);
+ findOneOnlineAgentByIdSpy.mockResolvedValue(mockAgent);
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(mockValidateEmail).toHaveBeenCalledWith('test@example.com');
+ expect(findContactByEmailAndContactManagerSpy).toHaveBeenCalledWith('test@example.com');
+ expect(findOneOnlineAgentByIdSpy).toHaveBeenCalledWith(agentId, false, { projection: { _id: 1, username: 1, name: 1, emails: 1 } });
+
+ // Verify the data passed to updateOneByIdOrToken
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status: UserStatus.ONLINE,
+ visitorEmails: [{ address: email }],
+ contactManager: {
+ _id: agentId,
+ username: 'agent.user',
+ name: 'Agent User',
+ emails: [{ address: 'agent@example.com' }],
+ },
+ username: 'guest-123',
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should not assign contact manager when agent is not found', async () => {
+ const email = 'test@example.com';
+ const token = 'test-token';
+
+ const mockContact = {
+ contactManager: 'agent-123',
+ };
+
+ findContactByEmailAndContactManagerSpy.mockResolvedValue(mockContact);
+ findOneOnlineAgentByIdSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ // Verify contact manager is not included in the data
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status: UserStatus.ONLINE,
+ visitorEmails: [{ address: email }],
+ username: 'guest-123',
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+
+ // Ensure contactManager is not present
+ const callArgs = updateOneByIdOrTokenSpy.mock.calls[0][0];
+ expect(callArgs.contactManager).toBeUndefined();
+ });
+
+ it('should trim and lowercase email', async () => {
+ const email = ' TEST@EXAMPLE.COM ';
+ const token = 'test-token';
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(mockValidateEmail).toHaveBeenCalledWith('test@example.com');
+ expect(findContactByEmailAndContactManagerSpy).toHaveBeenCalledWith('test@example.com');
+
+ // Verify the trimmed and lowercase email is passed to updateOneByIdOrToken
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ visitorEmails: [{ address: 'test@example.com' }],
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+
+ describe('department validation and assignment', () => {
+ it('should assign valid department', async () => {
+ const token = 'test-token';
+ const department = 'sales';
+ const departmentId = 'dept-123';
+
+ const mockDepartment = {
+ _id: departmentId,
+ };
+
+ findOneByIdOrNameSpy.mockResolvedValue(mockDepartment);
+
+ const guestData = {
+ token,
+ department,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(findOneByIdOrNameSpy).toHaveBeenCalledWith(department, { projection: { _id: 1 } });
+
+ // Verify the department ID is passed to updateOneByIdOrToken
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status: UserStatus.ONLINE,
+ department: departmentId,
+ username: 'guest-123',
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should throw error for invalid department', async () => {
+ const token = 'test-token';
+ const department = 'invalid-dept';
+
+ findOneByIdOrNameSpy.mockResolvedValue(null);
+ getVisitorByTokenSpy.mockResolvedValue({ department: 'different-dept' });
+
+ const guestData = {
+ token,
+ department,
+ };
+
+ await expect(registerGuest(guestData, { shouldConsiderIdleAgent: false })).rejects.toThrow('error-invalid-department');
+
+ // Verify updateOneByIdOrToken is not called when department validation fails
+ expect(updateOneByIdOrTokenSpy).not.toHaveBeenCalled();
+ });
+
+ it('should not validate department if visitor already has the same department', async () => {
+ const token = 'test-token';
+ const department = 'sales';
+
+ getVisitorByTokenSpy.mockResolvedValue({
+ _id: 'visitor-123',
+ department,
+ token,
+ });
+
+ const guestData = {
+ token,
+ department,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ // Department validation should be skipped
+ expect(findOneByIdOrNameSpy).not.toHaveBeenCalled();
+
+ // Verify existing visitor is updated without department validation
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ _id: 'visitor-123',
+ token,
+ status: UserStatus.ONLINE,
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+
+ describe('visitor matching and creation', () => {
+ it('should update existing visitor found by token', async () => {
+ const token = 'test-token';
+ const existingVisitor = {
+ _id: 'visitor-123',
+ token,
+ };
+
+ getVisitorByTokenSpy.mockResolvedValue(existingVisitor);
+
+ const guestData = {
+ token,
+ name: 'Updated Name',
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(getVisitorByTokenSpy).toHaveBeenCalledWith(token, { projection: { _id: 1 } });
+
+ // Verify existing visitor data is used and updated
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ _id: 'visitor-123',
+ token,
+ status: UserStatus.ONLINE,
+ name: 'Updated Name',
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should match visitor by phone number and preserve existing token', async () => {
+ const token = 'new-token';
+ const existingToken = 'existing-token';
+ const phoneNumber = '+1234567890';
+ const existingVisitor = {
+ _id: 'visitor-123',
+ token: existingToken,
+ };
+
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(existingVisitor);
+
+ const guestData = {
+ token,
+ phone: { number: phoneNumber },
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(findOneVisitorByPhoneSpy).toHaveBeenCalledWith(phoneNumber);
+
+ // Verify existing visitor's token is preserved, not the new one
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ _id: 'visitor-123',
+ token: existingToken, // Should use existing token, not new one
+ status: UserStatus.ONLINE,
+ phone: [{ phoneNumber }],
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should match visitor by email', async () => {
+ const token = 'test-token';
+ const email = 'test@example.com';
+ const existingVisitor = {
+ _id: 'visitor-123',
+ token: 'existing-token',
+ };
+
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(existingVisitor);
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(findOneGuestByEmailAddressSpy).toHaveBeenCalledWith(email);
+
+ // Verify existing visitor data is used
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ _id: 'visitor-123',
+ token,
+ status: UserStatus.ONLINE,
+ visitorEmails: [{ address: email }],
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should create new visitor when no matches found', async () => {
+ const token = 'test-token';
+ const username = 'custom-username';
+ const id = 'custom-id';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ id,
+ token,
+ username,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ // Verify new visitor data is created with provided values
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ _id: id,
+ token,
+ username,
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should generate username when not provided for new visitor', async () => {
+ const token = 'test-token';
+ const generatedUsername = 'guest-123';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(getNextVisitorUsernameSpy).toHaveBeenCalled();
+
+ // Verify generated username is used
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ username: generatedUsername,
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should use provided username for new visitor', async () => {
+ const token = 'test-token';
+ const providedUsername = 'custom-username';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ username: providedUsername,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(getNextVisitorUsernameSpy).not.toHaveBeenCalled();
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ username: providedUsername,
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+
+ describe('data formatting', () => {
+ it('should format phone number correctly', async () => {
+ const token = 'test-token';
+ const phoneNumber = '+1234567890';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ phone: { number: phoneNumber },
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ phone: [{ phoneNumber }],
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should format email correctly', async () => {
+ const token = 'test-token';
+ const email = 'test@example.com';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+ findContactByEmailAndContactManagerSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ visitorEmails: [{ address: email }],
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should use default status when not provided', async () => {
+ const token = 'test-token';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should use custom status when provided', async () => {
+ const token = 'test-token';
+ const status = UserStatus.AWAY;
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ status,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+
+ describe('connection data handling', () => {
+ it('should save connection data for new visitor', async () => {
+ const token = 'test-token';
+ const connectionData = {
+ httpHeaders: {
+ 'user-agent': 'Mozilla/5.0',
+ 'x-real-ip': '192.168.1.1',
+ 'host': 'example.com',
+ },
+ clientAddress: '10.0.0.1',
+ };
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ connectionData,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ userAgent: 'Mozilla/5.0',
+ ip: '192.168.1.1',
+ host: 'example.com',
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should use x-forwarded-for header when x-real-ip is not available', async () => {
+ const token = 'test-token';
+ const connectionData = {
+ httpHeaders: {
+ 'x-forwarded-for': '203.0.113.1',
+ },
+ clientAddress: '10.0.0.1',
+ };
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ connectionData,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ ip: '203.0.113.1',
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should use clientAddress when no IP headers are available', async () => {
+ const token = 'test-token';
+ const connectionData = {
+ httpHeaders: {},
+ clientAddress: '10.0.0.1',
+ };
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ connectionData,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ ip: '10.0.0.1',
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+
+ describe('error scenarios', () => {
+ it('should return null when upsert fails', async () => {
+ const token = 'test-token';
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+
+ // Mock upsert to return null (failure case)
+ updateOneByIdOrTokenSpy.mockResolvedValue(null);
+
+ const guestData = {
+ token,
+ };
+
+ const result = await registerGuest(guestData, { shouldConsiderIdleAgent: false });
+
+ expect(result).toBeNull();
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+
+ it('should throw error when email validation fails', async () => {
+ const token = 'test-token';
+ const email = 'invalid-email';
+
+ mockValidateEmail.mockImplementation(() => {
+ throw new Error('Invalid email');
+ });
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await expect(registerGuest(guestData, { shouldConsiderIdleAgent: false })).rejects.toThrow('Invalid email');
+ });
+ });
+
+ describe('shouldConsiderIdleAgent parameter', () => {
+ it('should pass shouldConsiderIdleAgent to findOneOnlineAgentById', async () => {
+ const token = 'test-token';
+ const email = 'test@example.com';
+ const agentId = 'agent-123';
+
+ const mockAgent = {
+ _id: agentId,
+ username: 'agent.user',
+ name: 'Agent User',
+ emails: [{ address: 'agent@example.com' }],
+ };
+
+ const mockContact = {
+ contactManager: agentId,
+ };
+
+ // All lookup methods return null (no matches)
+ getVisitorByTokenSpy.mockResolvedValue(null);
+ findOneVisitorByPhoneSpy.mockResolvedValue(null);
+ findOneGuestByEmailAddressSpy.mockResolvedValue(null);
+ findContactByEmailAndContactManagerSpy.mockResolvedValue(mockContact);
+ findOneOnlineAgentByIdSpy.mockResolvedValue(mockAgent);
+
+ const guestData = {
+ token,
+ email,
+ };
+
+ await registerGuest(guestData, { shouldConsiderIdleAgent: true });
+
+ expect(findOneOnlineAgentByIdSpy).toHaveBeenCalledWith(
+ agentId,
+ true, // shouldConsiderIdleAgent should be true
+ { projection: { _id: 1, username: 1, name: 1, emails: 1 } },
+ );
+
+ expect(updateOneByIdOrTokenSpy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ token,
+ visitorEmails: [{ address: email }],
+ contactManager: expect.objectContaining({
+ username: 'agent.user',
+ }),
+ status: UserStatus.ONLINE,
+ ts: expect.any(Date),
+ }),
+ { upsert: true, returnDocument: 'after' },
+ );
+ });
+ });
+});
diff --git a/packages/omni-core/src/visitor/create.ts b/packages/omni-core/src/visitor/create.ts
new file mode 100644
index 0000000000000..0fc212a4b3ddc
--- /dev/null
+++ b/packages/omni-core/src/visitor/create.ts
@@ -0,0 +1,116 @@
+import { type ILivechatVisitor, UserStatus } from '@rocket.chat/core-typings';
+import { Logger } from '@rocket.chat/logger';
+import { LivechatContacts, LivechatDepartment, LivechatVisitors, Users } from '@rocket.chat/models';
+import { makeFunction } from '@rocket.chat/patch-injection';
+import { validateEmail } from '@rocket.chat/tools';
+
+const logger = new Logger('Livechat - Visitor');
+
+type RegisterGuestType = Partial> & {
+ id?: string;
+ connectionData?: any;
+ email?: string;
+ phone?: { number: string };
+};
+
+export const registerGuest = makeFunction(
+ async (
+ { id, token, name, phone, email, department, username, connectionData, status = UserStatus.ONLINE }: RegisterGuestType,
+ { shouldConsiderIdleAgent }: { shouldConsiderIdleAgent: boolean },
+ ): Promise => {
+ if (!token) {
+ throw Error('error-invalid-token');
+ }
+
+ logger.debug(`New incoming conversation: id: ${id} | token: ${token}`);
+
+ const visitorDataToUpdate: Partial & { userAgent?: string; ip?: string; host?: string } = {
+ token,
+ status,
+ ...(phone?.number && { phone: [{ phoneNumber: phone.number }] }),
+ ...(name && { name }),
+ };
+
+ if (email) {
+ const visitorEmail = email.trim().toLowerCase();
+ validateEmail(visitorEmail);
+ visitorDataToUpdate.visitorEmails = [{ address: visitorEmail }];
+
+ const contact = await LivechatContacts.findContactByEmailAndContactManager(visitorEmail);
+ if (contact?.contactManager) {
+ const agent = await Users.findOneOnlineAgentById(contact.contactManager, shouldConsiderIdleAgent, {
+ projection: { _id: 1, username: 1, name: 1, emails: 1 },
+ });
+ if (agent?.username && agent.name && agent.emails) {
+ visitorDataToUpdate.contactManager = {
+ _id: agent._id,
+ username: agent.username,
+ name: agent.name,
+ emails: agent.emails,
+ };
+ logger.debug(`Assigning visitor ${token} to agent ${agent.username}`);
+ }
+ }
+ }
+
+ const livechatVisitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } });
+
+ if (department && livechatVisitor?.department !== department) {
+ logger.debug(`Attempt to find a department with id/name ${department}`);
+ const dep = await LivechatDepartment.findOneByIdOrName(department, { projection: { _id: 1 } });
+ if (!dep) {
+ logger.debug(`Invalid department provided: ${department}`);
+ // throw new Meteor.Error('error-invalid-department', 'The provided department is invalid');
+ throw new Error('error-invalid-department');
+ }
+ logger.debug(`Assigning visitor ${token} to department ${dep._id}`);
+ visitorDataToUpdate.department = dep._id;
+ }
+
+ visitorDataToUpdate.token = livechatVisitor?.token || token;
+
+ let existingUser = null;
+
+ if (livechatVisitor) {
+ logger.debug('Found matching user by token');
+ visitorDataToUpdate._id = livechatVisitor._id;
+ } else if (phone?.number && (existingUser = await LivechatVisitors.findOneVisitorByPhone(phone.number))) {
+ logger.debug('Found matching user by phone number');
+ visitorDataToUpdate._id = existingUser._id;
+ // Don't change token when matching by phone number, use current visitor token
+ visitorDataToUpdate.token = existingUser.token;
+ } else if (email && (existingUser = await LivechatVisitors.findOneGuestByEmailAddress(email))) {
+ logger.debug('Found matching user by email');
+ visitorDataToUpdate._id = existingUser._id;
+ } else if (!livechatVisitor) {
+ logger.debug(`No matches found. Attempting to create new user with token ${token}`);
+
+ visitorDataToUpdate._id = id || undefined;
+ visitorDataToUpdate.username = username || (await LivechatVisitors.getNextVisitorUsername());
+ visitorDataToUpdate.status = status;
+ visitorDataToUpdate.ts = new Date();
+
+ if (connectionData && typeof connectionData === 'object') {
+ logger.debug(`Saving connection data for visitor ${token}`);
+ const { httpHeaders, clientAddress } = connectionData;
+ if (httpHeaders && typeof httpHeaders === 'object') {
+ visitorDataToUpdate.userAgent = httpHeaders['user-agent'];
+ visitorDataToUpdate.ip = httpHeaders['x-real-ip'] || httpHeaders['x-forwarded-for'] || clientAddress;
+ visitorDataToUpdate.host = httpHeaders.host;
+ }
+ }
+ }
+
+ const upsertedLivechatVisitor = await LivechatVisitors.updateOneByIdOrToken(visitorDataToUpdate, {
+ upsert: true,
+ returnDocument: 'after',
+ });
+
+ if (!upsertedLivechatVisitor) {
+ logger.debug(`No visitor found after upsert`);
+ return null;
+ }
+
+ return upsertedLivechatVisitor;
+ },
+);
diff --git a/packages/storybook-config/package.json b/packages/storybook-config/package.json
index ad7db5f0ba2cf..fae0ee7401e62 100644
--- a/packages/storybook-config/package.json
+++ b/packages/storybook-config/package.json
@@ -40,7 +40,6 @@
"scripts": {
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
- "test": "jest",
"copy-svg": "cp -r ./src/logo.svg ./dist/logo.svg",
"build": "rm -rf dist && tsc && yarn run copy-svg",
"dev": "tsc -p tsconfig.json --watch --preserveWatchOutput"
diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts
index ddde6d93c76ef..8734e9f4d8c1e 100644
--- a/packages/tools/src/index.ts
+++ b/packages/tools/src/index.ts
@@ -12,3 +12,4 @@ export * from './converter';
export * from './removeEmpty';
export * from './isObject';
export * from './isRecord';
+export * from './validateEmail';
diff --git a/packages/tools/src/validateEmail.ts b/packages/tools/src/validateEmail.ts
new file mode 100644
index 0000000000000..fd9237f68ec05
--- /dev/null
+++ b/packages/tools/src/validateEmail.ts
@@ -0,0 +1,13 @@
+export const validateEmail = (email: string, options: { style: string } = { style: 'basic' }): boolean => {
+ const basicEmailRegex = /^[^@]+@[^@]+$/;
+ const rfcEmailRegex =
+ /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
+
+ switch (options.style) {
+ case 'rfc':
+ return rfcEmailRegex.test(email);
+ case 'basic':
+ default:
+ return basicEmailRegex.test(email);
+ }
+};
diff --git a/yarn.lock b/yarn.lock
index 71129d9154855..4e3af52f4bac6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8375,6 +8375,7 @@ __metadata:
"@rocket.chat/jest-presets": "workspace:~"
"@rocket.chat/models": "workspace:^"
"@rocket.chat/patch-injection": "workspace:^"
+ "@rocket.chat/tools": "workspace:*"
"@rocket.chat/tsconfig": "workspace:*"
"@types/jest": "npm:~30.0.0"
eslint: "npm:~8.45.0"
@@ -8890,7 +8891,7 @@ __metadata:
languageName: node
linkType: hard
-"@rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools, @rocket.chat/tools@workspace:~":
+"@rocket.chat/tools@workspace:*, @rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools, @rocket.chat/tools@workspace:~":
version: 0.0.0-use.local
resolution: "@rocket.chat/tools@workspace:packages/tools"
dependencies:
From 6e009b1fbf8837a57497bada0be91c3503f3be49 Mon Sep 17 00:00:00 2001
From: gabriellsh <40830821+gabriellsh@users.noreply.github.com>
Date: Wed, 20 Aug 2025 23:41:57 -0300
Subject: [PATCH 004/197] chore: Implement `useWriteStream` ServerContext
(#36715)
Co-authored-by: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com>
---
.../client/providers/ServerProvider.tsx | 4 ++++
.../tests/mocks/client/ServerProviderMock.tsx | 2 ++
.../src/MockedAppRootBuilder.tsx | 1 +
packages/ui-contexts/src/ServerContext.ts | 4 ++++
.../ui-contexts/src/hooks/useWriteStream.ts | 19 +++++++++++++++++++
packages/ui-contexts/src/index.ts | 1 +
6 files changed, 31 insertions(+)
create mode 100644 packages/ui-contexts/src/hooks/useWriteStream.ts
diff --git a/apps/meteor/client/providers/ServerProvider.tsx b/apps/meteor/client/providers/ServerProvider.tsx
index fd719cf5aaebd..20f357250d8d7 100644
--- a/apps/meteor/client/providers/ServerProvider.tsx
+++ b/apps/meteor/client/providers/ServerProvider.tsx
@@ -69,6 +69,9 @@ const getStream =
>(eventName: K, callback: (...args: StreamerCallbackArgs) => void): (() => void) =>
sdk.stream(streamName, [eventName], callback).stop;
+const writeStream = >(streamName: N, streamKey: K, ...args: StreamerCallbackArgs) =>
+ sdk.publish(streamName, [streamKey, ...args]);
+
const disconnect = () => Meteor.disconnect();
const reconnect = () => Meteor.reconnect();
@@ -92,6 +95,7 @@ const ServerProvider = ({ children }: ServerProviderProps) => {
callEndpoint,
uploadToEndpoint,
getStream,
+ writeStream,
disconnect,
reconnect,
}),
diff --git a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx
index 76c17db1f554e..0013872b1038d 100644
--- a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx
+++ b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx
@@ -59,6 +59,7 @@ const getStream = () => () => () => undefined; // to be implemented
const callEndpoint = () => {
throw new Error('not implemented');
}; // to be implemented
+const writeStream = () => undefined; // to be implemented
const contextValue: ServerContextValue = {
connected: true,
@@ -72,6 +73,7 @@ const contextValue: ServerContextValue = {
getStream,
reconnect: () => undefined,
disconnect: () => undefined,
+ writeStream,
};
type ServerProviderMockProps = {
diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx
index 625934876a135..228b6b9276f83 100644
--- a/packages/mock-providers/src/MockedAppRootBuilder.tsx
+++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx
@@ -85,6 +85,7 @@ export class MockedAppRootBuilder {
callMethod: () => Promise.reject(new Error('not implemented')),
disconnect: () => Promise.reject(new Error('not implemented')),
reconnect: () => Promise.reject(new Error('not implemented')),
+ writeStream: () => Promise.reject(new Error('not implemented')),
};
private router: ContextType = {
diff --git a/packages/ui-contexts/src/ServerContext.ts b/packages/ui-contexts/src/ServerContext.ts
index d81fb7832749a..0edb41f95e811 100644
--- a/packages/ui-contexts/src/ServerContext.ts
+++ b/packages/ui-contexts/src/ServerContext.ts
@@ -48,6 +48,7 @@ export type ServerContextValue = {
retransmitToSelf?: boolean | undefined;
},
) => (eventName: K, callback: (...args: StreamerCallbackArgs) => void) => () => void;
+ writeStream: >(streamName: N, eventName: K, ...args: StreamerCallbackArgs) => void;
disconnect: () => void;
reconnect: () => void;
};
@@ -65,6 +66,9 @@ export const ServerContext = createContext({
throw new Error('not implemented');
},
getStream: () => () => (): void => undefined,
+ writeStream: () => {
+ throw new Error('not implemented');
+ },
disconnect: () => {
throw new Error('not implemented');
},
diff --git a/packages/ui-contexts/src/hooks/useWriteStream.ts b/packages/ui-contexts/src/hooks/useWriteStream.ts
new file mode 100644
index 0000000000000..aeba6dd567223
--- /dev/null
+++ b/packages/ui-contexts/src/hooks/useWriteStream.ts
@@ -0,0 +1,19 @@
+import type { StreamNames, StreamKeys, StreamerCallbackArgs } from '@rocket.chat/ddp-client';
+import { useCallback, useContext } from 'react';
+
+import { ServerContext } from '../ServerContext';
+
+type WriteStreamCallback = >(eventName: K, ...args: StreamerCallbackArgs) => void;
+
+export function useWriteStream(streamName: N): WriteStreamCallback {
+ const { writeStream } = useContext(ServerContext);
+
+ if (!writeStream) {
+ throw new Error(`cannot use useWriteStream(${streamName}) hook without a wrapping ServerContext`);
+ }
+
+ return useCallback(
+ >(eventName: K, ...args: StreamerCallbackArgs) => writeStream(streamName, eventName, ...args),
+ [writeStream, streamName],
+ );
+}
diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts
index 1ca969a47ed21..954193351beb6 100644
--- a/packages/ui-contexts/src/index.ts
+++ b/packages/ui-contexts/src/index.ts
@@ -96,6 +96,7 @@ export { useAccountsCustomFields } from './hooks/useAccountsCustomFields';
export { useUserPresence } from './hooks/useUserPresence';
export { useUnstoreLoginToken } from './hooks/useUnstoreLoginToken';
export { useOnLogout } from './hooks/useOnLogout';
+export { useWriteStream } from './hooks/useWriteStream';
export { UploadResult } from './ServerContext';
export { TranslationKey, TranslationLanguage } from './TranslationContext';
From a29030da3ad4086498d99dd2e058c35d25abcb67 Mon Sep 17 00:00:00 2001
From: Harmeet Kour <87123067+Harmeet221@users.noreply.github.com>
Date: Thu, 21 Aug 2025 12:26:23 +0530
Subject: [PATCH 005/197] test: Improve test to ensure priority indicator is
displayed in the sidebar. (#36755)
---
.../omnichannel/omnichannel-priorities-sidebar.spec.ts | 4 ++++
.../tests/e2e/page-objects/omnichannel-room-info.ts | 9 +++++++++
2 files changed, 13 insertions(+)
diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts
index d43bb22f31609..1f91cd0dda61e 100644
--- a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts
+++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts
@@ -66,11 +66,13 @@ test.describe.serial('OC - Priorities [Sidebar]', () => {
await poHomeChannel.sidenav.selectPriority(visitor.name, 'Lowest');
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor();
await expect(poRoomInfo.getLabel('Priority')).toBeVisible();
+ await expect(poRoomInfo.getBadgeIndicator(visitor.name, 'Lowest')).toBeVisible();
await expect(poRoomInfo.getInfo('Lowest')).toBeVisible();
await poHomeChannel.sidenav.selectPriority(visitor.name, 'Highest');
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor();
await expect(poRoomInfo.getInfo('Highest')).toBeVisible();
+ await expect(poRoomInfo.getBadgeIndicator(visitor.name, 'Highest')).toBeVisible();
await poHomeChannel.sidenav.selectPriority(visitor.name, 'Unprioritized');
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor();
@@ -89,10 +91,12 @@ test.describe.serial('OC - Priorities [Sidebar]', () => {
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor();
await expect(poRoomInfo.getLabel('Priority')).toBeVisible();
await expect(poRoomInfo.getInfo('Lowest')).toBeVisible();
+ await expect(poRoomInfo.getBadgeIndicator(visitor.name, 'Lowest')).toBeVisible();
await poHomeChannel.sidenav.selectPriority(visitor.name, 'Highest');
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor();
await expect(poRoomInfo.getInfo('Highest')).toBeVisible();
+ await expect(poRoomInfo.getBadgeIndicator(visitor.name, 'Highest')).toBeVisible();
await poHomeChannel.sidenav.selectPriority(visitor.name, 'Unprioritized');
await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor();
diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts
index 5df39c592a90d..29c9b7cdf0c89 100644
--- a/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts
+++ b/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts
@@ -1,10 +1,15 @@
import type { Locator, Page } from '@playwright/test';
+import { HomeSidenav } from './fragments/home-sidenav';
+
export class OmnichannelRoomInfo {
private readonly page: Page;
+ private readonly homeSidenav: HomeSidenav;
+
constructor(page: Page) {
this.page = page;
+ this.homeSidenav = new HomeSidenav(page);
}
get dialogRoomInfo(): Locator {
@@ -34,4 +39,8 @@ export class OmnichannelRoomInfo {
getLabel(label: string): Locator {
return this.page.locator(`div >> text="${label}"`);
}
+
+ getBadgeIndicator(name: string, title: string): Locator {
+ return this.homeSidenav.getSidebarItemByName(name).getByTitle(title);
+ }
}
From ae4813962910dd8d71909f2f324d73a6684781dc Mon Sep 17 00:00:00 2001
From: Tasso Evangelista
Date: Thu, 21 Aug 2025 20:05:44 -0300
Subject: [PATCH 006/197] fix(desktop-app): Handle failure in `CachedStore`
initialization (#36764)
---
apps/meteor/client/lib/cachedStores/CachedStore.ts | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/apps/meteor/client/lib/cachedStores/CachedStore.ts b/apps/meteor/client/lib/cachedStores/CachedStore.ts
index 4e629f6ee4e8d..f57a14e58e2bd 100644
--- a/apps/meteor/client/lib/cachedStores/CachedStore.ts
+++ b/apps/meteor/client/lib/cachedStores/CachedStore.ts
@@ -310,8 +310,6 @@ export abstract class CachedStore implements
await this.loadFromServerAndPopulate();
}
- this.setReady(true);
-
this.reconnectionComputation?.stop();
let wentOffline = Tracker.nonreactive(() => Meteor.status().status === 'offline');
this.reconnectionComputation = Tracker.autorun(() => {
@@ -340,9 +338,12 @@ export abstract class CachedStore implements
return this.initializationPromise;
}
- this.initializationPromise = this.performInitialization().finally(() => {
- this.initializationPromise = undefined;
- });
+ this.initializationPromise = this.performInitialization()
+ .catch(console.error)
+ .finally(() => {
+ this.initializationPromise = undefined;
+ this.setReady(true);
+ });
return this.initializationPromise;
}
From c6ef437d9071dbd8c08152984dc39542b1ae7306 Mon Sep 17 00:00:00 2001
From: gabriellsh <40830821+gabriellsh@users.noreply.github.com>
Date: Fri, 22 Aug 2025 10:26:17 -0300
Subject: [PATCH 007/197] feat: Voice call device permission flow (#36397)
---
.changeset/weak-windows-doubt.md | 10 +
.../roomActions/useVoiceCallRoomAction.tsx | 31 +-
.../DeviceProvider/DeviceProvider.tsx | 150 +++++---
packages/i18n/src/locales/en.i18n.json | 5 +
.../src/MockedAppRootBuilder.tsx | 55 +--
.../src/MockedDeviceContext.tsx | 10 +
.../components/GenericMenu/GenericMenu.tsx | 1 +
packages/ui-contexts/jest.config.ts | 12 +
packages/ui-contexts/package.json | 7 +-
packages/ui-contexts/src/DeviceContext.ts | 1 +
.../hooks/useMediaDevicePermission.spec.tsx | 68 ++++
.../src/hooks/useMediaDevicePermission.ts | 58 +++
packages/ui-contexts/src/index.ts | 1 +
.../PermissionFlowModal.spec.tsx | 19 +
.../PermissionFlowModal.stories.tsx | 66 ++++
.../PermissionFlow/PermissionFlowModal.tsx | 107 ++++++
.../PermissionFlowModal.spec.tsx.snap | 361 ++++++++++++++++++
.../VoipActions/VoipActions.stories.tsx | 6 +
.../components/VoipActions/VoipActions.tsx | 9 +-
.../VoipPopup/VoipPopup.stories.tsx | 4 +
.../VoipPopup/views/VoipDialerView.spec.tsx | 20 +-
.../VoipPopup/views/VoipDialerView.tsx | 14 +-
.../VoipPopup/views/VoipIncomingView.spec.tsx | 14 +-
.../VoipSettingsButton/VoipSettingsButton.tsx | 29 +-
.../hooks/useVoipDeviceSettings.tsx | 80 ++--
packages/ui-voip/src/hooks/index.ts | 1 +
.../hooks/useDevicePermissionPrompt.spec.tsx | 197 ++++++++++
.../src/hooks/useDevicePermissionPrompt.tsx | 123 ++++++
packages/ui-voip/src/lib/LocalStream.ts | 10 +
packages/ui-voip/src/lib/VoipClient.ts | 2 +-
yarn.lock | 5 +-
31 files changed, 1352 insertions(+), 124 deletions(-)
create mode 100644 .changeset/weak-windows-doubt.md
create mode 100644 packages/ui-contexts/jest.config.ts
create mode 100644 packages/ui-contexts/src/hooks/useMediaDevicePermission.spec.tsx
create mode 100644 packages/ui-contexts/src/hooks/useMediaDevicePermission.ts
create mode 100644 packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx
create mode 100644 packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx
create mode 100644 packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx
create mode 100644 packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap
create mode 100644 packages/ui-voip/src/hooks/useDevicePermissionPrompt.spec.tsx
create mode 100644 packages/ui-voip/src/hooks/useDevicePermissionPrompt.tsx
diff --git a/.changeset/weak-windows-doubt.md b/.changeset/weak-windows-doubt.md
new file mode 100644
index 0000000000000..9dfcde6067fc7
--- /dev/null
+++ b/.changeset/weak-windows-doubt.md
@@ -0,0 +1,10 @@
+---
+"@rocket.chat/meteor": minor
+"@rocket.chat/i18n": minor
+"@rocket.chat/mock-providers": minor
+"@rocket.chat/ui-client": minor
+"@rocket.chat/ui-contexts": minor
+"@rocket.chat/ui-voip": minor
+---
+
+Introduces a new flow for requesting device permissions for Voice Calling, prompting the user before the request. Also solves a few issues with the device selection menu.
diff --git a/apps/meteor/client/hooks/roomActions/useVoiceCallRoomAction.tsx b/apps/meteor/client/hooks/roomActions/useVoiceCallRoomAction.tsx
index e9dc459951814..a9920688b59cf 100644
--- a/apps/meteor/client/hooks/roomActions/useVoiceCallRoomAction.tsx
+++ b/apps/meteor/client/hooks/roomActions/useVoiceCallRoomAction.tsx
@@ -1,23 +1,22 @@
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
-import { usePermission, useUserId } from '@rocket.chat/ui-contexts';
-import { useVoipAPI, useVoipState } from '@rocket.chat/ui-voip';
+import { useMediaDeviceMicrophonePermission, usePermission, useUserId } from '@rocket.chat/ui-contexts';
+import { useVoipAPI, useVoipState, useDevicePermissionPrompt } from '@rocket.chat/ui-voip';
import { useMemo } from 'react';
-import { useTranslation } from 'react-i18next';
-import { useMediaPermissions } from '../../views/room/composer/messageBox/hooks/useMediaPermissions';
import { useRoom } from '../../views/room/contexts/RoomContext';
import type { RoomToolboxActionConfig } from '../../views/room/contexts/RoomToolboxContext';
import { useUserInfoQuery } from '../useUserInfoQuery';
import { useVoipWarningModal } from '../useVoipWarningModal';
export const useVoiceCallRoomAction = () => {
- const { t } = useTranslation();
const { uids = [] } = useRoom();
const ownUserId = useUserId();
const canStartVoiceCall = usePermission('view-user-voip-extension');
const dispatchWarning = useVoipWarningModal();
- const [isMicPermissionDenied] = useMediaPermissions('microphone');
+ const { state: micPermissionState } = useMediaDeviceMicrophonePermission();
+
+ const isMicPermissionDenied = micPermissionState === 'denied';
const { isEnabled, isRegistered, isInCall } = useVoipState();
const { makeCall } = useVoipAPI();
@@ -36,19 +35,26 @@ export const useVoiceCallRoomAction = () => {
const tooltip = useMemo(() => {
if (isMicPermissionDenied) {
- return t('Microphone_access_not_allowed');
+ return 'Microphone_access_not_allowed';
}
if (isInCall) {
- return t('Unable_to_make_calls_while_another_is_ongoing');
+ return 'Unable_to_make_calls_while_another_is_ongoing';
}
- return disabled ? t('Voice_calling_disabled') : '';
- }, [disabled, isInCall, isMicPermissionDenied, t]);
+ return disabled ? 'Voice_calling_disabled' : '';
+ }, [disabled, isInCall, isMicPermissionDenied]);
+
+ const promptPermission = useDevicePermissionPrompt({
+ actionType: 'outgoing',
+ onAccept: () => {
+ makeCall(remoteUser?.freeSwitchExtension as string);
+ },
+ });
const handleOnClick = useEffectEvent(() => {
if (canMakeVoipCall) {
- return makeCall(remoteUser?.freeSwitchExtension as string);
+ return promptPermission();
}
dispatchWarning();
});
@@ -60,14 +66,13 @@ export const useVoiceCallRoomAction = () => {
return {
id: 'start-voice-call',
- title: 'Voice_Call',
+ title: tooltip || 'Voice_Call',
icon: 'phone',
featured: true,
action: handleOnClick,
groups: ['direct'] as const,
order: 2,
disabled,
- tooltip,
};
}, [allowed, disabled, handleOnClick, tooltip]);
};
diff --git a/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx b/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
index 358f4e7ea9988..afa2e2b236d4b 100644
--- a/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
+++ b/apps/meteor/client/providers/DeviceProvider/DeviceProvider.tsx
@@ -1,6 +1,7 @@
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
import type { Device, DeviceContextValue } from '@rocket.chat/ui-contexts';
import { DeviceContext } from '@rocket.chat/ui-contexts';
+import { useQuery, useQueryClient, keepPreviousData } from '@tanstack/react-query';
import type { ReactElement, ReactNode } from 'react';
import { useEffect, useState, useMemo } from 'react';
@@ -10,20 +11,27 @@ type DeviceProviderProps = {
children?: ReactNode | undefined;
};
-export const DeviceProvider = ({ children }: DeviceProviderProps): ReactElement => {
- const [enabled] = useState(typeof isSecureContext && isSecureContext);
- const [availableAudioOutputDevices, setAvailableAudioOutputDevices] = useState([]);
- const [availableAudioInputDevices, setAvailableAudioInputDevices] = useState([]);
- const [selectedAudioOutputDevice, setSelectedAudioOutputDevice] = useState({
- id: 'default',
+const defaultDevices = {
+ audioInput: [],
+ audioOutput: [],
+ defaultAudioOutputDevice: {
+ id: '',
label: '',
- type: 'audio',
- });
- const [selectedAudioInputDevice, setSelectedAudioInputDevice] = useState({
- id: 'default',
+ type: 'audiooutput',
+ },
+ defaultAudioInputDevice: {
+ id: '',
label: '',
- type: 'audio',
- });
+ type: 'audioinput',
+ },
+};
+
+const devicesQueryKey = ['media-devices-list'];
+
+export const DeviceProvider = ({ children }: DeviceProviderProps): ReactElement => {
+ const [enabled] = useState(typeof isSecureContext && isSecureContext);
+ const [selectedAudioOutputDevice, setSelectedAudioOutputDevice] = useState(undefined);
+ const [selectedAudioInputDevice, setSelectedAudioInputDevice] = useState(undefined);
const setAudioInputDevice = (device: Device): void => {
if (!isSecureContext) {
@@ -45,38 +53,88 @@ export const DeviceProvider = ({ children }: DeviceProviderProps): ReactElement
},
);
+ const queryClient = useQueryClient();
+
+ const { data } = useQuery({
+ queryKey: devicesQueryKey,
+ enabled,
+ queryFn: async () => {
+ const devices = await navigator.mediaDevices?.enumerateDevices();
+ if (!devices || devices.length === 0) {
+ return defaultDevices;
+ }
+
+ const mappedDevices: Device[] = devices.map((device) => ({
+ id: device.deviceId,
+ label: device.label,
+ type: device.kind,
+ }));
+
+ const audioInput = mappedDevices.filter((device) => device.type === 'audioinput');
+
+ const audioOutput = mappedDevices.filter((device) => device.type === 'audiooutput');
+
+ return {
+ audioInput,
+ audioOutput,
+ defaultAudioOutputDevice: audioOutput[0],
+ defaultAudioInputDevice: audioInput[0],
+ };
+ },
+ initialData: defaultDevices,
+ placeholderData: keepPreviousData,
+ refetchOnWindowFocus: false,
+ refetchOnReconnect: false,
+ refetchOnMount: true,
+ staleTime: 0,
+ });
+
+ const { data: permissionStatus } = useQuery({
+ queryKey: [...devicesQueryKey, 'permission-status'],
+ queryFn: async () => {
+ if (!navigator.permissions) {
+ return;
+ }
+ const result = await navigator.permissions.query({ name: 'microphone' as PermissionName });
+ return result;
+ },
+ initialData: undefined,
+ placeholderData: undefined,
+ refetchOnWindowFocus: false,
+ refetchOnReconnect: false,
+ refetchOnMount: true,
+ });
+
useEffect(() => {
- if (!enabled) {
+ if (!permissionStatus) {
return;
}
- const setMediaDevices = (): void => {
- navigator.mediaDevices?.enumerateDevices().then((devices) => {
- const audioInput: Device[] = [];
- const audioOutput: Device[] = [];
- devices.forEach((device) => {
- const mediaDevice: Device = {
- id: device.deviceId,
- label: device.label,
- type: device.kind,
- };
- if (device.kind === 'audioinput') {
- audioInput.push(mediaDevice);
- } else if (device.kind === 'audiooutput') {
- audioOutput.push(mediaDevice);
- }
- });
- setAvailableAudioOutputDevices(audioOutput);
- setAvailableAudioInputDevices(audioInput);
- });
+ const invalidateQueries = (): void => {
+ queryClient.invalidateQueries({ queryKey: devicesQueryKey });
};
- navigator.mediaDevices?.addEventListener('devicechange', setMediaDevices);
- setMediaDevices();
+ permissionStatus.addEventListener('change', invalidateQueries);
return (): void => {
- navigator.mediaDevices?.removeEventListener('devicechange', setMediaDevices);
+ permissionStatus.removeEventListener('change', invalidateQueries);
};
- }, [enabled]);
+ }, [permissionStatus, queryClient]);
+
+ useEffect(() => {
+ if (!enabled || !navigator.mediaDevices) {
+ return;
+ }
+
+ const invalidateQuery = (): void => {
+ queryClient.invalidateQueries({ queryKey: devicesQueryKey, exact: true });
+ };
+
+ navigator.mediaDevices.addEventListener('devicechange', invalidateQuery);
+
+ return (): void => {
+ navigator.mediaDevices.removeEventListener('devicechange', invalidateQuery);
+ };
+ }, [enabled, queryClient]);
const contextValue = useMemo((): DeviceContextValue => {
if (!enabled) {
@@ -84,23 +142,19 @@ export const DeviceProvider = ({ children }: DeviceProviderProps): ReactElement
enabled,
};
}
+ const { audioInput, audioOutput, defaultAudioOutputDevice, defaultAudioInputDevice } = data;
return {
enabled,
- availableAudioOutputDevices,
- availableAudioInputDevices,
- selectedAudioOutputDevice,
- selectedAudioInputDevice,
+ permissionStatus,
+ availableAudioOutputDevices: audioOutput,
+ availableAudioInputDevices: audioInput,
+ selectedAudioOutputDevice: selectedAudioOutputDevice || defaultAudioOutputDevice,
+ selectedAudioInputDevice: selectedAudioInputDevice || defaultAudioInputDevice,
setAudioOutputDevice,
setAudioInputDevice,
};
- }, [
- availableAudioInputDevices,
- availableAudioOutputDevices,
- enabled,
- selectedAudioInputDevice,
- selectedAudioOutputDevice,
- setAudioOutputDevice,
- ]);
+ }, [enabled, data, permissionStatus, selectedAudioOutputDevice, selectedAudioInputDevice, setAudioOutputDevice]);
+
return {children};
};
diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json
index 55a8d6d166e8c..b9444e34604f5 100644
--- a/packages/i18n/src/locales/en.i18n.json
+++ b/packages/i18n/src/locales/en.i18n.json
@@ -5635,6 +5635,11 @@
"VoIP_TeamCollab_Ice_Servers_Description": "A list of Ice Servers (STUN and/or TURN), separated by comma. \n Username, password and port are allowed in the format `username:password@stun:host:port` or `username:password@turn:host:port`. \n Both username and password may be html-encoded.",
"VoIP_Toggle": "Enable/Disable VoIP",
"VoIP_available_setup_freeswitch_server_details": "VoIP is available but the FreeSwitch server details need to be set up from the team voice call settings.",
+ "VoIP_device_permission_required": "Mic/speaker access required",
+ "VoIP_device_permission_required_description": "Your web browser stopped {{workspaceUrl}} from using your microphone and/or speaker.\n\nAllow speaker and microphone access in your browser settings to prevent seeing this message again.",
+ "VoIP_allow_and_call": "Allow and call",
+ "VoIP_allow_and_accept": "Allow and accept",
+ "VoIP_cancel_and_reject": "Cancel and reject",
"Voice_Call": "Voice Call",
"Voice_Call_Extension": "Voice Call Extension",
"Voice_and_omnichannel": "Voice and omnichannel",
diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx
index 228b6b9276f83..7f1b1150a493c 100644
--- a/packages/mock-providers/src/MockedAppRootBuilder.tsx
+++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx
@@ -16,6 +16,7 @@ import { createPredicateFromFilter } from '@rocket.chat/mongo-adapter';
import type { Method, OperationParams, OperationResult, PathPattern, UrlParams } from '@rocket.chat/rest-typings';
import type {
Device,
+ DeviceContext,
LoginService,
ModalContextValue,
ServerContextValue,
@@ -213,9 +214,16 @@ export class MockedAppRootBuilder {
private events = new Emitter();
- private audioInputDevices: Device[] = [];
-
- private audioOutputDevices: Device[] = [];
+ private deviceContext: Partial> = {
+ enabled: true,
+ availableAudioOutputDevices: [],
+ availableAudioInputDevices: [],
+ selectedAudioOutputDevice: undefined,
+ selectedAudioInputDevice: undefined,
+ setAudioOutputDevice: () => undefined,
+ setAudioInputDevice: () => undefined,
+ permissionStatus: undefined,
+ };
wrap(wrapper: (children: ReactNode) => ReactNode): this {
this.wrappers.push(wrapper);
@@ -489,12 +497,29 @@ export class MockedAppRootBuilder {
}
withAudioInputDevices(devices: Device[]): this {
- this.audioInputDevices = devices;
+ if (!this.deviceContext.enabled) {
+ throw new Error('DeviceContext is not enabled');
+ }
+
+ this.deviceContext.availableAudioInputDevices = devices;
return this;
}
withAudioOutputDevices(devices: Device[]): this {
- this.audioOutputDevices = devices;
+ if (!this.deviceContext.enabled) {
+ throw new Error('DeviceContext is not enabled');
+ }
+
+ this.deviceContext.availableAudioOutputDevices = devices;
+ return this;
+ }
+
+ withMicrophonePermissionState(status: PermissionStatus): this {
+ if (!this.deviceContext.enabled) {
+ throw new Error('DeviceContext is not enabled');
+ }
+
+ this.deviceContext.permissionStatus = status;
return this;
}
@@ -542,20 +567,7 @@ export class MockedAppRootBuilder {
},
});
- const {
- server,
- router,
- settings,
- user,
- userPresence,
- videoConf,
- i18n,
- authorization,
- wrappers,
- audioInputDevices,
- audioOutputDevices,
- authentication,
- } = this;
+ const { server, router, settings, user, userPresence, videoConf, i18n, authorization, wrappers, deviceContext, authentication } = this;
const reduceTranslation = (translation?: ContextType): ContextType => {
return {
@@ -630,10 +642,7 @@ export class MockedAppRootBuilder {
*/}
-
+
{/*
diff --git a/packages/mock-providers/src/MockedDeviceContext.tsx b/packages/mock-providers/src/MockedDeviceContext.tsx
index 0b861b7e13096..adfb7bac50b83 100644
--- a/packages/mock-providers/src/MockedDeviceContext.tsx
+++ b/packages/mock-providers/src/MockedDeviceContext.tsx
@@ -2,12 +2,22 @@ import type { DeviceContextValue } from '@rocket.chat/ui-contexts';
import { DeviceContext } from '@rocket.chat/ui-contexts';
import type { ReactNode } from 'react';
+const mockPermissionStatus: PermissionStatus = {
+ state: 'granted',
+ name: 'microphone',
+ onchange: () => undefined,
+ addEventListener: () => undefined,
+ removeEventListener: () => undefined,
+ dispatchEvent: () => true,
+};
+
const mockDeviceContextValue: DeviceContextValue = {
enabled: true,
selectedAudioOutputDevice: undefined,
selectedAudioInputDevice: undefined,
availableAudioOutputDevices: [],
availableAudioInputDevices: [],
+ permissionStatus: mockPermissionStatus,
setAudioOutputDevice: () => undefined,
setAudioInputDevice: () => undefined,
};
diff --git a/packages/ui-client/src/components/GenericMenu/GenericMenu.tsx b/packages/ui-client/src/components/GenericMenu/GenericMenu.tsx
index 39b2c2e2a2c81..0c714a2acc09e 100644
--- a/packages/ui-client/src/components/GenericMenu/GenericMenu.tsx
+++ b/packages/ui-client/src/components/GenericMenu/GenericMenu.tsx
@@ -11,6 +11,7 @@ type GenericMenuCommonProps = {
icon?: ComponentProps['icon'];
disabled?: boolean;
callbackAction?: () => void;
+ isOpen?: boolean;
};
type GenericMenuConditionalProps =
diff --git a/packages/ui-contexts/jest.config.ts b/packages/ui-contexts/jest.config.ts
new file mode 100644
index 0000000000000..45bc947f274c2
--- /dev/null
+++ b/packages/ui-contexts/jest.config.ts
@@ -0,0 +1,12 @@
+import client from '@rocket.chat/jest-presets/client';
+import type { Config } from 'jest';
+
+export default {
+ preset: client.preset,
+ setupFilesAfterEnv: [...client.setupFilesAfterEnv],
+ moduleNameMapper: {
+ '^react($|/.+)': '/../../node_modules/react$1',
+ '^react-dom($|/.+)': '/../../node_modules/react-dom$1',
+ '^react-i18next($|/.+)': '/../../node_modules/react-i18next$1',
+ },
+} satisfies Config;
diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json
index b8cba15fee64e..a96416dad6046 100644
--- a/packages/ui-contexts/package.json
+++ b/packages/ui-contexts/package.json
@@ -9,13 +9,16 @@
"@rocket.chat/fuselage-hooks": "^0.37.0",
"@rocket.chat/fuselage-tokens": "~0.33.2",
"@rocket.chat/i18n": "workspace:~",
+ "@rocket.chat/jest-presets": "workspace:~",
"@rocket.chat/rest-typings": "workspace:^",
"@rocket.chat/tools": "workspace:~",
+ "@types/jest": "~30.0.0",
"@types/react": "~18.3.23",
"@types/react-dom": "~18.3.7",
"eslint": "~8.45.0",
"eslint-plugin-react-hooks": "^5.0.0",
"i18next": "~23.4.9",
+ "jest": "~30.0.2",
"mongodb": "6.10.0",
"react": "~18.3.1",
"typescript": "~5.9.2"
@@ -39,7 +42,9 @@
"lint": "eslint --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix",
"dev": "tsc --watch --preserveWatchOutput -p tsconfig.json",
- "build": "rm -rf dist && tsc -p tsconfig.json"
+ "build": "rm -rf dist && tsc -p tsconfig.json",
+ "test": "jest",
+ "testunit": "jest"
},
"main": "./dist/index.js",
"typings": "./dist/index.d.ts",
diff --git a/packages/ui-contexts/src/DeviceContext.ts b/packages/ui-contexts/src/DeviceContext.ts
index 5bbda60cfcd56..2911081bf75ce 100644
--- a/packages/ui-contexts/src/DeviceContext.ts
+++ b/packages/ui-contexts/src/DeviceContext.ts
@@ -17,6 +17,7 @@ type EnabledDeviceContextValue = {
setAudioOutputDevice: (data: { outputDevice: Device; HTMLAudioElement: HTMLAudioElement }) => void;
setAudioInputDevice: (device: Device) => void;
// setVideoInputDevice: (device: Device) => void;
+ permissionStatus: PermissionStatus | undefined;
};
type DisabledDeviceContextValue = {
diff --git a/packages/ui-contexts/src/hooks/useMediaDevicePermission.spec.tsx b/packages/ui-contexts/src/hooks/useMediaDevicePermission.spec.tsx
new file mode 100644
index 0000000000000..fe6e5385b9bbd
--- /dev/null
+++ b/packages/ui-contexts/src/hooks/useMediaDevicePermission.spec.tsx
@@ -0,0 +1,68 @@
+import { renderHook } from '@testing-library/react';
+
+import { useMediaDeviceMicrophonePermission } from './useMediaDevicePermission';
+import { DeviceContext } from '../DeviceContext';
+
+const states = [
+ { expectedState: 'granted', state: 'granted', requestDevice: 'function' },
+ { expectedState: 'denied', state: 'denied', requestDevice: 'undefined' },
+ { expectedState: 'prompt', state: 'prompt', requestDevice: 'function' },
+];
+
+const getWrapper =
+ (state: PermissionState | undefined, availableAudioInputDevices: any[] = [], enabled = true) =>
+ ({ children }: { children: any }) => {
+ return (
+ undefined,
+ setAudioInputDevice: () => undefined,
+ }}
+ >
+ {children}
+
+ );
+ };
+
+describe('useMediaDeviceMicrophonePermission', () => {
+ it('Should return permission state denied and requestDevice is undefined if context is disabled', async () => {
+ const { result } = renderHook(() => useMediaDeviceMicrophonePermission(), {
+ wrapper: getWrapper(undefined, ['device1', 'device2'], false),
+ });
+
+ expect(result.current.state).toBe('denied');
+ expect(result.current.requestDevice).toBeUndefined();
+ });
+ it.each(states)('Should return permission state $state and requestDevice is $requestDevice', async ({ state, requestDevice }) => {
+ const { result } = renderHook(() => useMediaDeviceMicrophonePermission(), {
+ wrapper: getWrapper(state as PermissionState),
+ });
+
+ expect(result.current.state).toBe(state);
+ expect(typeof result.current.requestDevice).toBe(requestDevice);
+ });
+
+ it('Should return permission state granted and requestDevice is function if permissionStatus is undefined and availableAudioInputDevices has records', async () => {
+ const { result } = renderHook(() => useMediaDeviceMicrophonePermission(), {
+ wrapper: getWrapper(undefined, ['device1', 'device2']),
+ });
+
+ expect(result.current.state).toBe('granted');
+ expect(typeof result.current.requestDevice).toBe('function');
+ });
+
+ it('Should return permission state prompt and requestDevice is function if permissionStatus is undefined and availableAudioInputDevices is empty', async () => {
+ const { result } = renderHook(() => useMediaDeviceMicrophonePermission(), {
+ wrapper: getWrapper(undefined),
+ });
+
+ expect(result.current.state).toBe('prompt');
+ expect(typeof result.current.requestDevice).toBe('function');
+ });
+});
diff --git a/packages/ui-contexts/src/hooks/useMediaDevicePermission.ts b/packages/ui-contexts/src/hooks/useMediaDevicePermission.ts
new file mode 100644
index 0000000000000..2edee8cc407b8
--- /dev/null
+++ b/packages/ui-contexts/src/hooks/useMediaDevicePermission.ts
@@ -0,0 +1,58 @@
+import { useContext } from 'react';
+
+import { DeviceContext, isDeviceContextEnabled } from '../DeviceContext';
+
+export const requestDevice = async ({
+ onAccept,
+ onReject,
+}: {
+ onAccept?: (stream: MediaStream) => void;
+ onReject?: (error: DOMException) => void;
+}): Promise => {
+ if (!navigator.mediaDevices) {
+ return;
+ }
+ navigator.mediaDevices.getUserMedia({ audio: true }).then(onAccept, onReject);
+};
+
+const isPermissionDenied = (state: PermissionState): state is 'denied' => {
+ return state === 'denied';
+};
+
+type DeniedReturn = { state: 'denied'; requestDevice?: never };
+type PromptOrGrantedReturn = { state: 'prompt' | 'granted'; requestDevice: typeof requestDevice };
+
+/**
+ * @description Hook to check if the microphone permission is granted. If the permission is denied, or the permission is not requested, the hook will return a function to request the permission. Right now just the microphone permission is handled with this hook, since DeviceContext is only used for audio input and output.
+ * @returns { state: 'granted' } if the permission is granted
+ * @returns { state: 'denied' } if the permission is denied
+ * @returns { state: 'prompt', requestPrompt: function ({onAccept, onReject}) {} } if the permission is in prompt state.
+ */
+export const useMediaDeviceMicrophonePermission = (): DeniedReturn | PromptOrGrantedReturn => {
+ const context = useContext(DeviceContext);
+
+ if (!isDeviceContextEnabled(context)) {
+ return {
+ state: 'denied',
+ };
+ }
+
+ const { permissionStatus, availableAudioInputDevices } = context;
+
+ if (permissionStatus) {
+ if (isPermissionDenied(permissionStatus.state)) {
+ return { state: permissionStatus.state };
+ }
+
+ return { state: permissionStatus.state, requestDevice };
+ }
+
+ if (availableAudioInputDevices.length > 0) {
+ return { state: 'granted', requestDevice };
+ }
+
+ return {
+ state: 'prompt',
+ requestDevice,
+ };
+};
diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts
index 954193351beb6..b30813e345a41 100644
--- a/packages/ui-contexts/src/index.ts
+++ b/packages/ui-contexts/src/index.ts
@@ -96,6 +96,7 @@ export { useAccountsCustomFields } from './hooks/useAccountsCustomFields';
export { useUserPresence } from './hooks/useUserPresence';
export { useUnstoreLoginToken } from './hooks/useUnstoreLoginToken';
export { useOnLogout } from './hooks/useOnLogout';
+export { useMediaDeviceMicrophonePermission, type requestDevice } from './hooks/useMediaDevicePermission';
export { useWriteStream } from './hooks/useWriteStream';
export { UploadResult } from './ServerContext';
diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx
new file mode 100644
index 0000000000000..2fbb3b251a4d8
--- /dev/null
+++ b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.spec.tsx
@@ -0,0 +1,19 @@
+import { composeStories } from '@storybook/react';
+import { render } from '@testing-library/react';
+import { axe } from 'jest-axe';
+
+import * as stories from './PermissionFlowModal.stories';
+
+const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]);
+
+test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => {
+ const view = render();
+ expect(view.baseElement).toMatchSnapshot();
+});
+
+test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => {
+ const { container } = render();
+
+ const results = await axe(container);
+ expect(results).toHaveNoViolations();
+});
diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx
new file mode 100644
index 0000000000000..86f9815337519
--- /dev/null
+++ b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.stories.tsx
@@ -0,0 +1,66 @@
+import { mockAppRoot } from '@rocket.chat/mock-providers';
+import type { Meta, StoryObj } from '@storybook/react';
+import type { ReactElement } from 'react';
+
+import PermissionFlowModal from './PermissionFlowModal';
+
+const noop = () => undefined;
+
+const meta = {
+ title: 'Components/Permission Flow',
+ component: PermissionFlowModal,
+ decorators: [
+ mockAppRoot()
+ .withTranslations('en', 'core', {
+ VoIP_device_permission_required: 'Mic/speaker access required',
+ VoIP_allow_and_call: 'Allow and call',
+ VoIP_allow_and_accept: 'Allow and accept',
+ VoIP_cancel_and_reject: 'Cancel and reject',
+ Cancel: 'Cancel',
+ VoIP_device_permission_required_description:
+ 'Your web browser stopped {{workspaceUrl}} from using your microphone and/or speaker.\n\nAllow speaker and microphone access in your browser settings to prevent seeing this message again.',
+ })
+ .buildStoryDecorator(),
+ (Story): ReactElement => ,
+ ],
+} satisfies Meta;
+
+export default meta;
+
+type Story = StoryObj;
+
+export const PermissionFlowModalOutgoingPrompt: Story = {
+ args: {
+ onCancel: noop,
+ onConfirm: noop,
+ type: 'outgoingPrompt',
+ },
+ name: 'Outgoing call, permission in prompt state',
+};
+
+export const PermissionFlowModalIncomingPrompt: Story = {
+ args: {
+ onCancel: noop,
+ onConfirm: noop,
+ type: 'incomingPrompt',
+ },
+ name: 'Incoming call, permission in prompt state',
+};
+
+export const PermissionFlowModalDeviceChangePrompt: Story = {
+ args: {
+ onCancel: noop,
+ onConfirm: noop,
+ type: 'deviceChangePrompt',
+ },
+ name: 'Device change, permission in prompt state',
+};
+
+export const PermissionFlowModalDenied: Story = {
+ args: {
+ onCancel: noop,
+ onConfirm: noop,
+ type: 'denied',
+ },
+ name: 'Permission denied',
+};
diff --git a/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx
new file mode 100644
index 0000000000000..9674a5a7ec211
--- /dev/null
+++ b/packages/ui-voip/src/components/PermissionFlow/PermissionFlowModal.tsx
@@ -0,0 +1,107 @@
+import { css } from '@rocket.chat/css-in-js';
+import {
+ Box,
+ Button,
+ Modal,
+ ModalHeader,
+ ModalTitle,
+ ModalClose,
+ ModalContent,
+ ModalFooter,
+ ModalFooterControllers,
+} from '@rocket.chat/fuselage';
+import { useAbsoluteUrl, useSetModal } from '@rocket.chat/ui-contexts';
+import { useId } from 'react';
+import { useTranslation } from 'react-i18next';
+
+export type PermissionFlowModalType = 'denied' | 'incomingPrompt' | 'outgoingPrompt' | 'deviceChangePrompt';
+
+type PermissionFlowModalProps = {
+ onCancel: () => void;
+ onConfirm: () => void;
+ type: PermissionFlowModalType;
+};
+
+// MarkdownText is a bit overkill for this
+// This css rules ensures that `\n` actually breaks lines.
+const breakSpaces = css`
+ white-space: break-spaces;
+`;
+
+const getFooter = (
+ type: PermissionFlowModalProps['type'],
+ {
+ onCancel,
+ onConfirm,
+ onClose,
+ t,
+ }: { onCancel: () => void; onConfirm: () => void; onClose: () => void; t: ReturnType['t'] },
+) => {
+ switch (type) {
+ case 'denied':
+ return [
+ ,
+ ];
+ case 'incomingPrompt':
+ return [
+ ,
+ ,
+ ];
+ case 'outgoingPrompt':
+ return [
+ ,
+ ,
+ ];
+ case 'deviceChangePrompt':
+ return [
+ ,
+ ,
+ ];
+ }
+};
+
+const PermissionFlowModal = ({ onCancel, onConfirm, type }: PermissionFlowModalProps) => {
+ const { t } = useTranslation();
+ const modalId = useId();
+ const absoluteUrl = useAbsoluteUrl();
+ const setModal = useSetModal();
+
+ const onClose = () => {
+ setModal(null);
+ };
+
+ return (
+
+
+ {t('VoIP_device_permission_required')}
+
+
+
+
+ {t('VoIP_device_permission_required_description', {
+ workspaceUrl: absoluteUrl(''),
+ })}
+
+
+
+ {getFooter(type, { onCancel, onConfirm, onClose, t })}
+
+
+ );
+};
+
+export default PermissionFlowModal;
diff --git a/packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap b/packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap
new file mode 100644
index 0000000000000..2c5ba57f846e4
--- /dev/null
+++ b/packages/ui-voip/src/components/PermissionFlow/__snapshots__/PermissionFlowModal.spec.tsx.snap
@@ -0,0 +1,361 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`renders PermissionFlowModalDenied without crashing 1`] = `
+
+
+
+
+
+`;
+
+exports[`renders PermissionFlowModalDeviceChangePrompt without crashing 1`] = `
+
+
+
+
+
+`;
+
+exports[`renders PermissionFlowModalIncomingPrompt without crashing 1`] = `
+
+
+
+
+
+`;
+
+exports[`renders PermissionFlowModalOutgoingPrompt without crashing 1`] = `
+
+
+
+
+
+`;
diff --git a/packages/ui-voip/src/components/VoipActions/VoipActions.stories.tsx b/packages/ui-voip/src/components/VoipActions/VoipActions.stories.tsx
index 07c5601c5900a..622b4bbc25473 100644
--- a/packages/ui-voip/src/components/VoipActions/VoipActions.stories.tsx
+++ b/packages/ui-voip/src/components/VoipActions/VoipActions.stories.tsx
@@ -1,3 +1,4 @@
+import { mockAppRoot } from '@rocket.chat/mock-providers';
import type { Meta, StoryFn } from '@storybook/react';
import VoipActions from './VoipActions';
@@ -7,6 +8,11 @@ const noop = () => undefined;
export default {
title: 'Components/VoipActions',
component: VoipActions,
+ decorators: [
+ mockAppRoot()
+ .withMicrophonePermissionState({ state: 'granted' } as PermissionStatus)
+ .buildStoryDecorator(),
+ ],
} satisfies Meta;
export const IncomingActions: StoryFn = () => {
diff --git a/packages/ui-voip/src/components/VoipActions/VoipActions.tsx b/packages/ui-voip/src/components/VoipActions/VoipActions.tsx
index 0cd3c95a2dc21..d17a68791a8d9 100644
--- a/packages/ui-voip/src/components/VoipActions/VoipActions.tsx
+++ b/packages/ui-voip/src/components/VoipActions/VoipActions.tsx
@@ -1,6 +1,7 @@
import { ButtonGroup } from '@rocket.chat/fuselage';
import { useTranslation } from 'react-i18next';
+import { useDevicePermissionPrompt } from '../../hooks/useDevicePermissionPrompt';
import ActionButton from '../VoipActionButton';
type VoipGenericActionsProps = {
@@ -37,6 +38,12 @@ const isOngoing = (props: VoipActionsProps): props is VoipOngoingActionsProps =>
const VoipActions = ({ isMuted, isHeld, isDTMFActive, isTransferActive, ...events }: VoipActionsProps) => {
const { t } = useTranslation();
+ const onAcceptIncoming = useDevicePermissionPrompt({
+ actionType: 'incoming',
+ onAccept: events.onAccept ?? (() => undefined),
+ onReject: events.onDecline ?? (() => undefined),
+ });
+
return (
{isIncoming(events) && }
@@ -77,7 +84,7 @@ const VoipActions = ({ isMuted, isHeld, isDTMFActive, isTransferActive, ...event
{isOngoing(events) && }
- {isIncoming(events) && }
+ {isIncoming(events) && }
);
};
diff --git a/packages/ui-voip/src/components/VoipPopup/VoipPopup.stories.tsx b/packages/ui-voip/src/components/VoipPopup/VoipPopup.stories.tsx
index 4c5a72497b68c..6939e30fe0e79 100644
--- a/packages/ui-voip/src/components/VoipPopup/VoipPopup.stories.tsx
+++ b/packages/ui-voip/src/components/VoipPopup/VoipPopup.stories.tsx
@@ -1,3 +1,4 @@
+import { mockAppRoot } from '@rocket.chat/mock-providers';
import type { Meta, StoryFn } from '@storybook/react';
import VoipPopup from './VoipPopup';
@@ -5,6 +6,8 @@ import { createMockVoipProviders } from '../../tests/mocks';
const [MockedProviders, voipClient] = createMockVoipProviders();
+const appRoot = mockAppRoot().withMicrophonePermissionState({ state: 'granted' } as PermissionStatus);
+
export default {
title: 'Components/VoipPopup',
component: VoipPopup,
@@ -14,6 +17,7 @@ export default {
),
+ appRoot.buildStoryDecorator(),
],
} satisfies Meta;
diff --git a/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.spec.tsx b/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.spec.tsx
index 7a55f50fd09e6..b2e52863bf6b4 100644
--- a/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.spec.tsx
+++ b/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.spec.tsx
@@ -11,8 +11,20 @@ jest.mock('../../../hooks/useVoipAPI', () => ({
useVoipAPI: jest.fn(() => ({ makeCall, closeDialer })),
}));
+Object.defineProperty(global.navigator, 'mediaDevices', {
+ value: {
+ getUserMedia: jest.fn().mockImplementation(() => {
+ return Promise.resolve({
+ getTracks: () => [],
+ });
+ }),
+ },
+});
+
+const appRoot = mockAppRoot().withMicrophonePermissionState({ state: 'granted' } as PermissionStatus);
+
it('should look good', async () => {
- render(, { wrapper: mockAppRoot().build() });
+ render(, { wrapper: appRoot.build() });
expect(screen.getByText('New_Call')).toBeInTheDocument();
expect(screen.getByRole('button', { name: /Device_settings/ })).toBeInTheDocument();
@@ -20,7 +32,7 @@ it('should look good', async () => {
});
it('should only enable call button if input has value (keyboard)', async () => {
- render(, { wrapper: mockAppRoot().build() });
+ render(, { wrapper: appRoot.build() });
expect(screen.getByRole('button', { name: /Call/i })).toBeDisabled();
await userEvent.type(screen.getByLabelText('Phone_number'), '123');
@@ -28,7 +40,7 @@ it('should only enable call button if input has value (keyboard)', async () => {
});
it('should only enable call button if input has value (mouse)', async () => {
- render(, { wrapper: mockAppRoot().build() });
+ render(, { wrapper: appRoot.build() });
expect(screen.getByRole('button', { name: /Call/i })).toBeDisabled();
@@ -39,7 +51,7 @@ it('should only enable call button if input has value (mouse)', async () => {
});
it('should call methods makeCall and closeDialer when call button is clicked', async () => {
- render(, { wrapper: mockAppRoot().build() });
+ render(, { wrapper: appRoot.build() });
await userEvent.type(screen.getByLabelText('Phone_number'), '123');
await userEvent.click(screen.getByTestId(`dial-pad-button-1`));
diff --git a/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.tsx b/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.tsx
index a35b28763bda4..bb890ae5214b4 100644
--- a/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.tsx
+++ b/packages/ui-voip/src/components/VoipPopup/views/VoipDialerView.tsx
@@ -3,6 +3,7 @@ import { useState, forwardRef, Ref } from 'react';
import { useTranslation } from 'react-i18next';
import { VoipDialPad as DialPad, VoipSettingsButton as SettingsButton } from '../..';
+import { useDevicePermissionPrompt } from '../../../hooks/useDevicePermissionPrompt';
import { useVoipAPI } from '../../../hooks/useVoipAPI';
import type { PositionOffsets } from '../components/VoipPopupContainer';
import Container from '../components/VoipPopupContainer';
@@ -20,10 +21,13 @@ const VoipDialerView = forwardRef(function
const { makeCall, closeDialer } = useVoipAPI();
const [number, setNumber] = useState('');
- const handleCall = () => {
- makeCall(number);
- closeDialer();
- };
+ const handleCall = useDevicePermissionPrompt({
+ actionType: 'outgoing',
+ onAccept: () => {
+ makeCall(number);
+ closeDialer();
+ },
+ });
return (
@@ -38,7 +42,7 @@ const VoipDialerView = forwardRef(function
- The ultimate Free Open Source Solution for team communications
+ The ultimate secure open-source solution for team communications
@@ -15,77 +15,74 @@
-[Rocket.Chat](https://rocket.chat) is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection.
+[Rocket.Chat](https://rocket.chat) is an open-source, secure, fully customizable communications platform developed in TypeScript for organizations with high standards of data protection.
-We are the ultimate **Free Open Source Solution** for team communications, enabling real-time conversations between colleagues, with other companies or with your customers, regardless of how they connect with you. The result is an increase in productivity and customer satisfaction rates.
+We are the ultimate solution for team communications, enabling real-time conversations between colleagues, with other companies, and with your customers or citizens, regardless of how they connect with you. The result is an increase in productivity and user satisfaction rates.
Every day, tens of millions of users in over 150 countries and in organizations such as Deutsche Bahn, The US Navy, and Credit Suisse trust Rocket.Chat to keep their communications completely private and secure.
-# 🚀 Product Offerings - Self-hosted and Cloud
+# 🚀 Platform overview
-Rocket.Chat has four key product offerings:
+Rocket.Chat provides endless possibilities. Here’s an overview of the features you benefit from:
-💬 **Team collaboration** - A single point for secure internal and cross-company collaboration.
+💬 [**Team collaboration**](https://docs.rocket.chat/docs/collaborate-using-rocketchat): A single point for secure internal and cross-company collaboration with role-based access control.
-🎯 **Omnichannel customer service** - Engage in seamless interactions with customers regardless of how they connect with you.
+🎯 [**Omnichannel citizen engagement**](https://docs.rocket.chat/docs/omnichannel): Seamless digital interactions with your citizens and customers across platforms like WhatsApp, SMS, and more.
-🦾 **Chat engine** - Create customized messaging experiences within your mobile or web app.
+🦾 [**Optimization**](https://docs.rocket.chat/docs/optimize-your-workspace): Enhance productivity with self-hosted AI and a customizable and accessible workspace.
-🤖 **Marketplace** - Choose a wide range of apps and native integrations that help your business communicate more effectively.
+🤖 [**Extend and integrate**](https://docs.rocket.chat/docs/extend-and-integrate-rocketchat-capabilities): Install and use public apps from the Rocket.Chat Marketplace, build your own apps, and embed the workspace into your platform.
-# ☁️ Cloud-hosted Rocket.Chat
-
-Rocket.Chat has flexible hosting options that adapt to your infrastructure needs.
-For more information please [follow this link](https://www.rocket.chat/hosting)
-
-# 📖 Docs for Developers, Admins and Users
-
-Visit our official [User Documentation](https://docs.rocket.chat/) and [Developer Docs](https://developer.rocket.chat/docs) before sending questions.
-
-# 🛠️ Local Development
+# 💻 Deploy Rocket.Chat
-You can set up a Rocket.Chat server development environment by following the guide below for your operating system:
+We support different methods of deployment for different needs. Choose your method:
+- Are you deploying Rocket.Chat on your own servers? You can deploy using one of the recommended methods: Docker, Podman, or Kubernetes. Refer to the [Deployment Guide](https://docs.rocket.chat/docs/deploy-rocketchat) for details. Before you deploy, make sure to check the [system requirements](https://docs.rocket.chat/docs/system-requirements) to deploy a workspace successfully.
-- [Linux](https://developer.rocket.chat/docs/linux): See how to set up a Rocket.Chat server development environment on any Linux distribution.
+- Do you need to run the workspace on an isolated network? Set up an [air-gapped workspace](https://docs.rocket.chat/docs/rocketchat-air-gapped-deployment) to use Rocket.Chat without internet access, suitable for high-security or regulated environments.
-- [Mac OSX](https://developer.rocket.chat/docs/mac-osx): Learn how to set up a Rocket.Chat server development environment on Mac.
+- Looking for a custom cloud-hosted solution without handling infrastructure? Check out our premium, dedicated [cloud hosting options](https://docs.rocket.chat/docs/rocketchat-cloud-hosting-service-level-agreement-sla) that adapt to your needs.
-- [Windows 10](https://developer.rocket.chat/docs/windows-10): Set up a Rocket.Chat server development environment on Windows.
+- Interested in decentralized communication? Deploy a [federated workspace](https://docs.rocket.chat/docs/rocketchat-federation) to securely communicate and share resources across a federated network.
-- [Gitpod](https://developer.rocket.chat/docs/gitpod): Use the online development environment pre-configuration to develop Rocket.Chat server.
+# 📱 Desktop and mobile apps
-> Visit the [Rocket.Chat Environment Setup guide](https://developer.rocket.chat/docs/server-environment-setup) to learn more.
+In addition to the web app, you can also download the Rocket.Chat mobile app:
+[](https://itunes.apple.com/us/app/rocket-chat/id1148741252?mt=8) [](https://play.google.com/store/apps/details?id=chat.rocket.android)
-# 💻 Deploy Rocket.Chat
+Download the desktop app:
+- [Download on the Mac App Store](https://apps.apple.com/us/app/rocket-chat/id1086818840?mt=12)
+- [Install from the Windows Store](https://apps.microsoft.com/detail/9nblggh52jv6?hl=en-us&gl=NG&ocid=pdpshare)
+- [Get from Snapcraft for Linux](https://snapcraft.io/rocketchat-desktop) or use the command `sudo snap install rocketchat-desktop`
-Refer to the [System requirements documentation](https://docs.rocket.chat/docs/system-requirements) for required hardware and software specifications. For detailed instructions on deploying your Rocket.Chat workspace, visit [Deploy Rocket.Chat](https://rocket.chat/install).
+Refer to the [Installation guide](https://docs.rocket.chat/docs/desktop-mobile-apps) for further details.
-# 📱 Mobile apps
+# 📖 Rocket.Chat documentation
-In addition to the web app, you can also download Rocket.Chat clients for:
+- [User documentation](https://docs.rocket.chat/docs/rocketchat)
+- [Administrator's guide](https://docs.rocket.chat/docs/administrators-guide)
+- [Developer documentation](https://developer.rocket.chat/docs/rocketchat-developer)
+- [API documentation](https://developer.rocket.chat/apidocs)
+- [YouTube Rocket.Chat Learning Center](https://www.youtube.com/playlist?list=PLee3gqXJQrFVXnNs5GiuoTMy269ydvcOB)
+# 🛠️ Additional resources for developers
-[](https://itunes.apple.com/us/app/rocket-chat/id1148741252?mt=8) [](https://play.google.com/store/apps/details?id=chat.rocket.android)
+You can set up a Rocket.Chat development environment by following the guides below:
-You can also contribute to the mobile open source code in [Rocket.Chat.ReactNative](https://github.com/RocketChat/Rocket.Chat.ReactNative) and check it out its [documentation](https://developer.rocket.chat/docs/mobile-app).
+- **[Server](https://developer.rocket.chat/docs/server)**: See how to set up a Rocket.Chat server development environment on Linux distributions, Windows, Mac, and Gitpod.
-# 🧩 Apps Engine for Rocket.Chat
+- **[Desktop](https://developer.rocket.chat/docs/desktop-app)**: Learn how to set up and customize a desktop development environment. You can follow and contribute to the [Rocket.Chat.Electron](https://github.com/RocketChat/Rocket.Chat.Electron) repository.
-You can develop your own app that can be integrated with Rocket.Chat. We provide an [Open Source Apps-Engine framework](https://developer.rocket.chat/apps-engine/getting-started) which expands the integration possibilities within the Rocket.Chat ecosystem.
+- **[Mobile](https://developer.rocket.chat/docs/mobile-app)**: Learn about mobile app development and configuring push notifications. You can follow and contribute to the [Rocket.Chat.ReactNative](https://github.com/RocketChat/Rocket.Chat.ReactNative) repository.
-# 📚 Learn More
+# 🧩 Apps-Engine
-- [User documentation](https://docs.rocket.chat)
-- [Developer documentation](https://developer.rocket.chat)
-- [API documentation](https://developer.rocket.chat/reference/api)
-- [Apps-Engine development](https://developer.rocket.chat/apps-engine/rocket.chat-apps-and-apps-engine)
-- [See who's using Rocket.Chat](https://www.rocket.chat/customers)
+Develop your own apps that can be integrated with Rocket.Chat. We provide an [open-source Apps-Engine framework](https://developer.rocket.chat/docs/rocketchat-apps-engine) which expands the integration possibilities within the Rocket.Chat ecosystem.
-# 🆕 Feature Request
+# 🆕 Feature request
[Rocket.Chat/feature-requests](https://github.com/RocketChat/feature-requests) is used to track Rocket.Chat feature requests and discussions. Click [here](https://github.com/RocketChat/feature-requests/issues/new?template=feature_request.md) to open a new feature request. [Feature Request Forums](https://forums.rocket.chat/c/feature-requests/8) stores the historical archives of old feature requests (up to 2018).
@@ -97,12 +94,12 @@ Join [#support](https://open.rocket.chat/channel/support) and [#general](https:/
# 👥 Contributions
-Rocket.Chat is an open source project and we are very happy to accept community contributions. Refer to the [Modes of contribution guide](https://developer.rocket.chat/contribute-to-rocket.chat/ways-to-contribute) for more details.
+Rocket.Chat is an open-source project, and we are very happy to accept community contributions. Refer to the [Contribution guide](https://developer.rocket.chat/docs/contribute-to-rocketchat) for more details.
# 💼 Become a Rocketeer
-We're hiring developers, support people, and product managers all the time. Check out our [jobs page](https://rocket.chat/jobs).
+We're hiring developers, technical support, and product managers all the time. Check out our [jobs page](https://rocket.chat/jobs).
# 🗞️ Get the Latest News
From 34f05ee69d4b365f80a4b5ceca246568de5e2aa4 Mon Sep 17 00:00:00 2001
From: Tasso Evangelista
Date: Fri, 22 Aug 2025 16:12:37 -0300
Subject: [PATCH 009/197] chore(i18n): Handle nested plurals from Lingohub
(#36771)
---
.github/actions/meteor-build/action.yml | 8 +-
.../client/providers/TranslationProvider.tsx | 2 +-
apps/meteor/packages/rocketchat-i18n/i18n | 2 +-
apps/meteor/private/i18n | 2 +-
packages/i18n/package.json | 36 ++---
packages/i18n/src/locales/ar.i18n.json | 42 +++---
packages/i18n/src/locales/ca.i18n.json | 28 ++--
packages/i18n/src/locales/cs.i18n.json | 22 ++--
packages/i18n/src/locales/da.i18n.json | 20 ++-
packages/i18n/src/locales/de.i18n.json | 29 ++--
packages/i18n/src/locales/en.i18n.json | 99 +++++++++-----
packages/i18n/src/locales/es.i18n.json | 66 ++++++----
packages/i18n/src/locales/et.i18n.json | 8 +-
packages/i18n/src/locales/fa.i18n.json | 8 +-
packages/i18n/src/locales/fi.i18n.json | 41 +++---
packages/i18n/src/locales/fr.i18n.json | 28 ++--
packages/i18n/src/locales/hu.i18n.json | 29 ++--
packages/i18n/src/locales/it.i18n.json | 44 ++++---
packages/i18n/src/locales/ka-GE.i18n.json | 14 +-
packages/i18n/src/locales/nb.i18n.json | 101 +++++++++-----
packages/i18n/src/locales/nl.i18n.json | 23 ++--
packages/i18n/src/locales/nn.i18n.json | 95 +++++++++-----
packages/i18n/src/locales/pl.i18n.json | 43 +++---
packages/i18n/src/locales/pt-BR.i18n.json | 124 +++++++++++-------
packages/i18n/src/locales/ru.i18n.json | 63 +++++----
packages/i18n/src/locales/sv.i18n.json | 101 +++++++++-----
packages/i18n/src/locales/tr.i18n.json | 14 +-
packages/i18n/src/locales/uk.i18n.json | 12 +-
packages/i18n/src/scripts/build.mjs | 8 ++
packages/i18n/src/scripts/normalize.mjs | 25 ++++
packages/i18n/tsconfig.json | 1 +
31 files changed, 723 insertions(+), 415 deletions(-)
diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml
index bfd4ae7f5c204..f0a61915616f1 100644
--- a/.github/actions/meteor-build/action.yml
+++ b/.github/actions/meteor-build/action.yml
@@ -102,10 +102,6 @@ runs:
- uses: rharkor/caching-for-turbo@v1.5
- - name: Translation check
- shell: bash
- run: yarn turbo run translation-check
-
- name: Reset Meteor
shell: bash
if: ${{ inputs.reset-meteor == 'true' }}
@@ -126,6 +122,10 @@ runs:
yarn build:ci
+ - name: Translation check
+ shell: bash
+ run: yarn turbo run translation-check
+
- name: Prepare build
shell: bash
run: |
diff --git a/apps/meteor/client/providers/TranslationProvider.tsx b/apps/meteor/client/providers/TranslationProvider.tsx
index b9fdb64ea9c9a..cdc8a3fc52416 100644
--- a/apps/meteor/client/providers/TranslationProvider.tsx
+++ b/apps/meteor/client/providers/TranslationProvider.tsx
@@ -8,7 +8,7 @@ import {
extractTranslationNamespaces,
} from '@rocket.chat/i18n';
import languages from '@rocket.chat/i18n/dist/languages';
-import en from '@rocket.chat/i18n/src/locales/en.i18n.json';
+import en from '@rocket.chat/i18n/dist/resources/en.i18n.json';
import { normalizeLanguage } from '@rocket.chat/tools';
import type { TranslationContextValue } from '@rocket.chat/ui-contexts';
import { useMethod, useSetting, TranslationContext } from '@rocket.chat/ui-contexts';
diff --git a/apps/meteor/packages/rocketchat-i18n/i18n b/apps/meteor/packages/rocketchat-i18n/i18n
index 160d6db904d7f..6db9a1b8076d9 120000
--- a/apps/meteor/packages/rocketchat-i18n/i18n
+++ b/apps/meteor/packages/rocketchat-i18n/i18n
@@ -1 +1 @@
-../../../../packages/i18n/src/locales
\ No newline at end of file
+../../../../packages/i18n/dist/resources
\ No newline at end of file
diff --git a/apps/meteor/private/i18n b/apps/meteor/private/i18n
index 526b40964cf65..ed6082db9dc6e 120000
--- a/apps/meteor/private/i18n
+++ b/apps/meteor/private/i18n
@@ -1 +1 @@
-../packages/rocketchat-i18n/i18n
\ No newline at end of file
+../../../packages/i18n/dist/resources
\ No newline at end of file
diff --git a/packages/i18n/package.json b/packages/i18n/package.json
index 3e8845b5d1a2a..10088a22ae0f3 100644
--- a/packages/i18n/package.json
+++ b/packages/i18n/package.json
@@ -2,6 +2,21 @@
"name": "@rocket.chat/i18n",
"version": "1.9.0",
"private": true,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "typings": "./dist/index.d.ts",
+ "files": [
+ "/dist"
+ ],
+ "scripts": {
+ ".:build:cjs": "tsc -p tsconfig.cjs.json",
+ ".:build:esm": "tsc -p tsconfig.esm.json",
+ "build": "node ./src/scripts/build.mjs && run .:build:esm && run .:build:cjs",
+ "lint": "eslint --ext .mjs,.js,.jsx,.ts,.tsx .",
+ "lint:fix": "eslint --ext .mjs,.js,.jsx,.ts,.tsx . --fix",
+ "test": "jest",
+ "testunit": "jest"
+ },
"devDependencies": {
"@rocket.chat/jest-presets": "workspace:~",
"@rocket.chat/tools": "workspace:~",
@@ -11,26 +26,11 @@
"jest": "~30.0.5",
"typescript": "~5.9.2"
},
- "scripts": {
- "build": "node ./src/scripts/build.mjs && run .:build:esm && run .:build:cjs",
- ".:build:esm": "tsc -p tsconfig.esm.json",
- ".:build:cjs": "tsc -p tsconfig.cjs.json",
- "lint": "eslint --ext .mjs,.js,.jsx,.ts,.tsx .",
- "lint:fix": "eslint --ext .mjs,.js,.jsx,.ts,.tsx . --fix",
- "test": "jest",
- "testunit": "jest"
- },
- "main": "./dist/index.js",
- "module": "./dist/index.mjs",
- "typings": "./dist/index.d.ts",
- "files": [
- "/dist"
- ],
- "volta": {
- "extends": "../../package.json"
- },
"peerDependencies": {
"@rocket.chat/tools": "workspace:~",
"i18next": "*"
+ },
+ "volta": {
+ "extends": "../../package.json"
}
}
diff --git a/packages/i18n/src/locales/ar.i18n.json b/packages/i18n/src/locales/ar.i18n.json
index a9d2e7f65f4b1..7b7a3d9e751f4 100644
--- a/packages/i18n/src/locales/ar.i18n.json
+++ b/packages/i18n/src/locales/ar.i18n.json
@@ -692,10 +692,14 @@
"Caller": "المتصل",
"Caller_Id": "معرف المتصل",
"Calling": "يتم الآن الاتصال",
- "Calls_in_queue": "{{calls}} من المكالمات الانتظار",
- "Calls_in_queue_one": "{{count}} من المكالمات الانتظار",
- "Calls_in_queue_other": "{{count}} من المكالمات الانتظار",
- "Calls_in_queue_zero": "قائمة الانتظار فارغة",
+ "Calls_in_queue": {
+ "zero": "قائمة الانتظار فارغة",
+ "one": "{{count}} من المكالمات الانتظار",
+ "two": "{{count}} من المكالمات الانتظار",
+ "few": "{{count}} من المكالمات الانتظار",
+ "many": "{{count}} من المكالمات الانتظار",
+ "other": "{{count}} من المكالمات الانتظار"
+ },
"Cancel": "إلغاء",
"Cancel_message_input": "لإلغاء التغييرات",
"Canceled": "تم الإلغاء",
@@ -4541,12 +4545,14 @@
"message": "رسالة",
"message-impersonate": "انتحال صفة مستخدمين آخرين",
"message-impersonate_description": "إذن لانتحال صفة مستخدمين آخرين باستخدام الاسم المستعار للرسالة",
- "message_counter_one": "{{count}} رسالة",
- "message_counter_other": "{{count}} رسائل",
- "message_counter_many": "{{count}} رسائل",
- "message_counter_few": "{{count}} رسائل",
- "message_counter_two": "{{count}} رسائل",
- "message_counter_zero": "{{count}} رسائل",
+ "message_counter": {
+ "zero": "{{count}} رسائل",
+ "one": "{{count}} رسالة",
+ "two": "{{count}} رسائل",
+ "few": "{{count}} رسائل",
+ "many": "{{count}} رسائل",
+ "other": "{{count}} رسائل"
+ },
"message_pruned": "تم تنقيح الرسالة",
"messages": "الرسائل",
"messages_pruned": "تم تنقيح الرسائل",
@@ -4554,12 +4560,14 @@
"meteor_status_connecting": "يتم الاتصال الآن...",
"meteor_status_failed": "فشل الاتصال بالخادم",
"meteor_status_offline": "وضع عدم الاتصال.",
- "meteor_status_reconnect_in_one": "المحاولة مرة أخرى خلال ثانية واحدة...",
- "meteor_status_reconnect_in_other": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
- "meteor_status_reconnect_in_many": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
- "meteor_status_reconnect_in_few": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
- "meteor_status_reconnect_in_two": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
- "meteor_status_reconnect_in_zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
+ "meteor_status_reconnect_in": {
+ "zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
+ "one": "المحاولة مرة أخرى خلال ثانية واحدة...",
+ "two": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
+ "few": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
+ "many": "المحاولة مرة أخرى خلال {{count}} من الثواني...",
+ "other": "المحاولة مرة أخرى خلال {{count}} من الثواني..."
+ },
"meteor_status_try_now_offline": "الاتصال مرة أخرى",
"meteor_status_try_now_waiting": "المحاولة الآن",
"meteor_status_waiting": "في انتظار اتصال الخادم،",
@@ -4892,4 +4900,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "ستتم إزالة {{count}} من الغرف الفارغة تلقائيًا:
{{rooms}}",
"__username__is_no_longer__role__defined_by__user_by_": "لم يعد {{username}} في دور {{role}} من قِبل {{user_by}}",
"__username__was_set__role__by__user_by_": "تم تعيين {{username}} في دور {{role}} من قِبل {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/ca.i18n.json b/packages/i18n/src/locales/ca.i18n.json
index 371afd4bec6d7..e5f71db1601a9 100644
--- a/packages/i18n/src/locales/ca.i18n.json
+++ b/packages/i18n/src/locales/ca.i18n.json
@@ -689,10 +689,12 @@
"Caller": "Emissor",
"Caller_Id": "Identificació de la trucada",
"Calling": "Trucant",
- "Calls_in_queue": "{{calls}} Trucada a la cua",
- "Calls_in_queue_one": "{{count}} Trucada a la cua",
- "Calls_in_queue_other": "{{count}} Trucades a la cua",
- "Calls_in_queue_zero": "La cua és buida",
+ "Calls_in_queue": {
+ "zero": "La cua és buida",
+ "one": "{{count}} Trucada a la cua",
+ "many": "{{count}} Trucades a la cua",
+ "other": "{{count}} Trucades a la cua"
+ },
"Cancel": "Cancel·la",
"Cancel_message_input": "Cancel·la",
"Canceled": "Cancel·lat",
@@ -4422,9 +4424,11 @@
"message": "missatge",
"message-impersonate": "Fer-se passar per altres usuaris",
"message-impersonate_description": "Permís per fer-se passar per altres usuaris utilitzant un àlies de missatge",
- "message_counter_one": "missatge {{count}}",
- "message_counter_other": "{{count}} missatges",
- "message_counter_many": "{{count}} missatges",
+ "message_counter": {
+ "one": "missatge {{count}}",
+ "many": "{{count}} missatges",
+ "other": "{{count}} missatges"
+ },
"message_pruned": "missatge esborrat",
"messages": "Missatges",
"messages_pruned": "missatge esborrat",
@@ -4432,9 +4436,11 @@
"meteor_status_connecting": "Connectant...",
"meteor_status_failed": "La connexió del servidor ha fallat",
"meteor_status_offline": "Mode fora de línia",
- "meteor_status_reconnect_in_one": "intentant de nou en un segon ...",
- "meteor_status_reconnect_in_other": "provant de nou d'aquí a {{count}} segons ...",
- "meteor_status_reconnect_in_many": "provant de nou d'aquí a {{count}} segons ...",
+ "meteor_status_reconnect_in": {
+ "one": "intentant de nou en un segon ...",
+ "many": "provant de nou d'aquí a {{count}} segons ...",
+ "other": "provant de nou d'aquí a {{count}} segons ..."
+ },
"meteor_status_try_now_offline": "Connectar de nou",
"meteor_status_try_now_waiting": "Prova-ho ara",
"meteor_status_waiting": "Esperant la connexió de servidor,",
@@ -4682,4 +4688,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} sales buides seran eliminades automàticament:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ja no és {{role}} (per {{user_by}})",
"__username__was_set__role__by__user_by_": "Ara {{username}} és {{role}} (per {{user_by}})"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/cs.i18n.json b/packages/i18n/src/locales/cs.i18n.json
index 9baa16bddcb00..205b2e1960d2c 100644
--- a/packages/i18n/src/locales/cs.i18n.json
+++ b/packages/i18n/src/locales/cs.i18n.json
@@ -3755,10 +3755,12 @@
"mention-here": "Zmínka @here",
"mention-here_description": "Právo použít zmínku @here",
"message": "zpráva",
- "message_counter_one": "{{count}} zpráva",
- "message_counter_other": "{{count}} zpráv(y)",
- "message_counter_many": "{{count}} zpráv(y)",
- "message_counter_few": "{{count}} zpráv(y)",
+ "message_counter": {
+ "one": "{{count}} zpráva",
+ "few": "{{count}} zpráv(y)",
+ "many": "{{count}} zpráv(y)",
+ "other": "{{count}} zpráv(y)"
+ },
"message_pruned": "zpráva byla oříznuta",
"messages": "zprávy",
"messages_pruned": "zprávy byly pročištěny",
@@ -3766,10 +3768,12 @@
"meteor_status_connecting": "Připojuji k serveru...",
"meteor_status_failed": "Připojení k serveru selhalo",
"meteor_status_offline": "Offline režim.",
- "meteor_status_reconnect_in_one": "zkusím znovu za sekundu...",
- "meteor_status_reconnect_in_other": "zkusím znovu za {{count}} sekund...",
- "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...",
- "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...",
+ "meteor_status_reconnect_in": {
+ "one": "zkusím znovu za sekundu...",
+ "few": "zkusím znovu za {{count}} sekund...",
+ "many": "zkusím znovu za {{count}} sekund...",
+ "other": "zkusím znovu za {{count}} sekund..."
+ },
"meteor_status_try_now_offline": "Znovu připojit",
"meteor_status_try_now_waiting": "Zkusit nyní",
"meteor_status_waiting": "Čekám na připojení k serveru,",
@@ -3969,4 +3973,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} prázdných místností bude automaticky odstraněno:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} již není {{role}} (odebral/a {{user_by}} )",
"__username__was_set__role__by__user_by_": "{{username}} je nyní {{role}} (nastavil/a {{user_by}})"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/da.i18n.json b/packages/i18n/src/locales/da.i18n.json
index 7bafc1f4d9409..c04c355fd2748 100644
--- a/packages/i18n/src/locales/da.i18n.json
+++ b/packages/i18n/src/locales/da.i18n.json
@@ -3864,8 +3864,10 @@
"mention-here": "Nævn her",
"mention-here_description": "Tilladelse til at bruge @here omtalen",
"message": "Besked",
- "message_counter_one": "{{count}} meddelelse",
- "message_counter_other": "{{count}} meddelelser",
+ "message_counter": {
+ "one": "{{count}} meddelelse",
+ "other": "{{count}} meddelelser"
+ },
"message_pruned": "besked slettet",
"messages": "Meddelelser",
"messages_pruned": "beskeder beskåret",
@@ -3873,8 +3875,10 @@
"meteor_status_connecting": "Forbinder...",
"meteor_status_failed": "Forbindelsen til serveren gik tabt",
"meteor_status_offline": "Offline-tilstand.",
- "meteor_status_reconnect_in_one": "forsøger igen om 1 sekund...",
- "meteor_status_reconnect_in_other": "forsøger igen om {{count}} sekunder...",
+ "meteor_status_reconnect_in": {
+ "one": "forsøger igen om 1 sekund...",
+ "other": "forsøger igen om {{count}} sekunder..."
+ },
"meteor_status_try_now_offline": "Forbind igen",
"meteor_status_try_now_waiting": "Forsøg nu",
"meteor_status_waiting": "Afventer forbindelse til server,",
@@ -4077,8 +4081,10 @@
"__count__conversations__period__": "{{count}} samtaler, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} tomme rum fjernes automatisk.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomme rum vil blive fjernet automatisk:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} besked er beskåret",
- "__count__message_pruned_other": "{{count}} beskeder er beskåret",
+ "__count__message_pruned": {
+ "one": "{{count}} besked er beskåret",
+ "other": "{{count}} beskeder er beskåret"
+ },
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} is no longer {{role}} by {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} was set {{role}} by {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/de.i18n.json b/packages/i18n/src/locales/de.i18n.json
index 27704ee78d229..bdba091fb3b11 100644
--- a/packages/i18n/src/locales/de.i18n.json
+++ b/packages/i18n/src/locales/de.i18n.json
@@ -767,10 +767,11 @@
"Caller_Id": "Anrufer-ID",
"Calling": "Anruf wird ausgeführt",
"Calls": "Anrufe",
- "Calls_in_queue": "{{calls}} Anrufe in der Warteschlange",
- "Calls_in_queue_one": "{{count}} Anrufe in der Warteschlange",
- "Calls_in_queue_other": "{{count}} Anrufe in der Warteschlange",
- "Calls_in_queue_zero": "Warteschlange ist leer",
+ "Calls_in_queue": {
+ "zero": "Warteschlange ist leer",
+ "one": "{{count}} Anrufe in der Warteschlange",
+ "other": "{{count}} Anrufe in der Warteschlange"
+ },
"Cam_off": "Kamera aus",
"Cam_on": "Kamera an",
"Camera_access_not_allowed": "Der Zugriff auf die Kamera wurde nicht erlaubt. Bitte überprüfen Sie Ihre Browsereinstellungen.",
@@ -5095,8 +5096,10 @@
"message": "Nachricht",
"message-impersonate": "Sich als anderer Benutzer ausgeben",
"message-impersonate_description": "Erlaubnis, sich für andere Benutzer mit Nachrichten-Alias auszugeben",
- "message_counter_one": "{{count}} message",
- "message_counter_other": "{{count}} messages",
+ "message_counter": {
+ "one": "{{count}} message",
+ "other": "{{count}} messages"
+ },
"message_pruned": "Nachricht abgeschnitten",
"messages": "Nachrichten",
"messages_pruned": "Nachrichten gelöscht",
@@ -5104,8 +5107,10 @@
"meteor_status_connecting": "Verbinden...",
"meteor_status_failed": "Die Verbindung zum Server wurde unterbrochen",
"meteor_status_offline": "Offline Modus.",
- "meteor_status_reconnect_in_one": "Versuche in einer Sekunde zu verbinden...",
- "meteor_status_reconnect_in_other": "Versuche in {{count}} Sekunden zu verbinden...",
+ "meteor_status_reconnect_in": {
+ "one": "Versuche in einer Sekunde zu verbinden...",
+ "other": "Versuche in {{count}} Sekunden zu verbinden..."
+ },
"meteor_status_try_now_offline": "Nochmal verbinden",
"meteor_status_try_now_waiting": "Jetzt versuchen",
"meteor_status_waiting": "Warte auf Verbindung zum Server,",
@@ -5518,9 +5523,11 @@
"your_message_optional": "Ihre optionale Nachricht",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} leere Räume werden automatisch entfernt.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} leere Räume werden automatisch entfernt:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} Nachricht gelöscht",
- "__count__message_pruned_other": "{{count}} Nachrichten gelöscht",
+ "__count__message_pruned": {
+ "one": "{{count}} Nachricht gelöscht",
+ "other": "{{count}} Nachrichten gelöscht"
+ },
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ist nicht länger {{role}}, geändert durch {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} ist jetzt {{role}}, geändert durch {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} Mitglieder werden eingeladen"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json
index b9444e34604f5..8c2f9ca1bf33b 100644
--- a/packages/i18n/src/locales/en.i18n.json
+++ b/packages/i18n/src/locales/en.i18n.json
@@ -486,8 +486,10 @@
"App_Url_to_Install_From_File": "Install from file",
"App_author_homepage": "author homepage",
"App_cannot_be_enabled_without_add-on": "App cannot be enabled without add-on.",
- "App_has_been_disabled_addon_message_one": "The app {{appNames}} has been disabled because of an invalid add-on. A valid add-on subscription is required to re-enable it",
- "App_has_been_disabled_addon_message_other": "The apps {{appNames}} have been disabled because of invalid add-ons. A valid add-on subscription is required to re-enable them",
+ "App_has_been_disabled_addon_message": {
+ "one": "The app {{appNames}} has been disabled because of an invalid add-on. A valid add-on subscription is required to re-enable it",
+ "other": "The apps {{appNames}} have been disabled because of invalid add-ons. A valid add-on subscription is required to re-enable them"
+ },
"App_id": "App Id",
"App_limit_exceeded": "App limit exceeded",
"App_limit_reached": "App limit reached",
@@ -521,8 +523,10 @@
"Apply_filters": "Apply filters",
"Apps": "Apps",
"Apps_Cannot_Be_Updated": "App cannot be updated",
- "Apps_Count_Enabled_one": "{{count}} app enabled",
- "Apps_Count_Enabled_other": "{{count}} apps enabled",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} app enabled",
+ "other": "{{count}} apps enabled"
+ },
"Apps_Count_Enabled_tooltip": "Community workspaces can enable up to {{number}} {{context}} apps",
"Apps_Currently_Enabled": "{{enabled}} of {{limit}} {{context}} apps currently enabled",
"Apps_Engine_Version": "Apps Engine Version",
@@ -915,10 +919,11 @@
"Calling": "Calling",
"Calling__roomName__": "Calling {{roomName}}",
"Calls": "Calls",
- "Calls_in_queue": "{{calls}} call in queue",
- "Calls_in_queue_one": "{{count}} call in queue",
- "Calls_in_queue_other": "{{count}} calls in queue",
- "Calls_in_queue_zero": "Queue is empty",
+ "Calls_in_queue": {
+ "zero": "Queue is empty",
+ "one": "{{count}} call in queue",
+ "other": "{{count}} calls in queue"
+ },
"Cam_off": "Cam Off",
"Cam_on": "Cam On",
"Camera_access_not_allowed": "Camera access was not allowed, please check your browser settings.",
@@ -2259,8 +2264,10 @@
"Flags": "Flags",
"Follow_message": "Follow message",
"Follow_social_profiles": "Follow our social profiles, fork us on github and share your thoughts about the rocket.chat app on our trello board.",
- "Follower_one": "Follower",
- "Follower_other": "Followers",
+ "Follower": {
+ "one": "Follower",
+ "other": "Followers"
+ },
"Following": "Following",
"Font_size": "Font size",
"Fonts": "Fonts",
@@ -4052,8 +4059,10 @@
"Privacy_summary": "Privacy summary",
"Private": "Private",
"Private_Apps": "Private Apps",
- "Private_Apps_Count_Enabled_one": "{{count}} private app enabled",
- "Private_Apps_Count_Enabled_other": "{{count}} private apps enabled",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} private app enabled",
+ "other": "{{count}} private apps enabled"
+ },
"Private_Channel": "Private Channel",
"Private_Channels": "Private channels",
"Private_Chats": "Private Chats",
@@ -6240,8 +6249,10 @@
"get-server-info_description": "Permission to get server info",
"github_HEAD": "HEAD",
"github_no_public_email": "You don't have any email as public email in your GitHub account",
- "group_mentions_counter_one": "{{count}} group mention",
- "group_mentions_counter_other": "{{count}} group mentions",
+ "group_mentions_counter": {
+ "one": "{{count}} group mention",
+ "other": "{{count}} group mentions"
+ },
"hours": "hours",
"if_they_are_from": "(if they are from %s)",
"importer_status_done": "Completed successfully",
@@ -6371,13 +6382,17 @@
"mention-all_description": "Permission to use the @all mention",
"mention-here": "Mention Here",
"mention-here_description": "Permission to use the @here mention",
- "mentions_counter_one": "{{count}} mention",
- "mentions_counter_other": "{{count}} mentions",
+ "mentions_counter": {
+ "one": "{{count}} mention",
+ "other": "{{count}} mentions"
+ },
"message": "message",
"message-impersonate": "Impersonate Other Users",
"message-impersonate_description": "Permission to impersonate other users using message alias",
- "message_counter_one": "{{count}} message",
- "message_counter_other": "{{count}} messages",
+ "message_counter": {
+ "one": "{{count}} message",
+ "other": "{{count}} messages"
+ },
"message_pruned": "message pruned",
"messages": "messages",
"messages_pruned": "messages pruned",
@@ -6385,8 +6400,10 @@
"meteor_status_connecting": "Connecting...",
"meteor_status_failed": "Connection attempt failed",
"meteor_status_offline": "You’re offline",
- "meteor_status_reconnect_in_one": "Trying to reconnect in {{count}} second",
- "meteor_status_reconnect_in_other": "Trying to reconnect in {{count}} seconds",
+ "meteor_status_reconnect_in": {
+ "one": "Trying to reconnect in {{count}} second",
+ "other": "Trying to reconnect in {{count}} seconds"
+ },
"meteor_status_try_again_later": "Please try again later or ask your workspace admin for assistance",
"meteor_status_try_now_offline": "Connect again",
"meteor_status_try_now_waiting": "Try now",
@@ -6662,10 +6679,14 @@
"subscription.callout.activeUsers": "seats",
"subscription.callout.allPremiumCapabilitiesDisabled": "All premium capabilities disabled",
"subscription.callout.capabilitiesDisabled": "Capabilities disabled",
- "subscription.callout.description.limitsExceeded_one": "Your workspace exceeded the <1>{{val}}1> license limit. <3>Manage your subscription3> to increase limits.",
- "subscription.callout.description.limitsExceeded_other": "Your workspace exceeded the <1>{{val, list}}1> license limits. <3>Manage your subscription3> to increase limits.",
- "subscription.callout.description.limitsReached_one": "Your workspace reached the <1>{{val}}1> license limit. <3>Manage your subscription3> to increase limits.",
- "subscription.callout.description.limitsReached_other": "Your workspace reached the <1>{{val, list}}1> license limits. <3>Manage your subscription3> to increase limits.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Your workspace exceeded the <1>{{val}}1> license limit. <3>Manage your subscription3> to increase limits.",
+ "other": "Your workspace exceeded the <1>{{val, list}}1> license limits. <3>Manage your subscription3> to increase limits."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Your workspace reached the <1>{{val}}1> license limit. <3>Manage your subscription3> to increase limits.",
+ "other": "Your workspace reached the <1>{{val, list}}1> license limits. <3>Manage your subscription3> to increase limits."
+ },
"subscription.callout.guestUsers": "guests",
"subscription.callout.marketplaceApps": "installed marketplace apps",
"subscription.callout.monthlyActiveContacts": "monthly active contacts",
@@ -6738,8 +6759,10 @@
"thread_message": "thread message",
"thread_messages": "thread messages",
"thread_message_preview": "thread message preview",
- "threads_counter_one": "{{count}} unread threaded message",
- "threads_counter_other": "{{count}} unread threaded messages",
+ "threads_counter": {
+ "one": "{{count}} unread threaded message",
+ "other": "{{count}} unread threaded messages"
+ },
"to_see_more_details_on_how_to_integrate": "to see more details on how to integrate.",
"toggle-room-e2e-encryption": "Toggle Room E2E Encryption",
"toggle-room-e2e-encryption_description": "Permission to toggle e2e encryption room",
@@ -6757,8 +6780,10 @@
"unauthorized": "Not authorized",
"unblock-livechat-contact": "Unblock Omnichannel contact channel",
"unpinning-not-allowed": "Unpinning is not allowed",
- "unread_messages_counter_one": "{{count}} unread message",
- "unread_messages_counter_other": "{{count}} unread messages",
+ "unread_messages_counter": {
+ "one": "{{count}} unread message",
+ "other": "{{count}} unread messages"
+ },
"update-livechat-contact": "Update Omnichannel contacts",
"used_limit": "{{used, number}} / {{limit, number}}",
"used_limit_infinite": "{{used, number}} / ∞",
@@ -6894,12 +6919,18 @@
"__count__conversations__period__": "{{count}} conversations, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} empty rooms will be removed automatically.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} empty rooms will be removed automatically:
{{rooms}}.",
- "__count__file_pruned_one": "{{count}} file pruned",
- "__count__file_pruned_other": "{{count}} files pruned",
- "__count__follower_one": "+{{count}} follower",
- "__count__follower_other": "+{{count}} followers",
- "__count__message_pruned_one": "{{count}} message pruned",
- "__count__message_pruned_other": "{{count}} messages pruned",
+ "__count__file_pruned": {
+ "one": "{{count}} file pruned",
+ "other": "{{count}} files pruned"
+ },
+ "__count__follower": {
+ "one": "+{{count}} follower",
+ "other": "+{{count}} followers"
+ },
+ "__count__message_pruned": {
+ "one": "{{count}} message pruned",
+ "other": "{{count}} messages pruned"
+ },
"__count__messages_selected": "{{count}} messages selected",
"__count__replies": "{{count}} replies",
"__count__replies__date__": "{{count}} replies, {{date}}",
diff --git a/packages/i18n/src/locales/es.i18n.json b/packages/i18n/src/locales/es.i18n.json
index 227bf63ed2936..c11cf73a26bee 100644
--- a/packages/i18n/src/locales/es.i18n.json
+++ b/packages/i18n/src/locales/es.i18n.json
@@ -4683,15 +4683,19 @@
"mention-all_description": "Permiso para usar la mención @all",
"mention-here": "Mencionar aquí",
"mention-here_description": "Permiso para usar la mención @here",
- "mentions_counter_one": "{{count}} mención",
- "mentions_counter_other": "{{count}} menciones",
- "mentions_counter_many": "{{count}} menciones",
+ "mentions_counter": {
+ "one": "{{count}} mención",
+ "many": "{{count}} menciones",
+ "other": "{{count}} menciones"
+ },
"message": "mensaje",
"message-impersonate": "Suplantar a otros usuarios",
"message-impersonate_description": "Permiso para suplantar a otros usuarios usando un alias de mensaje",
- "message_counter_one": "{{count}} mensaje",
- "message_counter_other": "{{count}} mensajes",
- "message_counter_many": "{{count}} mensajes",
+ "message_counter": {
+ "one": "{{count}} mensaje",
+ "many": "{{count}} mensajes",
+ "other": "{{count}} mensajes"
+ },
"message_pruned": "mensaje retirado",
"messages": "mensajes",
"messages_pruned": "mensajes retirados",
@@ -4699,9 +4703,11 @@
"meteor_status_connecting": "Conectando...",
"meteor_status_failed": "Error de conexión con el servidor",
"meteor_status_offline": "Modo de fuera de línea.",
- "meteor_status_reconnect_in_one": "intentando de nuevo dentro de un segundo...",
- "meteor_status_reconnect_in_other": "intentando de nuevo dentro de {{count}} segundos...",
- "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...",
+ "meteor_status_reconnect_in": {
+ "one": "intentando de nuevo dentro de un segundo...",
+ "many": "intentando de nuevo dentro de {{count}} segundos...",
+ "other": "intentando de nuevo dentro de {{count}} segundos..."
+ },
"meteor_status_try_now_offline": "Conectar de nuevo",
"meteor_status_try_now_waiting": "Intentar ahora",
"meteor_status_waiting": "Esperando la conexión del servidor,",
@@ -4915,12 +4921,16 @@
"subscription.callout.activeUsers": "puestos",
"subscription.callout.allPremiumCapabilitiesDisabled": "Todas las funciones premium desactivadas",
"subscription.callout.capabilitiesDisabled": "Características desactivadas",
- "subscription.callout.description.limitsExceeded_one": "Su espacio de trabajo ha superado el límite de <1> {{val}} 1>. <3> Administre su suscripción3> para incrementar los límites.",
- "subscription.callout.description.limitsExceeded_other": "Su espacio de trabajo ha superado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
- "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
- "subscription.callout.description.limitsReached_one": "Su espacio de trabajo ha alcanzado el límite <1> {{val}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
- "subscription.callout.description.limitsReached_other": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
- "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Su espacio de trabajo ha superado el límite de <1> {{val}} 1>. <3> Administre su suscripción3> para incrementar los límites.",
+ "many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
+ "other": "Su espacio de trabajo ha superado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Su espacio de trabajo ha alcanzado el límite <1> {{val}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
+ "many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites.",
+ "other": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} 1>. <3> Administre su suscripción 3> para incrementar los límites."
+ },
"subscription.callout.guestUsers": "invitados",
"subscription.callout.monthlyActiveContacts": "Contactos Activos Mensuales (MAC)",
"subscription.callout.servicesDisruptionsMayOccur": "Pueden ocurrir interrupciones en los servicios.",
@@ -4979,9 +4989,11 @@
"theme-custom-css": "CSS personalizado",
"theme-font-body-font-family": "Familia de fuentes de cuerpo",
"thread": "hilo",
- "threads_counter_one": "{{count}} mensaje en hilo sin leer",
- "threads_counter_other": "{{count}} mensajes en hilo sin leer",
- "threads_counter_many": "{{count}} mensajes en hilo sin leer",
+ "threads_counter": {
+ "one": "{{count}} mensaje en hilo sin leer",
+ "many": "{{count}} mensajes en hilo sin leer",
+ "other": "{{count}} mensajes en hilo sin leer"
+ },
"to_see_more_details_on_how_to_integrate": "para ver más detalles sobre cómo integrar.",
"toggle-room-e2e-encryption": "Alternar cifrado E2E de Room",
"toggle-room-e2e-encryption_description": "Permiso para alternar el cifrado E2E de la sala",
@@ -4997,9 +5009,11 @@
"unarchive-room_description": "Permiso para desarchivar canales",
"unauthorized": "No autorizado",
"unpinning-not-allowed": "No se puede desfijar",
- "unread_messages_counter_one": "{{count}} mensaje sin leer",
- "unread_messages_counter_other": "{{count}} mensajes sin leer",
- "unread_messages_counter_many": "{{count}} mensajes sin leer",
+ "unread_messages_counter": {
+ "one": "{{count}} mensaje sin leer",
+ "many": "{{count}} mensajes sin leer",
+ "other": "{{count}} mensajes sin leer"
+ },
"user-generate-access-token": "Token de acceso generado por el usuario",
"user-generate-access-token_description": "Permiso para que los usuarios generen tokens de acceso",
"user_joined_otr": "Se ha unido al chat OTR.",
@@ -5078,9 +5092,11 @@
"__count__conversations__period__": "{{count}} conversaciones, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} salas vacías se eliminarán automáticamente.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salas vacías se eliminarán automáticamente.
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} mensaje borrado",
- "__count__message_pruned_other": "{{count}} mensajes borrados",
- "__count__message_pruned_many": "{{count}} mensajes borrados",
+ "__count__message_pruned": {
+ "one": "{{count}} mensaje borrado",
+ "many": "{{count}} mensajes borrados",
+ "other": "{{count}} mensajes borrados"
+ },
"__count__tags__and__count__conversations__period__": "{{count}} etiquetas y {{conversations}} conversaciones, {{period}}",
"__count__without__assignee__": "{{count}} sin un agente asignado",
"__count__without__department__": "{{count}} sin departamentos",
@@ -5089,4 +5105,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ya no es {{role}} (por {{user_by}})",
"__username__was_set__role__by__user_by_": "{{username}} se ha establecido como {{role}} por {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} miembros sern invitados"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/et.i18n.json b/packages/i18n/src/locales/et.i18n.json
index 4681e0a7859a9..55a4e574e470e 100644
--- a/packages/i18n/src/locales/et.i18n.json
+++ b/packages/i18n/src/locales/et.i18n.json
@@ -69,11 +69,13 @@
"meteor_status_connecting": "Ühendan...",
"meteor_status_failed": "Ei saa serveriga ühendust",
"meteor_status_offline": "Offline režiimis.",
- "meteor_status_reconnect_in_one": "proovin uuesti 1 sekundi pärast...",
- "meteor_status_reconnect_in_other": "proovin uuesti {{count}} sekundi pärast...",
+ "meteor_status_reconnect_in": {
+ "one": "proovin uuesti 1 sekundi pärast...",
+ "other": "proovin uuesti {{count}} sekundi pärast..."
+ },
"meteor_status_try_now_offline": "Ühenda uuesti",
"meteor_status_try_now_waiting": "Proovi nüüd",
"meteor_status_waiting": "Ootan serveriga ühendust,",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ei ole enam {{role}} poolt {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} määrati {{role}} poolt {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/fa.i18n.json b/packages/i18n/src/locales/fa.i18n.json
index 7be2c78df7ddb..ec1820c268c5e 100644
--- a/packages/i18n/src/locales/fa.i18n.json
+++ b/packages/i18n/src/locales/fa.i18n.json
@@ -3110,9 +3110,11 @@
"your_message": "پیام شما",
"your_message_optional": "پیام شما(انتخابی)",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} اتاق خالی به طور خودکار حذف خواهد شد.",
- "__count__message_pruned_one": "{{count}} پیام حذف شد",
- "__count__message_pruned_other": "{{count}} پیام حذف شد",
+ "__count__message_pruned": {
+ "one": "{{count}} پیام حذف شد",
+ "other": "{{count}} پیام حذف شد"
+ },
"__roomName__was_added_to_favorites": "{{roomName}} به موارد دلخواه اضافه شد",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} دیگر توسط {{user_by}} {{role}} نمی شود",
"__username__was_set__role__by__user_by_": "{{username}} توسط {{user_by}} به عنوان {{role}} تعیین شد"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/fi.i18n.json b/packages/i18n/src/locales/fi.i18n.json
index 8e8a77c0de11c..5a64868dddccd 100644
--- a/packages/i18n/src/locales/fi.i18n.json
+++ b/packages/i18n/src/locales/fi.i18n.json
@@ -451,8 +451,10 @@
"Apply": "Käytä",
"Apply_and_refresh_all_clients": "Tallenna ja päivitä kaikki asiakkaat",
"Apps": "Sovellukset",
- "Apps_Count_Enabled_one": "{{count}} sovellus käytössä",
- "Apps_Count_Enabled_other": "{{count}} sovellusta käytössä",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} sovellus käytössä",
+ "other": "{{count}} sovellusta käytössä"
+ },
"Apps_Count_Enabled_tooltip": "Yhteisöversion työtiloissa voi ottaa käyttöön enintään {{number}} {{context}}sovellusta",
"Apps_Currently_Enabled": "{{enabled}}/{{limit}} {{context}}sovellusta on nyt käytössä.",
"Apps_Engine_Version": "Sovellusmoottorin versio",
@@ -792,10 +794,11 @@
"Caller_Id": "Soittajan tunnus",
"Calling": "Soitetaan",
"Calls": "Puhelut",
- "Calls_in_queue": "{{calls}} puhelu jonossa",
- "Calls_in_queue_one": "{{count}} puhelu jonossa",
- "Calls_in_queue_other": "{{count}} puhelua jonossa",
- "Calls_in_queue_zero": "Jono on tyhjä",
+ "Calls_in_queue": {
+ "zero": "Jono on tyhjä",
+ "one": "{{count}} puhelu jonossa",
+ "other": "{{count}} puhelua jonossa"
+ },
"Cam_off": "Kamera ei käytössä",
"Cam_on": "Kamera käytössä",
"Camera_access_not_allowed": "Kameran käyttöä ei sallittu, tarkista selaimen asetukset.",
@@ -3346,8 +3349,10 @@
"Privacy_summary": "Tietosuojakäytännön yhteenveto",
"Private": "Yksityinen",
"Private_Apps": "Yksityiset sovellukset",
- "Private_Apps_Count_Enabled_one": "{{count}} yksityistä sovellusta käytössä",
- "Private_Apps_Count_Enabled_other": "{{count}} yksityistä sovellusta käytössä",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} yksityistä sovellusta käytössä",
+ "other": "{{count}} yksityistä sovellusta käytössä"
+ },
"Private_Channel": "Yksityinen kanava Channel",
"Private_Channels": "Yksityiset kanavat Channel",
"Private_Chats": "Yksityiset keskustelut",
@@ -5281,8 +5286,10 @@
"message": "viesti",
"message-impersonate": "Esiinny toisena käyttäjänä",
"message-impersonate_description": "Lupa esiintyä muina käyttäjinä viestin aliasta käyttäen",
- "message_counter_one": "{{count}} viesti",
- "message_counter_other": "{{count}} viestit",
+ "message_counter": {
+ "one": "{{count}} viesti",
+ "other": "{{count}} viestit"
+ },
"message_pruned": "viesti karsittu",
"messages": "viestit",
"messages_pruned": "viestiä karsittu",
@@ -5290,8 +5297,10 @@
"meteor_status_connecting": "Yhdistetään...",
"meteor_status_failed": "Yhteys palvelimeen epäonnistui",
"meteor_status_offline": "Offline-tila.",
- "meteor_status_reconnect_in_one": "yrittää uudelleen sekunnin kuluttua...",
- "meteor_status_reconnect_in_other": "yritän uudelleen {{count}} sekunnin kuluttua...",
+ "meteor_status_reconnect_in": {
+ "one": "yrittää uudelleen sekunnin kuluttua...",
+ "other": "yritän uudelleen {{count}} sekunnin kuluttua..."
+ },
"meteor_status_try_now_offline": "Yhdistä uudelleen",
"meteor_status_try_now_waiting": "Kokeile nyt",
"meteor_status_waiting": "Odottaa palvelinyhteyttä,",
@@ -5735,9 +5744,11 @@
"your_message_optional": "viestisi (valinnainen)",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} tyhjää huonetta poistetaan automaattisesti.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tyhjää huonetta poistetaan automaattisesti:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} viesti karsittu",
- "__count__message_pruned_other": "{{count}} viestiä karsittu",
+ "__count__message_pruned": {
+ "one": "{{count}} viesti karsittu",
+ "other": "{{count}} viestiä karsittu"
+ },
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ei ole enää {{role}} (muutoksen teki {{user_by}})",
"__username__was_set__role__by__user_by_": "{{user_by}} muutti käyttäjän {{username}} rooliksi {{role}} ",
"__usersCount__people_will_be_invited": "{{usersCount}} henkilöä kutsutaan"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/fr.i18n.json b/packages/i18n/src/locales/fr.i18n.json
index ccb6cf87f4ac7..d7ad6a3b61db7 100644
--- a/packages/i18n/src/locales/fr.i18n.json
+++ b/packages/i18n/src/locales/fr.i18n.json
@@ -696,10 +696,12 @@
"Caller_Id": "ID de l'appelant",
"Calling": "Appel",
"Calls": "Appels",
- "Calls_in_queue": "{{calls}} appel en file d'attente",
- "Calls_in_queue_one": "{{count}} appel en file d'attente",
- "Calls_in_queue_other": "{{count}} appels en file d'attente",
- "Calls_in_queue_zero": "La file d'attente est vide",
+ "Calls_in_queue": {
+ "zero": "La file d'attente est vide",
+ "one": "{{count}} appel en file d'attente",
+ "many": "{{count}} appels en file d'attente",
+ "other": "{{count}} appels en file d'attente"
+ },
"Cancel": "Annuler",
"Cancel_message_input": "Annuler",
"Canceled": "Annulé",
@@ -4548,9 +4550,11 @@
"message": "message",
"message-impersonate": "Emprunter l'identité d'autres utilisateurs",
"message-impersonate_description": "Autorisation d'emprunter l'identité d'autres utilisateurs à l'aide d'un alias de message",
- "message_counter_one": "{{count}} message",
- "message_counter_other": "{{count}} messages",
- "message_counter_many": "{{count}} messages",
+ "message_counter": {
+ "one": "{{count}} message",
+ "many": "{{count}} messages",
+ "other": "{{count}} messages"
+ },
"message_pruned": "message élagué",
"messages": "messages",
"messages_pruned": "messages élagués",
@@ -4558,9 +4562,11 @@
"meteor_status_connecting": "Connexion...",
"meteor_status_failed": "La connexion au serveur a échoué",
"meteor_status_offline": "Mode hors ligne.",
- "meteor_status_reconnect_in_one": "nouvelle tentative dans une seconde...",
- "meteor_status_reconnect_in_other": "nouvelle tentative dans {{count}} secondes...",
- "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...",
+ "meteor_status_reconnect_in": {
+ "one": "nouvelle tentative dans une seconde...",
+ "many": "nouvelle tentative dans {{count}} secondes...",
+ "other": "nouvelle tentative dans {{count}} secondes..."
+ },
"meteor_status_try_now_offline": "Reconnexion",
"meteor_status_try_now_waiting": "Essayer maintenant",
"meteor_status_waiting": "En attente de connexion au serveur,",
@@ -4891,4 +4897,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salons vides seront supprimés automatiquement :
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{user_by}} a retiré le rôle {{role}} à {{username}}",
"__username__was_set__role__by__user_by_": "{{user_by}} a donné le rôle {{role}} à {{username}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/hu.i18n.json b/packages/i18n/src/locales/hu.i18n.json
index ae23203c25f10..1e28e8a6221e8 100644
--- a/packages/i18n/src/locales/hu.i18n.json
+++ b/packages/i18n/src/locales/hu.i18n.json
@@ -755,10 +755,11 @@
"Caller_Id": "Hívóazonosító",
"Calling": "Hívás",
"Calls": "Hívások",
- "Calls_in_queue": "{{calls}} hívás a várólistán",
- "Calls_in_queue_one": "{{count}} hívás a várólistán",
- "Calls_in_queue_other": "{{count}} hívás a várólistán",
- "Calls_in_queue_zero": "A várólista üres",
+ "Calls_in_queue": {
+ "zero": "A várólista üres",
+ "one": "{{count}} hívás a várólistán",
+ "other": "{{count}} hívás a várólistán"
+ },
"Cam_off": "Kamera ki",
"Cam_on": "Kamera be",
"Cancel": "Mégse",
@@ -4982,8 +4983,10 @@
"message": "üzenet",
"message-impersonate": "Más felhasználók megszemélyesítése",
"message-impersonate_description": "Jogosultság más felhasználók üzenetálnév használatával történő megszemélyesítéséhez",
- "message_counter_one": "{{count}} üzenet",
- "message_counter_other": "{{count}} üzenet",
+ "message_counter": {
+ "one": "{{count}} üzenet",
+ "other": "{{count}} üzenet"
+ },
"message_pruned": "üzenet törölve",
"messages": "üzenetek",
"messages_pruned": "üzenetek törölve",
@@ -4991,8 +4994,10 @@
"meteor_status_connecting": "Kapcsolódás…",
"meteor_status_failed": "A kiszolgálóhoz való kapcsolódás sikertelen",
"meteor_status_offline": "Kapcsolat nélküli mód.",
- "meteor_status_reconnect_in_one": "újrapróbálás egy másodperc múlva…",
- "meteor_status_reconnect_in_other": "újrapróbálás {{count}} másodperc múlva…",
+ "meteor_status_reconnect_in": {
+ "one": "újrapróbálás egy másodperc múlva…",
+ "other": "újrapróbálás {{count}} másodperc múlva…"
+ },
"meteor_status_try_now_offline": "Kapcsolódás újra",
"meteor_status_try_now_waiting": "Próbálja most",
"meteor_status_waiting": "Várakozás a kiszolgálóhoz való kapcsolódásra,",
@@ -5417,9 +5422,11 @@
"your_message_optional": "az üzenete (elhagyható)",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} üres szoba automatikusan eltávolításra kerül.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} üres szoba automatikusan eltávolításra kerül:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} üzenet törölve",
- "__count__message_pruned_other": "{{count}} üzenet törölve",
+ "__count__message_pruned": {
+ "one": "{{count}} üzenet törölve",
+ "other": "{{count}} üzenet törölve"
+ },
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} többé már nem {{role}} {{user_by}} által",
"__username__was_set__role__by__user_by_": "{{username}} most már {{role}} {{user_by}} által",
"__usersCount__people_will_be_invited": "{{usersCount}} személy lesz meghívva"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/it.i18n.json b/packages/i18n/src/locales/it.i18n.json
index 6ee3e5a1bfc29..24913271626c7 100644
--- a/packages/i18n/src/locales/it.i18n.json
+++ b/packages/i18n/src/locales/it.i18n.json
@@ -349,9 +349,11 @@
"Apply": "Applicare",
"Apply_and_refresh_all_clients": "Applica e aggiorna tutti i clienti",
"Apps": "Apps",
- "Apps_Count_Enabled_one": "{{count}} app abilitate",
- "Apps_Count_Enabled_other": "{{count}} app abilitate",
- "Apps_Count_Enabled_many": "{{count}} app abilitate",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} app abilitate",
+ "many": "{{count}} app abilitate",
+ "other": "{{count}} app abilitate"
+ },
"Apps_Count_Enabled_tooltip": "Gli spazi di lavoro comunitari possono abilitare fino a {{number}} applicazioni {{context}}",
"Apps_Framework_enabled": "Abilita l'App Framework",
"Apps_Game_Center": "Game Center",
@@ -506,10 +508,12 @@
"Caller_Id": "ID chiamante",
"Calling": "Chiamata in corso",
"Calls": "Chiamate",
- "Calls_in_queue": "{{calls}} chiamate in coda",
- "Calls_in_queue_one": "{{count}} chiamata in coda",
- "Calls_in_queue_other": "{{count}} chiamate in coda",
- "Calls_in_queue_zero": "La coda è vuota",
+ "Calls_in_queue": {
+ "zero": "La coda è vuota",
+ "one": "{{count}} chiamata in coda",
+ "many": "{{count}} chiamate in coda",
+ "other": "{{count}} chiamate in coda"
+ },
"Cam_off": "Camera spenta",
"Cam_on": "Camera accesa",
"Camera_access_not_allowed": "L'accesso alla telecamera non è stato consentito, controlla le impostazioni del browser.",
@@ -2110,9 +2114,11 @@
"Privacy_Policy": "Privacy Policy",
"Private": "Privato",
"Private_Apps": "Applicazioni private",
- "Private_Apps_Count_Enabled_one": "{{count}} applicazione private abilitate",
- "Private_Apps_Count_Enabled_other": "{{count}} applicazioni private abilitate",
- "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} applicazione private abilitate",
+ "many": "{{count}} applicazioni private abilitate",
+ "other": "{{count}} applicazioni private abilitate"
+ },
"Private_Channel": "Canale privato",
"Private_Channels": "Canali privati",
"Private_Group": "Gruppo privato",
@@ -3215,9 +3221,11 @@
"meteor_status_connecting": "Connessione in corso...",
"meteor_status_failed": "Impossibile connettersi al server",
"meteor_status_offline": "Modalità non in linea.",
- "meteor_status_reconnect_in_one": "riprovo tra pochi secondi...",
- "meteor_status_reconnect_in_other": "riprovo tra {{count}} secondi...",
- "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...",
+ "meteor_status_reconnect_in": {
+ "one": "riprovo tra pochi secondi...",
+ "many": "riprovo tra {{count}} secondi...",
+ "other": "riprovo tra {{count}} secondi..."
+ },
"meteor_status_try_now_offline": "Riprova",
"meteor_status_try_now_waiting": "Connetti ora",
"meteor_status_waiting": "Server non disponibile,",
@@ -3406,9 +3414,11 @@
"__count__conversations__period__": "{{count}} conversazioni, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} stanze vuote verranno automaticamente rimosse.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} stanze vuote saranno rimosse automaticamente:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} messaggio eliminato",
- "__count__message_pruned_other": "{{count}} messaggi eliminati",
- "__count__message_pruned_many": "{{count}} messaggi eliminati",
+ "__count__message_pruned": {
+ "one": "{{count}} messaggio eliminato",
+ "many": "{{count}} messaggi eliminati",
+ "other": "{{count}} messaggi eliminati"
+ },
"__count__tags__and__count__conversations__period__": "{{count}} tag e {{conversations}} conversazioni, {{period}}",
"__count__without__assignee__": "{{count}} non assegnate",
"__count__without__department__": "{{count}} senza reparto",
@@ -3417,4 +3427,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} non è più {{role}}, da {{user_by}}",
"__username__was_set__role__by__user_by_": "A {{username}} è stato assegnato il ruolo di {{role}} da {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} persone saranno invitate"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/ka-GE.i18n.json b/packages/i18n/src/locales/ka-GE.i18n.json
index 9d076c1929bac..9b1d05e7c7eaa 100644
--- a/packages/i18n/src/locales/ka-GE.i18n.json
+++ b/packages/i18n/src/locales/ka-GE.i18n.json
@@ -3488,15 +3488,19 @@
"mention-here": "ახსენეთ აქ",
"mention-here_description": "აქ ხსენების გამოყენების უფლება",
"message": "შეტყობინება",
- "message_counter_one": "{{count}} შეტყობინება",
- "message_counter_other": "{{count}} შეტყობინებები",
+ "message_counter": {
+ "one": "{{count}} შეტყობინება",
+ "other": "{{count}} შეტყობინებები"
+ },
"messages": "შეტყობინებები",
"meteor_status_connected": "დაკავშირებულია",
"meteor_status_connecting": "დაკავშირება ...",
"meteor_status_failed": "სერვერთან დაკავშირება ვერ მოხერხდა",
"meteor_status_offline": "ოფლაინ რეჟიმი",
- "meteor_status_reconnect_in_one": "კიდევ სცადე 1 წამის შემდეგ...",
- "meteor_status_reconnect_in_other": "კიდვ სცადე {{count}} წამში...",
+ "meteor_status_reconnect_in": {
+ "one": "კიდევ სცადე 1 წამის შემდეგ...",
+ "other": "კიდვ სცადე {{count}} წამში..."
+ },
"meteor_status_try_now_offline": "ისევ დაკავშირება",
"meteor_status_try_now_waiting": "სცადე ახლა",
"meteor_status_waiting": "სერვერთან კავშირის მოლოდინი",
@@ -3688,4 +3692,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} ცარიელი ოთახები ავტომატურად წაიშლება:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}}ჩამეორთვა {{role}} {{user_by}}მიერ",
"__username__was_set__role__by__user_by_": "{{username}} -ს მისცა {{role}} უფლება მომხმარებელმა: {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/nb.i18n.json b/packages/i18n/src/locales/nb.i18n.json
index abe93eb970683..146b9dbc9fd48 100644
--- a/packages/i18n/src/locales/nb.i18n.json
+++ b/packages/i18n/src/locales/nb.i18n.json
@@ -483,8 +483,10 @@
"App_Url_to_Install_From_File": "Installer fra fil",
"App_author_homepage": "forfatter hjemmeside",
"App_cannot_be_enabled_without_add-on": "Appen kan ikke aktiveres uten utvidelse.",
- "App_has_been_disabled_addon_message_one": "Appen {{appNames}} har blitt deaktivert på grunn av et ugyldig tillegg. Et gyldig tilleggsabonnement kreves for å aktivere det på nytt",
- "App_has_been_disabled_addon_message_other": "Appene {{appNames}} har blitt deaktivert på grunn av ugyldige tillegg. Et gyldig tilleggsabonnement kreves for å aktivere dem på nytt",
+ "App_has_been_disabled_addon_message": {
+ "one": "Appen {{appNames}} har blitt deaktivert på grunn av et ugyldig tillegg. Et gyldig tilleggsabonnement kreves for å aktivere det på nytt",
+ "other": "Appene {{appNames}} har blitt deaktivert på grunn av ugyldige tillegg. Et gyldig tilleggsabonnement kreves for å aktivere dem på nytt"
+ },
"App_limit_exceeded": "Appgrensen er overskredet",
"App_limit_reached": "Appgrensen er nådd",
"App_name": "Appens navn",
@@ -515,8 +517,10 @@
"Apply_and_refresh_all_clients": "Bruk, og oppdater alle klienter",
"Apps": "Apper",
"Apps_Cannot_Be_Updated": "Appen kan ikke oppdateres",
- "Apps_Count_Enabled_one": "{{count}} app aktivert",
- "Apps_Count_Enabled_other": "{{count}} apper aktivert",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} app aktivert",
+ "other": "{{count}} apper aktivert"
+ },
"Apps_Count_Enabled_tooltip": "Community-utgave arbeidsområder kan aktivere opptil {{number}} {{context}} apper",
"Apps_Currently_Enabled": "{{enabled}} av {{limit}} {{context}} apper er for øyeblikket aktivert",
"Apps_Engine_Version": "Versjon av Apps Engine",
@@ -909,10 +913,11 @@
"Calling": "Ringer",
"Calling__roomName__": "Ringing {{roomName}}",
"Calls": "Samtaler",
- "Calls_in_queue": "{{calls}} anrop i kø",
- "Calls_in_queue_one": "{{count}} anrop i kø",
- "Calls_in_queue_other": "{{count}} anrop i kø",
- "Calls_in_queue_zero": "Køen er tom",
+ "Calls_in_queue": {
+ "zero": "Køen er tom",
+ "one": "{{count}} anrop i kø",
+ "other": "{{count}} anrop i kø"
+ },
"Cam_off": "Kamera av",
"Cam_on": "Kamera på",
"Camera_access_not_allowed": "Kameratilgang ble ikke tillatt, sjekk nettleserinnstillingene.",
@@ -2249,8 +2254,10 @@
"Flags": "Flagg",
"Follow_message": "Følg melding",
"Follow_social_profiles": "Følg våre sosiale profiler, fork (fordel) oss på github og del tankene dine om rocket.chat-appen på trello-tavlen vår.",
- "Follower_one": "Følger",
- "Follower_other": "Følgere",
+ "Follower": {
+ "one": "Følger",
+ "other": "Følgere"
+ },
"Following": "Følgende",
"Font_size": "Skriftstørrelse",
"Fonts": "Skrifter",
@@ -4021,8 +4028,10 @@
"Privacy_summary": "Personvernsammendrag",
"Private": "Privat",
"Private_Apps": "Private apper",
- "Private_Apps_Count_Enabled_one": "{{count}} privat app aktivert",
- "Private_Apps_Count_Enabled_other": "{{count}} private apper aktivert",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} privat app aktivert",
+ "other": "{{count}} private apper aktivert"
+ },
"Private_Channel": "Privat kanal",
"Private_Channels": "Private kanaler",
"Private_Chats": "Private chatter",
@@ -6200,8 +6209,10 @@
"get-server-info_description": "Tillatelse til å hente serverinformasjon",
"github_HEAD": "HEAD",
"github_no_public_email": "Du har ingen e-post som offentlig e-post i din GitHub-konto",
- "group_mentions_counter_one": "{{count}} gruppeomtale",
- "group_mentions_counter_other": "{{count}} gruppeomtaler",
+ "group_mentions_counter": {
+ "one": "{{count}} gruppeomtale",
+ "other": "{{count}} gruppeomtaler"
+ },
"hours": "timer",
"if_they_are_from": "(hvis de er fra %s)",
"importer_status_done": "Fullført",
@@ -6331,13 +6342,17 @@
"mention-all_description": "Tillatelse til å bruke @all-omtale",
"mention-here": "Nevn her",
"mention-here_description": "Tillatelse til å bruke @here-omtalen",
- "mentions_counter_one": "{{count}} omtale",
- "mentions_counter_other": "{{count}} omtaler",
+ "mentions_counter": {
+ "one": "{{count}} omtale",
+ "other": "{{count}} omtaler"
+ },
"message": "melding",
"message-impersonate": "Utgi seg for andre brukere",
"message-impersonate_description": "Tillatelse til å utgi seg for andre brukere ved å bruke meldingsalias",
- "message_counter_one": "{{count}} melding",
- "message_counter_other": "{{count}} meldinger",
+ "message_counter": {
+ "one": "{{count}} melding",
+ "other": "{{count}} meldinger"
+ },
"message_pruned": "melding beskåret",
"messages": "meldinger",
"messages_pruned": "meldinger beskjært",
@@ -6345,8 +6360,10 @@
"meteor_status_connecting": "Kobler til...",
"meteor_status_failed": "Tilkoblingsforsøk mislyktes",
"meteor_status_offline": "Du er frakoblet",
- "meteor_status_reconnect_in_one": "Prøver å koble til igjen om {{count}} sekund",
- "meteor_status_reconnect_in_other": "Prøver å koble til igjen om {{count}} sekunder",
+ "meteor_status_reconnect_in": {
+ "one": "Prøver å koble til igjen om {{count}} sekund",
+ "other": "Prøver å koble til igjen om {{count}} sekunder"
+ },
"meteor_status_try_again_later": "Prøv igjen senere eller be arbeidsområdeadministratoren din om hjelp",
"meteor_status_try_now_offline": "Koble til igjen",
"meteor_status_try_now_waiting": "Prøv nå",
@@ -6622,10 +6639,14 @@
"subscription.callout.activeUsers": "seter",
"subscription.callout.allPremiumCapabilitiesDisabled": "Alle premium-funksjoner er deaktivert",
"subscription.callout.capabilitiesDisabled": "Funksjoner deaktivert",
- "subscription.callout.description.limitsExceeded_one": "Arbeidsområdet ditt overskred lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsExceeded_other": "Arbeidsområdet ditt overskred <1>{{val, list}}1> lisensgrensene. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsReached_one": "Arbeidsområdet ditt nådde lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsReached_other": "Arbeidsområdet ditt nådde lisensgrensene <1>{{val, list}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Arbeidsområdet ditt overskred lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "other": "Arbeidsområdet ditt overskred <1>{{val, list}}1> lisensgrensene. <3>Administrer abonnementet ditt3> for å øke grensene."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Arbeidsområdet ditt nådde lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "other": "Arbeidsområdet ditt nådde lisensgrensene <1>{{val, list}}1>. <3>Administrer abonnementet ditt3> for å øke grensene."
+ },
"subscription.callout.guestUsers": "gjester",
"subscription.callout.marketplaceApps": "installerte markedsplassapper",
"subscription.callout.monthlyActiveContacts": "månedlige aktive kontakter",
@@ -6698,8 +6719,10 @@
"thread_message": "trådmelding",
"thread_messages": "trådmeldinger",
"thread_message_preview": "forhåndsvisning av trådmelding",
- "threads_counter_one": "{{count}} ulest trådmelding",
- "threads_counter_other": "{{count}} uleste trådmeldinger",
+ "threads_counter": {
+ "one": "{{count}} ulest trådmelding",
+ "other": "{{count}} uleste trådmeldinger"
+ },
"to_see_more_details_on_how_to_integrate": "for å se flere detaljer om hvordan å integrere.",
"toggle-room-e2e-encryption": "Veksle mellom rom E2E-kryptering",
"toggle-room-e2e-encryption_description": "Tillatelse til å veksle mellom e2e-krypteringsrom",
@@ -6717,8 +6740,10 @@
"unauthorized": "Ikke autorisert",
"unblock-livechat-contact": "Fjern blokkering av omnikanal kontaktkanal",
"unpinning-not-allowed": "Unpinning er ikke tillatt",
- "unread_messages_counter_one": "{{count}} ulest melding",
- "unread_messages_counter_other": "{{count}} uleste meldinger",
+ "unread_messages_counter": {
+ "one": "{{count}} ulest melding",
+ "other": "{{count}} uleste meldinger"
+ },
"update-livechat-contact": "Oppdater omnikanalkontakter",
"used_limit": "{{used, number}} / {{limit, number}}",
"used_limit_infinite": "{{used, number}} / ∞",
@@ -6854,12 +6879,18 @@
"__count__conversations__period__": "{{count}} samtaler, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} tomme rom vil bli fjernet automatisk.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomme rom vil bli fjernet automatisk:
{{rooms}}.",
- "__count__file_pruned_one": "{{count}} filen beskjæres",
- "__count__file_pruned_other": "{{count}} filer beskjæres",
- "__count__follower_one": "+{{count}} følger",
- "__count__follower_other": "+{{count}} følgere",
- "__count__message_pruned_one": "{{count}} melding fjernet",
- "__count__message_pruned_other": "{{count}} meldinger fjernet",
+ "__count__file_pruned": {
+ "one": "{{count}} filen beskjæres",
+ "other": "{{count}} filer beskjæres"
+ },
+ "__count__follower": {
+ "one": "+{{count}} følger",
+ "other": "+{{count}} følgere"
+ },
+ "__count__message_pruned": {
+ "one": "{{count}} melding fjernet",
+ "other": "{{count}} meldinger fjernet"
+ },
"__count__messages_selected": "{{count}} meldinger er valgt",
"__count__replies": "{{count}} svar",
"__count__replies__date__": "{{count}} svar, {{date}}",
@@ -6879,4 +6910,4 @@
"__usernames__joined": "{{usernames}} ble med",
"__usersCount__joined": "{{count}} ble med",
"__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/nl.i18n.json b/packages/i18n/src/locales/nl.i18n.json
index 1569a9ea37765..bf7411124f75e 100644
--- a/packages/i18n/src/locales/nl.i18n.json
+++ b/packages/i18n/src/locales/nl.i18n.json
@@ -691,10 +691,11 @@
"Caller": "Beller",
"Caller_Id": "Beller ID",
"Calling": "Bellen",
- "Calls_in_queue": "{{calls}} oproep in de wachtrij",
- "Calls_in_queue_one": "{{count}} oproep in de wachtrij",
- "Calls_in_queue_other": "{{count}} oproepen in de wachtrij",
- "Calls_in_queue_zero": "Wachtrij is leeg",
+ "Calls_in_queue": {
+ "zero": "Wachtrij is leeg",
+ "one": "{{count}} oproep in de wachtrij",
+ "other": "{{count}} oproepen in de wachtrij"
+ },
"Cancel": "Annuleren",
"Cancel_message_input": "Annuleren",
"Canceled": "Geannuleerd",
@@ -4536,8 +4537,10 @@
"message": "bericht",
"message-impersonate": "Zich als andere gebruikers voordoen",
"message-impersonate_description": "Toestemming om andere gebruikers na te bootsen met behulp van een berichtalias",
- "message_counter_one": "{{count}} bericht",
- "message_counter_other": "{{count}} berichten",
+ "message_counter": {
+ "one": "{{count}} bericht",
+ "other": "{{count}} berichten"
+ },
"message_pruned": "bericht gesnoeid",
"messages": "berichten",
"messages_pruned": "berichten gesnoeid",
@@ -4545,8 +4548,10 @@
"meteor_status_connecting": "Verbinden...",
"meteor_status_failed": "Verbinding met de server is mislukt",
"meteor_status_offline": "Offline modus.",
- "meteor_status_reconnect_in_one": "probeer het over een seconde opnieuw...",
- "meteor_status_reconnect_in_other": "probeer het over {{count}} seconden opnieuw...",
+ "meteor_status_reconnect_in": {
+ "one": "probeer het over een seconde opnieuw...",
+ "other": "probeer het over {{count}} seconden opnieuw..."
+ },
"meteor_status_try_now_offline": "Opnieuw verbinden",
"meteor_status_try_now_waiting": "Probeer nu",
"meteor_status_waiting": "Wachten op serververbinding,",
@@ -4877,4 +4882,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} lege kamers worden automatisch verwijderd:
{{rooms}}",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} is niet langer {{role}} door {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} werd ingesteld op {{role}} door {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/nn.i18n.json b/packages/i18n/src/locales/nn.i18n.json
index eb390fcc3624f..d98bb995d3935 100644
--- a/packages/i18n/src/locales/nn.i18n.json
+++ b/packages/i18n/src/locales/nn.i18n.json
@@ -480,8 +480,10 @@
"App_Url_to_Install_From_File": "Installer fra fil",
"App_author_homepage": "forfatter hjemmeside",
"App_cannot_be_enabled_without_add-on": "Appen kan ikke aktiveres uten utvidelse.",
- "App_has_been_disabled_addon_message_one": "Appen {{appNames}} har blitt deaktivert på grunn av et ugyldig tillegg. Et gyldig tilleggsabonnement kreves for å aktivere det på nytt",
- "App_has_been_disabled_addon_message_other": "Appene {{appNames}} har blitt deaktivert på grunn av ugyldige tillegg. Et gyldig tilleggsabonnement kreves for å aktivere dem på nytt",
+ "App_has_been_disabled_addon_message": {
+ "one": "Appen {{appNames}} har blitt deaktivert på grunn av et ugyldig tillegg. Et gyldig tilleggsabonnement kreves for å aktivere det på nytt",
+ "other": "Appene {{appNames}} har blitt deaktivert på grunn av ugyldige tillegg. Et gyldig tilleggsabonnement kreves for å aktivere dem på nytt"
+ },
"App_limit_exceeded": "Appgrensen er overskredet",
"App_limit_reached": "Appgrensen er nådd",
"App_not_enabled": "App ikke aktivert",
@@ -511,8 +513,10 @@
"Apply_and_refresh_all_clients": "Påfør og oppdater alle klienter",
"Apps": "Apps",
"Apps_Cannot_Be_Updated": "Appen kan ikke oppdateres",
- "Apps_Count_Enabled_one": "{{count}} app aktivert",
- "Apps_Count_Enabled_other": "{{count}} apper aktivert",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} app aktivert",
+ "other": "{{count}} apper aktivert"
+ },
"Apps_Count_Enabled_tooltip": "Community-arbeidsområder kan aktivere opptil {{number}} {{context}} apper",
"Apps_Currently_Enabled": "{{enabled}} av {{limit}} {{context}} apper er for øyeblikket aktivert",
"Apps_Engine_Version": "Versjon av Apps Engine",
@@ -897,10 +901,11 @@
"Caller_Id": "Anrops-ID",
"Calling": "Ringer",
"Calls": "Samtaler",
- "Calls_in_queue": "{{calls}} anrop i kø",
- "Calls_in_queue_one": "{{count}} anrop i kø",
- "Calls_in_queue_other": "{{count}} anrop i kø",
- "Calls_in_queue_zero": "Køen er tom",
+ "Calls_in_queue": {
+ "zero": "Køen er tom",
+ "one": "{{count}} anrop i kø",
+ "other": "{{count}} anrop i kø"
+ },
"Cam_off": "Kamera av",
"Cam_on": "Kamera på",
"Camera_access_not_allowed": "Kameratilgang ble ikke tillatt, sjekk nettleserinnstillingene.",
@@ -2214,8 +2219,10 @@
"Flags": "Flags",
"Follow_message": "Følg melding",
"Follow_social_profiles": "Følg våre sosiale profiler, gaffel oss på github og del dine tanker om rocket.chat-appen på vår trello bord.",
- "Follower_one": "Følger",
- "Follower_other": "Følgere",
+ "Follower": {
+ "one": "Følger",
+ "other": "Følgere"
+ },
"Following": "Følgende",
"Font_size": "Skriftstørrelse",
"Fonts": "fonter",
@@ -3911,8 +3918,10 @@
"Privacy_summary": "Personvernsammendrag",
"Private": "Privat",
"Private_Apps": "Private apper",
- "Private_Apps_Count_Enabled_one": "{{count}} privat app aktivert",
- "Private_Apps_Count_Enabled_other": "{{count}} private apper aktivert",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} privat app aktivert",
+ "other": "{{count}} private apper aktivert"
+ },
"Private_Channel": "Privat kanal",
"Private_Channels": "Private kanaler",
"Private_Chats": "Private chatter",
@@ -5719,8 +5728,10 @@
"get-server-info_description": "Tillatelse til å hente serverinformasjon",
"github_HEAD": "HEAD",
"github_no_public_email": "Du har ingen e-post som offentlig e-post i din GitHub-konto",
- "group_mentions_counter_one": "{{count}} gruppeomtale",
- "group_mentions_counter_other": "{{count}} gruppeomtaler",
+ "group_mentions_counter": {
+ "one": "{{count}} gruppeomtale",
+ "other": "{{count}} gruppeomtaler"
+ },
"hours": "timer",
"if_they_are_from": "(hvis de er fra %s)",
"importer_status_done": "Fullført",
@@ -5849,13 +5860,17 @@
"mention-all_description": "Tillatelse til å bruke @all nevne",
"mention-here": "Nevn her",
"mention-here_description": "Tillatelse til å bruke @here mention",
- "mentions_counter_one": "{{count}} omtale",
- "mentions_counter_other": "{{count}} omtaler",
+ "mentions_counter": {
+ "one": "{{count}} omtale",
+ "other": "{{count}} omtaler"
+ },
"message": "melding",
"message-impersonate": "Utgi seg for andre brukere",
"message-impersonate_description": "Tillatelse til å utgi seg for andre brukere ved å bruke meldingsalias",
- "message_counter_one": "{{count}} melding",
- "message_counter_other": "{{count}} meldinger",
+ "message_counter": {
+ "one": "{{count}} melding",
+ "other": "{{count}} meldinger"
+ },
"message_pruned": "melding beskåret",
"messages": "meldinger",
"messages_pruned": "meldinger beskjæres",
@@ -5863,8 +5878,10 @@
"meteor_status_connecting": "Kobler til...",
"meteor_status_failed": "Servertilkoblingen mislyktes",
"meteor_status_offline": "Frakoblet modus.",
- "meteor_status_reconnect_in_one": "Prøver å koble til igjen om 1 sekund",
- "meteor_status_reconnect_in_other": "prøver igjen om {{count}} sekunder...",
+ "meteor_status_reconnect_in": {
+ "one": "Prøver å koble til igjen om 1 sekund",
+ "other": "prøver igjen om {{count}} sekunder..."
+ },
"meteor_status_try_again_later": "Prøv igjen senere eller be arbeidsområdeadministratoren din om hjelp",
"meteor_status_try_now_offline": "Koble til igjen",
"meteor_status_try_now_waiting": "Prøv nå",
@@ -6034,10 +6051,14 @@
"subscription.callout.activeUsers": "seter",
"subscription.callout.allPremiumCapabilitiesDisabled": "Alle premium-funksjoner er deaktivert",
"subscription.callout.capabilitiesDisabled": "Funksjoner deaktivert",
- "subscription.callout.description.limitsExceeded_one": "Arbeidsområdet ditt overskred lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsExceeded_other": "Arbeidsområdet ditt overskred <1>{{val, list}}1> lisensgrensene. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsReached_one": "Arbeidsområdet ditt nådde lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
- "subscription.callout.description.limitsReached_other": "Arbeidsområdet ditt nådde lisensgrensene <1>{{val, list}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Arbeidsområdet ditt overskred lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "other": "Arbeidsområdet ditt overskred <1>{{val, list}}1> lisensgrensene. <3>Administrer abonnementet ditt3> for å øke grensene."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Arbeidsområdet ditt nådde lisensgrensen <1>{{val}}1>. <3>Administrer abonnementet ditt3> for å øke grensene.",
+ "other": "Arbeidsområdet ditt nådde lisensgrensene <1>{{val, list}}1>. <3>Administrer abonnementet ditt3> for å øke grensene."
+ },
"subscription.callout.guestUsers": "gjester",
"subscription.callout.marketplaceApps": "installerte markedsplassapper",
"subscription.callout.monthlyActiveContacts": "månedlige aktive kontakter",
@@ -6094,8 +6115,10 @@
"theme-font-body-font-family": "Body Font Family",
"this_app_is_included_with_subscription": "Denne appen er inkludert i {{bundleName}}-planer",
"thread_message": "trådmelding",
- "threads_counter_one": "{{count}} ulest trådmelding",
- "threads_counter_other": "{{count}} uleste trådmeldinger",
+ "threads_counter": {
+ "one": "{{count}} ulest trådmelding",
+ "other": "{{count}} uleste trådmeldinger"
+ },
"to_see_more_details_on_how_to_integrate": "for å se flere detaljer om hvordan å integrere.",
"toggle-room-e2e-encryption_description": "Tillatelse til å veksle e2e-krypteringsrom",
"totp-invalid": "Kode eller passord er ugyldig",
@@ -6106,8 +6129,10 @@
"unarchive-room_description": "Tillatelse til å unarchive kanaler",
"unauthorized": "Ikke autorisert",
"unblock-livechat-contact": "Fjern blokkering av omnikanal kontaktkanal",
- "unread_messages_counter_one": "{{count}} ulest melding",
- "unread_messages_counter_other": "{{count}} uleste meldinger",
+ "unread_messages_counter": {
+ "one": "{{count}} ulest melding",
+ "other": "{{count}} uleste meldinger"
+ },
"update-livechat-contact": "Oppdater omnikanalkontakter",
"used_limit": "{{used, number}} / {{limit, number}}",
"used_limit_infinite": "{{used, number}} / ∞",
@@ -6178,10 +6203,14 @@
"__count__conversations__period__": "{{count}} samtaler, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} tomme rom vil bli fjernet automatisk.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomme rom vil bli fjernet automatisk:
{{rooms}}.",
- "__count__follower_one": "+{{count}} følger",
- "__count__follower_other": "+{{count}} følgere",
- "__count__message_pruned_one": "{{count}} melding beskjært",
- "__count__message_pruned_other": "{{count}} meldinger beskjært",
+ "__count__follower": {
+ "one": "+{{count}} følger",
+ "other": "+{{count}} følgere"
+ },
+ "__count__message_pruned": {
+ "one": "{{count}} melding beskjært",
+ "other": "{{count}} meldinger beskjært"
+ },
"__count__messages_selected": "{{count}} meldinger er valgt",
"__count__replies": "{{count}} svar",
"__count__replies__date__": "{{count}} svar, {{date}}",
@@ -6200,4 +6229,4 @@
"__usernames__joined": "{{usernames}} ble med",
"__usersCount__joined": "{{count}} ble med",
"__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/pl.i18n.json b/packages/i18n/src/locales/pl.i18n.json
index d1ad3f06573f3..d84fbc9078bd1 100644
--- a/packages/i18n/src/locales/pl.i18n.json
+++ b/packages/i18n/src/locales/pl.i18n.json
@@ -758,10 +758,13 @@
"Caller_Id": "ID dzwoniącego",
"Calling": "Dzwoni",
"Calls": "Połączenia",
- "Calls_in_queue": "Połączeń w kolejce: {{calls}}",
- "Calls_in_queue_one": "Połączeń w kolejce: {{count}}",
- "Calls_in_queue_other": "{{count}} połączeń w kolejce",
- "Calls_in_queue_zero": "Kolejka jest pusta",
+ "Calls_in_queue": {
+ "zero": "Kolejka jest pusta",
+ "one": "Połączeń w kolejce: {{count}}",
+ "few": "{{count}} połączenia w kolejce",
+ "many": "{{count}} połączeń w kolejce",
+ "other": "{{count}} połączeń w kolejce"
+ },
"Cam_off": "Kamera wyłączona",
"Cam_on": "Kamera włączona",
"Cancel": "Anuluj",
@@ -4973,10 +4976,12 @@
"message": "wiadomość",
"message-impersonate": "Podszywanie się pod innych użytkowników",
"message-impersonate_description": "Uprawnienie do podszywania się pod innych użytkowników przy użyciu aliasu wiadomości",
- "message_counter_one": "{{count}} wiadomość",
- "message_counter_other": "{{count}} wiadomości",
- "message_counter_many": "{{count}} wiadomości",
- "message_counter_few": "{{count}} wiadomości",
+ "message_counter": {
+ "one": "{{count}} wiadomość",
+ "few": "{{count}} wiadomości",
+ "many": "{{count}} wiadomości",
+ "other": "{{count}} wiadomości"
+ },
"message_pruned": "wiadomość przycięta",
"messages": "Wiadomości",
"messages_pruned": "wiadomości zostały przycięte",
@@ -4984,10 +4989,12 @@
"meteor_status_connecting": "Łączenie...",
"meteor_status_failed": "Serwer nie mógł się połączyć",
"meteor_status_offline": "Tryb offline.",
- "meteor_status_reconnect_in_one": "spróbuj jeszcze raz za chwilę...",
- "meteor_status_reconnect_in_other": "spróbuj jeszcze raz za {{count}} sekund...",
- "meteor_status_reconnect_in_many": "spróbuj jeszcze raz za {{count}} sekund...",
- "meteor_status_reconnect_in_few": "spróbuj jeszcze raz za {{count}} sekund...",
+ "meteor_status_reconnect_in": {
+ "one": "spróbuj jeszcze raz za chwilę...",
+ "few": "spróbuj jeszcze raz za {{count}} sekund...",
+ "many": "spróbuj jeszcze raz za {{count}} sekund...",
+ "other": "spróbuj jeszcze raz za {{count}} sekund..."
+ },
"meteor_status_try_now_offline": "Połącz ponownie",
"meteor_status_try_now_waiting": "Spróbuj teraz",
"meteor_status_waiting": "Poczekaj na połączenie serwera",
@@ -5405,10 +5412,12 @@
"__count__conversations__period__": "{{count}} rozmowy, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "Liczba pokojów do automatycznego usunięcia: {{count}}.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "Puste pokoje ({{count}}) zostaną automatycznie usunięte:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} wiadomość(i) usuniętych",
- "__count__message_pruned_other": "{{count}} wiadomość(i) usuniętych",
- "__count__message_pruned_many": "{{count}} wiadomość(i) usuniętych",
- "__count__message_pruned_few": "{{count}} wiadomość(i) usuniętych",
+ "__count__message_pruned": {
+ "one": "{{count}} wiadomość(i) usuniętych",
+ "few": "{{count}} wiadomość(i) usuniętych",
+ "many": "{{count}} wiadomość(i) usuniętych",
+ "other": "{{count}} wiadomość(i) usuniętych"
+ },
"__count__tags__and__count__conversations__period__": "{{count}} tagów i {{conversations}} konwersacji, {{period}}",
"__count__without__assignee__": "{{count}} bez przypisania",
"__count__without__department__": "{{count}} bez działu",
@@ -5421,4 +5430,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "Użytkownik {{username}} nie ma już roli {{role}}; zmienił to użytkownik {{user_by}}",
"__username__was_set__role__by__user_by_": "Użytkownik {{username}} otrzymał rolę {{role}} od użytkownika {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} ludzi zostanie zostanie zaproszonych"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json
index 7ace9d7c28f27..43822ce7cfb49 100644
--- a/packages/i18n/src/locales/pt-BR.i18n.json
+++ b/packages/i18n/src/locales/pt-BR.i18n.json
@@ -485,9 +485,11 @@
"App_Url_to_Install_From_File": "Instalar a partir de arquivo",
"App_author_homepage": "Página inicial do autor",
"App_cannot_be_enabled_without_add-on": "O aplicativo não pode ser ativado sem o complemento.",
- "App_has_been_disabled_addon_message_one": "O aplicativo {{appNames}} foi desativado devido a um complemento inválido. É necessário ter uma assinatura de complemento válida para reativá-lo",
- "App_has_been_disabled_addon_message_other": "Os aplicativos {{appNames}} foram desativados devido a complementos inválidos. É necessário ter uma assinatura de complemento válida para reativá-los",
- "App_has_been_disabled_addon_message_many": "Os aplicativos {{appNames}} foram desativados devido a complementos inválidos. É necessário ter uma assinatura de complemento válida para reativá-los",
+ "App_has_been_disabled_addon_message": {
+ "one": "O aplicativo {{appNames}} foi desativado devido a um complemento inválido. É necessário ter uma assinatura de complemento válida para reativá-lo",
+ "many": "Os aplicativos {{appNames}} foram desativados devido a complementos inválidos. É necessário ter uma assinatura de complemento válida para reativá-los",
+ "other": "Os aplicativos {{appNames}} foram desativados devido a complementos inválidos. É necessário ter uma assinatura de complemento válida para reativá-los"
+ },
"App_id": "ID do aplicativo",
"App_limit_exceeded": "Limite do aplicativo excedido",
"App_limit_reached": "Limite do aplicativo atingido",
@@ -521,9 +523,11 @@
"Apply_filters": "Aplicar filtros",
"Apps": "Aplicativos",
"Apps_Cannot_Be_Updated": "O aplicativo não pode ser atualizado",
- "Apps_Count_Enabled_one": "{{count}} aplicativo ativado",
- "Apps_Count_Enabled_other": "{{count}} aplicativos habilitados",
- "Apps_Count_Enabled_many": "{{count}} aplicativos habilitados",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} aplicativo ativado",
+ "many": "{{count}} aplicativos habilitados",
+ "other": "{{count}} aplicativos habilitados"
+ },
"Apps_Count_Enabled_tooltip": "Os workspaces comunitários podem permitir até {{number}} {{context}} aplicativos",
"Apps_Currently_Enabled": "{{enabled}} de {{limit}} aplicativos {{context}} atualmente habilitados",
"Apps_Engine_Version": "Versão do mecanismo de aplicativos",
@@ -914,10 +918,12 @@
"Calling": "Chamando",
"Calling__roomName__": "Chamando {{roomName}}",
"Calls": "Chamadas",
- "Calls_in_queue": "{{calls}} chamadas na fila",
- "Calls_in_queue_one": "{{count}} chamadas na fila",
- "Calls_in_queue_other": "{{count}} chamadas na fila",
- "Calls_in_queue_zero": "A fila está Vazia",
+ "Calls_in_queue": {
+ "zero": "A fila está vazia",
+ "one": "{{count}} chamada na fila",
+ "many": "{{count}} chamadas na fila",
+ "other": "{{count}} chamadas na fila"
+ },
"Cam_off": "Câmera desligada",
"Cam_on": "Câmera ligada",
"Camera_access_not_allowed": "O acesso à câmera não foi permitido, verifique as configurações do navegador.",
@@ -2242,9 +2248,11 @@
"Flags": "Sinalizações",
"Follow_message": "Seguir mensagem",
"Follow_social_profiles": "Siga-nos nas redes sociais, encontre-nos no github e compartilhe suas ideias sobre o app rocket.chat em nosso painel do Trello.",
- "Follower_one": "Seguidor",
- "Follower_other": "Seguidores",
- "Follower_many": "Seguidores",
+ "Follower": {
+ "one": "Seguidor",
+ "many": "Seguidores",
+ "other": "Seguidores"
+ },
"Following": "Seguindo",
"Font_size": "Tamanho da fonte",
"Fonts": "Fontes",
@@ -3998,9 +4006,11 @@
"Privacy_summary": "Resumo da privacidade",
"Private": "Privado",
"Private_Apps": "Aplicativos privados",
- "Private_Apps_Count_Enabled_one": "{{count}} aplicativo privado ativado",
- "Private_Apps_Count_Enabled_other": "{{count}} aplicativos privados ativados",
- "Private_Apps_Count_Enabled_many": "{{count}} aplicativos privados ativados",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} aplicativo privado ativado",
+ "many": "{{count}} aplicativos privados ativados",
+ "other": "{{count}} aplicativos privados ativados"
+ },
"Private_Channel": "Canal privado",
"Private_Channels": "Canais privados",
"Private_Chats": "Conversas privadas",
@@ -6167,9 +6177,11 @@
"get-server-info_description": "Permissão para obter informações do servidor",
"github_HEAD": "HEAD",
"github_no_public_email": "Você não possui um e-mail público em sua conta do GitHub",
- "group_mentions_counter_one": "{{count}} menção do grupo",
- "group_mentions_counter_other": "{{count}} menções de grupo",
- "group_mentions_counter_many": "{{count}} menções de grupo",
+ "group_mentions_counter": {
+ "one": "{{count}} menção do grupo",
+ "many": "{{count}} menções de grupo",
+ "other": "{{count}} menções de grupo"
+ },
"hours": "horas",
"if_they_are_from": "(se forem de %s)",
"importer_status_done": "Concluído com sucesso",
@@ -6298,15 +6310,19 @@
"mention-all_description": "Permissão para usar a menção @all",
"mention-here": "Mencionar aqui",
"mention-here_description": "Permissão para usar a menção @here",
- "mentions_counter_one": "{{count}} menção",
- "mentions_counter_other": "{{count}} menções",
- "mentions_counter_many": "{{count}} menções",
+ "mentions_counter": {
+ "one": "{{count}} menção",
+ "many": "{{count}} menções",
+ "other": "{{count}} menções"
+ },
"message": "mensagem",
"message-impersonate": "Personificar outros usuários",
"message-impersonate_description": "Permissão para personificar outros usuários usando alias",
- "message_counter_one": "{{count}} mensagem",
- "message_counter_other": "{{count}} mensagens",
- "message_counter_many": "{{count}} mensagens",
+ "message_counter": {
+ "one": "{{count}} mensagem",
+ "many": "{{count}} mensagens",
+ "other": "{{count}} mensagens"
+ },
"message_pruned": "mensagem removida",
"messages": "mensagens",
"messages_pruned": "mensagens removidas",
@@ -6314,9 +6330,11 @@
"meteor_status_connecting": "Conectando...",
"meteor_status_failed": "A conexão com o servidor falhou",
"meteor_status_offline": "Modo offline.",
- "meteor_status_reconnect_in_one": "tentando novamente em um segundo...",
- "meteor_status_reconnect_in_other": "tentando novamente em {{count}} segundos...",
- "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...",
+ "meteor_status_reconnect_in": {
+ "one": "tentando novamente em um segundo...",
+ "many": "tentando novamente em {{count}} segundos...",
+ "other": "tentando novamente em {{count}} segundos..."
+ },
"meteor_status_try_again_later": "Tente novamente mais tarde ou peça ajuda ao administrador do seu workspace",
"meteor_status_try_now_offline": "Conectar novamente",
"meteor_status_try_now_waiting": "Tentar agora",
@@ -6591,12 +6609,16 @@
"subscription.callout.activeUsers": "assentos",
"subscription.callout.allPremiumCapabilitiesDisabled": "Todos os recursos premium desativados",
"subscription.callout.capabilitiesDisabled": "Recursos desativados",
- "subscription.callout.description.limitsExceeded_one": "Seu espaço de trabalho excedeu o <1>{{val}}1> limite de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
- "subscription.callout.description.limitsExceeded_other": "Seu espaço de trabalho excedeu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
- "subscription.callout.description.limitsExceeded_many": "Seu espaço de trabalho excedeu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
- "subscription.callout.description.limitsReached_one": "Seu espaço de trabalho atingiu o <1>{{val}}1> limite de licenças. <3>Gerencie sua assinatura3> para aumentar os limites.",
- "subscription.callout.description.limitsReached_other": "Seu espaço de trabalho atingiu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
- "subscription.callout.description.limitsReached_many": "Seu espaço de trabalho atingiu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Seu espaço de trabalho excedeu o <1>{{val}}1> limite de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
+ "many": "Seu espaço de trabalho excedeu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
+ "other": "Seu espaço de trabalho excedeu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Seu espaço de trabalho atingiu o <1>{{val}}1> limite de licenças. <3>Gerencie sua assinatura3> para aumentar os limites.",
+ "many": "Seu espaço de trabalho atingiu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites.",
+ "other": "Seu espaço de trabalho atingiu os <1>{{val, list}}1> limites de licença. <3>Gerencie sua assinatura3> para aumentar os limites."
+ },
"subscription.callout.guestUsers": "convidados",
"subscription.callout.marketplaceApps": "aplicativos do marketplace instalados",
"subscription.callout.monthlyActiveContacts": "contatos ativos mensais",
@@ -6667,9 +6689,11 @@
"this_app_is_included_with_subscription": "Este aplicativo está incluído nos planos {{bundleName}} ",
"thread": "tópicos",
"thread_message": "mensagem de thread",
- "threads_counter_one": "{{count}} mensagem encadeada não lida",
- "threads_counter_other": "{{count}} mensagens encadeadas não lidas",
- "threads_counter_many": "{{count}} mensagens encadeadas não lidas",
+ "threads_counter": {
+ "one": "{{count}} mensagem encadeada não lida",
+ "many": "{{count}} mensagens encadeadas não lidas",
+ "other": "{{count}} mensagens encadeadas não lidas"
+ },
"to_see_more_details_on_how_to_integrate": "para ver mais detalhes sobre como integrar.",
"toggle-room-e2e-encryption": "Alternar criptografia de ponta a ponta da sala",
"toggle-room-e2e-encryption_description": "Permissão para alternar a criptografia de ponta a ponta da sala",
@@ -6687,9 +6711,11 @@
"unauthorized": "Não autorizado",
"unblock-livechat-contact": "Desbloquear canal do contato do omnichannel",
"unpinning-not-allowed": "Não é permitido desafixar",
- "unread_messages_counter_one": "{{count}} mensagem não lida",
- "unread_messages_counter_other": "{{count}} mensagens não lidas",
- "unread_messages_counter_many": "{{count}} mensagens não lidas",
+ "unread_messages_counter": {
+ "one": "{{count}} mensagem não lida",
+ "many": "{{count}} mensagens não lidas",
+ "other": "{{count}} mensagens não lidas"
+ },
"update-livechat-contact": "Atualizar contatos do omnichannel",
"used_limit": "{{used, number}} / {{limit, number}}",
"used_limit_infinite": "{{used, number}} / ∞",
@@ -6825,12 +6851,16 @@
"__count__conversations__period__": "{{count}} conversas, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} salas vazias serão removidas automaticamente.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salas vazias serão removidas automaticamente:
{{rooms}}.",
- "__count__follower_one": "+{{count}} seguidores",
- "__count__follower_other": "+{{count}} seguidores",
- "__count__follower_many": "+{{count}} seguidores",
- "__count__message_pruned_one": "{{count}} mensagem apagada",
- "__count__message_pruned_other": "{{count}} mensagens apagadas",
- "__count__message_pruned_many": "{{count}} mensagens apagadas",
+ "__count__follower": {
+ "one": "+{{count}} seguidores",
+ "many": "+{{count}} seguidores",
+ "other": "+{{count}} seguidores"
+ },
+ "__count__message_pruned": {
+ "one": "{{count}} mensagem apagada",
+ "many": "{{count}} mensagens apagadas",
+ "other": "{{count}} mensagens apagadas"
+ },
"__count__messages_selected": "{{count}} mensagens selecionadas",
"__count__replies": "{{count}} respostas",
"__count__replies__date__": "{{count}} respostas, {{date}}",
@@ -6850,4 +6880,4 @@
"__usernames__joined": "{{usernames}} entraram",
"__usersCount__joined": "{{count}} entraram",
"__usersCount__people_will_be_invited": "{{usersCount}} usuários vão ser convidados"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/ru.i18n.json b/packages/i18n/src/locales/ru.i18n.json
index 6d42d29a02c36..780af91b44037 100644
--- a/packages/i18n/src/locales/ru.i18n.json
+++ b/packages/i18n/src/locales/ru.i18n.json
@@ -438,10 +438,12 @@
"Apply": "Подать заявление",
"Apply_and_refresh_all_clients": "Применить",
"Apps": "Приложения",
- "Apps_Count_Enabled_one": "{{count}} приложение включено",
- "Apps_Count_Enabled_other": "{{count}} приложений(-я) включено",
- "Apps_Count_Enabled_many": "{{count}} приложений(-я) включено",
- "Apps_Count_Enabled_few": "{{count}} приложений(-я) включено",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} приложение включено",
+ "few": "{{count}} приложений(-я) включено",
+ "many": "{{count}} приложений(-я) включено",
+ "other": "{{count}} приложений(-я) включено"
+ },
"Apps_Count_Enabled_tooltip": "В рабочих пространствах Community Edition можно использовать до {{number}} {{context}} приложений",
"Apps_Engine_Version": "Версия движка приложений",
"Apps_Essential_Alert": "Это приложение необходимо для следующих событий:",
@@ -765,10 +767,13 @@
"Caller_Id": "ИД вызывающей стороны",
"Calling": "Идет вызов",
"Calls": "Звонки",
- "Calls_in_queue": "Вызовов в очереди: {{calls}}",
- "Calls_in_queue_one": "Вызовов в очереди: {{count}}",
- "Calls_in_queue_other": "{{count}} Звонков в очереди",
- "Calls_in_queue_zero": "Очередь пуста",
+ "Calls_in_queue": {
+ "zero": "Очередь пуста",
+ "one": "Вызовов в очереди: {{count}}",
+ "few": "{{count}} вызова в очереди",
+ "many": "{{count}} вызовов в очереди",
+ "other": "{{count}} Звонков в очереди"
+ },
"Cam_off": "Камера ВЫКЛ",
"Cam_on": "Камера ВКЛ",
"Cancel": "Отмена",
@@ -3055,10 +3060,12 @@
"Privacy_Policy": "Политика конфиденциальности",
"Private": "Закрытый канал",
"Private_Apps": "Приватные приложения",
- "Private_Apps_Count_Enabled_one": "{{count}} приватное приложение включено",
- "Private_Apps_Count_Enabled_other": "{{count}} приватных приложений включено",
- "Private_Apps_Count_Enabled_many": "{{count}} приватных приложений включено",
- "Private_Apps_Count_Enabled_few": "{{count}} приватных приложений включено",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} приватное приложение включено",
+ "few": "{{count}} приватных приложений включено",
+ "many": "{{count}} приватных приложений включено",
+ "other": "{{count}} приватных приложений включено"
+ },
"Private_Channel": "Закрытый канал",
"Private_Channels": "Закрытый канал",
"Private_Chats": "Приватные чаты",
@@ -4722,10 +4729,12 @@
"message": "сообщение",
"message-impersonate": "Представление другим пользователем",
"message-impersonate_description": "Разрешение выдавать себя за других пользователей, используя псевдоним сообщения",
- "message_counter_one": "{{count}} сообщение",
- "message_counter_other": "{{count}} сообщения",
- "message_counter_many": "{{count}} сообщения",
- "message_counter_few": "{{count}} сообщения",
+ "message_counter": {
+ "one": "{{count}} сообщение",
+ "few": "{{count}} сообщения",
+ "many": "{{count}} сообщения",
+ "other": "{{count}} сообщения"
+ },
"message_pruned": "сообщение удалено",
"messages": "Сообщения",
"messages_pruned": "сообщения удалены",
@@ -4733,10 +4742,12 @@
"meteor_status_connecting": "Подключение ...",
"meteor_status_failed": "Соединение с сервером не удалось",
"meteor_status_offline": "Автономный режим.",
- "meteor_status_reconnect_in_one": "пытается снова в одну секунду ...",
- "meteor_status_reconnect_in_other": "пытается снова через {{count}} секунд ...",
- "meteor_status_reconnect_in_many": "пытается снова через {{count}} секунд ...",
- "meteor_status_reconnect_in_few": "пытается снова через {{count}} секунд ...",
+ "meteor_status_reconnect_in": {
+ "one": "пытается снова в одну секунду ...",
+ "few": "пытается снова через {{count}} секунд ...",
+ "many": "пытается снова через {{count}} секунд ...",
+ "other": "пытается снова через {{count}} секунд ..."
+ },
"meteor_status_try_now_offline": "Подключите снова",
"meteor_status_try_now_waiting": "Попробуйте сейчас",
"meteor_status_waiting": "В ожидании соединения с сервером",
@@ -5085,11 +5096,13 @@
"your_message_optional": "ваше сообщение (опционально)",
"__count__empty_rooms_will_be_removed_automatically": "{{count}}пустые комнаты будут удалены автоматически.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} пустых чатов будет удалено автоматически:
{{rooms}}.",
- "__count__message_pruned_one": "{{count}} сообщение удалено",
- "__count__message_pruned_other": "{{count}} сообщений удалено",
- "__count__message_pruned_many": "{{count}} сообщений удалено",
- "__count__message_pruned_few": "{{count}} сообщений удалено",
+ "__count__message_pruned": {
+ "one": "{{count}} сообщение удалено",
+ "few": "{{count}} сообщений удалено",
+ "many": "{{count}} сообщений удалено",
+ "other": "{{count}} сообщений удалено"
+ },
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} больше не {{role}} по решению {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} был установлен {{role}} по решению {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} человек будет приглашено"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json
index 4f766d77c73ac..1393a3118b033 100644
--- a/packages/i18n/src/locales/sv.i18n.json
+++ b/packages/i18n/src/locales/sv.i18n.json
@@ -486,8 +486,10 @@
"App_Url_to_Install_From_File": "Installera från fil",
"App_author_homepage": "författarens hemsida",
"App_cannot_be_enabled_without_add-on": "Appen kan inte aktiveras utan tillägg.",
- "App_has_been_disabled_addon_message_one": "Appen {{appNames}} har inaktiverats på grund av ett ogiltigt tillägg. En giltig tilläggsprenumeration krävs för att återaktivera den",
- "App_has_been_disabled_addon_message_other": "Apparna {{appNames}} har inaktiverats på grund av ogiltiga tillägg. En giltig tilläggsprenumeration krävs för att återaktivera dem",
+ "App_has_been_disabled_addon_message": {
+ "one": "Appen {{appNames}} har inaktiverats på grund av ett ogiltigt tillägg. En giltig tilläggsprenumeration krävs för att återaktivera den",
+ "other": "Apparna {{appNames}} har inaktiverats på grund av ogiltiga tillägg. En giltig tilläggsprenumeration krävs för att återaktivera dem"
+ },
"App_id": "App-ID",
"App_limit_exceeded": "App-gränsen har överskridits",
"App_limit_reached": "App-gränsen har nåtts",
@@ -521,8 +523,10 @@
"Apply_filters": "Tillämpa filter",
"Apps": "Appar",
"Apps_Cannot_Be_Updated": "Appen kan inte uppdateras",
- "Apps_Count_Enabled_one": "{{count}} app aktiverad",
- "Apps_Count_Enabled_other": "{{count}} appar aktiverade",
+ "Apps_Count_Enabled": {
+ "one": "{{count}} app aktiverad",
+ "other": "{{count}} appar aktiverade"
+ },
"Apps_Count_Enabled_tooltip": "Arbetsytorna i Community Edition kan aktivera upp till {{number}} {{context}} appar",
"Apps_Currently_Enabled": "{{enabled}} av {{limit}} {{context}}-appar är för närvarande aktiverade.",
"Apps_Engine_Version": "App Engine-version",
@@ -913,10 +917,11 @@
"Calling": "Ringer upp",
"Calling__roomName__": "Uppringning {{roomName}}",
"Calls": "Samtal",
- "Calls_in_queue": "{{calls}} samtal i kö",
- "Calls_in_queue_one": "{{count}} samtal i kö",
- "Calls_in_queue_other": "{{count}} samtal i kö",
- "Calls_in_queue_zero": "Kön är tom",
+ "Calls_in_queue": {
+ "zero": "Kön är tom",
+ "one": "{{count}} samtal i kö",
+ "other": "{{count}} samtal i kö"
+ },
"Cam_off": "Kamera av",
"Cam_on": "Kamera på",
"Camera_access_not_allowed": "Kameraåtkomst är inte tillåten, kontrollera inställningarna i din webbläsare.",
@@ -2251,8 +2256,10 @@
"Flags": "Flaggor",
"Follow_message": "Följ meddelandet",
"Follow_social_profiles": "Följ våra sociala mediakonton, forka oss på github och dela med dig av dina tankar om rocket.chatt på vår Trello.",
- "Follower_one": "Följare",
- "Follower_other": "Följare",
+ "Follower": {
+ "one": "Följare",
+ "other": "Följare"
+ },
"Following": "Följer",
"Font_size": "Teckenstorlek",
"Fonts": "Typsnitt",
@@ -4020,8 +4027,10 @@
"Privacy_summary": "Integritetsöversikt",
"Private": "Privat",
"Private_Apps": "Privata appar",
- "Private_Apps_Count_Enabled_one": "{{count}} privat app aktiverad",
- "Private_Apps_Count_Enabled_other": "{{count}} privata appar aktiverade",
+ "Private_Apps_Count_Enabled": {
+ "one": "{{count}} privat app aktiverad",
+ "other": "{{count}} privata appar aktiverade"
+ },
"Private_Channel": "Privat kanal",
"Private_Channels": "Privata kanaler",
"Private_Chats": "Privata chattar",
@@ -6193,8 +6202,10 @@
"get-server-info_description": "Behörighet att hämta serverinformation",
"github_HEAD": "HEAD",
"github_no_public_email": "Du har inte någon publik epostadress i ditt GitHub-konto",
- "group_mentions_counter_one": "{{count}} gruppomnämnande",
- "group_mentions_counter_other": "{{count}} gruppomnämnanden",
+ "group_mentions_counter": {
+ "one": "{{count}} gruppomnämnande",
+ "other": "{{count}} gruppomnämnanden"
+ },
"hours": "timmar",
"if_they_are_from": "(om de är från %s)",
"importer_status_done": "Slutfört",
@@ -6322,13 +6333,17 @@
"mention-all_description": "Tillstånd att använda @all ",
"mention-here": "Nämna här",
"mention-here_description": "Tillstånd att använda @here ",
- "mentions_counter_one": "{{count}} omnämnande",
- "mentions_counter_other": "{{count}} omnämnanden",
+ "mentions_counter": {
+ "one": "{{count}} omnämnande",
+ "other": "{{count}} omnämnanden"
+ },
"message": "meddelande",
"message-impersonate": "Utge sig för att vara andra användare",
"message-impersonate_description": "Behörighet att utge sig för att vara andra med hjälp av alias för meddelanden",
- "message_counter_one": "{{count}} meddelande",
- "message_counter_other": "{{count}} meddelanden",
+ "message_counter": {
+ "one": "{{count}} meddelande",
+ "other": "{{count}} meddelanden"
+ },
"message_pruned": "meddelande beskuret",
"messages": "Meddelanden",
"messages_pruned": "meddelanden beskurna",
@@ -6336,8 +6351,10 @@
"meteor_status_connecting": "Ansluter...",
"meteor_status_failed": "Det gick inte att ansluta till servern",
"meteor_status_offline": "Offlineläge.",
- "meteor_status_reconnect_in_one": "Försöker återansluta om {{count}} sekunder",
- "meteor_status_reconnect_in_other": "försöker igen om {{count}} sekunder...",
+ "meteor_status_reconnect_in": {
+ "one": "Försöker återansluta om {{count}} sekunder",
+ "other": "försöker igen om {{count}} sekunder..."
+ },
"meteor_status_try_again_later": "Försök igen senare eller be din administratör för arbetsytan om hjälp",
"meteor_status_try_now_offline": "Anslut igen",
"meteor_status_try_now_waiting": "Försök nu",
@@ -6613,10 +6630,14 @@
"subscription.callout.activeUsers": "platser",
"subscription.callout.allPremiumCapabilitiesDisabled": "Alla premiumfunktioner inaktiverade",
"subscription.callout.capabilitiesDisabled": "Funktioner inaktiverade",
- "subscription.callout.description.limitsExceeded_one": "Din arbetsyta har överskridit <1>{{val}}1> licensgränsen. <3>Hantera din prenumeration3> för att öka gränserna.",
- "subscription.callout.description.limitsExceeded_other": "Din arbetsyta överskred licensgränserna <1>{{val, list}}1> licensgränserna. <3>Hantera din prenumeration3> för att öka gränserna.",
- "subscription.callout.description.limitsReached_one": "Din arbetsyta har nått <1>{{val}}1> licensgräns. <3>Hantera din prenumeration3> för att öka gränserna.",
- "subscription.callout.description.limitsReached_other": "Din arbetsyta har nått <1>{{val, list}}1> licensgränser. <3>Hantera din prenumeration3> för att öka gränserna.",
+ "subscription.callout.description.limitsExceeded": {
+ "one": "Din arbetsyta har överskridit <1>{{val}}1> licensgränsen. <3>Hantera din prenumeration3> för att öka gränserna.",
+ "other": "Din arbetsyta överskred licensgränserna <1>{{val, list}}1> licensgränserna. <3>Hantera din prenumeration3> för att öka gränserna."
+ },
+ "subscription.callout.description.limitsReached": {
+ "one": "Din arbetsyta har nått <1>{{val}}1> licensgräns. <3>Hantera din prenumeration3> för att öka gränserna.",
+ "other": "Din arbetsyta har nått <1>{{val, list}}1> licensgränser. <3>Hantera din prenumeration3> för att öka gränserna."
+ },
"subscription.callout.guestUsers": "gäster",
"subscription.callout.marketplaceApps": "installerade marknadsplatsappar",
"subscription.callout.monthlyActiveContacts": "aktiva kontakter varje månad",
@@ -6689,8 +6710,10 @@
"thread_message": "trådmeddelande",
"thread_messages": "Trådade meddelanden",
"thread_message_preview": "förhandsgranskning av trådmeddelande",
- "threads_counter_one": "{{count}} oläst trådat meddelande",
- "threads_counter_other": "{{count}} olästa trådade meddelanden",
+ "threads_counter": {
+ "one": "{{count}} oläst trådat meddelande",
+ "other": "{{count}} olästa trådade meddelanden"
+ },
"to_see_more_details_on_how_to_integrate": "för att se mer information om hur man kan integrera.",
"toggle-room-e2e-encryption": "Växla Rummets E2E-kryptering",
"toggle-room-e2e-encryption_description": "Behörighet att växla rummets E2E-kryptering",
@@ -6708,8 +6731,10 @@
"unauthorized": "ej tillåtet",
"unblock-livechat-contact": "Avblockera kontaktkanalen Omnichannel",
"unpinning-not-allowed": "Det är inte tillåtet att lossa",
- "unread_messages_counter_one": "{{count}} oläst meddelande",
- "unread_messages_counter_other": "{{count}} olästa meddelanden",
+ "unread_messages_counter": {
+ "one": "{{count}} oläst meddelande",
+ "other": "{{count}} olästa meddelanden"
+ },
"update-livechat-contact": "Uppdatera Omnichannel-kontakter",
"used_limit": "{{used, number}} / {{limit, number}}",
"used_limit_infinite": "{{used, number}} / ∞",
@@ -6845,12 +6870,18 @@
"__count__conversations__period__": "{{count}} samtal, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} tomma rum tas bort automatiskt.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomma rum tas bort automatiskt:
{{rooms}}.",
- "__count__file_pruned_one": "{{count}} fil gallrad",
- "__count__file_pruned_other": "{{count}} filer gallrade",
- "__count__follower_one": "+{{count}} följare",
- "__count__follower_other": "+{{count}} följare",
- "__count__message_pruned_one": "{{count}} meddelande rensat",
- "__count__message_pruned_other": "{{count}} meddelanden rensade",
+ "__count__file_pruned": {
+ "one": "{{count}} fil gallrad",
+ "other": "{{count}} filer gallrade"
+ },
+ "__count__follower": {
+ "one": "+{{count}} följare",
+ "other": "+{{count}} följare"
+ },
+ "__count__message_pruned": {
+ "one": "{{count}} meddelande rensat",
+ "other": "{{count}} meddelanden rensade"
+ },
"__count__messages_selected": "{{count}} valda meddelanden",
"__count__replies": "{{count}} svar",
"__count__replies__date__": "{{count}} svar, {{date}}",
@@ -6870,4 +6901,4 @@
"__usernames__joined": "{{usernames}} anslöt",
"__usersCount__joined": "{{count}} anslöt",
"__usersCount__people_will_be_invited": "{{usersCount}} personer bjuds in"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/tr.i18n.json b/packages/i18n/src/locales/tr.i18n.json
index aaaf250b345f3..a549db75e32c1 100644
--- a/packages/i18n/src/locales/tr.i18n.json
+++ b/packages/i18n/src/locales/tr.i18n.json
@@ -3078,16 +3078,20 @@
"mention-here": "Burada Bahset",
"mention-here_description": "@here bahsetmesini kullanma izni",
"message": "ileti",
- "message_counter_one": "{{count}} ileti",
- "message_counter_other": "{{count}} ileti",
+ "message_counter": {
+ "one": "{{count}} ileti",
+ "other": "{{count}} ileti"
+ },
"messages": "iletiler",
"messages_pruned": "iletiler budandı",
"meteor_status_connected": "Bağlantı sağlandı",
"meteor_status_connecting": "Bağlanıyor...",
"meteor_status_failed": "Sunucu ile bağlantı başarısız",
"meteor_status_offline": "Çevrimdışı mod.",
- "meteor_status_reconnect_in_one": "tekrar deneniyor...",
- "meteor_status_reconnect_in_other": "{{count}} saniye içinde tekrar denenecek...",
+ "meteor_status_reconnect_in": {
+ "one": "tekrar deneniyor...",
+ "other": "{{count}} saniye içinde tekrar denenecek..."
+ },
"meteor_status_try_now_offline": "Tekrar bağlan!",
"meteor_status_try_now_waiting": "Şimdi tekrar dene!",
"meteor_status_waiting": "Sunucu bağlantısı bekleniyor,",
@@ -3272,4 +3276,4 @@
"your_message_optional": "iletiniz (isteğe bağlı)",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} adlı kullanıcı {{user_by}} tarafından {{role}} rolünden çıkarıldı.",
"__username__was_set__role__by__user_by_": "{{username}} adlı kullanıcı {{user_by}} tarafından {{role}} rolüne atandı."
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/uk.i18n.json b/packages/i18n/src/locales/uk.i18n.json
index e6873e6340819..d016004e3669c 100644
--- a/packages/i18n/src/locales/uk.i18n.json
+++ b/packages/i18n/src/locales/uk.i18n.json
@@ -3182,10 +3182,12 @@
"mention-all_description": "Дозвіл на використання @all згадки",
"mention-here": "Згадаю тут",
"mention-here_description": "Дозвіл на використання @here згадати",
- "message_counter_one": "{{count}} повідомлення",
- "message_counter_other": "{{count}} повідомлень",
- "message_counter_many": "{{count}} повідомлень",
- "message_counter_few": "{{count}} повідомлень",
+ "message_counter": {
+ "one": "{{count}} повідомлення",
+ "few": "{{count}} повідомлень",
+ "many": "{{count}} повідомлень",
+ "other": "{{count}} повідомлень"
+ },
"messages": "повідомлення",
"messages_pruned": "повідомлення обрізані",
"meteor_status_try_now_waiting": "Спробуй зараз",
@@ -3359,4 +3361,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} порожні кімнати будуть видалені автоматично:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} більше не {{role}}, за рішенням {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} був встановлений {{role}} за рішенням {{user_by}}"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/scripts/build.mjs b/packages/i18n/src/scripts/build.mjs
index fbfff753ec868..5609adec3dad4 100644
--- a/packages/i18n/src/scripts/build.mjs
+++ b/packages/i18n/src/scripts/build.mjs
@@ -24,6 +24,7 @@ export async function build() {
sprintf: 0,
i18nextComponentsArray: 0,
nullValues: 0,
+ nestedPlurals: 0,
};
// Uncomment these lines for verbose output
@@ -41,6 +42,7 @@ export async function build() {
console.log(`Number of keys with (explicit) null values: ${countsByNormalization.nullValues} keys`);
console.log(`Number of keys using sprintf: ${countsByNormalization.sprintf} keys`);
console.log(`Number of keys using i18next components array (): ${countsByNormalization.i18nextComponentsArray} keys`);
+ console.log(`Number of keys with nested plurals: ${countsByNormalization.nestedPlurals} keys`);
// purge dist directory
await rm(distDirectory, { recursive: true, force: true });
@@ -48,6 +50,12 @@ export async function build() {
// write the files
+ // ./resources/*.i18n.json
+ await mkdir(join(distDirectory, 'resources'), { recursive: true });
+ for await (const resource of resources) {
+ await writeFile(join(distDirectory, 'resources', `${resource.language}.i18n.json`), JSON.stringify(resource.content, null, 2));
+ }
+
// ./resources
const allResources = resources.reduce((acc, resource) => {
return {
diff --git a/packages/i18n/src/scripts/normalize.mjs b/packages/i18n/src/scripts/normalize.mjs
index 2765ed7d6683a..e008b0aae329b 100644
--- a/packages/i18n/src/scripts/normalize.mjs
+++ b/packages/i18n/src/scripts/normalize.mjs
@@ -57,6 +57,30 @@ const replaceI18nextComponentsArrayInterpolations = generator(replaceI18nextComp
const replaceNullValues = generator(replaceNullValuesInterpolation, 'nullValues');
+const replaceNestedPlurals = (dictionary, language, cb) => {
+ const entries = [];
+ const plurals = ['zero', 'one', 'two', 'few', 'many', 'other'];
+
+ for (const [key, translation] of Object.entries(dictionary).toSorted(([a], [b]) => a.localeCompare(b))) {
+ if (typeof translation === 'string') {
+ entries.push([key, translation]);
+ } else if (typeof translation === 'object' && translation !== null) {
+ const existingKeys = new Set(Object.keys(translation));
+ const exceedingKeys = existingKeys.difference(new Set(plurals));
+ if (exceedingKeys.size > 0) console.error(`Invalid plurals in key "${key}" found: ${Array.from(exceedingKeys).join(', ')}`);
+
+ for (const plural of plurals) {
+ if (!(plural in translation)) continue;
+
+ entries.push([`${key}_${plural}`, translation[plural]]);
+ }
+ cb?.('nestedPlurals', { language, key });
+ }
+ }
+
+ return Object.fromEntries(entries);
+};
+
export const pipe =
(...fns) =>
(y, ...x) =>
@@ -66,6 +90,7 @@ export const pipe =
export const normalizeI18nInterpolations = (dictionary, language, cb) => {
const result = pipe(
+ replaceNestedPlurals,
replaceNullValues,
replaceI18nInterpolations,
replaceI18nextComponentsArrayInterpolations,
diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json
index 1e1eba2fd8ca6..86d206e838099 100644
--- a/packages/i18n/tsconfig.json
+++ b/packages/i18n/tsconfig.json
@@ -1,6 +1,7 @@
{
"extends": "@rocket.chat/tsconfig/base.json",
"compilerOptions": {
+ "target": "es2024",
"rootDirs": ["./src", "./"],
"outDir": "./dist",
"declaration": true,
From 776af0ae53aaf84fa4d7b2e5fe48cdcdc63d0cf4 Mon Sep 17 00:00:00 2001
From: Tasso Evangelista
Date: Fri, 22 Aug 2025 18:23:18 -0300
Subject: [PATCH 010/197] chore: Improper calls to `Meteor.userId()` in React
components (#36775)
---
apps/meteor/client/views/meet/MeetPage.tsx | 8 ++++----
.../omnichannel/directory/chats/ChatInfo/ChatInfo.tsx | 4 ++--
.../views/setupWizard/providers/SetupWizardProvider.tsx | 3 +--
3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/apps/meteor/client/views/meet/MeetPage.tsx b/apps/meteor/client/views/meet/MeetPage.tsx
index 608d37eb07dbc..e0f86d0054c5a 100644
--- a/apps/meteor/client/views/meet/MeetPage.tsx
+++ b/apps/meteor/client/views/meet/MeetPage.tsx
@@ -1,7 +1,6 @@
import { Button, Box, Flex } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
-import { useRouteParameter, useSearchParameter } from '@rocket.chat/ui-contexts';
-import { Meteor } from 'meteor/meteor';
+import { useRouteParameter, useSearchParameter, useUserId } from '@rocket.chat/ui-contexts';
import { useEffect, useState, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
@@ -23,6 +22,7 @@ const MeetPage = () => {
const [visitorName, setVisitorName] = useState('');
const [agentName, setAgentName] = useState('');
const [callStartTime, setCallStartTime] = useState(undefined);
+ const userId = useUserId();
const isMobileDevice = (): boolean => window.innerWidth <= 450;
const closeCallTab = (): void => window.close();
@@ -52,14 +52,14 @@ const MeetPage = () => {
}
const room = (await sdk.rest.get('/v1/rooms.info', { roomId })) as any;
- if (room?.room?.servedBy?._id === Meteor.userId()) {
+ if (room?.room?.servedBy?._id === userId) {
setVisitorName(room.room.fname);
room?.room?.responseBy?.username ? setAgentName(room.room.responseBy.username) : setAgentName(room.room.servedBy.username);
setStatus(room?.room?.callStatus || 'ended');
setCallStartTime(room.room.webRtcCallStartTime);
return setIsRoomMember(true);
}
- }, [roomId]);
+ }, [roomId, userId]);
useEffect(() => {
if (visitorToken) {
diff --git a/apps/meteor/client/views/omnichannel/directory/chats/ChatInfo/ChatInfo.tsx b/apps/meteor/client/views/omnichannel/directory/chats/ChatInfo/ChatInfo.tsx
index d131a14d9a0c4..9c76109b948cf 100644
--- a/apps/meteor/client/views/omnichannel/directory/chats/ChatInfo/ChatInfo.tsx
+++ b/apps/meteor/client/views/omnichannel/directory/chats/ChatInfo/ChatInfo.tsx
@@ -9,9 +9,9 @@ import {
useTranslation,
usePermission,
useEndpoint,
+ useUserId,
} from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
-import { Meteor } from 'meteor/meteor';
import moment from 'moment';
import { useMemo } from 'react';
@@ -74,7 +74,7 @@ function ChatInfo({ id, route }: ChatInfoProps) {
const canViewCustomFields = usePermission('view-livechat-room-customfields');
const subscription = useUserSubscription(id);
const hasGlobalEditRoomPermission = usePermission('save-others-livechat-room-info');
- const hasLocalEditRoomPermission = servedBy?._id === Meteor.userId();
+ const hasLocalEditRoomPermission = servedBy?._id === useUserId();
const visitorId = v?._id;
const queueStartedAt = queuedAt || ts;
diff --git a/apps/meteor/client/views/setupWizard/providers/SetupWizardProvider.tsx b/apps/meteor/client/views/setupWizard/providers/SetupWizardProvider.tsx
index 4b355f87002d6..7c91d668bdaac 100644
--- a/apps/meteor/client/views/setupWizard/providers/SetupWizardProvider.tsx
+++ b/apps/meteor/client/views/setupWizard/providers/SetupWizardProvider.tsx
@@ -10,7 +10,6 @@ import {
useTranslation,
} from '@rocket.chat/ui-contexts';
import { useQueryClient } from '@tanstack/react-query';
-import { Meteor } from 'meteor/meteor';
import type { ReactElement, ContextType } from 'react';
import { useCallback, useMemo, useState } from 'react';
@@ -87,7 +86,7 @@ const SetupWizardProvider = ({ children }: { children: ReactElement }): ReactEle
try {
await loginWithPassword(email, password);
} catch (error) {
- if (error instanceof Meteor.Error && error.error === 'error-invalid-email') {
+ if ((error as { error?: unknown }).error === 'error-invalid-email') {
dispatchToastMessage({ type: 'success', message: t('We_have_sent_registration_email') });
return;
}
From 1457924eb1e22592c97be53bb2e41df0fbb6cf40 Mon Sep 17 00:00:00 2001
From: Kevin Aleman
Date: Fri, 22 Aug 2025 15:47:33 -0600
Subject: [PATCH 011/197] chore: `applyDepartmentRestrictions` to new package
structure (#36733)
---
.../authorization/server/functions/hasRole.ts | 3 +
.../livechat/server/api/lib/departments.ts | 18 +-
.../app/livechat/server/lib/closeRoom.ts | 3 +-
.../server/api/lib/units.ts | 3 +-
.../hooks/applyDepartmentRestrictions.ts | 32 --
.../livechat-enterprise/server/hooks/index.ts | 1 -
.../server/hooks/manageDepartmentUnit.ts | 2 +-
.../server/lib/Department.ts | 5 +-
.../server/lib/LivechatEnterprise.ts | 2 +-
.../server/lib/restrictQuery.ts | 2 +-
.../livechat-enterprise/server/lib/unit.ts | 2 +-
.../server/methods/getUnitsFromUserRoles.ts | 48 +--
.../server/hooks/manageDepartmentUnit.spec.ts | 2 +-
apps/meteor/lib/callbacks.ts | 4 -
.../server/services/authorization/service.ts | 12 +
ee/packages/omni-core-ee/package.json | 9 +-
ee/packages/omni-core-ee/src/index.ts | 4 +
.../patches/applyDepartmentRestrictions.ts | 24 ++
...dRoleBasedRestrictionsToDepartment.spec.ts | 297 ++++++++++++++++++
.../addRoleBasedRestrictionsToDepartment.ts | 17 +
.../src/units/getUnitsFromUser.spec.ts | 230 ++++++++++++++
.../src/units/getUnitsFromUser.ts | 48 +++
ee/packages/omni-core-ee/src/utils/logger.ts | 4 +
.../core-services/src/types/IAuthorization.ts | 3 +-
packages/omni-core/package.json | 6 +-
.../src/hooks/applyDepartmentRestrictions.ts | 7 +
packages/omni-core/src/index.ts | 1 +
27 files changed, 682 insertions(+), 107 deletions(-)
delete mode 100644 apps/meteor/ee/app/livechat-enterprise/server/hooks/applyDepartmentRestrictions.ts
create mode 100644 ee/packages/omni-core-ee/src/patches/applyDepartmentRestrictions.ts
create mode 100644 ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.spec.ts
create mode 100644 ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.ts
create mode 100644 ee/packages/omni-core-ee/src/units/getUnitsFromUser.spec.ts
create mode 100644 ee/packages/omni-core-ee/src/units/getUnitsFromUser.ts
create mode 100644 ee/packages/omni-core-ee/src/utils/logger.ts
create mode 100644 packages/omni-core/src/hooks/applyDepartmentRestrictions.ts
diff --git a/apps/meteor/app/authorization/server/functions/hasRole.ts b/apps/meteor/app/authorization/server/functions/hasRole.ts
index 2e53229e3e794..00f781725c55c 100644
--- a/apps/meteor/app/authorization/server/functions/hasRole.ts
+++ b/apps/meteor/app/authorization/server/functions/hasRole.ts
@@ -1,6 +1,9 @@
import type { IRole, IUser, IRoom, ISubscription } from '@rocket.chat/core-typings';
import { Roles } from '@rocket.chat/models';
+/**
+ * @deprecated use `Authorization.hasAnyRole` instead
+ */
export const hasAnyRoleAsync = async (
userId: IUser['_id'],
roleIds: IRole['_id'][],
diff --git a/apps/meteor/app/livechat/server/api/lib/departments.ts b/apps/meteor/app/livechat/server/api/lib/departments.ts
index 049dbebaf7aa4..cf430e3ad8561 100644
--- a/apps/meteor/app/livechat/server/api/lib/departments.ts
+++ b/apps/meteor/app/livechat/server/api/lib/departments.ts
@@ -1,10 +1,10 @@
import type { ILivechatDepartment, ILivechatDepartmentAgents } from '@rocket.chat/core-typings';
import { LivechatDepartment, LivechatDepartmentAgents } from '@rocket.chat/models';
+import { applyDepartmentRestrictions } from '@rocket.chat/omni-core';
import type { PaginatedResult } from '@rocket.chat/rest-typings';
import { escapeRegExp } from '@rocket.chat/string-helpers';
-import type { Document, Filter, FindOptions } from 'mongodb';
+import type { Document, Filter, FilterOperators, FindOptions } from 'mongodb';
-import { callbacks } from '../../../../../lib/callbacks';
import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission';
type Pagination = { pagination: { offset: number; count: number; sort: FindOptions['sort'] } };
@@ -46,7 +46,7 @@ export async function findDepartments({
showArchived = false,
pagination: { offset, count, sort },
}: FindDepartmentParams): Promise> {
- let query = {
+ let query: FilterOperators = {
$or: [{ type: { $eq: 'd' } }, { type: { $exists: false } }],
...(!showArchived && { archived: { $ne: !showArchived } }),
...(enabled && { enabled: Boolean(enabled) }),
@@ -55,7 +55,7 @@ export async function findDepartments({
};
if (onlyMyDepartments) {
- query = await callbacks.run('livechat.applyDepartmentRestrictions', query, { userId });
+ query = await applyDepartmentRestrictions(query, userId);
}
const { cursor, totalCount } = LivechatDepartment.findPaginated(query, {
@@ -81,7 +81,7 @@ export async function findArchivedDepartments({
excludeDepartmentId,
pagination: { offset, count, sort },
}: FindDepartmentParams): Promise> {
- let query = {
+ let query: FilterOperators = {
$or: [{ type: { $eq: 'd' } }, { type: { $exists: false } }],
archived: { $eq: true },
...(text && { name: new RegExp(escapeRegExp(text), 'i') }),
@@ -89,7 +89,7 @@ export async function findArchivedDepartments({
};
if (onlyMyDepartments) {
- query = await callbacks.run('livechat.applyDepartmentRestrictions', query, { userId });
+ query = await applyDepartmentRestrictions(query, userId);
}
const { cursor, totalCount } = LivechatDepartment.findPaginated(query, {
@@ -119,10 +119,10 @@ export async function findDepartmentById({
}> {
const canViewLivechatDepartments = includeAgents && (await hasPermissionAsync(userId, 'view-livechat-departments'));
- let query = { _id: departmentId };
+ let query: FilterOperators = { _id: departmentId };
if (onlyMyDepartments) {
- query = await callbacks.run('livechat.applyDepartmentRestrictions', query, { userId });
+ query = await applyDepartmentRestrictions(query, userId);
}
const result = {
@@ -146,7 +146,7 @@ export async function findDepartmentsToAutocomplete({
let { conditions = {} } = selector;
if (onlyMyDepartments) {
- conditions = await callbacks.run('livechat.applyDepartmentRestrictions', conditions, { userId: uid });
+ conditions = await applyDepartmentRestrictions(conditions, uid);
}
const conditionsWithArchived = { archived: { $ne: !showArchived }, ...conditions };
diff --git a/apps/meteor/app/livechat/server/lib/closeRoom.ts b/apps/meteor/app/livechat/server/lib/closeRoom.ts
index 717679035ff92..66cbe70c94846 100644
--- a/apps/meteor/app/livechat/server/lib/closeRoom.ts
+++ b/apps/meteor/app/livechat/server/lib/closeRoom.ts
@@ -3,6 +3,7 @@ import { Message } from '@rocket.chat/core-services';
import type { ILivechatDepartment, ILivechatInquiryRecord, IOmnichannelRoom, IOmnichannelRoomClosingInfo } from '@rocket.chat/core-typings';
import { isOmnichannelRoom } from '@rocket.chat/core-typings';
import { LivechatDepartment, LivechatInquiry, LivechatRooms, Subscriptions, Users } from '@rocket.chat/models';
+import { applyDepartmentRestrictions } from '@rocket.chat/omni-core';
import type { ClientSession } from 'mongodb';
import type { CloseRoomParams, CloseRoomParamsByUser, CloseRoomParamsByVisitor } from './localTypes';
@@ -283,7 +284,7 @@ export async function closeOpenChats(userId: string, comment?: string) {
logger.debug(`Closing open chats for user ${userId}`);
const user = await Users.findOneById(userId);
- const extraQuery = await callbacks.run('livechat.applyDepartmentRestrictions', {}, { userId });
+ const extraQuery = await applyDepartmentRestrictions({}, userId);
const openChats = LivechatRooms.findOpenByAgent(userId, extraQuery);
const promises: Promise[] = [];
await openChats.forEach((room) => {
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts
index e95c323766a58..5ad7242276d70 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/api/lib/units.ts
@@ -1,10 +1,9 @@
import type { IOmnichannelBusinessUnit, ILivechatUnitMonitor } from '@rocket.chat/core-typings';
import { LivechatUnitMonitors, LivechatUnit } from '@rocket.chat/models';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import type { FindOptions } from 'mongodb';
-import { getUnitsFromUser } from '../../methods/getUnitsFromUserRoles';
-
export async function findUnitsOfUser({
text,
userId,
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/applyDepartmentRestrictions.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/applyDepartmentRestrictions.ts
deleted file mode 100644
index 08c8efac94eb2..0000000000000
--- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/applyDepartmentRestrictions.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import type { ILivechatDepartment } from '@rocket.chat/core-typings';
-import type { FilterOperators } from 'mongodb';
-
-import { callbacks } from '../../../../../lib/callbacks';
-import { cbLogger } from '../lib/logger';
-import { getUnitsFromUser } from '../methods/getUnitsFromUserRoles';
-
-export const addQueryRestrictionsToDepartmentsModel = async (originalQuery: FilterOperators = {}, userId: string) => {
- const query: FilterOperators = { $and: [originalQuery, { type: { $ne: 'u' } }] };
-
- const units = await getUnitsFromUser(userId);
- if (Array.isArray(units)) {
- query.$and.push({ $or: [{ ancestors: { $in: units } }, { _id: { $in: units } }] });
- }
-
- cbLogger.debug({ msg: 'Applying department query restrictions', userId, units });
- return query;
-};
-
-callbacks.add(
- 'livechat.applyDepartmentRestrictions',
- async (originalQuery: FilterOperators = {}, { userId }: { userId?: string | null } = { userId: null }) => {
- if (!userId) {
- return originalQuery;
- }
-
- cbLogger.debug('Applying department query restrictions');
- return addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
- },
- callbacks.priority.HIGH,
- 'livechat-apply-department-restrictions',
-);
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/index.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/index.ts
index 598f682f8cc29..f275a6db9014e 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/index.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/index.ts
@@ -17,7 +17,6 @@ import './onBusinessHourStart';
import './onAgentAssignmentFailed';
import './afterOnHoldChatResumed';
import './afterReturnRoomAsInquiry';
-import './applyDepartmentRestrictions';
import './afterForwardChatToAgent';
import './applySimultaneousChatsRestrictions';
import './afterInquiryQueued';
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/manageDepartmentUnit.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/manageDepartmentUnit.ts
index 8b25ea35db22c..86c214e60a52b 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/manageDepartmentUnit.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/manageDepartmentUnit.ts
@@ -1,9 +1,9 @@
import type { ILivechatDepartment } from '@rocket.chat/core-typings';
import { LivechatDepartment, LivechatUnit } from '@rocket.chat/models';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import { hasAnyRoleAsync } from '../../../../../app/authorization/server/functions/hasRole';
import { callbacks } from '../../../../../lib/callbacks';
-import { getUnitsFromUser } from '../methods/getUnitsFromUserRoles';
export const manageDepartmentUnit = async ({ userId, departmentId, unitId }: { userId: string; departmentId: string; unitId: string }) => {
const accessibleUnits = await getUnitsFromUser(userId);
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.ts
index f1ab72fa1e336..764a795dd0cd9 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/Department.ts
@@ -1,10 +1,9 @@
import type { ILivechatDepartment } from '@rocket.chat/core-typings';
import { LivechatDepartment } from '@rocket.chat/models';
+import { applyDepartmentRestrictions } from '@rocket.chat/omni-core';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import type { Filter } from 'mongodb';
-import { callbacks } from '../../../../../lib/callbacks';
-
export const findAllDepartmentsAvailable = async (
uid: string,
unitId: string,
@@ -22,7 +21,7 @@ export const findAllDepartmentsAvailable = async (
};
if (onlyMyDepartments) {
- query = await callbacks.run('livechat.applyDepartmentRestrictions', query, { userId: uid });
+ query = await applyDepartmentRestrictions(query, uid);
}
const { cursor, totalCount } = LivechatDepartment.findPaginated(query, { limit: count, offset, sort: { name: 1 } });
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts
index 8f8189da8146c..c3a810367639e 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts
@@ -1,5 +1,6 @@
import type { IOmnichannelBusinessUnit, IOmnichannelServiceLevelAgreements, IUser, ILivechatTag } from '@rocket.chat/core-typings';
import { Users, OmnichannelServiceLevelAgreements, LivechatTag, LivechatUnitMonitors, LivechatUnit } from '@rocket.chat/models';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import { Match, check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
@@ -8,7 +9,6 @@ import { removeSLAFromRooms } from './SlaHelper';
import { callbacks } from '../../../../../lib/callbacks';
import { addUserRolesAsync } from '../../../../../server/lib/roles/addUserRoles';
import { removeUserFromRolesAsync } from '../../../../../server/lib/roles/removeUserFromRoles';
-import { getUnitsFromUser } from '../methods/getUnitsFromUserRoles';
export const LivechatEnterprise = {
async addMonitor(username: string) {
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/restrictQuery.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/restrictQuery.ts
index 2fb08bd25717c..77ff6cb53f553 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/lib/restrictQuery.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/restrictQuery.ts
@@ -1,9 +1,9 @@
import type { IOmnichannelRoom } from '@rocket.chat/core-typings';
import { LivechatDepartment } from '@rocket.chat/models';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import type { FilterOperators } from 'mongodb';
import { cbLogger } from './logger';
-import { getUnitsFromUser } from '../methods/getUnitsFromUserRoles';
export const restrictQuery = async ({
originalQuery = {},
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/unit.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/unit.ts
index 252aefaa2cb3d..8ac75cbc0d079 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/lib/unit.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/unit.ts
@@ -1,8 +1,8 @@
import { LivechatUnit } from '@rocket.chat/models';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import type { CheckUnitsFromUser } from '../../../../../app/livechat/server/api/lib/livechat';
import { checkUnitsFromUser } from '../../../../../app/livechat/server/api/lib/livechat';
-import { getUnitsFromUser } from '../methods/getUnitsFromUserRoles';
checkUnitsFromUser.patch(async (_next, { businessUnit, userId }: CheckUnitsFromUser) => {
if (!businessUnit) {
diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts
index f9ac4a27cc8bb..7161d14cb7966 100644
--- a/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts
+++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts
@@ -1,54 +1,8 @@
import type { ServerMethods } from '@rocket.chat/ddp-client';
-import { LivechatUnit, LivechatDepartmentAgents } from '@rocket.chat/models';
-import mem from 'mem';
+import { getUnitsFromUser } from '@rocket.chat/omni-core-ee';
import { Meteor } from 'meteor/meteor';
-import { hasAnyRoleAsync } from '../../../../../app/authorization/server/functions/hasRole';
import { methodDeprecationLogger } from '../../../../../app/lib/server/lib/deprecationWarningLogger';
-import { logger } from '../lib/logger';
-
-async function getUnitsFromUserRoles(user: string): Promise {
- return LivechatUnit.findByMonitorId(user);
-}
-
-async function getDepartmentsFromUserRoles(user: string): Promise {
- return (await LivechatDepartmentAgents.findByAgentId(user).toArray()).map((department) => department.departmentId);
-}
-
-const memoizedGetUnitFromUserRoles = mem(getUnitsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
-const memoizedGetDepartmentsFromUserRoles = mem(getDepartmentsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
-
-async function hasUnits(): Promise {
- // @ts-expect-error - this prop is injected dynamically on ee license
- return (await LivechatUnit.countUnits({ type: 'u' })) > 0;
-}
-
-// Units should't change really often, so we can cache the result
-const memoizedHasUnits = mem(hasUnits, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
-
-export const getUnitsFromUser = async (userId?: string): Promise => {
- if (!userId) {
- return;
- }
-
- if (!(await memoizedHasUnits())) {
- return;
- }
-
- // TODO: we can combine these 2 calls into one single query
- if (await hasAnyRoleAsync(userId, ['admin', 'livechat-manager'])) {
- return;
- }
-
- if (!(await hasAnyRoleAsync(userId, ['livechat-monitor', 'livechat-agent']))) {
- return;
- }
-
- const unitsAndDepartments = [...(await memoizedGetUnitFromUserRoles(userId)), ...(await memoizedGetDepartmentsFromUserRoles(userId))];
- logger.debug({ msg: 'Calculating units for monitor', user: userId, unitsAndDepartments });
-
- return unitsAndDepartments;
-};
declare module '@rocket.chat/ddp-client' {
// eslint-disable-next-line @typescript-eslint/naming-convention
diff --git a/apps/meteor/ee/tests/unit/apps/livechat-enterprise/server/hooks/manageDepartmentUnit.spec.ts b/apps/meteor/ee/tests/unit/apps/livechat-enterprise/server/hooks/manageDepartmentUnit.spec.ts
index 8fbf0dcf97a2e..38ed2e92c1229 100644
--- a/apps/meteor/ee/tests/unit/apps/livechat-enterprise/server/hooks/manageDepartmentUnit.spec.ts
+++ b/apps/meteor/ee/tests/unit/apps/livechat-enterprise/server/hooks/manageDepartmentUnit.spec.ts
@@ -21,7 +21,7 @@ const getUnitsFromUserStub = sinon.stub();
const { manageDepartmentUnit } = proxyquire
.noCallThru()
.load('../../../../../../app/livechat-enterprise/server/hooks/manageDepartmentUnit.ts', {
- '../methods/getUnitsFromUserRoles': {
+ '@rocket.chat/omni-core-ee': {
getUnitsFromUser: getUnitsFromUserStub,
},
'../../../../../app/authorization/server/functions/hasRole': {
diff --git a/apps/meteor/lib/callbacks.ts b/apps/meteor/lib/callbacks.ts
index 1ec2e8a3722b3..a5a0a6262207e 100644
--- a/apps/meteor/lib/callbacks.ts
+++ b/apps/meteor/lib/callbacks.ts
@@ -151,10 +151,6 @@ type ChainedCallbackSignatures = {
agentsId: ILivechatAgent['_id'][];
};
'livechat.applySimultaneousChatRestrictions': (_: undefined, params: { departmentId?: ILivechatDepartmentRecord['_id'] }) => undefined;
- 'livechat.applyDepartmentRestrictions': (
- query: FilterOperators,
- params: { userId: IUser['_id'] },
- ) => FilterOperators;
'livechat.applyRoomRestrictions': (
query: FilterOperators,
params?: {
diff --git a/apps/meteor/server/services/authorization/service.ts b/apps/meteor/server/services/authorization/service.ts
index 958dce13e1fa0..50ce3d320f310 100644
--- a/apps/meteor/server/services/authorization/service.ts
+++ b/apps/meteor/server/services/authorization/service.ts
@@ -189,4 +189,16 @@ export class Authorization extends ServiceClass implements IAuthorization {
return true;
}
+
+ async hasAnyRole(userId: IUser['_id'], roleIds: IRole['_id'][], scope?: IRoom['_id']): Promise {
+ if (!Array.isArray(roleIds)) {
+ throw new Error('error-invalid-arguments');
+ }
+
+ if (!userId) {
+ return false;
+ }
+
+ return Roles.isUserInRoles(userId, roleIds, scope);
+ }
}
diff --git a/ee/packages/omni-core-ee/package.json b/ee/packages/omni-core-ee/package.json
index e93eb3e7eff9d..66418628e8331 100644
--- a/ee/packages/omni-core-ee/package.json
+++ b/ee/packages/omni-core-ee/package.json
@@ -25,7 +25,14 @@
"/dist"
],
"dependencies": {
+ "@rocket.chat/core-services": "workspace:^",
+ "@rocket.chat/logger": "workspace:^",
"@rocket.chat/models": "workspace:^",
- "@rocket.chat/omni-core": "workspace:^"
+ "@rocket.chat/omni-core": "workspace:^",
+ "mem": "^8.1.1",
+ "mongodb": "6.10.0"
+ },
+ "volta": {
+ "extends": "../../../package.json"
}
}
diff --git a/ee/packages/omni-core-ee/src/index.ts b/ee/packages/omni-core-ee/src/index.ts
index e7fea8ef3b0a1..34ebbaefcc666 100644
--- a/ee/packages/omni-core-ee/src/index.ts
+++ b/ee/packages/omni-core-ee/src/index.ts
@@ -1,5 +1,9 @@
import { isDepartmentCreationAvailablePatch } from './isDepartmentCreationAvailable';
+import { applyDepartmentRestrictionsPatch } from './patches/applyDepartmentRestrictions';
export function patchOmniCore(): void {
isDepartmentCreationAvailablePatch();
+ applyDepartmentRestrictionsPatch();
}
+
+export * from './units/getUnitsFromUser';
diff --git a/ee/packages/omni-core-ee/src/patches/applyDepartmentRestrictions.ts b/ee/packages/omni-core-ee/src/patches/applyDepartmentRestrictions.ts
new file mode 100644
index 0000000000000..36a28d5df50be
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/patches/applyDepartmentRestrictions.ts
@@ -0,0 +1,24 @@
+import type { ILivechatDepartment } from '@rocket.chat/core-typings';
+import { License } from '@rocket.chat/license';
+import { applyDepartmentRestrictions } from '@rocket.chat/omni-core';
+import type { FilterOperators } from 'mongodb';
+
+import { addQueryRestrictionsToDepartmentsModel } from '../units/addRoleBasedRestrictionsToDepartment';
+import { hooksLogger } from '../utils/logger';
+
+export const applyDepartmentRestrictionsPatch = () => {
+ applyDepartmentRestrictions.patch(
+ async (
+ prev: (query: FilterOperators, userId: string) => FilterOperators,
+ query: FilterOperators = {},
+ userId: string,
+ ) => {
+ if (!License.hasModule('livechat-enterprise')) {
+ return prev(query, userId);
+ }
+
+ hooksLogger.debug('Applying department query restrictions');
+ return addQueryRestrictionsToDepartmentsModel(query, userId);
+ },
+ );
+};
diff --git a/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.spec.ts b/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.spec.ts
new file mode 100644
index 0000000000000..6c1042e947c64
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.spec.ts
@@ -0,0 +1,297 @@
+import type { ILivechatDepartment } from '@rocket.chat/core-typings';
+import type { FilterOperators } from 'mongodb';
+
+import { addQueryRestrictionsToDepartmentsModel } from './addRoleBasedRestrictionsToDepartment';
+import { getUnitsFromUser } from './getUnitsFromUser';
+import { defaultLogger } from '../utils/logger';
+
+// Mock dependencies
+jest.mock('./getUnitsFromUser');
+jest.mock('../utils/logger');
+
+const mockedGetUnitsFromUser = jest.mocked(getUnitsFromUser);
+const mockedLogger = jest.mocked(defaultLogger);
+
+describe('addQueryRestrictionsToDepartmentsModel', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ describe('when getUnitsFromUser returns an array of units', () => {
+ it('should add unit restrictions to the query', async () => {
+ // Arrange
+ const userId = 'user123';
+ const units = ['unit1', 'unit2', 'unit3'];
+ const originalQuery: FilterOperators = { name: 'test-department' };
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ { name: 'test-department' },
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: ['unit1', 'unit2', 'unit3'] } }, { _id: { $in: ['unit1', 'unit2', 'unit3'] } }],
+ },
+ ],
+ });
+
+ expect(mockedGetUnitsFromUser).toHaveBeenCalledWith(userId);
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId,
+ units,
+ });
+ });
+
+ it('should work with empty original query', async () => {
+ // Arrange
+ const userId = 'user456';
+ const units = ['unit4', 'unit5'];
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel({}, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ {},
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: ['unit4', 'unit5'] } }, { _id: { $in: ['unit4', 'unit5'] } }],
+ },
+ ],
+ });
+ });
+
+ it('should work with undefined original query', async () => {
+ // Arrange
+ const userId = 'user789';
+ const units = ['unit6'];
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(undefined, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ {},
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: ['unit6'] } }, { _id: { $in: ['unit6'] } }],
+ },
+ ],
+ });
+ });
+
+ it('should handle single unit in array', async () => {
+ // Arrange
+ const userId = 'user101';
+ const units = ['single-unit'];
+ const originalQuery: FilterOperators = { enabled: true };
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ { enabled: true },
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: ['single-unit'] } }, { _id: { $in: ['single-unit'] } }],
+ },
+ ],
+ });
+ });
+ });
+
+ describe('when getUnitsFromUser returns non-array values', () => {
+ it('should not add unit restrictions when getUnitsFromUser returns null', async () => {
+ // Arrange
+ const userId = 'user202';
+ const originalQuery: FilterOperators = { name: 'test' };
+
+ mockedGetUnitsFromUser.mockResolvedValue(undefined);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [{ name: 'test' }, { type: { $ne: 'u' } }],
+ });
+
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId,
+ units: undefined,
+ });
+ });
+
+ it('should not add unit restrictions when getUnitsFromUser returns undefined', async () => {
+ // Arrange
+ const userId = 'user303';
+ const originalQuery: FilterOperators = { active: true };
+
+ mockedGetUnitsFromUser.mockResolvedValue(undefined);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [{ active: true }, { type: { $ne: 'u' } }],
+ });
+
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId,
+ units: undefined,
+ });
+ });
+
+ it('should not add unit restrictions when getUnitsFromUser returns a string', async () => {
+ // Arrange
+ const userId = 'user404';
+ const originalQuery: FilterOperators = {};
+
+ mockedGetUnitsFromUser.mockResolvedValue('not-an-array' as any);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [{}, { type: { $ne: 'u' } }],
+ });
+
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId,
+ units: 'not-an-array',
+ });
+ });
+
+ it('should not add unit restrictions when getUnitsFromUser returns empty array', async () => {
+ // Arrange
+ const userId = 'user505';
+ const originalQuery: FilterOperators = { department: 'support' };
+
+ mockedGetUnitsFromUser.mockResolvedValue([]);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ { department: 'support' },
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: [] } }, { _id: { $in: [] } }],
+ },
+ ],
+ });
+
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId,
+ units: [],
+ });
+ });
+ });
+
+ describe('error handling', () => {
+ it('should propagate errors from getUnitsFromUser', async () => {
+ // Arrange
+ const userId = 'user606';
+ const error = new Error('Database connection failed');
+
+ mockedGetUnitsFromUser.mockRejectedValue(error);
+
+ // Act & Assert
+ await expect(addQueryRestrictionsToDepartmentsModel({}, userId)).rejects.toThrow('Database connection failed');
+
+ expect(mockedGetUnitsFromUser).toHaveBeenCalledWith(userId);
+ expect(mockedLogger.debug).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('complex query scenarios', () => {
+ it('should handle complex original query with nested conditions', async () => {
+ // Arrange
+ const userId = 'user707';
+ const units = ['unit-a', 'unit-b'];
+ const originalQuery: FilterOperators = {
+ $or: [{ name: { $regex: 'support' } }, { enabled: true }],
+ createdAt: { $gte: new Date('2023-01-01') },
+ };
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result).toEqual({
+ $and: [
+ {
+ $or: [{ name: { $regex: 'support' } }, { enabled: true }],
+ createdAt: { $gte: new Date('2023-01-01') },
+ },
+ { type: { $ne: 'u' } },
+ {
+ $or: [{ ancestors: { $in: ['unit-a', 'unit-b'] } }, { _id: { $in: ['unit-a', 'unit-b'] } }],
+ },
+ ],
+ });
+ });
+
+ it('should always exclude departments with type "u"', async () => {
+ // Arrange
+ const userId = 'user808';
+ const units = ['unit-x'];
+ const originalQuery: FilterOperators = { type: 'normal' };
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ const result = await addQueryRestrictionsToDepartmentsModel(originalQuery, userId);
+
+ // Assert
+ expect(result.$and).toContainEqual({ type: { $ne: 'u' } });
+ });
+ });
+
+ describe('logging', () => {
+ it('should always call debug logger with correct parameters', async () => {
+ // Arrange
+ const userId = 'user909';
+ const units = ['unit-test'];
+
+ mockedGetUnitsFromUser.mockResolvedValue(units);
+
+ // Act
+ await addQueryRestrictionsToDepartmentsModel({}, userId);
+
+ // Assert
+ expect(mockedLogger.debug).toHaveBeenCalledTimes(1);
+ expect(mockedLogger.debug).toHaveBeenCalledWith({
+ msg: 'Applying department query restrictions',
+ userId: 'user909',
+ units: ['unit-test'],
+ });
+ });
+ });
+});
diff --git a/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.ts b/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.ts
new file mode 100644
index 0000000000000..691f08072840b
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/units/addRoleBasedRestrictionsToDepartment.ts
@@ -0,0 +1,17 @@
+import type { ILivechatDepartment } from '@rocket.chat/core-typings';
+import type { FilterOperators } from 'mongodb';
+
+import { getUnitsFromUser } from './getUnitsFromUser';
+import { defaultLogger } from '../utils/logger';
+
+export const addQueryRestrictionsToDepartmentsModel = async (originalQuery: FilterOperators = {}, userId: string) => {
+ const query: FilterOperators = { $and: [originalQuery, { type: { $ne: 'u' } }] };
+
+ const units = await getUnitsFromUser(userId);
+ if (Array.isArray(units)) {
+ query.$and.push({ $or: [{ ancestors: { $in: units } }, { _id: { $in: units } }] });
+ }
+
+ defaultLogger.debug({ msg: 'Applying department query restrictions', userId, units });
+ return query;
+};
diff --git a/ee/packages/omni-core-ee/src/units/getUnitsFromUser.spec.ts b/ee/packages/omni-core-ee/src/units/getUnitsFromUser.spec.ts
new file mode 100644
index 0000000000000..f2543b2267116
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/units/getUnitsFromUser.spec.ts
@@ -0,0 +1,230 @@
+import { Authorization } from '@rocket.chat/core-services';
+import { LivechatUnit, LivechatDepartmentAgents } from '@rocket.chat/models';
+
+import { getUnitsFromUser } from './getUnitsFromUser';
+import { defaultLogger } from '../utils/logger';
+
+// Mock the dependencies
+jest.mock('@rocket.chat/core-services', () => ({
+ Authorization: {
+ hasAnyRole: jest.fn(),
+ },
+}));
+jest.mock('@rocket.chat/models', () => ({
+ LivechatUnit: {
+ findByMonitorId: jest.fn(),
+ countUnits: jest.fn(),
+ },
+ LivechatDepartmentAgents: {
+ findByAgentId: jest.fn(),
+ },
+}));
+
+jest.mock('mem', () => (fn: any) => fn);
+jest.mock('../utils/logger');
+
+const mockAuthorization = Authorization as jest.Mocked;
+const mockLivechatUnit = LivechatUnit as jest.Mocked;
+const mockLivechatDepartmentAgents = LivechatDepartmentAgents as jest.Mocked;
+const mockLogger = defaultLogger as jest.Mocked;
+describe('getUnitsFromUser', () => {
+ beforeEach(() => {
+ jest.resetAllMocks();
+
+ // Setup default mock implementations
+ mockLivechatUnit.findByMonitorId.mockResolvedValue(['unit1', 'unit2']);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([{ departmentId: 'dept1' }, { departmentId: 'dept2' }]),
+ } as any);
+ mockLivechatUnit.countUnits.mockResolvedValue(5);
+
+ mockAuthorization.hasAnyRole.mockResolvedValue(false);
+ mockLogger.debug.mockImplementation(() => {
+ //
+ });
+ });
+
+ describe('when userId is not provided', () => {
+ it('should return undefined for null userId', async () => {
+ const result = await getUnitsFromUser(null as any);
+ expect(result).toBeUndefined();
+ });
+
+ it('should return undefined for undefined userId', async () => {
+ const result = await getUnitsFromUser(undefined);
+ expect(result).toBeUndefined();
+ });
+
+ it('should return undefined for empty string userId', async () => {
+ const result = await getUnitsFromUser('');
+ expect(result).toBeUndefined();
+ });
+ });
+
+ describe('when there are no units in the system', () => {
+ it('should return undefined', async () => {
+ mockLivechatUnit.countUnits.mockResolvedValue(0);
+
+ const result = await getUnitsFromUser('user123');
+
+ expect(result).toBeUndefined();
+ expect(mockLivechatUnit.countUnits).toHaveBeenCalled();
+ });
+ });
+
+ describe('when user has admin role', () => {
+ it('should return undefined for admin users', async () => {
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(true) // admin/livechat-manager check
+ .mockResolvedValueOnce(false); // livechat-monitor/agent check
+
+ const result = await getUnitsFromUser('admin-user');
+
+ expect(mockLivechatUnit.countUnits).toHaveBeenCalled();
+ expect(result).toBeUndefined();
+ expect(mockAuthorization.hasAnyRole).toHaveBeenCalledWith('admin-user', ['admin', 'livechat-manager']);
+ });
+ });
+
+ describe('when user does not have required roles', () => {
+ it('should return undefined for users without livechat-monitor or livechat-agent roles', async () => {
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(false); // livechat-monitor/agent check
+
+ const result = await getUnitsFromUser('regular-user');
+
+ expect(result).toBeUndefined();
+ expect(mockAuthorization.hasAnyRole).toHaveBeenCalledWith('regular-user', ['admin', 'livechat-manager']);
+ expect(mockAuthorization.hasAnyRole).toHaveBeenCalledWith('regular-user', ['livechat-monitor', 'livechat-agent']);
+ });
+ });
+
+ describe('when user has livechat-manager role', () => {
+ it('should return undefined for livechat-manager users', async () => {
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(true) // admin/livechat-manager check
+ .mockResolvedValueOnce(false); // livechat-monitor/agent check
+
+ const result = await getUnitsFromUser('manager-user');
+
+ expect(result).toBeUndefined();
+ expect(mockAuthorization.hasAnyRole).toHaveBeenCalledWith('manager-user', ['admin', 'livechat-manager']);
+ });
+ });
+
+ describe('when user has livechat-monitor role', () => {
+ it('should return combined units and departments', async () => {
+ const userId = 'monitor-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue(['unit1', 'unit2']);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([{ departmentId: 'dept1' }, { departmentId: 'dept2' }]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual(['unit1', 'unit2', 'dept1', 'dept2']);
+ expect(mockLivechatUnit.findByMonitorId).toHaveBeenCalledWith(userId);
+ expect(mockLivechatDepartmentAgents.findByAgentId).toHaveBeenCalledWith(userId);
+ expect(mockLogger.debug).toHaveBeenCalledWith({
+ msg: 'Calculating units for monitor',
+ user: userId,
+ unitsAndDepartments: ['unit1', 'unit2', 'dept1', 'dept2'],
+ });
+ });
+ });
+
+ describe('when user has livechat-agent role', () => {
+ it('should return combined units and departments', async () => {
+ const userId = 'agent-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue(['unit3']);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([{ departmentId: 'dept3' }, { departmentId: 'dept4' }]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual(['unit3', 'dept3', 'dept4']);
+ expect(mockLivechatUnit.findByMonitorId).toHaveBeenCalledWith(userId);
+ expect(mockLivechatDepartmentAgents.findByAgentId).toHaveBeenCalledWith(userId);
+ });
+ });
+
+ describe('edge cases', () => {
+ it('should handle empty units and departments arrays', async () => {
+ const userId = 'empty-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue([]);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should handle when only units are returned', async () => {
+ const userId = 'units-only-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue(['unit1', 'unit2']);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual(['unit1', 'unit2']);
+ });
+
+ it('should handle when only departments are returned', async () => {
+ const userId = 'departments-only-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue([]);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([{ departmentId: 'dept1' }, { departmentId: 'dept2' }]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual(['dept1', 'dept2']);
+ });
+ });
+
+ describe('memoization', () => {
+ it('should work correctly with memoization disabled in tests', async () => {
+ const userId = 'test-user';
+ mockAuthorization.hasAnyRole
+ .mockResolvedValueOnce(false) // admin/livechat-manager check
+ .mockResolvedValueOnce(true); // livechat-monitor/agent check
+
+ mockLivechatUnit.findByMonitorId.mockResolvedValue(['unit1']);
+ mockLivechatDepartmentAgents.findByAgentId.mockReturnValue({
+ toArray: jest.fn().mockResolvedValue([{ departmentId: 'dept1' }]),
+ } as any);
+
+ const result = await getUnitsFromUser(userId);
+
+ expect(result).toEqual(['unit1', 'dept1']);
+ expect(mockLivechatUnit.findByMonitorId).toHaveBeenCalledWith(userId);
+ expect(mockLivechatDepartmentAgents.findByAgentId).toHaveBeenCalledWith(userId);
+ });
+ });
+});
diff --git a/ee/packages/omni-core-ee/src/units/getUnitsFromUser.ts b/ee/packages/omni-core-ee/src/units/getUnitsFromUser.ts
new file mode 100644
index 0000000000000..4055483614fed
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/units/getUnitsFromUser.ts
@@ -0,0 +1,48 @@
+import { Authorization } from '@rocket.chat/core-services';
+import { LivechatUnit, LivechatDepartmentAgents } from '@rocket.chat/models';
+import mem from 'mem';
+
+import { defaultLogger } from '../utils/logger';
+
+async function getUnitsFromUserRoles(user: string): Promise {
+ return LivechatUnit.findByMonitorId(user);
+}
+
+async function getDepartmentsFromUserRoles(user: string): Promise {
+ return (await LivechatDepartmentAgents.findByAgentId(user).toArray()).map((department) => department.departmentId);
+}
+
+const memoizedGetUnitFromUserRoles = mem(getUnitsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
+const memoizedGetDepartmentsFromUserRoles = mem(getDepartmentsFromUserRoles, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
+
+async function hasUnits(): Promise {
+ // @ts-expect-error - this prop is injected dynamically on ee license
+ return (await LivechatUnit.countUnits({ type: 'u' })) > 0;
+}
+
+// Units should't change really often, so we can cache the result
+const memoizedHasUnits = mem(hasUnits, { maxAge: process.env.TEST_MODE ? 1 : 10000 });
+
+export const getUnitsFromUser = async (userId?: string): Promise => {
+ if (!userId) {
+ return;
+ }
+
+ if (!(await memoizedHasUnits())) {
+ return;
+ }
+
+ // TODO: we can combine these 2 calls into one single query
+ if (await Authorization.hasAnyRole(userId, ['admin', 'livechat-manager'])) {
+ return;
+ }
+
+ if (!(await Authorization.hasAnyRole(userId, ['livechat-monitor', 'livechat-agent']))) {
+ return;
+ }
+
+ const unitsAndDepartments = [...(await memoizedGetUnitFromUserRoles(userId)), ...(await memoizedGetDepartmentsFromUserRoles(userId))];
+ defaultLogger.debug({ msg: 'Calculating units for monitor', user: userId, unitsAndDepartments });
+
+ return unitsAndDepartments;
+};
diff --git a/ee/packages/omni-core-ee/src/utils/logger.ts b/ee/packages/omni-core-ee/src/utils/logger.ts
new file mode 100644
index 0000000000000..71b7414567e78
--- /dev/null
+++ b/ee/packages/omni-core-ee/src/utils/logger.ts
@@ -0,0 +1,4 @@
+import { Logger } from '@rocket.chat/logger';
+
+export const defaultLogger = new Logger('OmniCore-ee');
+export const hooksLogger = defaultLogger.section('hooks');
diff --git a/packages/core-services/src/types/IAuthorization.ts b/packages/core-services/src/types/IAuthorization.ts
index abefce601dd4b..0176db5c9a9f0 100644
--- a/packages/core-services/src/types/IAuthorization.ts
+++ b/packages/core-services/src/types/IAuthorization.ts
@@ -1,4 +1,4 @@
-import type { IRoom, IUser } from '@rocket.chat/core-typings';
+import type { IRoom, IUser, IRole } from '@rocket.chat/core-typings';
export type RoomAccessValidator = (
room?: Pick,
@@ -14,4 +14,5 @@ export interface IAuthorization {
canReadRoom: RoomAccessValidator;
canAccessRoomId(rid: IRoom['_id'], uid?: IUser['_id']): Promise;
getUsersFromPublicRoles(): Promise, '_id' | 'username' | 'roles'>[]>;
+ hasAnyRole(userId: IUser['_id'], roleIds: IRole['_id'][], scope?: IRoom['_id']): Promise;
}
diff --git a/packages/omni-core/package.json b/packages/omni-core/package.json
index 9dbd412107b4f..a66939f6fbed7 100644
--- a/packages/omni-core/package.json
+++ b/packages/omni-core/package.json
@@ -30,6 +30,10 @@
},
"dependencies": {
"@rocket.chat/models": "workspace:^",
- "@rocket.chat/patch-injection": "workspace:^"
+ "@rocket.chat/patch-injection": "workspace:^",
+ "mongodb": "6.10.0"
+ },
+ "volta": {
+ "extends": "../../package.json"
}
}
diff --git a/packages/omni-core/src/hooks/applyDepartmentRestrictions.ts b/packages/omni-core/src/hooks/applyDepartmentRestrictions.ts
new file mode 100644
index 0000000000000..db61370da44bf
--- /dev/null
+++ b/packages/omni-core/src/hooks/applyDepartmentRestrictions.ts
@@ -0,0 +1,7 @@
+import type { ILivechatDepartment } from '@rocket.chat/core-typings';
+import { makeFunction } from '@rocket.chat/patch-injection';
+import type { FilterOperators } from 'mongodb';
+
+export const applyDepartmentRestrictions = makeFunction(async (query: FilterOperators = {}, _userId: string) => {
+ return query;
+});
diff --git a/packages/omni-core/src/index.ts b/packages/omni-core/src/index.ts
index c0a01acf69dd1..d617f440544d4 100644
--- a/packages/omni-core/src/index.ts
+++ b/packages/omni-core/src/index.ts
@@ -1,2 +1,3 @@
export * from './isDepartmentCreationAvailable';
+export * from './hooks/applyDepartmentRestrictions';
export * from './visitor/create';
From 80fbb2eb421253e6066207949eaf2b41871e4428 Mon Sep 17 00:00:00 2001
From: Ahmed Nasser
Date: Mon, 25 Aug 2025 20:28:25 +0300
Subject: [PATCH 012/197] feat: Add OpenAPI Support to chat.unpinMessage API
(#36668)
---
.changeset/thirty-wasps-promise.md | 6 ++
apps/meteor/app/api/server/v1/chat.ts | 142 ++++++++++++++++----------
packages/rest-typings/src/v1/chat.ts | 21 ----
3 files changed, 93 insertions(+), 76 deletions(-)
create mode 100644 .changeset/thirty-wasps-promise.md
diff --git a/.changeset/thirty-wasps-promise.md b/.changeset/thirty-wasps-promise.md
new file mode 100644
index 0000000000000..9e0dc2989b558
--- /dev/null
+++ b/.changeset/thirty-wasps-promise.md
@@ -0,0 +1,6 @@
+---
+"@rocket.chat/meteor": patch
+"@rocket.chat/rest-typings": patch
+---
+
+Add OpenAPI support for the Rocket.Chat chat.unPinMessage API endpoints by migrating to a modern chained route definition syntax and utilizing shared AJV schemas for validation to enhance API documentation and ensure type safety through response validation.
diff --git a/apps/meteor/app/api/server/v1/chat.ts b/apps/meteor/app/api/server/v1/chat.ts
index 525f19ad0bf94..2333aff5a45d0 100644
--- a/apps/meteor/app/api/server/v1/chat.ts
+++ b/apps/meteor/app/api/server/v1/chat.ts
@@ -14,7 +14,6 @@ import {
isChatSearchProps,
isChatSendMessageProps,
isChatStarMessageProps,
- isChatUnpinMessageProps,
isChatUnstarMessageProps,
isChatIgnoreUserProps,
isChatGetPinnedMessagesProps,
@@ -179,6 +178,10 @@ type ChatPinMessage = {
messageId: IMessage['_id'];
};
+type ChatUnpinMessage = {
+ messageId: IMessage['_id'];
+};
+
const ChatPinMessageSchema = {
type: 'object',
properties: {
@@ -191,46 +194,95 @@ const ChatPinMessageSchema = {
additionalProperties: false,
};
+const ChatUnpinMessageSchema = {
+ type: 'object',
+ properties: {
+ messageId: {
+ type: 'string',
+ minLength: 1,
+ },
+ },
+ required: ['messageId'],
+ additionalProperties: false,
+};
+
const isChatPinMessageProps = ajv.compile(ChatPinMessageSchema);
-const chatPinMessageEndpoints = API.v1.post(
- 'chat.pinMessage',
- {
- authRequired: true,
- body: isChatPinMessageProps,
- response: {
- 400: validateBadRequestErrorResponse,
- 401: validateUnauthorizedErrorResponse,
- 200: ajv.compile<{ message: IMessage }>({
- type: 'object',
- properties: {
- message: { $ref: '#/components/schemas/IMessage' },
- success: {
- type: 'boolean',
- enum: [true],
+const isChatUnpinMessageProps = ajv.compile(ChatUnpinMessageSchema);
+
+const chatEndpoints = API.v1
+ .post(
+ 'chat.pinMessage',
+ {
+ authRequired: true,
+ body: isChatPinMessageProps,
+ response: {
+ 400: validateBadRequestErrorResponse,
+ 401: validateUnauthorizedErrorResponse,
+ 200: ajv.compile<{ message: IMessage }>({
+ type: 'object',
+ properties: {
+ message: { $ref: '#/components/schemas/IMessage' },
+ success: {
+ type: 'boolean',
+ enum: [true],
+ },
},
- },
- required: ['message', 'success'],
- additionalProperties: false,
- }),
+ required: ['message', 'success'],
+ additionalProperties: false,
+ }),
+ },
},
- },
- async function action() {
- const msg = await Messages.findOneById(this.bodyParams.messageId);
+ async function action() {
+ const msg = await Messages.findOneById(this.bodyParams.messageId);
- if (!msg) {
- throw new Meteor.Error('error-message-not-found', 'The provided "messageId" does not match any existing message.');
- }
+ if (!msg) {
+ throw new Meteor.Error('error-message-not-found', 'The provided "messageId" does not match any existing message.');
+ }
- const pinnedMessage = await pinMessage(msg, this.userId);
+ const pinnedMessage = await pinMessage(msg, this.userId);
- const [message] = await normalizeMessagesForUser([pinnedMessage], this.userId);
+ const [message] = await normalizeMessagesForUser([pinnedMessage], this.userId);
- return API.v1.success({
- message,
- });
- },
-);
+ return API.v1.success({
+ message,
+ });
+ },
+ )
+ .post(
+ 'chat.unPinMessage',
+ {
+ authRequired: true,
+ body: isChatUnpinMessageProps,
+ response: {
+ 400: validateBadRequestErrorResponse,
+ 401: validateUnauthorizedErrorResponse,
+ 200: ajv.compile({
+ type: 'object',
+ properties: {
+ success: {
+ type: 'boolean',
+ enum: [true],
+ },
+ },
+ required: ['success'],
+ additionalProperties: false,
+ }),
+ },
+ },
+
+ async function action() {
+ const msg = await Messages.findOneById(this.bodyParams.messageId);
+
+ if (!msg) {
+ throw new Meteor.Error('error-message-not-found', 'The provided "messageId" does not match any existing message.');
+ }
+
+ await unpinMessage(this.userId, msg);
+
+ return API.v1.success();
+ },
+ );
API.v1.addRoute(
'chat.postMessage',
@@ -347,24 +399,6 @@ API.v1.addRoute(
},
);
-API.v1.addRoute(
- 'chat.unPinMessage',
- { authRequired: true, validateParams: isChatUnpinMessageProps },
- {
- async post() {
- const msg = await Messages.findOneById(this.bodyParams.messageId);
-
- if (!msg) {
- throw new Meteor.Error('error-message-not-found', 'The provided "messageId" does not match any existing message.');
- }
-
- await unpinMessage(this.userId, msg);
-
- return API.v1.success();
- },
- },
-);
-
API.v1.addRoute(
'chat.unStarMessage',
{ authRequired: true, validateParams: isChatUnstarMessageProps },
@@ -884,11 +918,9 @@ API.v1.addRoute(
},
);
-type ChatPinMessageEndpoints = ExtractRoutesFromAPI;
-
-export type ChatEndpoints = ChatPinMessageEndpoints;
+export type ChatEndpoints = ExtractRoutesFromAPI;
declare module '@rocket.chat/rest-typings' {
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface
- interface Endpoints extends ChatPinMessageEndpoints {}
+ interface Endpoints extends ChatEndpoints {}
}
diff --git a/packages/rest-typings/src/v1/chat.ts b/packages/rest-typings/src/v1/chat.ts
index 9f0052c26e997..c73aba40d1d48 100644
--- a/packages/rest-typings/src/v1/chat.ts
+++ b/packages/rest-typings/src/v1/chat.ts
@@ -175,24 +175,6 @@ const ChatUnstarMessageSchema = {
export const isChatUnstarMessageProps = ajv.compile(ChatUnstarMessageSchema);
-type ChatUnpinMessage = {
- messageId: IMessage['_id'];
-};
-
-const ChatUnpinMessageSchema = {
- type: 'object',
- properties: {
- messageId: {
- type: 'string',
- minLength: 1,
- },
- },
- required: ['messageId'],
- additionalProperties: false,
-};
-
-export const isChatUnpinMessageProps = ajv.compile(ChatUnpinMessageSchema);
-
type ChatGetDiscussions = PaginatedRequest<{
roomId: IRoom['_id'];
text?: string;
@@ -934,9 +916,6 @@ export type ChatEndpoints = {
'/v1/chat.unStarMessage': {
POST: (params: ChatUnstarMessage) => void;
};
- '/v1/chat.unPinMessage': {
- POST: (params: ChatUnpinMessage) => void;
- };
'/v1/chat.reportMessage': {
POST: (params: ChatReportMessage) => void;
};
From cad0688f6399ec1665bdf338b41526e44106de8a Mon Sep 17 00:00:00 2001
From: Douglas Fabris
Date: Mon, 25 Aug 2025 15:47:43 -0300
Subject: [PATCH 013/197] fix: Discussions list not being scrollable (#36780)
---
.changeset/quiet-spoons-lick.md | 5 +++++
.../views/room/contextualBar/Discussions/DiscussionsList.tsx | 1 -
2 files changed, 5 insertions(+), 1 deletion(-)
create mode 100644 .changeset/quiet-spoons-lick.md
diff --git a/.changeset/quiet-spoons-lick.md b/.changeset/quiet-spoons-lick.md
new file mode 100644
index 0000000000000..14a08d72a9281
--- /dev/null
+++ b/.changeset/quiet-spoons-lick.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Fixes an issue where isn't possible to scroll the discussion list
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
index db4519baf1b0f..b60ae8127cfb1 100644
--- a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
+++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx
@@ -93,7 +93,6 @@ function DiscussionsList({
style={{
height: blockSize,
width: inlineSize,
- overflow: 'hidden',
}}
totalCount={total}
endReached={loading ? () => undefined : (start) => loadMoreItems(start, Math.min(50, total - start))}
From 3e177dbd0b65d70bce8587287ba73b30170eb0f7 Mon Sep 17 00:00:00 2001
From: Lucas Pelegrino
Date: Tue, 26 Aug 2025 13:12:24 -0300
Subject: [PATCH 014/197] feat: adds new endpoint to disable Contacts by id
(#36589)
Co-authored-by: Kevin Aleman <11577696+KevLehman@users.noreply.github.com>
---
.changeset/five-carpets-perform.md | 9 ++
.../server/constant/permissions.ts | 4 +
.../app/livechat/server/api/v1/contact.ts | 43 +++++++
.../server/lib/contacts/disableContact.ts | 23 ++++
apps/meteor/app/livechat/server/lib/guests.ts | 2 +-
.../tests/end-to-end/api/livechat/contacts.ts | 99 +++++++++++++++++
.../server/lib/disableContact.spec.ts | 105 ++++++++++++++++++
packages/i18n/src/locales/en.i18n.json | 1 +
.../src/models/ILivechatContactsModel.ts | 1 +
.../src/models/ILivechatRoomsModel.ts | 1 +
.../models/src/models/LivechatContacts.ts | 18 +++
packages/models/src/models/LivechatRooms.ts | 4 +
packages/rest-typings/src/v1/omnichannel.ts | 30 +++++
13 files changed, 339 insertions(+), 1 deletion(-)
create mode 100644 .changeset/five-carpets-perform.md
create mode 100644 apps/meteor/app/livechat/server/lib/contacts/disableContact.ts
create mode 100644 apps/meteor/tests/unit/app/livechat/server/lib/disableContact.spec.ts
diff --git a/.changeset/five-carpets-perform.md b/.changeset/five-carpets-perform.md
new file mode 100644
index 0000000000000..28763e43e089b
--- /dev/null
+++ b/.changeset/five-carpets-perform.md
@@ -0,0 +1,9 @@
+---
+"@rocket.chat/meteor": minor
+"@rocket.chat/i18n": minor
+"@rocket.chat/model-typings": minor
+"@rocket.chat/models": minor
+"@rocket.chat/rest-typings": minor
+---
+
+Adds new endpoint to disable Livechat Contacts by its id, with a new permission `delete-livechat-contact`.
diff --git a/apps/meteor/app/authorization/server/constant/permissions.ts b/apps/meteor/app/authorization/server/constant/permissions.ts
index 7e01dcb92f9b4..9bf8c84ce5099 100644
--- a/apps/meteor/app/authorization/server/constant/permissions.ts
+++ b/apps/meteor/app/authorization/server/constant/permissions.ts
@@ -106,6 +106,10 @@ export const permissions = [
_id: 'view-livechat-contact',
roles: ['livechat-manager', 'livechat-monitor', 'livechat-agent', 'admin'],
},
+ {
+ _id: 'delete-livechat-contact',
+ roles: ['livechat-manager', 'admin'],
+ },
{
_id: 'view-livechat-contact-history',
roles: ['livechat-manager', 'livechat-monitor', 'livechat-agent', 'admin'],
diff --git a/apps/meteor/app/livechat/server/api/v1/contact.ts b/apps/meteor/app/livechat/server/api/v1/contact.ts
index 76ef84383a157..f5c6fe87f3f39 100644
--- a/apps/meteor/app/livechat/server/api/v1/contact.ts
+++ b/apps/meteor/app/livechat/server/api/v1/contact.ts
@@ -8,6 +8,11 @@ import {
isGETOmnichannelContactsSearchProps,
isGETOmnichannelContactsCheckExistenceProps,
isPOSTOmnichannelContactsConflictsProps,
+ isPOSTOmnichannelContactDeleteProps,
+ POSTOmnichannelContactDeleteSuccessSchema,
+ validateBadRequestErrorResponse,
+ validateUnauthorizedErrorResponse,
+ validateForbiddenErrorResponse,
} from '@rocket.chat/rest-typings';
import { escapeRegExp } from '@rocket.chat/string-helpers';
import { removeEmpty } from '@rocket.chat/tools';
@@ -15,8 +20,10 @@ import { Match, check } from 'meteor/check';
import { Meteor } from 'meteor/meteor';
import { API } from '../../../../api/server';
+import type { ExtractRoutesFromAPI } from '../../../../api/server/ApiClass';
import { getPaginationItems } from '../../../../api/server/helpers/getPaginationItems';
import { createContact } from '../../lib/contacts/createContact';
+import { disableContactById } from '../../lib/contacts/disableContact';
import { getContactChannelsGrouped } from '../../lib/contacts/getContactChannelsGrouped';
import { getContactHistory } from '../../lib/contacts/getContactHistory';
import { getContacts } from '../../lib/contacts/getContacts';
@@ -224,3 +231,39 @@ API.v1.addRoute(
},
},
);
+
+const omnichannelContactsEndpoints = API.v1.post(
+ 'omnichannel/contacts.delete',
+ {
+ response: {
+ 200: POSTOmnichannelContactDeleteSuccessSchema,
+ 400: validateBadRequestErrorResponse,
+ 401: validateUnauthorizedErrorResponse,
+ 403: validateForbiddenErrorResponse,
+ },
+ authRequired: true,
+ permissionsRequired: ['delete-livechat-contact'],
+ body: isPOSTOmnichannelContactDeleteProps,
+ },
+ async function action() {
+ const { contactId } = this.bodyParams;
+
+ try {
+ await disableContactById(contactId);
+ return API.v1.success();
+ } catch (error) {
+ if (!(error instanceof Error)) {
+ return API.v1.failure('error-invalid-contact');
+ }
+
+ return API.v1.failure(error.message);
+ }
+ },
+);
+
+type OmnichannelContactsEndpoints = ExtractRoutesFromAPI;
+
+declare module '@rocket.chat/rest-typings' {
+ // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface
+ interface Endpoints extends OmnichannelContactsEndpoints {}
+}
diff --git a/apps/meteor/app/livechat/server/lib/contacts/disableContact.ts b/apps/meteor/app/livechat/server/lib/contacts/disableContact.ts
new file mode 100644
index 0000000000000..340d34e6906ba
--- /dev/null
+++ b/apps/meteor/app/livechat/server/lib/contacts/disableContact.ts
@@ -0,0 +1,23 @@
+import type { ILivechatContact } from '@rocket.chat/core-typings';
+import { LivechatContacts, LivechatRooms } from '@rocket.chat/models';
+
+import { settings } from '../../../../settings/server';
+import { removeGuest } from '../guests';
+
+export async function disableContactById(contactId: string): Promise {
+ const contact = await LivechatContacts.findOneEnabledById>(contactId);
+ if (!contact) {
+ throw new Error('error-contact-not-found');
+ }
+
+ // Checking if the contact has any open channel/room before removing its data.
+ const contactOpenRooms = await LivechatRooms.checkContactOpenRooms(contactId);
+ if (contactOpenRooms && !settings.get('Livechat_Allow_collect_and_store_HTTP_header_informations')) {
+ throw new Error('error-contact-has-open-rooms');
+ }
+
+ // Cleaning contact/visitor data;
+ await Promise.all(contact.channels.map((channel) => removeGuest({ _id: channel.visitor.visitorId })));
+
+ await LivechatContacts.disableByContactId(contactId);
+}
diff --git a/apps/meteor/app/livechat/server/lib/guests.ts b/apps/meteor/app/livechat/server/lib/guests.ts
index 454dc55d812e4..b4213d8211e91 100644
--- a/apps/meteor/app/livechat/server/lib/guests.ts
+++ b/apps/meteor/app/livechat/server/lib/guests.ts
@@ -74,7 +74,7 @@ export async function saveGuest(
return ret;
}
-async function removeGuest({ _id }: { _id: string }) {
+export async function removeGuest({ _id }: { _id: string }) {
await cleanGuestHistory(_id);
return LivechatVisitors.disableById(_id);
}
diff --git a/apps/meteor/tests/end-to-end/api/livechat/contacts.ts b/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
index a78a07426960a..43ba8f5b67a04 100644
--- a/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
+++ b/apps/meteor/tests/end-to-end/api/livechat/contacts.ts
@@ -1073,6 +1073,105 @@ describe('LIVECHAT - contacts', () => {
});
});
+ describe('[POST] omnichannel/contacts.delete', () => {
+ let contactId: string;
+ let roomId: string;
+
+ const email = faker.internet.email().toLowerCase();
+ const phone = faker.phone.number();
+
+ const contact = {
+ name: faker.person.fullName(),
+ emails: [email],
+ phones: [phone],
+ contactManager: agentUser?._id,
+ };
+
+ before(async () => {
+ await updateSetting('Livechat_Allow_collect_and_store_HTTP_header_informations', true);
+
+ const { body } = await request
+ .post(api('omnichannel/contacts'))
+ .set(credentials)
+ .send({ ...contact });
+ contactId = body.contactId;
+
+ const visitor = await createVisitor(undefined, contact.name, email, phone);
+
+ const room = await createLivechatRoom(visitor.token);
+ roomId = room._id;
+ });
+
+ after(async () => {
+ await closeOmnichannelRoom(roomId);
+ });
+
+ it('should be able to disable a contact by its id', async () => {
+ const response = await request.post(api(`omnichannel/contacts.delete`)).set(credentials).send({ contactId });
+
+ expect(response.status).to.be.equal(200);
+ expect(response.body).to.have.property('success', true);
+ });
+
+ it('should return an error if the contact is not found', async () => {
+ const response = await request.post(api(`omnichannel/contacts.delete`)).set(credentials).send({ contactId });
+
+ expect(response.status).to.be.equal(400);
+ expect(response.body).to.have.property('success', false);
+ expect(response.body.error).to.be.equal('error-contact-not-found');
+ });
+
+ describe('[PERMISSIONS] omnichannel/contacts.delete', () => {
+ before(async () => {
+ await removePermissionFromAllRoles('delete-livechat-contact');
+ });
+
+ after(async () => {
+ await restorePermissionToRoles('delete-livechat-contact');
+ });
+
+ it("should return an error if user doesn't have 'delete-livechat-contact' permission", async () => {
+ const response = await request.post(api(`omnichannel/contacts.delete`)).set(credentials).send({ contactId });
+
+ expect(response.status).to.be.equal(403);
+ expect(response.body).to.have.property('success', false);
+ expect(response.body.error).to.be.equal('User does not have the permissions required for this action [error-unauthorized]');
+ });
+ });
+
+ describe('[GDPR Setting] omnichannel/contacts.delete', () => {
+ before(async () => {
+ await updateSetting('Livechat_Allow_collect_and_store_HTTP_header_informations', false);
+
+ const { body } = await request
+ .post(api('omnichannel/contacts'))
+ .set(credentials)
+ .send({ ...contact });
+ contactId = body.contactId;
+
+ const visitor = await createVisitor(undefined, contact.name, email, phone);
+
+ const room = await createLivechatRoom(visitor.token);
+ roomId = room._id;
+ });
+
+ after(async () => {
+ await updateSetting('Livechat_Allow_collect_and_store_HTTP_header_informations', true);
+ });
+
+ it("should not delete the contact if the GDPR setting isn't enabled and contact has open rooms", async () => {
+ const response = await request.post(api(`omnichannel/contacts.delete`)).set(credentials).send({ contactId });
+
+ expect(response.status).to.be.equal(400);
+ expect(response.body).to.have.property('success', false);
+ expect(response.body.error).to.be.equal('error-contact-has-open-rooms');
+
+ const contactCheck = await request.get(api('omnichannel/contacts.get')).set(credentials).query({ contactId });
+ expect(contactCheck.status).to.be.equal(200);
+ });
+ });
+ });
+
describe('[GET] omnichannel/contacts.checkExistence', () => {
let contactId: string;
let roomId: string;
diff --git a/apps/meteor/tests/unit/app/livechat/server/lib/disableContact.spec.ts b/apps/meteor/tests/unit/app/livechat/server/lib/disableContact.spec.ts
new file mode 100644
index 0000000000000..aca864f9aeb67
--- /dev/null
+++ b/apps/meteor/tests/unit/app/livechat/server/lib/disableContact.spec.ts
@@ -0,0 +1,105 @@
+import { expect } from 'chai';
+import proxyquire from 'proxyquire';
+import sinon from 'sinon';
+
+const modelsMock = {
+ LivechatContacts: {
+ findOneEnabledById: sinon.stub(),
+ disableByContactId: sinon.stub(),
+ },
+ LivechatRooms: {
+ checkContactOpenRooms: sinon.stub(),
+ },
+};
+
+const settingsMock = {
+ get: sinon.stub(),
+};
+
+const removeGuestMock = { removeGuest: sinon.stub() };
+
+const { disableContactById } = proxyquire.noCallThru().load('../../../../../../app/livechat/server/lib/contacts/disableContact.ts', {
+ '@rocket.chat/models': modelsMock,
+ '../guests': removeGuestMock,
+ '../../../../settings/server': { settings: settingsMock },
+});
+
+describe('disableContact', () => {
+ const contact = {
+ _id: 'contact-id',
+ channels: [
+ {
+ visitor: {
+ visitorId: 'visitor-id',
+ },
+ },
+ ],
+ };
+
+ beforeEach(() => {
+ modelsMock.LivechatContacts.findOneEnabledById.reset();
+ modelsMock.LivechatRooms.checkContactOpenRooms.reset();
+ modelsMock.LivechatContacts.disableByContactId.reset();
+ settingsMock.get.reset();
+ removeGuestMock.removeGuest.reset();
+ });
+
+ it('should disable the contact', async () => {
+ settingsMock.get.withArgs('Livechat_Allow_collect_and_store_HTTP_header_informations').returns(true);
+ modelsMock.LivechatContacts.findOneEnabledById.resolves(contact);
+ modelsMock.LivechatRooms.checkContactOpenRooms.resolves(null);
+ removeGuestMock.removeGuest.resolves();
+ modelsMock.LivechatContacts.disableByContactId.resolves();
+
+ await disableContactById(contact._id);
+
+ expect(modelsMock.LivechatContacts.findOneEnabledById.calledOnceWith(contact._id)).to.be.true;
+ expect(modelsMock.LivechatRooms.checkContactOpenRooms.calledOnceWith(contact._id)).to.be.true;
+ expect(removeGuestMock.removeGuest.calledOnceWith({ _id: 'visitor-id' })).to.be.true;
+ expect(modelsMock.LivechatContacts.disableByContactId.calledOnceWith(contact._id)).to.be.true;
+ });
+
+ it('should call removeGuest for each channel the contact has communicated from', async () => {
+ contact.channels.push({ visitor: { visitorId: 'visitor-id-2' } });
+
+ settingsMock.get.withArgs('Livechat_Allow_collect_and_store_HTTP_header_informations').returns(true);
+ modelsMock.LivechatContacts.findOneEnabledById.resolves(contact);
+ modelsMock.LivechatRooms.checkContactOpenRooms.resolves(null);
+ removeGuestMock.removeGuest.resolves();
+ modelsMock.LivechatContacts.disableByContactId.resolves();
+
+ await disableContactById(contact._id);
+
+ expect(modelsMock.LivechatContacts.findOneEnabledById.calledOnceWith(contact._id)).to.be.true;
+ expect(modelsMock.LivechatContacts.findOneEnabledById.calledOnceWith(contact._id)).to.be.true;
+ expect(modelsMock.LivechatRooms.checkContactOpenRooms.calledOnceWith(contact._id)).to.be.true;
+ expect(removeGuestMock.removeGuest.calledTwice).to.be.true;
+ expect(removeGuestMock.removeGuest.getCall(0).args[0]).to.deep.equal({ _id: 'visitor-id' });
+ expect(removeGuestMock.removeGuest.getCall(1).args[0]).to.deep.equal({ _id: 'visitor-id-2' });
+ expect(modelsMock.LivechatContacts.disableByContactId.calledOnceWith(contact._id)).to.be.true;
+ });
+
+ it('should throw error if contact is not found', async () => {
+ modelsMock.LivechatContacts.findOneEnabledById.resolves(null);
+
+ await expect(disableContactById('nonexistent-contact-id')).to.be.rejectedWith('error-contact-not-found');
+
+ expect(modelsMock.LivechatContacts.findOneEnabledById.calledOnceWith('nonexistent-contact-id')).to.be.true;
+ expect(modelsMock.LivechatRooms.checkContactOpenRooms.notCalled).to.be.true;
+ expect(removeGuestMock.removeGuest.notCalled).to.be.true;
+ expect(modelsMock.LivechatContacts.disableByContactId.notCalled).to.be.true;
+ });
+
+ it('should throw error if contact has open rooms and GDPR is disabled', async () => {
+ settingsMock.get.withArgs('Livechat_Allow_collect_and_store_HTTP_header_informations').returns(false);
+ modelsMock.LivechatContacts.findOneEnabledById.resolves(contact);
+ modelsMock.LivechatRooms.checkContactOpenRooms.resolves({ _id: 'room-id' });
+ modelsMock.LivechatContacts.disableByContactId.resolves();
+
+ await expect(disableContactById(contact._id)).to.be.rejectedWith('error-contact-has-open-rooms');
+
+ expect(modelsMock.LivechatRooms.checkContactOpenRooms.calledOnceWith(contact._id)).to.be.true;
+ expect(removeGuestMock.removeGuest.notCalled).to.be.true;
+ expect(modelsMock.LivechatContacts.disableByContactId.notCalled).to.be.true;
+ });
+});
diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json
index 8c2f9ca1bf33b..6a397bad2a688 100644
--- a/packages/i18n/src/locales/en.i18n.json
+++ b/packages/i18n/src/locales/en.i18n.json
@@ -5981,6 +5981,7 @@
"delete-team_description": "Permission to delete teams",
"delete-user": "Delete User",
"delete-user_description": "Permission to delete users",
+ "delete-livechat-contact": "Delete Omnichannel Contact",
"different_values_found": "{{number}} different values found",
"disabled": "disabled",
"discussion-created": "{{message}}",
diff --git a/packages/model-typings/src/models/ILivechatContactsModel.ts b/packages/model-typings/src/models/ILivechatContactsModel.ts
index 237ad953d8a51..5d6069c03a2d6 100644
--- a/packages/model-typings/src/models/ILivechatContactsModel.ts
+++ b/packages/model-typings/src/models/ILivechatContactsModel.ts
@@ -71,6 +71,7 @@ export interface ILivechatContactsModel extends IBaseModel {
getStatistics(): AggregationCursor<{ totalConflicts: number; avgChannelsPerContact: number }>;
updateByVisitorId(visitorId: string, update: UpdateFilter, options?: UpdateOptions): Promise;
disableByVisitorId(visitorId: string): Promise;
+ disableByContactId(contactId: string): Promise;
findOneEnabledById(_id: ILivechatContact['_id'], options?: FindOptions): Promise;
findOneEnabledById(_id: P['_id'], options?: FindOptions
): Promise
;
findOneEnabledById(_id: ILivechatContact['_id'], options?: any): Promise;
diff --git a/packages/model-typings/src/models/ILivechatRoomsModel.ts b/packages/model-typings/src/models/ILivechatRoomsModel.ts
index 47d38e0e30769..d159e5307aa41 100644
--- a/packages/model-typings/src/models/ILivechatRoomsModel.ts
+++ b/packages/model-typings/src/models/ILivechatRoomsModel.ts
@@ -294,4 +294,5 @@ export interface ILivechatRoomsModel extends IBaseModel {
contact: Partial>,
): Promise;
findOpenByContactId(contactId: ILivechatContact['_id'], options?: FindOptions): FindCursor;
+ checkContactOpenRooms(contactId: ILivechatContact['_id']): Promise;
}
diff --git a/packages/models/src/models/LivechatContacts.ts b/packages/models/src/models/LivechatContacts.ts
index c1e0c47098fa7..f5c0b605deea9 100644
--- a/packages/models/src/models/LivechatContacts.ts
+++ b/packages/models/src/models/LivechatContacts.ts
@@ -331,6 +331,24 @@ export class LivechatContactsRaw extends BaseRaw implements IL
);
}
+ disableByContactId(contactId: string): Promise {
+ return this.updateOne(
+ { _id: contactId },
+ {
+ $set: { enabled: false },
+ $unset: {
+ emails: 1,
+ customFields: 1,
+ lastChat: 1,
+ channels: 1,
+ name: 1,
+ phones: 1,
+ conflictingFields: 1,
+ },
+ },
+ );
+ }
+
async addEmail(contactId: string, email: string): Promise {
const updatedContact = await this.findOneAndUpdate({ _id: contactId }, { $addToSet: { emails: { address: email } } });
diff --git a/packages/models/src/models/LivechatRooms.ts b/packages/models/src/models/LivechatRooms.ts
index e9fdef490b1cc..2f0a28eae808b 100644
--- a/packages/models/src/models/LivechatRooms.ts
+++ b/packages/models/src/models/LivechatRooms.ts
@@ -2808,4 +2808,8 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive
findOpenByContactId(contactId: ILivechatContact['_id'], options?: FindOptions): FindCursor {
return this.find({ open: true, contactId }, options);
}
+
+ checkContactOpenRooms(contactId: ILivechatContact['_id']): Promise {
+ return this.findOne({ contactId, open: true }, { projection: { _id: 1 } });
+ }
}
diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts
index c51c7f6134c04..551c32903040c 100644
--- a/packages/rest-typings/src/v1/omnichannel.ts
+++ b/packages/rest-typings/src/v1/omnichannel.ts
@@ -1389,6 +1389,36 @@ const POSTUpdateOmnichannelContactsSchema = {
export const isPOSTUpdateOmnichannelContactsProps = ajv.compile(POSTUpdateOmnichannelContactsSchema);
+type POSTOmnichannelContactDeleteProps = {
+ contactId: string;
+};
+
+const POSTOmnichannelContactDeleteSchema = {
+ type: 'object',
+ properties: {
+ contactId: {
+ type: 'string',
+ },
+ },
+ required: ['contactId'],
+ additionalProperties: false,
+};
+
+export const isPOSTOmnichannelContactDeleteProps = ajv.compile(POSTOmnichannelContactDeleteSchema);
+
+const POSTOmnichannelContactDeleteSuccess = {
+ type: 'object',
+ properties: {
+ success: {
+ type: 'boolean',
+ enum: [true],
+ },
+ },
+ additionalProperties: false,
+};
+
+export const POSTOmnichannelContactDeleteSuccessSchema = ajv.compile(POSTOmnichannelContactDeleteSuccess);
+
type POSTOmnichannelContactsConflictsProps = {
contactId: string;
name?: string;
From a6bb80eb64de88e527be60281c6e7c826f7bf76c Mon Sep 17 00:00:00 2001
From: Douglas Fabris
Date: Tue, 26 Aug 2025 15:06:06 -0300
Subject: [PATCH 015/197] fix: Default priorities name not being translated in
list (#36776)
---
.changeset/slow-ants-divide.md | 5 +++++
.../meteor/client/omnichannel/priorities/PrioritiesTable.tsx | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 .changeset/slow-ants-divide.md
diff --git a/.changeset/slow-ants-divide.md b/.changeset/slow-ants-divide.md
new file mode 100644
index 0000000000000..7986d8e81e5d3
--- /dev/null
+++ b/.changeset/slow-ants-divide.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': patch
+---
+
+Fixes an issue where the omnichannel default priorities are not being translated
diff --git a/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx b/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
index 119e586e64610..cc8311a4189a8 100644
--- a/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
+++ b/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
@@ -52,7 +52,7 @@ export const PrioritiesTable = ({ priorities, onRowClick, isLoading }: Prioritie
- {dirty ? name : i18n}
+ {dirty ? name : t(i18n)}
))}
From 2f66a5731c76ed798f4a80c3434a41e937935e81 Mon Sep 17 00:00:00 2001
From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com>
Date: Tue, 26 Aug 2025 22:13:43 +0000
Subject: [PATCH 016/197] =?UTF-8?q?i18n:=20Rocket.Chat=20language=20update?=
=?UTF-8?q?=20from=20Lingohub=20=F0=9F=A4=96=20on=202025-08-25Z=20(#36784)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Tasso Evangelista <2263066+tassoevan@users.noreply.github.com>
Co-authored-by: Douglas Fabris <27704687+dougfabris@users.noreply.github.com>
---
packages/i18n/src/locales/ar.i18n.json | 2 +-
packages/i18n/src/locales/ca.i18n.json | 2 +-
packages/i18n/src/locales/cs.i18n.json | 2 +-
packages/i18n/src/locales/da.i18n.json | 2 +-
packages/i18n/src/locales/de.i18n.json | 2 +-
packages/i18n/src/locales/en.i18n.json | 4 ++--
packages/i18n/src/locales/es.i18n.json | 6 +++++-
packages/i18n/src/locales/et.i18n.json | 2 +-
packages/i18n/src/locales/fa.i18n.json | 2 +-
packages/i18n/src/locales/fi.i18n.json | 2 +-
packages/i18n/src/locales/fr.i18n.json | 2 +-
packages/i18n/src/locales/hi-IN.i18n.json | 7 +++++--
packages/i18n/src/locales/hu.i18n.json | 2 +-
packages/i18n/src/locales/id.i18n.json | 4 +++-
packages/i18n/src/locales/it.i18n.json | 2 +-
packages/i18n/src/locales/ja.i18n.json | 12 +++++++++---
packages/i18n/src/locales/ka-GE.i18n.json | 2 +-
packages/i18n/src/locales/ko.i18n.json | 16 ++++++++++++----
packages/i18n/src/locales/ms-MY.i18n.json | 4 +++-
packages/i18n/src/locales/nb.i18n.json | 15 ++++++++++++++-
packages/i18n/src/locales/nl.i18n.json | 2 +-
packages/i18n/src/locales/nn.i18n.json | 2 +-
packages/i18n/src/locales/pl.i18n.json | 2 +-
packages/i18n/src/locales/pt-BR.i18n.json | 2 +-
packages/i18n/src/locales/ru.i18n.json | 2 +-
packages/i18n/src/locales/sv.i18n.json | 2 +-
packages/i18n/src/locales/tr.i18n.json | 2 +-
packages/i18n/src/locales/uk.i18n.json | 2 +-
packages/i18n/src/locales/vi-VN.i18n.json | 4 +++-
packages/i18n/src/locales/zh-TW.i18n.json | 12 +++++++++---
packages/i18n/src/locales/zh.i18n.json | 8 ++++++--
packages/omni-core/package.json | 3 ---
yarn.lock | 5 +++++
33 files changed, 96 insertions(+), 44 deletions(-)
diff --git a/packages/i18n/src/locales/ar.i18n.json b/packages/i18n/src/locales/ar.i18n.json
index 7b7a3d9e751f4..52d9ec2e248de 100644
--- a/packages/i18n/src/locales/ar.i18n.json
+++ b/packages/i18n/src/locales/ar.i18n.json
@@ -4900,4 +4900,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "ستتم إزالة {{count}} من الغرف الفارغة تلقائيًا:
{{rooms}}",
"__username__is_no_longer__role__defined_by__user_by_": "لم يعد {{username}} في دور {{role}} من قِبل {{user_by}}",
"__username__was_set__role__by__user_by_": "تم تعيين {{username}} في دور {{role}} من قِبل {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/ca.i18n.json b/packages/i18n/src/locales/ca.i18n.json
index e5f71db1601a9..d6990da1ce756 100644
--- a/packages/i18n/src/locales/ca.i18n.json
+++ b/packages/i18n/src/locales/ca.i18n.json
@@ -4688,4 +4688,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} sales buides seran eliminades automàticament:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ja no és {{role}} (per {{user_by}})",
"__username__was_set__role__by__user_by_": "Ara {{username}} és {{role}} (per {{user_by}})"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/cs.i18n.json b/packages/i18n/src/locales/cs.i18n.json
index 205b2e1960d2c..19d9c454f7ec3 100644
--- a/packages/i18n/src/locales/cs.i18n.json
+++ b/packages/i18n/src/locales/cs.i18n.json
@@ -3973,4 +3973,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} prázdných místností bude automaticky odstraněno:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} již není {{role}} (odebral/a {{user_by}} )",
"__username__was_set__role__by__user_by_": "{{username}} je nyní {{role}} (nastavil/a {{user_by}})"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/da.i18n.json b/packages/i18n/src/locales/da.i18n.json
index c04c355fd2748..8e7b24b7a911c 100644
--- a/packages/i18n/src/locales/da.i18n.json
+++ b/packages/i18n/src/locales/da.i18n.json
@@ -4087,4 +4087,4 @@
},
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} is no longer {{role}} by {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} was set {{role}} by {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/de.i18n.json b/packages/i18n/src/locales/de.i18n.json
index bdba091fb3b11..2543881ad4371 100644
--- a/packages/i18n/src/locales/de.i18n.json
+++ b/packages/i18n/src/locales/de.i18n.json
@@ -5530,4 +5530,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ist nicht länger {{role}}, geändert durch {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} ist jetzt {{role}}, geändert durch {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} Mitglieder werden eingeladen"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json
index 6a397bad2a688..dd5067e41c1e8 100644
--- a/packages/i18n/src/locales/en.i18n.json
+++ b/packages/i18n/src/locales/en.i18n.json
@@ -2009,7 +2009,7 @@
"Execute_Synchronization_Now": "Execute Synchronization Now",
"Exit_Full_Screen": "Exit Full Screen",
"Expand": "Expand",
- "Expand_group":"Expand {{group}}",
+ "Expand_group": "Expand {{group}}",
"Expand_all": "Expand all",
"Expand_view": "Expand view",
"Experimental_Feature_Alert": "This is an experimental feature! Please be aware that it may change, break, or even be removed in the future without any notice.",
@@ -6951,4 +6951,4 @@
"__usernames__joined": "{{usernames}} joined",
"__usersCount__joined": "{{count}} joined",
"__usersCount__people_will_be_invited": "{{usersCount}} people will be invited"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/es.i18n.json b/packages/i18n/src/locales/es.i18n.json
index c11cf73a26bee..8d003b78630eb 100644
--- a/packages/i18n/src/locales/es.i18n.json
+++ b/packages/i18n/src/locales/es.i18n.json
@@ -698,7 +698,11 @@
"Caller": "Llamador",
"Caller_Id": "ID de llamador",
"Calling": "Llamando",
- "Calls_in_queue": "{{calls}} llamadas en cola",
+ "Calls_in_queue": {
+ "one": "{{calls}} llamada en cola",
+ "many": "{{calls}} llamadas en cola",
+ "other": "{{calls}} llamadas en cola"
+ },
"Cancel": "Cancelar",
"Cancel_message_input": "Cancelar",
"Canceled": "Cancelado",
diff --git a/packages/i18n/src/locales/et.i18n.json b/packages/i18n/src/locales/et.i18n.json
index 55a4e574e470e..58504dbd6cb2d 100644
--- a/packages/i18n/src/locales/et.i18n.json
+++ b/packages/i18n/src/locales/et.i18n.json
@@ -78,4 +78,4 @@
"meteor_status_waiting": "Ootan serveriga ühendust,",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ei ole enam {{role}} poolt {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} määrati {{role}} poolt {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/fa.i18n.json b/packages/i18n/src/locales/fa.i18n.json
index ec1820c268c5e..55413cbe359b9 100644
--- a/packages/i18n/src/locales/fa.i18n.json
+++ b/packages/i18n/src/locales/fa.i18n.json
@@ -3117,4 +3117,4 @@
"__roomName__was_added_to_favorites": "{{roomName}} به موارد دلخواه اضافه شد",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} دیگر توسط {{user_by}} {{role}} نمی شود",
"__username__was_set__role__by__user_by_": "{{username}} توسط {{user_by}} به عنوان {{role}} تعیین شد"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/fi.i18n.json b/packages/i18n/src/locales/fi.i18n.json
index 5a64868dddccd..a462ac9f08911 100644
--- a/packages/i18n/src/locales/fi.i18n.json
+++ b/packages/i18n/src/locales/fi.i18n.json
@@ -5751,4 +5751,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} ei ole enää {{role}} (muutoksen teki {{user_by}})",
"__username__was_set__role__by__user_by_": "{{user_by}} muutti käyttäjän {{username}} rooliksi {{role}} ",
"__usersCount__people_will_be_invited": "{{usersCount}} henkilöä kutsutaan"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/fr.i18n.json b/packages/i18n/src/locales/fr.i18n.json
index d7ad6a3b61db7..cb4d7871bc476 100644
--- a/packages/i18n/src/locales/fr.i18n.json
+++ b/packages/i18n/src/locales/fr.i18n.json
@@ -4897,4 +4897,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salons vides seront supprimés automatiquement :
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{user_by}} a retiré le rôle {{role}} à {{username}}",
"__username__was_set__role__by__user_by_": "{{user_by}} a donné le rôle {{role}} à {{username}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/hi-IN.i18n.json b/packages/i18n/src/locales/hi-IN.i18n.json
index 1a7aeb1e289b1..d638460d598d8 100644
--- a/packages/i18n/src/locales/hi-IN.i18n.json
+++ b/packages/i18n/src/locales/hi-IN.i18n.json
@@ -825,7 +825,10 @@
"Caller_Id": "कॉलर आईडी",
"Calling": "कॉलिंग",
"Calls": "कॉल",
- "Calls_in_queue": "{{calls}} कतार में कॉल करें",
+ "Calls_in_queue": {
+ "one": "कतार में {{calls}} कॉल करें",
+ "other": "{{calls}} कतार में कॉल करें"
+ },
"Cam_off": "कैम बंद",
"Cam_on": "कैम ऑन",
"Camera_access_not_allowed": "कैमरा एक्सेस की अनुमति नहीं थी, कृपया अपनी ब्राउज़र सेटिंग जांचें।",
@@ -6113,4 +6116,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} is no longer {{role}} by {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} was set {{role}} by {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} लोगों को आमंत्रित किया जाएगा"
-}
\ No newline at end of file
+}
diff --git a/packages/i18n/src/locales/hu.i18n.json b/packages/i18n/src/locales/hu.i18n.json
index 1e28e8a6221e8..8fa997c5dd419 100644
--- a/packages/i18n/src/locales/hu.i18n.json
+++ b/packages/i18n/src/locales/hu.i18n.json
@@ -5429,4 +5429,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} többé már nem {{role}} {{user_by}} által",
"__username__was_set__role__by__user_by_": "{{username}} most már {{role}} {{user_by}} által",
"__usersCount__people_will_be_invited": "{{usersCount}} személy lesz meghívva"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/id.i18n.json b/packages/i18n/src/locales/id.i18n.json
index 9c6a3fc4018d0..8d5f28143b1b8 100644
--- a/packages/i18n/src/locales/id.i18n.json
+++ b/packages/i18n/src/locales/id.i18n.json
@@ -2606,7 +2606,9 @@
"meteor_status_connecting": "Menghubungkan...",
"meteor_status_failed": "Koneksi server gagal",
"meteor_status_offline": "Mode luar jaringan.",
- "meteor_status_reconnect_in_other": "mencoba lagi dalam waktu {{count}} detik...",
+ "meteor_status_reconnect_in": {
+ "other": "Mencoba untuk menyambung kembali dalam {{count}} detik"
+ },
"meteor_status_try_now_offline": "Hubungkan lagi",
"meteor_status_try_now_waiting": "Coba sekarang",
"meteor_status_waiting": "Menunggu koneksi server,",
diff --git a/packages/i18n/src/locales/it.i18n.json b/packages/i18n/src/locales/it.i18n.json
index 24913271626c7..bf3d2c754fa3f 100644
--- a/packages/i18n/src/locales/it.i18n.json
+++ b/packages/i18n/src/locales/it.i18n.json
@@ -3427,4 +3427,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} non è più {{role}}, da {{user_by}}",
"__username__was_set__role__by__user_by_": "A {{username}} è stato assegnato il ruolo di {{role}} da {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} persone saranno invitate"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/ja.i18n.json b/packages/i18n/src/locales/ja.i18n.json
index bf605af904271..3e4fc0c32e41c 100644
--- a/packages/i18n/src/locales/ja.i18n.json
+++ b/packages/i18n/src/locales/ja.i18n.json
@@ -688,7 +688,9 @@
"Caller": "発信者",
"Caller_Id": "発信者ID",
"Calling": "通話中",
- "Calls_in_queue": "キュー内の{{count}}通話",
+ "Calls_in_queue": {
+ "other": "キュー内の{{count}}通話"
+ },
"Cancel": "キャンセル",
"Cancel_message_input": "キャンセル",
"Canceled": "キャンセルしました",
@@ -4502,7 +4504,9 @@
"message": "メッセージ",
"message-impersonate": "他のユーザーの偽装",
"message-impersonate_description": "メッセージエイリアスを使用して他のユーザーを偽装する権限",
- "message_counter_other": "{{count}}件のメッセージ",
+ "message_counter": {
+ "other": "{{count}}件のメッセージ"
+ },
"message_pruned": "整理されたメッセージ",
"messages": "メッセージ",
"messages_pruned": "整理されたメッセージ",
@@ -4510,7 +4514,9 @@
"meteor_status_connecting": "接続中...",
"meteor_status_failed": "サーバー接続が失敗しました",
"meteor_status_offline": "オフラインモード。",
- "meteor_status_reconnect_in_other": "{{count}}秒後に再試行します...",
+ "meteor_status_reconnect_in": {
+ "other": "{{count}}秒後に再試行します..."
+ },
"meteor_status_try_now_offline": "再接続",
"meteor_status_try_now_waiting": "今すぐ再試行",
"meteor_status_waiting": "サーバー接続を待機しています。",
diff --git a/packages/i18n/src/locales/ka-GE.i18n.json b/packages/i18n/src/locales/ka-GE.i18n.json
index 9b1d05e7c7eaa..794bc35d383ce 100644
--- a/packages/i18n/src/locales/ka-GE.i18n.json
+++ b/packages/i18n/src/locales/ka-GE.i18n.json
@@ -3692,4 +3692,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} ცარიელი ოთახები ავტომატურად წაიშლება:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}}ჩამეორთვა {{role}} {{user_by}}მიერ",
"__username__was_set__role__by__user_by_": "{{username}} -ს მისცა {{role}} უფლება მომხმარებელმა: {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/ko.i18n.json b/packages/i18n/src/locales/ko.i18n.json
index d56140a07862f..20cbd9d397e81 100644
--- a/packages/i18n/src/locales/ko.i18n.json
+++ b/packages/i18n/src/locales/ko.i18n.json
@@ -3830,7 +3830,9 @@
"mention-here": "여기에 멘션",
"mention-here_description": "@here 멘션 사용 권한",
"message": "메시지",
- "message_counter_other": "{{count}} 메시지",
+ "message_counter": {
+ "other": "{{count}} 메시지"
+ },
"message_pruned": "메시지 정리",
"messages": "메시지",
"messages_pruned": "메시지 정리를 완료했습니다.",
@@ -3838,7 +3840,9 @@
"meteor_status_connecting": "연결중...",
"meteor_status_failed": "서버 연결에 실패했습니다.",
"meteor_status_offline": "오프라인 모드.",
- "meteor_status_reconnect_in_other": "{{count}} 초 후에 다시 시도합니다 ...",
+ "meteor_status_reconnect_in": {
+ "other": "{{count}} 초 후에 다시 시도합니다 ..."
+ },
"meteor_status_try_now_offline": "다시 접속하기",
"meteor_status_try_now_waiting": "지금 시도",
"meteor_status_waiting": "서버 연결을 기다리는 중...",
@@ -4041,8 +4045,12 @@
"__count__conversations__period__": "{{count}} 대화, {{period}}",
"__count__empty_rooms_will_be_removed_automatically": "{{count}} 빈 대화방은 자동으로 제거됩니다.",
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} 빈 대화방은 자동으로 제거됩니다 :
{{rooms}}.",
- "__count__follower_other": "+{{count}} 팔로워",
- "__count__message_pruned_other": "{{count}} 메시지 삭제",
+ "__count__follower": {
+ "other": "+{{count}} 팔로워"
+ },
+ "__count__message_pruned": {
+ "other": "{{count}} 메시지 삭제"
+ },
"__count__replies": "{{count}} 답글",
"__count__replies__date__": "{{count}} 답글, {{date}}",
"__count__tags__and__count__conversations__period__": "{{count}} 태그와 {{conversations}} 대화, {{period}}",
diff --git a/packages/i18n/src/locales/ms-MY.i18n.json b/packages/i18n/src/locales/ms-MY.i18n.json
index 3eb45f8eddb9d..20e7849388013 100644
--- a/packages/i18n/src/locales/ms-MY.i18n.json
+++ b/packages/i18n/src/locales/ms-MY.i18n.json
@@ -2604,7 +2604,9 @@
"meteor_status_connecting": "Menyambung...",
"meteor_status_failed": "Sambungan pelayan gagal",
"meteor_status_offline": "Mod LuarTalian.",
- "meteor_status_reconnect_in_other": "cuba lagi dalam masa {{count}} saat...",
+ "meteor_status_reconnect_in": {
+ "other": "cuba lagi dalam masa {{count}} saat..."
+ },
"meteor_status_try_now_offline": "Sambung semula",
"meteor_status_try_now_waiting": "Cuba sekarang",
"meteor_status_waiting": "Menunggu sambungan pelayan,",
diff --git a/packages/i18n/src/locales/nb.i18n.json b/packages/i18n/src/locales/nb.i18n.json
index 146b9dbc9fd48..264fb42934567 100644
--- a/packages/i18n/src/locales/nb.i18n.json
+++ b/packages/i18n/src/locales/nb.i18n.json
@@ -1089,6 +1089,7 @@
"Collapse": "Kollaps",
"Collapse_all": "Skjul alle",
"Collapse_Embedded_Media_By_Default": "Skjul innebygde medier som standard",
+ "Collapse_group": "Kollaps {{group}}",
"Color": "Farge",
"Colors": "Farger",
"Commands": "Kommandoer",
@@ -1928,6 +1929,8 @@
"End_suspicious_sessions": "Avslutt alle mistenkelige økter",
"Engagement": "Engasjement",
"Engagement_Dashboard": "Engasjement dashbord",
+ "Enhanced_navigation": "Forbedret navigasjon",
+ "Enhanced_navigation_description": "Reduser støyen og øk fokuset ved hjelp av de nye globale topptekst- og sidefeltfiltrene som legger til et sekundært navigasjonslag. Filtrer omtaler, favorittrom og diskusjoner, eller filtrer etter et bestemt rom for å se tilknyttede kanaler og diskusjoner.",
"Enrich_your_workspace": "Berik arbeidsområdet ditt med engasjementsdashbordet. Analyser praktisk bruksstatistikk om dine brukere, meldinger og kanaler. Inkludert i Premium-planer.",
"Ensure_secure_workspace_access": "Sørg for sikker tilgang til arbeidsområdet",
"Enter": "Gå",
@@ -3588,6 +3591,12 @@
"No_channels_in_team": "Ingen kanaler på dette teamet",
"No_channels_yet": "Ingen kanaler ennå",
"No_channels_yet_description": "Kanaler knyttet til denne kontakten vises her.",
+ "No_chats_in_progress": "Ingen pågående chatter",
+ "No_chats_in_progress_description": "Chatter som er tildelt deg, vises her.",
+ "No_chats_in_queue": "Ingen chatter i kø",
+ "No_chats_in_queue_description": "Chatter som står i kø, vises her.",
+ "No_chats_on_hold": "Ingen chatter på vent",
+ "No_chats_on_hold_description": "Chatter på vent vises her.",
"No_chats_yet": "Ingen chatter ennå",
"No_chats_yet_description": "Alle chattene dine vises her.",
"No_contacts_yet": "Ingen kontakter enda",
@@ -3601,6 +3610,8 @@
"No_departments_yet": "Enda ingen avdelinger",
"No_departments_yet_description": "Organiser agenter i avdelinger, angi hvordan supporthenvendelser skal videresendes og overvåk ytelsen deres.",
"No_direct_messages_yet": "Ingen direktemeldinger.",
+ "No_channels_or_discussions": "Ingen kanaler eller diskusjoner",
+ "No_channels_or_discussions_description": "Kanaler og diskusjoner som tilhører dette teamet, vises som hørbare.",
"No_discussions_yet": "Ingen diskusjoner enda",
"No_emojis_found": "Ingen emojier funnet",
"No_feature_to_preview": "Ingen funksjon å forhåndsvise",
@@ -3619,6 +3630,8 @@
"No_marketplace_matches_for": "Ingen markedsplass-treff for",
"No_members_found": "Ingen medlemmer funnet",
"No_mentions_found": "Ingen omtaler funnet",
+ "No_mentions": "Ingen omtaler",
+ "No_mentions_description": "@{username}, @all, @here-nevninger og markerte ord vises her.",
"No_message_reports": "Ingen meldingsrapporter",
"No_messages_found_to_prune": "Ingen meldinger funnet å beskjære",
"No_messages_yet": "Ingen meldinger ennå",
@@ -6910,4 +6923,4 @@
"__usernames__joined": "{{usernames}} ble med",
"__usersCount__joined": "{{count}} ble med",
"__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/nl.i18n.json b/packages/i18n/src/locales/nl.i18n.json
index bf7411124f75e..dd45ee3c5e9e7 100644
--- a/packages/i18n/src/locales/nl.i18n.json
+++ b/packages/i18n/src/locales/nl.i18n.json
@@ -4882,4 +4882,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} lege kamers worden automatisch verwijderd:
{{rooms}}",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} is niet langer {{role}} door {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} werd ingesteld op {{role}} door {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/nn.i18n.json b/packages/i18n/src/locales/nn.i18n.json
index d98bb995d3935..f4fc9f3d98096 100644
--- a/packages/i18n/src/locales/nn.i18n.json
+++ b/packages/i18n/src/locales/nn.i18n.json
@@ -6229,4 +6229,4 @@
"__usernames__joined": "{{usernames}} ble med",
"__usersCount__joined": "{{count}} ble med",
"__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/pl.i18n.json b/packages/i18n/src/locales/pl.i18n.json
index d84fbc9078bd1..f5b943099dcde 100644
--- a/packages/i18n/src/locales/pl.i18n.json
+++ b/packages/i18n/src/locales/pl.i18n.json
@@ -5430,4 +5430,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "Użytkownik {{username}} nie ma już roli {{role}}; zmienił to użytkownik {{user_by}}",
"__username__was_set__role__by__user_by_": "Użytkownik {{username}} otrzymał rolę {{role}} od użytkownika {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} ludzi zostanie zostanie zaproszonych"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json
index 43822ce7cfb49..d21ccb03393b5 100644
--- a/packages/i18n/src/locales/pt-BR.i18n.json
+++ b/packages/i18n/src/locales/pt-BR.i18n.json
@@ -6880,4 +6880,4 @@
"__usernames__joined": "{{usernames}} entraram",
"__usersCount__joined": "{{count}} entraram",
"__usersCount__people_will_be_invited": "{{usersCount}} usuários vão ser convidados"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/ru.i18n.json b/packages/i18n/src/locales/ru.i18n.json
index 780af91b44037..b6d337a8b62d0 100644
--- a/packages/i18n/src/locales/ru.i18n.json
+++ b/packages/i18n/src/locales/ru.i18n.json
@@ -5105,4 +5105,4 @@
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} больше не {{role}} по решению {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} был установлен {{role}} по решению {{user_by}}",
"__usersCount__people_will_be_invited": "{{usersCount}} человек будет приглашено"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json
index 1393a3118b033..4552e05de72ce 100644
--- a/packages/i18n/src/locales/sv.i18n.json
+++ b/packages/i18n/src/locales/sv.i18n.json
@@ -6901,4 +6901,4 @@
"__usernames__joined": "{{usernames}} anslöt",
"__usersCount__joined": "{{count}} anslöt",
"__usersCount__people_will_be_invited": "{{usersCount}} personer bjuds in"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/tr.i18n.json b/packages/i18n/src/locales/tr.i18n.json
index a549db75e32c1..0e156da7fdebc 100644
--- a/packages/i18n/src/locales/tr.i18n.json
+++ b/packages/i18n/src/locales/tr.i18n.json
@@ -3276,4 +3276,4 @@
"your_message_optional": "iletiniz (isteğe bağlı)",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} adlı kullanıcı {{user_by}} tarafından {{role}} rolünden çıkarıldı.",
"__username__was_set__role__by__user_by_": "{{username}} adlı kullanıcı {{user_by}} tarafından {{role}} rolüne atandı."
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/uk.i18n.json b/packages/i18n/src/locales/uk.i18n.json
index d016004e3669c..6fe32c5ed8cd4 100644
--- a/packages/i18n/src/locales/uk.i18n.json
+++ b/packages/i18n/src/locales/uk.i18n.json
@@ -3361,4 +3361,4 @@
"__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} порожні кімнати будуть видалені автоматично:
{{rooms}}.",
"__username__is_no_longer__role__defined_by__user_by_": "{{username}} більше не {{role}}, за рішенням {{user_by}}",
"__username__was_set__role__by__user_by_": "{{username}} був встановлений {{role}} за рішенням {{user_by}}"
-}
+}
\ No newline at end of file
diff --git a/packages/i18n/src/locales/vi-VN.i18n.json b/packages/i18n/src/locales/vi-VN.i18n.json
index 836664692783d..09d49664987aa 100644
--- a/packages/i18n/src/locales/vi-VN.i18n.json
+++ b/packages/i18n/src/locales/vi-VN.i18n.json
@@ -2695,7 +2695,9 @@
"meteor_status_connecting": "Đang kết nối...",
"meteor_status_failed": "Kết nối tới máy chủ thất bại",
"meteor_status_offline": "Chế độ ngoại tuyến.",
- "meteor_status_reconnect_in_other": "Thử kết nối lại trong {{count}} giây...",
+ "meteor_status_reconnect_in": {
+ "other": "Thử kết nối lại trong {{count}} giây..."
+ },
"meteor_status_try_now_offline": "Kết nối lại lần nữa",
"meteor_status_try_now_waiting": "Thử ngay bây giờ",
"meteor_status_waiting": "Đang đợi kết nối tới máy chủ,",
diff --git a/packages/i18n/src/locales/zh-TW.i18n.json b/packages/i18n/src/locales/zh-TW.i18n.json
index 56a923e44e557..96ecd54cd802b 100644
--- a/packages/i18n/src/locales/zh-TW.i18n.json
+++ b/packages/i18n/src/locales/zh-TW.i18n.json
@@ -688,7 +688,9 @@
"Caller": "呼叫者",
"Caller_Id": "通話者 ID",
"Calling": "正在通話",
- "Calls_in_queue": "{{count}} 個通話在佇列中",
+ "Calls_in_queue": {
+ "other": "{{count}} 個通話在佇列中"
+ },
"Cancel": "取消",
"Cancel_message_input": "取消",
"Canceled": "已取消",
@@ -4288,15 +4290,19 @@
"message": "訊息",
"message-impersonate": "冒充其他使用者",
"message-impersonate_description": "允許使用訊息別名模擬其他使用者",
- "message_counter_other": "{{count}} 訊息",
"message_pruned": "訊息已修剪",
+ "message_counter": {
+ "other": "{{count}} 訊息"
+ },
"messages": "訊息",
"messages_pruned": "訊息被修剪",
"meteor_status_connected": "已連線",
"meteor_status_connecting": "連線中...",
"meteor_status_failed": "無法與伺服器連線",
"meteor_status_offline": "離線模式。",
- "meteor_status_reconnect_in_other": "在{{count}}秒鍾後再嘗試...",
+ "meteor_status_reconnect_in": {
+ "other": "在{{count}}秒鍾後再嘗試..."
+ },
"meteor_status_try_now_offline": "重新連線",
"meteor_status_try_now_waiting": "現在再試",
"meteor_status_waiting": "等待與伺服器連線,",
diff --git a/packages/i18n/src/locales/zh.i18n.json b/packages/i18n/src/locales/zh.i18n.json
index 85a91841640cb..adeb5898c08eb 100644
--- a/packages/i18n/src/locales/zh.i18n.json
+++ b/packages/i18n/src/locales/zh.i18n.json
@@ -3926,15 +3926,19 @@
"mention-here": "在此提及",
"mention-here_description": "使用 @here 提及的权限",
"message": "消息",
- "message_counter_other": "{{count}} 消息",
"message_pruned": "已修剪消息",
+ "message_counter": {
+ "other": "{{count}} 消息"
+ },
"messages": "消息",
"messages_pruned": "消息被修剪",
"meteor_status_connected": "已连接",
"meteor_status_connecting": "连接中...",
"meteor_status_failed": "服务器连接失败",
"meteor_status_offline": "离线模式。",
- "meteor_status_reconnect_in_other": "在 {{count}} 秒钟后重试...",
+ "meteor_status_reconnect_in": {
+ "other": "在 {{count}} 秒钟后重试..."
+ },
"meteor_status_try_now_offline": "重新连接",
"meteor_status_try_now_waiting": "立即尝试",
"meteor_status_waiting": "等待服务器连接,",
diff --git a/packages/omni-core/package.json b/packages/omni-core/package.json
index a66939f6fbed7..75941adc90cf4 100644
--- a/packages/omni-core/package.json
+++ b/packages/omni-core/package.json
@@ -32,8 +32,5 @@
"@rocket.chat/models": "workspace:^",
"@rocket.chat/patch-injection": "workspace:^",
"mongodb": "6.10.0"
- },
- "volta": {
- "extends": "../../package.json"
}
}
diff --git a/yarn.lock b/yarn.lock
index 13852e0ff1f2f..c360f95afdab8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8355,14 +8355,18 @@ __metadata:
version: 0.0.0-use.local
resolution: "@rocket.chat/omni-core-ee@workspace:ee/packages/omni-core-ee"
dependencies:
+ "@rocket.chat/core-services": "workspace:^"
"@rocket.chat/eslint-config": "workspace:^"
"@rocket.chat/jest-presets": "workspace:~"
+ "@rocket.chat/logger": "workspace:^"
"@rocket.chat/models": "workspace:^"
"@rocket.chat/omni-core": "workspace:^"
"@rocket.chat/tsconfig": "workspace:*"
"@types/jest": "npm:~30.0.0"
eslint: "npm:~8.45.0"
jest: "npm:~30.0.5"
+ mem: "npm:^8.1.1"
+ mongodb: "npm:6.10.0"
typescript: "npm:~5.9.2"
languageName: unknown
linkType: soft
@@ -8380,6 +8384,7 @@ __metadata:
"@types/jest": "npm:~30.0.0"
eslint: "npm:~8.45.0"
jest: "npm:~30.0.5"
+ mongodb: "npm:6.10.0"
typescript: "npm:~5.9.2"
languageName: unknown
linkType: soft
From e497d94ecece5b60bd882cc76e952bceed41d718 Mon Sep 17 00:00:00 2001
From: Douglas Gubert
Date: Wed, 27 Aug 2025 10:33:53 -0300
Subject: [PATCH 017/197] fix: prevent unhandled promise rejection if app has
compiler error on startup (#36802)
---
.changeset/polite-students-lick.md | 6 ++++++
packages/apps-engine/src/server/AppManager.ts | 4 ++++
2 files changed, 10 insertions(+)
create mode 100644 .changeset/polite-students-lick.md
diff --git a/.changeset/polite-students-lick.md b/.changeset/polite-students-lick.md
new file mode 100644
index 0000000000000..85dfdcf0cb77f
--- /dev/null
+++ b/.changeset/polite-students-lick.md
@@ -0,0 +1,6 @@
+---
+'@rocket.chat/apps-engine': patch
+'@rocket.chat/meteor': patch
+---
+
+Fixes an error on apps loading that would cause an unhandled promise rejection crash during startup in some cases
diff --git a/packages/apps-engine/src/server/AppManager.ts b/packages/apps-engine/src/server/AppManager.ts
index ffedf97e2f224..745aabc6105c7 100644
--- a/packages/apps-engine/src/server/AppManager.ts
+++ b/packages/apps-engine/src/server/AppManager.ts
@@ -281,6 +281,10 @@ export class AppManager {
getStatus() {
return Promise.resolve(AppStatus.COMPILER_ERROR_DISABLED);
},
+
+ on(): void {
+ return undefined;
+ },
} as unknown as DenoRuntimeSubprocessController);
this.apps.set(item.id, prl);
From 4f1e315573524fb257cc39b38d59da8f6f571d66 Mon Sep 17 00:00:00 2001
From: Douglas Fabris
Date: Wed, 27 Aug 2025 12:07:32 -0300
Subject: [PATCH 018/197] test: Omnichannel `PriorityTableRow` unit test
(#36804)
---
.../priorities/PrioritiesTable.tsx | 19 +++++----
.../priorities/PrioritiesTableRow.spec.tsx | 42 +++++++++++++++++++
.../priorities/PrioritiesTableRow.tsx | 28 +++++++++++++
.../src/MockedAppRootBuilder.tsx | 15 +++++++
4 files changed, 95 insertions(+), 9 deletions(-)
create mode 100644 apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.spec.tsx
create mode 100644 apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.tsx
diff --git a/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx b/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
index cc8311a4189a8..a41f3d079b109 100644
--- a/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
+++ b/apps/meteor/client/omnichannel/priorities/PrioritiesTable.tsx
@@ -2,13 +2,11 @@ import type { ILivechatPriority, Serialized } from '@rocket.chat/core-typings';
import type { ReactElement } from 'react';
import { useTranslation } from 'react-i18next';
-import { PriorityIcon } from './PriorityIcon';
+import PrioritiesTableRow from './PrioritiesTableRow';
import GenericNoResults from '../../components/GenericNoResults';
import {
GenericTable,
GenericTableHeaderCell,
- GenericTableCell,
- GenericTableRow,
GenericTableHeader,
GenericTableBody,
GenericTableLoadingTable,
@@ -48,12 +46,15 @@ export const PrioritiesTable = ({ priorities, onRowClick, isLoading }: Prioritie
{headers}
{priorities?.map(({ _id, name, i18n, sortItem, dirty }) => (
- onRowClick(_id)} action qa-row-id={_id}>
-
-
-
- {dirty ? name : t(i18n)}
-
+ onRowClick(_id)}
+ />
))}
diff --git a/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.spec.tsx b/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.spec.tsx
new file mode 100644
index 0000000000000..d4c2a9523ce32
--- /dev/null
+++ b/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.spec.tsx
@@ -0,0 +1,42 @@
+import { mockAppRoot } from '@rocket.chat/mock-providers';
+import { render, screen } from '@testing-library/react';
+
+import PrioritiesTableRow from './PrioritiesTableRow';
+
+const mockedPriority = {
+ id: '1',
+ i18n: 'Highest',
+ sortItem: 1,
+ dirty: false,
+ onClick: jest.fn(),
+};
+
+const defaultContainer = document.body.appendChild(document.createElement('table')).appendChild(document.createElement('tbody'));
+
+test('should match the translation if its the default language', async () => {
+ render(, {
+ container: defaultContainer,
+ wrapper: mockAppRoot()
+ .withDefaultLanguage('en')
+ .withTranslations('en', 'core', {
+ Highest: mockedPriority.i18n,
+ })
+ .build(),
+ });
+
+ expect(screen.queryByRole('table')).toHaveTextContent(mockedPriority.i18n);
+});
+
+test('should not match the defaultText if its not the default language', async () => {
+ render(, {
+ container: defaultContainer,
+ wrapper: mockAppRoot()
+ .withDefaultLanguage('pt-BR')
+ .withTranslations('pt-BR', 'core', {
+ Highest: 'Muito Alta',
+ })
+ .build(),
+ });
+
+ expect(screen.queryByRole('table')).not.toHaveTextContent(mockedPriority.i18n);
+});
diff --git a/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.tsx b/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.tsx
new file mode 100644
index 0000000000000..c25724becbd2f
--- /dev/null
+++ b/apps/meteor/client/omnichannel/priorities/PrioritiesTableRow.tsx
@@ -0,0 +1,28 @@
+import type { LivechatPriorityWeight } from '@rocket.chat/core-typings';
+import { useTranslation } from 'react-i18next';
+
+import { PriorityIcon } from './PriorityIcon';
+import { GenericTableCell, GenericTableRow } from '../../components/GenericTable';
+
+type PrioritiesTableRowProps = {
+ id: string;
+ name?: string;
+ i18n: string;
+ sortItem: LivechatPriorityWeight;
+ dirty: boolean;
+ onClick: () => void;
+};
+
+const PrioritiesTableRow = ({ id, name, i18n, sortItem, dirty, onClick }: PrioritiesTableRowProps) => {
+ const { t } = useTranslation();
+ return (
+
+
+
+
+ {dirty ? name : t(i18n)}
+
+ );
+};
+
+export default PrioritiesTableRow;
diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx
index 7f1b1150a493c..ba08455bc1c15 100644
--- a/packages/mock-providers/src/MockedAppRootBuilder.tsx
+++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx
@@ -554,6 +554,21 @@ export class MockedAppRootBuilder {
return this;
}
+ // Manually changes the language in the i18next instance
+ // To be used with languages other than the default one
+ withDefaultLanguage(lng: string): this {
+ if (this.i18n.isInitialized) {
+ this.i18n.changeLanguage(lng);
+ return this;
+ }
+
+ this.i18n.on('initialized', () => {
+ this.i18n.changeLanguage(lng);
+ });
+
+ return this;
+ }
+
withServerContext(partial: Partial): this {
this.server = { ...this.server, ...partial };
return this;
From 92e30b4c48b4c05e3d7581b1296ffda7bc9632da Mon Sep 17 00:00:00 2001
From: Tiago Evangelista Pinto
Date: Thu, 28 Aug 2025 12:46:57 -0300
Subject: [PATCH 019/197] fix: Resend welcome email without placeholders
(#36772)
---
.changeset/mighty-clouds-run.md | 5 +++
apps/meteor/app/api/server/v1/users.ts | 20 ++++++++-
.../functions/saveUser/sendUserEmail.ts | 6 +--
apps/meteor/server/lib/sendWelcomeEmail.ts | 43 -------------------
4 files changed, 26 insertions(+), 48 deletions(-)
create mode 100644 .changeset/mighty-clouds-run.md
delete mode 100644 apps/meteor/server/lib/sendWelcomeEmail.ts
diff --git a/.changeset/mighty-clouds-run.md b/.changeset/mighty-clouds-run.md
new file mode 100644
index 0000000000000..6b9770e1c386a
--- /dev/null
+++ b/.changeset/mighty-clouds-run.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": patch
+---
+
+Fix issue where resending the welcome email could include unresolved placeholders (e.g., `[name]`, `[email]`).
diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts
index 8051cf8766c9f..b418d555761fd 100644
--- a/apps/meteor/app/api/server/v1/users.ts
+++ b/apps/meteor/app/api/server/v1/users.ts
@@ -32,7 +32,6 @@ import { UserChangedAuditStore } from '../../../../server/lib/auditServerEvents/
import { i18n } from '../../../../server/lib/i18n';
import { removeOtherTokens } from '../../../../server/lib/removeOtherTokens';
import { resetUserE2EEncriptionKey } from '../../../../server/lib/resetUserE2EKey';
-import { sendWelcomeEmail } from '../../../../server/lib/sendWelcomeEmail';
import { registerUser } from '../../../../server/methods/registerUser';
import { requestDataDownload } from '../../../../server/methods/requestDataDownload';
import { resetAvatar } from '../../../../server/methods/resetAvatar';
@@ -56,6 +55,7 @@ import { generateUsernameSuggestion } from '../../../lib/server/functions/getUse
import { saveCustomFields } from '../../../lib/server/functions/saveCustomFields';
import { saveCustomFieldsWithoutValidation } from '../../../lib/server/functions/saveCustomFieldsWithoutValidation';
import { saveUser } from '../../../lib/server/functions/saveUser';
+import { sendWelcomeEmail } from '../../../lib/server/functions/saveUser/sendUserEmail';
import { setStatusText } from '../../../lib/server/functions/setStatusText';
import { setUserAvatar } from '../../../lib/server/functions/setUserAvatar';
import { setUsernameWithValidation } from '../../../lib/server/functions/setUsername';
@@ -66,6 +66,7 @@ import { notifyOnUserChange, notifyOnUserChangeAsync } from '../../../lib/server
import { generateAccessToken } from '../../../lib/server/methods/createToken';
import { deleteUserOwnAccount } from '../../../lib/server/methods/deleteUserOwnAccount';
import { settings } from '../../../settings/server';
+import { isSMTPConfigured } from '../../../utils/server/functions/isSMTPConfigured';
import { getURL } from '../../../utils/server/getURL';
import { API } from '../api';
import { getPaginationItems } from '../helpers/getPaginationItems';
@@ -634,7 +635,22 @@ API.v1.addRoute(
{
async post() {
const { email } = this.bodyParams;
- await sendWelcomeEmail(email);
+
+ if (!isSMTPConfigured()) {
+ throw new MeteorError('error-email-send-failed', 'SMTP is not configured', {
+ method: 'sendWelcomeEmail',
+ });
+ }
+
+ const user = await Users.findOneByEmailAddress(email.trim(), { projection: { name: 1 } });
+
+ if (!user) {
+ throw new MeteorError('error-invalid-user', 'Invalid user', {
+ method: 'sendWelcomeEmail',
+ });
+ }
+
+ await sendWelcomeEmail({ ...user, email });
return API.v1.success();
},
diff --git a/apps/meteor/app/lib/server/functions/saveUser/sendUserEmail.ts b/apps/meteor/app/lib/server/functions/saveUser/sendUserEmail.ts
index cba836cdbf9cb..747f1909d98db 100644
--- a/apps/meteor/app/lib/server/functions/saveUser/sendUserEmail.ts
+++ b/apps/meteor/app/lib/server/functions/saveUser/sendUserEmail.ts
@@ -28,7 +28,7 @@ export async function sendUserEmail(subject: string, html: string, userData: Sav
html,
data: {
email: userData.email,
- password: userData.password,
+ password: userData.password ?? '******',
...(typeof userData.name !== 'undefined' ? { name: userData.name } : {}),
},
};
@@ -45,10 +45,10 @@ export async function sendUserEmail(subject: string, html: string, userData: Sav
}
}
-export async function sendWelcomeEmail(userData: SaveUserData) {
+export async function sendWelcomeEmail(userData: Pick) {
return sendUserEmail(settings.get('Accounts_UserAddedEmail_Subject'), html, userData);
}
-export async function sendPasswordEmail(userData: SaveUserData) {
+export async function sendPasswordEmail(userData: Pick) {
return sendUserEmail(settings.get('Password_Changed_Email_Subject'), passwordChangedHtml, userData);
}
diff --git a/apps/meteor/server/lib/sendWelcomeEmail.ts b/apps/meteor/server/lib/sendWelcomeEmail.ts
deleted file mode 100644
index 3daa8df94555c..0000000000000
--- a/apps/meteor/server/lib/sendWelcomeEmail.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Users } from '@rocket.chat/models';
-import { Meteor } from 'meteor/meteor';
-
-import * as Mailer from '../../app/mailer/server/api';
-import { settings } from '../../app/settings/server';
-import { isSMTPConfigured } from '../../app/utils/server/functions/isSMTPConfigured';
-
-export async function sendWelcomeEmail(to: string): Promise {
- if (!isSMTPConfigured()) {
- throw new Meteor.Error('error-email-send-failed', 'SMTP is not configured', {
- method: 'sendWelcomeEmail',
- });
- }
-
- const email = to.trim();
-
- const user = await Users.findOneByEmailAddress(email, { projection: { _id: 1 } });
-
- if (!user) {
- throw new Meteor.Error('error-invalid-user', 'Invalid user', {
- method: 'sendWelcomeEmail',
- });
- }
-
- try {
- let html = '';
- Mailer.getTemplate('Accounts_UserAddedEmail_Email', (template) => {
- html = template;
- });
-
- await Mailer.send({
- to: email,
- from: settings.get('From_Email'),
- subject: settings.get('Accounts_UserAddedEmail_Subject'),
- html,
- });
- } catch (error: any) {
- throw new Meteor.Error('error-email-send-failed', `Error trying to send email: ${error.message}`, {
- method: 'sendWelcomeEmail',
- message: error.message,
- });
- }
-}
From 3825afa9e4d9f5c3c559c4b1b25191ac8a70bf90 Mon Sep 17 00:00:00 2001
From: Yash Rajpal <58601732+yash-rajpal@users.noreply.github.com>
Date: Thu, 28 Aug 2025 22:08:12 +0530
Subject: [PATCH 020/197] fix: Iframe authentication (#36820)
---
.changeset/green-ants-shop.md | 5 +++++
apps/meteor/client/hooks/iframe/useIframe.ts | 20 ++++++++++++++------
2 files changed, 19 insertions(+), 6 deletions(-)
create mode 100644 .changeset/green-ants-shop.md
diff --git a/.changeset/green-ants-shop.md b/.changeset/green-ants-shop.md
new file mode 100644
index 0000000000000..74a11f9c9e848
--- /dev/null
+++ b/.changeset/green-ants-shop.md
@@ -0,0 +1,5 @@
+---
+'@rocket.chat/meteor': minor
+---
+
+Fixes login using iframe authentication.
diff --git a/apps/meteor/client/hooks/iframe/useIframe.ts b/apps/meteor/client/hooks/iframe/useIframe.ts
index 78677d7c45421..64d2b4aa99f80 100644
--- a/apps/meteor/client/hooks/iframe/useIframe.ts
+++ b/apps/meteor/client/hooks/iframe/useIframe.ts
@@ -1,5 +1,5 @@
import { useLoginWithIframe, useLoginWithToken, useSetting } from '@rocket.chat/ui-contexts';
-import { useCallback, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
export const useIframe = () => {
const [iframeLoginUrl, setIframeLoginUrl] = useState(undefined);
@@ -12,6 +12,8 @@ export const useIframe = () => {
const iframeLogin = useLoginWithIframe();
const tokenLogin = useLoginWithToken();
+ const enabled = Boolean(iframeEnabled && accountIframeUrl && apiUrl && apiMethod);
+
const loginWithToken = useCallback(
(tokenData: string | { loginToken: string } | { token: string }, callback?: (error: Error | null | undefined) => void) => {
if (typeof tokenData === 'string') {
@@ -31,6 +33,10 @@ export const useIframe = () => {
const tryLogin = useCallback(
async (callback?: (error: Error | null | undefined, result: unknown) => void) => {
+ if (!enabled) {
+ return;
+ }
+
let url = accountIframeUrl;
let separator = '?';
if (url.indexOf('?') > -1) {
@@ -43,9 +49,7 @@ export const useIframe = () => {
const result = await fetch(apiUrl, {
method: apiMethod,
- headers: {
- 'Content-Type': 'application/json',
- },
+ headers: undefined,
credentials: 'include',
});
@@ -64,11 +68,15 @@ export const useIframe = () => {
callback?.(error, await result.json());
});
},
- [apiMethod, apiUrl, accountIframeUrl, loginWithToken],
+ [apiMethod, apiUrl, accountIframeUrl, loginWithToken, enabled],
);
+ useEffect(() => {
+ tryLogin();
+ }, [tryLogin]);
+
return {
- enabled: Boolean(iframeEnabled && accountIframeUrl && apiUrl && apiMethod),
+ enabled,
tryLogin,
loginWithToken,
iframeLoginUrl,
From be2d630e888b50b666479d440a0cbc2b1d431074 Mon Sep 17 00:00:00 2001
From: Tiago Evangelista Pinto
Date: Thu, 28 Aug 2025 17:45:32 -0300
Subject: [PATCH 021/197] fix: Intermittent error "Cannot read properties of
undefined" when editing messages (#36745)
Co-authored-by: Tasso Evangelista <2263066+tassoevan@users.noreply.github.com>
---
.changeset/shy-dolphins-share.md | 5 +
apps/meteor/app/ui/client/lib/ChatMessages.ts | 102 +++-----
.../ui/client/lib/CurrentEditingMessage.ts | 114 +++++++++
apps/meteor/client/lib/chats/ChatAPI.ts | 15 +-
.../lib/chats/flows/processMessageEditing.ts | 7 +-
.../lib/chats/flows/processTooLongMessage.ts | 2 +-
.../lib/chats/flows/requestMessageDeletion.ts | 9 +-
.../client/lib/chats/flows/sendMessage.ts | 22 +-
.../room/composer/messageBox/MessageBox.tsx | 8 +-
apps/meteor/tests/e2e/messaging.spec.ts | 228 +++++++++++-------
.../page-objects/fragments/home-content.ts | 14 +-
apps/meteor/tests/e2e/page-objects/index.ts | 1 +
.../meteor/tests/e2e/page-objects/toastBar.ts | 14 ++
13 files changed, 351 insertions(+), 190 deletions(-)
create mode 100644 .changeset/shy-dolphins-share.md
create mode 100644 apps/meteor/app/ui/client/lib/CurrentEditingMessage.ts
diff --git a/.changeset/shy-dolphins-share.md b/.changeset/shy-dolphins-share.md
new file mode 100644
index 0000000000000..d1dea022140ba
--- /dev/null
+++ b/.changeset/shy-dolphins-share.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": patch
+---
+
+Fixes intermittent error "Cannot read properties of undefined" when editing messages
diff --git a/apps/meteor/app/ui/client/lib/ChatMessages.ts b/apps/meteor/app/ui/client/lib/ChatMessages.ts
index a675c413fe18f..0ff51d07eabdd 100644
--- a/apps/meteor/app/ui/client/lib/ChatMessages.ts
+++ b/apps/meteor/app/ui/client/lib/ChatMessages.ts
@@ -2,6 +2,7 @@ import type { IMessage, IRoom, IUser } from '@rocket.chat/core-typings';
import { isVideoConfMessage } from '@rocket.chat/core-typings';
import type { IActionManager } from '@rocket.chat/ui-contexts';
+import { CurrentEditingMessage } from './CurrentEditingMessage';
import { UserAction } from './UserAction';
import type { ChatAPI, ComposerAPI, DataAPI, UploadsAPI } from '../../../../client/lib/chats/ChatAPI';
import { createDataAPI } from '../../../../client/lib/chats/data';
@@ -15,10 +16,7 @@ import { sendMessage } from '../../../../client/lib/chats/flows/sendMessage';
import { uploadFiles } from '../../../../client/lib/chats/flows/uploadFiles';
import { ReadStateManager } from '../../../../client/lib/chats/readStateManager';
import { createUploadsAPI } from '../../../../client/lib/chats/uploads';
-import {
- setHighlightMessage,
- clearHighlightMessage,
-} from '../../../../client/views/room/MessageList/providers/messageHighlightSubscription';
+import { setHighlightMessage } from '../../../../client/views/room/MessageList/providers/messageHighlightSubscription';
type DeepWritable = T extends (...args: any) => any
? T
@@ -29,6 +27,8 @@ type DeepWritable = T extends (...args: any) => any
export class ChatMessages implements ChatAPI {
public uid: string | null;
+ public tmid?: IMessage['_id'];
+
public composer: ComposerAPI | undefined;
public setComposerAPI = (composer?: ComposerAPI): void => {
@@ -38,6 +38,8 @@ export class ChatMessages implements ChatAPI {
public data: DataAPI;
+ public currentEditingMessage: CurrentEditingMessage;
+
public readStateManager: ReadStateManager;
public uploads: UploadsAPI;
@@ -55,15 +57,15 @@ export class ChatMessages implements ChatAPI {
performContinuously(action: 'recording' | 'uploading' | 'playing'): Promise | void;
};
- private currentEditingMID?: string;
-
public messageEditing: ChatAPI['messageEditing'] = {
toPreviousMessage: async () => {
if (!this.composer) {
return;
}
- if (!this.currentEditing) {
+ const mid = this.currentEditingMessage.getMID();
+
+ if (!mid) {
let lastMessage = await this.data.findPreviousOwnMessage();
// Videoconf messages should not be edited
@@ -79,7 +81,7 @@ export class ChatMessages implements ChatAPI {
return;
}
- const currentMessage = await this.data.findMessageByID(this.currentEditing.mid);
+ const currentMessage = await this.data.findMessageByID(mid);
let previousMessage = currentMessage ? await this.data.findPreviousOwnMessage(currentMessage) : undefined;
// Videoconf messages should not be edited
@@ -92,14 +94,17 @@ export class ChatMessages implements ChatAPI {
return;
}
- await this.currentEditing.cancel();
+ await this.currentEditingMessage.cancel();
+ await this.currentEditingMessage.stop();
},
toNextMessage: async () => {
- if (!this.composer || !this.currentEditing) {
+ const mid = this.currentEditingMessage.getMID();
+
+ if (!this.composer || !mid) {
return;
}
- const currentMessage = await this.data.findMessageByID(this.currentEditing.mid);
+ const currentMessage = await this.data.findMessageByID(mid);
let nextMessage = currentMessage ? await this.data.findNextOwnMessage(currentMessage) : undefined;
// Videoconf messages should not be edited
@@ -112,18 +117,19 @@ export class ChatMessages implements ChatAPI {
return;
}
- await this.currentEditing.cancel();
+ await this.currentEditingMessage.cancel();
+ await this.currentEditingMessage.stop();
},
editMessage: async (message: IMessage, { cursorAtStart = false }: { cursorAtStart?: boolean } = {}) => {
const text = (await this.data.getDraft(message._id)) || message.attachments?.[0]?.description || message.msg;
- await this.currentEditing?.stop();
+ await this.currentEditingMessage.stop();
if (!this.composer || !(await this.data.canUpdateMessage(message))) {
return;
}
- this.currentEditingMID = message._id;
+ this.currentEditingMessage.setMID(message._id);
setHighlightMessage(message._id);
this.composer.setEditingMode(true);
@@ -136,19 +142,14 @@ export class ChatMessages implements ChatAPI {
public flows: DeepWritable;
- public constructor(
- private params: {
- rid: IRoom['_id'];
- tmid?: IMessage['_id'];
- uid: IUser['_id'] | null;
- actionManager: IActionManager;
- },
- ) {
+ public constructor(params: { rid: IRoom['_id']; tmid?: IMessage['_id']; uid: IUser['_id'] | null; actionManager: IActionManager }) {
const { rid, tmid } = params;
+ this.tmid = tmid;
this.uid = params.uid;
this.data = createDataAPI({ rid, tmid });
this.uploads = createUploadsAPI({ rid, tmid });
this.ActionManager = params.actionManager;
+ this.currentEditingMessage = new CurrentEditingMessage(this);
const unimplemented = () => {
throw new Error('Flow is not implemented');
@@ -185,60 +186,11 @@ export class ChatMessages implements ChatAPI {
};
}
- public get currentEditing() {
- if (!this.composer || !this.currentEditingMID) {
- return undefined;
- }
-
- return {
- mid: this.currentEditingMID,
- reset: async (): Promise => {
- if (!this.composer || !this.currentEditingMID) {
- return false;
- }
-
- const message = await this.data.findMessageByID(this.currentEditingMID);
- if (this.composer.text !== message?.msg) {
- this.composer.setText(message?.msg ?? '');
- return true;
- }
-
- return false;
- },
- stop: async (): Promise => {
- if (!this.composer || !this.currentEditingMID) {
- return;
- }
-
- const message = await this.data.findMessageByID(this.currentEditingMID);
- const draft = this.composer.text;
-
- if (draft === message?.msg) {
- await this.data.discardDraft(this.currentEditingMID);
- } else {
- await this.data.saveDraft(this.currentEditingMID, (await this.data.getDraft(this.currentEditingMID)) || draft);
- }
-
- this.composer.setEditingMode(false);
- this.currentEditingMID = undefined;
- clearHighlightMessage();
- },
- cancel: async (): Promise => {
- if (!this.currentEditingMID) {
- return;
- }
-
- await this.data.discardDraft(this.currentEditingMID);
- await this.currentEditing?.stop();
- this.composer?.setText((await this.data.getDraft(undefined)) ?? '');
- },
- };
- }
-
public async release() {
- if (this.currentEditing) {
- if (!this.params.tmid) {
- await this.currentEditing.cancel();
+ if (this.currentEditingMessage.getMID()) {
+ if (!this.tmid) {
+ await this.currentEditingMessage.cancel();
+ await this.currentEditingMessage.stop();
}
this.composer?.clear();
}
diff --git a/apps/meteor/app/ui/client/lib/CurrentEditingMessage.ts b/apps/meteor/app/ui/client/lib/CurrentEditingMessage.ts
new file mode 100644
index 0000000000000..f7f958a5f15fd
--- /dev/null
+++ b/apps/meteor/app/ui/client/lib/CurrentEditingMessage.ts
@@ -0,0 +1,114 @@
+import type { ChatAPI } from '../../../../client/lib/chats/ChatAPI';
+import { clearHighlightMessage } from '../../../../client/views/room/MessageList/providers/messageHighlightSubscription';
+
+export class CurrentEditingMessage {
+ private lock = false;
+
+ private mid?: string;
+
+ private queue: {
+ resolve: (release: () => void) => void;
+ }[] = [];
+
+ private chat: ChatAPI;
+
+ constructor(chat: ChatAPI) {
+ this.chat = chat;
+ }
+
+ public reset = async () => {
+ return this.runExclusive(async () => {
+ if (!this.chat.composer || !this.mid) {
+ return false;
+ }
+
+ const message = await this.chat.data.findMessageByID(this.mid);
+
+ if (this.chat.composer.text !== message?.msg) {
+ this.chat.composer.setText(message?.msg ?? '');
+ return true;
+ }
+
+ return false;
+ });
+ };
+
+ public stop = async () => {
+ await this.runExclusive(async () => {
+ if (!this.chat.composer || !this.mid) {
+ return;
+ }
+
+ const message = await this.chat.data.findMessageByID(this.mid);
+ const draft = this.chat.composer.text;
+
+ if (draft === message?.msg) {
+ await this.chat.data.discardDraft(this.mid);
+ } else {
+ await this.chat.data.saveDraft(this.mid, (await this.chat.data.getDraft(this.mid)) || draft);
+ }
+
+ this.chat.composer.setEditingMode(false);
+ this.mid = undefined;
+ clearHighlightMessage();
+ });
+ };
+
+ public cancel = async () => {
+ await this.runExclusive(async () => {
+ if (!this.mid) {
+ return;
+ }
+
+ await this.chat.data.discardDraft(this.mid);
+ this.chat.composer?.setText((await this.chat.data.getDraft(undefined)) ?? '');
+ });
+ };
+
+ private acquire = async () => {
+ return new Promise<() => void>((resolve) => {
+ this.queue.push({ resolve });
+ this.dispatch();
+ });
+ };
+
+ private dispatch() {
+ if (this.lock) {
+ return;
+ }
+
+ const next = this.queue.shift();
+
+ if (!next) {
+ return;
+ }
+
+ this.lock = true;
+ next.resolve(this.buildRelease());
+ }
+
+ private buildRelease = () => {
+ return async () => {
+ this.lock = false;
+ this.dispatch();
+ };
+ };
+
+ public getMID() {
+ return this.mid;
+ }
+
+ public setMID(mid: string) {
+ this.mid = mid;
+ }
+
+ private async runExclusive(callback: () => Promise) {
+ const release = await this.acquire();
+
+ try {
+ return await callback();
+ } finally {
+ release();
+ }
+ }
+}
diff --git a/apps/meteor/client/lib/chats/ChatAPI.ts b/apps/meteor/client/lib/chats/ChatAPI.ts
index f41e9366ceee9..5c341d356995d 100644
--- a/apps/meteor/client/lib/chats/ChatAPI.ts
+++ b/apps/meteor/client/lib/chats/ChatAPI.ts
@@ -118,14 +118,13 @@ export type ChatAPI = {
editMessage(message: IMessage, options?: { cursorAtStart?: boolean }): Promise;
};
- readonly currentEditing:
- | {
- readonly mid: IMessage['_id'];
- reset(): Promise;
- stop(): Promise;
- cancel(): Promise;
- }
- | undefined;
+ readonly currentEditingMessage: {
+ setMID(mid: IMessage['_id']): void;
+ getMID(): string | undefined;
+ reset(): Promise;
+ stop(): Promise;
+ cancel(): Promise;
+ };
readonly emojiPicker: {
open(el: Element, cb: (emoji: string) => void): void;
diff --git a/apps/meteor/client/lib/chats/flows/processMessageEditing.ts b/apps/meteor/client/lib/chats/flows/processMessageEditing.ts
index d152f47f40965..a990d05d4303f 100644
--- a/apps/meteor/client/lib/chats/flows/processMessageEditing.ts
+++ b/apps/meteor/client/lib/chats/flows/processMessageEditing.ts
@@ -9,7 +9,8 @@ export const processMessageEditing = async (
message: Pick & Partial>,
previewUrls?: string[],
): Promise => {
- if (!chat.currentEditing) {
+ const mid = chat.currentEditingMessage.getMID();
+ if (!mid) {
return false;
}
@@ -22,12 +23,12 @@ export const processMessageEditing = async (
}
try {
- await chat.data.updateMessage({ ...message, _id: chat.currentEditing.mid }, previewUrls);
+ await chat.data.updateMessage({ ...message, _id: mid }, previewUrls);
} catch (error) {
dispatchToastMessage({ type: 'error', message: error });
}
- chat.currentEditing.stop();
+ chat.currentEditingMessage.stop();
return true;
};
diff --git a/apps/meteor/client/lib/chats/flows/processTooLongMessage.ts b/apps/meteor/client/lib/chats/flows/processTooLongMessage.ts
index d80b59549efc2..1e09a4c09c14c 100644
--- a/apps/meteor/client/lib/chats/flows/processTooLongMessage.ts
+++ b/apps/meteor/client/lib/chats/flows/processTooLongMessage.ts
@@ -15,7 +15,7 @@ export const processTooLongMessage = async (chat: ChatAPI, { msg }: Pick((resolve, reject) => {
+ const mid = chat.currentEditingMessage.getMID();
const onConfirm = async (): Promise => {
try {
if (!(await chat.data.canDeleteMessage(message))) {
@@ -24,8 +25,8 @@ export const requestMessageDeletion = async (chat: ChatAPI, message: IMessage):
imperativeModal.close();
- if (chat.currentEditing?.mid === message._id) {
- chat.currentEditing.stop();
+ if (mid === message._id) {
+ chat.currentEditingMessage.stop();
}
chat.composer?.focus();
@@ -40,8 +41,8 @@ export const requestMessageDeletion = async (chat: ChatAPI, message: IMessage):
const onCloseModal = async (): Promise => {
imperativeModal.close();
- if (chat.currentEditing?.mid === message._id) {
- chat.currentEditing.stop();
+ if (mid === message._id) {
+ chat.currentEditingMessage.stop();
}
chat.composer?.focus();
diff --git a/apps/meteor/client/lib/chats/flows/sendMessage.ts b/apps/meteor/client/lib/chats/flows/sendMessage.ts
index 0fb16296a8582..d592729e295b6 100644
--- a/apps/meteor/client/lib/chats/flows/sendMessage.ts
+++ b/apps/meteor/client/lib/chats/flows/sendMessage.ts
@@ -11,6 +11,8 @@ import { processSlashCommand } from './processSlashCommand';
import { processTooLongMessage } from './processTooLongMessage';
const process = async (chat: ChatAPI, message: IMessage, previewUrls?: string[], isSlashCommandAllowed?: boolean): Promise => {
+ const mid = chat.currentEditingMessage.getMID();
+
if (await processSetReaction(chat, message)) {
return;
}
@@ -23,7 +25,7 @@ const process = async (chat: ChatAPI, message: IMessage, previewUrls?: string[],
return;
}
- message = (await onClientBeforeSendMessage({ ...message, isEditing: !!chat.currentEditing })) as IMessage & { isEditing?: boolean };
+ message = (await onClientBeforeSendMessage({ ...message, isEditing: !!mid })) as IMessage & { isEditing?: boolean };
// e2e should be a client property only
delete message.e2e;
@@ -57,8 +59,8 @@ export const sendMessage = async (
chat.readStateManager.clearUnreadMark();
text = text.trim();
-
- if (!text && !chat.currentEditing) {
+ const mid = chat.currentEditingMessage.getMID();
+ if (!text && !mid) {
// Nothing to do
return false;
}
@@ -67,11 +69,11 @@ export const sendMessage = async (
const message = await chat.data.composeMessage(text, {
sendToChannel: tshow,
quotedMessages: chat.composer?.quotedMessages.get() ?? [],
- originalMessage: chat.currentEditing ? await chat.data.findMessageByID(chat.currentEditing.mid) : null,
+ originalMessage: mid ? await chat.data.findMessageByID(mid) : null,
});
- if (chat.currentEditing) {
- const originalMessage = await chat.data.findMessageByID(chat.currentEditing.mid);
+ if (mid) {
+ const originalMessage = await chat.data.findMessageByID(mid);
if (
originalMessage?.t === 'e2e' &&
@@ -94,8 +96,8 @@ export const sendMessage = async (
return true;
}
- if (chat.currentEditing) {
- const originalMessage = await chat.data.findMessageByID(chat.currentEditing.mid);
+ if (mid) {
+ const originalMessage = await chat.data.findMessageByID(mid);
if (!originalMessage) {
dispatchToastMessage({ type: 'warning', message: t('Message_not_found') });
@@ -104,11 +106,11 @@ export const sendMessage = async (
try {
if (await chat.flows.processMessageEditing({ ...originalMessage, msg: '' }, previewUrls)) {
- chat.currentEditing.stop();
+ chat.currentEditingMessage.stop();
return false;
}
- await chat.currentEditing?.reset();
+ await chat.currentEditingMessage.reset();
await chat.flows.requestMessageDeletion(originalMessage);
return false;
} catch (error) {
diff --git a/apps/meteor/client/views/room/composer/messageBox/MessageBox.tsx b/apps/meteor/client/views/room/composer/messageBox/MessageBox.tsx
index d633e45134bec..6e29b60b39356 100644
--- a/apps/meteor/client/views/room/composer/messageBox/MessageBox.tsx
+++ b/apps/meteor/client/views/room/composer/messageBox/MessageBox.tsx
@@ -172,13 +172,15 @@ const MessageBox = ({
});
const closeEditing = (event: KeyboardEvent | MouseEvent) => {
- if (chat.currentEditing) {
+ const mid = chat.currentEditingMessage.getMID();
+ if (mid) {
event.preventDefault();
event.stopPropagation();
- chat.currentEditing.reset().then((reset) => {
+ chat.currentEditingMessage.reset().then((reset) => {
if (!reset) {
- chat.currentEditing?.cancel();
+ chat.currentEditingMessage.cancel();
+ chat.currentEditingMessage.stop();
}
});
}
diff --git a/apps/meteor/tests/e2e/messaging.spec.ts b/apps/meteor/tests/e2e/messaging.spec.ts
index e02f5b3bcf11a..b74d78541f6a7 100644
--- a/apps/meteor/tests/e2e/messaging.spec.ts
+++ b/apps/meteor/tests/e2e/messaging.spec.ts
@@ -3,14 +3,15 @@ import type { Page } from '@playwright/test';
import { createAuxContext } from './fixtures/createAuxContext';
import { Users } from './fixtures/userStates';
-import { HomeChannel } from './page-objects';
-import { createTargetChannel } from './utils';
+import { HomeChannel, ToastBar } from './page-objects';
+import { createTargetChannel, deleteChannel } from './utils';
import { expect, test } from './utils/test';
test.use({ storageState: Users.user1.state });
test.describe('Messaging', () => {
let poHomeChannel: HomeChannel;
+ let poToastBar: ToastBar;
let targetChannel: string;
test.beforeAll(async ({ api }) => {
@@ -19,91 +20,108 @@ test.describe('Messaging', () => {
test.beforeEach(async ({ page }) => {
poHomeChannel = new HomeChannel(page);
+ poToastBar = new ToastBar(page);
await page.goto('/home');
});
+ test.afterAll(async ({ api }) => {
+ await deleteChannel(api, targetChannel);
+ });
+
test.describe.serial('Navigation', () => {
test('should navigate on messages using keyboard', async ({ page }) => {
- await poHomeChannel.sidenav.openChat(targetChannel);
- await poHomeChannel.content.sendMessage('msg1');
- await poHomeChannel.content.sendMessage('msg2');
+ await test.step('open chat and send message', async () => {
+ await poHomeChannel.sidenav.openChat(targetChannel);
+ await poHomeChannel.content.sendMessage('msg1');
+ await poHomeChannel.content.sendMessage('msg2');
+ });
- // move focus to the second message
- await page.keyboard.press('Shift+Tab');
- await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ await test.step('move focus to the second message', async () => {
+ await page.keyboard.press('Shift+Tab');
+ await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ });
- // move focus to the first system message
- await page.keyboard.press('ArrowUp');
- await page.keyboard.press('ArrowUp');
- await expect(page.locator('[data-qa="system-message"]').first()).toBeFocused();
+ await test.step('move focus to the first system message', async () => {
+ await page.keyboard.press('ArrowUp');
+ await page.keyboard.press('ArrowUp');
+ await expect(page.locator('[data-qa="system-message"]').first()).toBeFocused();
+ });
- // move focus to the first typed message
- await page.keyboard.press('ArrowDown');
- await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused();
+ await test.step('move focus to the first typed message', async () => {
+ await page.keyboard.press('ArrowDown');
+ await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused();
+ });
- // move focus to the room title
- await page.keyboard.press('Shift+Tab');
- await expect(page.getByRole('button', { name: targetChannel }).first()).toBeFocused();
-
- // refocus on the first typed message
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused();
-
- // move focus to the message toolbar
- await page
- .locator('[data-qa-type="message"]:has-text("msg1")')
- .locator('[role=toolbar][aria-label="Message actions"]')
- .getByRole('button', { name: 'Add reaction' })
- .waitFor();
-
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await expect(
- page
+ await test.step('move focus to the room title', async () => {
+ await page.keyboard.press('Shift+Tab');
+ await expect(page.getByRole('button', { name: targetChannel }).first()).toBeFocused();
+ });
+
+ await test.step('move focus to the channel list', async () => {
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused();
+ });
+
+ await test.step('move focus to the message toolbar', async () => {
+ await page
.locator('[data-qa-type="message"]:has-text("msg1")')
.locator('[role=toolbar][aria-label="Message actions"]')
- .getByRole('button', { name: 'Add reaction' }),
- ).toBeFocused();
-
- // move focus to the composer
- await page.keyboard.press('Tab');
- await page
- .locator('[data-qa-type="message"]:has-text("msg2")')
- .locator('[role=toolbar][aria-label="Message actions"]')
- .getByRole('button', { name: 'Add reaction' })
- .waitFor();
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await expect(poHomeChannel.composer).toBeFocused();
+ .getByRole('button', { name: 'Add reaction' })
+ .waitFor();
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await expect(
+ page
+ .locator('[data-qa-type="message"]:has-text("msg1")')
+ .locator('[role=toolbar][aria-label="Message actions"]')
+ .getByRole('button', { name: 'Add reaction' }),
+ ).toBeFocused();
+ });
+
+ await test.step('move focus to the composer', async () => {
+ await page.keyboard.press('Tab');
+ await page
+ .locator('[data-qa-type="message"]:has-text("msg2")')
+ .locator('[role=toolbar][aria-label="Message actions"]')
+ .getByRole('button', { name: 'Add reaction' })
+ .waitFor();
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await expect(poHomeChannel.composer).toBeFocused();
+ });
});
test('should navigate properly on the user card', async ({ page }) => {
await poHomeChannel.sidenav.openChat(targetChannel);
- // open UserCard
- await page.keyboard.press('Shift+Tab');
- await page.keyboard.press('ArrowUp');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Space');
- await expect(poHomeChannel.userCardToolbar).toBeVisible();
-
- // close UserCard with Esc
- await page.keyboard.press('Escape');
- await expect(poHomeChannel.userCardToolbar).not.toBeVisible();
-
- // with focus restored reopen toolbar
- await page.keyboard.press('Space');
- await expect(poHomeChannel.userCardToolbar).toBeVisible();
-
- // close UserCard with button
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Space');
- await expect(poHomeChannel.userCardToolbar).not.toBeVisible();
+ await test.step('open UserCard', async () => {
+ await page.keyboard.press('Shift+Tab');
+ await page.keyboard.press('ArrowUp');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Space');
+ await expect(poHomeChannel.userCardToolbar).toBeVisible();
+ });
+
+ await test.step('close UserCard with Esc', async () => {
+ await page.keyboard.press('Escape');
+ await expect(poHomeChannel.userCardToolbar).not.toBeVisible();
+ });
+
+ await test.step('with focus restored reopen toolbar', async () => {
+ await page.keyboard.press('Space');
+ await expect(poHomeChannel.userCardToolbar).toBeVisible();
+ });
+
+ await test.step('close UserCard with button', async () => {
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Space');
+ await expect(poHomeChannel.userCardToolbar).not.toBeVisible();
+ });
});
test('should not restore focus on the last focused if it was triggered by click', async ({ page }) => {
@@ -126,19 +144,67 @@ test.describe('Messaging', () => {
await poHomeChannel.sidenav.openChat(targetChannel);
await page.getByRole('button', { name: targetChannel }).first().focus();
- // move focus to the list
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ await test.step('move focus to the list', async () => {
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ });
- await page.getByRole('button', { name: targetChannel }).first().focus();
+ await test.step('move focus to the list again', async () => {
+ await page.getByRole('button', { name: targetChannel }).first().focus();
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await page.keyboard.press('Tab');
+ await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ });
+ });
+ });
- // move focus to the list again
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await page.keyboard.press('Tab');
- await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused();
+ test.describe.serial('Message edition', () => {
+ test('should edit messages', async ({ page }) => {
+ await poHomeChannel.sidenav.openChat(targetChannel);
+
+ await test.step('focus on the second message', async () => {
+ await page.keyboard.press('ArrowUp');
+
+ expect(await poHomeChannel.composer.inputValue()).toBe('msg2');
+ });
+
+ await test.step('send edited message', async () => {
+ const editPromise = page.waitForResponse(
+ (response) =>
+ /api\/v1\/method.call\/updateMessage/.test(response.url()) &&
+ response.status() === 200 &&
+ response.request().method() === 'POST',
+ );
+
+ await poHomeChannel.content.sendMessage('edited msg2', false);
+ await editPromise;
+
+ await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('edited msg2');
+ });
+
+ await test.step('stress test on message editions', async () => {
+ const editPromise = page.waitForResponse(
+ (response) =>
+ /api\/v1\/method.call\/updateMessage/.test(response.url()) &&
+ response.status() === 200 &&
+ response.request().method() === 'POST',
+ );
+
+ for (const element of ['edited msg2 a', 'edited msg2 b', 'edited msg2 c', 'edited msg2 d', 'edited msg2 e']) {
+ // eslint-disable-next-line no-await-in-loop
+ await page.keyboard.press('ArrowUp');
+ // eslint-disable-next-line no-await-in-loop
+ await poHomeChannel.content.sendMessage(element, false);
+ }
+
+ await editPromise;
+ const toastError = await poToastBar.waitForError();
+
+ expect(toastError).toBe(true);
+ });
});
});
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
index d9faf15c2a4e2..f767c9321245a 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
@@ -89,13 +89,15 @@ export class HomeContent {
await this.joinRoomIfNeeded();
await this.page.waitForSelector('[name="msg"]:not([disabled])');
await this.page.locator('[name="msg"]').fill(text);
- const responsePromise = this.page.waitForResponse(
- (response) =>
- /api\/v1\/method.call\/sendMessage/.test(response.url()) && response.status() === 200 && response.request().method() === 'POST',
- );
- await this.page.getByRole('button', { name: 'Send', exact: true }).click();
if (enforce) {
+ const responsePromise = this.page.waitForResponse(
+ (response) =>
+ /api\/v1\/method.call\/sendMessage/.test(response.url()) && response.status() === 200 && response.request().method() === 'POST',
+ );
+
+ await this.page.getByRole('button', { name: 'Send', exact: true }).click();
+
const response = await (await responsePromise).json();
const mid = JSON.parse(response.message).result._id;
@@ -103,6 +105,8 @@ export class HomeContent {
await expect(messageLocator).toBeVisible();
await expect(messageLocator).not.toHaveClass('rcx-message--pending');
+ } else {
+ await this.page.getByRole('button', { name: 'Send', exact: true }).click();
}
}
diff --git a/apps/meteor/tests/e2e/page-objects/index.ts b/apps/meteor/tests/e2e/page-objects/index.ts
index 80914a7b75d2e..b7edff294fc7f 100644
--- a/apps/meteor/tests/e2e/page-objects/index.ts
+++ b/apps/meteor/tests/e2e/page-objects/index.ts
@@ -22,3 +22,4 @@ export * from './omnichannel-tags';
export * from './utils';
export * from './modal';
export * from './marketplace';
+export * from './toastBar';
diff --git a/apps/meteor/tests/e2e/page-objects/toastBar.ts b/apps/meteor/tests/e2e/page-objects/toastBar.ts
index d17d4f328606d..44d96f777c8e5 100644
--- a/apps/meteor/tests/e2e/page-objects/toastBar.ts
+++ b/apps/meteor/tests/e2e/page-objects/toastBar.ts
@@ -15,7 +15,21 @@ export class ToastBar {
return this.content.getByRole('alert');
}
+ get error(): Locator {
+ return this.page.locator('.rcx-toastbar.rcx-toastbar--error');
+ }
+
get dismiss(): Locator {
return this.content.getByRole('button', { name: 'Dismiss alert', exact: true });
}
+
+ async waitForError(): Promise {
+ try {
+ await this.error.waitFor({ timeout: 1000 });
+
+ return false;
+ } catch (error) {
+ return true;
+ }
+ }
}
From 2c732a5b0e711ad49fa94af7731b8e1e455c8f7c Mon Sep 17 00:00:00 2001
From: Tasso Evangelista
Date: Fri, 29 Aug 2025 00:22:15 -0300
Subject: [PATCH 022/197] chore: Expel `queueMicrotask` polyfill (#36788)
---
.../{yarn-4.9.2.cjs => yarn-4.9.3.cjs} | 714 +++++++++---------
.yarnrc.yml | 2 +-
apps/meteor/app/emoji/client/lib.ts | 1 -
.../lib/createReactiveSubscriptionFactory.ts | 2 -
.../meteor/client/lib/utils/queueMicrotask.ts | 6 -
.../components/AuthorizationFormPage.tsx | 1 -
package.json | 8 +-
packages/release-action/package.json | 2 +-
yarn.lock | 58 +-
9 files changed, 392 insertions(+), 402 deletions(-)
rename .yarn/releases/{yarn-4.9.2.cjs => yarn-4.9.3.cjs} (59%)
delete mode 100644 apps/meteor/client/lib/utils/queueMicrotask.ts
diff --git a/.yarn/releases/yarn-4.9.2.cjs b/.yarn/releases/yarn-4.9.3.cjs
similarity index 59%
rename from .yarn/releases/yarn-4.9.2.cjs
rename to .yarn/releases/yarn-4.9.3.cjs
index 28f25b14bca0d..4716f8539515a 100755
--- a/.yarn/releases/yarn-4.9.2.cjs
+++ b/.yarn/releases/yarn-4.9.3.cjs
@@ -1,151 +1,151 @@
#!/usr/bin/env node
/* eslint-disable */
//prettier-ignore
-(()=>{var UVe=Object.create;var E_=Object.defineProperty;var HVe=Object.getOwnPropertyDescriptor;var jVe=Object.getOwnPropertyNames;var qVe=Object.getPrototypeOf,GVe=Object.prototype.hasOwnProperty;var Ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var Ct=(t,e)=>()=>(t&&(e=t(t=0)),e);var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)E_(t,r,{get:e[r],enumerable:!0})},WVe=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of jVe(e))!GVe.call(t,a)&&a!==r&&E_(t,a,{get:()=>e[a],enumerable:!(s=HVe(e,a))||s.enumerable});return t};var et=(t,e,r)=>(r=t!=null?UVe(qVe(t)):{},WVe(e||!t||!t.__esModule?E_(r,"default",{value:t,enumerable:!0}):r,t));var fi={};Vt(fi,{SAFE_TIME:()=>d$,S_IFDIR:()=>rx,S_IFLNK:()=>nx,S_IFMT:()=>_f,S_IFREG:()=>N2});var _f,rx,N2,nx,d$,m$=Ct(()=>{_f=61440,rx=16384,N2=32768,nx=40960,d$=456789e3});var or={};Vt(or,{EBADF:()=>Uo,EBUSY:()=>YVe,EEXIST:()=>XVe,EINVAL:()=>KVe,EISDIR:()=>ZVe,ENOENT:()=>JVe,ENOSYS:()=>VVe,ENOTDIR:()=>zVe,ENOTEMPTY:()=>e7e,EOPNOTSUPP:()=>t7e,EROFS:()=>$Ve,ERR_DIR_CLOSED:()=>I_});function wc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function YVe(t){return wc("EBUSY",t)}function VVe(t,e){return wc("ENOSYS",`${t}, ${e}`)}function KVe(t){return wc("EINVAL",`invalid argument, ${t}`)}function Uo(t){return wc("EBADF",`bad file descriptor, ${t}`)}function JVe(t){return wc("ENOENT",`no such file or directory, ${t}`)}function zVe(t){return wc("ENOTDIR",`not a directory, ${t}`)}function ZVe(t){return wc("EISDIR",`illegal operation on a directory, ${t}`)}function XVe(t){return wc("EEXIST",`file already exists, ${t}`)}function $Ve(t){return wc("EROFS",`read-only filesystem, ${t}`)}function e7e(t){return wc("ENOTEMPTY",`directory not empty, ${t}`)}function t7e(t){return wc("EOPNOTSUPP",`operation not supported, ${t}`)}function I_(){return wc("ERR_DIR_CLOSED","Directory handle was closed")}var ix=Ct(()=>{});var el={};Vt(el,{BigIntStatsEntry:()=>rE,DEFAULT_MODE:()=>B_,DirEntry:()=>C_,StatEntry:()=>tE,areStatsEqual:()=>v_,clearStats:()=>sx,convertToBigIntStats:()=>n7e,makeDefaultStats:()=>y$,makeEmptyStats:()=>r7e});function y$(){return new tE}function r7e(){return sx(y$())}function sx(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):w_.types.isDate(r)&&(t[e]=new Date(0))}return t}function n7e(t){let e=new rE;for(let r in t)if(Object.hasOwn(t,r)){let s=t[r];typeof s=="number"?e[r]=BigInt(s):w_.types.isDate(s)&&(e[r]=new Date(s))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function v_(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,s=e;return!(r.atimeNs!==s.atimeNs||r.mtimeNs!==s.mtimeNs||r.ctimeNs!==s.ctimeNs||r.birthtimeNs!==s.birthtimeNs)}var w_,B_,C_,tE,rE,S_=Ct(()=>{w_=et(Ie("util")),B_=33188,C_=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},tE=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=B_;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},rE=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(B_);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function l7e(t){let e,r;if(e=t.match(o7e))t=e[1];else if(r=t.match(a7e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function c7e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(i7e))?t=`/${e[1]}`:(r=t.match(s7e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function ox(t,e){return t===ue?I$(e):D_(e)}var O2,vt,Er,ue,K,E$,i7e,s7e,o7e,a7e,D_,I$,tl=Ct(()=>{O2=et(Ie("path")),vt={root:"/",dot:".",parent:".."},Er={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},ue=Object.create(O2.default),K=Object.create(O2.default.posix);ue.cwd=()=>process.cwd();K.cwd=process.platform==="win32"?()=>D_(process.cwd()):process.cwd;process.platform==="win32"&&(K.resolve=(...t)=>t.length>0&&K.isAbsolute(t[0])?O2.default.posix.resolve(...t):O2.default.posix.resolve(K.cwd(),...t));E$=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};ue.contains=(t,e)=>E$(ue,t,e);K.contains=(t,e)=>E$(K,t,e);i7e=/^([a-zA-Z]:.*)$/,s7e=/^\/\/(\.\/)?(.*)$/,o7e=/^\/([a-zA-Z]:.*)$/,a7e=/^\/unc\/(\.dot\/)?(.*)$/;D_=process.platform==="win32"?c7e:t=>t,I$=process.platform==="win32"?l7e:t=>t;ue.fromPortablePath=I$;ue.toPortablePath=D_});async function ax(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let s=[];for(let a of r)for(let n of r)s.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(s),e.indexPath}async function C$(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtils.normalize(s),f=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:gd,mtime:gd}:await r.lstatPromise(c);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await b_(f,p,t,n,r,c,{...a,didParentExist:!0});for(let C of f)await C();await Promise.all(p.map(C=>C()))}async function b_(t,e,r,s,a,n,c){let f=c.didParentExist?await w$(r,s):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=c.stableTime?{atime:gd,mtime:gd}:p,C;switch(!0){case p.isDirectory():C=await f7e(t,e,r,s,f,a,n,p,c);break;case p.isFile():C=await h7e(t,e,r,s,f,a,n,p,c);break;case p.isSymbolicLink():C=await g7e(t,e,r,s,f,a,n,p,c);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(c.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((C||f?.mtime?.getTime()!==E.getTime()||f?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(s,h,E)),C=!0),(f===null||(f.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(s,p.mode&511)),C=!0)),C}async function w$(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function f7e(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(s,{mode:f.mode})}catch(S){if(S.code!=="EEXIST")throw S}}),h=!0);let E=await n.readdirPromise(c),C=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let S of E.sort())await b_(t,e,r,r.pathUtils.join(s,S),n,n.pathUtils.join(c,S),C)&&(h=!0);else(await Promise.all(E.map(async P=>{await b_(t,e,r,r.pathUtils.join(s,P),n,n.pathUtils.join(c,P),C)}))).some(P=>P)&&(h=!0);return h}async function A7e(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromise(c,{algorithm:"sha1"}),C=420,S=f.mode&511,P=`${E}${S!==C?S.toString(8):""}`,I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${P}.dat`),R;(ce=>(ce[ce.Lock=0]="Lock",ce[ce.Rename=1]="Rename"))(R||={});let N=1,U=await w$(r,I);if(a){let ie=U&&a.dev===U.dev&&a.ino===U.ino,Ae=U?.mtimeMs!==u7e;if(ie&&Ae&&h.autoRepair&&(N=0,U=null),!ie)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1}let W=!U&&N===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,te=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(I,async()=>{let ie=await n.readFilePromise(c);await r.writeFilePromise(I,ie)}),N===1&&W)){let ie=await n.readFilePromise(c);await r.writeFilePromise(W,ie);try{await r.linkPromise(W,I)}catch(Ae){if(Ae.code==="EEXIST")te=!0,await r.unlinkPromise(W);else throw Ae}}a||await r.linkPromise(I,s)}),e.push(async()=>{U||(await r.lutimesPromise(I,gd,gd),S!==C&&await r.chmodPromise(I,S)),W&&!te&&await r.unlinkPromise(W)}),!1}async function p7e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(c);await r.writeFilePromise(s,h)}),!0}async function h7e(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type==="HardlinkFromIndex"?A7e(t,e,r,s,a,n,c,f,p,p.linkStrategy):p7e(t,e,r,s,a,n,c,f,p)}async function g7e(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(ox(r.pathUtils,await n.readlinkPromise(c)),s)}),!0}var gd,u7e,P_=Ct(()=>{tl();gd=new Date(456789e3*1e3),u7e=gd.getTime()});function lx(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let c=t.pathUtils.join(e,n);return Object.assign(t.statSync(c),{name:n,path:void 0})};return new L2(e,a,s)}var L2,B$=Ct(()=>{ix();L2=class{constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.closed=!1}throwIfClosed(){if(this.closed)throw I_()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function v$(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var S$,cx,D$=Ct(()=>{S$=Ie("events");S_();cx=class t extends S$.EventEmitter{constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=s,this.bigint=a,this.lastStats=this.stat()}static create(r,s,a){let n=new t(r,s,a);return n.start(),n}start(){v$(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){v$(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new rE:new tE;return sx(r)}}makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStats;v_(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?s:s.unref()}registerChangeListener(r,s){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(s))}unregisterChangeListener(r){this.removeListener("change",r);let s=this.changeListeners.get(r);typeof s<"u"&&clearInterval(s),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function nE(t,e,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=!0,c=5007,f=r;break;default:({bigint:a=!1,persistent:n=!0,interval:c=5007}=r),f=s;break}let p=ux.get(t);typeof p>"u"&&ux.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=cx.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(f,{persistent:n,interval:c}),h}function dd(t,e,r){let s=ux.get(t);if(typeof s>"u")return;let a=s.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),s.delete(e)))}function md(t){let e=ux.get(t);if(!(typeof e>"u"))for(let r of e.keys())dd(t,r)}var ux,x_=Ct(()=>{D$();ux=new WeakMap});function d7e(t){let e=t.match(/\r?\n/g);if(e===null)return P$.EOL;let r=e.filter(a=>a===`\r
+(()=>{var EGe=Object.create;var hU=Object.defineProperty;var IGe=Object.getOwnPropertyDescriptor;var CGe=Object.getOwnPropertyNames;var wGe=Object.getPrototypeOf,BGe=Object.prototype.hasOwnProperty;var Ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var Ze=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)hU(t,r,{get:e[r],enumerable:!0})},vGe=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of CGe(e))!BGe.call(t,a)&&a!==r&&hU(t,a,{get:()=>e[a],enumerable:!(s=IGe(e,a))||s.enumerable});return t};var ut=(t,e,r)=>(r=t!=null?EGe(wGe(t)):{},vGe(e||!t||!t.__esModule?hU(r,"default",{value:t,enumerable:!0}):r,t));var fi={};Vt(fi,{SAFE_TIME:()=>NX,S_IFDIR:()=>WP,S_IFLNK:()=>YP,S_IFMT:()=>Mf,S_IFREG:()=>T2});var Mf,WP,T2,YP,NX,OX=Ze(()=>{Mf=61440,WP=16384,T2=32768,YP=40960,NX=456789e3});var or={};Vt(or,{EBADF:()=>Mo,EBUSY:()=>SGe,EEXIST:()=>QGe,EINVAL:()=>bGe,EISDIR:()=>kGe,ENOENT:()=>PGe,ENOSYS:()=>DGe,ENOTDIR:()=>xGe,ENOTEMPTY:()=>TGe,EOPNOTSUPP:()=>FGe,EROFS:()=>RGe,ERR_DIR_CLOSED:()=>gU});function Cc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function SGe(t){return Cc("EBUSY",t)}function DGe(t,e){return Cc("ENOSYS",`${t}, ${e}`)}function bGe(t){return Cc("EINVAL",`invalid argument, ${t}`)}function Mo(t){return Cc("EBADF",`bad file descriptor, ${t}`)}function PGe(t){return Cc("ENOENT",`no such file or directory, ${t}`)}function xGe(t){return Cc("ENOTDIR",`not a directory, ${t}`)}function kGe(t){return Cc("EISDIR",`illegal operation on a directory, ${t}`)}function QGe(t){return Cc("EEXIST",`file already exists, ${t}`)}function RGe(t){return Cc("EROFS",`read-only filesystem, ${t}`)}function TGe(t){return Cc("ENOTEMPTY",`directory not empty, ${t}`)}function FGe(t){return Cc("EOPNOTSUPP",`operation not supported, ${t}`)}function gU(){return Cc("ERR_DIR_CLOSED","Directory handle was closed")}var VP=Ze(()=>{});var $a={};Vt($a,{BigIntStatsEntry:()=>nE,DEFAULT_MODE:()=>yU,DirEntry:()=>dU,StatEntry:()=>rE,areStatsEqual:()=>EU,clearStats:()=>JP,convertToBigIntStats:()=>OGe,makeDefaultStats:()=>LX,makeEmptyStats:()=>NGe});function LX(){return new rE}function NGe(){return JP(LX())}function JP(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):mU.types.isDate(r)&&(t[e]=new Date(0))}return t}function OGe(t){let e=new nE;for(let r in t)if(Object.hasOwn(t,r)){let s=t[r];typeof s=="number"?e[r]=BigInt(s):mU.types.isDate(s)&&(e[r]=new Date(s))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function EU(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,s=e;return!(r.atimeNs!==s.atimeNs||r.mtimeNs!==s.mtimeNs||r.ctimeNs!==s.ctimeNs||r.birthtimeNs!==s.birthtimeNs)}var mU,yU,dU,rE,nE,IU=Ze(()=>{mU=ut(Ie("util")),yU=33188,dU=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},rE=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=yU;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},nE=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(yU);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function HGe(t){let e,r;if(e=t.match(UGe))t=e[1];else if(r=t.match(_Ge))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function jGe(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(LGe))?t=`/${e[1]}`:(r=t.match(MGe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function KP(t,e){return t===fe?UX(e):CU(e)}var F2,vt,Er,fe,J,MX,LGe,MGe,UGe,_Ge,CU,UX,el=Ze(()=>{F2=ut(Ie("path")),vt={root:"/",dot:".",parent:".."},Er={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},fe=Object.create(F2.default),J=Object.create(F2.default.posix);fe.cwd=()=>process.cwd();J.cwd=process.platform==="win32"?()=>CU(process.cwd()):process.cwd;process.platform==="win32"&&(J.resolve=(...t)=>t.length>0&&J.isAbsolute(t[0])?F2.default.posix.resolve(...t):F2.default.posix.resolve(J.cwd(),...t));MX=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};fe.contains=(t,e)=>MX(fe,t,e);J.contains=(t,e)=>MX(J,t,e);LGe=/^([a-zA-Z]:.*)$/,MGe=/^\/\/(\.\/)?(.*)$/,UGe=/^\/([a-zA-Z]:.*)$/,_Ge=/^\/unc\/(\.dot\/)?(.*)$/;CU=process.platform==="win32"?jGe:t=>t,UX=process.platform==="win32"?HGe:t=>t;fe.fromPortablePath=UX;fe.toPortablePath=CU});async function zP(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let s=[];for(let a of r)for(let n of r)s.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(s),e.indexPath}async function _X(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtils.normalize(s),f=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:dd,mtime:dd}:await r.lstatPromise(c);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await wU(f,p,t,n,r,c,{...a,didParentExist:!0});for(let w of f)await w();await Promise.all(p.map(w=>w()))}async function wU(t,e,r,s,a,n,c){let f=c.didParentExist?await HX(r,s):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=c.stableTime?{atime:dd,mtime:dd}:p,w;switch(!0){case p.isDirectory():w=await qGe(t,e,r,s,f,a,n,p,c);break;case p.isFile():w=await VGe(t,e,r,s,f,a,n,p,c);break;case p.isSymbolicLink():w=await JGe(t,e,r,s,f,a,n,p,c);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(c.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((w||f?.mtime?.getTime()!==E.getTime()||f?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(s,h,E)),w=!0),(f===null||(f.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(s,p.mode&511)),w=!0)),w}async function HX(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function qGe(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(s,{mode:f.mode})}catch(S){if(S.code!=="EEXIST")throw S}}),h=!0);let E=await n.readdirPromise(c),w=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let S of E.sort())await wU(t,e,r,r.pathUtils.join(s,S),n,n.pathUtils.join(c,S),w)&&(h=!0);else(await Promise.all(E.map(async x=>{await wU(t,e,r,r.pathUtils.join(s,x),n,n.pathUtils.join(c,x),w)}))).some(x=>x)&&(h=!0);return h}async function WGe(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromise(c,{algorithm:"sha1"}),w=420,S=f.mode&511,x=`${E}${S!==w?S.toString(8):""}`,I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${x}.dat`),T;(le=>(le[le.Lock=0]="Lock",le[le.Rename=1]="Rename"))(T||={});let N=1,U=await HX(r,I);if(a){let ie=U&&a.dev===U.dev&&a.ino===U.ino,ue=U?.mtimeMs!==GGe;if(ie&&ue&&h.autoRepair&&(N=0,U=null),!ie)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1}let W=!U&&N===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,ee=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(I,async()=>{let ie=await n.readFilePromise(c);await r.writeFilePromise(I,ie)}),N===1&&W)){let ie=await n.readFilePromise(c);await r.writeFilePromise(W,ie);try{await r.linkPromise(W,I)}catch(ue){if(ue.code==="EEXIST")ee=!0,await r.unlinkPromise(W);else throw ue}}a||await r.linkPromise(I,s)}),e.push(async()=>{U||(await r.lutimesPromise(I,dd,dd),S!==w&&await r.chmodPromise(I,S)),W&&!ee&&await r.unlinkPromise(W)}),!1}async function YGe(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(c);await r.writeFilePromise(s,h)}),!0}async function VGe(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type==="HardlinkFromIndex"?WGe(t,e,r,s,a,n,c,f,p,p.linkStrategy):YGe(t,e,r,s,a,n,c,f,p)}async function JGe(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(KP(r.pathUtils,await n.readlinkPromise(c)),s)}),!0}var dd,GGe,BU=Ze(()=>{el();dd=new Date(456789e3*1e3),GGe=dd.getTime()});function ZP(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let c=t.pathUtils.join(e,n);return Object.assign(t.statSync(c),{name:n,path:void 0})};return new N2(e,a,s)}var N2,jX=Ze(()=>{VP();N2=class{constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.closed=!1}throwIfClosed(){if(this.closed)throw gU()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function GX(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var qX,XP,WX=Ze(()=>{qX=Ie("events");IU();XP=class t extends qX.EventEmitter{constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=s,this.bigint=a,this.lastStats=this.stat()}static create(r,s,a){let n=new t(r,s,a);return n.start(),n}start(){GX(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){GX(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new nE:new rE;return JP(r)}}makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStats;EU(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?s:s.unref()}registerChangeListener(r,s){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(s))}unregisterChangeListener(r){this.removeListener("change",r);let s=this.changeListeners.get(r);typeof s<"u"&&clearInterval(s),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function iE(t,e,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=!0,c=5007,f=r;break;default:({bigint:a=!1,persistent:n=!0,interval:c=5007}=r),f=s;break}let p=$P.get(t);typeof p>"u"&&$P.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=XP.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(f,{persistent:n,interval:c}),h}function md(t,e,r){let s=$P.get(t);if(typeof s>"u")return;let a=s.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),s.delete(e)))}function yd(t){let e=$P.get(t);if(!(typeof e>"u"))for(let r of e.keys())md(t,r)}var $P,vU=Ze(()=>{WX();$P=new WeakMap});function KGe(t){let e=t.match(/\r?\n/g);if(e===null)return VX.EOL;let r=e.filter(a=>a===`\r
`).length,s=e.length-r;return r>s?`\r
`:`
-`}function yd(t,e){return e.replace(/\r?\n/g,d7e(t))}var b$,P$,Ep,Uf,Ed=Ct(()=>{b$=Ie("crypto"),P$=Ie("os");P_();tl();Ep=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length>0;){let a=s.shift();if((await this.lstatPromise(a)).isDirectory()){let c=await this.readdirPromise(a);if(r)for(let f of c.sort())s.push(this.pathUtils.join(a,f));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let s=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,b$.createHash)(r),f=0;for(;(f=await this.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await this.closePromise(s)}}async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(c=>this.removePromise(this.pathUtils.resolve(e,c))))}for(let n=0;n<=s;n++)try{await this.rmdirPromise(e);break}catch(c){if(c.code!=="EBUSY"&&c.code!=="ENOTEMPTY")throw c;nsetTimeout(f,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(s.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{await this.mkdirPromise(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&await this.chmodPromise(f,r),s!=null)await this.utimesPromise(f,s[0],s[1]);else{let p=await this.statPromise(this.pathUtils.dirname(f));await this.utimesPromise(f,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{this.mkdirSync(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&this.chmodSync(f,r),s!=null)this.utimesSync(f,s[0],s[1]);else{let p=this.statSync(this.pathUtils.dirname(f));this.utimesSync(f,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stableTime:c=!1,linkStrategy:f=null}={}){return await C$(this,e,s,r,{overwrite:a,stableSort:n,stableTime:c,linkStrategy:f})}copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=s.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),s.pathUtils.join(r,h),{baseFs:s,overwrite:a})}else if(n.isFile()){if(!c||a){c&&this.removeSync(e);let p=s.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!c||a){c&&this.removeSync(e);let p=s.readlinkSync(r);this.symlinkSync(ox(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let f=n.mode&511;this.chmodSync(e,f)}async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,s):this.changeFileTextPromise(e,r,s)}async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:s})}async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let c=s?yd(n,r):r;n!==c&&await this.writeFilePromise(e,c,{mode:a})}changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,s):this.changeFileTextSync(e,r,s)}changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:s})}changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let c=s?yd(n,r):r;n!==c&&this.writeFileSync(e,c,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw s}}moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw s}}async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f=async()=>{let p;try{[p]=await this.readJsonPromise(s)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;c===null;)try{c=await this.openPromise(s,"wx")}catch(p){if(p.code==="EEXIST"){if(!await f())try{await this.unlinkPromise(s);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${s})`)}else throw p}await this.writePromise(c,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(c),await this.unlinkPromise(s)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)}
+`}function Ed(t,e){return e.replace(/\r?\n/g,KGe(t))}var YX,VX,mp,Uf,Id=Ze(()=>{YX=Ie("crypto"),VX=Ie("os");BU();el();mp=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length>0;){let a=s.shift();if((await this.lstatPromise(a)).isDirectory()){let c=await this.readdirPromise(a);if(r)for(let f of c.sort())s.push(this.pathUtils.join(a,f));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let s=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,YX.createHash)(r),f=0;for(;(f=await this.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await this.closePromise(s)}}async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(c=>this.removePromise(this.pathUtils.resolve(e,c))))}for(let n=0;n<=s;n++)try{await this.rmdirPromise(e);break}catch(c){if(c.code!=="EBUSY"&&c.code!=="ENOTEMPTY")throw c;nsetTimeout(f,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(s.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{await this.mkdirPromise(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&await this.chmodPromise(f,r),s!=null)await this.utimesPromise(f,s[0],s[1]);else{let p=await this.statPromise(this.pathUtils.dirname(f));await this.utimesPromise(f,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{this.mkdirSync(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&this.chmodSync(f,r),s!=null)this.utimesSync(f,s[0],s[1]);else{let p=this.statSync(this.pathUtils.dirname(f));this.utimesSync(f,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stableTime:c=!1,linkStrategy:f=null}={}){return await _X(this,e,s,r,{overwrite:a,stableSort:n,stableTime:c,linkStrategy:f})}copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=s.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),s.pathUtils.join(r,h),{baseFs:s,overwrite:a})}else if(n.isFile()){if(!c||a){c&&this.removeSync(e);let p=s.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!c||a){c&&this.removeSync(e);let p=s.readlinkSync(r);this.symlinkSync(KP(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let f=n.mode&511;this.chmodSync(e,f)}async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,s):this.changeFileTextPromise(e,r,s)}async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:s})}async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let c=s?Ed(n,r):r;n!==c&&await this.writeFilePromise(e,c,{mode:a})}changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,s):this.changeFileTextSync(e,r,s)}changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:s})}changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let c=s?Ed(n,r):r;n!==c&&this.writeFileSync(e,c,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw s}}moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw s}}async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f=async()=>{let p;try{[p]=await this.readJsonPromise(s)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;c===null;)try{c=await this.openPromise(s,"wx")}catch(p){if(p.code==="EEXIST"){if(!await f())try{await this.unlinkPromise(s);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${s})`)}else throw p}await this.writePromise(c,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(c),await this.unlinkPromise(s)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)}
`)}writeJsonSync(e,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)}
-`)}async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,s.atime,s.mtime)}async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,s.atime,s.mtime)}},Uf=class extends Ep{constructor(){super(K)}}});var js,Ip=Ct(()=>{Ed();js=class extends Ep{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e),r,s)}openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,a,n)}readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,s):await this.baseFs.writePromise(e,r,s,a,n)}writeSync(e,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,s):this.baseFs.writeSync(e,r,s,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase(e),r,s)}chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),s)}copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),s)}async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,s)}appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,s)}async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,s)}writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,s)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBase(e),r,s)}utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapToBase(e),r,s)}lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(c,a,s)}symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(c,a,s)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var Hf,x$=Ct(()=>{Ip();Hf=class extends js{constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function k$(t){let e=t;return typeof t.path=="string"&&(e.path=ue.toPortablePath(t.path)),e}var Q$,Yn,Id=Ct(()=>{Q$=et(Ie("fs"));Ed();tl();Yn=class extends Uf{constructor(e=Q$.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return vt.root}resolve(e){return K.resolve(e)}async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.open(ue.fromPortablePath(e),r,s,this.makeCallback(a,n))})}openSync(e,r,s){return this.realFs.openSync(ue.fromPortablePath(e),r,s)}async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<"u"?this.realFs.opendir(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.opendir(ue.fromPortablePath(e),this.makeCallback(s,a))}).then(s=>{let a=s;return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(ue.fromPortablePath(e),r):this.realFs.opendirSync(ue.fromPortablePath(e));return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{this.realFs.read(e,r,s,a,n,(p,h)=>{p?f(p):c(h)})})}readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r=="string"?this.realFs.write(e,r,s,this.makeCallback(c,f)):this.realFs.write(e,r,s,a,n,this.makeCallback(c,f)))}writeSync(e,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(e,r,s):this.realFs.writeSync(e,r,s,a,n)}async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this.makeCallback(r,s))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let s=e!==null?ue.fromPortablePath(e):e;return this.realFs.createReadStream(s,r)}createWriteStream(e,r){let s=e!==null?ue.fromPortablePath(e):e;return this.realFs.createWriteStream(s,r)}async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.realpath(ue.fromPortablePath(e),{},this.makeCallback(r,s))}).then(r=>ue.toPortablePath(r))}realpathSync(e){return ue.toPortablePath(this.realFs.realpathSync(ue.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(ue.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(ue.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.access(ue.fromPortablePath(e),r,this.makeCallback(s,a))})}existsSync(e){return this.realFs.existsSync(ue.fromPortablePath(e))}async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.stat(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.stat(ue.fromPortablePath(e),this.makeCallback(s,a))})}statSync(e,r){return r?this.realFs.statSync(ue.fromPortablePath(e),r):this.realFs.statSync(ue.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(s,a)):this.realFs.fstat(e,this.makeCallback(s,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.lstat(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.lstat(ue.fromPortablePath(e),this.makeCallback(s,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(ue.fromPortablePath(e),r):this.realFs.lstatSync(ue.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fchmod(e,r,this.makeCallback(s,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chmod(ue.fromPortablePath(e),r,this.makeCallback(s,a))})}chmodSync(e,r){return this.realFs.chmodSync(ue.fromPortablePath(e),r)}async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.fchown(e,r,s,this.makeCallback(a,n))})}fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.chown(ue.fromPortablePath(e),r,s,this.makeCallback(a,n))})}chownSync(e,r,s){return this.realFs.chownSync(ue.fromPortablePath(e),r,s)}async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.rename(ue.fromPortablePath(e),ue.fromPortablePath(r),this.makeCallback(s,a))})}renameSync(e,r){return this.realFs.renameSync(ue.fromPortablePath(e),ue.fromPortablePath(r))}async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.realFs.copyFile(ue.fromPortablePath(e),ue.fromPortablePath(r),s,this.makeCallback(a,n))})}copyFileSync(e,r,s=0){return this.realFs.copyFileSync(ue.fromPortablePath(e),ue.fromPortablePath(r),s)}async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?ue.fromPortablePath(e):e;s?this.realFs.appendFile(c,r,s,this.makeCallback(a,n)):this.realFs.appendFile(c,r,this.makeCallback(a,n))})}appendFileSync(e,r,s){let a=typeof e=="string"?ue.fromPortablePath(e):e;s?this.realFs.appendFileSync(a,r,s):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?ue.fromPortablePath(e):e;s?this.realFs.writeFile(c,r,s,this.makeCallback(a,n)):this.realFs.writeFile(c,r,this.makeCallback(a,n))})}writeFileSync(e,r,s){let a=typeof e=="string"?ue.fromPortablePath(e):e;s?this.realFs.writeFileSync(a,r,s):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unlink(ue.fromPortablePath(e),this.makeCallback(r,s))})}unlinkSync(e){return this.realFs.unlinkSync(ue.fromPortablePath(e))}async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.utimes(ue.fromPortablePath(e),r,s,this.makeCallback(a,n))})}utimesSync(e,r,s){this.realFs.utimesSync(ue.fromPortablePath(e),r,s)}async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.lutimes(ue.fromPortablePath(e),r,s,this.makeCallback(a,n))})}lutimesSync(e,r,s){this.realFs.lutimesSync(ue.fromPortablePath(e),r,s)}async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkdir(ue.fromPortablePath(e),r,this.makeCallback(s,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(ue.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rmdir(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rmdir(ue.fromPortablePath(e),this.makeCallback(s,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(ue.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rm(ue.fromPortablePath(e),this.makeCallback(s,a))})}rmSync(e,r){return this.realFs.rmSync(ue.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link(ue.fromPortablePath(e),ue.fromPortablePath(r),this.makeCallback(s,a))})}linkSync(e,r){return this.realFs.linkSync(ue.fromPortablePath(e),ue.fromPortablePath(r))}async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.symlink(ue.fromPortablePath(e.replace(/\/+$/,"")),ue.fromPortablePath(r),s,this.makeCallback(a,n))})}symlinkSync(e,r,s){return this.realFs.symlinkSync(ue.fromPortablePath(e.replace(/\/+$/,"")),ue.fromPortablePath(r),s)}async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof e=="string"?ue.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(s,a))})}readFileSync(e,r){let s=typeof e=="string"?ue.fromPortablePath(e):e;return this.realFs.readFileSync(s,r)}async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(k$)),a)):this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(ue.toPortablePath)),a)):this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.readdir(ue.fromPortablePath(e),this.makeCallback(s,a))})}readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(ue.fromPortablePath(e),r).map(k$):this.realFs.readdirSync(ue.fromPortablePath(e),r).map(ue.toPortablePath):this.realFs.readdirSync(ue.fromPortablePath(e),r):this.realFs.readdirSync(ue.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.readlink(ue.fromPortablePath(e),this.makeCallback(r,s))}).then(r=>ue.toPortablePath(r))}readlinkSync(e){return ue.toPortablePath(this.realFs.readlinkSync(ue.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.truncate(ue.fromPortablePath(e),r,this.makeCallback(s,a))})}truncateSync(e,r){return this.realFs.truncateSync(ue.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(s,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,s){return this.realFs.watch(ue.fromPortablePath(e),r,s)}watchFile(e,r,s){return this.realFs.watchFile(ue.fromPortablePath(e),r,s)}unwatchFile(e,r){return this.realFs.unwatchFile(ue.fromPortablePath(e),r)}makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}}});var Sn,T$=Ct(()=>{Id();Ip();tl();Sn=class extends js{constructor(e,{baseFs:r=new Yn}={}){super(K),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?K.normalize(e):this.baseFs.resolve(K.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var R$,jf,F$=Ct(()=>{Id();Ip();tl();R$=vt.root,jf=class extends js{constructor(e,{baseFs:r=new Yn}={}){super(K),this.target=this.pathUtils.resolve(vt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(vt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(R$,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(R$,this.pathUtils.relative(this.target,e))}}});var iE,N$=Ct(()=>{Ip();iE=class extends js{constructor(r,s){super(s);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var Cd,rl,r0,O$=Ct(()=>{Cd=Ie("fs");Ed();Id();x_();ix();tl();rl=4278190080,r0=class extends Uf{constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:c=!0,maxAge:f=5e3,typeCheck:p=Cd.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:C}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=c?new Map:null,this.factoryPromise=E,this.factorySync=C,this.filter=s,this.getMountPoint=h,this.magic=a<<24,this.maxAge=f,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(md(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(md(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s]),a}async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,s,a),async(n,{subPath:c})=>this.remapFd(n,await n.openPromise(c,s,a)))}openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,a),(n,{subPath:c})=>this.remapFd(n,n.openSync(c,s,a)))}async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,s),async(a,{subPath:n})=>await a.opendirPromise(n,s),{requireSubpath:!1})}opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,s),(a,{subPath:n})=>a.opendirSync(n,s),{requireSubpath:!1})}async readPromise(r,s,a,n,c){if((r&rl)!==this.magic)return await this.baseFs.readPromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Uo("read");let[p,h]=f;return await p.readPromise(h,s,a,n,c)}readSync(r,s,a,n,c){if((r&rl)!==this.magic)return this.baseFs.readSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Uo("readSync");let[p,h]=f;return p.readSync(h,s,a,n,c)}async writePromise(r,s,a,n,c){if((r&rl)!==this.magic)return typeof s=="string"?await this.baseFs.writePromise(r,s,a):await this.baseFs.writePromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Uo("write");let[p,h]=f;return typeof s=="string"?await p.writePromise(h,s,a):await p.writePromise(h,s,a,n,c)}writeSync(r,s,a,n,c){if((r&rl)!==this.magic)return typeof s=="string"?this.baseFs.writeSync(r,s,a):this.baseFs.writeSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Uo("writeSync");let[p,h]=f;return typeof s=="string"?p.writeSync(h,s,a):p.writeSync(h,s,a,n,c)}async closePromise(r){if((r&rl)!==this.magic)return await this.baseFs.closePromise(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Uo("close");this.fdMap.delete(r);let[a,n]=s;return await a.closePromise(n)}closeSync(r){if((r&rl)!==this.magic)return this.baseFs.closeSync(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Uo("closeSync");this.fdMap.delete(r);let[a,n]=s;return a.closeSync(n)}createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,s),(a,{archivePath:n,subPath:c})=>{let f=a.createReadStream(c,s);return f.path=ue.fromPortablePath(this.pathUtils.join(n,c)),f})}createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,s),(a,{subPath:n})=>a.createWriteStream(n,s))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=await this.baseFs.realpathPromise(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,await s.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=this.baseFs.realpathSync(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,s.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(s,{subPath:a})=>await s.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(s,{subPath:a})=>s.existsSync(a))}async accessPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,s),async(a,{subPath:n})=>await a.accessPromise(n,s))}accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,s),(a,{subPath:n})=>a.accessSync(n,s))}async statPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,s),async(a,{subPath:n})=>await a.statPromise(n,s))}statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(a,{subPath:n})=>a.statSync(n,s))}async fstatPromise(r,s){if((r&rl)!==this.magic)return this.baseFs.fstatPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("fstat");let[n,c]=a;return n.fstatPromise(c,s)}fstatSync(r,s){if((r&rl)!==this.magic)return this.baseFs.fstatSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("fstatSync");let[n,c]=a;return n.fstatSync(c,s)}async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,s),async(a,{subPath:n})=>await a.lstatPromise(n,s))}lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s),(a,{subPath:n})=>a.lstatSync(n,s))}async fchmodPromise(r,s){if((r&rl)!==this.magic)return this.baseFs.fchmodPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("fchmod");let[n,c]=a;return n.fchmodPromise(c,s)}fchmodSync(r,s){if((r&rl)!==this.magic)return this.baseFs.fchmodSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("fchmodSync");let[n,c]=a;return n.fchmodSync(c,s)}async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,s),async(a,{subPath:n})=>await a.chmodPromise(n,s))}chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s),(a,{subPath:n})=>a.chmodSync(n,s))}async fchownPromise(r,s,a){if((r&rl)!==this.magic)return this.baseFs.fchownPromise(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Uo("fchown");let[c,f]=n;return c.fchownPromise(f,s,a)}fchownSync(r,s,a){if((r&rl)!==this.magic)return this.baseFs.fchownSync(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Uo("fchownSync");let[c,f]=n;return c.fchownSync(f,s,a)}async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,s,a),async(n,{subPath:c})=>await n.chownPromise(c,s,a))}chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,s,a),(n,{subPath:c})=>n.chownSync(c,s,a))}async renamePromise(r,s){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.renamePromise(r,s),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(s,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,f)}))}renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.renameSync(r,s),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(s,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,f)}))}async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&Cd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&Cd.constants.COPYFILE_EXCL&&await this.existsPromise(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await c.readFilePromise(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.copyFilePromise(r,s,a),async(c,{subPath:f})=>await n(this.baseFs,r,c,f)),async(c,{subPath:f})=>await this.makeCallPromise(s,async()=>await n(c,f,this.baseFs,s),async(p,{subPath:h})=>c!==p?await n(c,f,p,h):await c.copyFilePromise(f,h,a)))}copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&Cd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&Cd.constants.COPYFILE_EXCL&&this.existsSync(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=c.readFileSync(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.copyFileSync(r,s,a),(c,{subPath:f})=>n(this.baseFs,r,c,f)),(c,{subPath:f})=>this.makeCallSync(s,()=>n(c,f,this.baseFs,s),(p,{subPath:h})=>c!==p?n(c,f,p,h):c.copyFileSync(f,h,a)))}async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,s,a),async(n,{subPath:c})=>await n.appendFilePromise(c,s,a))}appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,s,a),(n,{subPath:c})=>n.appendFileSync(c,s,a))}async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,s,a),async(n,{subPath:c})=>await n.writeFilePromise(c,s,a))}writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,s,a),(n,{subPath:c})=>n.writeFileSync(c,s,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(s,{subPath:a})=>await s.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(s,{subPath:a})=>s.unlinkSync(a))}async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,s,a),async(n,{subPath:c})=>await n.utimesPromise(c,s,a))}utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,s,a),(n,{subPath:c})=>n.utimesSync(c,s,a))}async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,s,a),async(n,{subPath:c})=>await n.lutimesPromise(c,s,a))}lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,s,a),(n,{subPath:c})=>n.lutimesSync(c,s,a))}async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,s),async(a,{subPath:n})=>await a.mkdirPromise(n,s))}mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s),(a,{subPath:n})=>a.mkdirSync(n,s))}async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,s),async(a,{subPath:n})=>await a.rmdirPromise(n,s))}rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s),(a,{subPath:n})=>a.rmdirSync(n,s))}async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,s),async(a,{subPath:n})=>await a.rmPromise(n,s))}rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{subPath:n})=>a.rmSync(n,s))}async linkPromise(r,s){return await this.makeCallPromise(s,async()=>await this.baseFs.linkPromise(r,s),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=>await this.baseFs.symlinkPromise(r,s,a),async(n,{subPath:c})=>await n.symlinkPromise(r,c))}symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSync(r,s,a),(n,{subPath:c})=>n.symlinkSync(r,c))}async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,s),async(a,{subPath:n})=>await a.readFilePromise(n,s))}readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,s),(a,{subPath:n})=>a.readFileSync(n,s))}async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,s),async(a,{subPath:n})=>await a.readdirPromise(n,s),{requireSubpath:!1})}readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,s),(a,{subPath:n})=>a.readdirSync(n,s),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(s,{subPath:a})=>await s.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(s,{subPath:a})=>s.readlinkSync(a))}async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,s),async(a,{subPath:n})=>await a.truncatePromise(n,s))}truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,s),(a,{subPath:n})=>a.truncateSync(n,s))}async ftruncatePromise(r,s){if((r&rl)!==this.magic)return this.baseFs.ftruncatePromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("ftruncate");let[n,c]=a;return n.ftruncatePromise(c,s)}ftruncateSync(r,s){if((r&rl)!==this.magic)return this.baseFs.ftruncateSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Uo("ftruncateSync");let[n,c]=a;return n.ftruncateSync(c,s)}watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,{subPath:c})=>n.watch(c,s,a))}watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,s,a),()=>nE(this,r,s,a))}unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,s),()=>dd(this,r,s))}async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await s();let c=this.resolve(r),f=this.findMount(c);return f?n&&f.subPath==="/"?await s():await this.getMountPromise(f.archivePath,async p=>await a(p,f)):await s()}makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return s();let c=this.resolve(r),f=this.findMount(c);return!f||n&&f.subPath==="/"?s():this.getMountSync(f.archivePath,p=>a(p,f))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";for(;;){let a=r.substring(s.length),n=this.getMountPoint(a,s);if(!n)return null;if(s=this.pathUtils.join(s,n),!this.isMount.has(s)){if(this.notMount.has(s))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(s).mode&Cd.constants.S_IFMT)!==this.typeCheck){this.notMount.add(s);continue}}catch{return null}this.isMount.add(s)}return{archivePath:s,subPath:this.pathUtils.join(vt.root,r.substring(s.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),a=s+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[c,{childFs:f,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||f.hasOpenFileHandles?.())){if(s>=p){f.saveAndClose?.(),this.mountInstances.delete(c),n-=1;continue}else if(r===null||n<=0){a=p;break}f.saveAndClose?.(),this.mountInstances.delete(c),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-s).unref())}async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await s(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await s(a)}finally{a.saveAndClose?.()}}}getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,s(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return s(a)}finally{a.saveAndClose?.()}}}}});var er,fx,L$=Ct(()=>{Ed();tl();er=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),fx=class t extends Ep{static{this.instance=new t}constructor(){super(K)}getExtractHint(){throw er()}getRealPath(){throw er()}resolve(){throw er()}async openPromise(){throw er()}openSync(){throw er()}async opendirPromise(){throw er()}opendirSync(){throw er()}async readPromise(){throw er()}readSync(){throw er()}async writePromise(){throw er()}writeSync(){throw er()}async closePromise(){throw er()}closeSync(){throw er()}createWriteStream(){throw er()}createReadStream(){throw er()}async realpathPromise(){throw er()}realpathSync(){throw er()}async readdirPromise(){throw er()}readdirSync(){throw er()}async existsPromise(e){throw er()}existsSync(e){throw er()}async accessPromise(){throw er()}accessSync(){throw er()}async statPromise(){throw er()}statSync(){throw er()}async fstatPromise(e){throw er()}fstatSync(e){throw er()}async lstatPromise(e){throw er()}lstatSync(e){throw er()}async fchmodPromise(){throw er()}fchmodSync(){throw er()}async chmodPromise(){throw er()}chmodSync(){throw er()}async fchownPromise(){throw er()}fchownSync(){throw er()}async chownPromise(){throw er()}chownSync(){throw er()}async mkdirPromise(){throw er()}mkdirSync(){throw er()}async rmdirPromise(){throw er()}rmdirSync(){throw er()}async rmPromise(){throw er()}rmSync(){throw er()}async linkPromise(){throw er()}linkSync(){throw er()}async symlinkPromise(){throw er()}symlinkSync(){throw er()}async renamePromise(){throw er()}renameSync(){throw er()}async copyFilePromise(){throw er()}copyFileSync(){throw er()}async appendFilePromise(){throw er()}appendFileSync(){throw er()}async writeFilePromise(){throw er()}writeFileSync(){throw er()}async unlinkPromise(){throw er()}unlinkSync(){throw er()}async utimesPromise(){throw er()}utimesSync(){throw er()}async lutimesPromise(){throw er()}lutimesSync(){throw er()}async readFilePromise(){throw er()}readFileSync(){throw er()}async readlinkPromise(){throw er()}readlinkSync(){throw er()}async truncatePromise(){throw er()}truncateSync(){throw er()}async ftruncatePromise(e,r){throw er()}ftruncateSync(e,r){throw er()}watch(){throw er()}watchFile(){throw er()}unwatchFile(){throw er()}}});var n0,M$=Ct(()=>{Ip();tl();n0=class extends js{constructor(e){super(ue),this.baseFs=e}mapFromBase(e){return ue.fromPortablePath(e)}mapToBase(e){return ue.toPortablePath(e)}}});var m7e,k_,y7e,Ao,_$=Ct(()=>{Id();Ip();tl();m7e=/^[0-9]+$/,k_=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,y7e=/^([^/]+-)?[a-f0-9]+$/,Ao=class t extends js{static makeVirtualPath(e,r,s){if(K.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!K.basename(r).match(y7e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=K.relative(K.dirname(e),s).split("/"),c=0;for(;c{Q_=et(Ie("buffer")),U$=Ie("url"),H$=Ie("util");Ip();tl();Ax=class extends js{constructor(e){super(ue),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0,U$.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!E7e(e,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,H$.inspect)(e)}`)}}});var V$,Ho,Cp,i0,px,hx,sE,Nu,Ou,q$,G$,W$,Y$,M2,K$=Ct(()=>{V$=Ie("readline"),Ho=Symbol("kBaseFs"),Cp=Symbol("kFd"),i0=Symbol("kClosePromise"),px=Symbol("kCloseResolve"),hx=Symbol("kCloseReject"),sE=Symbol("kRefs"),Nu=Symbol("kRef"),Ou=Symbol("kUnref"),M2=class{constructor(e,r){this[Y$]=1;this[W$]=void 0;this[G$]=void 0;this[q$]=void 0;this[Ho]=r,this[Cp]=e}get fd(){return this[Cp]}async appendFile(e,r){try{this[Nu](this.appendFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Ho].appendFilePromise(this.fd,e,s?{encoding:s}:void 0)}finally{this[Ou]()}}async chown(e,r){try{return this[Nu](this.chown),await this[Ho].fchownPromise(this.fd,e,r)}finally{this[Ou]()}}async chmod(e){try{return this[Nu](this.chmod),await this[Ho].fchmodPromise(this.fd,e)}finally{this[Ou]()}}createReadStream(e){return this[Ho].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Ho].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,s,a){try{this[Nu](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,s=e.length??n.byteLength,a=e.position??null),r??=0,s??=0,s===0?{bytesRead:s,buffer:n}:{bytesRead:await this[Ho].readPromise(this.fd,n,r,s,a),buffer:n}}finally{this[Ou]()}}async readFile(e){try{this[Nu](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[Ho].readFilePromise(this.fd,r)}finally{this[Ou]()}}readLines(e){return(0,V$.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Nu](this.stat),await this[Ho].fstatPromise(this.fd,e)}finally{this[Ou]()}}async truncate(e){try{return this[Nu](this.truncate),await this[Ho].ftruncatePromise(this.fd,e)}finally{this[Ou]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Nu](this.writeFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;await this[Ho].writeFilePromise(this.fd,e,s)}finally{this[Ou]()}}async write(...e){try{if(this[Nu](this.write),ArrayBuffer.isView(e[0])){let[r,s,a,n]=e;return{bytesWritten:await this[Ho].writePromise(this.fd,r,s??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,s,a]=e;return{bytesWritten:await this[Ho].writePromise(this.fd,r,s,a),buffer:r}}}finally{this[Ou]()}}async writev(e,r){try{this[Nu](this.writev);let s=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);s+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);s+=n.bytesWritten}return{buffers:e,bytesWritten:s}}finally{this[Ou]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[Cp]===-1)return Promise.resolve();if(this[i0])return this[i0];if(this[sE]--,this[sE]===0){let e=this[Cp];this[Cp]=-1,this[i0]=this[Ho].closePromise(e).finally(()=>{this[i0]=void 0})}else this[i0]=new Promise((e,r)=>{this[px]=e,this[hx]=r}).finally(()=>{this[i0]=void 0,this[hx]=void 0,this[px]=void 0});return this[i0]}[(Ho,Cp,Y$=sE,W$=i0,G$=px,q$=hx,Nu)](e){if(this[Cp]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[sE]++}[Ou](){if(this[sE]--,this[sE]===0){let e=this[Cp];this[Cp]=-1,this[Ho].closePromise(e).then(this[px],this[hx])}}}});function _2(t,e){e=new Ax(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?.[oE.promisify.custom]<"u"&&(n[oE.promisify.custom]=c[oE.promisify.custom])};{r(t,"exists",(s,...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(s).then(f=>{c(f)},()=>{c(!1)})})}),r(t,"read",(...s)=>{let[a,n,c,f,p,h]=s;if(s.length<=3){let E={};s.length<3?h=s[1]:(E=s[1],h=s[2]),{buffer:n=Buffer.alloc(16384),offset:c=0,length:f=n.byteLength,position:p}=E}if(c==null&&(c=0),f|=0,f===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,c,f,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let s of J$){let a=s.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[s];if(typeof n>"u")continue;r(t,a,(...f)=>{let h=typeof f[f.length-1]=="function"?f.pop():()=>{};process.nextTick(()=>{n.apply(e,f).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",s=>{try{return e.existsSync(s)}catch{return!1}}),r(t,"readSync",(...s)=>{let[a,n,c,f,p]=s;return s.length<=3&&({offset:c=0,length:f=n.byteLength,position:p}=s[2]||{}),c==null&&(c=0),f|=0,f===0?0:(p==null&&(p=-1),e.readSync(a,n,c,f,p))});for(let s of I7e){let a=s;if(typeof t[a]>"u")continue;let n=e[s];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let s=t.promises;for(let a of J$){let n=a.replace(/Promise$/,"");if(typeof s[n]>"u")continue;let c=e[a];typeof c>"u"||a!=="open"&&r(s,n,(f,...p)=>f instanceof M2?f[n].apply(f,p):c.call(e,f,...p))}r(s,"open",async(...a)=>{let n=await e.openPromise(...a);return new M2(n,e)})}t.read[oE.promisify.custom]=async(s,a,...n)=>({bytesRead:await e.readPromise(s,a,...n),buffer:a}),t.write[oE.promisify.custom]=async(s,a,...n)=>({bytesWritten:await e.writePromise(s,a,...n),buffer:a})}function gx(t,e){let r=Object.create(t);return _2(r,e),r}var oE,I7e,J$,z$=Ct(()=>{oE=Ie("util");j$();K$();I7e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),J$=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function Z$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function X$(){if(T_)return T_;let t=ue.toPortablePath($$.default.tmpdir()),e=le.realpathSync(t);return process.once("exit",()=>{le.rmtempSync()}),T_={tmpdir:t,realTmpdir:e}}var $$,Lu,T_,le,eee=Ct(()=>{$$=et(Ie("os"));Id();tl();Lu=new Set,T_=null;le=Object.assign(new Yn,{detachTemp(t){Lu.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=X$();for(;;){let s=Z$("xfs-");try{this.mkdirSync(K.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=K.join(r,s);if(Lu.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Lu.has(a)){Lu.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=X$();for(;;){let s=Z$("xfs-");try{await this.mkdirPromise(K.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=K.join(r,s);if(Lu.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Lu.has(a)){Lu.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Lu.values()).map(async t=>{try{await le.removePromise(t,{maxRetries:0}),Lu.delete(t)}catch{}}))},rmtempSync(){for(let t of Lu)try{le.removeSync(t),Lu.delete(t)}catch{}}})});var U2={};Vt(U2,{AliasFS:()=>Hf,BasePortableFakeFS:()=>Uf,CustomDir:()=>L2,CwdFS:()=>Sn,FakeFS:()=>Ep,Filename:()=>Er,JailFS:()=>jf,LazyFS:()=>iE,MountFS:()=>r0,NoFS:()=>fx,NodeFS:()=>Yn,PortablePath:()=>vt,PosixFS:()=>n0,ProxiedFS:()=>js,VirtualFS:()=>Ao,constants:()=>fi,errors:()=>or,extendFs:()=>gx,normalizeLineEndings:()=>yd,npath:()=>ue,opendir:()=>lx,patchFs:()=>_2,ppath:()=>K,setupCopyIndex:()=>ax,statUtils:()=>el,unwatchAllFiles:()=>md,unwatchFile:()=>dd,watchFile:()=>nE,xfs:()=>le});var bt=Ct(()=>{m$();ix();S_();P_();B$();x_();Ed();tl();tl();x$();Ed();T$();F$();N$();O$();L$();Id();M$();Ip();_$();z$();eee()});var see=L((wGt,iee)=>{iee.exports=nee;nee.sync=w7e;var tee=Ie("fs");function C7e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var s=0;s{cee.exports=aee;aee.sync=B7e;var oee=Ie("fs");function aee(t,e,r){oee.stat(t,function(s,a){r(s,s?!1:lee(a,e))})}function B7e(t,e){return lee(oee.statSync(t),e)}function lee(t,e){return t.isFile()&&v7e(t,e)}function v7e(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),c=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),f=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=f|p,C=r&h||r&p&&a===c||r&f&&s===n||r&E&&n===0;return C}});var Aee=L((SGt,fee)=>{var vGt=Ie("fs"),dx;process.platform==="win32"||global.TESTING_WINDOWS?dx=see():dx=uee();fee.exports=R_;R_.sync=S7e;function R_(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(s,a){R_(t,e||{},function(n,c){n?a(n):s(c)})})}dx(t,e||{},function(s,a){s&&(s.code==="EACCES"||e&&e.ignoreErrors)&&(s=null,a=!1),r(s,a)})}function S7e(t,e){try{return dx.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var Eee=L((DGt,yee)=>{var aE=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",pee=Ie("path"),D7e=aE?";":":",hee=Aee(),gee=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),dee=(t,e)=>{let r=e.colon||D7e,s=t.match(/\//)||aE&&t.match(/\\/)?[""]:[...aE?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=aE?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=aE?a.split(r):[""];return aE&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:s,pathExt:n,pathExtExe:a}},mee=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:s,pathExt:a,pathExtExe:n}=dee(t,e),c=[],f=h=>new Promise((E,C)=>{if(h===s.length)return e.all&&c.length?E(c):C(gee(t));let S=s[h],P=/^".*"$/.test(S)?S.slice(1,-1):S,I=pee.join(P,t),R=!P&&/^\.[\\\/]/.test(t)?t.slice(0,2)+I:I;E(p(R,h,0))}),p=(h,E,C)=>new Promise((S,P)=>{if(C===a.length)return S(f(E+1));let I=a[C];hee(h+I,{pathExt:n},(R,N)=>{if(!R&&N)if(e.all)c.push(h+I);else return S(h+I);return S(p(h,E,C+1))})});return r?f(0).then(h=>r(null,h),r):f(0)},b7e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:s,pathExtExe:a}=dee(t,e),n=[];for(let c=0;c{"use strict";var Iee=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(s=>s.toUpperCase()==="PATH")||"Path"};F_.exports=Iee;F_.exports.default=Iee});var See=L((PGt,vee)=>{"use strict";var wee=Ie("path"),P7e=Eee(),x7e=Cee();function Bee(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let c;try{c=P7e.sync(t.command,{path:r[x7e({env:r})],pathExt:e?wee.delimiter:void 0})}catch{}finally{n&&process.chdir(s)}return c&&(c=wee.resolve(a?t.options.cwd:"",c)),c}function k7e(t){return Bee(t)||Bee(t,!0)}vee.exports=k7e});var Dee=L((xGt,O_)=>{"use strict";var N_=/([()\][%!^"`<>&|;, *?])/g;function Q7e(t){return t=t.replace(N_,"^$1"),t}function T7e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(N_,"^$1"),e&&(t=t.replace(N_,"^$1")),t}O_.exports.command=Q7e;O_.exports.argument=T7e});var Pee=L((kGt,bee)=>{"use strict";bee.exports=/^#!(.*)/});var kee=L((QGt,xee)=>{"use strict";var R7e=Pee();xee.exports=(t="")=>{let e=t.match(R7e);if(!e)return null;let[r,s]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?s:s?`${a} ${s}`:a}});var Tee=L((TGt,Qee)=>{"use strict";var L_=Ie("fs"),F7e=kee();function N7e(t){let r=Buffer.alloc(150),s;try{s=L_.openSync(t,"r"),L_.readSync(s,r,0,150,0),L_.closeSync(s)}catch{}return F7e(r.toString())}Qee.exports=N7e});var Oee=L((RGt,Nee)=>{"use strict";var O7e=Ie("path"),Ree=See(),Fee=Dee(),L7e=Tee(),M7e=process.platform==="win32",_7e=/\.(?:com|exe)$/i,U7e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function H7e(t){t.file=Ree(t);let e=t.file&&L7e(t.file);return e?(t.args.unshift(t.file),t.command=e,Ree(t)):t.file}function j7e(t){if(!M7e)return t;let e=H7e(t),r=!_7e.test(e);if(t.options.forceShell||r){let s=U7e.test(e);t.command=O7e.normalize(t.command),t.command=Fee.command(t.command),t.args=t.args.map(n=>Fee.argument(n,s));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function q7e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let s={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?s:j7e(s)}Nee.exports=q7e});var _ee=L((FGt,Mee)=>{"use strict";var M_=process.platform==="win32";function __(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function G7e(t,e){if(!M_)return;let r=t.emit;t.emit=function(s,a){if(s==="exit"){let n=Lee(a,e);if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function Lee(t,e){return M_&&t===1&&!e.file?__(e.original,"spawn"):null}function W7e(t,e){return M_&&t===1&&!e.file?__(e.original,"spawnSync"):null}Mee.exports={hookChildProcess:G7e,verifyENOENT:Lee,verifyENOENTSync:W7e,notFoundError:__}});var j_=L((NGt,lE)=>{"use strict";var Uee=Ie("child_process"),U_=Oee(),H_=_ee();function Hee(t,e,r){let s=U_(t,e,r),a=Uee.spawn(s.command,s.args,s.options);return H_.hookChildProcess(a,s),a}function Y7e(t,e,r){let s=U_(t,e,r),a=Uee.spawnSync(s.command,s.args,s.options);return a.error=a.error||H_.verifyENOENTSync(a.status,s),a}lE.exports=Hee;lE.exports.spawn=Hee;lE.exports.sync=Y7e;lE.exports._parse=U_;lE.exports._enoent=H_});var qee=L((OGt,jee)=>{"use strict";function V7e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function wd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,wd)}V7e(wd,Error);wd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C>",b=ur(">>",!1),y=">&",F=ur(">&",!1),z=">",Z=ur(">",!1),$="<<<",oe=ur("<<<",!1),xe="<&",Te=ur("<&",!1),lt="<",It=ur("<",!1),qt=function(O){return{type:"argument",segments:[].concat(...O)}},ir=function(O){return O},Pt="$'",gn=ur("$'",!1),Pr="'",Ir=ur("'",!1),Nr=function(O){return[{type:"text",text:O}]},nn='""',ai=ur('""',!1),wo=function(){return{type:"text",text:""}},ns='"',to=ur('"',!1),Bo=function(O){return O},ji=function(O){return{type:"arithmetic",arithmetic:O,quoted:!0}},ro=function(O){return{type:"shell",shell:O,quoted:!0}},vo=function(O){return{type:"variable",...O,quoted:!0}},RA=function(O){return{type:"text",text:O}},pf=function(O){return{type:"arithmetic",arithmetic:O,quoted:!1}},yh=function(O){return{type:"shell",shell:O,quoted:!1}},Eh=function(O){return{type:"variable",...O,quoted:!1}},no=function(O){return{type:"glob",pattern:O}},jn=/^[^']/,Fs=Zi(["'"],!0,!1),io=function(O){return O.join("")},lu=/^[^$"]/,cu=Zi(["$",'"'],!0,!1),uu=`\\
-`,FA=ur(`\\
-`,!1),NA=function(){return""},aa="\\",la=ur("\\",!1),OA=/^[\\$"`]/,gr=Zi(["\\","$",'"',"`"],!1,!1),So=function(O){return O},Me="\\a",fu=ur("\\a",!1),Cr=function(){return"a"},hf="\\b",LA=ur("\\b",!1),MA=function(){return"\b"},Au=/^[Ee]/,pu=Zi(["E","e"],!1,!1),ac=function(){return"\x1B"},ve="\\f",Nt=ur("\\f",!1),lc=function(){return"\f"},Li="\\n",so=ur("\\n",!1),Rt=function(){return`
-`},xn="\\r",ca=ur("\\r",!1),qi=function(){return"\r"},Mi="\\t",Oa=ur("\\t",!1),dn=function(){return" "},Jn="\\v",hu=ur("\\v",!1),Ih=function(){return"\v"},La=/^[\\'"?]/,Ma=Zi(["\\","'",'"',"?"],!1,!1),Ua=function(O){return String.fromCharCode(parseInt(O,16))},Xe="\\x",Ha=ur("\\x",!1),gf="\\u",cc=ur("\\u",!1),wn="\\U",ua=ur("\\U",!1),_A=function(O){return String.fromCodePoint(parseInt(O,16))},UA=/^[0-7]/,fa=Zi([["0","7"]],!1,!1),vl=/^[0-9a-fA-f]/,Mt=Zi([["0","9"],["a","f"],["A","f"]],!1,!1),kn=Ef(),Aa="{}",ja=ur("{}",!1),is=function(){return"{}"},uc="-",gu=ur("-",!1),fc="+",qa=ur("+",!1),_i=".",ws=ur(".",!1),Sl=function(O,J,re){return{type:"number",value:(O==="-"?-1:1)*parseFloat(J.join("")+"."+re.join(""))}},df=function(O,J){return{type:"number",value:(O==="-"?-1:1)*parseInt(J.join(""))}},Ac=function(O){return{type:"variable",...O}},Bi=function(O){return{type:"variable",name:O}},Qn=function(O){return O},pc="*",Je=ur("*",!1),st="/",St=ur("/",!1),lr=function(O,J,re){return{type:J==="*"?"multiplication":"division",right:re}},ee=function(O,J){return J.reduce((re,de)=>({left:re,...de}),O)},Ee=function(O,J,re){return{type:J==="+"?"addition":"subtraction",right:re}},Oe="$((",gt=ur("$((",!1),yt="))",Dt=ur("))",!1),tr=function(O){return O},fn="$(",li=ur("$(",!1),Gi=function(O){return O},Tn="${",Ga=ur("${",!1),gy=":-",X1=ur(":-",!1),Do=function(O,J){return{name:O,defaultValue:J}},dy=":-}",Ch=ur(":-}",!1),$1=function(O){return{name:O,defaultValue:[]}},bo=":+",wh=ur(":+",!1),Bh=function(O,J){return{name:O,alternativeValue:J}},du=":+}",vh=ur(":+}",!1),Rg=function(O){return{name:O,alternativeValue:[]}},Fg=function(O){return{name:O}},Ng="$",my=ur("$",!1),mf=function(O){return e.isGlobPattern(O)},Po=function(O){return O},Dl=/^[a-zA-Z0-9_]/,Sh=Zi([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Og=function(){return Cy()},bl=/^[$@*?#a-zA-Z0-9_\-]/,Pl=Zi(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),yy=/^[()}<>$|&; \t"']/,HA=Zi(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Ey=/^[<>&; \t"']/,Iy=Zi(["<",">","&",";"," "," ",'"',"'"],!1,!1),jA=/^[ \t]/,qA=Zi([" "," "],!1,!1),Y=0,xt=0,GA=[{line:1,column:1}],xo=0,yf=[],mt=0,mu;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function Cy(){return t.substring(xt,Y)}function Lg(){return If(xt,Y)}function e2(O,J){throw J=J!==void 0?J:If(xt,Y),WA([Mg(O)],t.substring(xt,Y),J)}function Dh(O,J){throw J=J!==void 0?J:If(xt,Y),di(O,J)}function ur(O,J){return{type:"literal",text:O,ignoreCase:J}}function Zi(O,J,re){return{type:"class",parts:O,inverted:J,ignoreCase:re}}function Ef(){return{type:"any"}}function Wa(){return{type:"end"}}function Mg(O){return{type:"other",description:O}}function yu(O){var J=GA[O],re;if(J)return J;for(re=O-1;!GA[re];)re--;for(J=GA[re],J={line:J.line,column:J.column};rexo&&(xo=Y,yf=[]),yf.push(O))}function di(O,J){return new wd(O,null,null,J)}function WA(O,J,re){return new wd(wd.buildMessage(O,J),O,J,re)}function Ya(){var O,J,re;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(re=pa(),re===r&&(re=null),re!==r?(xt=O,J=n(re),O=J):(Y=O,O=r)):(Y=O,O=r),O}function pa(){var O,J,re,de,Ke;if(O=Y,J=bh(),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de!==r?(Ke=Va(),Ke===r&&(Ke=null),Ke!==r?(xt=O,J=c(J,de,Ke),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;if(O===r)if(O=Y,J=bh(),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de===r&&(de=null),de!==r?(xt=O,J=f(J,de),O=J):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function Va(){var O,J,re,de,Ke;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=pa(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=p(re),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function _g(){var O;return t.charCodeAt(Y)===59?(O=h,Y++):(O=r,mt===0&&wt(E)),O===r&&(t.charCodeAt(Y)===38?(O=C,Y++):(O=r,mt===0&&wt(S))),O}function bh(){var O,J,re;return O=Y,J=YA(),J!==r?(re=Ug(),re===r&&(re=null),re!==r?(xt=O,J=P(J,re),O=J):(Y=O,O=r)):(Y=O,O=r),O}function Ug(){var O,J,re,de,Ke,ft,dr;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=wy(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=bh(),Ke!==r){for(ft=[],dr=kt();dr!==r;)ft.push(dr),dr=kt();ft!==r?(xt=O,J=I(re,Ke),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function wy(){var O;return t.substr(Y,2)===R?(O=R,Y+=2):(O=r,mt===0&&wt(N)),O===r&&(t.substr(Y,2)===U?(O=U,Y+=2):(O=r,mt===0&&wt(W))),O}function YA(){var O,J,re;return O=Y,J=Cf(),J!==r?(re=Hg(),re===r&&(re=null),re!==r?(xt=O,J=te(J,re),O=J):(Y=O,O=r)):(Y=O,O=r),O}function Hg(){var O,J,re,de,Ke,ft,dr;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(re=Eu(),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=YA(),Ke!==r){for(ft=[],dr=kt();dr!==r;)ft.push(dr),dr=kt();ft!==r?(xt=O,J=ie(re,Ke),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function Eu(){var O;return t.substr(Y,2)===Ae?(O=Ae,Y+=2):(O=r,mt===0&&wt(ce)),O===r&&(t.charCodeAt(Y)===124?(O=me,Y++):(O=r,mt===0&&wt(pe))),O}function Iu(){var O,J,re,de,Ke,ft;if(O=Y,J=kh(),J!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,mt===0&&wt(Ce)),re!==r)if(de=VA(),de!==r){for(Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();Ke!==r?(xt=O,J=g(J,de),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;else Y=O,O=r;if(O===r)if(O=Y,J=kh(),J!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,mt===0&&wt(Ce)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=we(J),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function Cf(){var O,J,re,de,Ke,ft,dr,Br,_n,mi,Bs;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(t.charCodeAt(Y)===40?(re=ye,Y++):(re=r,mt===0&&wt(fe)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=pa(),Ke!==r){for(ft=[],dr=kt();dr!==r;)ft.push(dr),dr=kt();if(ft!==r)if(t.charCodeAt(Y)===41?(dr=se,Y++):(dr=r,mt===0&&wt(X)),dr!==r){for(Br=[],_n=kt();_n!==r;)Br.push(_n),_n=kt();if(Br!==r){for(_n=[],mi=qn();mi!==r;)_n.push(mi),mi=qn();if(_n!==r){for(mi=[],Bs=kt();Bs!==r;)mi.push(Bs),Bs=kt();mi!==r?(xt=O,J=De(Ke,_n),O=J):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r)if(t.charCodeAt(Y)===123?(re=Re,Y++):(re=r,mt===0&&wt(dt)),re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r)if(Ke=pa(),Ke!==r){for(ft=[],dr=kt();dr!==r;)ft.push(dr),dr=kt();if(ft!==r)if(t.charCodeAt(Y)===125?(dr=j,Y++):(dr=r,mt===0&&wt(rt)),dr!==r){for(Br=[],_n=kt();_n!==r;)Br.push(_n),_n=kt();if(Br!==r){for(_n=[],mi=qn();mi!==r;)_n.push(mi),mi=qn();if(_n!==r){for(mi=[],Bs=kt();Bs!==r;)mi.push(Bs),Bs=kt();mi!==r?(xt=O,J=Fe(Ke,_n),O=J):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){for(re=[],de=Iu();de!==r;)re.push(de),de=Iu();if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();if(de!==r){if(Ke=[],ft=Cu(),ft!==r)for(;ft!==r;)Ke.push(ft),ft=Cu();else Ke=r;if(Ke!==r){for(ft=[],dr=kt();dr!==r;)ft.push(dr),dr=kt();ft!==r?(xt=O,J=Ne(re,Ke),O=J):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;if(O===r){for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){if(re=[],de=Iu(),de!==r)for(;de!==r;)re.push(de),de=Iu();else re=r;if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=Pe(re),O=J):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}}}return O}function Ns(){var O,J,re,de,Ke;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r){if(re=[],de=ki(),de!==r)for(;de!==r;)re.push(de),de=ki();else re=r;if(re!==r){for(de=[],Ke=kt();Ke!==r;)de.push(Ke),Ke=kt();de!==r?(xt=O,J=Ye(re),O=J):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r;return O}function Cu(){var O,J,re;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();if(J!==r?(re=qn(),re!==r?(xt=O,J=ke(re),O=J):(Y=O,O=r)):(Y=O,O=r),O===r){for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();J!==r?(re=ki(),re!==r?(xt=O,J=ke(re),O=J):(Y=O,O=r)):(Y=O,O=r)}return O}function qn(){var O,J,re,de,Ke;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(it.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(_e)),re===r&&(re=null),re!==r?(de=ss(),de!==r?(Ke=ki(),Ke!==r?(xt=O,J=x(re,de,Ke),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function ss(){var O;return t.substr(Y,2)===w?(O=w,Y+=2):(O=r,mt===0&&wt(b)),O===r&&(t.substr(Y,2)===y?(O=y,Y+=2):(O=r,mt===0&&wt(F)),O===r&&(t.charCodeAt(Y)===62?(O=z,Y++):(O=r,mt===0&&wt(Z)),O===r&&(t.substr(Y,3)===$?(O=$,Y+=3):(O=r,mt===0&&wt(oe)),O===r&&(t.substr(Y,2)===xe?(O=xe,Y+=2):(O=r,mt===0&&wt(Te)),O===r&&(t.charCodeAt(Y)===60?(O=lt,Y++):(O=r,mt===0&&wt(It))))))),O}function ki(){var O,J,re;for(O=Y,J=[],re=kt();re!==r;)J.push(re),re=kt();return J!==r?(re=VA(),re!==r?(xt=O,J=ke(re),O=J):(Y=O,O=r)):(Y=O,O=r),O}function VA(){var O,J,re;if(O=Y,J=[],re=wf(),re!==r)for(;re!==r;)J.push(re),re=wf();else J=r;return J!==r&&(xt=O,J=qt(J)),O=J,O}function wf(){var O,J;return O=Y,J=mn(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=Y,J=jg(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=Y,J=qg(),J!==r&&(xt=O,J=ir(J)),O=J,O===r&&(O=Y,J=os(),J!==r&&(xt=O,J=ir(J)),O=J))),O}function mn(){var O,J,re,de;return O=Y,t.substr(Y,2)===Pt?(J=Pt,Y+=2):(J=r,mt===0&&wt(gn)),J!==r?(re=yn(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,mt===0&&wt(Ir)),de!==r?(xt=O,J=Nr(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function jg(){var O,J,re,de;return O=Y,t.charCodeAt(Y)===39?(J=Pr,Y++):(J=r,mt===0&&wt(Ir)),J!==r?(re=Bf(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,mt===0&&wt(Ir)),de!==r?(xt=O,J=Nr(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function qg(){var O,J,re,de;if(O=Y,t.substr(Y,2)===nn?(J=nn,Y+=2):(J=r,mt===0&&wt(ai)),J!==r&&(xt=O,J=wo()),O=J,O===r)if(O=Y,t.charCodeAt(Y)===34?(J=ns,Y++):(J=r,mt===0&&wt(to)),J!==r){for(re=[],de=xl();de!==r;)re.push(de),de=xl();re!==r?(t.charCodeAt(Y)===34?(de=ns,Y++):(de=r,mt===0&&wt(to)),de!==r?(xt=O,J=Bo(re),O=J):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function os(){var O,J,re;if(O=Y,J=[],re=ko(),re!==r)for(;re!==r;)J.push(re),re=ko();else J=r;return J!==r&&(xt=O,J=Bo(J)),O=J,O}function xl(){var O,J;return O=Y,J=Xr(),J!==r&&(xt=O,J=ji(J)),O=J,O===r&&(O=Y,J=xh(),J!==r&&(xt=O,J=ro(J)),O=J,O===r&&(O=Y,J=JA(),J!==r&&(xt=O,J=vo(J)),O=J,O===r&&(O=Y,J=vf(),J!==r&&(xt=O,J=RA(J)),O=J))),O}function ko(){var O,J;return O=Y,J=Xr(),J!==r&&(xt=O,J=pf(J)),O=J,O===r&&(O=Y,J=xh(),J!==r&&(xt=O,J=yh(J)),O=J,O===r&&(O=Y,J=JA(),J!==r&&(xt=O,J=Eh(J)),O=J,O===r&&(O=Y,J=By(),J!==r&&(xt=O,J=no(J)),O=J,O===r&&(O=Y,J=Ph(),J!==r&&(xt=O,J=RA(J)),O=J)))),O}function Bf(){var O,J,re;for(O=Y,J=[],jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Fs));re!==r;)J.push(re),jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Fs));return J!==r&&(xt=O,J=io(J)),O=J,O}function vf(){var O,J,re;if(O=Y,J=[],re=kl(),re===r&&(lu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(cu))),re!==r)for(;re!==r;)J.push(re),re=kl(),re===r&&(lu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(cu)));else J=r;return J!==r&&(xt=O,J=io(J)),O=J,O}function kl(){var O,J,re;return O=Y,t.substr(Y,2)===uu?(J=uu,Y+=2):(J=r,mt===0&&wt(FA)),J!==r&&(xt=O,J=NA()),O=J,O===r&&(O=Y,t.charCodeAt(Y)===92?(J=aa,Y++):(J=r,mt===0&&wt(la)),J!==r?(OA.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(gr)),re!==r?(xt=O,J=So(re),O=J):(Y=O,O=r)):(Y=O,O=r)),O}function yn(){var O,J,re;for(O=Y,J=[],re=Qo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Fs)));re!==r;)J.push(re),re=Qo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Fs)));return J!==r&&(xt=O,J=io(J)),O=J,O}function Qo(){var O,J,re;return O=Y,t.substr(Y,2)===Me?(J=Me,Y+=2):(J=r,mt===0&&wt(fu)),J!==r&&(xt=O,J=Cr()),O=J,O===r&&(O=Y,t.substr(Y,2)===hf?(J=hf,Y+=2):(J=r,mt===0&&wt(LA)),J!==r&&(xt=O,J=MA()),O=J,O===r&&(O=Y,t.charCodeAt(Y)===92?(J=aa,Y++):(J=r,mt===0&&wt(la)),J!==r?(Au.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(pu)),re!==r?(xt=O,J=ac(),O=J):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===ve?(J=ve,Y+=2):(J=r,mt===0&&wt(Nt)),J!==r&&(xt=O,J=lc()),O=J,O===r&&(O=Y,t.substr(Y,2)===Li?(J=Li,Y+=2):(J=r,mt===0&&wt(so)),J!==r&&(xt=O,J=Rt()),O=J,O===r&&(O=Y,t.substr(Y,2)===xn?(J=xn,Y+=2):(J=r,mt===0&&wt(ca)),J!==r&&(xt=O,J=qi()),O=J,O===r&&(O=Y,t.substr(Y,2)===Mi?(J=Mi,Y+=2):(J=r,mt===0&&wt(Oa)),J!==r&&(xt=O,J=dn()),O=J,O===r&&(O=Y,t.substr(Y,2)===Jn?(J=Jn,Y+=2):(J=r,mt===0&&wt(hu)),J!==r&&(xt=O,J=Ih()),O=J,O===r&&(O=Y,t.charCodeAt(Y)===92?(J=aa,Y++):(J=r,mt===0&&wt(la)),J!==r?(La.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Ma)),re!==r?(xt=O,J=So(re),O=J):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=wu()))))))))),O}function wu(){var O,J,re,de,Ke,ft,dr,Br,_n,mi,Bs,zA;return O=Y,t.charCodeAt(Y)===92?(J=aa,Y++):(J=r,mt===0&&wt(la)),J!==r?(re=ha(),re!==r?(xt=O,J=Ua(re),O=J):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Xe?(J=Xe,Y+=2):(J=r,mt===0&&wt(Ha)),J!==r?(re=Y,de=Y,Ke=ha(),Ke!==r?(ft=Os(),ft!==r?(Ke=[Ke,ft],de=Ke):(Y=de,de=r)):(Y=de,de=r),de===r&&(de=ha()),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,J=Ua(re),O=J):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===gf?(J=gf,Y+=2):(J=r,mt===0&&wt(cc)),J!==r?(re=Y,de=Y,Ke=Os(),Ke!==r?(ft=Os(),ft!==r?(dr=Os(),dr!==r?(Br=Os(),Br!==r?(Ke=[Ke,ft,dr,Br],de=Ke):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,J=Ua(re),O=J):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===wn?(J=wn,Y+=2):(J=r,mt===0&&wt(ua)),J!==r?(re=Y,de=Y,Ke=Os(),Ke!==r?(ft=Os(),ft!==r?(dr=Os(),dr!==r?(Br=Os(),Br!==r?(_n=Os(),_n!==r?(mi=Os(),mi!==r?(Bs=Os(),Bs!==r?(zA=Os(),zA!==r?(Ke=[Ke,ft,dr,Br,_n,mi,Bs,zA],de=Ke):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,J=_A(re),O=J):(Y=O,O=r)):(Y=O,O=r)))),O}function ha(){var O;return UA.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,mt===0&&wt(fa)),O}function Os(){var O;return vl.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,mt===0&&wt(Mt)),O}function Ph(){var O,J,re,de,Ke;if(O=Y,J=[],re=Y,t.charCodeAt(Y)===92?(de=aa,Y++):(de=r,mt===0&&wt(la)),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===Aa?(de=Aa,Y+=2):(de=r,mt===0&&wt(ja)),de!==r&&(xt=re,de=is()),re=de,re===r&&(re=Y,de=Y,mt++,Ke=vy(),mt--,Ke===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r))),re!==r)for(;re!==r;)J.push(re),re=Y,t.charCodeAt(Y)===92?(de=aa,Y++):(de=r,mt===0&&wt(la)),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===Aa?(de=Aa,Y+=2):(de=r,mt===0&&wt(ja)),de!==r&&(xt=re,de=is()),re=de,re===r&&(re=Y,de=Y,mt++,Ke=vy(),mt--,Ke===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r)));else J=r;return J!==r&&(xt=O,J=io(J)),O=J,O}function KA(){var O,J,re,de,Ke,ft;if(O=Y,t.charCodeAt(Y)===45?(J=uc,Y++):(J=r,mt===0&&wt(gu)),J===r&&(t.charCodeAt(Y)===43?(J=fc,Y++):(J=r,mt===0&&wt(qa))),J===r&&(J=null),J!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,mt===0&&wt(_e)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,mt===0&&wt(_e));else re=r;if(re!==r)if(t.charCodeAt(Y)===46?(de=_i,Y++):(de=r,mt===0&&wt(ws)),de!==r){if(Ke=[],it.test(t.charAt(Y))?(ft=t.charAt(Y),Y++):(ft=r,mt===0&&wt(_e)),ft!==r)for(;ft!==r;)Ke.push(ft),it.test(t.charAt(Y))?(ft=t.charAt(Y),Y++):(ft=r,mt===0&&wt(_e));else Ke=r;Ke!==r?(xt=O,J=Sl(J,re,Ke),O=J):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;if(O===r){if(O=Y,t.charCodeAt(Y)===45?(J=uc,Y++):(J=r,mt===0&&wt(gu)),J===r&&(t.charCodeAt(Y)===43?(J=fc,Y++):(J=r,mt===0&&wt(qa))),J===r&&(J=null),J!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,mt===0&&wt(_e)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,mt===0&&wt(_e));else re=r;re!==r?(xt=O,J=df(J,re),O=J):(Y=O,O=r)}else Y=O,O=r;if(O===r&&(O=Y,J=JA(),J!==r&&(xt=O,J=Ac(J)),O=J,O===r&&(O=Y,J=hc(),J!==r&&(xt=O,J=Bi(J)),O=J,O===r)))if(O=Y,t.charCodeAt(Y)===40?(J=ye,Y++):(J=r,mt===0&&wt(fe)),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=oo(),de!==r){for(Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();Ke!==r?(t.charCodeAt(Y)===41?(ft=se,Y++):(ft=r,mt===0&&wt(X)),ft!==r?(xt=O,J=Qn(de),O=J):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r}return O}function Sf(){var O,J,re,de,Ke,ft,dr,Br;if(O=Y,J=KA(),J!==r){for(re=[],de=Y,Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();if(Ke!==r)if(t.charCodeAt(Y)===42?(ft=pc,Y++):(ft=r,mt===0&&wt(Je)),ft===r&&(t.charCodeAt(Y)===47?(ft=st,Y++):(ft=r,mt===0&&wt(St))),ft!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=KA(),Br!==r?(xt=de,Ke=lr(J,ft,Br),de=Ke):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();if(Ke!==r)if(t.charCodeAt(Y)===42?(ft=pc,Y++):(ft=r,mt===0&&wt(Je)),ft===r&&(t.charCodeAt(Y)===47?(ft=st,Y++):(ft=r,mt===0&&wt(St))),ft!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=KA(),Br!==r?(xt=de,Ke=lr(J,ft,Br),de=Ke):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,J=ee(J,re),O=J):(Y=O,O=r)}else Y=O,O=r;return O}function oo(){var O,J,re,de,Ke,ft,dr,Br;if(O=Y,J=Sf(),J!==r){for(re=[],de=Y,Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();if(Ke!==r)if(t.charCodeAt(Y)===43?(ft=fc,Y++):(ft=r,mt===0&&wt(qa)),ft===r&&(t.charCodeAt(Y)===45?(ft=uc,Y++):(ft=r,mt===0&&wt(gu))),ft!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=Sf(),Br!==r?(xt=de,Ke=Ee(J,ft,Br),de=Ke):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();if(Ke!==r)if(t.charCodeAt(Y)===43?(ft=fc,Y++):(ft=r,mt===0&&wt(qa)),ft===r&&(t.charCodeAt(Y)===45?(ft=uc,Y++):(ft=r,mt===0&&wt(gu))),ft!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=Sf(),Br!==r?(xt=de,Ke=Ee(J,ft,Br),de=Ke):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,J=ee(J,re),O=J):(Y=O,O=r)}else Y=O,O=r;return O}function Xr(){var O,J,re,de,Ke,ft;if(O=Y,t.substr(Y,3)===Oe?(J=Oe,Y+=3):(J=r,mt===0&&wt(gt)),J!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=oo(),de!==r){for(Ke=[],ft=kt();ft!==r;)Ke.push(ft),ft=kt();Ke!==r?(t.substr(Y,2)===yt?(ft=yt,Y+=2):(ft=r,mt===0&&wt(Dt)),ft!==r?(xt=O,J=tr(de),O=J):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;return O}function xh(){var O,J,re,de;return O=Y,t.substr(Y,2)===fn?(J=fn,Y+=2):(J=r,mt===0&&wt(li)),J!==r?(re=pa(),re!==r?(t.charCodeAt(Y)===41?(de=se,Y++):(de=r,mt===0&&wt(X)),de!==r?(xt=O,J=Gi(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function JA(){var O,J,re,de,Ke,ft;return O=Y,t.substr(Y,2)===Tn?(J=Tn,Y+=2):(J=r,mt===0&&wt(Ga)),J!==r?(re=hc(),re!==r?(t.substr(Y,2)===gy?(de=gy,Y+=2):(de=r,mt===0&&wt(X1)),de!==r?(Ke=Ns(),Ke!==r?(t.charCodeAt(Y)===125?(ft=j,Y++):(ft=r,mt===0&&wt(rt)),ft!==r?(xt=O,J=Do(re,Ke),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(J=Tn,Y+=2):(J=r,mt===0&&wt(Ga)),J!==r?(re=hc(),re!==r?(t.substr(Y,3)===dy?(de=dy,Y+=3):(de=r,mt===0&&wt(Ch)),de!==r?(xt=O,J=$1(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(J=Tn,Y+=2):(J=r,mt===0&&wt(Ga)),J!==r?(re=hc(),re!==r?(t.substr(Y,2)===bo?(de=bo,Y+=2):(de=r,mt===0&&wt(wh)),de!==r?(Ke=Ns(),Ke!==r?(t.charCodeAt(Y)===125?(ft=j,Y++):(ft=r,mt===0&&wt(rt)),ft!==r?(xt=O,J=Bh(re,Ke),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(J=Tn,Y+=2):(J=r,mt===0&&wt(Ga)),J!==r?(re=hc(),re!==r?(t.substr(Y,3)===du?(de=du,Y+=3):(de=r,mt===0&&wt(vh)),de!==r?(xt=O,J=Rg(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Tn?(J=Tn,Y+=2):(J=r,mt===0&&wt(Ga)),J!==r?(re=hc(),re!==r?(t.charCodeAt(Y)===125?(de=j,Y++):(de=r,mt===0&&wt(rt)),de!==r?(xt=O,J=Fg(re),O=J):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.charCodeAt(Y)===36?(J=Ng,Y++):(J=r,mt===0&&wt(my)),J!==r?(re=hc(),re!==r?(xt=O,J=Fg(re),O=J):(Y=O,O=r)):(Y=O,O=r)))))),O}function By(){var O,J,re;return O=Y,J=Gg(),J!==r?(xt=Y,re=mf(J),re?re=void 0:re=r,re!==r?(xt=O,J=Po(J),O=J):(Y=O,O=r)):(Y=O,O=r),O}function Gg(){var O,J,re,de,Ke;if(O=Y,J=[],re=Y,de=Y,mt++,Ke=Qh(),mt--,Ke===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r),re!==r)for(;re!==r;)J.push(re),re=Y,de=Y,mt++,Ke=Qh(),mt--,Ke===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Ke=t.charAt(Y),Y++):(Ke=r,mt===0&&wt(kn)),Ke!==r?(xt=re,de=So(Ke),re=de):(Y=re,re=r)):(Y=re,re=r);else J=r;return J!==r&&(xt=O,J=io(J)),O=J,O}function kh(){var O,J,re;if(O=Y,J=[],Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Sh)),re!==r)for(;re!==r;)J.push(re),Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Sh));else J=r;return J!==r&&(xt=O,J=Og()),O=J,O}function hc(){var O,J,re;if(O=Y,J=[],bl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Pl)),re!==r)for(;re!==r;)J.push(re),bl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,mt===0&&wt(Pl));else J=r;return J!==r&&(xt=O,J=Og()),O=J,O}function vy(){var O;return yy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,mt===0&&wt(HA)),O}function Qh(){var O;return Ey.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,mt===0&&wt(Iy)),O}function kt(){var O,J;if(O=[],jA.test(t.charAt(Y))?(J=t.charAt(Y),Y++):(J=r,mt===0&&wt(qA)),J!==r)for(;J!==r;)O.push(J),jA.test(t.charAt(Y))?(J=t.charAt(Y),Y++):(J=r,mt===0&&wt(qA));else O=r;return O}if(mu=a(),mu!==r&&Y===t.length)return mu;throw mu!==r&&Y!1}){try{return(0,Gee.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function cE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a)=>`${Ex(r)}${s===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function Ex(t){return`${uE(t.chain)}${t.then?` ${q_(t.then)}`:""}`}function q_(t){return`${t.type} ${Ex(t.line)}`}function uE(t){return`${W_(t)}${t.then?` ${G_(t.then)}`:""}`}function G_(t){return`${t.type} ${uE(t.chain)}`}function W_(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>mx(e)).join(" ")} `:""}${t.args.map(e=>Y_(e)).join(" ")}`;case"subshell":return`(${cE(t.subshell)})${t.args.length>0?` ${t.args.map(e=>H2(e)).join(" ")}`:""}`;case"group":return`{ ${cE(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>H2(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>mx(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function mx(t){return`${t.name}=${t.args[0]?Bd(t.args[0]):""}`}function Y_(t){switch(t.type){case"redirection":return H2(t);case"argument":return Bd(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function H2(t){return`${t.subtype} ${t.args.map(e=>Bd(e)).join(" ")}`}function Bd(t){return t.segments.map(e=>V_(e)).join("")}function V_(t){let e=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<>$|&;"'\n\t ]/)?s.match(/['\t\p{C}]/u)?s.match(/'/)?`"${s.replace(/["$\t\p{C}]/u,z7e)}"`:`$'${s.replace(/[\t\p{C}]/u,Yee)}'`:`'${s}'`:s;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${cE(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(s=>Bd(s)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(s=>Bd(s)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${Ix(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function Ix(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,s=a=>r(Ix(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${s(t.left)} ${e(t.type)} ${s(t.right)}`}}var Gee,Wee,J7e,Yee,z7e,Vee=Ct(()=>{Gee=et(qee());Wee=new Map([["\f","\\f"],[`
-`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),J7e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(Wee,([t,e])=>[t,`"$'${e}'"`])]),Yee=t=>Wee.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,z7e=t=>J7e.get(t)??`"$'${Yee(t)}'"`});var Jee=L((zGt,Kee)=>{"use strict";function Z7e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function vd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,vd)}Z7e(vd,Error);vd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;CAe&&(Ae=W,ce=[]),ce.push(_e))}function rt(_e,x){return new vd(_e,null,null,x)}function Fe(_e,x,w){return new vd(vd.buildMessage(_e,x),_e,x,w)}function Ne(){var _e,x,w,b;return _e=W,x=Pe(),x!==r?(t.charCodeAt(W)===47?(w=n,W++):(w=r,me===0&&j(c)),w!==r?(b=Pe(),b!==r?(te=_e,x=f(x,b),_e=x):(W=_e,_e=r)):(W=_e,_e=r)):(W=_e,_e=r),_e===r&&(_e=W,x=Pe(),x!==r&&(te=_e,x=p(x)),_e=x),_e}function Pe(){var _e,x,w,b;return _e=W,x=Ye(),x!==r?(t.charCodeAt(W)===64?(w=h,W++):(w=r,me===0&&j(E)),w!==r?(b=it(),b!==r?(te=_e,x=C(x,b),_e=x):(W=_e,_e=r)):(W=_e,_e=r)):(W=_e,_e=r),_e===r&&(_e=W,x=Ye(),x!==r&&(te=_e,x=S(x)),_e=x),_e}function Ye(){var _e,x,w,b,y;return _e=W,t.charCodeAt(W)===64?(x=h,W++):(x=r,me===0&&j(E)),x!==r?(w=ke(),w!==r?(t.charCodeAt(W)===47?(b=n,W++):(b=r,me===0&&j(c)),b!==r?(y=ke(),y!==r?(te=_e,x=P(),_e=x):(W=_e,_e=r)):(W=_e,_e=r)):(W=_e,_e=r)):(W=_e,_e=r),_e===r&&(_e=W,x=ke(),x!==r&&(te=_e,x=P()),_e=x),_e}function ke(){var _e,x,w;if(_e=W,x=[],I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(R)),w!==r)for(;w!==r;)x.push(w),I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(R));else x=r;return x!==r&&(te=_e,x=P()),_e=x,_e}function it(){var _e,x,w;if(_e=W,x=[],N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U)),w!==r)for(;w!==r;)x.push(w),N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U));else x=r;return x!==r&&(te=_e,x=P()),_e=x,_e}if(pe=a(),pe!==r&&W===t.length)return pe;throw pe!==r&&W{zee=et(Jee())});var Dd=L((XGt,Sd)=>{"use strict";function Xee(t){return typeof t>"u"||t===null}function $7e(t){return typeof t=="object"&&t!==null}function eKe(t){return Array.isArray(t)?t:Xee(t)?[]:[t]}function tKe(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r{"use strict";function j2(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}j2.prototype=Object.create(Error.prototype);j2.prototype.constructor=j2;j2.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};$ee.exports=j2});var rte=L((e5t,tte)=>{"use strict";var ete=Dd();function K_(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.line=s,this.column=a}K_.prototype.getSnippet=function(e,r){var s,a,n,c,f;if(!this.buffer)return null;for(e=e||4,r=r||75,s="",a=this.position;a>0&&`\0\r
+`)}async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,s.atime,s.mtime)}async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,s.atime,s.mtime)}},Uf=class extends mp{constructor(){super(J)}}});var _s,yp=Ze(()=>{Id();_s=class extends mp{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e),r,s)}openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,a,n)}readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,s):await this.baseFs.writePromise(e,r,s,a,n)}writeSync(e,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,s):this.baseFs.writeSync(e,r,s,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase(e),r,s)}chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),s)}copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),s)}async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,s)}appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,s)}async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,s)}writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,s)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBase(e),r,s)}utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapToBase(e),r,s)}lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(c,a,s)}symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(c,a,s)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var _f,JX=Ze(()=>{yp();_f=class extends _s{constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function KX(t){let e=t;return typeof t.path=="string"&&(e.path=fe.toPortablePath(t.path)),e}var zX,Yn,Cd=Ze(()=>{zX=ut(Ie("fs"));Id();el();Yn=class extends Uf{constructor(e=zX.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return vt.root}resolve(e){return J.resolve(e)}async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.open(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}openSync(e,r,s){return this.realFs.openSync(fe.fromPortablePath(e),r,s)}async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<"u"?this.realFs.opendir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.opendir(fe.fromPortablePath(e),this.makeCallback(s,a))}).then(s=>{let a=s;return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(fe.fromPortablePath(e),r):this.realFs.opendirSync(fe.fromPortablePath(e));return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{this.realFs.read(e,r,s,a,n,(p,h)=>{p?f(p):c(h)})})}readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r=="string"?this.realFs.write(e,r,s,this.makeCallback(c,f)):this.realFs.write(e,r,s,a,n,this.makeCallback(c,f)))}writeSync(e,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(e,r,s):this.realFs.writeSync(e,r,s,a,n)}async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this.makeCallback(r,s))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createReadStream(s,r)}createWriteStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createWriteStream(s,r)}async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.realpath(fe.fromPortablePath(e),{},this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}realpathSync(e){return fe.toPortablePath(this.realFs.realpathSync(fe.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(fe.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(fe.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.access(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}existsSync(e){return this.realFs.existsSync(fe.fromPortablePath(e))}async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.stat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.stat(fe.fromPortablePath(e),this.makeCallback(s,a))})}statSync(e,r){return r?this.realFs.statSync(fe.fromPortablePath(e),r):this.realFs.statSync(fe.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(s,a)):this.realFs.fstat(e,this.makeCallback(s,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.lstat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.lstat(fe.fromPortablePath(e),this.makeCallback(s,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(fe.fromPortablePath(e),r):this.realFs.lstatSync(fe.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fchmod(e,r,this.makeCallback(s,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chmod(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}chmodSync(e,r){return this.realFs.chmodSync(fe.fromPortablePath(e),r)}async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.fchown(e,r,s,this.makeCallback(a,n))})}fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.chown(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}chownSync(e,r,s){return this.realFs.chownSync(fe.fromPortablePath(e),r,s)}async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.rename(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}renameSync(e,r){return this.realFs.renameSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.realFs.copyFile(fe.fromPortablePath(e),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}copyFileSync(e,r,s=0){return this.realFs.copyFileSync(fe.fromPortablePath(e),fe.fromPortablePath(r),s)}async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.appendFile(c,r,s,this.makeCallback(a,n)):this.realFs.appendFile(c,r,this.makeCallback(a,n))})}appendFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.appendFileSync(a,r,s):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.writeFile(c,r,s,this.makeCallback(a,n)):this.realFs.writeFile(c,r,this.makeCallback(a,n))})}writeFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.writeFileSync(a,r,s):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unlink(fe.fromPortablePath(e),this.makeCallback(r,s))})}unlinkSync(e){return this.realFs.unlinkSync(fe.fromPortablePath(e))}async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.utimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}utimesSync(e,r,s){this.realFs.utimesSync(fe.fromPortablePath(e),r,s)}async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.lutimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}lutimesSync(e,r,s){this.realFs.lutimesSync(fe.fromPortablePath(e),r,s)}async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkdir(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(fe.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rmdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rmdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(fe.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rm(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmSync(e,r){return this.realFs.rmSync(fe.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}linkSync(e,r){return this.realFs.linkSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.symlink(fe.fromPortablePath(e.replace(/\/+$/,"")),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}symlinkSync(e,r,s){return this.realFs.symlinkSync(fe.fromPortablePath(e.replace(/\/+$/,"")),fe.fromPortablePath(r),s)}async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof e=="string"?fe.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(s,a))})}readFileSync(e,r){let s=typeof e=="string"?fe.fromPortablePath(e):e;return this.realFs.readFileSync(s,r)}async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(KX)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(fe.toPortablePath)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.readdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(fe.fromPortablePath(e),r).map(KX):this.realFs.readdirSync(fe.fromPortablePath(e),r).map(fe.toPortablePath):this.realFs.readdirSync(fe.fromPortablePath(e),r):this.realFs.readdirSync(fe.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.readlink(fe.fromPortablePath(e),this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}readlinkSync(e){return fe.toPortablePath(this.realFs.readlinkSync(fe.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.truncate(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}truncateSync(e,r){return this.realFs.truncateSync(fe.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(s,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,s){return this.realFs.watch(fe.fromPortablePath(e),r,s)}watchFile(e,r,s){return this.realFs.watchFile(fe.fromPortablePath(e),r,s)}unwatchFile(e,r){return this.realFs.unwatchFile(fe.fromPortablePath(e),r)}makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}}});var Sn,ZX=Ze(()=>{Cd();yp();el();Sn=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?J.normalize(e):this.baseFs.resolve(J.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var XX,Hf,$X=Ze(()=>{Cd();yp();el();XX=vt.root,Hf=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.resolve(vt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(vt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(XX,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(XX,this.pathUtils.relative(this.target,e))}}});var sE,e$=Ze(()=>{yp();sE=class extends _s{constructor(r,s){super(s);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var wd,tl,e0,t$=Ze(()=>{wd=Ie("fs");Id();Cd();vU();VP();el();tl=4278190080,e0=class extends Uf{constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:c=!0,maxAge:f=5e3,typeCheck:p=wd.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:w}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=c?new Map:null,this.factoryPromise=E,this.factorySync=w,this.filter=s,this.getMountPoint=h,this.magic=a<<24,this.maxAge=f,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s]),a}async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,s,a),async(n,{subPath:c})=>this.remapFd(n,await n.openPromise(c,s,a)))}openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,a),(n,{subPath:c})=>this.remapFd(n,n.openSync(c,s,a)))}async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,s),async(a,{subPath:n})=>await a.opendirPromise(n,s),{requireSubpath:!1})}opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,s),(a,{subPath:n})=>a.opendirSync(n,s),{requireSubpath:!1})}async readPromise(r,s,a,n,c){if((r&tl)!==this.magic)return await this.baseFs.readPromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("read");let[p,h]=f;return await p.readPromise(h,s,a,n,c)}readSync(r,s,a,n,c){if((r&tl)!==this.magic)return this.baseFs.readSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("readSync");let[p,h]=f;return p.readSync(h,s,a,n,c)}async writePromise(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="string"?await this.baseFs.writePromise(r,s,a):await this.baseFs.writePromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("write");let[p,h]=f;return typeof s=="string"?await p.writePromise(h,s,a):await p.writePromise(h,s,a,n,c)}writeSync(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="string"?this.baseFs.writeSync(r,s,a):this.baseFs.writeSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("writeSync");let[p,h]=f;return typeof s=="string"?p.writeSync(h,s,a):p.writeSync(h,s,a,n,c)}async closePromise(r){if((r&tl)!==this.magic)return await this.baseFs.closePromise(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Mo("close");this.fdMap.delete(r);let[a,n]=s;return await a.closePromise(n)}closeSync(r){if((r&tl)!==this.magic)return this.baseFs.closeSync(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Mo("closeSync");this.fdMap.delete(r);let[a,n]=s;return a.closeSync(n)}createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,s),(a,{archivePath:n,subPath:c})=>{let f=a.createReadStream(c,s);return f.path=fe.fromPortablePath(this.pathUtils.join(n,c)),f})}createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,s),(a,{subPath:n})=>a.createWriteStream(n,s))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=await this.baseFs.realpathPromise(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,await s.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=this.baseFs.realpathSync(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,s.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(s,{subPath:a})=>await s.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(s,{subPath:a})=>s.existsSync(a))}async accessPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,s),async(a,{subPath:n})=>await a.accessPromise(n,s))}accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,s),(a,{subPath:n})=>a.accessSync(n,s))}async statPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,s),async(a,{subPath:n})=>await a.statPromise(n,s))}statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(a,{subPath:n})=>a.statSync(n,s))}async fstatPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fstat");let[n,c]=a;return n.fstatPromise(c,s)}fstatSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fstatSync");let[n,c]=a;return n.fstatSync(c,s)}async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,s),async(a,{subPath:n})=>await a.lstatPromise(n,s))}lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s),(a,{subPath:n})=>a.lstatSync(n,s))}async fchmodPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fchmod");let[n,c]=a;return n.fchmodPromise(c,s)}fchmodSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fchmodSync");let[n,c]=a;return n.fchmodSync(c,s)}async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,s),async(a,{subPath:n})=>await a.chmodPromise(n,s))}chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s),(a,{subPath:n})=>a.chmodSync(n,s))}async fchownPromise(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownPromise(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Mo("fchown");let[c,f]=n;return c.fchownPromise(f,s,a)}fchownSync(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownSync(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Mo("fchownSync");let[c,f]=n;return c.fchownSync(f,s,a)}async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,s,a),async(n,{subPath:c})=>await n.chownPromise(c,s,a))}chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,s,a),(n,{subPath:c})=>n.chownSync(c,s,a))}async renamePromise(r,s){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.renamePromise(r,s),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(s,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,f)}))}renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.renameSync(r,s),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(s,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,f)}))}async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&wd.constants.COPYFILE_EXCL&&await this.existsPromise(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await c.readFilePromise(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.copyFilePromise(r,s,a),async(c,{subPath:f})=>await n(this.baseFs,r,c,f)),async(c,{subPath:f})=>await this.makeCallPromise(s,async()=>await n(c,f,this.baseFs,s),async(p,{subPath:h})=>c!==p?await n(c,f,p,h):await c.copyFilePromise(f,h,a)))}copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&wd.constants.COPYFILE_EXCL&&this.existsSync(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=c.readFileSync(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.copyFileSync(r,s,a),(c,{subPath:f})=>n(this.baseFs,r,c,f)),(c,{subPath:f})=>this.makeCallSync(s,()=>n(c,f,this.baseFs,s),(p,{subPath:h})=>c!==p?n(c,f,p,h):c.copyFileSync(f,h,a)))}async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,s,a),async(n,{subPath:c})=>await n.appendFilePromise(c,s,a))}appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,s,a),(n,{subPath:c})=>n.appendFileSync(c,s,a))}async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,s,a),async(n,{subPath:c})=>await n.writeFilePromise(c,s,a))}writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,s,a),(n,{subPath:c})=>n.writeFileSync(c,s,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(s,{subPath:a})=>await s.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(s,{subPath:a})=>s.unlinkSync(a))}async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,s,a),async(n,{subPath:c})=>await n.utimesPromise(c,s,a))}utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,s,a),(n,{subPath:c})=>n.utimesSync(c,s,a))}async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,s,a),async(n,{subPath:c})=>await n.lutimesPromise(c,s,a))}lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,s,a),(n,{subPath:c})=>n.lutimesSync(c,s,a))}async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,s),async(a,{subPath:n})=>await a.mkdirPromise(n,s))}mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s),(a,{subPath:n})=>a.mkdirSync(n,s))}async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,s),async(a,{subPath:n})=>await a.rmdirPromise(n,s))}rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s),(a,{subPath:n})=>a.rmdirSync(n,s))}async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,s),async(a,{subPath:n})=>await a.rmPromise(n,s))}rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{subPath:n})=>a.rmSync(n,s))}async linkPromise(r,s){return await this.makeCallPromise(s,async()=>await this.baseFs.linkPromise(r,s),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=>await this.baseFs.symlinkPromise(r,s,a),async(n,{subPath:c})=>await n.symlinkPromise(r,c))}symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSync(r,s,a),(n,{subPath:c})=>n.symlinkSync(r,c))}async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,s),async(a,{subPath:n})=>await a.readFilePromise(n,s))}readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,s),(a,{subPath:n})=>a.readFileSync(n,s))}async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,s),async(a,{subPath:n})=>await a.readdirPromise(n,s),{requireSubpath:!1})}readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,s),(a,{subPath:n})=>a.readdirSync(n,s),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(s,{subPath:a})=>await s.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(s,{subPath:a})=>s.readlinkSync(a))}async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,s),async(a,{subPath:n})=>await a.truncatePromise(n,s))}truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,s),(a,{subPath:n})=>a.truncateSync(n,s))}async ftruncatePromise(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncatePromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("ftruncate");let[n,c]=a;return n.ftruncatePromise(c,s)}ftruncateSync(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncateSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("ftruncateSync");let[n,c]=a;return n.ftruncateSync(c,s)}watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,{subPath:c})=>n.watch(c,s,a))}watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,s,a),()=>iE(this,r,s,a))}unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,s),()=>md(this,r,s))}async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await s();let c=this.resolve(r),f=this.findMount(c);return f?n&&f.subPath==="/"?await s():await this.getMountPromise(f.archivePath,async p=>await a(p,f)):await s()}makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return s();let c=this.resolve(r),f=this.findMount(c);return!f||n&&f.subPath==="/"?s():this.getMountSync(f.archivePath,p=>a(p,f))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";for(;;){let a=r.substring(s.length),n=this.getMountPoint(a,s);if(!n)return null;if(s=this.pathUtils.join(s,n),!this.isMount.has(s)){if(this.notMount.has(s))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(s).mode&wd.constants.S_IFMT)!==this.typeCheck){this.notMount.add(s);continue}}catch{return null}this.isMount.add(s)}return{archivePath:s,subPath:this.pathUtils.join(vt.root,r.substring(s.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),a=s+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[c,{childFs:f,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||f.hasOpenFileHandles?.())){if(s>=p){f.saveAndClose?.(),this.mountInstances.delete(c),n-=1;continue}else if(r===null||n<=0){a=p;break}f.saveAndClose?.(),this.mountInstances.delete(c),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-s).unref())}async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await s(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await s(a)}finally{a.saveAndClose?.()}}}getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,s(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return s(a)}finally{a.saveAndClose?.()}}}}});var er,ex,r$=Ze(()=>{Id();el();er=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),ex=class t extends mp{static{this.instance=new t}constructor(){super(J)}getExtractHint(){throw er()}getRealPath(){throw er()}resolve(){throw er()}async openPromise(){throw er()}openSync(){throw er()}async opendirPromise(){throw er()}opendirSync(){throw er()}async readPromise(){throw er()}readSync(){throw er()}async writePromise(){throw er()}writeSync(){throw er()}async closePromise(){throw er()}closeSync(){throw er()}createWriteStream(){throw er()}createReadStream(){throw er()}async realpathPromise(){throw er()}realpathSync(){throw er()}async readdirPromise(){throw er()}readdirSync(){throw er()}async existsPromise(e){throw er()}existsSync(e){throw er()}async accessPromise(){throw er()}accessSync(){throw er()}async statPromise(){throw er()}statSync(){throw er()}async fstatPromise(e){throw er()}fstatSync(e){throw er()}async lstatPromise(e){throw er()}lstatSync(e){throw er()}async fchmodPromise(){throw er()}fchmodSync(){throw er()}async chmodPromise(){throw er()}chmodSync(){throw er()}async fchownPromise(){throw er()}fchownSync(){throw er()}async chownPromise(){throw er()}chownSync(){throw er()}async mkdirPromise(){throw er()}mkdirSync(){throw er()}async rmdirPromise(){throw er()}rmdirSync(){throw er()}async rmPromise(){throw er()}rmSync(){throw er()}async linkPromise(){throw er()}linkSync(){throw er()}async symlinkPromise(){throw er()}symlinkSync(){throw er()}async renamePromise(){throw er()}renameSync(){throw er()}async copyFilePromise(){throw er()}copyFileSync(){throw er()}async appendFilePromise(){throw er()}appendFileSync(){throw er()}async writeFilePromise(){throw er()}writeFileSync(){throw er()}async unlinkPromise(){throw er()}unlinkSync(){throw er()}async utimesPromise(){throw er()}utimesSync(){throw er()}async lutimesPromise(){throw er()}lutimesSync(){throw er()}async readFilePromise(){throw er()}readFileSync(){throw er()}async readlinkPromise(){throw er()}readlinkSync(){throw er()}async truncatePromise(){throw er()}truncateSync(){throw er()}async ftruncatePromise(e,r){throw er()}ftruncateSync(e,r){throw er()}watch(){throw er()}watchFile(){throw er()}unwatchFile(){throw er()}}});var t0,n$=Ze(()=>{yp();el();t0=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return fe.fromPortablePath(e)}mapToBase(e){return fe.toPortablePath(e)}}});var zGe,SU,ZGe,uo,i$=Ze(()=>{Cd();yp();el();zGe=/^[0-9]+$/,SU=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,ZGe=/^([^/]+-)?[a-f0-9]+$/,uo=class t extends _s{static makeVirtualPath(e,r,s){if(J.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!J.basename(r).match(ZGe))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=J.relative(J.dirname(e),s).split("/"),c=0;for(;c{DU=ut(Ie("buffer")),s$=Ie("url"),o$=Ie("util");yp();el();tx=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0,s$.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!XGe(e,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,o$.inspect)(e)}`)}}});var A$,Uo,Ep,r0,rx,nx,oE,Tu,Fu,l$,c$,u$,f$,O2,p$=Ze(()=>{A$=Ie("readline"),Uo=Symbol("kBaseFs"),Ep=Symbol("kFd"),r0=Symbol("kClosePromise"),rx=Symbol("kCloseResolve"),nx=Symbol("kCloseReject"),oE=Symbol("kRefs"),Tu=Symbol("kRef"),Fu=Symbol("kUnref"),O2=class{constructor(e,r){this[f$]=1;this[u$]=void 0;this[c$]=void 0;this[l$]=void 0;this[Uo]=r,this[Ep]=e}get fd(){return this[Ep]}async appendFile(e,r){try{this[Tu](this.appendFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Uo].appendFilePromise(this.fd,e,s?{encoding:s}:void 0)}finally{this[Fu]()}}async chown(e,r){try{return this[Tu](this.chown),await this[Uo].fchownPromise(this.fd,e,r)}finally{this[Fu]()}}async chmod(e){try{return this[Tu](this.chmod),await this[Uo].fchmodPromise(this.fd,e)}finally{this[Fu]()}}createReadStream(e){return this[Uo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Uo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,s,a){try{this[Tu](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,s=e.length??n.byteLength,a=e.position??null),r??=0,s??=0,s===0?{bytesRead:s,buffer:n}:{bytesRead:await this[Uo].readPromise(this.fd,n,r,s,a),buffer:n}}finally{this[Fu]()}}async readFile(e){try{this[Tu](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[Uo].readFilePromise(this.fd,r)}finally{this[Fu]()}}readLines(e){return(0,A$.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Tu](this.stat),await this[Uo].fstatPromise(this.fd,e)}finally{this[Fu]()}}async truncate(e){try{return this[Tu](this.truncate),await this[Uo].ftruncatePromise(this.fd,e)}finally{this[Fu]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Tu](this.writeFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;await this[Uo].writeFilePromise(this.fd,e,s)}finally{this[Fu]()}}async write(...e){try{if(this[Tu](this.write),ArrayBuffer.isView(e[0])){let[r,s,a,n]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,s,a]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s,a),buffer:r}}}finally{this[Fu]()}}async writev(e,r){try{this[Tu](this.writev);let s=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);s+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);s+=n.bytesWritten}return{buffers:e,bytesWritten:s}}finally{this[Fu]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[Ep]===-1)return Promise.resolve();if(this[r0])return this[r0];if(this[oE]--,this[oE]===0){let e=this[Ep];this[Ep]=-1,this[r0]=this[Uo].closePromise(e).finally(()=>{this[r0]=void 0})}else this[r0]=new Promise((e,r)=>{this[rx]=e,this[nx]=r}).finally(()=>{this[r0]=void 0,this[nx]=void 0,this[rx]=void 0});return this[r0]}[(Uo,Ep,f$=oE,u$=r0,c$=rx,l$=nx,Tu)](e){if(this[Ep]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[oE]++}[Fu](){if(this[oE]--,this[oE]===0){let e=this[Ep];this[Ep]=-1,this[Uo].closePromise(e).then(this[rx],this[nx])}}}});function L2(t,e){e=new tx(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?.[aE.promisify.custom]<"u"&&(n[aE.promisify.custom]=c[aE.promisify.custom])};{r(t,"exists",(s,...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(s).then(f=>{c(f)},()=>{c(!1)})})}),r(t,"read",(...s)=>{let[a,n,c,f,p,h]=s;if(s.length<=3){let E={};s.length<3?h=s[1]:(E=s[1],h=s[2]),{buffer:n=Buffer.alloc(16384),offset:c=0,length:f=n.byteLength,position:p}=E}if(c==null&&(c=0),f|=0,f===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,c,f,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let s of h$){let a=s.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[s];if(typeof n>"u")continue;r(t,a,(...f)=>{let h=typeof f[f.length-1]=="function"?f.pop():()=>{};process.nextTick(()=>{n.apply(e,f).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",s=>{try{return e.existsSync(s)}catch{return!1}}),r(t,"readSync",(...s)=>{let[a,n,c,f,p]=s;return s.length<=3&&({offset:c=0,length:f=n.byteLength,position:p}=s[2]||{}),c==null&&(c=0),f|=0,f===0?0:(p==null&&(p=-1),e.readSync(a,n,c,f,p))});for(let s of $Ge){let a=s;if(typeof t[a]>"u")continue;let n=e[s];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let s=t.promises;for(let a of h$){let n=a.replace(/Promise$/,"");if(typeof s[n]>"u")continue;let c=e[a];typeof c>"u"||a!=="open"&&r(s,n,(f,...p)=>f instanceof O2?f[n].apply(f,p):c.call(e,f,...p))}r(s,"open",async(...a)=>{let n=await e.openPromise(...a);return new O2(n,e)})}t.read[aE.promisify.custom]=async(s,a,...n)=>({bytesRead:await e.readPromise(s,a,...n),buffer:a}),t.write[aE.promisify.custom]=async(s,a,...n)=>({bytesWritten:await e.writePromise(s,a,...n),buffer:a})}function ix(t,e){let r=Object.create(t);return L2(r,e),r}var aE,$Ge,h$,g$=Ze(()=>{aE=Ie("util");a$();p$();$Ge=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),h$=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function d$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function m$(){if(bU)return bU;let t=fe.toPortablePath(y$.default.tmpdir()),e=ce.realpathSync(t);return process.once("exit",()=>{ce.rmtempSync()}),bU={tmpdir:t,realTmpdir:e}}var y$,Nu,bU,ce,E$=Ze(()=>{y$=ut(Ie("os"));Cd();el();Nu=new Set,bU=null;ce=Object.assign(new Yn,{detachTemp(t){Nu.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=m$();for(;;){let s=d$("xfs-");try{this.mkdirSync(J.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=m$();for(;;){let s=d$("xfs-");try{await this.mkdirPromise(J.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Nu.values()).map(async t=>{try{await ce.removePromise(t,{maxRetries:0}),Nu.delete(t)}catch{}}))},rmtempSync(){for(let t of Nu)try{ce.removeSync(t),Nu.delete(t)}catch{}}})});var M2={};Vt(M2,{AliasFS:()=>_f,BasePortableFakeFS:()=>Uf,CustomDir:()=>N2,CwdFS:()=>Sn,FakeFS:()=>mp,Filename:()=>Er,JailFS:()=>Hf,LazyFS:()=>sE,MountFS:()=>e0,NoFS:()=>ex,NodeFS:()=>Yn,PortablePath:()=>vt,PosixFS:()=>t0,ProxiedFS:()=>_s,VirtualFS:()=>uo,constants:()=>fi,errors:()=>or,extendFs:()=>ix,normalizeLineEndings:()=>Ed,npath:()=>fe,opendir:()=>ZP,patchFs:()=>L2,ppath:()=>J,setupCopyIndex:()=>zP,statUtils:()=>$a,unwatchAllFiles:()=>yd,unwatchFile:()=>md,watchFile:()=>iE,xfs:()=>ce});var Dt=Ze(()=>{OX();VP();IU();BU();jX();vU();Id();el();el();JX();Id();ZX();$X();e$();t$();r$();Cd();n$();yp();i$();g$();E$()});var v$=_((tkt,B$)=>{B$.exports=w$;w$.sync=t5e;var I$=Ie("fs");function e5e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var s=0;s{P$.exports=D$;D$.sync=r5e;var S$=Ie("fs");function D$(t,e,r){S$.stat(t,function(s,a){r(s,s?!1:b$(a,e))})}function r5e(t,e){return b$(S$.statSync(t),e)}function b$(t,e){return t.isFile()&&n5e(t,e)}function n5e(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),c=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),f=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=f|p,w=r&h||r&p&&a===c||r&f&&s===n||r&E&&n===0;return w}});var Q$=_((ikt,k$)=>{var nkt=Ie("fs"),sx;process.platform==="win32"||global.TESTING_WINDOWS?sx=v$():sx=x$();k$.exports=PU;PU.sync=i5e;function PU(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(s,a){PU(t,e||{},function(n,c){n?a(n):s(c)})})}sx(t,e||{},function(s,a){s&&(s.code==="EACCES"||e&&e.ignoreErrors)&&(s=null,a=!1),r(s,a)})}function i5e(t,e){try{return sx.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var M$=_((skt,L$)=>{var lE=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",R$=Ie("path"),s5e=lE?";":":",T$=Q$(),F$=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),N$=(t,e)=>{let r=e.colon||s5e,s=t.match(/\//)||lE&&t.match(/\\/)?[""]:[...lE?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=lE?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=lE?a.split(r):[""];return lE&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:s,pathExt:n,pathExtExe:a}},O$=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:s,pathExt:a,pathExtExe:n}=N$(t,e),c=[],f=h=>new Promise((E,w)=>{if(h===s.length)return e.all&&c.length?E(c):w(F$(t));let S=s[h],x=/^".*"$/.test(S)?S.slice(1,-1):S,I=R$.join(x,t),T=!x&&/^\.[\\\/]/.test(t)?t.slice(0,2)+I:I;E(p(T,h,0))}),p=(h,E,w)=>new Promise((S,x)=>{if(w===a.length)return S(f(E+1));let I=a[w];T$(h+I,{pathExt:n},(T,N)=>{if(!T&&N)if(e.all)c.push(h+I);else return S(h+I);return S(p(h,E,w+1))})});return r?f(0).then(h=>r(null,h),r):f(0)},o5e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:s,pathExtExe:a}=N$(t,e),n=[];for(let c=0;c{"use strict";var U$=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(s=>s.toUpperCase()==="PATH")||"Path"};xU.exports=U$;xU.exports.default=U$});var q$=_((akt,G$)=>{"use strict";var H$=Ie("path"),a5e=M$(),l5e=_$();function j$(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let c;try{c=a5e.sync(t.command,{path:r[l5e({env:r})],pathExt:e?H$.delimiter:void 0})}catch{}finally{n&&process.chdir(s)}return c&&(c=H$.resolve(a?t.options.cwd:"",c)),c}function c5e(t){return j$(t)||j$(t,!0)}G$.exports=c5e});var W$=_((lkt,QU)=>{"use strict";var kU=/([()\][%!^"`<>&|;, *?])/g;function u5e(t){return t=t.replace(kU,"^$1"),t}function f5e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(kU,"^$1"),e&&(t=t.replace(kU,"^$1")),t}QU.exports.command=u5e;QU.exports.argument=f5e});var V$=_((ckt,Y$)=>{"use strict";Y$.exports=/^#!(.*)/});var K$=_((ukt,J$)=>{"use strict";var A5e=V$();J$.exports=(t="")=>{let e=t.match(A5e);if(!e)return null;let[r,s]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?s:s?`${a} ${s}`:a}});var Z$=_((fkt,z$)=>{"use strict";var RU=Ie("fs"),p5e=K$();function h5e(t){let r=Buffer.alloc(150),s;try{s=RU.openSync(t,"r"),RU.readSync(s,r,0,150,0),RU.closeSync(s)}catch{}return p5e(r.toString())}z$.exports=h5e});var tee=_((Akt,eee)=>{"use strict";var g5e=Ie("path"),X$=q$(),$$=W$(),d5e=Z$(),m5e=process.platform==="win32",y5e=/\.(?:com|exe)$/i,E5e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function I5e(t){t.file=X$(t);let e=t.file&&d5e(t.file);return e?(t.args.unshift(t.file),t.command=e,X$(t)):t.file}function C5e(t){if(!m5e)return t;let e=I5e(t),r=!y5e.test(e);if(t.options.forceShell||r){let s=E5e.test(e);t.command=g5e.normalize(t.command),t.command=$$.command(t.command),t.args=t.args.map(n=>$$.argument(n,s));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function w5e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let s={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?s:C5e(s)}eee.exports=w5e});var iee=_((pkt,nee)=>{"use strict";var TU=process.platform==="win32";function FU(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function B5e(t,e){if(!TU)return;let r=t.emit;t.emit=function(s,a){if(s==="exit"){let n=ree(a,e);if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function ree(t,e){return TU&&t===1&&!e.file?FU(e.original,"spawn"):null}function v5e(t,e){return TU&&t===1&&!e.file?FU(e.original,"spawnSync"):null}nee.exports={hookChildProcess:B5e,verifyENOENT:ree,verifyENOENTSync:v5e,notFoundError:FU}});var LU=_((hkt,cE)=>{"use strict";var see=Ie("child_process"),NU=tee(),OU=iee();function oee(t,e,r){let s=NU(t,e,r),a=see.spawn(s.command,s.args,s.options);return OU.hookChildProcess(a,s),a}function S5e(t,e,r){let s=NU(t,e,r),a=see.spawnSync(s.command,s.args,s.options);return a.error=a.error||OU.verifyENOENTSync(a.status,s),a}cE.exports=oee;cE.exports.spawn=oee;cE.exports.sync=S5e;cE.exports._parse=NU;cE.exports._enoent=OU});var lee=_((gkt,aee)=>{"use strict";function D5e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Bd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Bd)}D5e(Bd,Error);Bd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,S=1;w>",b=ur(">>",!1),y=">&",F=ur(">&",!1),z=">",Z=ur(">",!1),$="<<<",oe=ur("<<<",!1),xe="<&",Re=ur("<&",!1),lt="<",Ct=ur("<",!1),Gt=function(O){return{type:"argument",segments:[].concat(...O)}},ir=function(O){return O},Pt="$'",gn=ur("$'",!1),Pr="'",Ir=ur("'",!1),Nr=function(O){return[{type:"text",text:O}]},nn='""',ai=ur('""',!1),Io=function(){return{type:"text",text:""}},ts='"',$s=ur('"',!1),Co=function(O){return O},_i=function(O){return{type:"arithmetic",arithmetic:O,quoted:!0}},eo=function(O){return{type:"shell",shell:O,quoted:!0}},wo=function(O){return{type:"variable",...O,quoted:!0}},QA=function(O){return{type:"text",text:O}},Af=function(O){return{type:"arithmetic",arithmetic:O,quoted:!1}},dh=function(O){return{type:"shell",shell:O,quoted:!1}},mh=function(O){return{type:"variable",...O,quoted:!1}},to=function(O){return{type:"glob",pattern:O}},jn=/^[^']/,Rs=Ki(["'"],!0,!1),ro=function(O){return O.join("")},ou=/^[^$"]/,au=Ki(["$",'"'],!0,!1),lu=`\\
+`,RA=ur(`\\
+`,!1),TA=function(){return""},sa="\\",oa=ur("\\",!1),FA=/^[\\$"`]/,gr=Ki(["\\","$",'"',"`"],!1,!1),Bo=function(O){return O},Me="\\a",cu=ur("\\a",!1),Cr=function(){return"a"},pf="\\b",NA=ur("\\b",!1),OA=function(){return"\b"},uu=/^[Ee]/,fu=Ki(["E","e"],!1,!1),oc=function(){return"\x1B"},ve="\\f",Nt=ur("\\f",!1),ac=function(){return"\f"},Ni="\\n",no=ur("\\n",!1),Tt=function(){return`
+`},xn="\\r",aa=ur("\\r",!1),Hi=function(){return"\r"},Oi="\\t",Na=ur("\\t",!1),dn=function(){return" "},Kn="\\v",Au=ur("\\v",!1),yh=function(){return"\v"},Oa=/^[\\'"?]/,La=Ki(["\\","'",'"',"?"],!1,!1),Ma=function(O){return String.fromCharCode(parseInt(O,16))},$e="\\x",Ua=ur("\\x",!1),hf="\\u",lc=ur("\\u",!1),wn="\\U",la=ur("\\U",!1),LA=function(O){return String.fromCodePoint(parseInt(O,16))},MA=/^[0-7]/,ca=Ki([["0","7"]],!1,!1),Bl=/^[0-9a-fA-f]/,Mt=Ki([["0","9"],["a","f"],["A","f"]],!1,!1),kn=yf(),ua="{}",Ha=ur("{}",!1),rs=function(){return"{}"},cc="-",pu=ur("-",!1),uc="+",ja=ur("+",!1),Li=".",Is=ur(".",!1),vl=function(O,K,re){return{type:"number",value:(O==="-"?-1:1)*parseFloat(K.join("")+"."+re.join(""))}},gf=function(O,K){return{type:"number",value:(O==="-"?-1:1)*parseInt(K.join(""))}},fc=function(O){return{type:"variable",...O}},wi=function(O){return{type:"variable",name:O}},Qn=function(O){return O},Ac="*",Ke=ur("*",!1),st="/",St=ur("/",!1),lr=function(O,K,re){return{type:K==="*"?"multiplication":"division",right:re}},te=function(O,K){return K.reduce((re,de)=>({left:re,...de}),O)},Ee=function(O,K,re){return{type:K==="+"?"addition":"subtraction",right:re}},Oe="$((",dt=ur("$((",!1),Et="))",bt=ur("))",!1),tr=function(O){return O},fn="$(",li=ur("$(",!1),ji=function(O){return O},Rn="${",Ga=ur("${",!1),dy=":-",z1=ur(":-",!1),vo=function(O,K){return{name:O,defaultValue:K}},my=":-}",Eh=ur(":-}",!1),Z1=function(O){return{name:O,defaultValue:[]}},So=":+",Ih=ur(":+",!1),Ch=function(O,K){return{name:O,alternativeValue:K}},hu=":+}",wh=ur(":+}",!1),Fg=function(O){return{name:O,alternativeValue:[]}},Ng=function(O){return{name:O}},Og="$",yy=ur("$",!1),df=function(O){return e.isGlobPattern(O)},Do=function(O){return O},Sl=/^[a-zA-Z0-9_]/,Bh=Ki([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Lg=function(){return wy()},Dl=/^[$@*?#a-zA-Z0-9_\-]/,bl=Ki(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Ey=/^[()}<>$|&; \t"']/,UA=Ki(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Iy=/^[<>&; \t"']/,Cy=Ki(["<",">","&",";"," "," ",'"',"'"],!1,!1),_A=/^[ \t]/,HA=Ki([" "," "],!1,!1),Y=0,xt=0,jA=[{line:1,column:1}],bo=0,mf=[],yt=0,gu;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function wy(){return t.substring(xt,Y)}function Mg(){return Ef(xt,Y)}function X1(O,K){throw K=K!==void 0?K:Ef(xt,Y),GA([Ug(O)],t.substring(xt,Y),K)}function vh(O,K){throw K=K!==void 0?K:Ef(xt,Y),di(O,K)}function ur(O,K){return{type:"literal",text:O,ignoreCase:K}}function Ki(O,K,re){return{type:"class",parts:O,inverted:K,ignoreCase:re}}function yf(){return{type:"any"}}function qa(){return{type:"end"}}function Ug(O){return{type:"other",description:O}}function du(O){var K=jA[O],re;if(K)return K;for(re=O-1;!jA[re];)re--;for(K=jA[re],K={line:K.line,column:K.column};rebo&&(bo=Y,mf=[]),mf.push(O))}function di(O,K){return new Bd(O,null,null,K)}function GA(O,K,re){return new Bd(Bd.buildMessage(O,K),O,K,re)}function Wa(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=fa(),re===r&&(re=null),re!==r?(xt=O,K=n(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function fa(){var O,K,re,de,Je;if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de!==r?(Je=Ya(),Je===r&&(Je=null),Je!==r?(xt=O,K=c(K,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;if(O===r)if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de===r&&(de=null),de!==r?(xt=O,K=f(K,de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function Ya(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=fa(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=p(re),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function _g(){var O;return t.charCodeAt(Y)===59?(O=h,Y++):(O=r,yt===0&&wt(E)),O===r&&(t.charCodeAt(Y)===38?(O=w,Y++):(O=r,yt===0&&wt(S))),O}function Sh(){var O,K,re;return O=Y,K=qA(),K!==r?(re=Hg(),re===r&&(re=null),re!==r?(xt=O,K=x(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Hg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=By(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Sh(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=I(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function By(){var O;return t.substr(Y,2)===T?(O=T,Y+=2):(O=r,yt===0&&wt(N)),O===r&&(t.substr(Y,2)===U?(O=U,Y+=2):(O=r,yt===0&&wt(W))),O}function qA(){var O,K,re;return O=Y,K=If(),K!==r?(re=jg(),re===r&&(re=null),re!==r?(xt=O,K=ee(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function jg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=mu(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=qA(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=ie(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function mu(){var O;return t.substr(Y,2)===ue?(O=ue,Y+=2):(O=r,yt===0&&wt(le)),O===r&&(t.charCodeAt(Y)===124?(O=me,Y++):(O=r,yt===0&&wt(pe))),O}function yu(){var O,K,re,de,Je,At;if(O=Y,K=Ph(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r)if(de=WA(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(xt=O,K=g(K,de),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;else Y=O,O=r;if(O===r)if(O=Y,K=Ph(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=we(K),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function If(){var O,K,re,de,Je,At,dr,Br,Un,mi,Cs;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===40?(re=ye,Y++):(re=r,yt===0&&wt(Ae)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=fa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===41?(dr=se,Y++):(dr=r,yt===0&&wt(X)),dr!==r){for(Br=[],Un=kt();Un!==r;)Br.push(Un),Un=kt();if(Br!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=De(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===123?(re=Te,Y++):(re=r,yt===0&&wt(mt)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=fa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===125?(dr=j,Y++):(dr=r,yt===0&&wt(rt)),dr!==r){for(Br=[],Un=kt();Un!==r;)Br.push(Un),Un=kt();if(Br!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=Fe(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){for(re=[],de=yu();de!==r;)re.push(de),de=yu();if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r){if(Je=[],At=Eu(),At!==r)for(;At!==r;)Je.push(At),At=Eu();else Je=r;if(Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=Ne(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=yu(),de!==r)for(;de!==r;)re.push(de),de=yu();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=Pe(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}}}return O}function Ts(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=Pi(),de!==r)for(;de!==r;)re.push(de),de=Pi();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=Ye(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r;return O}function Eu(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r?(re=Gn(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();K!==r?(re=Pi(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r)}return O}function Gn(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(it.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ue)),re===r&&(re=null),re!==r?(de=ns(),de!==r?(Je=Pi(),Je!==r?(xt=O,K=P(re,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function ns(){var O;return t.substr(Y,2)===C?(O=C,Y+=2):(O=r,yt===0&&wt(b)),O===r&&(t.substr(Y,2)===y?(O=y,Y+=2):(O=r,yt===0&&wt(F)),O===r&&(t.charCodeAt(Y)===62?(O=z,Y++):(O=r,yt===0&&wt(Z)),O===r&&(t.substr(Y,3)===$?(O=$,Y+=3):(O=r,yt===0&&wt(oe)),O===r&&(t.substr(Y,2)===xe?(O=xe,Y+=2):(O=r,yt===0&&wt(Re)),O===r&&(t.charCodeAt(Y)===60?(O=lt,Y++):(O=r,yt===0&&wt(Ct))))))),O}function Pi(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=WA(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function WA(){var O,K,re;if(O=Y,K=[],re=Cf(),re!==r)for(;re!==r;)K.push(re),re=Cf();else K=r;return K!==r&&(xt=O,K=Gt(K)),O=K,O}function Cf(){var O,K;return O=Y,K=mn(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=Gg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=qg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=is(),K!==r&&(xt=O,K=ir(K)),O=K))),O}function mn(){var O,K,re,de;return O=Y,t.substr(Y,2)===Pt?(K=Pt,Y+=2):(K=r,yt===0&&wt(gn)),K!==r?(re=yn(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Nr(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function Gg(){var O,K,re,de;return O=Y,t.charCodeAt(Y)===39?(K=Pr,Y++):(K=r,yt===0&&wt(Ir)),K!==r?(re=wf(),re!==r?(t.charCodeAt(Y)===39?(de=Pr,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Nr(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function qg(){var O,K,re,de;if(O=Y,t.substr(Y,2)===nn?(K=nn,Y+=2):(K=r,yt===0&&wt(ai)),K!==r&&(xt=O,K=Io()),O=K,O===r)if(O=Y,t.charCodeAt(Y)===34?(K=ts,Y++):(K=r,yt===0&&wt($s)),K!==r){for(re=[],de=Pl();de!==r;)re.push(de),de=Pl();re!==r?(t.charCodeAt(Y)===34?(de=ts,Y++):(de=r,yt===0&&wt($s)),de!==r?(xt=O,K=Co(re),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function is(){var O,K,re;if(O=Y,K=[],re=Po(),re!==r)for(;re!==r;)K.push(re),re=Po();else K=r;return K!==r&&(xt=O,K=Co(K)),O=K,O}function Pl(){var O,K;return O=Y,K=Xr(),K!==r&&(xt=O,K=_i(K)),O=K,O===r&&(O=Y,K=bh(),K!==r&&(xt=O,K=eo(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=wo(K)),O=K,O===r&&(O=Y,K=Bf(),K!==r&&(xt=O,K=QA(K)),O=K))),O}function Po(){var O,K;return O=Y,K=Xr(),K!==r&&(xt=O,K=Af(K)),O=K,O===r&&(O=Y,K=bh(),K!==r&&(xt=O,K=dh(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=mh(K)),O=K,O===r&&(O=Y,K=vy(),K!==r&&(xt=O,K=to(K)),O=K,O===r&&(O=Y,K=Dh(),K!==r&&(xt=O,K=QA(K)),O=K)))),O}function wf(){var O,K,re;for(O=Y,K=[],jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs));re!==r;)K.push(re),jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs));return K!==r&&(xt=O,K=ro(K)),O=K,O}function Bf(){var O,K,re;if(O=Y,K=[],re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au))),re!==r)for(;re!==r;)K.push(re),re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function xl(){var O,K,re;return O=Y,t.substr(Y,2)===lu?(K=lu,Y+=2):(K=r,yt===0&&wt(RA)),K!==r&&(xt=O,K=TA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=sa,Y++):(K=r,yt===0&&wt(oa)),K!==r?(FA.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(gr)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r)),O}function yn(){var O,K,re;for(O=Y,K=[],re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs)));re!==r;)K.push(re),re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs)));return K!==r&&(xt=O,K=ro(K)),O=K,O}function xo(){var O,K,re;return O=Y,t.substr(Y,2)===Me?(K=Me,Y+=2):(K=r,yt===0&&wt(cu)),K!==r&&(xt=O,K=Cr()),O=K,O===r&&(O=Y,t.substr(Y,2)===pf?(K=pf,Y+=2):(K=r,yt===0&&wt(NA)),K!==r&&(xt=O,K=OA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=sa,Y++):(K=r,yt===0&&wt(oa)),K!==r?(uu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(fu)),re!==r?(xt=O,K=oc(),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===ve?(K=ve,Y+=2):(K=r,yt===0&&wt(Nt)),K!==r&&(xt=O,K=ac()),O=K,O===r&&(O=Y,t.substr(Y,2)===Ni?(K=Ni,Y+=2):(K=r,yt===0&&wt(no)),K!==r&&(xt=O,K=Tt()),O=K,O===r&&(O=Y,t.substr(Y,2)===xn?(K=xn,Y+=2):(K=r,yt===0&&wt(aa)),K!==r&&(xt=O,K=Hi()),O=K,O===r&&(O=Y,t.substr(Y,2)===Oi?(K=Oi,Y+=2):(K=r,yt===0&&wt(Na)),K!==r&&(xt=O,K=dn()),O=K,O===r&&(O=Y,t.substr(Y,2)===Kn?(K=Kn,Y+=2):(K=r,yt===0&&wt(Au)),K!==r&&(xt=O,K=yh()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=sa,Y++):(K=r,yt===0&&wt(oa)),K!==r?(Oa.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(La)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Iu()))))))))),O}function Iu(){var O,K,re,de,Je,At,dr,Br,Un,mi,Cs,JA;return O=Y,t.charCodeAt(Y)===92?(K=sa,Y++):(K=r,yt===0&&wt(oa)),K!==r?(re=Aa(),re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===$e?(K=$e,Y+=2):(K=r,yt===0&&wt(Ua)),K!==r?(re=Y,de=Y,Je=Aa(),Je!==r?(At=Fs(),At!==r?(Je=[Je,At],de=Je):(Y=de,de=r)):(Y=de,de=r),de===r&&(de=Aa()),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===hf?(K=hf,Y+=2):(K=r,yt===0&&wt(lc)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(Br=Fs(),Br!==r?(Je=[Je,At,dr,Br],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===wn?(K=wn,Y+=2):(K=r,yt===0&&wt(la)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(Br=Fs(),Br!==r?(Un=Fs(),Un!==r?(mi=Fs(),mi!==r?(Cs=Fs(),Cs!==r?(JA=Fs(),JA!==r?(Je=[Je,At,dr,Br,Un,mi,Cs,JA],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=LA(re),O=K):(Y=O,O=r)):(Y=O,O=r)))),O}function Aa(){var O;return MA.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(ca)),O}function Fs(){var O;return Bl.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(Mt)),O}function Dh(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,t.charCodeAt(Y)===92?(de=sa,Y++):(de=r,yt===0&&wt(oa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===ua?(de=ua,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=rs()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Sy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=Y,t.charCodeAt(Y)===92?(de=sa,Y++):(de=r,yt===0&&wt(oa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===ua?(de=ua,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=rs()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Sy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function YA(){var O,K,re,de,Je,At;if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;if(re!==r)if(t.charCodeAt(Y)===46?(de=Li,Y++):(de=r,yt===0&&wt(Is)),de!==r){if(Je=[],it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue)),At!==r)for(;At!==r;)Je.push(At),it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue));else Je=r;Je!==r?(xt=O,K=vl(K,re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;if(O===r){if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;re!==r?(xt=O,K=gf(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;if(O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=fc(K)),O=K,O===r&&(O=Y,K=pc(),K!==r&&(xt=O,K=wi(K)),O=K,O===r)))if(O=Y,t.charCodeAt(Y)===40?(K=ye,Y++):(K=r,yt===0&&wt(Ae)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.charCodeAt(Y)===41?(At=se,Y++):(At=r,yt===0&&wt(X)),At!==r?(xt=O,K=Qn(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r}return O}function vf(){var O,K,re,de,Je,At,dr,Br;if(O=Y,K=YA(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=YA(),Br!==r?(xt=de,Je=lr(K,At,Br),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=YA(),Br!==r?(xt=de,Je=lr(K,At,Br),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function io(){var O,K,re,de,Je,At,dr,Br;if(O=Y,K=vf(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=vf(),Br!==r?(xt=de,Je=Ee(K,At,Br),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],Br=kt();Br!==r;)dr.push(Br),Br=kt();dr!==r?(Br=vf(),Br!==r?(xt=de,Je=Ee(K,At,Br),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function Xr(){var O,K,re,de,Je,At;if(O=Y,t.substr(Y,3)===Oe?(K=Oe,Y+=3):(K=r,yt===0&&wt(dt)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.substr(Y,2)===Et?(At=Et,Y+=2):(At=r,yt===0&&wt(bt)),At!==r?(xt=O,K=tr(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;return O}function bh(){var O,K,re,de;return O=Y,t.substr(Y,2)===fn?(K=fn,Y+=2):(K=r,yt===0&&wt(li)),K!==r?(re=fa(),re!==r?(t.charCodeAt(Y)===41?(de=se,Y++):(de=r,yt===0&&wt(X)),de!==r?(xt=O,K=ji(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function VA(){var O,K,re,de,Je,At;return O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===dy?(de=dy,Y+=2):(de=r,yt===0&&wt(z1)),de!==r?(Je=Ts(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=vo(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===my?(de=my,Y+=3):(de=r,yt===0&&wt(Eh)),de!==r?(xt=O,K=Z1(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===So?(de=So,Y+=2):(de=r,yt===0&&wt(Ih)),de!==r?(Je=Ts(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=Ch(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===hu?(de=hu,Y+=3):(de=r,yt===0&&wt(wh)),de!==r?(xt=O,K=Fg(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.charCodeAt(Y)===125?(de=j,Y++):(de=r,yt===0&&wt(rt)),de!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.charCodeAt(Y)===36?(K=Og,Y++):(K=r,yt===0&&wt(yy)),K!==r?(re=pc(),re!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)))))),O}function vy(){var O,K,re;return O=Y,K=Wg(),K!==r?(xt=Y,re=df(K),re?re=void 0:re=r,re!==r?(xt=O,K=Do(K),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Wg(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re!==r)for(;re!==r;)K.push(re),re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r);else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function Ph(){var O,K,re;if(O=Y,K=[],Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh)),re!==r)for(;re!==r;)K.push(re),Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function pc(){var O,K,re;if(O=Y,K=[],Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(bl)),re!==r)for(;re!==r;)K.push(re),Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(bl));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function Sy(){var O;return Ey.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(UA)),O}function xh(){var O;return Iy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(Cy)),O}function kt(){var O,K;if(O=[],_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA)),K!==r)for(;K!==r;)O.push(K),_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA));else O=r;return O}if(gu=a(),gu!==r&&Y===t.length)return gu;throw gu!==r&&Y!1}){try{return(0,cee.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function uE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a)=>`${lx(r)}${s===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function lx(t){return`${fE(t.chain)}${t.then?` ${MU(t.then)}`:""}`}function MU(t){return`${t.type} ${lx(t.line)}`}function fE(t){return`${_U(t)}${t.then?` ${UU(t.then)}`:""}`}function UU(t){return`${t.type} ${fE(t.chain)}`}function _U(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>ox(e)).join(" ")} `:""}${t.args.map(e=>HU(e)).join(" ")}`;case"subshell":return`(${uE(t.subshell)})${t.args.length>0?` ${t.args.map(e=>U2(e)).join(" ")}`:""}`;case"group":return`{ ${uE(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>U2(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>ox(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function ox(t){return`${t.name}=${t.args[0]?vd(t.args[0]):""}`}function HU(t){switch(t.type){case"redirection":return U2(t);case"argument":return vd(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function U2(t){return`${t.subtype} ${t.args.map(e=>vd(e)).join(" ")}`}function vd(t){return t.segments.map(e=>jU(e)).join("")}function jU(t){let e=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<>$|&;"'\n\t ]/)?s.match(/['\t\p{C}]/u)?s.match(/'/)?`"${s.replace(/["$\t\p{C}]/u,x5e)}"`:`$'${s.replace(/[\t\p{C}]/u,fee)}'`:`'${s}'`:s;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${uE(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(s=>vd(s)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(s=>vd(s)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${cx(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function cx(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,s=a=>r(cx(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${s(t.left)} ${e(t.type)} ${s(t.right)}`}}var cee,uee,P5e,fee,x5e,Aee=Ze(()=>{cee=ut(lee());uee=new Map([["\f","\\f"],[`
+`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),P5e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(uee,([t,e])=>[t,`"$'${e}'"`])]),fee=t=>uee.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,x5e=t=>P5e.get(t)??`"$'${fee(t)}'"`});var hee=_((xkt,pee)=>{"use strict";function k5e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Sd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Sd)}k5e(Sd,Error);Sd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,S=1;wue&&(ue=W,le=[]),le.push(Ue))}function rt(Ue,P){return new Sd(Ue,null,null,P)}function Fe(Ue,P,C){return new Sd(Sd.buildMessage(Ue,P),Ue,P,C)}function Ne(){var Ue,P,C,b;return Ue=W,P=Pe(),P!==r?(t.charCodeAt(W)===47?(C=n,W++):(C=r,me===0&&j(c)),C!==r?(b=Pe(),b!==r?(ee=Ue,P=f(P,b),Ue=P):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,P=Pe(),P!==r&&(ee=Ue,P=p(P)),Ue=P),Ue}function Pe(){var Ue,P,C,b;return Ue=W,P=Ye(),P!==r?(t.charCodeAt(W)===64?(C=h,W++):(C=r,me===0&&j(E)),C!==r?(b=it(),b!==r?(ee=Ue,P=w(P,b),Ue=P):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,P=Ye(),P!==r&&(ee=Ue,P=S(P)),Ue=P),Ue}function Ye(){var Ue,P,C,b,y;return Ue=W,t.charCodeAt(W)===64?(P=h,W++):(P=r,me===0&&j(E)),P!==r?(C=ke(),C!==r?(t.charCodeAt(W)===47?(b=n,W++):(b=r,me===0&&j(c)),b!==r?(y=ke(),y!==r?(ee=Ue,P=x(),Ue=P):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,P=ke(),P!==r&&(ee=Ue,P=x()),Ue=P),Ue}function ke(){var Ue,P,C;if(Ue=W,P=[],I.test(t.charAt(W))?(C=t.charAt(W),W++):(C=r,me===0&&j(T)),C!==r)for(;C!==r;)P.push(C),I.test(t.charAt(W))?(C=t.charAt(W),W++):(C=r,me===0&&j(T));else P=r;return P!==r&&(ee=Ue,P=x()),Ue=P,Ue}function it(){var Ue,P,C;if(Ue=W,P=[],N.test(t.charAt(W))?(C=t.charAt(W),W++):(C=r,me===0&&j(U)),C!==r)for(;C!==r;)P.push(C),N.test(t.charAt(W))?(C=t.charAt(W),W++):(C=r,me===0&&j(U));else P=r;return P!==r&&(ee=Ue,P=x()),Ue=P,Ue}if(pe=a(),pe!==r&&W===t.length)return pe;throw pe!==r&&W{gee=ut(hee())});var bd=_((Qkt,Dd)=>{"use strict";function mee(t){return typeof t>"u"||t===null}function R5e(t){return typeof t=="object"&&t!==null}function T5e(t){return Array.isArray(t)?t:mee(t)?[]:[t]}function F5e(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r{"use strict";function _2(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}_2.prototype=Object.create(Error.prototype);_2.prototype.constructor=_2;_2.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};yee.exports=_2});var Cee=_((Tkt,Iee)=>{"use strict";var Eee=bd();function GU(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.line=s,this.column=a}GU.prototype.getSnippet=function(e,r){var s,a,n,c,f;if(!this.buffer)return null;for(e=e||4,r=r||75,s="",a=this.position;a>0&&`\0\r
\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){s=" ... ",a+=5;break}for(n="",c=this.position;cr/2-1){n=" ... ",c-=5;break}return f=this.buffer.slice(a,c),ete.repeat(" ",e)+s+f+n+`
-`+ete.repeat(" ",e+this.position-a+s.length)+"^"};K_.prototype.toString=function(e){var r,s="";return this.name&&(s+='in "'+this.name+'" '),s+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(s+=`:
-`+r)),s};tte.exports=K_});var bs=L((t5t,ite)=>{"use strict";var nte=fE(),iKe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],sKe=["scalar","sequence","mapping"];function oKe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(s){e[String(s)]=r})}),e}function aKe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(iKe.indexOf(r)===-1)throw new nte('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=oKe(e.styleAliases||null),sKe.indexOf(this.kind)===-1)throw new nte('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}ite.exports=aKe});var bd=L((r5t,ote)=>{"use strict";var ste=Dd(),Bx=fE(),lKe=bs();function J_(t,e,r){var s=[];return t.include.forEach(function(a){r=J_(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,c){n.tag===a.tag&&n.kind===a.kind&&s.push(c)}),r.push(a)}),r.filter(function(a,n){return s.indexOf(n)===-1})}function cKe(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function s(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var uKe=bs();ate.exports=new uKe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var ute=L((i5t,cte)=>{"use strict";var fKe=bs();cte.exports=new fKe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var Ate=L((s5t,fte)=>{"use strict";var AKe=bs();fte.exports=new AKe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var vx=L((o5t,pte)=>{"use strict";var pKe=bd();pte.exports=new pKe({explicit:[lte(),ute(),Ate()]})});var gte=L((a5t,hte)=>{"use strict";var hKe=bs();function gKe(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function dKe(){return null}function mKe(t){return t===null}hte.exports=new hKe("tag:yaml.org,2002:null",{kind:"scalar",resolve:gKe,construct:dKe,predicate:mKe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var mte=L((l5t,dte)=>{"use strict";var yKe=bs();function EKe(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function IKe(t){return t==="true"||t==="True"||t==="TRUE"}function CKe(t){return Object.prototype.toString.call(t)==="[object Boolean]"}dte.exports=new yKe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:EKe,construct:IKe,predicate:CKe,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var Ete=L((c5t,yte)=>{"use strict";var wKe=Dd(),BKe=bs();function vKe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function SKe(t){return 48<=t&&t<=55}function DKe(t){return 48<=t&&t<=57}function bKe(t){if(t===null)return!1;var e=t.length,r=0,s=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var wte=L((u5t,Cte)=>{"use strict";var Ite=Dd(),kKe=bs(),QKe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function TKe(t){return!(t===null||!QKe.test(t)||t[t.length-1]==="_")}function RKe(t){var e,r,s,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,s=1,a.forEach(function(n){e+=n*s,s*=60}),r*e):r*parseFloat(e,10)}var FKe=/^[-+]?[0-9]+e/;function NKe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Ite.isNegativeZero(t))return"-0.0";return r=t.toString(10),FKe.test(r)?r.replace("e",".e"):r}function OKe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Ite.isNegativeZero(t))}Cte.exports=new kKe("tag:yaml.org,2002:float",{kind:"scalar",resolve:TKe,construct:RKe,predicate:OKe,represent:NKe,defaultStyle:"lowercase"})});var z_=L((f5t,Bte)=>{"use strict";var LKe=bd();Bte.exports=new LKe({include:[vx()],implicit:[gte(),mte(),Ete(),wte()]})});var Z_=L((A5t,vte)=>{"use strict";var MKe=bd();vte.exports=new MKe({include:[z_()]})});var Pte=L((p5t,bte)=>{"use strict";var _Ke=bs(),Ste=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Dte=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function UKe(t){return t===null?!1:Ste.exec(t)!==null||Dte.exec(t)!==null}function HKe(t){var e,r,s,a,n,c,f,p=0,h=null,E,C,S;if(e=Ste.exec(t),e===null&&(e=Dte.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],s=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,s,a));if(n=+e[4],c=+e[5],f=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],C=+(e[11]||0),h=(E*60+C)*6e4,e[9]==="-"&&(h=-h)),S=new Date(Date.UTC(r,s,a,n,c,f,p)),h&&S.setTime(S.getTime()-h),S}function jKe(t){return t.toISOString()}bte.exports=new _Ke("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:UKe,construct:HKe,instanceOf:Date,represent:jKe})});var kte=L((h5t,xte)=>{"use strict";var qKe=bs();function GKe(t){return t==="<<"||t===null}xte.exports=new qKe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:GKe})});var Rte=L((g5t,Tte)=>{"use strict";var Pd;try{Qte=Ie,Pd=Qte("buffer").Buffer}catch{}var Qte,WKe=bs(),X_=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
-\r`;function YKe(t){if(t===null)return!1;var e,r,s=0,a=t.length,n=X_;for(r=0;r64)){if(e<0)return!1;s+=6}return s%8===0}function VKe(t){var e,r,s=t.replace(/[\r\n=]/g,""),a=s.length,n=X_,c=0,f=[];for(e=0;e>16&255),f.push(c>>8&255),f.push(c&255)),c=c<<6|n.indexOf(s.charAt(e));return r=a%4*6,r===0?(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)):r===18?(f.push(c>>10&255),f.push(c>>2&255)):r===12&&f.push(c>>4&255),Pd?Pd.from?Pd.from(f):new Pd(f):f}function KKe(t){var e="",r=0,s,a,n=t.length,c=X_;for(s=0;s>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]),r=(r<<8)+t[s];return a=n%3,a===0?(e+=c[r>>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]):a===2?(e+=c[r>>10&63],e+=c[r>>4&63],e+=c[r<<2&63],e+=c[64]):a===1&&(e+=c[r>>2&63],e+=c[r<<4&63],e+=c[64],e+=c[64]),e}function JKe(t){return Pd&&Pd.isBuffer(t)}Tte.exports=new WKe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:YKe,construct:VKe,predicate:JKe,represent:KKe})});var Nte=L((m5t,Fte)=>{"use strict";var zKe=bs(),ZKe=Object.prototype.hasOwnProperty,XKe=Object.prototype.toString;function $Ke(t){if(t===null)return!0;var e=[],r,s,a,n,c,f=t;for(r=0,s=f.length;r{"use strict";var tJe=bs(),rJe=Object.prototype.toString;function nJe(t){if(t===null)return!0;var e,r,s,a,n,c=t;for(n=new Array(c.length),e=0,r=c.length;e{"use strict";var sJe=bs(),oJe=Object.prototype.hasOwnProperty;function aJe(t){if(t===null)return!0;var e,r=t;for(e in r)if(oJe.call(r,e)&&r[e]!==null)return!1;return!0}function lJe(t){return t!==null?t:{}}Mte.exports=new sJe("tag:yaml.org,2002:set",{kind:"mapping",resolve:aJe,construct:lJe})});var pE=L((I5t,Ute)=>{"use strict";var cJe=bd();Ute.exports=new cJe({include:[Z_()],implicit:[Pte(),kte()],explicit:[Rte(),Nte(),Lte(),_te()]})});var jte=L((C5t,Hte)=>{"use strict";var uJe=bs();function fJe(){return!0}function AJe(){}function pJe(){return""}function hJe(t){return typeof t>"u"}Hte.exports=new uJe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:fJe,construct:AJe,predicate:hJe,represent:pJe})});var Gte=L((w5t,qte)=>{"use strict";var gJe=bs();function dJe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),s="";return!(e[0]==="/"&&(r&&(s=r[1]),s.length>3||e[e.length-s.length-1]!=="/"))}function mJe(t){var e=t,r=/\/([gim]*)$/.exec(t),s="";return e[0]==="/"&&(r&&(s=r[1]),e=e.slice(1,e.length-s.length-1)),new RegExp(e,s)}function yJe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function EJe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}qte.exports=new gJe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:dJe,construct:mJe,predicate:EJe,represent:yJe})});var Vte=L((B5t,Yte)=>{"use strict";var Sx;try{Wte=Ie,Sx=Wte("esprima")}catch{typeof window<"u"&&(Sx=window.esprima)}var Wte,IJe=bs();function CJe(t){if(t===null)return!1;try{var e="("+t+")",r=Sx.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function wJe(t){var e="("+t+")",r=Sx.parse(e,{range:!0}),s=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){s.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(s,e.slice(a[0]+1,a[1]-1)):new Function(s,"return "+e.slice(a[0],a[1]))}function BJe(t){return t.toString()}function vJe(t){return Object.prototype.toString.call(t)==="[object Function]"}Yte.exports=new IJe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:CJe,construct:wJe,predicate:vJe,represent:BJe})});var q2=L((S5t,Jte)=>{"use strict";var Kte=bd();Jte.exports=Kte.DEFAULT=new Kte({include:[pE()],explicit:[jte(),Gte(),Vte()]})});var hre=L((D5t,G2)=>{"use strict";var wp=Dd(),rre=fE(),SJe=rte(),nre=pE(),DJe=q2(),o0=Object.prototype.hasOwnProperty,Dx=1,ire=2,sre=3,bx=4,$_=1,bJe=2,zte=3,PJe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,xJe=/[\x85\u2028\u2029]/,kJe=/[,\[\]\{\}]/,ore=/^(?:!|!!|![a-z\-]+!)$/i,are=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Zte(t){return Object.prototype.toString.call(t)}function qf(t){return t===10||t===13}function kd(t){return t===9||t===32}function nl(t){return t===9||t===32||t===10||t===13}function hE(t){return t===44||t===91||t===93||t===123||t===125}function QJe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function TJe(t){return t===120?2:t===117?4:t===85?8:0}function RJe(t){return 48<=t&&t<=57?t-48:-1}function Xte(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?`
-`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function FJe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var lre=new Array(256),cre=new Array(256);for(xd=0;xd<256;xd++)lre[xd]=Xte(xd)?1:0,cre[xd]=Xte(xd);var xd;function NJe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||DJe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function ure(t,e){return new rre(e,new SJe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Rr(t,e){throw ure(t,e)}function Px(t,e){t.onWarning&&t.onWarning.call(null,ure(t,e))}var $te={YAML:function(e,r,s){var a,n,c;e.version!==null&&Rr(e,"duplication of %YAML directive"),s.length!==1&&Rr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(s[0]),a===null&&Rr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),c=parseInt(a[2],10),n!==1&&Rr(e,"unacceptable YAML version of the document"),e.version=s[0],e.checkLineBreaks=c<2,c!==1&&c!==2&&Px(e,"unsupported YAML version of the document")},TAG:function(e,r,s){var a,n;s.length!==2&&Rr(e,"TAG directive accepts exactly two arguments"),a=s[0],n=s[1],ore.test(a)||Rr(e,"ill-formed tag handle (first argument) of the TAG directive"),o0.call(e.tagMap,a)&&Rr(e,'there is a previously declared suffix for "'+a+'" tag handle'),are.test(n)||Rr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function s0(t,e,r,s){var a,n,c,f;if(e1&&(t.result+=wp.repeat(`
-`,e-1))}function OJe(t,e,r){var s,a,n,c,f,p,h,E,C=t.kind,S=t.result,P;if(P=t.input.charCodeAt(t.position),nl(P)||hE(P)||P===35||P===38||P===42||P===33||P===124||P===62||P===39||P===34||P===37||P===64||P===96||(P===63||P===45)&&(a=t.input.charCodeAt(t.position+1),nl(a)||r&&hE(a)))return!1;for(t.kind="scalar",t.result="",n=c=t.position,f=!1;P!==0;){if(P===58){if(a=t.input.charCodeAt(t.position+1),nl(a)||r&&hE(a))break}else if(P===35){if(s=t.input.charCodeAt(t.position-1),nl(s))break}else{if(t.position===t.lineStart&&xx(t)||r&&hE(P))break;if(qf(P))if(p=t.line,h=t.lineStart,E=t.lineIndent,ls(t,!1,-1),t.lineIndent>=e){f=!0,P=t.input.charCodeAt(t.position);continue}else{t.position=c,t.line=p,t.lineStart=h,t.lineIndent=E;break}}f&&(s0(t,n,c,!1),tU(t,t.line-p),n=c=t.position,f=!1),kd(P)||(c=t.position+1),P=t.input.charCodeAt(++t.position)}return s0(t,n,c,!1),t.result?!0:(t.kind=C,t.result=S,!1)}function LJe(t,e){var r,s,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,s=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(s0(t,s,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)s=t.position,t.position++,a=t.position;else return!0;else qf(r)?(s0(t,s,a,!0),tU(t,ls(t,!1,e)),s=a=t.position):t.position===t.lineStart&&xx(t)?Rr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Rr(t,"unexpected end of the stream within a single quoted scalar")}function MJe(t,e){var r,s,a,n,c,f;if(f=t.input.charCodeAt(t.position),f!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=s=t.position;(f=t.input.charCodeAt(t.position))!==0;){if(f===34)return s0(t,r,t.position,!0),t.position++,!0;if(f===92){if(s0(t,r,t.position,!0),f=t.input.charCodeAt(++t.position),qf(f))ls(t,!1,e);else if(f<256&&lre[f])t.result+=cre[f],t.position++;else if((c=TJe(f))>0){for(a=c,n=0;a>0;a--)f=t.input.charCodeAt(++t.position),(c=QJe(f))>=0?n=(n<<4)+c:Rr(t,"expected hexadecimal character");t.result+=FJe(n),t.position++}else Rr(t,"unknown escape sequence");r=s=t.position}else qf(f)?(s0(t,r,s,!0),tU(t,ls(t,!1,e)),r=s=t.position):t.position===t.lineStart&&xx(t)?Rr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,s=t.position)}Rr(t,"unexpected end of the stream within a double quoted scalar")}function _Je(t,e){var r=!0,s,a=t.tag,n,c=t.anchor,f,p,h,E,C,S={},P,I,R,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,C=!1,n=[];else if(N===123)p=125,C=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(ls(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=c,t.kind=C?"mapping":"sequence",t.result=n,!0;r||Rr(t,"missed comma between flow collection entries"),I=P=R=null,h=E=!1,N===63&&(f=t.input.charCodeAt(t.position+1),nl(f)&&(h=E=!0,t.position++,ls(t,!0,e))),s=t.line,dE(t,e,Dx,!1,!0),I=t.tag,P=t.result,ls(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===s)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),ls(t,!0,e),dE(t,e,Dx,!1,!0),R=t.result),C?gE(t,n,S,I,P,R):h?n.push(gE(t,null,S,I,P,R)):n.push(P),ls(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Rr(t,"unexpected end of the stream within a flow collection")}function UJe(t,e){var r,s,a=$_,n=!1,c=!1,f=e,p=0,h=!1,E,C;if(C=t.input.charCodeAt(t.position),C===124)s=!1;else if(C===62)s=!0;else return!1;for(t.kind="scalar",t.result="";C!==0;)if(C=t.input.charCodeAt(++t.position),C===43||C===45)$_===a?a=C===43?zte:bJe:Rr(t,"repeat of a chomping mode identifier");else if((E=RJe(C))>=0)E===0?Rr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?Rr(t,"repeat of an indentation width identifier"):(f=e+E-1,c=!0);else break;if(kd(C)){do C=t.input.charCodeAt(++t.position);while(kd(C));if(C===35)do C=t.input.charCodeAt(++t.position);while(!qf(C)&&C!==0)}for(;C!==0;){for(eU(t),t.lineIndent=0,C=t.input.charCodeAt(t.position);(!c||t.lineIndentf&&(f=t.lineIndent),qf(C)){p++;continue}if(t.lineIndente)&&p!==0)Rr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(dE(t,e,bx,!0,a)&&(I?S=t.result:P=t.result),I||(gE(t,h,E,C,S,P,n,c),C=S=P=null),ls(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Rr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),C=0,S=t.implicitTypes.length;C tag; it should be "'+P.kind+'", not "'+t.kind+'"'),P.resolve(t.result)?(t.result=P.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Rr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Rr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function WJe(t){var e=t.position,r,s,a,n=!1,c;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(c=t.input.charCodeAt(t.position))!==0&&(ls(t,!0,-1),c=t.input.charCodeAt(t.position),!(t.lineIndent>0||c!==37));){for(n=!0,c=t.input.charCodeAt(++t.position),r=t.position;c!==0&&!nl(c);)c=t.input.charCodeAt(++t.position);for(s=t.input.slice(r,t.position),a=[],s.length<1&&Rr(t,"directive name must not be less than one character in length");c!==0;){for(;kd(c);)c=t.input.charCodeAt(++t.position);if(c===35){do c=t.input.charCodeAt(++t.position);while(c!==0&&!qf(c));break}if(qf(c))break;for(r=t.position;c!==0&&!nl(c);)c=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}c!==0&&eU(t),o0.call($te,s)?$te[s](t,s,a):Px(t,'unknown document directive "'+s+'"')}if(ls(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,ls(t,!0,-1)):n&&Rr(t,"directives end mark is expected"),dE(t,t.lineIndent-1,bx,!1,!0),ls(t,!0,-1),t.checkLineBreaks&&xJe.test(t.input.slice(e,t.position))&&Px(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&xx(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,ls(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var s=fre(t,r);if(typeof e!="function")return s;for(var a=0,n=s.length;a"u"&&(r=e,e=null),Are(t,e,wp.extend({schema:nre},r))}function VJe(t,e){return pre(t,wp.extend({schema:nre},e))}G2.exports.loadAll=Are;G2.exports.load=pre;G2.exports.safeLoadAll=YJe;G2.exports.safeLoad=VJe});var Lre=L((b5t,sU)=>{"use strict";var Y2=Dd(),V2=fE(),KJe=q2(),JJe=pE(),wre=Object.prototype.toString,Bre=Object.prototype.hasOwnProperty,zJe=9,W2=10,ZJe=13,XJe=32,$Je=33,eze=34,vre=35,tze=37,rze=38,nze=39,ize=42,Sre=44,sze=45,Dre=58,oze=61,aze=62,lze=63,cze=64,bre=91,Pre=93,uze=96,xre=123,fze=124,kre=125,jo={};jo[0]="\\0";jo[7]="\\a";jo[8]="\\b";jo[9]="\\t";jo[10]="\\n";jo[11]="\\v";jo[12]="\\f";jo[13]="\\r";jo[27]="\\e";jo[34]='\\"';jo[92]="\\\\";jo[133]="\\N";jo[160]="\\_";jo[8232]="\\L";jo[8233]="\\P";var Aze=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function pze(t,e){var r,s,a,n,c,f,p;if(e===null)return{};for(r={},s=Object.keys(e),a=0,n=s.length;ar/2-1){n=" ... ",c-=5;break}return f=this.buffer.slice(a,c),Eee.repeat(" ",e)+s+f+n+`
+`+Eee.repeat(" ",e+this.position-a+s.length)+"^"};GU.prototype.toString=function(e){var r,s="";return this.name&&(s+='in "'+this.name+'" '),s+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(s+=`:
+`+r)),s};Iee.exports=GU});var Ss=_((Fkt,Bee)=>{"use strict";var wee=AE(),L5e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],M5e=["scalar","sequence","mapping"];function U5e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(s){e[String(s)]=r})}),e}function _5e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(L5e.indexOf(r)===-1)throw new wee('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=U5e(e.styleAliases||null),M5e.indexOf(this.kind)===-1)throw new wee('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}Bee.exports=_5e});var Pd=_((Nkt,See)=>{"use strict";var vee=bd(),Ax=AE(),H5e=Ss();function qU(t,e,r){var s=[];return t.include.forEach(function(a){r=qU(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,c){n.tag===a.tag&&n.kind===a.kind&&s.push(c)}),r.push(a)}),r.filter(function(a,n){return s.indexOf(n)===-1})}function j5e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function s(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var G5e=Ss();Dee.exports=new G5e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var xee=_((Lkt,Pee)=>{"use strict";var q5e=Ss();Pee.exports=new q5e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var Qee=_((Mkt,kee)=>{"use strict";var W5e=Ss();kee.exports=new W5e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var px=_((Ukt,Ree)=>{"use strict";var Y5e=Pd();Ree.exports=new Y5e({explicit:[bee(),xee(),Qee()]})});var Fee=_((_kt,Tee)=>{"use strict";var V5e=Ss();function J5e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function K5e(){return null}function z5e(t){return t===null}Tee.exports=new V5e("tag:yaml.org,2002:null",{kind:"scalar",resolve:J5e,construct:K5e,predicate:z5e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var Oee=_((Hkt,Nee)=>{"use strict";var Z5e=Ss();function X5e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function $5e(t){return t==="true"||t==="True"||t==="TRUE"}function eqe(t){return Object.prototype.toString.call(t)==="[object Boolean]"}Nee.exports=new Z5e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:X5e,construct:$5e,predicate:eqe,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var Mee=_((jkt,Lee)=>{"use strict";var tqe=bd(),rqe=Ss();function nqe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function iqe(t){return 48<=t&&t<=55}function sqe(t){return 48<=t&&t<=57}function oqe(t){if(t===null)return!1;var e=t.length,r=0,s=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var Hee=_((Gkt,_ee)=>{"use strict";var Uee=bd(),cqe=Ss(),uqe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function fqe(t){return!(t===null||!uqe.test(t)||t[t.length-1]==="_")}function Aqe(t){var e,r,s,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,s=1,a.forEach(function(n){e+=n*s,s*=60}),r*e):r*parseFloat(e,10)}var pqe=/^[-+]?[0-9]+e/;function hqe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Uee.isNegativeZero(t))return"-0.0";return r=t.toString(10),pqe.test(r)?r.replace("e",".e"):r}function gqe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Uee.isNegativeZero(t))}_ee.exports=new cqe("tag:yaml.org,2002:float",{kind:"scalar",resolve:fqe,construct:Aqe,predicate:gqe,represent:hqe,defaultStyle:"lowercase"})});var WU=_((qkt,jee)=>{"use strict";var dqe=Pd();jee.exports=new dqe({include:[px()],implicit:[Fee(),Oee(),Mee(),Hee()]})});var YU=_((Wkt,Gee)=>{"use strict";var mqe=Pd();Gee.exports=new mqe({include:[WU()]})});var Vee=_((Ykt,Yee)=>{"use strict";var yqe=Ss(),qee=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Wee=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function Eqe(t){return t===null?!1:qee.exec(t)!==null||Wee.exec(t)!==null}function Iqe(t){var e,r,s,a,n,c,f,p=0,h=null,E,w,S;if(e=qee.exec(t),e===null&&(e=Wee.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],s=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,s,a));if(n=+e[4],c=+e[5],f=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],w=+(e[11]||0),h=(E*60+w)*6e4,e[9]==="-"&&(h=-h)),S=new Date(Date.UTC(r,s,a,n,c,f,p)),h&&S.setTime(S.getTime()-h),S}function Cqe(t){return t.toISOString()}Yee.exports=new yqe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:Eqe,construct:Iqe,instanceOf:Date,represent:Cqe})});var Kee=_((Vkt,Jee)=>{"use strict";var wqe=Ss();function Bqe(t){return t==="<<"||t===null}Jee.exports=new wqe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Bqe})});var Xee=_((Jkt,Zee)=>{"use strict";var xd;try{zee=Ie,xd=zee("buffer").Buffer}catch{}var zee,vqe=Ss(),VU=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
+\r`;function Sqe(t){if(t===null)return!1;var e,r,s=0,a=t.length,n=VU;for(r=0;r64)){if(e<0)return!1;s+=6}return s%8===0}function Dqe(t){var e,r,s=t.replace(/[\r\n=]/g,""),a=s.length,n=VU,c=0,f=[];for(e=0;e>16&255),f.push(c>>8&255),f.push(c&255)),c=c<<6|n.indexOf(s.charAt(e));return r=a%4*6,r===0?(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)):r===18?(f.push(c>>10&255),f.push(c>>2&255)):r===12&&f.push(c>>4&255),xd?xd.from?xd.from(f):new xd(f):f}function bqe(t){var e="",r=0,s,a,n=t.length,c=VU;for(s=0;s>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]),r=(r<<8)+t[s];return a=n%3,a===0?(e+=c[r>>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]):a===2?(e+=c[r>>10&63],e+=c[r>>4&63],e+=c[r<<2&63],e+=c[64]):a===1&&(e+=c[r>>2&63],e+=c[r<<4&63],e+=c[64],e+=c[64]),e}function Pqe(t){return xd&&xd.isBuffer(t)}Zee.exports=new vqe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Sqe,construct:Dqe,predicate:Pqe,represent:bqe})});var ete=_((zkt,$ee)=>{"use strict";var xqe=Ss(),kqe=Object.prototype.hasOwnProperty,Qqe=Object.prototype.toString;function Rqe(t){if(t===null)return!0;var e=[],r,s,a,n,c,f=t;for(r=0,s=f.length;r{"use strict";var Fqe=Ss(),Nqe=Object.prototype.toString;function Oqe(t){if(t===null)return!0;var e,r,s,a,n,c=t;for(n=new Array(c.length),e=0,r=c.length;e{"use strict";var Mqe=Ss(),Uqe=Object.prototype.hasOwnProperty;function _qe(t){if(t===null)return!0;var e,r=t;for(e in r)if(Uqe.call(r,e)&&r[e]!==null)return!1;return!0}function Hqe(t){return t!==null?t:{}}nte.exports=new Mqe("tag:yaml.org,2002:set",{kind:"mapping",resolve:_qe,construct:Hqe})});var hE=_(($kt,ste)=>{"use strict";var jqe=Pd();ste.exports=new jqe({include:[YU()],implicit:[Vee(),Kee()],explicit:[Xee(),ete(),rte(),ite()]})});var ate=_((eQt,ote)=>{"use strict";var Gqe=Ss();function qqe(){return!0}function Wqe(){}function Yqe(){return""}function Vqe(t){return typeof t>"u"}ote.exports=new Gqe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:qqe,construct:Wqe,predicate:Vqe,represent:Yqe})});var cte=_((tQt,lte)=>{"use strict";var Jqe=Ss();function Kqe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),s="";return!(e[0]==="/"&&(r&&(s=r[1]),s.length>3||e[e.length-s.length-1]!=="/"))}function zqe(t){var e=t,r=/\/([gim]*)$/.exec(t),s="";return e[0]==="/"&&(r&&(s=r[1]),e=e.slice(1,e.length-s.length-1)),new RegExp(e,s)}function Zqe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function Xqe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}lte.exports=new Jqe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:Kqe,construct:zqe,predicate:Xqe,represent:Zqe})});var Ate=_((rQt,fte)=>{"use strict";var hx;try{ute=Ie,hx=ute("esprima")}catch{typeof window<"u"&&(hx=window.esprima)}var ute,$qe=Ss();function e9e(t){if(t===null)return!1;try{var e="("+t+")",r=hx.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function t9e(t){var e="("+t+")",r=hx.parse(e,{range:!0}),s=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){s.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(s,e.slice(a[0]+1,a[1]-1)):new Function(s,"return "+e.slice(a[0],a[1]))}function r9e(t){return t.toString()}function n9e(t){return Object.prototype.toString.call(t)==="[object Function]"}fte.exports=new $qe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:e9e,construct:t9e,predicate:n9e,represent:r9e})});var H2=_((iQt,hte)=>{"use strict";var pte=Pd();hte.exports=pte.DEFAULT=new pte({include:[hE()],explicit:[ate(),cte(),Ate()]})});var Tte=_((sQt,j2)=>{"use strict";var Ip=bd(),Cte=AE(),i9e=Cee(),wte=hE(),s9e=H2(),i0=Object.prototype.hasOwnProperty,gx=1,Bte=2,vte=3,dx=4,JU=1,o9e=2,gte=3,a9e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,l9e=/[\x85\u2028\u2029]/,c9e=/[,\[\]\{\}]/,Ste=/^(?:!|!!|![a-z\-]+!)$/i,Dte=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function dte(t){return Object.prototype.toString.call(t)}function jf(t){return t===10||t===13}function Qd(t){return t===9||t===32}function rl(t){return t===9||t===32||t===10||t===13}function gE(t){return t===44||t===91||t===93||t===123||t===125}function u9e(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function f9e(t){return t===120?2:t===117?4:t===85?8:0}function A9e(t){return 48<=t&&t<=57?t-48:-1}function mte(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?`
+`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function p9e(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var bte=new Array(256),Pte=new Array(256);for(kd=0;kd<256;kd++)bte[kd]=mte(kd)?1:0,Pte[kd]=mte(kd);var kd;function h9e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||s9e,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function xte(t,e){return new Cte(e,new i9e(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Tr(t,e){throw xte(t,e)}function mx(t,e){t.onWarning&&t.onWarning.call(null,xte(t,e))}var yte={YAML:function(e,r,s){var a,n,c;e.version!==null&&Tr(e,"duplication of %YAML directive"),s.length!==1&&Tr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(s[0]),a===null&&Tr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),c=parseInt(a[2],10),n!==1&&Tr(e,"unacceptable YAML version of the document"),e.version=s[0],e.checkLineBreaks=c<2,c!==1&&c!==2&&mx(e,"unsupported YAML version of the document")},TAG:function(e,r,s){var a,n;s.length!==2&&Tr(e,"TAG directive accepts exactly two arguments"),a=s[0],n=s[1],Ste.test(a)||Tr(e,"ill-formed tag handle (first argument) of the TAG directive"),i0.call(e.tagMap,a)&&Tr(e,'there is a previously declared suffix for "'+a+'" tag handle'),Dte.test(n)||Tr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function n0(t,e,r,s){var a,n,c,f;if(e1&&(t.result+=Ip.repeat(`
+`,e-1))}function g9e(t,e,r){var s,a,n,c,f,p,h,E,w=t.kind,S=t.result,x;if(x=t.input.charCodeAt(t.position),rl(x)||gE(x)||x===35||x===38||x===42||x===33||x===124||x===62||x===39||x===34||x===37||x===64||x===96||(x===63||x===45)&&(a=t.input.charCodeAt(t.position+1),rl(a)||r&&gE(a)))return!1;for(t.kind="scalar",t.result="",n=c=t.position,f=!1;x!==0;){if(x===58){if(a=t.input.charCodeAt(t.position+1),rl(a)||r&&gE(a))break}else if(x===35){if(s=t.input.charCodeAt(t.position-1),rl(s))break}else{if(t.position===t.lineStart&&yx(t)||r&&gE(x))break;if(jf(x))if(p=t.line,h=t.lineStart,E=t.lineIndent,os(t,!1,-1),t.lineIndent>=e){f=!0,x=t.input.charCodeAt(t.position);continue}else{t.position=c,t.line=p,t.lineStart=h,t.lineIndent=E;break}}f&&(n0(t,n,c,!1),zU(t,t.line-p),n=c=t.position,f=!1),Qd(x)||(c=t.position+1),x=t.input.charCodeAt(++t.position)}return n0(t,n,c,!1),t.result?!0:(t.kind=w,t.result=S,!1)}function d9e(t,e){var r,s,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,s=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(n0(t,s,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)s=t.position,t.position++,a=t.position;else return!0;else jf(r)?(n0(t,s,a,!0),zU(t,os(t,!1,e)),s=a=t.position):t.position===t.lineStart&&yx(t)?Tr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Tr(t,"unexpected end of the stream within a single quoted scalar")}function m9e(t,e){var r,s,a,n,c,f;if(f=t.input.charCodeAt(t.position),f!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=s=t.position;(f=t.input.charCodeAt(t.position))!==0;){if(f===34)return n0(t,r,t.position,!0),t.position++,!0;if(f===92){if(n0(t,r,t.position,!0),f=t.input.charCodeAt(++t.position),jf(f))os(t,!1,e);else if(f<256&&bte[f])t.result+=Pte[f],t.position++;else if((c=f9e(f))>0){for(a=c,n=0;a>0;a--)f=t.input.charCodeAt(++t.position),(c=u9e(f))>=0?n=(n<<4)+c:Tr(t,"expected hexadecimal character");t.result+=p9e(n),t.position++}else Tr(t,"unknown escape sequence");r=s=t.position}else jf(f)?(n0(t,r,s,!0),zU(t,os(t,!1,e)),r=s=t.position):t.position===t.lineStart&&yx(t)?Tr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,s=t.position)}Tr(t,"unexpected end of the stream within a double quoted scalar")}function y9e(t,e){var r=!0,s,a=t.tag,n,c=t.anchor,f,p,h,E,w,S={},x,I,T,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,w=!1,n=[];else if(N===123)p=125,w=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(os(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=c,t.kind=w?"mapping":"sequence",t.result=n,!0;r||Tr(t,"missed comma between flow collection entries"),I=x=T=null,h=E=!1,N===63&&(f=t.input.charCodeAt(t.position+1),rl(f)&&(h=E=!0,t.position++,os(t,!0,e))),s=t.line,mE(t,e,gx,!1,!0),I=t.tag,x=t.result,os(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===s)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),os(t,!0,e),mE(t,e,gx,!1,!0),T=t.result),w?dE(t,n,S,I,x,T):h?n.push(dE(t,null,S,I,x,T)):n.push(x),os(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Tr(t,"unexpected end of the stream within a flow collection")}function E9e(t,e){var r,s,a=JU,n=!1,c=!1,f=e,p=0,h=!1,E,w;if(w=t.input.charCodeAt(t.position),w===124)s=!1;else if(w===62)s=!0;else return!1;for(t.kind="scalar",t.result="";w!==0;)if(w=t.input.charCodeAt(++t.position),w===43||w===45)JU===a?a=w===43?gte:o9e:Tr(t,"repeat of a chomping mode identifier");else if((E=A9e(w))>=0)E===0?Tr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?Tr(t,"repeat of an indentation width identifier"):(f=e+E-1,c=!0);else break;if(Qd(w)){do w=t.input.charCodeAt(++t.position);while(Qd(w));if(w===35)do w=t.input.charCodeAt(++t.position);while(!jf(w)&&w!==0)}for(;w!==0;){for(KU(t),t.lineIndent=0,w=t.input.charCodeAt(t.position);(!c||t.lineIndentf&&(f=t.lineIndent),jf(w)){p++;continue}if(t.lineIndente)&&p!==0)Tr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(mE(t,e,dx,!0,a)&&(I?S=t.result:x=t.result),I||(dE(t,h,E,w,S,x,n,c),w=S=x=null),os(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Tr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),w=0,S=t.implicitTypes.length;w tag; it should be "'+x.kind+'", not "'+t.kind+'"'),x.resolve(t.result)?(t.result=x.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Tr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Tr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function v9e(t){var e=t.position,r,s,a,n=!1,c;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(c=t.input.charCodeAt(t.position))!==0&&(os(t,!0,-1),c=t.input.charCodeAt(t.position),!(t.lineIndent>0||c!==37));){for(n=!0,c=t.input.charCodeAt(++t.position),r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);for(s=t.input.slice(r,t.position),a=[],s.length<1&&Tr(t,"directive name must not be less than one character in length");c!==0;){for(;Qd(c);)c=t.input.charCodeAt(++t.position);if(c===35){do c=t.input.charCodeAt(++t.position);while(c!==0&&!jf(c));break}if(jf(c))break;for(r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}c!==0&&KU(t),i0.call(yte,s)?yte[s](t,s,a):mx(t,'unknown document directive "'+s+'"')}if(os(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,os(t,!0,-1)):n&&Tr(t,"directives end mark is expected"),mE(t,t.lineIndent-1,dx,!1,!0),os(t,!0,-1),t.checkLineBreaks&&l9e.test(t.input.slice(e,t.position))&&mx(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&yx(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,os(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var s=kte(t,r);if(typeof e!="function")return s;for(var a=0,n=s.length;a"u"&&(r=e,e=null),Qte(t,e,Ip.extend({schema:wte},r))}function D9e(t,e){return Rte(t,Ip.extend({schema:wte},e))}j2.exports.loadAll=Qte;j2.exports.load=Rte;j2.exports.safeLoadAll=S9e;j2.exports.safeLoad=D9e});var rre=_((oQt,e_)=>{"use strict";var q2=bd(),W2=AE(),b9e=H2(),P9e=hE(),Hte=Object.prototype.toString,jte=Object.prototype.hasOwnProperty,x9e=9,G2=10,k9e=13,Q9e=32,R9e=33,T9e=34,Gte=35,F9e=37,N9e=38,O9e=39,L9e=42,qte=44,M9e=45,Wte=58,U9e=61,_9e=62,H9e=63,j9e=64,Yte=91,Vte=93,G9e=96,Jte=123,q9e=124,Kte=125,_o={};_o[0]="\\0";_o[7]="\\a";_o[8]="\\b";_o[9]="\\t";_o[10]="\\n";_o[11]="\\v";_o[12]="\\f";_o[13]="\\r";_o[27]="\\e";_o[34]='\\"';_o[92]="\\\\";_o[133]="\\N";_o[160]="\\_";_o[8232]="\\L";_o[8233]="\\P";var W9e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function Y9e(t,e){var r,s,a,n,c,f,p;if(e===null)return{};for(r={},s=Object.keys(e),a=0,n=s.length;a0?t.charCodeAt(n-1):null,S=S&&mre(c,f)}else{for(n=0;ns&&t[C+1]!==" ",C=n);else if(!mE(c))return kx;f=n>0?t.charCodeAt(n-1):null,S=S&&mre(c,f)}h=h||E&&n-C-1>s&&t[C+1]!==" "}return!p&&!h?S&&!a(t)?Tre:Rre:r>9&&Qre(t)?kx:h?Nre:Fre}function Eze(t,e,r,s){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&Aze.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),c=s||t.flowLevel>-1&&r>=t.flowLevel;function f(p){return gze(t,p)}switch(yze(e,c,t.indent,n,f)){case Tre:return e;case Rre:return"'"+e.replace(/'/g,"''")+"'";case Fre:return"|"+yre(e,t.indent)+Ere(dre(e,a));case Nre:return">"+yre(e,t.indent)+Ere(dre(Ize(e,n),a));case kx:return'"'+Cze(e,n)+'"';default:throw new V2("impossible error: invalid scalar style")}}()}function yre(t,e){var r=Qre(t)?String(e):"",s=t[t.length-1]===`
+`&&(n+=r),n+=c;return n}function ZU(t,e){return`
+`+q2.repeat(" ",t.indent*e)}function J9e(t,e){var r,s,a;for(r=0,s=t.implicitTypes.length;r0?t.charCodeAt(n-1):null,S=S&&Ote(c,f)}else{for(n=0;ns&&t[w+1]!==" ",w=n);else if(!yE(c))return Ex;f=n>0?t.charCodeAt(n-1):null,S=S&&Ote(c,f)}h=h||E&&n-w-1>s&&t[w+1]!==" "}return!p&&!h?S&&!a(t)?Zte:Xte:r>9&&zte(t)?Ex:h?ere:$te}function X9e(t,e,r,s){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&W9e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),c=s||t.flowLevel>-1&&r>=t.flowLevel;function f(p){return J9e(t,p)}switch(Z9e(e,c,t.indent,n,f)){case Zte:return e;case Xte:return"'"+e.replace(/'/g,"''")+"'";case $te:return"|"+Lte(e,t.indent)+Mte(Nte(e,a));case ere:return">"+Lte(e,t.indent)+Mte(Nte($9e(e,n),a));case Ex:return'"'+eWe(e,n)+'"';default:throw new W2("impossible error: invalid scalar style")}}()}function Lte(t,e){var r=zte(t)?String(e):"",s=t[t.length-1]===`
`,a=s&&(t[t.length-2]===`
`||t===`
`),n=a?"+":s?"":"-";return r+n+`
-`}function Ere(t){return t[t.length-1]===`
-`?t.slice(0,-1):t}function Ize(t,e){for(var r=/(\n+)([^\n]*)/g,s=function(){var h=t.indexOf(`
-`);return h=h!==-1?h:t.length,r.lastIndex=h,Ire(t.slice(0,h),e)}(),a=t[0]===`
+`}function Mte(t){return t[t.length-1]===`
+`?t.slice(0,-1):t}function $9e(t,e){for(var r=/(\n+)([^\n]*)/g,s=function(){var h=t.indexOf(`
+`);return h=h!==-1?h:t.length,r.lastIndex=h,Ute(t.slice(0,h),e)}(),a=t[0]===`
`||t[0]===" ",n,c;c=r.exec(t);){var f=c[1],p=c[2];n=p[0]===" ",s+=f+(!a&&!n&&p!==""?`
-`:"")+Ire(p,e),a=n}return s}function Ire(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,s,a=0,n,c=0,f=0,p="";s=r.exec(t);)f=s.index,f-a>e&&(n=c>a?c:f,p+=`
+`:"")+Ute(p,e),a=n}return s}function Ute(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,s,a=0,n,c=0,f=0,p="";s=r.exec(t);)f=s.index,f-a>e&&(n=c>a?c:f,p+=`
`+t.slice(a,n),a=n+1),c=f;return p+=`
`,t.length-a>e&&c>a?p+=t.slice(a,c)+`
-`+t.slice(c+1):p+=t.slice(a),p.slice(1)}function Cze(t){for(var e="",r,s,a,n=0;n=55296&&r<=56319&&(s=t.charCodeAt(n+1),s>=56320&&s<=57343)){e+=gre((r-55296)*1024+s-56320+65536),n++;continue}a=jo[r],e+=!a&&mE(r)?t[n]:a||gre(r)}return e}function wze(t,e,r){var s="",a=t.tag,n,c;for(n=0,c=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Qd(t,e,h,!1,!1)&&(E+=t.dump,s+=E));t.tag=a,t.dump="{"+s+"}"}function Sze(t,e,r,s){var a="",n=t.tag,c=Object.keys(r),f,p,h,E,C,S;if(t.sortKeys===!0)c.sort();else if(typeof t.sortKeys=="function")c.sort(t.sortKeys);else if(t.sortKeys)throw new V2("sortKeys must be a boolean or a function");for(f=0,p=c.length;f1024,C&&(t.dump&&W2===t.dump.charCodeAt(0)?S+="?":S+="? "),S+=t.dump,C&&(S+=rU(t,e)),Qd(t,e+1,E,!0,C)&&(t.dump&&W2===t.dump.charCodeAt(0)?S+=":":S+=": ",S+=t.dump,a+=S));t.tag=n,t.dump=a||"{}"}function Cre(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n tag resolver accepts not "'+p+'" style');t.dump=s}return!0}return!1}function Qd(t,e,r,s,a,n){t.tag=null,t.dump=r,Cre(t,r,!1)||Cre(t,r,!0);var c=wre.call(t.dump);s&&(s=t.flowLevel<0||t.flowLevel>e);var f=c==="[object Object]"||c==="[object Array]",p,h;if(f&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(f&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),c==="[object Object]")s&&Object.keys(t.dump).length!==0?(Sze(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(vze(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(c==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;s&&t.dump.length!==0?(Bze(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(wze(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(c==="[object String]")t.tag!=="?"&&Eze(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new V2("unacceptable kind of an object to dump "+c)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function Dze(t,e){var r=[],s=[],a,n;for(nU(t,r,s),a=0,n=s.length;a{"use strict";var Qx=hre(),Mre=Lre();function Tx(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Wi.exports.Type=bs();Wi.exports.Schema=bd();Wi.exports.FAILSAFE_SCHEMA=vx();Wi.exports.JSON_SCHEMA=z_();Wi.exports.CORE_SCHEMA=Z_();Wi.exports.DEFAULT_SAFE_SCHEMA=pE();Wi.exports.DEFAULT_FULL_SCHEMA=q2();Wi.exports.load=Qx.load;Wi.exports.loadAll=Qx.loadAll;Wi.exports.safeLoad=Qx.safeLoad;Wi.exports.safeLoadAll=Qx.safeLoadAll;Wi.exports.dump=Mre.dump;Wi.exports.safeDump=Mre.safeDump;Wi.exports.YAMLException=fE();Wi.exports.MINIMAL_SCHEMA=vx();Wi.exports.SAFE_SCHEMA=pE();Wi.exports.DEFAULT_SCHEMA=q2();Wi.exports.scan=Tx("scan");Wi.exports.parse=Tx("parse");Wi.exports.compose=Tx("compose");Wi.exports.addConstructor=Tx("addConstructor")});var Hre=L((x5t,Ure)=>{"use strict";var Pze=_re();Ure.exports=Pze});var qre=L((k5t,jre)=>{"use strict";function xze(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Td(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Td)}xze(Td,Error);Td.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C({[gt]:Oe})))},Ae=function(ee){return ee},ce=function(ee){return ee},me=La("correct indentation"),pe=" ",Be=dn(" ",!1),Ce=function(ee){return ee.length===lr*St},g=function(ee){return ee.length===(lr+1)*St},we=function(){return lr++,!0},ye=function(){return lr--,!0},fe=function(){return ca()},se=La("pseudostring"),X=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,De=Jn(["\r",`
-`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Re=/^[^\r\n\t ,\][{}:#"']/,dt=Jn(["\r",`
-`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),j=function(){return ca().replace(/^ *| *$/g,"")},rt="--",Fe=dn("--",!1),Ne=/^[a-zA-Z\/0-9]/,Pe=Jn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ye=/^[^\r\n\t :,]/,ke=Jn(["\r",`
-`," "," ",":",","],!0,!1),it="null",_e=dn("null",!1),x=function(){return null},w="true",b=dn("true",!1),y=function(){return!0},F="false",z=dn("false",!1),Z=function(){return!1},$=La("string"),oe='"',xe=dn('"',!1),Te=function(){return""},lt=function(ee){return ee},It=function(ee){return ee.join("")},qt=/^[^"\\\0-\x1F\x7F]/,ir=Jn(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',gn=dn('\\"',!1),Pr=function(){return'"'},Ir="\\\\",Nr=dn("\\\\",!1),nn=function(){return"\\"},ai="\\/",wo=dn("\\/",!1),ns=function(){return"/"},to="\\b",Bo=dn("\\b",!1),ji=function(){return"\b"},ro="\\f",vo=dn("\\f",!1),RA=function(){return"\f"},pf="\\n",yh=dn("\\n",!1),Eh=function(){return`
-`},no="\\r",jn=dn("\\r",!1),Fs=function(){return"\r"},io="\\t",lu=dn("\\t",!1),cu=function(){return" "},uu="\\u",FA=dn("\\u",!1),NA=function(ee,Ee,Oe,gt){return String.fromCharCode(parseInt(`0x${ee}${Ee}${Oe}${gt}`))},aa=/^[0-9a-fA-F]/,la=Jn([["0","9"],["a","f"],["A","F"]],!1,!1),OA=La("blank space"),gr=/^[ \t]/,So=Jn([" "," "],!1,!1),Me=La("white space"),fu=/^[ \t\n\r]/,Cr=Jn([" "," ",`
-`,"\r"],!1,!1),hf=`\r
-`,LA=dn(`\r
-`,!1),MA=`
-`,Au=dn(`
-`,!1),pu="\r",ac=dn("\r",!1),ve=0,Nt=0,lc=[{line:1,column:1}],Li=0,so=[],Rt=0,xn;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function ca(){return t.substring(Nt,ve)}function qi(){return Ua(Nt,ve)}function Mi(ee,Ee){throw Ee=Ee!==void 0?Ee:Ua(Nt,ve),gf([La(ee)],t.substring(Nt,ve),Ee)}function Oa(ee,Ee){throw Ee=Ee!==void 0?Ee:Ua(Nt,ve),Ha(ee,Ee)}function dn(ee,Ee){return{type:"literal",text:ee,ignoreCase:Ee}}function Jn(ee,Ee,Oe){return{type:"class",parts:ee,inverted:Ee,ignoreCase:Oe}}function hu(){return{type:"any"}}function Ih(){return{type:"end"}}function La(ee){return{type:"other",description:ee}}function Ma(ee){var Ee=lc[ee],Oe;if(Ee)return Ee;for(Oe=ee-1;!lc[Oe];)Oe--;for(Ee=lc[Oe],Ee={line:Ee.line,column:Ee.column};OeLi&&(Li=ve,so=[]),so.push(ee))}function Ha(ee,Ee){return new Td(ee,null,null,Ee)}function gf(ee,Ee,Oe){return new Td(Td.buildMessage(ee,Ee),ee,Ee,Oe)}function cc(){var ee;return ee=_A(),ee}function wn(){var ee,Ee,Oe;for(ee=ve,Ee=[],Oe=ua();Oe!==r;)Ee.push(Oe),Oe=ua();return Ee!==r&&(Nt=ee,Ee=n(Ee)),ee=Ee,ee}function ua(){var ee,Ee,Oe,gt,yt;return ee=ve,Ee=vl(),Ee!==r?(t.charCodeAt(ve)===45?(Oe=c,ve++):(Oe=r,Rt===0&&Xe(f)),Oe!==r?(gt=Qn(),gt!==r?(yt=fa(),yt!==r?(Nt=ee,Ee=p(yt),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r),ee}function _A(){var ee,Ee,Oe;for(ee=ve,Ee=[],Oe=UA();Oe!==r;)Ee.push(Oe),Oe=UA();return Ee!==r&&(Nt=ee,Ee=h(Ee)),ee=Ee,ee}function UA(){var ee,Ee,Oe,gt,yt,Dt,tr,fn,li;if(ee=ve,Ee=Qn(),Ee===r&&(Ee=null),Ee!==r){if(Oe=ve,t.charCodeAt(ve)===35?(gt=E,ve++):(gt=r,Rt===0&&Xe(C)),gt!==r){if(yt=[],Dt=ve,tr=ve,Rt++,fn=st(),Rt--,fn===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(fn=t.charAt(ve),ve++):(fn=r,Rt===0&&Xe(S)),fn!==r?(tr=[tr,fn],Dt=tr):(ve=Dt,Dt=r)):(ve=Dt,Dt=r),Dt!==r)for(;Dt!==r;)yt.push(Dt),Dt=ve,tr=ve,Rt++,fn=st(),Rt--,fn===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(fn=t.charAt(ve),ve++):(fn=r,Rt===0&&Xe(S)),fn!==r?(tr=[tr,fn],Dt=tr):(ve=Dt,Dt=r)):(ve=Dt,Dt=r);else yt=r;yt!==r?(gt=[gt,yt],Oe=gt):(ve=Oe,Oe=r)}else ve=Oe,Oe=r;if(Oe===r&&(Oe=null),Oe!==r){if(gt=[],yt=Je(),yt!==r)for(;yt!==r;)gt.push(yt),yt=Je();else gt=r;gt!==r?(Nt=ee,Ee=P(),ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r}else ve=ee,ee=r;if(ee===r&&(ee=ve,Ee=vl(),Ee!==r?(Oe=ja(),Oe!==r?(gt=Qn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(ve)===58?(yt=I,ve++):(yt=r,Rt===0&&Xe(R)),yt!==r?(Dt=Qn(),Dt===r&&(Dt=null),Dt!==r?(tr=fa(),tr!==r?(Nt=ee,Ee=N(Oe,tr),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r),ee===r&&(ee=ve,Ee=vl(),Ee!==r?(Oe=is(),Oe!==r?(gt=Qn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(ve)===58?(yt=I,ve++):(yt=r,Rt===0&&Xe(R)),yt!==r?(Dt=Qn(),Dt===r&&(Dt=null),Dt!==r?(tr=fa(),tr!==r?(Nt=ee,Ee=N(Oe,tr),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r),ee===r))){if(ee=ve,Ee=vl(),Ee!==r)if(Oe=is(),Oe!==r)if(gt=Qn(),gt!==r)if(yt=gu(),yt!==r){if(Dt=[],tr=Je(),tr!==r)for(;tr!==r;)Dt.push(tr),tr=Je();else Dt=r;Dt!==r?(Nt=ee,Ee=N(Oe,yt),ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r;else ve=ee,ee=r;else ve=ee,ee=r;else ve=ee,ee=r;if(ee===r)if(ee=ve,Ee=vl(),Ee!==r)if(Oe=is(),Oe!==r){if(gt=[],yt=ve,Dt=Qn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Rt===0&&Xe(W)),tr!==r?(fn=Qn(),fn===r&&(fn=null),fn!==r?(li=is(),li!==r?(Nt=yt,Dt=te(Oe,li),yt=Dt):(ve=yt,yt=r)):(ve=yt,yt=r)):(ve=yt,yt=r)):(ve=yt,yt=r),yt!==r)for(;yt!==r;)gt.push(yt),yt=ve,Dt=Qn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Rt===0&&Xe(W)),tr!==r?(fn=Qn(),fn===r&&(fn=null),fn!==r?(li=is(),li!==r?(Nt=yt,Dt=te(Oe,li),yt=Dt):(ve=yt,yt=r)):(ve=yt,yt=r)):(ve=yt,yt=r)):(ve=yt,yt=r);else gt=r;gt!==r?(yt=Qn(),yt===r&&(yt=null),yt!==r?(t.charCodeAt(ve)===58?(Dt=I,ve++):(Dt=r,Rt===0&&Xe(R)),Dt!==r?(tr=Qn(),tr===r&&(tr=null),tr!==r?(fn=fa(),fn!==r?(Nt=ee,Ee=ie(Oe,gt,fn),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)}else ve=ee,ee=r;else ve=ee,ee=r}return ee}function fa(){var ee,Ee,Oe,gt,yt,Dt,tr;if(ee=ve,Ee=ve,Rt++,Oe=ve,gt=st(),gt!==r?(yt=Mt(),yt!==r?(t.charCodeAt(ve)===45?(Dt=c,ve++):(Dt=r,Rt===0&&Xe(f)),Dt!==r?(tr=Qn(),tr!==r?(gt=[gt,yt,Dt,tr],Oe=gt):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r),Rt--,Oe!==r?(ve=Ee,Ee=void 0):Ee=r,Ee!==r?(Oe=Je(),Oe!==r?(gt=kn(),gt!==r?(yt=wn(),yt!==r?(Dt=Aa(),Dt!==r?(Nt=ee,Ee=Ae(yt),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r),ee===r&&(ee=ve,Ee=st(),Ee!==r?(Oe=kn(),Oe!==r?(gt=_A(),gt!==r?(yt=Aa(),yt!==r?(Nt=ee,Ee=Ae(gt),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r),ee===r))if(ee=ve,Ee=uc(),Ee!==r){if(Oe=[],gt=Je(),gt!==r)for(;gt!==r;)Oe.push(gt),gt=Je();else Oe=r;Oe!==r?(Nt=ee,Ee=ce(Ee),ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r;return ee}function vl(){var ee,Ee,Oe;for(Rt++,ee=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&Xe(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&Xe(Be));return Ee!==r?(Nt=ve,Oe=Ce(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r),Rt--,ee===r&&(Ee=r,Rt===0&&Xe(me)),ee}function Mt(){var ee,Ee,Oe;for(ee=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&Xe(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Rt===0&&Xe(Be));return Ee!==r?(Nt=ve,Oe=g(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r),ee}function kn(){var ee;return Nt=ve,ee=we(),ee?ee=void 0:ee=r,ee}function Aa(){var ee;return Nt=ve,ee=ye(),ee?ee=void 0:ee=r,ee}function ja(){var ee;return ee=Sl(),ee===r&&(ee=fc()),ee}function is(){var ee,Ee,Oe;if(ee=Sl(),ee===r){if(ee=ve,Ee=[],Oe=qa(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=qa();else Ee=r;Ee!==r&&(Nt=ee,Ee=fe()),ee=Ee}return ee}function uc(){var ee;return ee=_i(),ee===r&&(ee=ws(),ee===r&&(ee=Sl(),ee===r&&(ee=fc()))),ee}function gu(){var ee;return ee=_i(),ee===r&&(ee=Sl(),ee===r&&(ee=qa())),ee}function fc(){var ee,Ee,Oe,gt,yt,Dt;if(Rt++,ee=ve,X.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&Xe(De)),Ee!==r){for(Oe=[],gt=ve,yt=Qn(),yt===r&&(yt=null),yt!==r?(Re.test(t.charAt(ve))?(Dt=t.charAt(ve),ve++):(Dt=r,Rt===0&&Xe(dt)),Dt!==r?(yt=[yt,Dt],gt=yt):(ve=gt,gt=r)):(ve=gt,gt=r);gt!==r;)Oe.push(gt),gt=ve,yt=Qn(),yt===r&&(yt=null),yt!==r?(Re.test(t.charAt(ve))?(Dt=t.charAt(ve),ve++):(Dt=r,Rt===0&&Xe(dt)),Dt!==r?(yt=[yt,Dt],gt=yt):(ve=gt,gt=r)):(ve=gt,gt=r);Oe!==r?(Nt=ee,Ee=j(),ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r;return Rt--,ee===r&&(Ee=r,Rt===0&&Xe(se)),ee}function qa(){var ee,Ee,Oe,gt,yt;if(ee=ve,t.substr(ve,2)===rt?(Ee=rt,ve+=2):(Ee=r,Rt===0&&Xe(Fe)),Ee===r&&(Ee=null),Ee!==r)if(Ne.test(t.charAt(ve))?(Oe=t.charAt(ve),ve++):(Oe=r,Rt===0&&Xe(Pe)),Oe!==r){for(gt=[],Ye.test(t.charAt(ve))?(yt=t.charAt(ve),ve++):(yt=r,Rt===0&&Xe(ke));yt!==r;)gt.push(yt),Ye.test(t.charAt(ve))?(yt=t.charAt(ve),ve++):(yt=r,Rt===0&&Xe(ke));gt!==r?(Nt=ee,Ee=j(),ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r;else ve=ee,ee=r;return ee}function _i(){var ee,Ee;return ee=ve,t.substr(ve,4)===it?(Ee=it,ve+=4):(Ee=r,Rt===0&&Xe(_e)),Ee!==r&&(Nt=ee,Ee=x()),ee=Ee,ee}function ws(){var ee,Ee;return ee=ve,t.substr(ve,4)===w?(Ee=w,ve+=4):(Ee=r,Rt===0&&Xe(b)),Ee!==r&&(Nt=ee,Ee=y()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,5)===F?(Ee=F,ve+=5):(Ee=r,Rt===0&&Xe(z)),Ee!==r&&(Nt=ee,Ee=Z()),ee=Ee),ee}function Sl(){var ee,Ee,Oe,gt;return Rt++,ee=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Rt===0&&Xe(xe)),Ee!==r?(t.charCodeAt(ve)===34?(Oe=oe,ve++):(Oe=r,Rt===0&&Xe(xe)),Oe!==r?(Nt=ee,Ee=Te(),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r),ee===r&&(ee=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Rt===0&&Xe(xe)),Ee!==r?(Oe=df(),Oe!==r?(t.charCodeAt(ve)===34?(gt=oe,ve++):(gt=r,Rt===0&&Xe(xe)),gt!==r?(Nt=ee,Ee=lt(Oe),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)),Rt--,ee===r&&(Ee=r,Rt===0&&Xe($)),ee}function df(){var ee,Ee,Oe;if(ee=ve,Ee=[],Oe=Ac(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=Ac();else Ee=r;return Ee!==r&&(Nt=ee,Ee=It(Ee)),ee=Ee,ee}function Ac(){var ee,Ee,Oe,gt,yt,Dt;return qt.test(t.charAt(ve))?(ee=t.charAt(ve),ve++):(ee=r,Rt===0&&Xe(ir)),ee===r&&(ee=ve,t.substr(ve,2)===Pt?(Ee=Pt,ve+=2):(Ee=r,Rt===0&&Xe(gn)),Ee!==r&&(Nt=ee,Ee=Pr()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===Ir?(Ee=Ir,ve+=2):(Ee=r,Rt===0&&Xe(Nr)),Ee!==r&&(Nt=ee,Ee=nn()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===ai?(Ee=ai,ve+=2):(Ee=r,Rt===0&&Xe(wo)),Ee!==r&&(Nt=ee,Ee=ns()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===to?(Ee=to,ve+=2):(Ee=r,Rt===0&&Xe(Bo)),Ee!==r&&(Nt=ee,Ee=ji()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===ro?(Ee=ro,ve+=2):(Ee=r,Rt===0&&Xe(vo)),Ee!==r&&(Nt=ee,Ee=RA()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===pf?(Ee=pf,ve+=2):(Ee=r,Rt===0&&Xe(yh)),Ee!==r&&(Nt=ee,Ee=Eh()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===no?(Ee=no,ve+=2):(Ee=r,Rt===0&&Xe(jn)),Ee!==r&&(Nt=ee,Ee=Fs()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===io?(Ee=io,ve+=2):(Ee=r,Rt===0&&Xe(lu)),Ee!==r&&(Nt=ee,Ee=cu()),ee=Ee,ee===r&&(ee=ve,t.substr(ve,2)===uu?(Ee=uu,ve+=2):(Ee=r,Rt===0&&Xe(FA)),Ee!==r?(Oe=Bi(),Oe!==r?(gt=Bi(),gt!==r?(yt=Bi(),yt!==r?(Dt=Bi(),Dt!==r?(Nt=ee,Ee=NA(Oe,gt,yt,Dt),ee=Ee):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)):(ve=ee,ee=r)))))))))),ee}function Bi(){var ee;return aa.test(t.charAt(ve))?(ee=t.charAt(ve),ve++):(ee=r,Rt===0&&Xe(la)),ee}function Qn(){var ee,Ee;if(Rt++,ee=[],gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&Xe(So)),Ee!==r)for(;Ee!==r;)ee.push(Ee),gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&Xe(So));else ee=r;return Rt--,ee===r&&(Ee=r,Rt===0&&Xe(OA)),ee}function pc(){var ee,Ee;if(Rt++,ee=[],fu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&Xe(Cr)),Ee!==r)for(;Ee!==r;)ee.push(Ee),fu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Rt===0&&Xe(Cr));else ee=r;return Rt--,ee===r&&(Ee=r,Rt===0&&Xe(Me)),ee}function Je(){var ee,Ee,Oe,gt,yt,Dt;if(ee=ve,Ee=st(),Ee!==r){for(Oe=[],gt=ve,yt=Qn(),yt===r&&(yt=null),yt!==r?(Dt=st(),Dt!==r?(yt=[yt,Dt],gt=yt):(ve=gt,gt=r)):(ve=gt,gt=r);gt!==r;)Oe.push(gt),gt=ve,yt=Qn(),yt===r&&(yt=null),yt!==r?(Dt=st(),Dt!==r?(yt=[yt,Dt],gt=yt):(ve=gt,gt=r)):(ve=gt,gt=r);Oe!==r?(Ee=[Ee,Oe],ee=Ee):(ve=ee,ee=r)}else ve=ee,ee=r;return ee}function st(){var ee;return t.substr(ve,2)===hf?(ee=hf,ve+=2):(ee=r,Rt===0&&Xe(LA)),ee===r&&(t.charCodeAt(ve)===10?(ee=MA,ve++):(ee=r,Rt===0&&Xe(Au)),ee===r&&(t.charCodeAt(ve)===13?(ee=pu,ve++):(ee=r,Rt===0&&Xe(ac)))),ee}let St=2,lr=0;if(xn=a(),xn!==r&&ve===t.length)return xn;throw xn!==r&&ve"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>Vre(t[e])):!1}function oU(t,e,r){if(t===null)return`null
+`+t.slice(c+1):p+=t.slice(a),p.slice(1)}function eWe(t){for(var e="",r,s,a,n=0;n=55296&&r<=56319&&(s=t.charCodeAt(n+1),s>=56320&&s<=57343)){e+=Fte((r-55296)*1024+s-56320+65536),n++;continue}a=_o[r],e+=!a&&yE(r)?t[n]:a||Fte(r)}return e}function tWe(t,e,r){var s="",a=t.tag,n,c;for(n=0,c=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Rd(t,e,h,!1,!1)&&(E+=t.dump,s+=E));t.tag=a,t.dump="{"+s+"}"}function iWe(t,e,r,s){var a="",n=t.tag,c=Object.keys(r),f,p,h,E,w,S;if(t.sortKeys===!0)c.sort();else if(typeof t.sortKeys=="function")c.sort(t.sortKeys);else if(t.sortKeys)throw new W2("sortKeys must be a boolean or a function");for(f=0,p=c.length;f1024,w&&(t.dump&&G2===t.dump.charCodeAt(0)?S+="?":S+="? "),S+=t.dump,w&&(S+=ZU(t,e)),Rd(t,e+1,E,!0,w)&&(t.dump&&G2===t.dump.charCodeAt(0)?S+=":":S+=": ",S+=t.dump,a+=S));t.tag=n,t.dump=a||"{}"}function _te(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n tag resolver accepts not "'+p+'" style');t.dump=s}return!0}return!1}function Rd(t,e,r,s,a,n){t.tag=null,t.dump=r,_te(t,r,!1)||_te(t,r,!0);var c=Hte.call(t.dump);s&&(s=t.flowLevel<0||t.flowLevel>e);var f=c==="[object Object]"||c==="[object Array]",p,h;if(f&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(f&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),c==="[object Object]")s&&Object.keys(t.dump).length!==0?(iWe(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(nWe(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(c==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;s&&t.dump.length!==0?(rWe(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(tWe(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(c==="[object String]")t.tag!=="?"&&X9e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new W2("unacceptable kind of an object to dump "+c)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function sWe(t,e){var r=[],s=[],a,n;for(XU(t,r,s),a=0,n=s.length;a{"use strict";var Ix=Tte(),nre=rre();function Cx(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Gi.exports.Type=Ss();Gi.exports.Schema=Pd();Gi.exports.FAILSAFE_SCHEMA=px();Gi.exports.JSON_SCHEMA=WU();Gi.exports.CORE_SCHEMA=YU();Gi.exports.DEFAULT_SAFE_SCHEMA=hE();Gi.exports.DEFAULT_FULL_SCHEMA=H2();Gi.exports.load=Ix.load;Gi.exports.loadAll=Ix.loadAll;Gi.exports.safeLoad=Ix.safeLoad;Gi.exports.safeLoadAll=Ix.safeLoadAll;Gi.exports.dump=nre.dump;Gi.exports.safeDump=nre.safeDump;Gi.exports.YAMLException=AE();Gi.exports.MINIMAL_SCHEMA=px();Gi.exports.SAFE_SCHEMA=hE();Gi.exports.DEFAULT_SCHEMA=H2();Gi.exports.scan=Cx("scan");Gi.exports.parse=Cx("parse");Gi.exports.compose=Cx("compose");Gi.exports.addConstructor=Cx("addConstructor")});var ore=_((lQt,sre)=>{"use strict";var aWe=ire();sre.exports=aWe});var lre=_((cQt,are)=>{"use strict";function lWe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Td(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Td)}lWe(Td,Error);Td.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,S=1;w({[dt]:Oe})))},ue=function(te){return te},le=function(te){return te},me=Oa("correct indentation"),pe=" ",Be=dn(" ",!1),Ce=function(te){return te.length===lr*St},g=function(te){return te.length===(lr+1)*St},we=function(){return lr++,!0},ye=function(){return lr--,!0},Ae=function(){return aa()},se=Oa("pseudostring"),X=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,De=Kn(["\r",`
+`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Te=/^[^\r\n\t ,\][{}:#"']/,mt=Kn(["\r",`
+`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),j=function(){return aa().replace(/^ *| *$/g,"")},rt="--",Fe=dn("--",!1),Ne=/^[a-zA-Z\/0-9]/,Pe=Kn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ye=/^[^\r\n\t :,]/,ke=Kn(["\r",`
+`," "," ",":",","],!0,!1),it="null",Ue=dn("null",!1),P=function(){return null},C="true",b=dn("true",!1),y=function(){return!0},F="false",z=dn("false",!1),Z=function(){return!1},$=Oa("string"),oe='"',xe=dn('"',!1),Re=function(){return""},lt=function(te){return te},Ct=function(te){return te.join("")},Gt=/^[^"\\\0-\x1F\x7F]/,ir=Kn(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',gn=dn('\\"',!1),Pr=function(){return'"'},Ir="\\\\",Nr=dn("\\\\",!1),nn=function(){return"\\"},ai="\\/",Io=dn("\\/",!1),ts=function(){return"/"},$s="\\b",Co=dn("\\b",!1),_i=function(){return"\b"},eo="\\f",wo=dn("\\f",!1),QA=function(){return"\f"},Af="\\n",dh=dn("\\n",!1),mh=function(){return`
+`},to="\\r",jn=dn("\\r",!1),Rs=function(){return"\r"},ro="\\t",ou=dn("\\t",!1),au=function(){return" "},lu="\\u",RA=dn("\\u",!1),TA=function(te,Ee,Oe,dt){return String.fromCharCode(parseInt(`0x${te}${Ee}${Oe}${dt}`))},sa=/^[0-9a-fA-F]/,oa=Kn([["0","9"],["a","f"],["A","F"]],!1,!1),FA=Oa("blank space"),gr=/^[ \t]/,Bo=Kn([" "," "],!1,!1),Me=Oa("white space"),cu=/^[ \t\n\r]/,Cr=Kn([" "," ",`
+`,"\r"],!1,!1),pf=`\r
+`,NA=dn(`\r
+`,!1),OA=`
+`,uu=dn(`
+`,!1),fu="\r",oc=dn("\r",!1),ve=0,Nt=0,ac=[{line:1,column:1}],Ni=0,no=[],Tt=0,xn;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function aa(){return t.substring(Nt,ve)}function Hi(){return Ma(Nt,ve)}function Oi(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),hf([Oa(te)],t.substring(Nt,ve),Ee)}function Na(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),Ua(te,Ee)}function dn(te,Ee){return{type:"literal",text:te,ignoreCase:Ee}}function Kn(te,Ee,Oe){return{type:"class",parts:te,inverted:Ee,ignoreCase:Oe}}function Au(){return{type:"any"}}function yh(){return{type:"end"}}function Oa(te){return{type:"other",description:te}}function La(te){var Ee=ac[te],Oe;if(Ee)return Ee;for(Oe=te-1;!ac[Oe];)Oe--;for(Ee=ac[Oe],Ee={line:Ee.line,column:Ee.column};OeNi&&(Ni=ve,no=[]),no.push(te))}function Ua(te,Ee){return new Td(te,null,null,Ee)}function hf(te,Ee,Oe){return new Td(Td.buildMessage(te,Ee),te,Ee,Oe)}function lc(){var te;return te=LA(),te}function wn(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=la();Oe!==r;)Ee.push(Oe),Oe=la();return Ee!==r&&(Nt=te,Ee=n(Ee)),te=Ee,te}function la(){var te,Ee,Oe,dt,Et;return te=ve,Ee=Bl(),Ee!==r?(t.charCodeAt(ve)===45?(Oe=c,ve++):(Oe=r,Tt===0&&$e(f)),Oe!==r?(dt=Qn(),dt!==r?(Et=ca(),Et!==r?(Nt=te,Ee=p(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te}function LA(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=MA();Oe!==r;)Ee.push(Oe),Oe=MA();return Ee!==r&&(Nt=te,Ee=h(Ee)),te=Ee,te}function MA(){var te,Ee,Oe,dt,Et,bt,tr,fn,li;if(te=ve,Ee=Qn(),Ee===r&&(Ee=null),Ee!==r){if(Oe=ve,t.charCodeAt(ve)===35?(dt=E,ve++):(dt=r,Tt===0&&$e(w)),dt!==r){if(Et=[],bt=ve,tr=ve,Tt++,fn=st(),Tt--,fn===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(fn=t.charAt(ve),ve++):(fn=r,Tt===0&&$e(S)),fn!==r?(tr=[tr,fn],bt=tr):(ve=bt,bt=r)):(ve=bt,bt=r),bt!==r)for(;bt!==r;)Et.push(bt),bt=ve,tr=ve,Tt++,fn=st(),Tt--,fn===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(fn=t.charAt(ve),ve++):(fn=r,Tt===0&&$e(S)),fn!==r?(tr=[tr,fn],bt=tr):(ve=bt,bt=r)):(ve=bt,bt=r);else Et=r;Et!==r?(dt=[dt,Et],Oe=dt):(ve=Oe,Oe=r)}else ve=Oe,Oe=r;if(Oe===r&&(Oe=null),Oe!==r){if(dt=[],Et=Ke(),Et!==r)for(;Et!==r;)dt.push(Et),Et=Ke();else dt=r;dt!==r?(Nt=te,Ee=x(),te=Ee):(ve=te,te=r)}else ve=te,te=r}else ve=te,te=r;if(te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=Ha(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Tt===0&&$e(T)),Et!==r?(bt=Qn(),bt===r&&(bt=null),bt!==r?(tr=ca(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=rs(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Tt===0&&$e(T)),Et!==r?(bt=Qn(),bt===r&&(bt=null),bt!==r?(tr=ca(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))){if(te=ve,Ee=Bl(),Ee!==r)if(Oe=rs(),Oe!==r)if(dt=Qn(),dt!==r)if(Et=pu(),Et!==r){if(bt=[],tr=Ke(),tr!==r)for(;tr!==r;)bt.push(tr),tr=Ke();else bt=r;bt!==r?(Nt=te,Ee=N(Oe,Et),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;if(te===r)if(te=ve,Ee=Bl(),Ee!==r)if(Oe=rs(),Oe!==r){if(dt=[],Et=ve,bt=Qn(),bt===r&&(bt=null),bt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Tt===0&&$e(W)),tr!==r?(fn=Qn(),fn===r&&(fn=null),fn!==r?(li=rs(),li!==r?(Nt=Et,bt=ee(Oe,li),Et=bt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r),Et!==r)for(;Et!==r;)dt.push(Et),Et=ve,bt=Qn(),bt===r&&(bt=null),bt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Tt===0&&$e(W)),tr!==r?(fn=Qn(),fn===r&&(fn=null),fn!==r?(li=rs(),li!==r?(Nt=Et,bt=ee(Oe,li),Et=bt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r);else dt=r;dt!==r?(Et=Qn(),Et===r&&(Et=null),Et!==r?(t.charCodeAt(ve)===58?(bt=I,ve++):(bt=r,Tt===0&&$e(T)),bt!==r?(tr=Qn(),tr===r&&(tr=null),tr!==r?(fn=ca(),fn!==r?(Nt=te,Ee=ie(Oe,dt,fn),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r}return te}function ca(){var te,Ee,Oe,dt,Et,bt,tr;if(te=ve,Ee=ve,Tt++,Oe=ve,dt=st(),dt!==r?(Et=Mt(),Et!==r?(t.charCodeAt(ve)===45?(bt=c,ve++):(bt=r,Tt===0&&$e(f)),bt!==r?(tr=Qn(),tr!==r?(dt=[dt,Et,bt,tr],Oe=dt):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r),Tt--,Oe!==r?(ve=Ee,Ee=void 0):Ee=r,Ee!==r?(Oe=Ke(),Oe!==r?(dt=kn(),dt!==r?(Et=wn(),Et!==r?(bt=ua(),bt!==r?(Nt=te,Ee=ue(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=st(),Ee!==r?(Oe=kn(),Oe!==r?(dt=LA(),dt!==r?(Et=ua(),Et!==r?(Nt=te,Ee=ue(dt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))if(te=ve,Ee=cc(),Ee!==r){if(Oe=[],dt=Ke(),dt!==r)for(;dt!==r;)Oe.push(dt),dt=Ke();else Oe=r;Oe!==r?(Nt=te,Ee=le(Ee),te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function Bl(){var te,Ee,Oe;for(Tt++,te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=Ce(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),Tt--,te===r&&(Ee=r,Tt===0&&$e(me)),te}function Mt(){var te,Ee,Oe;for(te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=g(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),te}function kn(){var te;return Nt=ve,te=we(),te?te=void 0:te=r,te}function ua(){var te;return Nt=ve,te=ye(),te?te=void 0:te=r,te}function Ha(){var te;return te=vl(),te===r&&(te=uc()),te}function rs(){var te,Ee,Oe;if(te=vl(),te===r){if(te=ve,Ee=[],Oe=ja(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=ja();else Ee=r;Ee!==r&&(Nt=te,Ee=Ae()),te=Ee}return te}function cc(){var te;return te=Li(),te===r&&(te=Is(),te===r&&(te=vl(),te===r&&(te=uc()))),te}function pu(){var te;return te=Li(),te===r&&(te=vl(),te===r&&(te=ja())),te}function uc(){var te,Ee,Oe,dt,Et,bt;if(Tt++,te=ve,X.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(De)),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Te.test(t.charAt(ve))?(bt=t.charAt(ve),ve++):(bt=r,Tt===0&&$e(mt)),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Te.test(t.charAt(ve))?(bt=t.charAt(ve),ve++):(bt=r,Tt===0&&$e(mt)),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(se)),te}function ja(){var te,Ee,Oe,dt,Et;if(te=ve,t.substr(ve,2)===rt?(Ee=rt,ve+=2):(Ee=r,Tt===0&&$e(Fe)),Ee===r&&(Ee=null),Ee!==r)if(Ne.test(t.charAt(ve))?(Oe=t.charAt(ve),ve++):(Oe=r,Tt===0&&$e(Pe)),Oe!==r){for(dt=[],Ye.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Tt===0&&$e(ke));Et!==r;)dt.push(Et),Ye.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Tt===0&&$e(ke));dt!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;return te}function Li(){var te,Ee;return te=ve,t.substr(ve,4)===it?(Ee=it,ve+=4):(Ee=r,Tt===0&&$e(Ue)),Ee!==r&&(Nt=te,Ee=P()),te=Ee,te}function Is(){var te,Ee;return te=ve,t.substr(ve,4)===C?(Ee=C,ve+=4):(Ee=r,Tt===0&&$e(b)),Ee!==r&&(Nt=te,Ee=y()),te=Ee,te===r&&(te=ve,t.substr(ve,5)===F?(Ee=F,ve+=5):(Ee=r,Tt===0&&$e(z)),Ee!==r&&(Nt=te,Ee=Z()),te=Ee),te}function vl(){var te,Ee,Oe,dt;return Tt++,te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Tt===0&&$e(xe)),Ee!==r?(t.charCodeAt(ve)===34?(Oe=oe,ve++):(Oe=r,Tt===0&&$e(xe)),Oe!==r?(Nt=te,Ee=Re(),te=Ee):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Tt===0&&$e(xe)),Ee!==r?(Oe=gf(),Oe!==r?(t.charCodeAt(ve)===34?(dt=oe,ve++):(dt=r,Tt===0&&$e(xe)),dt!==r?(Nt=te,Ee=lt(Oe),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)),Tt--,te===r&&(Ee=r,Tt===0&&$e($)),te}function gf(){var te,Ee,Oe;if(te=ve,Ee=[],Oe=fc(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=fc();else Ee=r;return Ee!==r&&(Nt=te,Ee=Ct(Ee)),te=Ee,te}function fc(){var te,Ee,Oe,dt,Et,bt;return Gt.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Tt===0&&$e(ir)),te===r&&(te=ve,t.substr(ve,2)===Pt?(Ee=Pt,ve+=2):(Ee=r,Tt===0&&$e(gn)),Ee!==r&&(Nt=te,Ee=Pr()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Ir?(Ee=Ir,ve+=2):(Ee=r,Tt===0&&$e(Nr)),Ee!==r&&(Nt=te,Ee=nn()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ai?(Ee=ai,ve+=2):(Ee=r,Tt===0&&$e(Io)),Ee!==r&&(Nt=te,Ee=ts()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===$s?(Ee=$s,ve+=2):(Ee=r,Tt===0&&$e(Co)),Ee!==r&&(Nt=te,Ee=_i()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===eo?(Ee=eo,ve+=2):(Ee=r,Tt===0&&$e(wo)),Ee!==r&&(Nt=te,Ee=QA()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Af?(Ee=Af,ve+=2):(Ee=r,Tt===0&&$e(dh)),Ee!==r&&(Nt=te,Ee=mh()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===to?(Ee=to,ve+=2):(Ee=r,Tt===0&&$e(jn)),Ee!==r&&(Nt=te,Ee=Rs()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ro?(Ee=ro,ve+=2):(Ee=r,Tt===0&&$e(ou)),Ee!==r&&(Nt=te,Ee=au()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===lu?(Ee=lu,ve+=2):(Ee=r,Tt===0&&$e(RA)),Ee!==r?(Oe=wi(),Oe!==r?(dt=wi(),dt!==r?(Et=wi(),Et!==r?(bt=wi(),bt!==r?(Nt=te,Ee=TA(Oe,dt,Et,bt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)))))))))),te}function wi(){var te;return sa.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Tt===0&&$e(oa)),te}function Qn(){var te,Ee;if(Tt++,te=[],gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Bo)),Ee!==r)for(;Ee!==r;)te.push(Ee),gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Bo));else te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(FA)),te}function Ac(){var te,Ee;if(Tt++,te=[],cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Cr)),Ee!==r)for(;Ee!==r;)te.push(Ee),cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Cr));else te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(Me)),te}function Ke(){var te,Ee,Oe,dt,Et,bt;if(te=ve,Ee=st(),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(bt=st(),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(bt=st(),bt!==r?(Et=[Et,bt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function st(){var te;return t.substr(ve,2)===pf?(te=pf,ve+=2):(te=r,Tt===0&&$e(NA)),te===r&&(t.charCodeAt(ve)===10?(te=OA,ve++):(te=r,Tt===0&&$e(uu)),te===r&&(t.charCodeAt(ve)===13?(te=fu,ve++):(te=r,Tt===0&&$e(oc)))),te}let St=2,lr=0;if(xn=a(),xn!==r&&ve===t.length)return xn;throw xn!==r&&ve"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>Are(t[e])):!1}function t_(t,e,r){if(t===null)return`null
`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()}
-`;if(typeof t=="string")return`${Wre(t)}
+`;if(typeof t=="string")return`${ure(t)}
`;if(Array.isArray(t)){if(t.length===0)return`[]
`;let s=" ".repeat(e);return`
-${t.map(n=>`${s}- ${oU(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[s,a]=t instanceof Rx?[t.data,!1]:[t,!0],n=" ".repeat(e),c=Object.keys(s);a&&c.sort((p,h)=>{let E=Gre.indexOf(p),C=Gre.indexOf(h);return E===-1&&C===-1?ph?1:0:E!==-1&&C===-1?-1:E===-1&&C!==-1?1:E-C});let f=c.filter(p=>!Vre(s[p])).map((p,h)=>{let E=s[p],C=Wre(p),S=oU(E,e+1,!0),P=h>0||r?n:"",I=C.length>1024?`? ${C}
-${P}:`:`${C}:`,R=S.startsWith(`
-`)?S:` ${S}`;return`${P}${I}${R}`}).join(e===0?`
+${t.map(n=>`${s}- ${t_(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[s,a]=t instanceof wx?[t.data,!1]:[t,!0],n=" ".repeat(e),c=Object.keys(s);a&&c.sort((p,h)=>{let E=cre.indexOf(p),w=cre.indexOf(h);return E===-1&&w===-1?ph?1:0:E!==-1&&w===-1?-1:E===-1&&w!==-1?1:E-w});let f=c.filter(p=>!Are(s[p])).map((p,h)=>{let E=s[p],w=ure(p),S=t_(E,e+1,!0),x=h>0||r?n:"",I=w.length>1024?`? ${w}
+${x}:`:`${w}:`,T=S.startsWith(`
+`)?S:` ${S}`;return`${x}${I}${T}`}).join(e===0?`
`:"")||`
`;return r?`
-${f}`:`${f}`}throw new Error(`Unsupported value type (${t})`)}function il(t){try{let e=oU(t,0,!1);return e!==`
-`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function Tze(t){return t.endsWith(`
+${f}`:`${f}`}throw new Error(`Unsupported value type (${t})`)}function nl(t){try{let e=t_(t,0,!1);return e!==`
+`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function fWe(t){return t.endsWith(`
`)||(t+=`
-`),(0,Yre.parse)(t)}function Fze(t){if(Rze.test(t))return Tze(t);let e=(0,Fx.safeLoad)(t,{schema:Fx.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function cs(t){return Fze(t)}var Fx,Yre,Qze,Gre,Rx,Rze,Kre=Ct(()=>{Fx=et(Hre()),Yre=et(qre()),Qze=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,Gre=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],Rx=class{constructor(e){this.data=e}};il.PreserveOrdering=Rx;Rze=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var K2={};Vt(K2,{parseResolution:()=>Cx,parseShell:()=>yx,parseSyml:()=>cs,stringifyArgument:()=>Y_,stringifyArgumentSegment:()=>V_,stringifyArithmeticExpression:()=>Ix,stringifyCommand:()=>W_,stringifyCommandChain:()=>uE,stringifyCommandChainThen:()=>G_,stringifyCommandLine:()=>Ex,stringifyCommandLineThen:()=>q_,stringifyEnvSegment:()=>mx,stringifyRedirectArgument:()=>H2,stringifyResolution:()=>wx,stringifyShell:()=>cE,stringifyShellLine:()=>cE,stringifySyml:()=>il,stringifyValueArgument:()=>Bd});var Bc=Ct(()=>{Vee();Zee();Kre()});var zre=L((N5t,aU)=>{"use strict";var Nze=t=>{let e=!1,r=!1,s=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=Nze(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};aU.exports=Jre;aU.exports.default=Jre});var Zre=L((O5t,Oze)=>{Oze.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var Rd=L(_l=>{"use strict";var $re=Zre(),Ps=process.env;Object.defineProperty(_l,"_vendors",{value:$re.map(function(t){return t.constant})});_l.name=null;_l.isPR=null;$re.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(s){return Xre(s)});if(_l[t.constant]=r,!!r)switch(_l.name=t.name,typeof t.pr){case"string":_l.isPR=!!Ps[t.pr];break;case"object":"env"in t.pr?_l.isPR=t.pr.env in Ps&&Ps[t.pr.env]!==t.pr.ne:"any"in t.pr?_l.isPR=t.pr.any.some(function(s){return!!Ps[s]}):_l.isPR=Xre(t.pr);break;default:_l.isPR=null}});_l.isCI=!!(Ps.CI!=="false"&&(Ps.BUILD_ID||Ps.BUILD_NUMBER||Ps.CI||Ps.CI_APP_ID||Ps.CI_BUILD_ID||Ps.CI_BUILD_NUMBER||Ps.CI_NAME||Ps.CONTINUOUS_INTEGRATION||Ps.RUN_ID||_l.name));function Xre(t){return typeof t=="string"?!!Ps[t]:"env"in t?Ps[t.env]&&Ps[t.env].includes(t.includes):"any"in t?t.any.some(function(e){return!!Ps[e]}):Object.keys(t).every(function(e){return Ps[e]===t[e]})}});var ei,En,Fd,lU,Nx,ene,cU,uU,Ox=Ct(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(ei||(ei={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(En||(En={}));Fd=-1,lU=/^(-h|--help)(?:=([0-9]+))?$/,Nx=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,ene=/^-[a-zA-Z]{2,}$/,cU=/^([^=]+)=([\s\S]*)$/,uU=process.env.DEBUG_CLI==="1"});var nt,yE,Lx,fU,Mx=Ct(()=>{Ox();nt=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},yE=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(s=>s.reason!==null&&s.reason===r[0].reason)){let[{reason:s}]=this.candidates;this.message=`${s}
+`),(0,fre.parse)(t)}function pWe(t){if(AWe.test(t))return fWe(t);let e=(0,Bx.safeLoad)(t,{schema:Bx.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function as(t){return pWe(t)}var Bx,fre,uWe,cre,wx,AWe,pre=Ze(()=>{Bx=ut(ore()),fre=ut(lre()),uWe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,cre=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],wx=class{constructor(e){this.data=e}};nl.PreserveOrdering=wx;AWe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var Y2={};Vt(Y2,{parseResolution:()=>ux,parseShell:()=>ax,parseSyml:()=>as,stringifyArgument:()=>HU,stringifyArgumentSegment:()=>jU,stringifyArithmeticExpression:()=>cx,stringifyCommand:()=>_U,stringifyCommandChain:()=>fE,stringifyCommandChainThen:()=>UU,stringifyCommandLine:()=>lx,stringifyCommandLineThen:()=>MU,stringifyEnvSegment:()=>ox,stringifyRedirectArgument:()=>U2,stringifyResolution:()=>fx,stringifyShell:()=>uE,stringifyShellLine:()=>uE,stringifySyml:()=>nl,stringifyValueArgument:()=>vd});var wc=Ze(()=>{Aee();dee();pre()});var gre=_((hQt,r_)=>{"use strict";var hWe=t=>{let e=!1,r=!1,s=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=hWe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};r_.exports=hre;r_.exports.default=hre});var dre=_((gQt,gWe)=>{gWe.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var Fd=_(Ml=>{"use strict";var yre=dre(),Ds=process.env;Object.defineProperty(Ml,"_vendors",{value:yre.map(function(t){return t.constant})});Ml.name=null;Ml.isPR=null;yre.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(s){return mre(s)});if(Ml[t.constant]=r,!!r)switch(Ml.name=t.name,typeof t.pr){case"string":Ml.isPR=!!Ds[t.pr];break;case"object":"env"in t.pr?Ml.isPR=t.pr.env in Ds&&Ds[t.pr.env]!==t.pr.ne:"any"in t.pr?Ml.isPR=t.pr.any.some(function(s){return!!Ds[s]}):Ml.isPR=mre(t.pr);break;default:Ml.isPR=null}});Ml.isCI=!!(Ds.CI!=="false"&&(Ds.BUILD_ID||Ds.BUILD_NUMBER||Ds.CI||Ds.CI_APP_ID||Ds.CI_BUILD_ID||Ds.CI_BUILD_NUMBER||Ds.CI_NAME||Ds.CONTINUOUS_INTEGRATION||Ds.RUN_ID||Ml.name));function mre(t){return typeof t=="string"?!!Ds[t]:"env"in t?Ds[t.env]&&Ds[t.env].includes(t.includes):"any"in t?t.any.some(function(e){return!!Ds[e]}):Object.keys(t).every(function(e){return Ds[e]===t[e]})}});var ei,En,Nd,n_,vx,Ere,i_,s_,Sx=Ze(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(ei||(ei={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(En||(En={}));Nd=-1,n_=/^(-h|--help)(?:=([0-9]+))?$/,vx=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,Ere=/^-[a-zA-Z]{2,}$/,i_=/^([^=]+)=([\s\S]*)$/,s_=process.env.DEBUG_CLI==="1"});var nt,EE,Dx,o_,bx=Ze(()=>{Sx();nt=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},EE=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(s=>s.reason!==null&&s.reason===r[0].reason)){let[{reason:s}]=this.candidates;this.message=`${s}
${this.candidates.map(({usage:a})=>`$ ${a}`).join(`
`)}`}else if(this.candidates.length===1){let[{usage:s}]=this.candidates;this.message=`Command not found; did you mean:
$ ${s}
-${fU(e)}`}else this.message=`Command not found; did you mean one of:
+${o_(e)}`}else this.message=`Command not found; did you mean one of:
${this.candidates.map(({usage:s},a)=>`${`${a}.`.padStart(4)} ${s}`).join(`
`)}
-${fU(e)}`}},Lx=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives:
+${o_(e)}`}},Dx=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives:
${this.usages.map((s,a)=>`${`${a}.`.padStart(4)} ${s}`).join(`
`)}
-${fU(e)}`}},fU=t=>`While running ${t.filter(e=>e!==ei.EndOfInput&&e!==ei.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function Lze(t){let e=t.split(`
+${o_(e)}`}},o_=t=>`While running ${t.filter(e=>e!==ei.EndOfInput&&e!==ei.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function dWe(t){let e=t.split(`
`),r=e.filter(a=>a.match(/\S/)),s=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(s).trimRight()).join(`
-`)}function qo(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,`
-`),t=Lze(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2
+`)}function Ho(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,`
+`),t=dWe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2
`),t=t.replace(/\n(\n)?\n*/g,(s,a)=>a||" "),r&&(t=t.split(/\n/).map(s=>{let a=s.match(/^\s*[*-][\t ]+(.*)/);if(!a)return s.match(/(.{1,80})(?: |$)/g).join(`
`);let n=s.length-s.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((c,f)=>" ".repeat(n)+(f===0?"- ":" ")+c).join(`
`)}).join(`
`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(s,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(s,a,n)=>e.bold(a+n+a)),t?`${t}
-`:""}var AU,tne,rne,pU=Ct(()=>{AU=Array(80).fill("\u2501");for(let t=0;t<=24;++t)AU[AU.length-t]=`\x1B[38;5;${232+t}m\u2501`;tne={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<75?` ${AU.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},rne={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Ea(t){return{...t,[J2]:!0}}function Gf(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function _x(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,s,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=s!=="."||!e?`${s.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function z2(t,e){return e.length===1?new nt(`${t}${_x(e[0],{mergeName:!0})}`):new nt(`${t}:
+`:""}var a_,Ire,Cre,l_=Ze(()=>{a_=Array(80).fill("\u2501");for(let t=0;t<=24;++t)a_[a_.length-t]=`\x1B[38;5;${232+t}m\u2501`;Ire={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<75?` ${a_.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},Cre={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function ma(t){return{...t,[V2]:!0}}function Gf(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function Px(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,s,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=s!=="."||!e?`${s.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function J2(t,e){return e.length===1?new nt(`${t}${Px(e[0],{mergeName:!0})}`):new nt(`${t}:
${e.map(r=>`
-- ${_x(r)}`).join("")}`)}function Nd(t,e,r){if(typeof r>"u")return e;let s=[],a=[],n=f=>{let p=e;return e=f,n.bind(null,p)};if(!r(e,{errors:s,coercions:a,coercion:n}))throw z2(`Invalid value for ${t}`,s);for(let[,f]of a)f();return e}var J2,Bp=Ct(()=>{Mx();J2=Symbol("clipanion/isOption")});var Ia={};Vt(Ia,{KeyRelationship:()=>Wf,TypeAssertionError:()=>l0,applyCascade:()=>$2,as:()=>rZe,assert:()=>$ze,assertWithErrors:()=>eZe,cascade:()=>qx,fn:()=>nZe,hasAtLeastOneKey:()=>IU,hasExactLength:()=>ane,hasForbiddenKeys:()=>wZe,hasKeyRelationship:()=>tB,hasMaxLength:()=>sZe,hasMinLength:()=>iZe,hasMutuallyExclusiveKeys:()=>BZe,hasRequiredKeys:()=>CZe,hasUniqueItems:()=>oZe,isArray:()=>Ux,isAtLeast:()=>yU,isAtMost:()=>cZe,isBase64:()=>mZe,isBoolean:()=>Wze,isDate:()=>Vze,isDict:()=>zze,isEnum:()=>po,isHexColor:()=>dZe,isISO8601:()=>gZe,isInExclusiveRange:()=>fZe,isInInclusiveRange:()=>uZe,isInstanceOf:()=>Xze,isInteger:()=>EU,isJSON:()=>yZe,isLiteral:()=>ine,isLowerCase:()=>AZe,isMap:()=>Jze,isNegative:()=>aZe,isNullable:()=>IZe,isNumber:()=>dU,isObject:()=>sne,isOneOf:()=>mU,isOptional:()=>EZe,isPartial:()=>Zze,isPayload:()=>Yze,isPositive:()=>lZe,isRecord:()=>jx,isSet:()=>Kze,isString:()=>IE,isTuple:()=>Hx,isUUID4:()=>hZe,isUnknown:()=>gU,isUpperCase:()=>pZe,makeTrait:()=>one,makeValidator:()=>Wr,matchesRegExp:()=>X2,softAssert:()=>tZe});function ti(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function EE(t,e){if(t.length===0)return"nothing";if(t.length===1)return ti(t[0]);let r=t.slice(0,-1),s=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>ti(n)).join(", ")}${a}${ti(s)}`}function a0(t,e){var r,s,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:Mze.test(e)?`${(s=t?.p)!==null&&s!==void 0?s:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function hU(t,e,r){return t===1?e:r}function mr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function qze(t,e){return r=>{t[e]=r}}function Yf(t,e){return r=>{let s=t[e];return t[e]=r,Yf(t,e).bind(null,s)}}function Z2(t,e,r){let s=()=>(t(r()),a),a=()=>(t(e),s);return s}function gU(){return Wr({test:(t,e)=>!0})}function ine(t){return Wr({test:(e,r)=>e!==t?mr(r,`Expected ${ti(t)} (got ${ti(e)})`):!0})}function IE(){return Wr({test:(t,e)=>typeof t!="string"?mr(e,`Expected a string (got ${ti(t)})`):!0})}function po(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),s=new Set(e);return s.size===1?ine([...s][0]):Wr({test:(a,n)=>s.has(a)?!0:r?mr(n,`Expected one of ${EE(e,"or")} (got ${ti(a)})`):mr(n,`Expected a valid enumeration value (got ${ti(a)})`)})}function Wze(){return Wr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s=Gze.get(t);if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a boolean (got ${ti(t)})`)}return!0}})}function dU(){return Wr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)s=a;else return mr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a number (got ${ti(t)})`)}return!0}})}function Yze(t){return Wr({test:(e,r)=>{var s;if(typeof r?.coercions>"u")return mr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return mr(r,"Unbound coercion result");if(typeof e!="string")return mr(r,`Expected a string (got ${ti(e)})`);let a;try{a=JSON.parse(e)}catch{return mr(r,`Expected a JSON string (got ${ti(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Yf(n,"value")}))?(r.coercions.push([(s=r.p)!==null&&s!==void 0?s:".",r.coercion.bind(null,n.value)]),!0):!1}})}function Vze(){return Wr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"&&nne.test(t))s=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))s=new Date(a*1e3);else return mr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a date (got ${ti(t)})`)}return!0}})}function Ux(t,{delimiter:e}={}){return Wr({test:(r,s)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof s?.coercions<"u"){if(typeof s?.coercion>"u")return mr(s,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return mr(s,`Expected an array (got ${ti(r)})`);let c=!0;for(let f=0,p=r.length;f{var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,C)=>E!==f[C])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",Z2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Yf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",Z2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function Jze(t,e){let r=Ux(Hx([t,e])),s=jx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let C=()=>E.some((S,P)=>S[0]!==h[P][0]||S[1]!==h[P][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",Z2(n.coercion,a,C)]),!0}else{let h=!0;for(let[E,C]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(C,Object.assign(Object.assign({},n),{p:a0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",Z2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Yf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",Z2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function Hx(t,{delimiter:e}={}){let r=ane(t.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f
{var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?mr(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p{if(typeof a!="object"||a===null)return mr(n,`Expected an object (got ${ti(a)})`);let c=new Set([...r,...Object.keys(a)]),f={},p=!0;for(let h of c){if(h==="constructor"||h==="__proto__")p=mr(Object.assign(Object.assign({},n),{p:a0(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,C=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(C,Object.assign(Object.assign({},n),{p:a0(n,h),coercion:Yf(a,h)}))&&p:e===null?p=mr(Object.assign(Object.assign({},n),{p:a0(n,h)}),`Extraneous property (got ${ti(C)})`):Object.defineProperty(f,h,{enumerable:!0,get:()=>C,set:qze(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(f,n)&&p),p}});return Object.assign(s,{properties:t})}function Zze(t){return sne(t,{extra:jx(gU())})}function one(t){return()=>t}function Wr({test:t}){return one(t)()}function $ze(t,e){if(!e(t))throw new l0}function eZe(t,e){let r=[];if(!e(t,{errors:r}))throw new l0({errors:r})}function tZe(t,e){}function rZe(t,e,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new l0({errors:n});return{value:void 0,errors:n??!0}}let c={value:t},f=Yf(c,"value"),p=[];if(!e(t,{errors:n,coercion:f,coercions:p})){if(a)throw new l0({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?c.value:{value:c.value,errors:void 0}}function nZe(t,e){let r=Hx(t);return(...s)=>{if(!r(s))throw new l0;return e(...s)}}function iZe(t){return Wr({test:(e,r)=>e.length>=t?!0:mr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function sZe(t){return Wr({test:(e,r)=>e.length<=t?!0:mr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function ane(t){return Wr({test:(e,r)=>e.length!==t?mr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function oZe({map:t}={}){return Wr({test:(e,r)=>{let s=new Set,a=new Set;for(let n=0,c=e.length;nt<=0?!0:mr(e,`Expected to be negative (got ${t})`)})}function lZe(){return Wr({test:(t,e)=>t>=0?!0:mr(e,`Expected to be positive (got ${t})`)})}function yU(t){return Wr({test:(e,r)=>e>=t?!0:mr(r,`Expected to be at least ${t} (got ${e})`)})}function cZe(t){return Wr({test:(e,r)=>e<=t?!0:mr(r,`Expected to be at most ${t} (got ${e})`)})}function uZe(t,e){return Wr({test:(r,s)=>r>=t&&r<=e?!0:mr(s,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function fZe(t,e){return Wr({test:(r,s)=>r>=t&&re!==Math.round(e)?mr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?mr(r,`Expected to be a safe integer (got ${e})`):!0})}function X2(t){return Wr({test:(e,r)=>t.test(e)?!0:mr(r,`Expected to match the pattern ${t.toString()} (got ${ti(e)})`)})}function AZe(){return Wr({test:(t,e)=>t!==t.toLowerCase()?mr(e,`Expected to be all-lowercase (got ${t})`):!0})}function pZe(){return Wr({test:(t,e)=>t!==t.toUpperCase()?mr(e,`Expected to be all-uppercase (got ${t})`):!0})}function hZe(){return Wr({test:(t,e)=>jze.test(t)?!0:mr(e,`Expected to be a valid UUID v4 (got ${ti(t)})`)})}function gZe(){return Wr({test:(t,e)=>nne.test(t)?!0:mr(e,`Expected to be a valid ISO 8601 date string (got ${ti(t)})`)})}function dZe({alpha:t=!1}){return Wr({test:(e,r)=>(t?_ze.test(e):Uze.test(e))?!0:mr(r,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)})}function mZe(){return Wr({test:(t,e)=>Hze.test(t)?!0:mr(e,`Expected to be a valid base 64 string (got ${ti(t)})`)})}function yZe(t=gU()){return Wr({test:(e,r)=>{let s;try{s=JSON.parse(e)}catch{return mr(r,`Expected to be a valid JSON string (got ${ti(e)})`)}return t(s,r)}})}function qx(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Wr({test:(s,a)=>{var n,c;let f={value:s},p=typeof a?.coercions<"u"?Yf(f,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(s,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,C]of h)E.push(C());try{if(typeof a?.coercions<"u"){if(f.value!==s){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,f.value)])}(c=a?.coercions)===null||c===void 0||c.push(...h)}return r.every(C=>C(f.value,a))}finally{for(let C of E)C()}}})}function $2(t,...e){let r=Array.isArray(e[0])?e[0]:e;return qx(t,r)}function EZe(t){return Wr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function IZe(t){return Wr({test:(e,r)=>e===null?!0:t(e,r)})}function CZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)||p.push(h);return p.length>0?mr(c,`Missing required ${hU(p.length,"property","properties")} ${EE(p,"and")}`):!0}})}function IU(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>Object.keys(n).some(h=>a(s,h,n))?!0:mr(c,`Missing at least one property from ${EE(Array.from(s),"or")}`)})}function wZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>0?mr(c,`Forbidden ${hU(p.length,"property","properties")} ${EE(p,"and")}`):!0}})}function BZe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>1?mr(c,`Mutually exclusive properties ${EE(p,"and")}`):!0}})}function tB(t,e,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==void 0?a:[]),f=eB[(n=s?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=vZe[e],E=e===Wf.Forbids?"or":"and";return Wr({test:(C,S)=>{let P=new Set(Object.keys(C));if(!f(P,t,C)||c.has(C[t]))return!0;let I=[];for(let R of p)(f(P,R,C)&&!c.has(C[R]))!==h.expect&&I.push(R);return I.length>=1?mr(S,`Property "${t}" ${h.message} ${hU(I.length,"property","properties")} ${EE(I,E)}`):!0}})}var Mze,_ze,Uze,Hze,jze,nne,Gze,Xze,mU,l0,eB,Wf,vZe,Ul=Ct(()=>{Mze=/^[a-zA-Z_][a-zA-Z0-9_]*$/;_ze=/^#[0-9a-f]{6}$/i,Uze=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,Hze=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,jze=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,nne=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;Gze=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);Xze=t=>Wr({test:(e,r)=>e instanceof t?!0:mr(r,`Expected an instance of ${t.name} (got ${ti(e)})`)}),mU=(t,{exclusive:e=!1}={})=>Wr({test:(r,s)=>{var a,n,c;let f=[],p=typeof s?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?mr(s,`Expected to match exactly a single predicate (matched ${f.join(", ")})`):(c=s?.errors)===null||c===void 0||c.push(...p),!1}});l0=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=`
+- ${Px(r)}`).join("")}`)}function Od(t,e,r){if(typeof r>"u")return e;let s=[],a=[],n=f=>{let p=e;return e=f,n.bind(null,p)};if(!r(e,{errors:s,coercions:a,coercion:n}))throw J2(`Invalid value for ${t}`,s);for(let[,f]of a)f();return e}var V2,Cp=Ze(()=>{bx();V2=Symbol("clipanion/isOption")});var ya={};Vt(ya,{KeyRelationship:()=>qf,TypeAssertionError:()=>o0,applyCascade:()=>Z2,as:()=>NWe,assert:()=>RWe,assertWithErrors:()=>TWe,cascade:()=>Rx,fn:()=>OWe,hasAtLeastOneKey:()=>g_,hasExactLength:()=>Dre,hasForbiddenKeys:()=>tYe,hasKeyRelationship:()=>$2,hasMaxLength:()=>MWe,hasMinLength:()=>LWe,hasMutuallyExclusiveKeys:()=>rYe,hasRequiredKeys:()=>eYe,hasUniqueItems:()=>UWe,isArray:()=>xx,isAtLeast:()=>p_,isAtMost:()=>jWe,isBase64:()=>zWe,isBoolean:()=>vWe,isDate:()=>DWe,isDict:()=>xWe,isEnum:()=>fo,isHexColor:()=>KWe,isISO8601:()=>JWe,isInExclusiveRange:()=>qWe,isInInclusiveRange:()=>GWe,isInstanceOf:()=>QWe,isInteger:()=>h_,isJSON:()=>ZWe,isLiteral:()=>Bre,isLowerCase:()=>WWe,isMap:()=>PWe,isNegative:()=>_We,isNullable:()=>$We,isNumber:()=>f_,isObject:()=>vre,isOneOf:()=>A_,isOptional:()=>XWe,isPartial:()=>kWe,isPayload:()=>SWe,isPositive:()=>HWe,isRecord:()=>Qx,isSet:()=>bWe,isString:()=>CE,isTuple:()=>kx,isUUID4:()=>VWe,isUnknown:()=>u_,isUpperCase:()=>YWe,makeTrait:()=>Sre,makeValidator:()=>Wr,matchesRegExp:()=>z2,softAssert:()=>FWe});function ti(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function IE(t,e){if(t.length===0)return"nothing";if(t.length===1)return ti(t[0]);let r=t.slice(0,-1),s=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>ti(n)).join(", ")}${a}${ti(s)}`}function s0(t,e){var r,s,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:mWe.test(e)?`${(s=t?.p)!==null&&s!==void 0?s:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function c_(t,e,r){return t===1?e:r}function mr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function wWe(t,e){return r=>{t[e]=r}}function Wf(t,e){return r=>{let s=t[e];return t[e]=r,Wf(t,e).bind(null,s)}}function K2(t,e,r){let s=()=>(t(r()),a),a=()=>(t(e),s);return s}function u_(){return Wr({test:(t,e)=>!0})}function Bre(t){return Wr({test:(e,r)=>e!==t?mr(r,`Expected ${ti(t)} (got ${ti(e)})`):!0})}function CE(){return Wr({test:(t,e)=>typeof t!="string"?mr(e,`Expected a string (got ${ti(t)})`):!0})}function fo(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),s=new Set(e);return s.size===1?Bre([...s][0]):Wr({test:(a,n)=>s.has(a)?!0:r?mr(n,`Expected one of ${IE(e,"or")} (got ${ti(a)})`):mr(n,`Expected a valid enumeration value (got ${ti(a)})`)})}function vWe(){return Wr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s=BWe.get(t);if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a boolean (got ${ti(t)})`)}return!0}})}function f_(){return Wr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)s=a;else return mr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a number (got ${ti(t)})`)}return!0}})}function SWe(t){return Wr({test:(e,r)=>{var s;if(typeof r?.coercions>"u")return mr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return mr(r,"Unbound coercion result");if(typeof e!="string")return mr(r,`Expected a string (got ${ti(e)})`);let a;try{a=JSON.parse(e)}catch{return mr(r,`Expected a JSON string (got ${ti(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Wf(n,"value")}))?(r.coercions.push([(s=r.p)!==null&&s!==void 0?s:".",r.coercion.bind(null,n.value)]),!0):!1}})}function DWe(){return Wr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"&&wre.test(t))s=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))s=new Date(a*1e3);else return mr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a date (got ${ti(t)})`)}return!0}})}function xx(t,{delimiter:e}={}){return Wr({test:(r,s)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof s?.coercions<"u"){if(typeof s?.coercion>"u")return mr(s,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return mr(s,`Expected an array (got ${ti(r)})`);let c=!0;for(let f=0,p=r.length;f{var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,w)=>E!==f[w])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",K2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Wf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",K2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function PWe(t,e){let r=xx(kx([t,e])),s=Qx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let w=()=>E.some((S,x)=>S[0]!==h[x][0]||S[1]!==h[x][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",K2(n.coercion,a,w)]),!0}else{let h=!0;for(let[E,w]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(w,Object.assign(Object.assign({},n),{p:s0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",K2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Wf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",K2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function kx(t,{delimiter:e}={}){let r=Dre(t.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f
{var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?mr(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p{if(typeof a!="object"||a===null)return mr(n,`Expected an object (got ${ti(a)})`);let c=new Set([...r,...Object.keys(a)]),f={},p=!0;for(let h of c){if(h==="constructor"||h==="__proto__")p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,w=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(w,Object.assign(Object.assign({},n),{p:s0(n,h),coercion:Wf(a,h)}))&&p:e===null?p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),`Extraneous property (got ${ti(w)})`):Object.defineProperty(f,h,{enumerable:!0,get:()=>w,set:wWe(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(f,n)&&p),p}});return Object.assign(s,{properties:t})}function kWe(t){return vre(t,{extra:Qx(u_())})}function Sre(t){return()=>t}function Wr({test:t}){return Sre(t)()}function RWe(t,e){if(!e(t))throw new o0}function TWe(t,e){let r=[];if(!e(t,{errors:r}))throw new o0({errors:r})}function FWe(t,e){}function NWe(t,e,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}let c={value:t},f=Wf(c,"value"),p=[];if(!e(t,{errors:n,coercion:f,coercions:p})){if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?c.value:{value:c.value,errors:void 0}}function OWe(t,e){let r=kx(t);return(...s)=>{if(!r(s))throw new o0;return e(...s)}}function LWe(t){return Wr({test:(e,r)=>e.length>=t?!0:mr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function MWe(t){return Wr({test:(e,r)=>e.length<=t?!0:mr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function Dre(t){return Wr({test:(e,r)=>e.length!==t?mr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function UWe({map:t}={}){return Wr({test:(e,r)=>{let s=new Set,a=new Set;for(let n=0,c=e.length;nt<=0?!0:mr(e,`Expected to be negative (got ${t})`)})}function HWe(){return Wr({test:(t,e)=>t>=0?!0:mr(e,`Expected to be positive (got ${t})`)})}function p_(t){return Wr({test:(e,r)=>e>=t?!0:mr(r,`Expected to be at least ${t} (got ${e})`)})}function jWe(t){return Wr({test:(e,r)=>e<=t?!0:mr(r,`Expected to be at most ${t} (got ${e})`)})}function GWe(t,e){return Wr({test:(r,s)=>r>=t&&r<=e?!0:mr(s,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function qWe(t,e){return Wr({test:(r,s)=>r>=t&&re!==Math.round(e)?mr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?mr(r,`Expected to be a safe integer (got ${e})`):!0})}function z2(t){return Wr({test:(e,r)=>t.test(e)?!0:mr(r,`Expected to match the pattern ${t.toString()} (got ${ti(e)})`)})}function WWe(){return Wr({test:(t,e)=>t!==t.toLowerCase()?mr(e,`Expected to be all-lowercase (got ${t})`):!0})}function YWe(){return Wr({test:(t,e)=>t!==t.toUpperCase()?mr(e,`Expected to be all-uppercase (got ${t})`):!0})}function VWe(){return Wr({test:(t,e)=>CWe.test(t)?!0:mr(e,`Expected to be a valid UUID v4 (got ${ti(t)})`)})}function JWe(){return Wr({test:(t,e)=>wre.test(t)?!0:mr(e,`Expected to be a valid ISO 8601 date string (got ${ti(t)})`)})}function KWe({alpha:t=!1}){return Wr({test:(e,r)=>(t?yWe.test(e):EWe.test(e))?!0:mr(r,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)})}function zWe(){return Wr({test:(t,e)=>IWe.test(t)?!0:mr(e,`Expected to be a valid base 64 string (got ${ti(t)})`)})}function ZWe(t=u_()){return Wr({test:(e,r)=>{let s;try{s=JSON.parse(e)}catch{return mr(r,`Expected to be a valid JSON string (got ${ti(e)})`)}return t(s,r)}})}function Rx(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Wr({test:(s,a)=>{var n,c;let f={value:s},p=typeof a?.coercions<"u"?Wf(f,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(s,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,w]of h)E.push(w());try{if(typeof a?.coercions<"u"){if(f.value!==s){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,f.value)])}(c=a?.coercions)===null||c===void 0||c.push(...h)}return r.every(w=>w(f.value,a))}finally{for(let w of E)w()}}})}function Z2(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Rx(t,r)}function XWe(t){return Wr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function $We(t){return Wr({test:(e,r)=>e===null?!0:t(e,r)})}function eYe(t,e){var r;let s=new Set(t),a=X2[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)||p.push(h);return p.length>0?mr(c,`Missing required ${c_(p.length,"property","properties")} ${IE(p,"and")}`):!0}})}function g_(t,e){var r;let s=new Set(t),a=X2[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>Object.keys(n).some(h=>a(s,h,n))?!0:mr(c,`Missing at least one property from ${IE(Array.from(s),"or")}`)})}function tYe(t,e){var r;let s=new Set(t),a=X2[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>0?mr(c,`Forbidden ${c_(p.length,"property","properties")} ${IE(p,"and")}`):!0}})}function rYe(t,e){var r;let s=new Set(t),a=X2[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>1?mr(c,`Mutually exclusive properties ${IE(p,"and")}`):!0}})}function $2(t,e,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==void 0?a:[]),f=X2[(n=s?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=nYe[e],E=e===qf.Forbids?"or":"and";return Wr({test:(w,S)=>{let x=new Set(Object.keys(w));if(!f(x,t,w)||c.has(w[t]))return!0;let I=[];for(let T of p)(f(x,T,w)&&!c.has(w[T]))!==h.expect&&I.push(T);return I.length>=1?mr(S,`Property "${t}" ${h.message} ${c_(I.length,"property","properties")} ${IE(I,E)}`):!0}})}var mWe,yWe,EWe,IWe,CWe,wre,BWe,QWe,A_,o0,X2,qf,nYe,Ul=Ze(()=>{mWe=/^[a-zA-Z_][a-zA-Z0-9_]*$/;yWe=/^#[0-9a-f]{6}$/i,EWe=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,IWe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,CWe=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,wre=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;BWe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);QWe=t=>Wr({test:(e,r)=>e instanceof t?!0:mr(r,`Expected an instance of ${t.name} (got ${ti(e)})`)}),A_=(t,{exclusive:e=!1}={})=>Wr({test:(r,s)=>{var a,n,c;let f=[],p=typeof s?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?mr(s,`Expected to match exactly a single predicate (matched ${f.join(", ")})`):(c=s?.errors)===null||c===void 0||c.push(...p),!1}});o0=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=`
`;for(let s of e)r+=`
-- ${s}`}super(r)}};eB={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Wf||(Wf={}));vZe={[Wf.Forbids]:{expect:!1,message:"forbids using"},[Wf.Requires]:{expect:!0,message:"requires using"}}});var ot,c0=Ct(()=>{Bp();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:c}=await Promise.resolve().then(()=>(Ul(),Ia)),f=c(a(n()),r),p=[],h=[];if(!f(this,{errors:p,coercions:h}))throw z2("Invalid option schema",p);for(let[,C]of h)C()}else if(r!=null)throw new Error("Invalid command schema");let s=await this.execute();return typeof s<"u"?s:0}};ot.isOption=J2;ot.Default=[]});function sl(t){uU&&console.log(t)}function cne(){let t={nodes:[]};for(let e=0;e{if(e.has(s))return;e.add(s);let a=t.nodes[s];for(let c of Object.values(a.statics))for(let{to:f}of c)r(f);for(let[,{to:c}]of a.dynamics)r(c);for(let{to:c}of a.shortcuts)r(c);let n=new Set(a.shortcuts.map(({to:c})=>c));for(;a.shortcuts.length>0;){let{to:c}=a.shortcuts.shift(),f=t.nodes[c];for(let[p,h]of Object.entries(f.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let C of h)E.some(({to:S})=>C.to===S)||E.push(C)}for(let[p,h]of f.dynamics)a.dynamics.some(([E,{to:C}])=>p===E&&h.to===C)||a.dynamics.push([p,h]);for(let p of f.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(En.InitialNode)}function bZe(t,{prefix:e=""}={}){if(uU){sl(`${e}Nodes are:`);for(let r=0;rE!==En.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===En.ErrorNode))throw new yE(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));s=kZe(h)}if(s.length>0){sl(" Results:");for(let n of s)sl(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else sl(" No results");return s}function xZe(t,e,{endToken:r=ei.EndOfInput}={}){let s=PZe(t,[...e,r]);return QZe(e,s.map(({state:a})=>a))}function kZe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function QZe(t,e){let r=e.filter(S=>S.selectedIndex!==null),s=r.filter(S=>!S.partial);if(s.length>0&&(r=s),r.length===0)throw new Error;let a=r.filter(S=>S.selectedIndex===Fd||S.requiredOptions.every(P=>P.some(I=>S.options.find(R=>R.name===I))));if(a.length===0)throw new yE(t,r.map(S=>({usage:S.candidateUsage,reason:null})));let n=0;for(let S of a)S.path.length>n&&(n=S.path.length);let c=a.filter(S=>S.path.length===n),f=S=>S.positionals.filter(({extra:P})=>!P).length+S.options.length,p=c.map(S=>({state:S,positionalCount:f(S)})),h=0;for(let{positionalCount:S}of p)S>h&&(h=S);let E=p.filter(({positionalCount:S})=>S===h).map(({state:S})=>S),C=TZe(E);if(C.length>1)throw new Lx(t,C.map(S=>S.candidateUsage));return C[0]}function TZe(t){let e=[],r=[];for(let s of t)s.selectedIndex===Fd?r.push(s):e.push(s);return r.length>0&&e.push({...lne,path:une(...r.map(s=>s.path)),options:r.reduce((s,a)=>s.concat(a.options),[])}),e}function une(t,e,...r){return e===void 0?Array.from(t):une(t.filter((s,a)=>s===e[a]),...r)}function Hl(){return{dynamics:[],shortcuts:[],statics:{}}}function fne(t){return t===En.SuccessNode||t===En.ErrorNode}function CU(t,e=0){return{to:fne(t.to)?t.to:t.to>=En.CustomNode?t.to+e-En.CustomNode+1:t.to+e,reducer:t.reducer}}function RZe(t,e=0){let r=Hl();for(let[s,a]of t.dynamics)r.dynamics.push([s,CU(a,e)]);for(let s of t.shortcuts)r.shortcuts.push(CU(s,e));for(let[s,a]of Object.entries(t.statics))r.statics[s]=a.map(n=>CU(n,e));return r}function qs(t,e,r,s,a){t.nodes[e].dynamics.push([r,{to:s,reducer:a}])}function CE(t,e,r,s){t.nodes[e].shortcuts.push({to:r,reducer:s})}function Ca(t,e,r,s,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:s,reducer:a})}function Gx(t,e,r,s,a){if(Array.isArray(e)){let[n,...c]=e;return t[n](r,s,a,...c)}else return t[e](r,s,a)}var lne,FZe,wU,jl,BU,Wx,Yx=Ct(()=>{Ox();Mx();lne={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Fd,partial:!1,tokens:[]};FZe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,s)=>!t.ignoreOptions&&e===s,isBatchOption:(t,e,r,s)=>!t.ignoreOptions&&ene.test(e)&&[...e.slice(1)].every(a=>s.has(`-${a}`)),isBoundOption:(t,e,r,s,a)=>{let n=e.match(cU);return!t.ignoreOptions&&!!n&&Nx.test(n[1])&&s.has(n[1])&&a.filter(c=>c.nameSet.includes(n[1])).every(c=>c.allowBinding)},isNegatedOption:(t,e,r,s)=>!t.ignoreOptions&&e===`--no-${s.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&lU.test(e),isUnsupportedOption:(t,e,r,s)=>!t.ignoreOptions&&e.startsWith("-")&&Nx.test(e)&&!s.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!Nx.test(e)},wU={setCandidateState:(t,e,r,s)=>({...t,...s}),setSelectedIndex:(t,e,r,s)=>({...t,selectedIndex:s}),setPartialIndex:(t,e,r,s)=>({...t,selectedIndex:s,partial:!0}),pushBatch:(t,e,r,s)=>{let a=t.options.slice(),n=t.tokens.slice();for(let c=1;c{let[,s,a]=e.match(cU),n=t.options.concat({name:s,value:a}),c=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,s.length],option:s},{segmentIndex:r,type:"assign",slice:[s.length,s.length+1]},{segmentIndex:r,type:"value",slice:[s.length+1,s.length+a.length+1]}]);return{...t,options:n,tokens:c}},pushPath:(t,e,r)=>{let s=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:s,tokens:a}},pushPositional:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtra:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:jl}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushTrue:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,s)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var s;let a=t.options[t.options.length-1],n=t.options.slice(),c=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((s=a.value)!==null&&s!==void 0?s:[]).concat([e]),{...t,options:n,tokens:c}},setStringValue:(t,e,r)=>{let s=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return s.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,s)=>{let[,,a]=e.match(lU);return typeof a<"u"?{...t,options:[{name:"-c",value:String(s)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(s)}]}},setError:(t,e,r,s)=>e===ei.EndOfInput||e===ei.EndOfPartialInput?{...t,errorMessage:`${s}.`}:{...t,errorMessage:`${s} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},jl=Symbol(),BU=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:s=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:s,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===jl)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==jl?this.arity.extra.push(e):this.arity.extra!==jl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===jl)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let s=0;s1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(s))throw new Error(`The arity must be an integer, got ${s}`);if(s<0)throw new Error(`The arity must be positive, got ${s}`);let f=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,f);this.options.push({preferredName:f,nameSet:e,description:r,arity:s,hidden:a,required:n,allowBinding:c})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&s.push(...this.paths[0]),e){for(let{preferredName:c,nameSet:f,arity:p,hidden:h,description:E,required:C}of this.options){if(h)continue;let S=[];for(let I=0;I`:`[${P}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===jl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=cne(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Mu(e,Hl()),Ca(e,En.InitialNode,ei.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Mu(e,Hl());CE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S0||!this.arity.proxy){let S=Mu(e,Hl());qs(e,p,"isHelp",S,["useHelp",this.cliIndex]),qs(e,S,"always",S,"pushExtra"),Ca(e,S,ei.EndOfInput,En.SuccessNode,["setSelectedIndex",Fd]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Ca(e,p,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ca(e,p,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let S=0;S0||S+1!==this.arity.leading.length)&&(Ca(e,P,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ca(e,P,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex])),qs(e,h,"isNotOptionLike",P,"pushPositional"),h=P}let E=h;if(this.arity.extra===jl||this.arity.extra.length>0){let S=Mu(e,Hl());if(CE(e,h,S),this.arity.extra===jl){let P=Mu(e,Hl());this.arity.proxy||this.registerOptions(e,P),qs(e,h,n,P,"pushExtraNoLimits"),qs(e,P,n,P,"pushExtraNoLimits"),CE(e,P,S)}else for(let P=0;P0)&&this.registerOptions(e,I),qs(e,E,n,I,"pushExtra"),CE(e,I,S),E=I}E=S}this.arity.trailing.length>0&&(Ca(e,E,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ca(e,E,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let C=E;for(let S=0;S=0&&e{let c=n?ei.EndOfPartialInput:ei.EndOfInput;return xZe(s,a,{endToken:c})}}}}});function pne(){return Vx.default&&"getColorDepth"in Vx.default.WriteStream.prototype?Vx.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function hne(t){let e=Ane;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ie("async_hooks");e=Ane=new r;let s=process.stdout._write;process.stdout._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?s.call(this,n,c,f):p.stdout.write(n,c,f)};let a=process.stderr._write;process.stderr._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?a.call(this,n,c,f):p.stderr.write(n,c,f)}}return r=>e.run(t,r)}var Vx,Ane,gne=Ct(()=>{Vx=et(Ie("tty"),1)});var Kx,dne=Ct(()=>{c0();Kx=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let s=new t(r);s.path=e.path;for(let a of e.options)switch(a.name){case"-c":s.commands.push(Number(a.value));break;case"-i":s.index=Number(a.value);break}return s}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection:
+- ${s}`}super(r)}};X2={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(qf||(qf={}));nYe={[qf.Forbids]:{expect:!1,message:"forbids using"},[qf.Requires]:{expect:!0,message:"requires using"}}});var ot,a0=Ze(()=>{Cp();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:c}=await Promise.resolve().then(()=>(Ul(),ya)),f=c(a(n()),r),p=[],h=[];if(!f(this,{errors:p,coercions:h}))throw J2("Invalid option schema",p);for(let[,w]of h)w()}else if(r!=null)throw new Error("Invalid command schema");let s=await this.execute();return typeof s<"u"?s:0}};ot.isOption=V2;ot.Default=[]});function il(t){s_&&console.log(t)}function Pre(){let t={nodes:[]};for(let e=0;e{if(e.has(s))return;e.add(s);let a=t.nodes[s];for(let c of Object.values(a.statics))for(let{to:f}of c)r(f);for(let[,{to:c}]of a.dynamics)r(c);for(let{to:c}of a.shortcuts)r(c);let n=new Set(a.shortcuts.map(({to:c})=>c));for(;a.shortcuts.length>0;){let{to:c}=a.shortcuts.shift(),f=t.nodes[c];for(let[p,h]of Object.entries(f.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let w of h)E.some(({to:S})=>w.to===S)||E.push(w)}for(let[p,h]of f.dynamics)a.dynamics.some(([E,{to:w}])=>p===E&&h.to===w)||a.dynamics.push([p,h]);for(let p of f.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(En.InitialNode)}function oYe(t,{prefix:e=""}={}){if(s_){il(`${e}Nodes are:`);for(let r=0;rE!==En.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===En.ErrorNode))throw new EE(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));s=cYe(h)}if(s.length>0){il(" Results:");for(let n of s)il(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else il(" No results");return s}function lYe(t,e,{endToken:r=ei.EndOfInput}={}){let s=aYe(t,[...e,r]);return uYe(e,s.map(({state:a})=>a))}function cYe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function uYe(t,e){let r=e.filter(S=>S.selectedIndex!==null),s=r.filter(S=>!S.partial);if(s.length>0&&(r=s),r.length===0)throw new Error;let a=r.filter(S=>S.selectedIndex===Nd||S.requiredOptions.every(x=>x.some(I=>S.options.find(T=>T.name===I))));if(a.length===0)throw new EE(t,r.map(S=>({usage:S.candidateUsage,reason:null})));let n=0;for(let S of a)S.path.length>n&&(n=S.path.length);let c=a.filter(S=>S.path.length===n),f=S=>S.positionals.filter(({extra:x})=>!x).length+S.options.length,p=c.map(S=>({state:S,positionalCount:f(S)})),h=0;for(let{positionalCount:S}of p)S>h&&(h=S);let E=p.filter(({positionalCount:S})=>S===h).map(({state:S})=>S),w=fYe(E);if(w.length>1)throw new Dx(t,w.map(S=>S.candidateUsage));return w[0]}function fYe(t){let e=[],r=[];for(let s of t)s.selectedIndex===Nd?r.push(s):e.push(s);return r.length>0&&e.push({...bre,path:xre(...r.map(s=>s.path)),options:r.reduce((s,a)=>s.concat(a.options),[])}),e}function xre(t,e,...r){return e===void 0?Array.from(t):xre(t.filter((s,a)=>s===e[a]),...r)}function _l(){return{dynamics:[],shortcuts:[],statics:{}}}function kre(t){return t===En.SuccessNode||t===En.ErrorNode}function d_(t,e=0){return{to:kre(t.to)?t.to:t.to>=En.CustomNode?t.to+e-En.CustomNode+1:t.to+e,reducer:t.reducer}}function AYe(t,e=0){let r=_l();for(let[s,a]of t.dynamics)r.dynamics.push([s,d_(a,e)]);for(let s of t.shortcuts)r.shortcuts.push(d_(s,e));for(let[s,a]of Object.entries(t.statics))r.statics[s]=a.map(n=>d_(n,e));return r}function Hs(t,e,r,s,a){t.nodes[e].dynamics.push([r,{to:s,reducer:a}])}function wE(t,e,r,s){t.nodes[e].shortcuts.push({to:r,reducer:s})}function Ea(t,e,r,s,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:s,reducer:a})}function Tx(t,e,r,s,a){if(Array.isArray(e)){let[n,...c]=e;return t[n](r,s,a,...c)}else return t[e](r,s,a)}var bre,pYe,m_,Hl,y_,Fx,Nx=Ze(()=>{Sx();bx();bre={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Nd,partial:!1,tokens:[]};pYe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,s)=>!t.ignoreOptions&&e===s,isBatchOption:(t,e,r,s)=>!t.ignoreOptions&&Ere.test(e)&&[...e.slice(1)].every(a=>s.has(`-${a}`)),isBoundOption:(t,e,r,s,a)=>{let n=e.match(i_);return!t.ignoreOptions&&!!n&&vx.test(n[1])&&s.has(n[1])&&a.filter(c=>c.nameSet.includes(n[1])).every(c=>c.allowBinding)},isNegatedOption:(t,e,r,s)=>!t.ignoreOptions&&e===`--no-${s.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&n_.test(e),isUnsupportedOption:(t,e,r,s)=>!t.ignoreOptions&&e.startsWith("-")&&vx.test(e)&&!s.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!vx.test(e)},m_={setCandidateState:(t,e,r,s)=>({...t,...s}),setSelectedIndex:(t,e,r,s)=>({...t,selectedIndex:s}),setPartialIndex:(t,e,r,s)=>({...t,selectedIndex:s,partial:!0}),pushBatch:(t,e,r,s)=>{let a=t.options.slice(),n=t.tokens.slice();for(let c=1;c{let[,s,a]=e.match(i_),n=t.options.concat({name:s,value:a}),c=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,s.length],option:s},{segmentIndex:r,type:"assign",slice:[s.length,s.length+1]},{segmentIndex:r,type:"value",slice:[s.length+1,s.length+a.length+1]}]);return{...t,options:n,tokens:c}},pushPath:(t,e,r)=>{let s=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:s,tokens:a}},pushPositional:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtra:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:Hl}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushTrue:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,s)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var s;let a=t.options[t.options.length-1],n=t.options.slice(),c=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((s=a.value)!==null&&s!==void 0?s:[]).concat([e]),{...t,options:n,tokens:c}},setStringValue:(t,e,r)=>{let s=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return s.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,s)=>{let[,,a]=e.match(n_);return typeof a<"u"?{...t,options:[{name:"-c",value:String(s)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(s)}]}},setError:(t,e,r,s)=>e===ei.EndOfInput||e===ei.EndOfPartialInput?{...t,errorMessage:`${s}.`}:{...t,errorMessage:`${s} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},Hl=Symbol(),y_=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:s=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:s,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Hl)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Hl?this.arity.extra.push(e):this.arity.extra!==Hl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Hl)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let s=0;s1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(s))throw new Error(`The arity must be an integer, got ${s}`);if(s<0)throw new Error(`The arity must be positive, got ${s}`);let f=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,f);this.options.push({preferredName:f,nameSet:e,description:r,arity:s,hidden:a,required:n,allowBinding:c})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&s.push(...this.paths[0]),e){for(let{preferredName:c,nameSet:f,arity:p,hidden:h,description:E,required:w}of this.options){if(h)continue;let S=[];for(let I=0;I`:`[${x}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===Hl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=Pre(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Ou(e,_l()),Ea(e,En.InitialNode,ei.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Ou(e,_l());wE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S0||!this.arity.proxy){let S=Ou(e,_l());Hs(e,p,"isHelp",S,["useHelp",this.cliIndex]),Hs(e,S,"always",S,"pushExtra"),Ea(e,S,ei.EndOfInput,En.SuccessNode,["setSelectedIndex",Nd]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Ea(e,p,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ea(e,p,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let S=0;S0||S+1!==this.arity.leading.length)&&(Ea(e,x,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ea(e,x,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex])),Hs(e,h,"isNotOptionLike",x,"pushPositional"),h=x}let E=h;if(this.arity.extra===Hl||this.arity.extra.length>0){let S=Ou(e,_l());if(wE(e,h,S),this.arity.extra===Hl){let x=Ou(e,_l());this.arity.proxy||this.registerOptions(e,x),Hs(e,h,n,x,"pushExtraNoLimits"),Hs(e,x,n,x,"pushExtraNoLimits"),wE(e,x,S)}else for(let x=0;x0)&&this.registerOptions(e,I),Hs(e,E,n,I,"pushExtra"),wE(e,I,S),E=I}E=S}this.arity.trailing.length>0&&(Ea(e,E,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ea(e,E,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let w=E;for(let S=0;S=0&&e{let c=n?ei.EndOfPartialInput:ei.EndOfInput;return lYe(s,a,{endToken:c})}}}}});function Rre(){return Ox.default&&"getColorDepth"in Ox.default.WriteStream.prototype?Ox.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function Tre(t){let e=Qre;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ie("async_hooks");e=Qre=new r;let s=process.stdout._write;process.stdout._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?s.call(this,n,c,f):p.stdout.write(n,c,f)};let a=process.stderr._write;process.stderr._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?a.call(this,n,c,f):p.stderr.write(n,c,f)}}return r=>e.run(t,r)}var Ox,Qre,Fre=Ze(()=>{Ox=ut(Ie("tty"),1)});var Lx,Nre=Ze(()=>{a0();Lx=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let s=new t(r);s.path=e.path;for(let a of e.options)switch(a.name){case"-c":s.commands.push(Number(a.value));break;case"-i":s.index=Number(a.value);break}return s}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection:
`),this.context.stdout.write(`
`);let r=0;for(let s of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[s].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(`
`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands.
-`)}}}});async function Ene(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=Cne(t);return wa.from(r,e).runExit(s,a)}async function Ine(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=Cne(t);return wa.from(r,e).run(s,a)}function Cne(t){let e,r,s,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(s=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?s=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],s=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],s=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],s=t[2],a=t[3];break}if(typeof s>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}}function yne(t){return t()}var mne,wa,wne=Ct(()=>{Ox();Yx();pU();gne();c0();dne();mne=Symbol("clipanion/errorCommand");wa=class t{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:s,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new Wx({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=s,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let s=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)s.register(n);return s}register(e){var r;let s=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[ot.isOption]&&s.set(p,h)}let n=this.builder.command(),c=n.cliIndex,f=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof f<"u")for(let p of f)n.addPath(p);this.registrations.set(e,{specs:s,builder:n,index:c});for(let[p,{definition:h}]of s.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:s,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:c,process:f}=this.builder.compile(),p=f(s,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case Fd:{let E=Kx.from(p,c);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=c[p.selectedIndex],C=this.registrations.get(E);if(typeof C>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let S=new E;S.context=h,S.tokens=p.tokens,S.path=p.path;try{for(let[P,{transformer:I}]of C.specs.entries())S[P]=I(C.builder,P,p,h);return S}catch(P){throw P[mne]=S,P}}break}}async run(e,r){var s,a;let n,c={...t.defaultContext,...r},f=(s=this.enableColors)!==null&&s!==void 0?s:c.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,c)}catch(E){return c.stdout.write(this.error(E,{colored:f})),1}if(n.help)return c.stdout.write(this.usage(n,{colored:f,detailed:!0})),0;n.context=c,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,C)=>this.error(E,C),format:E=>this.format(E),process:(E,C)=>this.process(E,{...c,...C}),run:(E,C)=>this.run(E,{...c,...C}),usage:(E,C)=>this.usage(E,C)};let p=this.enableCapture&&(a=hne(c))!==null&&a!==void 0?a:yne,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return c.stdout.write(this.error(E,{colored:f,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:s}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),c=typeof e.usage.category<"u"?qo(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,f=typeof e.usage.description<"u"?qo(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?qo(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,C])=>[qo(E,{format:this.format(r),paragraphs:!1}),C.replace(/\$0/g,this.binaryName)]):void 0;return{path:s,usage:a,category:c,description:f,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let s of this.registrations.keys()){let a=this.definition(s,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:s=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(P=>P.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(s=!0)}let c=e!==null&&e instanceof ot?e.constructor:e,f="";if(c)if(s){let{description:p="",details:h="",examples:E=[]}=c.usage||{};p!==""&&(f+=qo(p,{format:this.format(r),paragraphs:!1}).replace(/^./,P=>P.toUpperCase()),f+=`
+`)}}}});async function Mre(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=_re(t);return Ia.from(r,e).runExit(s,a)}async function Ure(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=_re(t);return Ia.from(r,e).run(s,a)}function _re(t){let e,r,s,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(s=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?s=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],s=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],s=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],s=t[2],a=t[3];break}if(typeof s>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}}function Lre(t){return t()}var Ore,Ia,Hre=Ze(()=>{Sx();Nx();l_();Fre();a0();Nre();Ore=Symbol("clipanion/errorCommand");Ia=class t{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:s,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new Fx({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=s,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let s=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)s.register(n);return s}register(e){var r;let s=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[ot.isOption]&&s.set(p,h)}let n=this.builder.command(),c=n.cliIndex,f=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof f<"u")for(let p of f)n.addPath(p);this.registrations.set(e,{specs:s,builder:n,index:c});for(let[p,{definition:h}]of s.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:s,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:c,process:f}=this.builder.compile(),p=f(s,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case Nd:{let E=Lx.from(p,c);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=c[p.selectedIndex],w=this.registrations.get(E);if(typeof w>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let S=new E;S.context=h,S.tokens=p.tokens,S.path=p.path;try{for(let[x,{transformer:I}]of w.specs.entries())S[x]=I(w.builder,x,p,h);return S}catch(x){throw x[Ore]=S,x}}break}}async run(e,r){var s,a;let n,c={...t.defaultContext,...r},f=(s=this.enableColors)!==null&&s!==void 0?s:c.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,c)}catch(E){return c.stdout.write(this.error(E,{colored:f})),1}if(n.help)return c.stdout.write(this.usage(n,{colored:f,detailed:!0})),0;n.context=c,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,w)=>this.error(E,w),format:E=>this.format(E),process:(E,w)=>this.process(E,{...c,...w}),run:(E,w)=>this.run(E,{...c,...w}),usage:(E,w)=>this.usage(E,w)};let p=this.enableCapture&&(a=Tre(c))!==null&&a!==void 0?a:Lre,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return c.stdout.write(this.error(E,{colored:f,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:s}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),c=typeof e.usage.category<"u"?Ho(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,f=typeof e.usage.description<"u"?Ho(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?Ho(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,w])=>[Ho(E,{format:this.format(r),paragraphs:!1}),w.replace(/\$0/g,this.binaryName)]):void 0;return{path:s,usage:a,category:c,description:f,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let s of this.registrations.keys()){let a=this.definition(s,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:s=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(x=>x.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(s=!0)}let c=e!==null&&e instanceof ot?e.constructor:e,f="";if(c)if(s){let{description:p="",details:h="",examples:E=[]}=c.usage||{};p!==""&&(f+=Ho(p,{format:this.format(r),paragraphs:!1}).replace(/^./,x=>x.toUpperCase()),f+=`
`),(h!==""||E.length>0)&&(f+=`${this.format(r).header("Usage")}
`,f+=`
-`);let{usage:C,options:S}=this.getUsageByRegistration(c,{inlineOptions:!1});if(f+=`${this.format(r).bold(a)}${C}
+`);let{usage:w,options:S}=this.getUsageByRegistration(c,{inlineOptions:!1});if(f+=`${this.format(r).bold(a)}${w}
`,S.length>0){f+=`
`,f+=`${this.format(r).header("Options")}
-`;let P=S.reduce((I,R)=>Math.max(I,R.definition.length),0);f+=`
-`;for(let{definition:I,description:R}of S)f+=` ${this.format(r).bold(I.padEnd(P))} ${qo(R,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(f+=`
+`;let x=S.reduce((I,T)=>Math.max(I,T.definition.length),0);f+=`
+`;for(let{definition:I,description:T}of S)f+=` ${this.format(r).bold(I.padEnd(x))} ${Ho(T,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(f+=`
`,f+=`${this.format(r).header("Details")}
`,f+=`
-`,f+=qo(h,{format:this.format(r),paragraphs:!0})),E.length>0){f+=`
+`,f+=Ho(h,{format:this.format(r),paragraphs:!0})),E.length>0){f+=`
`,f+=`${this.format(r).header("Examples")}
-`;for(let[P,I]of E)f+=`
-`,f+=qo(P,{format:this.format(r),paragraphs:!1}),f+=`${I.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)}
+`;for(let[x,I]of E)f+=`
+`,f+=Ho(x,{format:this.format(r),paragraphs:!1}),f+=`${I.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)}
`}}else{let{usage:p}=this.getUsageByRegistration(c);f+=`${this.format(r).bold(a)}${p}
-`}else{let p=new Map;for(let[S,{index:P}]of this.registrations.entries()){if(typeof S.usage>"u")continue;let I=typeof S.usage.category<"u"?qo(S.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(I);typeof R>"u"&&p.set(I,R=[]);let{usage:N}=this.getUsageByIndex(P);R.push({commandClass:S,usage:N})}let h=Array.from(p.keys()).sort((S,P)=>S===null?-1:P===null?1:S.localeCompare(P,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",C=typeof this.binaryVersion<"u";E||C?(E&&C?f+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)}
+`}else{let p=new Map;for(let[S,{index:x}]of this.registrations.entries()){if(typeof S.usage>"u")continue;let I=typeof S.usage.category<"u"?Ho(S.usage.category,{format:this.format(r),paragraphs:!1}):null,T=p.get(I);typeof T>"u"&&p.set(I,T=[]);let{usage:N}=this.getUsageByIndex(x);T.push({commandClass:S,usage:N})}let h=Array.from(p.keys()).sort((S,x)=>S===null?-1:x===null?1:S.localeCompare(x,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",w=typeof this.binaryVersion<"u";E||w?(E&&w?f+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)}
`:E?f+=`${this.format(r).header(`${this.binaryLabel}`)}
`:f+=`${this.format(r).header(`${this.binaryVersion}`)}
`,f+=` ${this.format(r).bold(a)}${this.binaryName}
`):f+=`${this.format(r).bold(a)}${this.binaryName}
-`;for(let S of h){let P=p.get(S).slice().sort((R,N)=>R.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),I=S!==null?S.trim():"General commands";f+=`
+`;for(let S of h){let x=p.get(S).slice().sort((T,N)=>T.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),I=S!==null?S.trim():"General commands";f+=`
`,f+=`${this.format(r).header(`${I}`)}
-`;for(let{commandClass:R,usage:N}of P){let U=R.usage.description||"undocumented";f+=`
+`;for(let{commandClass:T,usage:N}of x){let U=T.usage.description||"undocumented";f+=`
`,f+=` ${this.format(r).bold(N)}
-`,f+=` ${qo(U,{format:this.format(r),paragraphs:!1})}`}}f+=`
-`,f+=qo("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return f}error(e,r){var s,{colored:a,command:n=(s=e[mne])!==null&&s!==void 0?s:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let c="",f=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");f==="Error"&&(f="Internal Error"),c+=`${this.format(a).error(f)}: ${e.message}
+`,f+=` ${Ho(U,{format:this.format(r),paragraphs:!1})}`}}f+=`
+`,f+=Ho("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return f}error(e,r){var s,{colored:a,command:n=(s=e[Ore])!==null&&s!==void 0?s:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let c="",f=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");f==="Error"&&(f="Internal Error"),c+=`${this.format(a).error(f)}: ${e.message}
`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(c+=`
`,c+=this.usage(n)):e.stack&&(c+=`${e.stack.replace(/^.*\n/,"")}
-`),c}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?tne:rne}getUsageByRegistration(e,r){let s=this.registrations.get(e);if(typeof s>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(s.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};wa.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:pne()}});var rB,Bne=Ct(()=>{c0();rB=class extends ot{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)}
-`)}};rB.paths=[["--clipanion=definitions"]]});var nB,vne=Ct(()=>{c0();nB=class extends ot{async execute(){this.context.stdout.write(this.cli.usage())}};nB.paths=[["-h"],["--help"]]});function Jx(t={}){return Ea({definition(e,r){var s;e.addProxy({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){return s.positionals.map(({value:a})=>a)}})}var vU=Ct(()=>{Bp()});var iB,Sne=Ct(()=>{c0();vU();iB=class extends ot{constructor(){super(...arguments),this.args=Jx()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)}
-`)}};iB.paths=[["--clipanion=tokens"]]});var sB,Dne=Ct(()=>{c0();sB=class extends ot{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""}
-`)}};sB.paths=[["-v"],["--version"]]});var SU={};Vt(SU,{DefinitionsCommand:()=>rB,HelpCommand:()=>nB,TokensCommand:()=>iB,VersionCommand:()=>sB});var bne=Ct(()=>{Bne();vne();Sne();Dne()});function Pne(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=new Set(c);return Ea({definition(p){p.addOption({names:c,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let C,S=typeof s<"u"?[...s]:void 0;for(let{name:P,value:I}of E.options)f.has(P)&&(C=P,S=S??[],S.push(I));return typeof S<"u"?Nd(C??h,S,a.validator):S}})}var xne=Ct(()=>{Bp()});function kne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);return Ea({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E=S);return E}})}var Qne=Ct(()=>{Bp()});function Tne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);return Ea({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E??(E=0),S?E+=1:E=0);return E}})}var Rne=Ct(()=>{Bp()});function Fne(t={}){return Ea({definition(e,r){var s;e.addRest({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){let a=c=>{let f=s.positionals[c];return f.extra===jl||f.extra===!1&&cc)}})}var Nne=Ct(()=>{Yx();Bp()});function NZe(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=new Set(c);return Ea({definition(p){p.addOption({names:c,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,C){let S,P=s;typeof a.env<"u"&&C.env[a.env]&&(S=a.env,P=C.env[a.env]);for(let{name:I,value:R}of E.options)f.has(I)&&(S=I,P=R);return typeof P=="string"?Nd(S??h,P,a.validator):P}})}function OZe(t={}){let{required:e=!0}=t;return Ea({definition(r,s){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:s,required:t.required})},transformer(r,s,a){var n;for(let c=0;c{Yx();Bp()});var ge={};Vt(ge,{Array:()=>Pne,Boolean:()=>kne,Counter:()=>Tne,Proxy:()=>Jx,Rest:()=>Fne,String:()=>One,applyValidator:()=>Nd,cleanValidationError:()=>_x,formatError:()=>z2,isOptionSymbol:()=>J2,makeCommandOption:()=>Ea,rerouteArguments:()=>Gf});var Mne=Ct(()=>{Bp();vU();xne();Qne();Rne();Nne();Lne()});var oB={};Vt(oB,{Builtins:()=>SU,Cli:()=>wa,Command:()=>ot,Option:()=>ge,UsageError:()=>nt,formatMarkdownish:()=>qo,run:()=>Ine,runExit:()=>Ene});var Wt=Ct(()=>{Mx();pU();c0();wne();bne();Mne()});var _ne=L((q9t,LZe)=>{LZe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var qne=L((G9t,vp)=>{var Une=Ie("fs"),bU=Ie("path"),MZe=Ie("os"),_Ze=Ie("crypto"),UZe=_ne(),PU=UZe.version,HZe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function jZe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,`
-`);let s;for(;(s=HZe.exec(r))!=null;){let a=s[1],n=s[2]||"";n=n.trim();let c=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),c==='"'&&(n=n.replace(/\\n/g,`
-`),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function qZe(t){let e=jne(t),r=Gs.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let s=Hne(t).split(","),a=s.length,n;for(let c=0;c=a)throw f}return Gs.parse(n)}function GZe(t){console.log(`[dotenv@${PU}][INFO] ${t}`)}function WZe(t){console.log(`[dotenv@${PU}][WARN] ${t}`)}function DU(t){console.log(`[dotenv@${PU}][DEBUG] ${t}`)}function Hne(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function YZe(t,e){let r;try{r=new URL(e)}catch(f){throw f.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):f}let s=r.password;if(!s)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,c=t.parsed[n];if(!c)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:c,key:s}}function jne(t){let e=bU.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function VZe(t){return t[0]==="~"?bU.join(MZe.homedir(),t.slice(1)):t}function KZe(t){GZe("Loading env from encrypted .env.vault");let e=Gs._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),Gs.populate(r,e,t),{parsed:e}}function JZe(t){let e=bU.resolve(process.cwd(),".env"),r="utf8",s=!!(t&&t.debug);t&&(t.path!=null&&(e=VZe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=Gs.parse(Une.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),Gs.populate(n,a,t),{parsed:a}}catch(a){return s&&DU(`Failed to load ${e} ${a.message}`),{error:a}}}function zZe(t){let e=jne(t);return Hne(t).length===0?Gs.configDotenv(t):Une.existsSync(e)?Gs._configVault(t):(WZe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),Gs.configDotenv(t))}function ZZe(t,e){let r=Buffer.from(e.slice(-64),"hex"),s=Buffer.from(t,"base64"),a=s.slice(0,12),n=s.slice(-16);s=s.slice(12,-16);try{let c=_Ze.createDecipheriv("aes-256-gcm",r,a);return c.setAuthTag(n),`${c.update(s)}${c.final()}`}catch(c){let f=c instanceof RangeError,p=c.message==="Invalid key length",h=c.message==="Unsupported state or unable to authenticate data";if(f||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",c.code),console.error("Error: ",c.message),c}}function XZe(t,e,r={}){let s=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),s&&DU(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var Gs={configDotenv:JZe,_configVault:KZe,_parseVault:qZe,config:zZe,decrypt:ZZe,parse:jZe,populate:XZe};vp.exports.configDotenv=Gs.configDotenv;vp.exports._configVault=Gs._configVault;vp.exports._parseVault=Gs._parseVault;vp.exports.config=Gs.config;vp.exports.decrypt=Gs.decrypt;vp.exports.parse=Gs.parse;vp.exports.populate=Gs.populate;vp.exports=Gs});var Wne=L((W9t,Gne)=>{"use strict";Gne.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Od=L((Y9t,xU)=>{"use strict";var $Ze=Wne(),Yne=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,s=()=>{r--,e.length>0&&e.shift()()},a=(f,p,...h)=>{r++;let E=$Ze(f,...h);p(E),E.then(s,s)},n=(f,p,...h)=>{rnew Promise(h=>n(f,h,...p));return Object.defineProperties(c,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),c};xU.exports=Yne;xU.exports.default=Yne});function Vf(t){return`YN${t.toString(10).padStart(4,"0")}`}function zx(t){let e=Number(t.slice(2));if(typeof Dr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var Dr,Zx=Ct(()=>{Dr=(Me=>(Me[Me.UNNAMED=0]="UNNAMED",Me[Me.EXCEPTION=1]="EXCEPTION",Me[Me.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Me[Me.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Me[Me.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Me[Me.BUILD_DISABLED=5]="BUILD_DISABLED",Me[Me.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Me[Me.MUST_BUILD=7]="MUST_BUILD",Me[Me.MUST_REBUILD=8]="MUST_REBUILD",Me[Me.BUILD_FAILED=9]="BUILD_FAILED",Me[Me.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Me[Me.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Me[Me.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Me[Me.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Me[Me.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Me[Me.REMOTE_INVALID=15]="REMOTE_INVALID",Me[Me.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Me[Me.RESOLUTION_PACK=17]="RESOLUTION_PACK",Me[Me.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Me[Me.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Me[Me.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Me[Me.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Me[Me.FETCH_FAILED=30]="FETCH_FAILED",Me[Me.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Me[Me.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Me[Me.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Me[Me.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Me[Me.NETWORK_ERROR=35]="NETWORK_ERROR",Me[Me.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Me[Me.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Me[Me.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Me[Me.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Me[Me.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Me[Me.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Me[Me.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Me[Me.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Me[Me.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Me[Me.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Me[Me.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Me[Me.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Me[Me.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Me[Me.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Me[Me.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Me[Me.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Me[Me.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Me[Me.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Me[Me.INVALID_MANIFEST=57]="INVALID_MANIFEST",Me[Me.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Me[Me.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Me[Me.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Me[Me.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Me[Me.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Me[Me.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Me[Me.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Me[Me.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Me[Me.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Me[Me.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Me[Me.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Me[Me.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Me[Me.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Me[Me.NETWORK_DISABLED=80]="NETWORK_DISABLED",Me[Me.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Me[Me.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Me[Me.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Me[Me.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Me[Me.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Me[Me.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Me[Me.VERSION_NOTICE=88]="VERSION_NOTICE",Me[Me.TIPS_NOTICE=89]="TIPS_NOTICE",Me[Me.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Me[Me.INVALID_PROVENANCE_ENVIRONMENT=91]="INVALID_PROVENANCE_ENVIRONMENT",Me))(Dr||{})});var aB=L((K9t,Vne)=>{var eXe="2.0.0",tXe=Number.MAX_SAFE_INTEGER||9007199254740991,rXe=16,nXe=250,iXe=["major","premajor","minor","preminor","patch","prepatch","prerelease"];Vne.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:rXe,MAX_SAFE_BUILD_LENGTH:nXe,MAX_SAFE_INTEGER:tXe,RELEASE_TYPES:iXe,SEMVER_SPEC_VERSION:eXe,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var lB=L((J9t,Kne)=>{var sXe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};Kne.exports=sXe});var wE=L((Sp,Jne)=>{var{MAX_SAFE_COMPONENT_LENGTH:kU,MAX_SAFE_BUILD_LENGTH:oXe,MAX_LENGTH:aXe}=aB(),lXe=lB();Sp=Jne.exports={};var cXe=Sp.re=[],uXe=Sp.safeRe=[],rr=Sp.src=[],nr=Sp.t={},fXe=0,QU="[a-zA-Z0-9-]",AXe=[["\\s",1],["\\d",aXe],[QU,oXe]],pXe=t=>{for(let[e,r]of AXe)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Kr=(t,e,r)=>{let s=pXe(e),a=fXe++;lXe(t,a,e),nr[t]=a,rr[a]=e,cXe[a]=new RegExp(e,r?"g":void 0),uXe[a]=new RegExp(s,r?"g":void 0)};Kr("NUMERICIDENTIFIER","0|[1-9]\\d*");Kr("NUMERICIDENTIFIERLOOSE","\\d+");Kr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${QU}*`);Kr("MAINVERSION",`(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})`);Kr("MAINVERSIONLOOSE",`(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})`);Kr("PRERELEASEIDENTIFIER",`(?:${rr[nr.NUMERICIDENTIFIER]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Kr("PRERELEASEIDENTIFIERLOOSE",`(?:${rr[nr.NUMERICIDENTIFIERLOOSE]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Kr("PRERELEASE",`(?:-(${rr[nr.PRERELEASEIDENTIFIER]}(?:\\.${rr[nr.PRERELEASEIDENTIFIER]})*))`);Kr("PRERELEASELOOSE",`(?:-?(${rr[nr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rr[nr.PRERELEASEIDENTIFIERLOOSE]})*))`);Kr("BUILDIDENTIFIER",`${QU}+`);Kr("BUILD",`(?:\\+(${rr[nr.BUILDIDENTIFIER]}(?:\\.${rr[nr.BUILDIDENTIFIER]})*))`);Kr("FULLPLAIN",`v?${rr[nr.MAINVERSION]}${rr[nr.PRERELEASE]}?${rr[nr.BUILD]}?`);Kr("FULL",`^${rr[nr.FULLPLAIN]}$`);Kr("LOOSEPLAIN",`[v=\\s]*${rr[nr.MAINVERSIONLOOSE]}${rr[nr.PRERELEASELOOSE]}?${rr[nr.BUILD]}?`);Kr("LOOSE",`^${rr[nr.LOOSEPLAIN]}$`);Kr("GTLT","((?:<|>)?=?)");Kr("XRANGEIDENTIFIERLOOSE",`${rr[nr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Kr("XRANGEIDENTIFIER",`${rr[nr.NUMERICIDENTIFIER]}|x|X|\\*`);Kr("XRANGEPLAIN",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:${rr[nr.PRERELEASE]})?${rr[nr.BUILD]}?)?)?`);Kr("XRANGEPLAINLOOSE",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:${rr[nr.PRERELEASELOOSE]})?${rr[nr.BUILD]}?)?)?`);Kr("XRANGE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAIN]}$`);Kr("XRANGELOOSE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAINLOOSE]}$`);Kr("COERCEPLAIN",`(^|[^\\d])(\\d{1,${kU}})(?:\\.(\\d{1,${kU}}))?(?:\\.(\\d{1,${kU}}))?`);Kr("COERCE",`${rr[nr.COERCEPLAIN]}(?:$|[^\\d])`);Kr("COERCEFULL",rr[nr.COERCEPLAIN]+`(?:${rr[nr.PRERELEASE]})?(?:${rr[nr.BUILD]})?(?:$|[^\\d])`);Kr("COERCERTL",rr[nr.COERCE],!0);Kr("COERCERTLFULL",rr[nr.COERCEFULL],!0);Kr("LONETILDE","(?:~>?)");Kr("TILDETRIM",`(\\s*)${rr[nr.LONETILDE]}\\s+`,!0);Sp.tildeTrimReplace="$1~";Kr("TILDE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAIN]}$`);Kr("TILDELOOSE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAINLOOSE]}$`);Kr("LONECARET","(?:\\^)");Kr("CARETTRIM",`(\\s*)${rr[nr.LONECARET]}\\s+`,!0);Sp.caretTrimReplace="$1^";Kr("CARET",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAIN]}$`);Kr("CARETLOOSE",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAINLOOSE]}$`);Kr("COMPARATORLOOSE",`^${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]})$|^$`);Kr("COMPARATOR",`^${rr[nr.GTLT]}\\s*(${rr[nr.FULLPLAIN]})$|^$`);Kr("COMPARATORTRIM",`(\\s*)${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]}|${rr[nr.XRANGEPLAIN]})`,!0);Sp.comparatorTrimReplace="$1$2$3";Kr("HYPHENRANGE",`^\\s*(${rr[nr.XRANGEPLAIN]})\\s+-\\s+(${rr[nr.XRANGEPLAIN]})\\s*$`);Kr("HYPHENRANGELOOSE",`^\\s*(${rr[nr.XRANGEPLAINLOOSE]})\\s+-\\s+(${rr[nr.XRANGEPLAINLOOSE]})\\s*$`);Kr("STAR","(<|>)?=?\\s*\\*");Kr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Kr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var Xx=L((z9t,zne)=>{var hXe=Object.freeze({loose:!0}),gXe=Object.freeze({}),dXe=t=>t?typeof t!="object"?hXe:t:gXe;zne.exports=dXe});var TU=L((Z9t,$ne)=>{var Zne=/^[0-9]+$/,Xne=(t,e)=>{let r=Zne.test(t),s=Zne.test(e);return r&&s&&(t=+t,e=+e),t===e?0:r&&!s?-1:s&&!r?1:tXne(e,t);$ne.exports={compareIdentifiers:Xne,rcompareIdentifiers:mXe}});var Go=L((X9t,nie)=>{var $x=lB(),{MAX_LENGTH:eie,MAX_SAFE_INTEGER:ek}=aB(),{safeRe:tie,t:rie}=wE(),yXe=Xx(),{compareIdentifiers:BE}=TU(),RU=class t{constructor(e,r){if(r=yXe(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>eie)throw new TypeError(`version is longer than ${eie} characters`);$x("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let s=e.trim().match(r.loose?tie[rie.LOOSE]:tie[rie.FULL]);if(!s)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+s[1],this.minor=+s[2],this.patch=+s[3],this.major>ek||this.major<0)throw new TypeError("Invalid major version");if(this.minor>ek||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>ek||this.patch<0)throw new TypeError("Invalid patch version");s[4]?this.prerelease=s[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&s===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];s===!1&&(n=[r]),BE(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};nie.exports=RU});var Ld=L(($9t,sie)=>{var iie=Go(),EXe=(t,e,r=!1)=>{if(t instanceof iie)return t;try{return new iie(t,e)}catch(s){if(!r)return null;throw s}};sie.exports=EXe});var aie=L((eWt,oie)=>{var IXe=Ld(),CXe=(t,e)=>{let r=IXe(t,e);return r?r.version:null};oie.exports=CXe});var cie=L((tWt,lie)=>{var wXe=Ld(),BXe=(t,e)=>{let r=wXe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};lie.exports=BXe});var Aie=L((rWt,fie)=>{var uie=Go(),vXe=(t,e,r,s,a)=>{typeof r=="string"&&(a=s,s=r,r=void 0);try{return new uie(t instanceof uie?t.version:t,r).inc(e,s,a).version}catch{return null}};fie.exports=vXe});var gie=L((nWt,hie)=>{var pie=Ld(),SXe=(t,e)=>{let r=pie(t,null,!0),s=pie(e,null,!0),a=r.compare(s);if(a===0)return null;let n=a>0,c=n?r:s,f=n?s:r,p=!!c.prerelease.length;if(!!f.prerelease.length&&!p)return!f.patch&&!f.minor?"major":c.patch?"patch":c.minor?"minor":"major";let E=p?"pre":"";return r.major!==s.major?E+"major":r.minor!==s.minor?E+"minor":r.patch!==s.patch?E+"patch":"prerelease"};hie.exports=SXe});var mie=L((iWt,die)=>{var DXe=Go(),bXe=(t,e)=>new DXe(t,e).major;die.exports=bXe});var Eie=L((sWt,yie)=>{var PXe=Go(),xXe=(t,e)=>new PXe(t,e).minor;yie.exports=xXe});var Cie=L((oWt,Iie)=>{var kXe=Go(),QXe=(t,e)=>new kXe(t,e).patch;Iie.exports=QXe});var Bie=L((aWt,wie)=>{var TXe=Ld(),RXe=(t,e)=>{let r=TXe(t,e);return r&&r.prerelease.length?r.prerelease:null};wie.exports=RXe});var vc=L((lWt,Sie)=>{var vie=Go(),FXe=(t,e,r)=>new vie(t,r).compare(new vie(e,r));Sie.exports=FXe});var bie=L((cWt,Die)=>{var NXe=vc(),OXe=(t,e,r)=>NXe(e,t,r);Die.exports=OXe});var xie=L((uWt,Pie)=>{var LXe=vc(),MXe=(t,e)=>LXe(t,e,!0);Pie.exports=MXe});var tk=L((fWt,Qie)=>{var kie=Go(),_Xe=(t,e,r)=>{let s=new kie(t,r),a=new kie(e,r);return s.compare(a)||s.compareBuild(a)};Qie.exports=_Xe});var Rie=L((AWt,Tie)=>{var UXe=tk(),HXe=(t,e)=>t.sort((r,s)=>UXe(r,s,e));Tie.exports=HXe});var Nie=L((pWt,Fie)=>{var jXe=tk(),qXe=(t,e)=>t.sort((r,s)=>jXe(s,r,e));Fie.exports=qXe});var cB=L((hWt,Oie)=>{var GXe=vc(),WXe=(t,e,r)=>GXe(t,e,r)>0;Oie.exports=WXe});var rk=L((gWt,Lie)=>{var YXe=vc(),VXe=(t,e,r)=>YXe(t,e,r)<0;Lie.exports=VXe});var FU=L((dWt,Mie)=>{var KXe=vc(),JXe=(t,e,r)=>KXe(t,e,r)===0;Mie.exports=JXe});var NU=L((mWt,_ie)=>{var zXe=vc(),ZXe=(t,e,r)=>zXe(t,e,r)!==0;_ie.exports=ZXe});var nk=L((yWt,Uie)=>{var XXe=vc(),$Xe=(t,e,r)=>XXe(t,e,r)>=0;Uie.exports=$Xe});var ik=L((EWt,Hie)=>{var e$e=vc(),t$e=(t,e,r)=>e$e(t,e,r)<=0;Hie.exports=t$e});var OU=L((IWt,jie)=>{var r$e=FU(),n$e=NU(),i$e=cB(),s$e=nk(),o$e=rk(),a$e=ik(),l$e=(t,e,r,s)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return r$e(t,r,s);case"!=":return n$e(t,r,s);case">":return i$e(t,r,s);case">=":return s$e(t,r,s);case"<":return o$e(t,r,s);case"<=":return a$e(t,r,s);default:throw new TypeError(`Invalid operator: ${e}`)}};jie.exports=l$e});var Gie=L((CWt,qie)=>{var c$e=Go(),u$e=Ld(),{safeRe:sk,t:ok}=wE(),f$e=(t,e)=>{if(t instanceof c$e)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?sk[ok.COERCEFULL]:sk[ok.COERCE]);else{let p=e.includePrerelease?sk[ok.COERCERTLFULL]:sk[ok.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let s=r[2],a=r[3]||"0",n=r[4]||"0",c=e.includePrerelease&&r[5]?`-${r[5]}`:"",f=e.includePrerelease&&r[6]?`+${r[6]}`:"";return u$e(`${s}.${a}.${n}${c}${f}`,e)};qie.exports=f$e});var Yie=L((wWt,Wie)=>{"use strict";Wie.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var ak=L((BWt,Vie)=>{"use strict";Vie.exports=Fn;Fn.Node=Md;Fn.create=Fn;function Fn(t){var e=this;if(e instanceof Fn||(e=new Fn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,s=arguments.length;r1)r=e;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;s!==null;a++)r=t(r,s.value,a),s=s.next;return r};Fn.prototype.reduceReverse=function(t,e){var r,s=this.tail;if(arguments.length>1)r=e;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;s!==null;a--)r=t(r,s.value,a),s=s.prev;return r};Fn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Fn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Fn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(ethis.length&&(e=this.length);for(var s=0,a=this.head;a!==null&&sthis.length&&(e=this.length);for(var s=this.length,a=this.tail;a!==null&&s>e;s--)a=a.prev;for(;a!==null&&s>t;s--,a=a.prev)r.push(a.value);return r};Fn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var s=0,a=this.head;a!==null&&s